@rallycry/conveyor-agent 7.0.8 → 7.0.10

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/connection/agent-connection.ts","../src/runner/mode-controller.ts","../src/runner/lifecycle.ts","../src/runner/git-utils.ts","../src/runner/plan-sync.ts","../src/execution/pack-runner-prompt.ts","../src/execution/tag-context-resolver.ts","../src/execution/mode-prompt.ts","../src/execution/system-prompt.ts","../src/execution/prompt-builder.ts","../src/tools/common-tools.ts","../src/tools/helpers.ts","../src/tools/pm-tools.ts","../src/tools/discovery-tools.ts","../src/tools/code-review-tools.ts","../src/tools/debug-tools.ts","../src/tools/telemetry-tools.ts","../src/debug/telemetry-injector.ts","../src/tools/client-debug-tools.ts","../src/tools/index.ts","../src/execution/event-handlers.ts","../src/execution/event-processor.ts","../src/execution/task-property-utils.ts","../src/execution/tool-access.ts","../src/execution/query-executor.ts","../src/execution/cost-tracker.ts","../src/runner/query-bridge.ts","../src/runner/session-runner.ts","../src/connection/project-connection.ts","../src/setup/commands.ts","../src/runner/commit-watcher.ts","../src/runner/worktree.ts","../src/runner/project-runner.ts","../src/tools/project-tools.ts","../src/runner/project-chat-handler.ts","../src/setup/config.ts"],"sourcesContent":["import { io, type Socket } from \"socket.io-client\";\nimport type {\n AgentSessionServiceMethods,\n AgentMode,\n AgentQuestion,\n SocketResponse,\n} from \"@project/shared\";\nimport type { ModelUsageEntry } from \"../execution/cost-tracker.js\";\n\n// ── Configuration ──────────────────────────────────────────────────────────\n\nexport interface AgentConnectionConfig {\n apiUrl: string;\n taskToken: string;\n sessionId: string;\n runnerMode?: \"task\" | \"pm\" | \"code-review\";\n}\n\n// ── Incoming server-push event types ───────────────────────────────────────\n\nexport interface IncomingMessage {\n content: string;\n userId: string;\n files?: Array<{ name: string; content: string; mimeType?: string }>;\n}\n\nexport interface SetModeData {\n agentMode: AgentMode;\n}\n\nexport interface ApiKeyUpdateData {\n apiKey: string;\n isSubscription?: boolean;\n}\n\n// ── Connection class ───────────────────────────────────────────────────────\n\nconst EVENT_BATCH_MS = 500;\n\nexport class AgentConnection {\n private socket: Socket | null = null;\n private readonly config: AgentConnectionConfig;\n private eventBuffer: Array<{ event: Record<string, unknown> }> = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private lastEmittedStatus: string | null = null;\n\n // Pending answer resolvers for askUserQuestion room-event fallback\n private pendingAnswerResolvers = new Map<string, (answers: Record<string, string>) => void>();\n\n // Dedup: suppress near-identical messages within a short window\n private recentMessages: Array<{ words: Set<string>; timestamp: number }> = [];\n private static readonly DEDUP_WINDOW_MS = 30_000;\n private static readonly DEDUP_SIMILARITY_THRESHOLD = 0.7;\n\n // Early-buffering: events that arrive before callbacks are registered\n private earlyMessages: IncomingMessage[] = [];\n private earlyStop = false;\n private earlySoftStop = false;\n private earlyModeChanges: SetModeData[] = [];\n\n // Registered callbacks\n private messageCallback: ((msg: IncomingMessage) => void) | null = null;\n private stopCallback: (() => void) | null = null;\n private softStopCallback: (() => void) | null = null;\n private modeChangeCallback: ((data: SetModeData) => void) | null = null;\n private wakeCallback: (() => void) | null = null;\n private apiKeyUpdateCallback: ((data: ApiKeyUpdateData) => void) | null = null;\n\n constructor(config: AgentConnectionConfig) {\n this.config = config;\n }\n\n get sessionId(): string {\n return this.config.sessionId;\n }\n\n get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n // ── Typed service method call ──────────────────────────────────────────\n\n call<M extends keyof AgentSessionServiceMethods>(\n method: M,\n payload: AgentSessionServiceMethods[M][\"payload\"],\n ): Promise<AgentSessionServiceMethods[M][\"response\"]> {\n if (!this.socket) {\n return Promise.reject(\n new Error(`Not connected (method: ${String(method)}, session: ${this.config.sessionId})`),\n );\n }\n const socket = this.socket;\n return new Promise((resolve, reject) => {\n socket.emit(\n `agentSessionService:${String(method)}`,\n payload,\n (response: SocketResponse<AgentSessionServiceMethods[M][\"response\"]>) => {\n if (response.success && response.data !== undefined) {\n resolve(response.data);\n } else {\n reject(new Error(response.error ?? `Service call failed: ${String(method)}`));\n }\n },\n );\n });\n }\n\n // ── Connection lifecycle ───────────────────────────────────────────────\n\n // oxlint-disable-next-line max-lines-per-function -- socket setup requires registering many co-located event handlers\n connect(): Promise<void> {\n if (!this.config.apiUrl) {\n return Promise.reject(new Error(\"Cannot connect: apiUrl is empty\"));\n }\n // oxlint-disable-next-line max-lines-per-function -- socket event registration requires co-located handlers\n return new Promise((resolve, reject) => {\n let settled = false;\n let attempts = 0;\n const maxInitialAttempts = 30;\n\n process.stderr.write(\n `[conveyor-agent] Connecting to ${this.config.apiUrl} (mode: ${this.config.runnerMode ?? \"task\"}, session: ${this.config.sessionId})\\n`,\n );\n\n this.socket = io(this.config.apiUrl, {\n auth: {\n taskToken: this.config.taskToken,\n runnerMode: this.config.runnerMode ?? \"task\",\n },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 30000,\n randomizationFactor: 0.3,\n extraHeaders: { \"ngrok-skip-browser-warning\": \"true\" },\n });\n\n // ── Server-push event handlers (v7 room-based events) ─────────\n // These events are emitted to the agentSessionService:<sessionId>\n // room. The agent joins this room via the connectAgent() call after\n // the socket connects.\n\n this.socket.on(\"session:message\", (msg: IncomingMessage) => {\n if (this.messageCallback) this.messageCallback(msg);\n else this.earlyMessages.push(msg);\n });\n\n this.socket.on(\"session:stop\", () => {\n if (this.stopCallback) this.stopCallback();\n else this.earlyStop = true;\n });\n\n this.socket.on(\"session:softStop\", () => {\n if (this.softStopCallback) this.softStopCallback();\n else this.earlySoftStop = true;\n });\n\n this.socket.on(\"session:modeChange\", (data: SetModeData) => {\n if (this.modeChangeCallback) this.modeChangeCallback(data);\n else this.earlyModeChanges.push(data);\n });\n\n this.socket.on(\"session:wake\", () => {\n if (this.wakeCallback) {\n this.wakeCallback();\n } else if (this.messageCallback) {\n this.messageCallback({ content: \"\", userId: \"system\" });\n } else {\n this.earlyMessages.push({ content: \"\", userId: \"system\" });\n }\n });\n\n this.socket.on(\n \"session:answerQuestion\",\n (data: { requestId: string; answers: Record<string, string> }) => {\n const resolver = this.pendingAnswerResolvers.get(data.requestId);\n if (resolver) resolver(data.answers);\n },\n );\n\n this.socket.on(\"agentRunner:updateApiKey\", (data: ApiKeyUpdateData) => {\n if (this.apiKeyUpdateCallback) this.apiKeyUpdateCallback(data);\n });\n\n // ── Socket lifecycle events ────────────────────────────────────\n this.socket.on(\"connect\", () => {\n process.stderr.write(\"[conveyor-agent] Socket connected\\n\");\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n this.socket.on(\"connect_error\", (err: Error) => {\n attempts++;\n process.stderr.write(\n `[conveyor-agent] Connection error (attempt ${attempts}/${maxInitialAttempts}): ${err.message}\\n`,\n );\n if (!settled && attempts >= maxInitialAttempts) {\n settled = true;\n reject(\n new Error(\n `Failed to connect to ${this.config.apiUrl} after ${maxInitialAttempts} attempts: ${err.message}`,\n ),\n );\n }\n });\n\n this.socket.on(\"disconnect\", (reason: string) => {\n process.stderr.write(`[conveyor-agent] Disconnected: ${reason}\\n`);\n });\n\n this.socket.io.on(\"reconnect\", () => {\n process.stderr.write(\"[conveyor-agent] Reconnected\\n\");\n // Re-join the session room and process any pending messages from the disconnect window\n void this.reconnectToSession();\n });\n\n this.socket.io.on(\"reconnect_attempt\", () => {\n // Attempt counting is handled in connect_error handler above\n });\n });\n }\n\n disconnect(): void {\n this.flushEvents();\n if (this.socket) {\n this.socket.io.reconnection(false);\n this.socket.removeAllListeners();\n this.socket.disconnect();\n this.socket = null;\n }\n }\n\n // ── Reconnect with retry ────────────────────────────────────────────\n\n private async reconnectToSession(): Promise<void> {\n const maxRetries = 5;\n const baseDelayMs = 2_000;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const { pendingMessages } = await this.call(\"connectAgent\", {\n sessionId: this.config.sessionId,\n });\n this.drainPendingMessages(pendingMessages);\n process.stderr.write(\"[conveyor-agent] Reconnected to session successfully\\n\");\n if (this.lastEmittedStatus) {\n void this.call(\"reportAgentStatus\", {\n sessionId: this.config.sessionId,\n status: this.lastEmittedStatus,\n }).catch(() => {});\n }\n return;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n // Exponential backoff: 2s, 4s, 8s, 16s, 32s\n const delayMs = baseDelayMs * 2 ** (attempt - 1);\n process.stderr.write(\n `[conveyor-agent] connectAgent failed (attempt ${attempt}/${maxRetries}): ${errMsg} — retrying in ${delayMs / 1000}s\\n`,\n );\n await new Promise<void>((resolve) => {\n setTimeout(resolve, delayMs);\n });\n }\n }\n\n // All retries exhausted — exit so the project runner can clean up and re-spawn\n process.stderr.write(\n `[conveyor-agent] Failed to reconnect to session after ${maxRetries} attempts, exiting\\n`,\n );\n process.exit(1);\n }\n\n private drainPendingMessages(messages: Array<{ content: string; userId: string }>): void {\n for (const msg of messages) {\n if (!msg.content) continue;\n if (this.messageCallback) {\n this.messageCallback({ content: msg.content, userId: msg.userId });\n } else {\n this.earlyMessages.push({ content: msg.content, userId: msg.userId });\n }\n }\n }\n\n // ── Callback registration with early-buffer draining ───────────────\n\n onMessage(callback: (msg: IncomingMessage) => void): void {\n this.messageCallback = callback;\n for (const msg of this.earlyMessages) callback(msg);\n this.earlyMessages = [];\n }\n\n onStop(callback: () => void): void {\n this.stopCallback = callback;\n if (this.earlyStop) {\n callback();\n this.earlyStop = false;\n }\n }\n\n onSoftStop(callback: () => void): void {\n this.softStopCallback = callback;\n if (this.earlySoftStop) {\n callback();\n this.earlySoftStop = false;\n }\n }\n\n onModeChange(callback: (data: SetModeData) => void): void {\n this.modeChangeCallback = callback;\n for (const data of this.earlyModeChanges) callback(data);\n this.earlyModeChanges = [];\n }\n\n onWake(callback: () => void): void {\n this.wakeCallback = callback;\n }\n\n onApiKeyUpdate(callback: (data: ApiKeyUpdateData) => void): void {\n this.apiKeyUpdateCallback = callback;\n }\n\n // ── Convenience methods (thin wrappers around call / emit) ─────────\n\n emitStatus(status: string): void {\n this.lastEmittedStatus = status;\n // Flush buffered events (e.g. \"completed\") before status change\n // so the API processes them in the correct order.\n this.flushEvents();\n void this.call(\"reportAgentStatus\", {\n sessionId: this.config.sessionId,\n status,\n }).catch(() => {});\n }\n\n postChatMessage(content: string): void {\n if (!this.socket) return;\n if (this.isDuplicateMessage(content)) {\n process.stderr.write(`[dedup] Suppressed near-duplicate message\\n`);\n return;\n }\n void this.call(\"postAgentMessage\", {\n sessionId: this.config.sessionId,\n content,\n }).catch(() => {});\n }\n\n private isDuplicateMessage(content: string): boolean {\n const now = Date.now();\n // Prune old entries\n this.recentMessages = this.recentMessages.filter(\n (m) => now - m.timestamp < AgentConnection.DEDUP_WINDOW_MS,\n );\n // Normalize: lowercase, strip punctuation, split on whitespace, keep words >= 3 chars\n const words = new Set(\n content\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\")\n .split(/\\s+/)\n .filter((w) => w.length >= 3),\n );\n if (words.size === 0) return false;\n // Check Jaccard similarity against recent messages\n for (const recent of this.recentMessages) {\n let intersection = 0;\n for (const w of words) {\n if (recent.words.has(w)) intersection++;\n }\n const union = new Set([...words, ...recent.words]).size;\n if (union > 0 && intersection / union > AgentConnection.DEDUP_SIMILARITY_THRESHOLD) {\n return true;\n }\n }\n // Track this message (keep at most 3)\n this.recentMessages.push({ words, timestamp: now });\n if (this.recentMessages.length > 3) {\n this.recentMessages.shift();\n }\n return false;\n }\n\n sendHeartbeat(): void {\n if (!this.socket) return;\n const statusMap: Record<string, \"active\" | \"idle\" | \"building\"> = {\n running: \"active\",\n fetching_context: \"active\",\n connected: \"active\",\n connecting: \"active\",\n idle: \"idle\",\n sleeping: \"idle\",\n };\n const heartbeatStatus = statusMap[this.lastEmittedStatus ?? \"idle\"] ?? \"active\";\n void this.call(\"heartbeat\", {\n sessionId: this.config.sessionId,\n timestamp: new Date().toISOString(),\n status: heartbeatStatus,\n }).catch(() => {});\n }\n\n emitModeChanged(agentMode?: AgentMode | null): void {\n this.sendEvent({ type: \"mode_changed\", agentMode });\n }\n\n updateTaskFields(fields: { plan?: string; description?: string }): void {\n if (!this.socket) return;\n void this.call(\"updateTaskFields\", {\n sessionId: this.config.sessionId,\n ...fields,\n }).catch(() => {});\n }\n\n storeSessionId(sdkSessionId: string): void {\n if (!this.socket) return;\n void this.call(\"storeSessionId\", {\n sessionId: this.config.sessionId,\n sdkSessionId,\n }).catch(() => {});\n }\n\n // ── Typing indicators ───────────────────────────────────────────────\n\n sendTypingStart(): void {\n this.sendEvent({ type: \"agent_typing_start\" });\n }\n\n sendTypingStop(): void {\n this.sendEvent({ type: \"agent_typing_stop\" });\n }\n\n // ── RPC convenience wrappers (v6 compat, will migrate to call()) ───\n\n trackSpending(params: {\n agentId: string;\n sessionId: string;\n totalCostUsd: number;\n onSubscription: boolean;\n modelUsage?: ModelUsageEntry[];\n }): void {\n if (!this.socket) return;\n // Use v7 service method for tracking spending\n void this.call(\"trackSpending\", {\n sessionId: this.config.sessionId,\n inputTokens: params.modelUsage?.reduce((s, m) => s + (m.inputTokens ?? 0), 0) ?? 0,\n outputTokens: params.modelUsage?.reduce((s, m) => s + (m.outputTokens ?? 0), 0) ?? 0,\n costUsd: params.totalCostUsd,\n model: params.modelUsage?.[0]?.model ?? \"unknown\",\n }).catch(() => {});\n }\n\n emitRateLimitPause(resetsAt: string): void {\n this.sendEvent({ type: \"rate_limit_update\", resetsAt });\n }\n\n updateStatus(status: string): void {\n this.emitStatus(status);\n }\n\n emitCodeReviewResult(content: string, approved: boolean): void {\n if (!this.socket) return;\n void this.call(\"submitCodeReviewResult\", {\n sessionId: this.config.sessionId,\n content,\n approved,\n }).catch(() => {});\n }\n\n // ── Question handling ──────────────────────────────────────────────\n\n async askUserQuestion(questions: AgentQuestion[]): Promise<Record<string, string>> {\n const questionText = questions\n .map(\n (q) =>\n `**${q.header}**\\n${q.question}${q.options.length ? \"\\n\" + q.options.map((o) => `- ${o.label}: ${o.description}`).join(\"\\n\") : \"\"}`,\n )\n .join(\"\\n\\n\");\n\n const requestId = crypto.randomUUID();\n\n // Race the RPC callback against the room-event fallback.\n // If the socket disconnects/reconnects while waiting, the RPC callback is\n // lost but the room event (emitted after reconnect to the session room)\n // will still deliver the answer.\n const roomEventPromise = new Promise<Record<string, string>>((resolve) => {\n this.pendingAnswerResolvers.set(requestId, resolve);\n });\n\n const rpcPromise = this.call(\"askUserQuestion\", {\n sessionId: this.config.sessionId,\n question: questionText,\n requestId,\n questions,\n }).then((res) => res.answers);\n\n try {\n return await Promise.race([rpcPromise, roomEventPromise]);\n } finally {\n this.pendingAnswerResolvers.delete(requestId);\n }\n }\n\n // ── Typed service method wrappers ───────────────────────────────────\n\n getTaskProperties(): Promise<{\n plan?: string;\n storyPointId?: string;\n title?: string;\n }> {\n return this.call(\"getTaskProperties\", { sessionId: this.config.sessionId });\n }\n\n triggerIdentification(): Promise<{ identified: boolean }> {\n return this.call(\"triggerIdentification\", { sessionId: this.config.sessionId });\n }\n\n requestScaleUp(tier: string, reason?: string): Promise<{ scaled: boolean }> {\n return this.call(\"scaleUpResources\", {\n sessionId: this.config.sessionId,\n tier,\n reason,\n }).then((r) => ({ scaled: r.success }));\n }\n\n async refreshAuthToken(): Promise<boolean> {\n const codespaceName = process.env.CODESPACE_NAME || process.env.CLAUDESPACE_NAME;\n const apiUrl = this.config.apiUrl;\n if (!codespaceName || !apiUrl) return false;\n try {\n const response = await fetch(`${apiUrl}/api/codespace/bootstrap/${codespaceName}`);\n if (!response.ok) return false;\n const config = (await response.json()) as {\n envVars?: Record<string, string>;\n };\n if (config.envVars?.CLAUDE_CODE_OAUTH_TOKEN) {\n process.env.CLAUDE_CODE_OAUTH_TOKEN = config.envVars.CLAUDE_CODE_OAUTH_TOKEN;\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n // ── Event buffering ────────────────────────────────────────────────\n\n sendEvent(event: Record<string, unknown>): void {\n if (!this.socket) return;\n this.eventBuffer.push({ event });\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(() => this.flushEvents(), EVENT_BATCH_MS);\n }\n }\n\n flushEvents(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n if (!this.socket || this.eventBuffer.length === 0) return;\n const events = this.eventBuffer.map((entry) => entry.event);\n this.eventBuffer = [];\n // Route through v7 emitAgentEvent service method (fire-and-forget)\n this.call(\"emitAgentEvent\", { sessionId: this.config.sessionId, events }).catch(() => {});\n }\n}\n","import type { AgentMode } from \"@project/shared\";\n\n// ── Mode action types ──────────────────────────────────────────────────────\n\nexport type ModeAction =\n | { type: \"noop\" }\n | { type: \"restart_query\"; newMode: AgentMode }\n | { type: \"soft_stop\" }\n | { type: \"start_auto\" };\n\n// ── Task context subset needed by ModeController ───────────────────────────\n\nexport interface ModeTaskContext {\n status: string;\n plan: string | null;\n storyPointId: string | null;\n isParentTask?: boolean;\n model: string;\n builderModel?: string | null;\n githubPRUrl?: string | null;\n}\n\n// ── ModeController: pure state machine with no I/O ─────────────────────────\n\nexport class ModeController {\n private _mode: AgentMode;\n private _hasExitedPlanMode = false;\n private _pendingModeRestart = false;\n private _runnerMode: \"task\" | \"pm\" | \"code-review\";\n private _isAuto: boolean;\n\n constructor(\n initialMode: AgentMode,\n runnerMode: \"task\" | \"pm\" | \"code-review\" = \"task\",\n isAuto = false,\n ) {\n this._mode = initialMode;\n this._runnerMode = runnerMode;\n this._isAuto = isAuto;\n }\n\n // ── Getters ────────────────────────────────────────────────────────\n\n get mode(): AgentMode {\n return this._mode;\n }\n\n get hasExitedPlanMode(): boolean {\n return this._hasExitedPlanMode;\n }\n\n set hasExitedPlanMode(val: boolean) {\n this._hasExitedPlanMode = val;\n }\n\n get pendingModeRestart(): boolean {\n return this._pendingModeRestart;\n }\n\n set pendingModeRestart(val: boolean) {\n this._pendingModeRestart = val;\n }\n\n /** Effective mode accounting for PM/task defaults */\n get effectiveMode(): AgentMode {\n if (this._mode) return this._mode;\n if (this._runnerMode === \"pm\") {\n return this._isAuto ? \"auto\" : \"discovery\";\n }\n return \"building\";\n }\n\n get isReadOnly(): boolean {\n const m = this.effectiveMode;\n if ([\"discovery\", \"code-review\", \"help\"].includes(m)) return true;\n return m === \"auto\" && !this._hasExitedPlanMode;\n }\n\n get isAutoPlanning(): boolean {\n return this.effectiveMode === \"auto\" && !this._hasExitedPlanMode;\n }\n\n get isBuildCapable(): boolean {\n const m = this.effectiveMode;\n return m === \"building\" || (m === \"auto\" && this._hasExitedPlanMode);\n }\n\n // ── Mode resolution ────────────────────────────────────────────────\n\n /** Resolve the initial mode based on task context */\n resolveInitialMode(context: ModeTaskContext): AgentMode {\n // Code-review is always one-shot\n if (this._runnerMode === \"code-review\") {\n this._mode = \"code-review\";\n return this._mode;\n }\n\n // PM mode with auto: check if we can bypass planning\n if (this._mode === \"auto\") {\n const pastPlanning = context.status !== \"Planning\" && context.status !== \"Unidentified\";\n if (pastPlanning) {\n this.transitionToBuilding(context);\n return this._mode;\n }\n }\n\n return this._mode;\n }\n\n /** Check if auto-mode can bypass planning (task already has plan + properties) */\n canBypassPlanning(context: ModeTaskContext): boolean {\n if (this._mode !== \"auto\") return false;\n const pastPlanning = context.status !== \"Planning\" && context.status !== \"Unidentified\";\n if (pastPlanning) return true;\n if (context.status === \"Planning\" && context.plan?.trim() && context.storyPointId) {\n return true;\n }\n return false;\n }\n\n // ── Mode transitions ───────────────────────────────────────────────\n\n /** Handle mode change from server */\n handleModeChange(newMode: AgentMode): ModeAction {\n if (this._runnerMode !== \"pm\") return { type: \"noop\" };\n if (newMode === this._mode) return { type: \"noop\" };\n\n this._mode = newMode;\n this.updateExitedPlanModeFlag(newMode);\n\n if (this.isBuildCapable) {\n return { type: \"start_auto\" };\n }\n return { type: \"noop\" };\n }\n\n /** Handle ExitPlanMode call from the agent */\n handleExitPlanMode(context: ModeTaskContext): ModeAction {\n if (this._hasExitedPlanMode) return { type: \"noop\" };\n this.transitionToBuilding(context);\n this._pendingModeRestart = true;\n return { type: \"restart_query\", newMode: this._mode };\n }\n\n /** Check if pack runner behavior should be used */\n isPackRunner(context: ModeTaskContext): boolean {\n return !!context.isParentTask;\n }\n\n // ── Internal helpers ───────────────────────────────────────────────\n\n private transitionToBuilding(context: ModeTaskContext): void {\n this._hasExitedPlanMode = true;\n this._mode = context.isParentTask ? \"review\" : \"building\";\n }\n\n private updateExitedPlanModeFlag(newMode: AgentMode): void {\n if (newMode === \"building\") {\n this._hasExitedPlanMode = true;\n }\n // For auto mode, we can't set the flag without context — it gets\n // set during context fetch or when ExitPlanMode is called\n }\n}\n","// ── Configuration ──────────────────────────────────────────────────────────\n\nexport interface LifecycleConfig {\n /** Idle timeout before entering sleep mode (default: 30 min) */\n idleTimeoutMs: number;\n /** Grace period after sleep announcement before shutdown (default: 5s) */\n sleepGracePeriodMs: number;\n /** Heartbeat interval (default: 30s) */\n heartbeatIntervalMs: number;\n}\n\nexport interface LifecycleCallbacks {\n onHeartbeat: () => void;\n onIdleTimeout: () => void;\n onSleep: () => void;\n onSleepGraceExpired: () => void;\n onWake: () => void;\n}\n\n// ── Default configuration ──────────────────────────────────────────────────\n\n/** 30 min idle, 5s sleep grace, 30s heartbeat */\nexport const DEFAULT_LIFECYCLE_CONFIG: LifecycleConfig = {\n idleTimeoutMs: 30 * 60 * 1000,\n sleepGracePeriodMs: 5000,\n heartbeatIntervalMs: 30_000,\n};\n\n// ── Lifecycle: timer management for idle/sleep/wake/heartbeat ──────────────\n\nexport class Lifecycle {\n private readonly config: LifecycleConfig;\n private readonly callbacks: LifecycleCallbacks;\n\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private idleCheckInterval: ReturnType<typeof setInterval> | null = null;\n private sleepShutdownTimer: ReturnType<typeof setTimeout> | null = null;\n private _isSleeping = false;\n\n constructor(config: LifecycleConfig, callbacks: LifecycleCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n }\n\n get isSleeping(): boolean {\n return this._isSleeping;\n }\n\n // ── Heartbeat ──────────────────────────────────────────────────────\n\n startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n this.callbacks.onHeartbeat();\n }, this.config.heartbeatIntervalMs);\n }\n\n stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n // ── Idle timer ─────────────────────────────────────────────────────\n\n startIdleTimer(): void {\n this.clearIdleTimers();\n this.idleTimer = setTimeout(() => {\n this.callbacks.onIdleTimeout();\n this.enterSleepMode();\n }, this.config.idleTimeoutMs);\n }\n\n cancelIdleTimer(): void {\n this.clearIdleTimers();\n }\n\n // ── Sleep mode ─────────────────────────────────────────────────────\n\n private enterSleepMode(): void {\n this._isSleeping = true;\n this.callbacks.onSleep();\n this.sleepShutdownTimer = setTimeout(() => {\n this.callbacks.onSleepGraceExpired();\n }, this.config.sleepGracePeriodMs);\n }\n\n /** Wake from sleep — cancels shutdown timer, resets idle */\n wake(): void {\n if (this.sleepShutdownTimer) {\n clearTimeout(this.sleepShutdownTimer);\n this.sleepShutdownTimer = null;\n }\n this._isSleeping = false;\n this.callbacks.onWake();\n }\n\n /** Cancel the sleep shutdown timer (e.g. when a message arrives) */\n cancelSleepShutdown(): void {\n if (this.sleepShutdownTimer) {\n clearTimeout(this.sleepShutdownTimer);\n this.sleepShutdownTimer = null;\n }\n this._isSleeping = false;\n }\n\n // ── Cleanup ────────────────────────────────────────────────────────\n\n destroy(): void {\n this.stopHeartbeat();\n this.clearIdleTimers();\n }\n\n // ── Private ────────────────────────────────────────────────────────\n\n private clearIdleTimers(): void {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n if (this.idleCheckInterval) {\n clearInterval(this.idleCheckInterval);\n this.idleCheckInterval = null;\n }\n if (this.sleepShutdownTimer) {\n clearTimeout(this.sleepShutdownTimer);\n this.sleepShutdownTimer = null;\n }\n this._isSleeping = false;\n }\n}\n","import { execSync } from \"node:child_process\";\n\n/** Fetch and merge the latest base branch to prevent stale-base merge conflicts.\n * Returns true on success or no-op (empty baseBranch), false on failure. */\nexport function syncWithBaseBranch(cwd: string, baseBranch: string): boolean {\n if (!baseBranch) return true;\n\n try {\n execSync(`git fetch origin ${baseBranch}`, { cwd, stdio: \"ignore\", timeout: 60_000 });\n } catch {\n process.stderr.write(\n `[conveyor-agent] Warning: git fetch origin ${baseBranch} failed, continuing with current base\\n`,\n );\n return false;\n }\n\n try {\n execSync(`git merge origin/${baseBranch} --no-edit`, { cwd, stdio: \"ignore\", timeout: 30_000 });\n } catch {\n process.stderr.write(\n `[conveyor-agent] Warning: merge origin/${baseBranch} failed, aborting merge and continuing\\n`,\n );\n try {\n execSync(\"git merge --abort\", { cwd, stdio: \"ignore\" });\n } catch {\n // merge --abort can fail if there's nothing to abort\n }\n return false;\n }\n\n process.stderr.write(`[conveyor-agent] Synced with latest origin/${baseBranch}\\n`);\n return true;\n}\n\n/** Returns true if the working tree has uncommitted changes (staged or unstaged). */\nexport function hasUncommittedChanges(cwd: string): boolean {\n const status = execSync(\"git status --porcelain\", {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n return status.length > 0;\n}\n\n/** Returns the current branch name, or null if on detached HEAD. */\nexport function getCurrentBranch(cwd: string): string | null {\n try {\n const branch = execSync(\"git branch --show-current\", {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n return branch || null;\n } catch {\n return null;\n }\n}\n\n/** Returns true if there are committed changes that haven't been pushed to origin. */\nexport function hasUnpushedCommits(cwd: string): boolean {\n try {\n const currentBranch = getCurrentBranch(cwd);\n if (!currentBranch) return false;\n\n try {\n execSync(`git rev-parse origin/${currentBranch}`, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n try {\n execSync(\"git rev-parse HEAD\", { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] });\n return true;\n } catch {\n return false;\n }\n }\n\n const ahead = execSync(`git rev-list --count HEAD --not origin/${currentBranch}`, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n return parseInt(ahead, 10) > 0;\n } catch {\n return false;\n }\n}\n\n/** Stage all changes and create a commit. Returns the commit hash if successful. */\nexport function stageAndCommit(cwd: string, message: string): string | null {\n try {\n execSync(\"git add -A\", { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] });\n\n if (!hasUncommittedChanges(cwd)) return null;\n\n execSync(`git commit -m ${JSON.stringify(message)}`, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n return execSync(\"git rev-parse HEAD\", { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n .toString()\n .trim();\n } catch {\n return null;\n }\n}\n\nfunction tryPush(cwd: string, branch: string): boolean {\n try {\n execSync(`git push origin ${branch}`, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n return true;\n } catch {\n try {\n execSync(`git push --force-with-lease origin ${branch}`, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction isAuthError(cwd: string): boolean {\n try {\n execSync(\"git push --dry-run\", { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n return false;\n } catch (err: unknown) {\n const stderr = (err as { stderr?: Buffer }).stderr?.toString() ?? \"\";\n const stdout = (err as { stdout?: Buffer }).stdout?.toString() ?? \"\";\n const msg = stderr || stdout || (err instanceof Error ? err.message : \"\");\n return /authentication|authorization|403|401|token/i.test(msg);\n }\n}\n\n/** Update the git remote URL with a fresh token. */\nexport function updateRemoteToken(cwd: string, token: string): void {\n try {\n const url = execSync(\"git remote get-url origin\", { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] })\n .toString()\n .trim();\n const match = url.match(/github\\.com[/:]([^/]+\\/[^/.]+)/);\n if (match) {\n const repo = match[1].replace(/\\.git$/, \"\");\n execSync(\n `git remote set-url origin \"https://x-access-token:${token}@github.com/${repo}.git\"`,\n { cwd, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n }\n } catch {\n // silently fail — push retry will surface the real error\n }\n}\n\n/** Push current branch to origin. On auth failure, refreshes the GitHub token and retries. */\nexport async function pushToOrigin(\n cwd: string,\n refreshToken?: () => Promise<string | undefined>,\n): Promise<boolean> {\n try {\n const currentBranch = getCurrentBranch(cwd);\n if (!currentBranch) return false;\n\n if (tryPush(cwd, currentBranch)) return true;\n\n if (refreshToken && isAuthError(cwd)) {\n const token = await refreshToken();\n if (token) {\n updateRemoteToken(cwd, token);\n process.env.GITHUB_TOKEN = token;\n process.env.GH_TOKEN = token;\n return tryPush(cwd, currentBranch);\n }\n }\n\n return false;\n } catch {\n return false;\n }\n}\n","import { readdirSync, statSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\n\nexport class PlanSync {\n private planFileSnapshot = new Map<string, number>();\n private lockedPlanFile: string | null = null;\n private workspaceDir: string;\n private connection: AgentConnection;\n\n constructor(workspaceDir: string, connection: AgentConnection) {\n this.workspaceDir = workspaceDir;\n this.connection = connection;\n }\n\n updateWorkspaceDir(workspaceDir: string): void {\n this.workspaceDir = workspaceDir;\n }\n\n private getPlanDirs(): string[] {\n return [join(this.workspaceDir, \".claude\", \"plans\")];\n }\n\n snapshotPlanFiles(): void {\n this.planFileSnapshot.clear();\n this.lockedPlanFile = null;\n for (const plansDir of this.getPlanDirs()) {\n try {\n for (const file of readdirSync(plansDir).filter((f) => f.endsWith(\".md\"))) {\n try {\n const fullPath = join(plansDir, file);\n const stat = statSync(fullPath);\n this.planFileSnapshot.set(fullPath, stat.mtimeMs);\n } catch {\n continue;\n }\n }\n } catch {\n /* plans dir doesn't exist yet */\n }\n }\n }\n\n private findNewestPlanFile(): { path: string; mtime: number } | null {\n let newest: { path: string; mtime: number } | null = null;\n for (const plansDir of this.getPlanDirs()) {\n let files: string[];\n try {\n files = readdirSync(plansDir).filter((f) => f.endsWith(\".md\"));\n } catch {\n continue;\n }\n\n for (const file of files) {\n const fullPath = join(plansDir, file);\n try {\n const stat = statSync(fullPath);\n const prevMtime = this.planFileSnapshot.get(fullPath);\n const isNew = prevMtime === undefined || stat.mtimeMs > prevMtime;\n if (isNew && (!newest || stat.mtimeMs > newest.mtime)) {\n newest = { path: fullPath, mtime: stat.mtimeMs };\n }\n } catch {\n continue;\n }\n }\n }\n return newest;\n }\n\n syncPlanFile(): void {\n if (this.lockedPlanFile) {\n try {\n const content = readFileSync(this.lockedPlanFile, \"utf-8\").trim();\n if (content) {\n this.connection.updateTaskFields({ plan: content });\n const fileName = this.lockedPlanFile.split(\"/\").pop() ?? \"plan\";\n this.connection.postChatMessage(`Synced local plan file (${fileName}) to the task plan.`);\n }\n } catch {\n /* locked file was deleted */\n }\n return;\n }\n\n const newest = this.findNewestPlanFile();\n if (newest) {\n this.lockedPlanFile = newest.path;\n const content = readFileSync(newest.path, \"utf-8\").trim();\n if (content) {\n this.connection.updateTaskFields({ plan: content });\n const fileName = newest.path.split(\"/\").pop() ?? \"plan\";\n this.connection.postChatMessage(\n `Detected local plan file (${fileName}) and synced it to the task plan.`,\n );\n }\n }\n }\n}\n","import type { TaskContext, ChatMessage } from \"@project/shared\";\n\nfunction findLastAgentMessageIndex(history: ChatMessage[]): number {\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction formatProjectAgents(projectAgents: NonNullable<TaskContext[\"projectAgents\"]>): string[] {\n const parts: string[] = [``, `## Project Agents`];\n for (const pa of projectAgents) {\n const role = pa.role ? `role: ${pa.role}` : \"role: unassigned\";\n const sp =\n pa.storyPoints === null || pa.storyPoints === undefined\n ? \"\"\n : `, story points: ${pa.storyPoints}`;\n parts.push(`- ${pa.agent.name} (${role}${sp})`);\n }\n return parts;\n}\n\nfunction formatStoryPoints(storyPoints: NonNullable<TaskContext[\"storyPoints\"]>): string[] {\n const parts: string[] = [``, `## Story Point Tiers`];\n for (const sp of storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n return parts;\n}\n\nexport function buildPackRunnerSystemPrompt(\n context: TaskContext,\n config: { instructions: string; workspaceDir: string },\n setupLog: string[],\n): string {\n const parts: string[] = [\n `You are an autonomous Pack Runner managing child tasks for the \"${context.title}\" project.`,\n `You are running locally with full access to the repository and task management tools.`,\n `Your job is to execute child tasks by firing cloud builds, reviewing their PRs, and merging them — respecting dependency chains for parallel execution.`,\n ``,\n `## Child Task Status Lifecycle`,\n `- \"Planning\" — Not ready for execution. Skip it (or escalate if blocking).`,\n `- \"Open\" — Ready to execute (if dependencies are met). Use start_child_cloud_build to fire it.`,\n `- \"InProgress\" — Currently being worked on by a Task Runner. Wait — it will move to ReviewPR when done.`,\n `- \"ReviewPR\" — Task Runner finished and opened a PR. Review and merge it.`,\n `- \"ReviewDev\" — PR was merged to dev. This child is complete. Move on.`,\n `- \"Complete\" — Fully done. Move on.`,\n ``,\n `## Autonomous Loop`,\n `Follow this loop each time you are launched or relaunched:`,\n ``,\n `1. Call list_subtasks to see the current state of all child tasks.`,\n ` The response includes PR info, agent assignment, and **dependency info** (dependencies array + allDependenciesMet flag).`,\n ``,\n `2. Evaluate children by status and dependency readiness:`,\n ` - \"ReviewPR\": Review and merge its PR with approve_and_merge_pr. (Highest priority)`,\n ` - If merge fails due to pending CI: post a status update to chat, state you are going idle.`,\n ` - If merge fails due to failed CI: use get_task_cli(childTaskId) to check. Escalate to team.`,\n ` - \"InProgress\": A Task Runner is actively working. Do nothing — wait.`,\n ` - \"Open\" + allDependenciesMet=true: Ready to fire. Use start_child_cloud_build.`,\n ` - \"Open\" + allDependenciesMet=false: Blocked — skip for now. Will be unblocked when deps complete.`,\n ` - \"ReviewDev\" / \"Complete\": Already done. Skip.`,\n ` - \"Planning\": Not ready. If blocking progress, notify team.`,\n ``,\n `3. Fire ALL ready \"Open\" tasks whose dependencies are met, not just one. Independent tasks can run in parallel.`,\n ``,\n `4. After merging a PR: run \\`git pull origin ${context.baseBranch}\\` then re-check list_subtasks — previously blocked tasks may now be ready.`,\n ``,\n `5. After firing all ready tasks: report which tasks you fired to chat, then state you are going idle.`,\n ``,\n `6. When ALL children are in \"ReviewDev\" or \"Complete\" (no \"Open\", \"InProgress\", or \"ReviewPR\" remaining): do a final review, summarize results in chat, and mark this parent task complete with force_update_task_status(\"Complete\").`,\n ``,\n `## Important Rules`,\n `- When dependencies are set on children, use them to determine execution order. Fire all ready tasks in parallel.`,\n `- When NO dependencies are set on any children, fall back to ordinal order (one at a time). This preserves backward compatibility.`,\n `- After firing builds OR when waiting on CI, explicitly state you are going idle. The system will disconnect you and relaunch when there's a status change.`,\n `- Do NOT attempt to write code yourself. Your role is coordination only.`,\n `- If a child is stuck in \"InProgress\" for an unusually long time, use get_task_cli(childTaskId) to check its logs and escalate to the team if it appears stuck.`,\n `- You can use get_task(childTaskId) to get a child's full details including PR URL and branch.`,\n `- list_subtasks returns PR info (githubPRNumber, githubPRUrl), agent assignment (agentId), and dependency info for each child — use this to verify readiness before firing builds.`,\n `- You can use read_task_chat to check for team messages.`,\n ];\n\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(...formatStoryPoints(context.storyPoints));\n }\n\n if (context.projectAgents && context.projectAgents.length > 0) {\n parts.push(...formatProjectAgents(context.projectAgents));\n }\n\n if (setupLog.length > 0) {\n parts.push(``, `## Environment setup log`, \"```\", ...setupLog, \"```\");\n }\n\n if (context.agentInstructions) {\n parts.push(``, `## Agent Instructions`, context.agentInstructions);\n }\n if (config.instructions) {\n parts.push(``, `## Additional Instructions`, config.instructions);\n }\n\n parts.push(\n ``,\n `Your responses are sent directly to the task chat — the team sees everything you say.`,\n `Do NOT call the post_to_chat tool for your own task; your replies already appear in chat automatically.`,\n `Only use post_to_chat if you need to message a different task's chat (e.g. a child task).`,\n `Use read_task_chat only if you need to re-read earlier messages beyond the chat context above.`,\n );\n\n return parts.join(\"\\n\");\n}\n\nexport function buildPackRunnerInstructions(\n context: TaskContext,\n scenario: \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\",\n): string[] {\n const parts: string[] = [`\\n## Instructions`];\n\n if (scenario === \"fresh\") {\n parts.push(\n `You are the Pack Runner for this task and its subtasks.`,\n `Begin your autonomous loop immediately: call list_subtasks to assess the current state.`,\n `If any child is in \"ReviewPR\" status, review and merge its PR first.`,\n `Then fire the next \"Open\" child task.`,\n );\n } else if (scenario === \"idle_relaunch\") {\n parts.push(\n `You have been relaunched — a child task likely changed status.`,\n `Call list_subtasks to check the current state of all children.`,\n `Look for children in \"ReviewPR\" status first — review and merge their PRs.`,\n `Check if any previously blocked tasks now have allDependenciesMet=true — fire them.`,\n `If a child you previously fired is now in \"ReviewDev\", pull latest with \\`git pull origin ${context.baseBranch}\\`.`,\n `If no children need action, state you are going idle.`,\n );\n } else {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n const newMessages = context.chatHistory\n .slice(lastAgentIdx + 1)\n .filter((m) => m.role === \"user\");\n parts.push(\n `You have been relaunched with new messages.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAfter addressing the feedback, resume your autonomous loop: call list_subtasks and proceed accordingly.`,\n );\n }\n\n return parts;\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport type { TaskContext } from \"@project/shared\";\n\ninterface ResolvedEntry {\n type: \"rule\" | \"file\" | \"folder\" | \"doc\";\n path: string;\n label?: string;\n content: string | null;\n charCount: number;\n}\n\ninterface ResolvedTagContext {\n tagName: string;\n description: string | null;\n entries: ResolvedEntry[];\n}\n\nconst TYPE_PRIORITY: Record<string, number> = { rule: 0, file: 1, folder: 2, doc: 3 };\n\n// Binary file extensions to skip content injection\nconst BINARY_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".svg\",\n \".bmp\",\n \".mp3\",\n \".mp4\",\n \".wav\",\n \".avi\",\n \".mov\",\n \".pdf\",\n \".zip\",\n \".tar\",\n \".gz\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".eot\",\n \".otf\",\n \".exe\",\n \".dll\",\n \".so\",\n \".dylib\",\n \".wasm\",\n]);\n\nfunction isBinaryPath(filePath: string): boolean {\n const ext = filePath.slice(filePath.lastIndexOf(\".\")).toLowerCase();\n return BINARY_EXTENSIONS.has(ext);\n}\n\nfunction getContextBudgetChars(_model: string, betas?: string[]): number {\n const contextWindow = betas?.some((b) => b.includes(\"context-1m\")) ? 1_000_000 : 200_000;\n // 25% of context window, ~4 chars per token\n return contextWindow * 0.25 * 4;\n}\n\nasync function readFileContent(filePath: string, maxChars: number): Promise<string | null> {\n try {\n if (isBinaryPath(filePath)) return null;\n const content = await readFile(filePath, \"utf-8\");\n if (content.length > maxChars) {\n const omitted = content.length - maxChars;\n return content.slice(0, maxChars) + `\\n[... truncated, ${omitted} chars omitted]`;\n }\n return content;\n } catch {\n return null;\n }\n}\n\nasync function readFolderListing(folderPath: string): Promise<string | null> {\n try {\n const entries = await readdir(folderPath);\n return `Files: ${entries.join(\", \")}`;\n } catch {\n return null;\n }\n}\n\nasync function resolveEntry(\n entry: { type: string; path: string; label?: string },\n budget: { remaining: number },\n): Promise<ResolvedEntry> {\n const result: ResolvedEntry = {\n type: entry.type as ResolvedEntry[\"type\"],\n path: entry.path,\n label: entry.label,\n content: null,\n charCount: 0,\n };\n\n if (budget.remaining <= 0) return result;\n\n if (entry.type === \"doc\") {\n // doc type references project documents in DB — skip content injection\n return result;\n }\n\n if (entry.type === \"folder\") {\n const listing = await readFolderListing(entry.path);\n if (listing) {\n result.content = listing;\n result.charCount = listing.length;\n budget.remaining -= listing.length;\n }\n return result;\n }\n\n // rule or file — read from disk\n // Single file cap: 50% of remaining budget\n const maxChars = Math.floor(budget.remaining * 0.5) || budget.remaining;\n const content = await readFileContent(entry.path, maxChars);\n if (content) {\n result.content = content;\n result.charCount = content.length;\n budget.remaining -= content.length;\n }\n return result;\n}\n\nfunction formatEntry(entry: ResolvedEntry): string {\n const label = entry.label ? ` (${entry.label})` : \"\";\n const header = `#### ${entry.path}${label} (${entry.type})`;\n\n if (entry.content === null) {\n return `> ${entry.type}: ${entry.path}${label}`;\n }\n\n if (entry.type === \"folder\") {\n return `${header}\\n${entry.content}`;\n }\n\n // rule or file — wrap in code fence\n return `${header}\\n\\`\\`\\`\\n${entry.content}\\n\\`\\`\\``;\n}\n\nfunction formatResolvedTags(resolved: ResolvedTagContext[]): string {\n const parts: string[] = [`\\n## Tag Context`];\n\n for (const tag of resolved) {\n if (tag.entries.length === 0) continue;\n const desc = tag.description ? ` — ${tag.description}` : \"\";\n parts.push(`\\n### Tag: \"${tag.tagName}\"${desc}`);\n\n const contentEntries = tag.entries.filter((e) => e.content !== null);\n const pointerEntries = tag.entries.filter((e) => e.content === null);\n\n for (const entry of contentEntries) {\n parts.push(`\\n${formatEntry(entry)}`);\n }\n\n if (pointerEntries.length > 0) {\n parts.push(``);\n parts.push(`> Budget limit reached. Remaining linked files (read manually if needed):`);\n for (const entry of pointerEntries) {\n parts.push(formatEntry(entry));\n }\n }\n }\n\n return parts.join(\"\\n\");\n}\n\nexport async function resolveTagContext(\n projectTags: TaskContext[\"projectTags\"],\n taskTagIds: string[],\n model: string,\n betas?: string[],\n): Promise<{ injectedSection: string; stats: { injected: number; skipped: number } }> {\n if (!projectTags?.length || !taskTagIds.length) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n const taskTagIdSet = new Set(taskTagIds);\n const assignedTags = projectTags.filter((t) => taskTagIdSet.has(t.id));\n\n if (assignedTags.length === 0) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n // Collect all entries across tags, sorted by type priority\n const allEntries: { tagIndex: number; entry: { type: string; path: string; label?: string } }[] =\n [];\n for (let i = 0; i < assignedTags.length; i++) {\n const tag = assignedTags[i];\n if (!tag.contextPaths?.length) continue;\n const sorted = [...tag.contextPaths].sort(\n (a, b) => (TYPE_PRIORITY[a.type] ?? 99) - (TYPE_PRIORITY[b.type] ?? 99),\n );\n for (const entry of sorted) {\n allEntries.push({ tagIndex: i, entry });\n }\n }\n\n if (allEntries.length === 0) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n const budgetChars = getContextBudgetChars(model, betas);\n const budget = { remaining: budgetChars };\n let injected = 0;\n let skipped = 0;\n\n // Resolve all entries\n const resolved: ResolvedTagContext[] = assignedTags.map((t) => ({\n tagName: t.name,\n description: t.description,\n entries: [],\n }));\n\n for (const { tagIndex, entry } of allEntries) {\n const result = await resolveEntry(entry, budget);\n resolved[tagIndex].entries.push(result);\n if (result.content === null) {\n skipped++;\n } else {\n injected++;\n }\n }\n\n return {\n injectedSection: formatResolvedTags(resolved),\n stats: { injected, skipped },\n };\n}\n","import type { AgentMode, TaskContext } from \"@project/shared\";\n\nfunction buildPropertyInstructions(context: TaskContext): string[] {\n const parts: string[] = [];\n parts.push(\n ``,\n `### Proactive Property Management`,\n `As you plan this task, proactively fill in task properties when you have enough context:`,\n `- Use update_task_properties to set any combination of: title, story points, tags, and icon`,\n `- You can update all properties at once or just one at a time as needed`,\n `- For icons: FIRST call list_icons to check for existing matches, then use update_task_properties with iconId.`,\n ` Only call generate_task_icon if no existing icon is a good fit.`,\n ``,\n `Don't wait for the user to ask — fill these in naturally as the plan takes shape.`,\n `If the user adjusts the plan significantly, update the properties to match.`,\n );\n\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(``, `Available story point tiers:`);\n for (const sp of context.storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n }\n\n if (context.projectTags && context.projectTags.length > 0) {\n parts.push(``, `Available project tags:`);\n for (const tag of context.projectTags) {\n const desc = tag.description ? ` — ${tag.description}` : \"\";\n parts.push(`- ID: \"${tag.id}\", Name: \"${tag.name}\"${desc}`);\n if (tag.contextPaths?.length) {\n for (const link of tag.contextPaths) {\n const label = link.label ? ` (${link.label})` : \"\";\n parts.push(` → ${link.type}: ${link.path}${label}`);\n }\n }\n }\n }\n\n return parts;\n}\n\nfunction buildDiscoveryPrompt(context?: TaskContext): string {\n const parts = [\n `\\n## Mode: Discovery`,\n `You are in Discovery mode — helping plan and scope this task.`,\n `- You have read-only codebase access (can read files, run git commands, search code)`,\n `- You can write plan files in .claude/plans/ only — no other file writes`,\n `- Do NOT attempt to edit, write, or modify source code files — these operations will be denied`,\n `- If you identify code changes needed, describe them in the plan instead of implementing them`,\n `- You can create and manage subtasks`,\n `- Goal: collaborate with the user to create a clear plan`,\n `- Proactively fill task properties (SP, tags, icon) as the plan takes shape`,\n ``,\n `### Planning Checklist (complete ALL before calling ExitPlanMode)`,\n `Your PRIMARY goal is to create a thorough plan. Complete these steps in order:`,\n `1. Read the task description and chat history — respond to what's been discussed`,\n `2. Explore the codebase to understand relevant files and patterns`,\n `3. Save a detailed plan via \\`update_task\\``,\n `4. Set story points, tags, and title via \\`update_task_properties\\``,\n `5. Discuss the plan with the team if they're engaged, incorporate feedback`,\n `6. THEN call ExitPlanMode — it is the LAST step, not the first`,\n ``,\n `### Self-Identification Tools`,\n `Use these MCP tools to set your own task properties:`,\n `- \\`update_task\\` — save your plan and description`,\n `- \\`update_task_properties\\` — set title, story points, tags, and icon (any combination)`,\n `- \\`generate_task_icon\\` — generate a new icon if needed (call \\`list_icons\\` first)`,\n ``,\n `### Tags & Context`,\n `- Early in discovery, identify relevant project tags that match this task's domain`,\n `- Add matching tags using \\`update_task_properties\\` — this links relevant documentation and rules that help you plan more effectively`,\n `- Tags accelerate discovery by surfacing domain-specific context automatically`,\n ``,\n ...(context?.isParentTask\n ? [\n `### Parent Task Coordination`,\n `You are a parent task with child tasks. Focus on breaking work into child tasks with detailed plans, not planning implementation for yourself.`,\n `- Use \\`list_subtasks\\` to review existing children. Create or update child tasks using \\`create_subtask\\` / \\`update_subtask\\`.`,\n `- Each child task should be a self-contained unit of work with a clear plan.`,\n ]\n : [\n `### Self-Update vs Subtasks`,\n `- If the work fits in a single task (1-3 SP), update YOUR OWN plan and properties — do not create subtasks`,\n `- Only create subtasks when the work genuinely requires multiple independent pieces (e.g., Pack-tier work, 8+ SP)`,\n ]),\n ``,\n `### Subtask Plan Requirements`,\n `When creating subtasks, each MUST include a detailed \\`plan\\` field:`,\n `- Plans should be multi-step implementation guides, not vague descriptions`,\n `- Include specific file paths, function names, and code patterns to modify`,\n `- Reference existing implementations when relevant (e.g., \"follow the pattern in src/services/foo.ts\")`,\n `- Include testing requirements and acceptance criteria`,\n `- Set \\`storyPointValue\\` based on estimated complexity`,\n ``,\n `### Completing Planning`,\n `Once ALL checklist items above are done, call the **ExitPlanMode** tool.`,\n `- Required before ExitPlanMode will succeed: **plan** (via update_task), **story points** (via update_task_properties), **title** (via update_task_properties)`,\n `- ExitPlanMode validates these properties and marks planning as complete`,\n `- It does NOT start building — the team controls when to switch to Build mode`,\n `- Do NOT call ExitPlanMode until you have thoroughly explored the codebase and saved a detailed plan`,\n ];\n if (context) parts.push(...buildPropertyInstructions(context));\n return parts.join(\"\\n\");\n}\n\nfunction buildAutoPrompt(context?: TaskContext): string {\n const parts = [\n `\\n## Mode: Auto`,\n `You are in Auto mode — operating autonomously through planning → building → PR.`,\n ``,\n `### Phase 1: Discovery & Planning (current)`,\n `- You are in the SDK's plan mode — read-only access is enforced automatically`,\n `- You have MCP tools for task properties: update_task, update_task_properties`,\n ``,\n `### Required before transitioning:`,\n `Before calling ExitPlanMode, you MUST fill in ALL of these:`,\n `1. **Plan** — Save a clear implementation plan using update_task`,\n `2. **Story Points** — Assign via update_task_properties`,\n `3. **Title** — Set an accurate title via update_task_properties (if the current one is vague or \"Untitled\")`,\n ``,\n `### Transitioning to Building:`,\n `When your plan is complete and all required properties are set, call the **ExitPlanMode** tool.`,\n `- If any required properties are missing, ExitPlanMode will be denied with details on what's missing`,\n `- Once ExitPlanMode succeeds, the system will automatically restart your session in Building mode with the appropriate model`,\n `- You do NOT need to do anything after calling ExitPlanMode — the transition is handled for you`,\n ``,\n `### Subtask Plan Requirements`,\n `When creating subtasks, each MUST include a detailed \\`plan\\` field:`,\n `- Plans should be multi-step implementation guides, not vague descriptions`,\n `- Include specific file paths, function names, and code patterns to modify`,\n `- Reference existing implementations when relevant`,\n `- Include testing requirements and acceptance criteria`,\n `- Set \\`storyPointValue\\` based on estimated complexity`,\n ``,\n ...(context?.isParentTask\n ? [\n ``,\n `### Parent Task Guidance`,\n `You are a parent task. Your plan should define child tasks with detailed plans, not direct implementation steps.`,\n `After ExitPlanMode, you'll transition to Review mode to coordinate child task execution.`,\n `Child task status lifecycle: Open → InProgress → ReviewPR → ReviewDev → Complete.`,\n ]\n : []),\n ``,\n `### Autonomous Guidelines:`,\n `- Make decisions independently — do not ask the team for approval at each step`,\n `- Only escalate when genuinely blocked (ambiguous requirements, missing access, conflicting instructions)`,\n `- Be thorough in discovery: read relevant files, understand the codebase architecture, then plan`,\n ];\n if (context) parts.push(...buildPropertyInstructions(context));\n return parts.join(\"\\n\");\n}\n\nexport function buildModePrompt(\n agentMode: AgentMode | null | undefined,\n context?: TaskContext,\n): string | null {\n switch (agentMode) {\n case \"discovery\":\n return buildDiscoveryPrompt(context);\n case \"building\": {\n const parts = [\n `\\n## Mode: Building`,\n `You are in Building mode — executing the plan.`,\n `- You have full coding access (read, write, edit, bash, git)`,\n `- Safety rules: no destructive operations, use --force-with-lease instead of --force`,\n ...(context?.isParentTask\n ? [\n `- You are a parent task. Use \\`list_subtasks\\`, \\`start_child_cloud_build\\`, and subtask management tools to coordinate children.`,\n `- Do NOT implement code directly — fire child builds and review their work.`,\n `- Goal: coordinate child task execution and ensure all children complete successfully`,\n ]\n : [\n `- If this is a leaf task (no children): execute the plan directly`,\n `- Goal: implement the plan, run tests, open a PR when done`,\n ]),\n ];\n if (process.env.CLAUDESPACE_NAME) {\n parts.push(\n ``,\n `### Resource Management`,\n `Your pod starts with minimal resources. You MUST call \\`scale_up_resources\\``,\n `BEFORE running any resource-intensive operations — they WILL fail or OOM at baseline resources:`,\n `- **setup** — package installs, basic dev servers, light builds`,\n `- **build** — full dev servers, test suites, typecheck, lint, E2E tests`,\n `Actual CPU/memory values are configured per-project. Scaling is one-way (up only).`,\n `CRITICAL: Always scale to at least \"setup\" before running any package install command.`,\n );\n }\n return parts.join(\"\\n\");\n }\n case \"review\":\n return buildReviewPrompt(context);\n case \"auto\":\n return buildAutoPrompt(context);\n case \"code-review\":\n return buildCodeReviewPrompt();\n default:\n return null;\n }\n}\n\nfunction buildReviewPrompt(context?: TaskContext): string {\n const parts = [\n `\\n## Mode: Review`,\n `You are in Review mode — reviewing and coordinating.`,\n `- You have read-only access plus light edit capability (can suggest fixes, run tests, check linting)`,\n ``,\n ];\n\n if (context?.isParentTask) {\n parts.push(\n `### Parent Task Review`,\n `You are reviewing and coordinating child tasks.`,\n `- Use \\`list_subtasks\\` to see current child task state and progress.`,\n `- For children in ReviewPR status: review their code quality and merge with \\`approve_and_merge_pr\\`.`,\n `- For children with failing CI: check with \\`get_task_cli(childTaskId)\\` and escalate if stuck.`,\n `- Fire next child builds with \\`start_child_cloud_build\\` when ready.`,\n `- Create follow-up tasks for issues discovered during review.`,\n ``,\n `### Coordination Workflow`,\n `1. Check child task statuses with \\`list_subtasks\\``,\n `2. Review completed children — check PRs, run tests if needed`,\n `3. Approve and merge passing PRs`,\n `4. Fire builds for children that are ready`,\n `5. Create follow-up tasks for anything out of scope`,\n );\n } else {\n parts.push(\n `### Leaf Task Review`,\n `You are reviewing your own work before completion.`,\n `- Run tests and check linting to verify the PR is ready.`,\n `- If the PR is already open, review the diff for correctness.`,\n `- You can get hands dirty — if a fix is small, make it directly.`,\n `- If follow-up work is needed, use \\`create_follow_up_task\\`.`,\n );\n }\n\n parts.push(\n ``,\n `### General Review Guidelines`,\n `- For larger issues, create a follow-up task rather than fixing directly.`,\n `- Focus on correctness, pattern consistency, and test coverage.`,\n `- Be concise in feedback — actionable specifics over general observations.`,\n `- Goal: ensure quality, provide feedback, coordinate progression.`,\n );\n\n if (process.env.CLAUDESPACE_NAME) {\n parts.push(\n ``,\n `### Resource Management`,\n `Your pod starts with minimal resources (0.25 CPU / 1 Gi). You MUST call \\`scale_up_resources\\``,\n `BEFORE running any of these operations — they WILL fail or OOM at baseline resources:`,\n `- **light** (1 CPU / 4 Gi) — bun/npm/yarn install, pip install, basic dev servers, light builds`,\n `- **standard** (2 CPU / 8 Gi) — full dev servers, test suites, typecheck, lint`,\n `- **heavy** (4 CPU / 16 Gi) — E2E/browser automation, large parallel builds`,\n `Scaling is one-way (up only) and capped by project limits.`,\n `CRITICAL: Always scale to at least \"light\" before running any package install command.`,\n );\n }\n\n return parts.join(\"\\n\");\n}\n\nfunction buildCodeReviewPrompt(): string {\n return [\n `\\n## Mode: Code Review`,\n `You are an automated code reviewer. A PR has passed all CI checks and you are performing a final code quality review before merge.`,\n ``,\n `## Review Process`,\n `1. Run \\`git diff <devBranch>..HEAD\\` to see all changes in this PR`,\n `2. Read the task plan to understand the intended changes`,\n `3. Explore the surrounding codebase to verify pattern consistency`,\n `4. Review against the criteria below`,\n ``,\n `### Review Criteria`,\n `- **Correctness**: Does the code do what the plan says? Logic errors, off-by-one, race conditions?`,\n `- **Pattern Consistency**: Does the code follow existing patterns in the codebase? Check nearby files.`,\n `- **Security**: No hardcoded secrets, no injection vulnerabilities, proper input validation at boundaries.`,\n `- **Performance**: No unnecessary loops, no N+1 queries, no blocking in async contexts.`,\n `- **Error Handling**: Appropriate error handling at system boundaries. No swallowed errors.`,\n `- **Test Coverage**: Are new code paths tested? Edge cases covered?`,\n `- **TypeScript Best Practices**: Proper typing (no unnecessary \\`any\\`), correct React patterns, proper async/await.`,\n `- **Naming & Readability**: Clear names, no misleading comments, self-documenting code.`,\n ``,\n `## Output — You MUST do exactly ONE of:`,\n ``,\n `### If code passes review:`,\n `Use the \\`approve_code_review\\` tool with a brief summary of what looks good.`,\n ``,\n `### If changes are needed:`,\n `Use the \\`request_code_changes\\` tool with specific issues:`,\n `- Reference specific files and line numbers`,\n `- Explain what's wrong and suggest fixes`,\n `- Focus on substantive issues, not style nitpicks (linting handles that)`,\n ``,\n `## Rules`,\n `- You are READ-ONLY. Do NOT modify any files.`,\n `- Do NOT re-review things CI already validates (formatting, lint rules).`,\n `- Be concise — the task agent needs actionable feedback, not essays.`,\n `- Max 5-7 issues per review. Prioritize the most important ones.`,\n ].join(\"\\n\");\n}\n","import type { RunnerMode, AgentMode, TaskContext } from \"@project/shared\";\nimport { buildPackRunnerSystemPrompt } from \"./pack-runner-prompt.js\";\nimport { buildModePrompt } from \"./mode-prompt.js\";\n\ninterface HypothesisTracker {\n isActive(): boolean;\n getDebugContext(): string | null;\n}\n\nfunction formatProjectAgentLine(pa: NonNullable<TaskContext[\"projectAgents\"]>[number]): string {\n const role = pa.role ? `role: ${pa.role}` : \"role: unassigned\";\n const sp =\n pa.storyPoints === null || pa.storyPoints === undefined\n ? \"\"\n : `, story points: ${pa.storyPoints}`;\n return `- ${pa.agent.name} (${role}${sp})`;\n}\n\nfunction buildPmPreamble(context: TaskContext): string[] {\n const parts = [\n `You are an AI project manager helping to plan tasks for the \"${context.title}\" project.`,\n `You are running locally with full access to the repository.`,\n `You can read files, search code, and run shell commands (e.g. git log, git diff) to understand the codebase. You cannot write or edit files.`,\n `\\nEnvironment (ready, no setup required):`,\n `- Repository is cloned at your current working directory.`,\n `- You can read files and run git commands to understand the codebase before writing task plans.`,\n `- Check the dev branch (e.g. run: git fetch && git checkout dev || git checkout main) to understand the current state of the codebase that agents will branch off of.`,\n `\\nWorkflow:`,\n `- You can draft and iterate on plans in .claude/plans/*.md — these files are automatically synced to the task.`,\n `- You can also use update_task directly to save the plan to the task.`,\n `- After saving the plan, end your turn with a summary reply (the team sees your responses in chat automatically). Do NOT attempt to execute the plan yourself.`,\n `- A separate task agent will handle execution after the team reviews and approves your plan.`,\n ];\n if (context.isParentTask) {\n parts.push(\n `\\nYou are the Project Manager for this set of tasks.`,\n `This task has child tasks (subtasks) that are tracked on the board.`,\n `Your role is to coordinate, plan, and manage the subtasks — not to write code directly.`,\n `Use the subtask tools (create_subtask, update_subtask, list_subtasks) to manage work breakdown.`,\n );\n }\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(`\\nStory Point Tiers:`);\n for (const sp of context.storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n }\n if (context.projectAgents && context.projectAgents.length > 0) {\n parts.push(`\\nProject Agents:`);\n for (const pa of context.projectAgents) {\n parts.push(formatProjectAgentLine(pa));\n }\n }\n if (context.projectObjectives && context.projectObjectives.length > 0) {\n parts.push(`\\nProject Objectives:`);\n for (const obj of context.projectObjectives) {\n const dates = `${obj.startDate.split(\"T\")[0]} to ${obj.endDate.split(\"T\")[0]}`;\n parts.push(`- **${obj.name}** (${dates})${obj.description ? \": \" + obj.description : \"\"}`);\n }\n }\n return parts;\n}\n\nfunction buildActivePreamble(context: TaskContext, workspaceDir: string): string[] {\n return [\n `You are an AI project manager in ACTIVE mode for the \"${context.title}\" project.`,\n `You have direct coding access to the repository at ${workspaceDir}.`,\n `You can edit files, run tests, and make commits.`,\n `You still have access to all PM tools (subtasks, update_task, chat).`,\n `\\nEnvironment (ready, no setup required):`,\n `- Repository is cloned at your current working directory.`,\n `- You can read, write, and edit files directly.`,\n `- You can run shell commands including git, build tools, and test runners.`,\n context.githubBranch ? `- You are working on branch: \\`${context.githubBranch}\\`` : \"\",\n `\\nSafety rules:`,\n `- Stay within the project directory (${workspaceDir}).`,\n `- Do NOT run \\`git push --force\\` or \\`git reset --hard\\`. Use \\`--force-with-lease\\` if needed.`,\n `- Do NOT delete \\`.env\\` files or modify \\`node_modules\\`.`,\n `- Do NOT run destructive commands like \\`rm -rf /\\`.`,\n `\\nWorkflow:`,\n `- You can make code changes, fix bugs, run tests, and commit directly.`,\n `- When done with changes, summarize what you did in your reply.`,\n `- If you toggled into active mode temporarily, mention when you're done so the team can switch you back to planning mode.`,\n ].filter(Boolean);\n}\n\nfunction buildTaskAgentPreamble(context: TaskContext): string[] {\n return [\n `You are an AI agent working on a task for the \"${context.title}\" project.`,\n `You are running inside a GitHub Codespace with full access to the repository.`,\n `\\nEnvironment (fully ready — do NOT verify or set up):`,\n `- Repository is cloned at your current working directory.`,\n `- Branch \\`${context.githubBranch}\\` is already checked out.`,\n `- All dependencies are installed, database is migrated, and the dev server is running.`,\n `- Git is configured. Commit and push directly to this branch.`,\n `\\nIMPORTANT — Skip all environment verification. Do NOT run any of the following:`,\n `- bun/npm install, pip install, or any dependency installation`,\n `- bun build, bun lint, bun test, bun typecheck, or any build/check commands as a \"first step\"`,\n `- bun db:generate, bun db:push, prisma migrate, or any database setup`,\n `- bun dev, npm start, or any dev server startup commands`,\n `- pwd, ls, echo, or exploratory shell commands to \"check\" the environment`,\n `Only run these if you encounter a specific error that requires it.`,\n `Start reading the task plan and writing code immediately.`,\n `\\nGit safety — STRICT rules:`,\n `- NEVER run \\`git checkout main\\`, \\`git checkout dev\\`, or switch to any branch other than \\`${context.githubBranch}\\`.`,\n `- NEVER create new branches (no \\`git checkout -b\\`, \\`git switch -c\\`, etc.).`,\n `- This branch was created from \\`${context.baseBranch}\\`. PRs will automatically target that branch.`,\n `- If \\`git push\\` fails with \"non-fast-forward\", run \\`git push --force-with-lease origin ${context.githubBranch}\\`. This branch is exclusively yours — force-with-lease is safe.`,\n ];\n}\n\nfunction buildDebugModeSection(hypothesisTracker?: HypothesisTracker): string {\n const lines = [\n `\\n## Debug Mode`,\n `You have access to debug tools that let you set breakpoints, inspect live state,`,\n `and capture client-side behavior. Use these when:`,\n `- You can't find the bug from code reading alone`,\n `- The bug is state-dependent or timing-dependent`,\n `- You need to verify a hypothesis about runtime behavior`,\n ``,\n `Debugging workflow:`,\n `1. Form a hypothesis about the root cause`,\n `2. Identify 2-5 strategic locations to observe (don't over-instrument)`,\n `3. Set breakpoints or probes at those locations`,\n `4. Ask the user to reproduce on the preview link`,\n `5. Analyze the captured data — confirm or refute your hypothesis`,\n `6. If refuted, refine hypothesis and repeat (max 3 iterations)`,\n `7. Exit debug mode and implement the fix`,\n ``,\n `Keep debug sessions focused. You don't need to see everything —`,\n `just the data that tests your hypothesis.`,\n ];\n\n if (hypothesisTracker?.isActive()) {\n const debugContext = hypothesisTracker.getDebugContext();\n if (debugContext) {\n lines.push(``, debugContext);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function buildSystemPrompt(\n mode: RunnerMode | undefined,\n context: TaskContext,\n config: { instructions: string; workspaceDir: string; isAuto?: boolean },\n setupLog: string[],\n agentMode?: AgentMode | null,\n options?: { hasDebugTools?: boolean; hypothesisTracker?: HypothesisTracker },\n): string {\n const isPm = mode === \"pm\";\n const isPmActive = isPm && agentMode === \"building\";\n const isPackRunner = isPm && !!config.isAuto && !!context.isParentTask;\n\n if (isPackRunner) {\n return buildPackRunnerSystemPrompt(context, config, setupLog);\n }\n\n const parts = isPmActive\n ? buildActivePreamble(context, config.workspaceDir)\n : isPm\n ? buildPmPreamble(context)\n : buildTaskAgentPreamble(context);\n\n if (setupLog.length > 0) {\n parts.push(\n `\\nEnvironment setup log (already executed before you started — proof that setup succeeded):`,\n \"```\",\n ...setupLog,\n \"```\",\n );\n }\n\n if (context.agentInstructions) {\n parts.push(`\\nAgent Instructions:\\n${context.agentInstructions}`);\n }\n if (config.instructions) {\n parts.push(`\\nAdditional Instructions:\\n${config.instructions}`);\n }\n parts.push(\n `\\nYour responses are sent directly to the task chat — the team sees everything you say.`,\n `Do NOT call the post_to_chat tool for your own task; your replies already appear in chat automatically.`,\n `Only use post_to_chat if you need to message a different task's chat (e.g. a parent task via get_task).`,\n `Use read_task_chat only if you need to re-read earlier messages beyond the chat context above.`,\n );\n if (!isPm || isPmActive) {\n parts.push(\n `Use the mcp__conveyor__create_pull_request tool to open PRs — it automatically stages, commits, and pushes changes before creating the PR. Do NOT use gh CLI or shell commands for PR creation.`,\n );\n }\n\n if (options?.hasDebugTools) {\n parts.push(buildDebugModeSection(options.hypothesisTracker));\n }\n\n const modePrompt = buildModePrompt(agentMode, context);\n if (modePrompt) {\n parts.push(modePrompt);\n }\n\n return parts.join(\"\\n\");\n}\n","import type { RunnerMode, AgentMode, TaskContext, ChatMessage } from \"@project/shared\";\nimport { buildPackRunnerInstructions } from \"./pack-runner-prompt.js\";\nimport { resolveTagContext } from \"./tag-context-resolver.js\";\n\nexport { buildSystemPrompt } from \"./system-prompt.js\";\n\nconst CHAT_HISTORY_LIMIT = 40;\n\nfunction formatFileSize(bytes: number | undefined): string {\n if (bytes === undefined) return \"\";\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction findLastAgentMessageIndex(history: ChatMessage[]): number {\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction detectRelaunchScenario(\n context: TaskContext,\n trustChatHistory = false,\n): \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\" {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n if (lastAgentIdx === -1) return \"fresh\";\n\n // For PM/Pack Runner agents, chat history with assistant messages is a reliable\n // indicator of prior work (only PMs post as assistant to their own chat during planning).\n // For task agents, only claudeSessionId and githubPRUrl are reliable — assistant\n // messages in chat may be from a prior PM agent, not from a prior task agent run.\n const hasPriorWork = !!context.githubPRUrl || !!context.claudeSessionId || trustChatHistory;\n if (!hasPriorWork) return \"fresh\";\n\n const messagesAfterAgent = context.chatHistory.slice(lastAgentIdx + 1);\n const hasNewUserMessages = messagesAfterAgent.some((m) => m.role === \"user\");\n return hasNewUserMessages ? \"feedback_relaunch\" : \"idle_relaunch\";\n}\n\nfunction buildPmRelaunchParts(\n context: TaskContext,\n lastAgentIdx: number,\n isAuto?: boolean,\n): string[] {\n const parts: string[] = [];\n const newMessages = context.chatHistory.slice(lastAgentIdx + 1).filter((m) => m.role === \"user\");\n if (newMessages.length > 0) {\n parts.push(\n `You have been relaunched. Here are new messages since your last session:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n );\n } else {\n parts.push(`You have been relaunched. No new messages since your last session.`);\n }\n if (isAuto) {\n if (context.plan?.trim()) {\n parts.push(\n `\\nYou are in auto mode. A plan already exists for this task.`,\n `Verify that story points, title, and tags are set via get_task_plan, then call ExitPlanMode immediately to transition to building.`,\n `Do NOT wait for team input — proceed autonomously.`,\n );\n } else {\n parts.push(\n `\\nYou are in auto mode. Continue planning autonomously.`,\n `When the plan and all required properties are set, call ExitPlanMode to transition to building.`,\n `Do NOT wait for team input — proceed autonomously.`,\n );\n }\n } else {\n parts.push(\n `\\nYou are the project manager for this task.`,\n `Review the context above and wait for the team to provide instructions before taking action.`,\n );\n }\n return parts;\n}\n\nfunction buildRelaunchWithSession(\n mode: RunnerMode | undefined,\n context: TaskContext,\n agentMode?: AgentMode | null,\n isAuto?: boolean,\n): string | null {\n const scenario = detectRelaunchScenario(context);\n if (!context.claudeSessionId || scenario === \"fresh\") return null;\n\n const parts: string[] = [];\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n\n if (mode === \"pm\") {\n parts.push(...buildPmRelaunchParts(context, lastAgentIdx, isAuto));\n } else if (scenario === \"feedback_relaunch\") {\n const newMessages = context.chatHistory\n .slice(lastAgentIdx + 1)\n .filter((m) => m.role === \"user\");\n parts.push(\n `You have been relaunched with new feedback.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAddress the requested changes. Do NOT re-investigate the codebase from scratch or write a new plan — review the feedback and implement the changes directly.`,\n `Commit and push your updates.`,\n );\n if (context.githubPRUrl) {\n parts.push(\n `An existing PR is open at ${context.githubPRUrl} — push to the same branch. Do NOT create a new PR.`,\n );\n } else {\n parts.push(\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI.`,\n );\n }\n } else {\n parts.push(\n `You were relaunched but no new instructions have been given since your last run.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Run \\`git log --oneline -10\\` to review what you already committed.`,\n `Review the current state of the codebase and verify everything is working correctly.`,\n );\n if (agentMode === \"auto\" || (agentMode === \"building\" && isAuto)) {\n parts.push(\n `If work is incomplete, continue implementing the plan. When finished, commit, push, and use mcp__conveyor__create_pull_request to open a PR.`,\n `Do NOT go idle or wait for instructions — you are in auto mode.`,\n );\n } else {\n parts.push(\n `Reply with a brief status update (visible in chat), then wait for further instructions.`,\n );\n }\n if (context.githubPRUrl) {\n parts.push(`An existing PR is open at ${context.githubPRUrl}. Do not create a new PR.`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\ninterface FileAttachment {\n fileName: string;\n mimeType: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n downloadUrl?: string;\n fileId?: string;\n}\n\nfunction formatChatFile(file: FileAttachment): string[] {\n const sizeStr = file.fileSize ? `, ${formatFileSize(file.fileSize)}` : \"\";\n if (file.content && file.contentEncoding === \"utf-8\") {\n return [\n `[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]`,\n \"```\",\n file.content,\n \"```\",\n ];\n }\n if (!file.content) {\n return [`[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]: ${file.downloadUrl}`];\n }\n if (file.content && file.contentEncoding === \"base64\") {\n return [\n `[Attached image: ${file.fileName} (${file.mimeType}${sizeStr}) — use get_task_file(\"${file.fileId}\") to view]`,\n ];\n }\n return [`[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]`];\n}\n\nfunction formatTaskFile(file: FileAttachment): string[] {\n if (file.content && file.contentEncoding === \"utf-8\") {\n return [`\\n### ${file.fileName} (${file.mimeType})`, \"```\", file.content, \"```\"];\n }\n if (file.content && file.contentEncoding === \"base64\") {\n const size = formatFileSize(file.fileSize);\n return [\n `- [Attached image: ${file.fileName} (${file.mimeType}${size ? `, ${size}` : \"\"}) — use get_task_file(\"${file.fileId}\") to view]`,\n ];\n }\n if (!file.content) {\n return [`- **${file.fileName}** (${file.mimeType}): ${file.downloadUrl}`];\n }\n return [];\n}\n\nfunction formatChatHistory(chatHistory: TaskContext[\"chatHistory\"]): string[] {\n const relevant = chatHistory.slice(-CHAT_HISTORY_LIMIT);\n const parts = [`\\n## Recent Chat Context`];\n for (const msg of relevant) {\n const sender = msg.userName ?? msg.role;\n parts.push(`[${sender}]: ${msg.content}`);\n if (msg.files?.length) {\n for (const file of msg.files) {\n parts.push(...formatChatFile(file));\n }\n }\n }\n return parts;\n}\n\nasync function resolveTaskTagContext(context: TaskContext): Promise<string | null> {\n if (!context.projectTags?.length || !context.taskTagIds?.length) return null;\n const { injectedSection } = await resolveTagContext(\n context.projectTags,\n context.taskTagIds,\n context.model,\n context.agentSettings?.betas,\n );\n return injectedSection || null;\n}\n\nasync function buildTaskBody(context: TaskContext): Promise<string[]> {\n const parts: string[] = [];\n parts.push(`# Task: ${context.title}`);\n if (context.projectName) {\n const descLine = context.projectDescription ? `\\n${context.projectDescription}` : \"\";\n parts.push(`\\n## Project: ${context.projectName}${descLine}`);\n }\n if (context.description) {\n parts.push(`\\n## Description\\n${context.description}`);\n }\n if (context.plan) {\n parts.push(`\\n## Plan\\n${context.plan}`);\n }\n\n if (context.files && context.files.length > 0) {\n parts.push(`\\n## Attached Files`);\n for (const file of context.files) {\n parts.push(...formatTaskFile(file));\n }\n }\n\n if (context.repoRefs && context.repoRefs.length > 0) {\n parts.push(`\\n## Repository References`);\n for (const ref of context.repoRefs) {\n const icon = ref.refType === \"folder\" ? \"folder\" : \"file\";\n parts.push(`- [${icon}] \\`${ref.path}\\``);\n }\n }\n\n const tagSection = await resolveTaskTagContext(context);\n if (tagSection) parts.push(tagSection);\n\n if (context.chatHistory.length > 0) {\n parts.push(...formatChatHistory(context.chatHistory));\n }\n\n return parts;\n}\n\nfunction buildCodeReviewInstructions(context: TaskContext): string[] {\n const parts = [\n `You are performing an automated code review for this task.`,\n `The PR branch is \"${context.githubBranch}\"${context.baseBranch ? ` based on \"${context.baseBranch}\"` : \"\"}.`,\n `Begin your code review by running \\`git diff ${context.baseBranch ?? \"dev\"}..HEAD\\` to see all changes.`,\n ``,\n `CRITICAL: You are in Code Review mode. You are READ-ONLY — do NOT modify any files.`,\n `After reviewing, you MUST call exactly one of: \\`approve_code_review\\` or \\`request_code_changes\\`.`,\n `Do NOT go idle, ask for confirmation, or wait for instructions — complete the review and exit.`,\n ];\n return parts;\n}\n\nfunction buildFreshInstructions(\n isPm: boolean,\n isAutoMode: boolean,\n context: TaskContext,\n agentMode?: AgentMode | null,\n): string[] {\n // After auto→building transition, agent needs building instructions\n // PM→building only happens through auto mode, so always include anti-idle guidance\n if (isPm && agentMode === \"building\") {\n return [\n `Your plan has been approved. Begin implementing it now.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Start by reading the relevant source files mentioned in the plan, then write code.`,\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI.`,\n `\\nCRITICAL: You are in Auto mode. Do NOT report status, ask for confirmation, or go idle without making code changes.`,\n `Your FIRST action must be reading source files from the plan, then immediately writing code.`,\n `Do NOT summarize the plan or say \"ready to implement\" — start implementing.`,\n `When all changes are ready, use mcp__conveyor__create_pull_request to open a PR.`,\n `If you are genuinely blocked, explain the specific blocker — do not go idle silently.`,\n ];\n }\n if (isAutoMode && isPm) {\n if (context.plan?.trim()) {\n return [\n `You are operating autonomously. A plan already exists for this task.`,\n `Verify that story points, title, and tags are set, then call ExitPlanMode immediately to transition to building.`,\n `Do NOT re-plan or wait for team input — proceed autonomously.`,\n ];\n }\n return [\n `You are operating autonomously. Begin planning immediately.`,\n `1. Explore the codebase to understand the architecture and relevant files`,\n `2. Draft a clear implementation plan and save it with update_task`,\n `3. Set story points, tags, and title (update_task_properties)`,\n `4. When the plan and all required properties are set, call ExitPlanMode to transition to building`,\n `Do NOT wait for team input — proceed autonomously.`,\n ];\n }\n if (isPm && context.isParentTask) {\n return [\n `You are the project manager for this task and its subtasks.`,\n `Review existing subtasks via \\`list_subtasks\\` and the chat history before taking action.`,\n `Read the task description and chat history carefully — the team may have already provided context and requirements. Respond to what's been discussed rather than starting from scratch.`,\n `The task details are provided above. Wait for the team to provide instructions before taking action.`,\n `When you finish planning, save the plan with update_task and end your turn. Your reply will be visible to the team in chat.`,\n ];\n }\n if (isPm) {\n return [\n `You are the project manager for this task.`,\n `Read the task description and chat history carefully — the team may have already provided context and requirements. Respond to what's been discussed rather than starting from scratch.`,\n `The task details are provided above. Wait for the team to ask questions or provide additional requirements before starting to plan.`,\n `When you finish planning, save the plan with update_task and end your turn. Your reply summarizing the plan will be visible in chat. A separate task agent will execute the plan after review.`,\n ];\n }\n const parts = [\n `Begin executing the task plan above immediately.`,\n `Your FIRST action should be reading the relevant source files mentioned in the plan, then writing code. Do NOT run install, build, lint, test, or dev server commands first — the environment is already set up.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch for the entire task. Do not checkout or create other branches.`,\n `Your replies are visible to the team in chat — briefly describe what you're doing when you begin meaningful implementation, and again when the PR is ready.`,\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI or any other method to create PRs.`,\n ];\n if (isAutoMode) {\n parts.push(\n `\\nCRITICAL: You are in Auto mode. Do NOT report status, ask for confirmation, or go idle without making code changes.`,\n `Do NOT summarize the plan or say \"ready to implement\" — start implementing immediately.`,\n `When all changes are ready, you MUST use mcp__conveyor__create_pull_request to open a PR before finishing.`,\n `If you are genuinely blocked, explain the specific blocker — do not go idle silently.`,\n );\n }\n return parts;\n}\n\nfunction buildFeedbackInstructions(context: TaskContext, isPm: boolean): string[] {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n const newMessages = context.chatHistory.slice(lastAgentIdx + 1).filter((m) => m.role === \"user\");\n if (isPm) {\n return [\n `You were relaunched with new feedback since your last run.`,\n `You are the project manager for this task.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nReview these messages and wait for the team to provide instructions before taking action.`,\n ];\n }\n const parts = [\n `You have been relaunched to address feedback on your previous work.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Start by running \\`git log --oneline -10\\` and \\`git diff HEAD~3 HEAD --stat\\` to review what you already committed.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAddress the requested changes directly. Do NOT re-investigate the codebase from scratch or write a new plan — go straight to implementing the feedback.`,\n `Implement your updates and open a PR when finished.`,\n ];\n if (context.githubPRUrl) {\n parts.push(\n `An existing PR is open at ${context.githubPRUrl} — push to the same branch to update it. Do NOT create a new PR.`,\n );\n } else {\n parts.push(\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI or any other method to create PRs.`,\n );\n }\n return parts;\n}\n\nfunction buildIdleRelaunchInstructions(\n context: TaskContext,\n isPm: boolean,\n agentMode?: AgentMode | null,\n isAuto?: boolean,\n): string[] {\n if (isPm && agentMode === \"auto\" && context.status === \"Planning\") {\n if (context.plan?.trim()) {\n return [\n `You were relaunched in auto mode. A plan already exists for this task.`,\n `Verify that story points, title, and tags are set, then call ExitPlanMode immediately to transition to building.`,\n `Do NOT wait for instructions or go idle — you are in auto mode.`,\n ];\n }\n return [\n `You were relaunched in auto mode. Continue planning autonomously.`,\n `When the plan and all required properties are set, call ExitPlanMode to transition to building.`,\n `Do NOT wait for instructions or go idle — you are in auto mode.`,\n ];\n }\n\n if (isPm && !(agentMode === \"building\" || agentMode === \"review\" || agentMode === \"auto\")) {\n return [\n `You were relaunched but no new instructions have been given since your last run.`,\n `You are the project manager for this task.`,\n `Wait for the team to provide instructions before taking action.`,\n ];\n }\n\n // Task agent or PM in building/review/auto mode\n const isAutoMode = agentMode === \"auto\" || (agentMode === \"building\" && isAuto);\n const parts = [\n `You were relaunched but no new instructions have been given since your last run.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Run \\`git log --oneline -10\\` to review what you already committed, then verify the current state is correct.`,\n ];\n if (isAutoMode) {\n parts.push(\n `If work is incomplete, continue implementing the plan. When finished, use mcp__conveyor__create_pull_request to open a PR.`,\n `Do NOT go idle or wait for instructions — you are in auto mode.`,\n );\n } else {\n parts.push(\n `Reply with a brief status update summarizing where things stand (visible in chat).`,\n `Then wait for further instructions — do NOT redo work that was already completed.`,\n );\n }\n if (context.githubPRUrl) {\n parts.push(`An existing PR is open at ${context.githubPRUrl}. Do not create a new PR.`);\n }\n return parts;\n}\n\nfunction buildInstructions(\n mode: RunnerMode | undefined,\n context: TaskContext,\n scenario: \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\",\n agentMode?: AgentMode | null,\n isAuto?: boolean,\n): string[] {\n const parts: string[] = [`\\n## Instructions`];\n\n if (agentMode === \"code-review\") {\n parts.push(...buildCodeReviewInstructions(context));\n return parts;\n }\n\n const isPm = mode === \"pm\";\n\n if (scenario === \"fresh\") {\n parts.push(...buildFreshInstructions(isPm, agentMode === \"auto\", context, agentMode));\n return parts;\n }\n\n if (scenario === \"idle_relaunch\") {\n parts.push(...buildIdleRelaunchInstructions(context, isPm, agentMode, isAuto));\n return parts;\n }\n\n parts.push(...buildFeedbackInstructions(context, isPm));\n return parts;\n}\n\nexport async function buildInitialPrompt(\n mode: RunnerMode | undefined,\n context: TaskContext,\n isAuto?: boolean,\n agentMode?: AgentMode | null,\n): Promise<string> {\n const isPackRunner = mode === \"pm\" && !!isAuto && !!context.isParentTask;\n\n // Code-review is always a fresh one-shot run — skip session relaunch detection\n if (!isPackRunner && agentMode !== \"code-review\") {\n const sessionRelaunch = buildRelaunchWithSession(mode, context, agentMode, isAuto);\n if (sessionRelaunch) return sessionRelaunch;\n }\n\n const isPm = mode === \"pm\";\n let scenario = detectRelaunchScenario(context, isPm);\n\n // After auto-mode transition from planning to building, planning-phase chat\n // history causes \"idle_relaunch\" even though no building work has started.\n // Override to \"fresh\" so the agent gets \"begin implementing\" instructions.\n if (\n isPm &&\n agentMode === \"building\" &&\n isAuto &&\n !context.claudeSessionId &&\n !context.githubPRUrl &&\n scenario === \"idle_relaunch\"\n ) {\n scenario = \"fresh\";\n }\n const body = await buildTaskBody(context);\n const instructions = isPackRunner\n ? buildPackRunnerInstructions(context, scenario)\n : buildInstructions(mode, context, scenario, agentMode, isAuto);\n return [...body, ...instructions].join(\"\\n\");\n}\n","// oxlint-disable max-lines\nimport { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport type { AgentRunnerConfig } from \"../types.js\";\nimport { textResult, imageBlock, isImageMimeType } from \"./helpers.js\";\nimport {\n hasUncommittedChanges,\n stageAndCommit,\n hasUnpushedCommits,\n pushToOrigin,\n} from \"../runner/git-utils.js\";\n\ntype ContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\n// ── Event formatting for CLI logs ─────────────────────────────────────\n\ntype EventRecord = Record<string, unknown>;\n\nconst cliEventFormatters: Record<string, (e: EventRecord) => string> = {\n thinking: (e) => (e.message as string) ?? \"\",\n tool_use: (e) => `${e.tool}: ${(e.input as string)?.slice(0, 1000) ?? \"\"}`,\n tool_result: (e) =>\n `${e.tool} → ${(e.output as string)?.slice(0, 500) ?? \"\"}${e.isError ? \" [ERROR]\" : \"\"}`,\n message: (e) => (e.content as string) ?? \"\",\n error: (e) => `ERROR: ${(e.message as string) ?? \"\"}`,\n completed: (e) =>\n `Completed: ${(e.summary as string) ?? \"\"} (cost: $${e.costUsd ?? \"?\"}, duration: ${e.durationMs ?? \"?\"}ms)`,\n setup_output: (e) => `[${(e.stream as string) ?? \"stdout\"}] ${(e.data as string) ?? \"\"}`,\n start_command_output: (e) => `[${(e.stream as string) ?? \"stdout\"}] ${(e.data as string) ?? \"\"}`,\n turn_end: (e) => `Turn complete (${(e.toolCalls as unknown[])?.length ?? 0} tool calls)`,\n};\n\nfunction formatCliEvent(e: EventRecord): string {\n const formatter = cliEventFormatters[e.type as string];\n return formatter ? formatter(e) : JSON.stringify(e);\n}\n\n// ── Read-only tools ───────────────────────────────────────────────────\n\nfunction buildReadTaskChatTool(connection: AgentConnection) {\n return defineTool(\n \"read_task_chat\",\n \"Read recent messages from a task chat. Omit task_id to read the current task's chat, or provide a child task ID to read a child's chat.\",\n {\n limit: z.number().optional().describe(\"Number of recent messages to fetch (default 20)\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to read chat from. Omit to read the current task's chat.\"),\n },\n async ({ limit, task_id }) => {\n try {\n const messages = await connection.call(\"getChatMessages\", {\n sessionId: connection.sessionId,\n limit,\n taskId: task_id,\n });\n return textResult(JSON.stringify(messages, null, 2));\n } catch {\n return textResult(\n JSON.stringify({\n note: \"Could not fetch live chat. Chat history was provided in the initial context.\",\n }),\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskPlanTool(connection: AgentConnection) {\n return defineTool(\n \"get_task_plan\",\n \"Re-read the latest task plan in case it was updated\",\n {},\n async () => {\n try {\n const ctx = await connection.call(\"getTaskContext\", {\n sessionId: connection.sessionId,\n });\n return textResult(ctx.plan ?? \"No plan available.\");\n } catch {\n return textResult(\"Could not fetch updated plan.\");\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskTool(connection: AgentConnection) {\n return defineTool(\n \"get_task\",\n \"Look up a task by slug or ID to get its title, description, plan, and status\",\n {\n slug_or_id: z.string().describe(\"The task slug (e.g. 'my-task') or CUID\"),\n },\n async ({ slug_or_id }) => {\n try {\n const task = await connection.call(\"getTask\", {\n sessionId: connection.sessionId,\n taskSlugOrId: slug_or_id,\n });\n return textResult(JSON.stringify(task, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskCliTool(connection: AgentConnection) {\n return defineTool(\n \"get_task_cli\",\n \"Read CLI execution logs from a task. Returns agent reasoning, tool calls, setup output, and other execution events. Use 'source' to filter: 'agent' for agent reasoning/tool calls only, 'application' for setup/dev-server output only.\",\n {\n task_id: z\n .string()\n .optional()\n .describe(\"Task ID or slug. Omit to read logs from the current task.\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\"Filter by log source. Omit for all logs.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max number of log entries to return (default 50, max 500).\"),\n },\n async ({ task_id, source, limit }) => {\n try {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const result = await connection.call(\"getCliHistory\", {\n sessionId: connection.sessionId,\n limit: effectiveLimit,\n taskId: task_id,\n source,\n });\n const formatted = (result as Array<Record<string, unknown>>)\n .map((entry) => {\n const type = entry.type as string;\n const time = entry.timestamp as string;\n return `[${time}] [${type}] ${formatCliEvent(entry as EventRecord)}`;\n })\n .join(\"\\n\");\n return textResult(formatted || \"No CLI logs found.\");\n } catch (error) {\n return textResult(\n `Failed to fetch CLI logs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildListTaskFilesTool(connection: AgentConnection) {\n return defineTool(\n \"list_task_files\",\n \"List all files attached to this task with metadata (name, type, size) and download URLs\",\n {},\n async () => {\n try {\n const files = await connection.call(\"getTaskFiles\", {\n sessionId: connection.sessionId,\n });\n const metadata = files.map((file) => {\n const { content: _c, ...rest } = file;\n return rest;\n });\n const content: ContentBlock[] = [\n { type: \"text\" as const, text: JSON.stringify(metadata, null, 2) },\n ];\n for (const file of files) {\n if (file.content && file.contentEncoding === \"base64\" && isImageMimeType(file.mimeType)) {\n content.push(imageBlock(file.content, file.mimeType));\n }\n }\n return { content };\n } catch {\n return textResult(\"Failed to list task files.\");\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskFileTool(connection: AgentConnection) {\n return defineTool(\n \"get_task_file\",\n \"Get a specific task file's content and download URL by file ID\",\n { fileId: z.string().describe(\"The file ID to retrieve\") },\n async ({ fileId }) => {\n try {\n const file = await connection.call(\"getTaskFile\", {\n sessionId: connection.sessionId,\n fileId,\n });\n const { content: rawContent, ...metadata } = file;\n const content: ContentBlock[] = [\n { type: \"text\" as const, text: JSON.stringify(metadata, null, 2) },\n ];\n if (rawContent && file.contentEncoding === \"base64\" && isImageMimeType(file.mimeType)) {\n content.push(imageBlock(rawContent, file.mimeType));\n } else if (rawContent) {\n content[0] = { type: \"text\" as const, text: JSON.stringify(file, null, 2) };\n }\n return { content };\n } catch (error) {\n return textResult(\n `Failed to get task file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildSearchIncidentsTool(connection: AgentConnection) {\n return defineTool(\n \"search_incidents\",\n \"Search incidents in the current project. Optionally filter by status (Open, Acknowledged, Investigating, Resolved, Closed) or source.\",\n {\n status: z.string().optional().describe(\"Filter by incident status\"),\n source: z\n .string()\n .optional()\n .describe(\"Filter by source (e.g., 'conveyor', 'agent', 'build')\"),\n },\n async ({ status, source }) => {\n try {\n const incidents = await connection.call(\"searchIncidents\", {\n sessionId: connection.sessionId,\n status,\n source,\n });\n return textResult(JSON.stringify(incidents, null, 2));\n } catch (error) {\n return textResult(\n `Failed to search incidents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskIncidentsTool(connection: AgentConnection) {\n return defineTool(\n \"get_task_incidents\",\n \"Get all incidents linked to the current task (or a specified task). Returns full incident details including title, description, severity, status, and source.\",\n {\n task_id: z.string().optional().describe(\"Task ID (defaults to current task)\"),\n },\n async ({ task_id }) => {\n try {\n const incidents = await connection.call(\"getTaskIncidents\", {\n sessionId: connection.sessionId,\n taskId: task_id,\n });\n return textResult(JSON.stringify(incidents, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get task incidents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildQueryGcpLogsTool(connection: AgentConnection) {\n return defineTool(\n \"query_gcp_logs\",\n \"Query GCP Cloud Logging for the current project. Returns log entries matching the given filters. Use severity to filter by minimum log level. The project's GCP credentials are used automatically.\",\n {\n filter: z\n .string()\n .optional()\n .describe(\n \"Cloud Logging filter expression (e.g., 'resource.type=\\\"gce_instance\\\"'). Max 1000 chars.\",\n ),\n start_time: z\n .string()\n .optional()\n .describe(\"Start time in ISO 8601 format (e.g., '2024-01-01T00:00:00Z')\"),\n end_time: z\n .string()\n .optional()\n .describe(\"End time in ISO 8601 format (e.g., '2024-01-02T00:00:00Z')\"),\n severity: z\n .enum([\n \"DEFAULT\",\n \"DEBUG\",\n \"INFO\",\n \"NOTICE\",\n \"WARNING\",\n \"ERROR\",\n \"CRITICAL\",\n \"ALERT\",\n \"EMERGENCY\",\n ])\n .optional()\n .describe(\"Minimum severity level to filter by (default: all levels)\"),\n page_size: z\n .number()\n .optional()\n .describe(\"Number of log entries to return (default 100, max 500)\"),\n },\n async ({ filter, start_time, end_time, severity, page_size }) => {\n try {\n const result = await connection.call(\"queryGcpLogs\", {\n sessionId: connection.sessionId,\n filter,\n startTime: start_time,\n endTime: end_time,\n severity,\n pageSize: page_size,\n });\n if (result.entries.length === 0) {\n return textResult(\"No log entries found matching the given filters.\");\n }\n const summary = `Found ${result.entries.length} log entries${result.hasMore ? \" (more available — refine filters or increase page_size)\" : \"\"}.`;\n const formatted = result.entries\n .map((e) => `[${e.timestamp}] [${e.severity}] ${e.message}`)\n .join(\"\\n\");\n return textResult(`${summary}\\n\\n${formatted}`);\n } catch (error) {\n return textResult(\n `Failed to query GCP logs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetDependenciesTool(connection: AgentConnection) {\n return defineTool(\n \"get_dependencies\",\n \"Get this task's dependencies and their current status (met = merged to dev)\",\n {},\n async () => {\n try {\n const deps = await connection.call(\"getDependencies\", {\n sessionId: connection.sessionId,\n });\n return textResult(JSON.stringify(deps, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get dependencies: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetSuggestionsTool(connection: AgentConnection) {\n return defineTool(\n \"get_suggestions\",\n \"List project suggestions sorted by vote score. Use this to see what the team thinks is important.\",\n {\n status: z\n .string()\n .optional()\n .describe(\"Filter by status: Open, Accepted, Rejected, Implemented\"),\n limit: z.number().optional().describe(\"Max results (default 20)\"),\n },\n async ({ status: _status, limit: _limit }) => {\n try {\n const suggestions = await connection.call(\"getSuggestions\", {\n sessionId: connection.sessionId,\n });\n if (suggestions.length === 0) {\n return textResult(\"No suggestions found.\");\n }\n return textResult(JSON.stringify(suggestions, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get suggestions: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\n// ── Write tools ───────────────────────────────────────────────────────\n\nfunction buildPostToChatTool(connection: AgentConnection) {\n return defineTool(\n \"post_to_chat\",\n \"Post a message to a task chat. Your normal replies already appear in chat — only use this for explicit out-of-band updates or posting to a child task's chat.\",\n {\n message: z.string().describe(\"The message to post to the team\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to post to. Omit to post to the current task's chat.\"),\n },\n async ({ message, task_id }) => {\n try {\n if (task_id) {\n await connection.call(\"postChildChatMessage\", {\n sessionId: connection.sessionId,\n childTaskId: task_id,\n message,\n });\n return textResult(`Message posted to child task ${task_id} chat.`);\n }\n await connection.call(\"postToChat\", { message });\n return textResult(\"Message posted to task chat.\");\n } catch (error) {\n return textResult(\n `Failed to post message: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildForceUpdateTaskStatusTool(connection: AgentConnection) {\n return defineTool(\n \"force_update_task_status\",\n \"EMERGENCY ONLY: Force-override a task's Kanban status. Status transitions happen automatically (building sets InProgress, PR creation sets ReviewPR, merge sets ReviewDev). Only use this if an automatic transition failed or a task is stuck in the wrong status. Omit task_id to update the current task, or provide a child task ID.\",\n {\n status: z\n .enum([\"InProgress\", \"ReviewPR\", \"ReviewDev\", \"Complete\"])\n .describe(\"The new status for the task\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to update. Omit to update the current task.\"),\n },\n async ({ status, task_id }) => {\n try {\n if (task_id) {\n await connection.call(\"updateChildStatus\", {\n sessionId: connection.sessionId,\n childTaskId: task_id,\n status,\n });\n return textResult(`Child task ${task_id} status updated to ${status}.`);\n }\n await connection.call(\"updateTaskStatus\", {\n sessionId: connection.sessionId,\n status,\n force: true,\n });\n return textResult(`Task status updated to ${status}.`);\n } catch (error) {\n return textResult(\n `Failed to update status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\n// oxlint-disable-next-line max-lines-per-function -- PR creation involves git staging, committing, pushing, and API call\nfunction buildCreatePullRequestTool(connection: AgentConnection, config: AgentRunnerConfig) {\n return defineTool(\n \"create_pull_request\",\n \"Create a GitHub pull request for this task. Automatically stages uncommitted changes, commits them, and pushes before creating the PR. Use this instead of gh CLI or git commands to create PRs.\",\n {\n title: z.string().describe(\"The PR title\"),\n body: z.string().describe(\"The PR description/body in markdown\"),\n branch: z\n .string()\n .optional()\n .describe(\n \"The head branch name for the PR. If the task doesn't have a branch set, this will be used. Defaults to the task's existing branch.\",\n ),\n baseBranch: z\n .string()\n .optional()\n .describe(\n \"The base branch to target for the PR (e.g. 'main', 'develop'). Defaults to the project's configured dev branch.\",\n ),\n commitMessage: z\n .string()\n .optional()\n .describe(\n \"Commit message for staging uncommitted changes. If not provided, a default message based on the PR title will be used.\",\n ),\n },\n async ({ title, body, branch, baseBranch, commitMessage }) => {\n try {\n const cwd = config.workspaceDir;\n\n if (hasUncommittedChanges(cwd)) {\n const message =\n commitMessage || `${title}\\n\\nCo-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>`;\n const commitHash = stageAndCommit(cwd, message);\n if (commitHash) {\n connection.sendEvent({\n type: \"message\",\n content: `Auto-committed changes: ${commitHash.slice(0, 7)}`,\n });\n } else {\n return textResult(\n \"Failed to stage and commit changes. Please check git status and commit manually before creating PR.\",\n );\n }\n }\n\n if (hasUnpushedCommits(cwd)) {\n const pushSuccess = await pushToOrigin(cwd, async () => {\n try {\n const result = await connection.call(\"refreshGithubToken\", {\n sessionId: connection.sessionId,\n });\n return result.token;\n } catch {\n return undefined;\n }\n });\n if (pushSuccess) {\n connection.sendEvent({\n type: \"message\",\n content: \"Auto-pushed committed changes to origin\",\n });\n } else {\n return textResult(\n \"Failed to push changes to origin. Please check git status and push manually before creating PR.\",\n );\n }\n }\n\n const result = await connection.call(\"createPullRequest\", {\n sessionId: connection.sessionId,\n title,\n body,\n head: branch,\n base: baseBranch,\n });\n connection.sendEvent({\n type: \"pr_created\",\n url: result.prUrl,\n number: result.prNumber,\n });\n return textResult(`Pull request #${result.prNumber} created: ${result.prUrl}`);\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Unknown error\";\n return textResult(\n `Failed to create pull request: ${msg}\\n\\nTroubleshooting:\\n- Ensure all changes are committed and pushed to the remote branch\\n- Check that the branch exists on the remote (run: git push -u origin HEAD)\\n- Verify there isn't already an open PR for this branch\\n- If git auth fails, the token may have expired — retry the operation`,\n );\n }\n },\n );\n}\n\nfunction buildAddDependencyTool(connection: AgentConnection) {\n return defineTool(\n \"add_dependency\",\n \"Add a dependency — this task cannot start until the specified task is merged to dev\",\n {\n depends_on_slug_or_id: z.string().describe(\"Slug or ID of the task this task depends on\"),\n },\n async ({ depends_on_slug_or_id }) => {\n try {\n await connection.call(\"addDependency\", {\n sessionId: connection.sessionId,\n dependsOnSlugOrId: depends_on_slug_or_id,\n });\n return textResult(`Dependency added: this task now depends on \"${depends_on_slug_or_id}\"`);\n } catch (error) {\n return textResult(\n `Failed to add dependency: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildRemoveDependencyTool(connection: AgentConnection) {\n return defineTool(\n \"remove_dependency\",\n \"Remove a dependency from this task\",\n {\n depends_on_slug_or_id: z.string().describe(\"Slug or ID of the task to remove as dependency\"),\n },\n async ({ depends_on_slug_or_id }) => {\n try {\n await connection.call(\"removeDependency\", {\n sessionId: connection.sessionId,\n dependsOnSlugOrId: depends_on_slug_or_id,\n });\n return textResult(\"Dependency removed\");\n } catch (error) {\n return textResult(\n `Failed to remove dependency: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildCreateFollowUpTaskTool(connection: AgentConnection) {\n return defineTool(\n \"create_follow_up_task\",\n \"Create a follow-up task in this project that depends on the current task. Use for out-of-scope work, v1.1 features, or cleanup that should happen after this task merges.\",\n {\n title: z.string().describe(\"Follow-up task title\"),\n description: z.string().optional().describe(\"Brief description of the follow-up work\"),\n plan: z.string().optional().describe(\"Implementation plan if known\"),\n story_point_value: z\n .number()\n .optional()\n .describe(\"Story point estimate (1=Common, 2=Magic, 3=Rare, 5=Unique)\"),\n },\n async ({ title, description, plan, story_point_value }) => {\n try {\n const result = await connection.call(\"createFollowUpTask\", {\n sessionId: connection.sessionId,\n title,\n description,\n plan,\n storyPointValue: story_point_value,\n });\n return textResult(\n `Follow-up task created: \"${title}\" (slug: ${result.slug}). It depends on the current task and will be unblocked when this task is merged.`,\n );\n } catch (error) {\n return textResult(\n `Failed to create follow-up task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildCreateSuggestionTool(connection: AgentConnection) {\n return defineTool(\n \"create_suggestion\",\n \"Suggest a feature, improvement, or idea for the project. If you want to recommend something — a document, a rule, a feature, a task, an optimization — use this tool. If a similar suggestion already exists, your vote will be added to it instead of creating a duplicate.\",\n {\n title: z.string().describe(\"Short title for the suggestion\"),\n description: z.string().optional().describe(\"Details about the suggestion\"),\n tag_names: z.array(z.string()).optional().describe(\"Tag names to categorize the suggestion\"),\n },\n async ({ title, description, tag_names }) => {\n try {\n const result = await connection.call(\"createSuggestion\", {\n sessionId: connection.sessionId,\n title,\n description,\n tagNames: tag_names,\n });\n if (result.merged) {\n return textResult(\n `Your suggestion was merged into an existing one (ID: ${result.mergedIntoId ?? result.id}). Your upvote has been recorded.`,\n );\n }\n return textResult(`Suggestion created (ID: ${result.id}).`);\n } catch (error) {\n return textResult(\n `Failed to create suggestion: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildVoteSuggestionTool(connection: AgentConnection) {\n return defineTool(\n \"vote_suggestion\",\n \"Vote on a project suggestion. Use +1 to upvote or -1 to downvote.\",\n {\n suggestion_id: z.string().describe(\"The suggestion ID to vote on\"),\n value: z\n .number()\n .refine((v) => v === 1 || v === -1, { message: \"Value must be 1 or -1\" })\n .describe(\"+1 to upvote, -1 to downvote\"),\n },\n async ({ suggestion_id, value }) => {\n try {\n const result = await connection.call(\"voteSuggestion\", {\n sessionId: connection.sessionId,\n suggestionId: suggestion_id,\n value: value as 1 | -1,\n });\n return textResult(`Vote recorded. Current score: ${result.score}`);\n } catch (error) {\n return textResult(\n `Failed to vote: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildScaleUpResourcesTool(connection: AgentConnection) {\n return defineTool(\n \"scale_up_resources\",\n \"Scale up the pod's CPU and memory resources. Use before running dev servers, tests, builds, or other resource-intensive operations. Phases: 'setup' (installs, basic dev servers), 'build' (full dev servers, test suites, typecheck, builds). Actual CPU/memory values are configured per-project. Scaling is one-way (up only).\",\n {\n tier: z.enum([\"initial\", \"setup\", \"build\"]).describe(\"The resource phase to scale up to\"),\n reason: z\n .string()\n .optional()\n .describe(\"Brief reason for scaling (e.g., 'running test suite')\"),\n },\n async ({ tier, reason }) => {\n try {\n const result = await connection.call(\"scaleUpResources\", {\n sessionId: connection.sessionId,\n tier,\n reason,\n });\n if (result.success) {\n return textResult(\n `Scaled to ${result.currentTier} phase (${result.cpu}). Was ${result.previousTier}.`,\n );\n }\n return textResult(\n `Scale-up not available: ${result.error ?? \"unknown error\"}. Continuing at current resources.`,\n );\n } catch (error) {\n return textResult(\n `Scale-up failed: ${error instanceof Error ? error.message : \"unknown error\"}. Continuing at current resources.`,\n );\n }\n },\n );\n}\n\n// ── Exports ───────────────────────────────────────────────────────────\n\nexport function buildCommonTools(connection: AgentConnection, config: AgentRunnerConfig) {\n const tools = [\n buildReadTaskChatTool(connection),\n buildPostToChatTool(connection),\n buildGetTaskPlanTool(connection),\n buildGetTaskTool(connection),\n buildGetTaskCliTool(connection),\n buildListTaskFilesTool(connection),\n buildGetTaskFileTool(connection),\n buildSearchIncidentsTool(connection),\n buildGetTaskIncidentsTool(connection),\n buildQueryGcpLogsTool(connection),\n buildCreatePullRequestTool(connection, config),\n buildAddDependencyTool(connection),\n buildRemoveDependencyTool(connection),\n buildGetDependenciesTool(connection),\n buildCreateFollowUpTaskTool(connection),\n buildCreateSuggestionTool(connection),\n buildVoteSuggestionTool(connection),\n buildGetSuggestionsTool(connection),\n ];\n\n if (process.env.CLAUDESPACE_NAME) {\n tools.push(buildScaleUpResourcesTool(connection));\n }\n\n return tools;\n}\n\nexport { buildForceUpdateTaskStatusTool };\n\nexport {\n buildReadTaskChatTool,\n buildGetTaskPlanTool,\n buildGetTaskTool,\n buildGetTaskFileTool,\n buildListTaskFilesTool,\n buildGetTaskCliTool,\n};\n","/** Shared result helpers for MCP tool handlers. */\n\nexport function textResult(text: string): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\" as const, text }] };\n}\n\nexport function imageBlock(\n data: string,\n mimeType: string,\n): { type: \"image\"; data: string; mimeType: string } {\n return { type: \"image\" as const, data, mimeType };\n}\n\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\");\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport { textResult } from \"./helpers.js\";\n\nconst SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\n\nexport function buildUpdateTaskTool(connection: AgentConnection) {\n return defineTool(\n \"update_task\",\n \"Save the finalized task plan and/or description\",\n {\n plan: z.string().optional().describe(\"The task plan in markdown\"),\n description: z.string().optional().describe(\"Updated task description\"),\n },\n async ({ plan, description }) => {\n try {\n await connection.call(\"updateTaskFields\", {\n sessionId: connection.sessionId,\n plan,\n description,\n });\n return textResult(\"Task updated successfully.\");\n } catch {\n return textResult(\"Failed to update task.\");\n }\n },\n );\n}\n\nfunction buildCreateSubtaskTool(connection: AgentConnection) {\n return defineTool(\n \"create_subtask\",\n \"Create a subtask under the current parent task. Use for breaking complex tasks into smaller pieces.\",\n {\n title: z.string().describe(\"Subtask title\"),\n description: z.string().optional().describe(\"Brief description\"),\n plan: z.string().optional().describe(\"Implementation plan in markdown\"),\n ordinal: z.number().optional().describe(\"Step/order number (0-based)\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async ({ title, description, plan, ordinal, storyPointValue }) => {\n try {\n const result = await connection.call(\"createSubtask\", {\n sessionId: connection.sessionId,\n title,\n ...(description !== undefined && { description }),\n ...(plan !== undefined && { plan }),\n ...(storyPointValue !== undefined && { storyPointValue }),\n ...(ordinal !== undefined && { ordinal }),\n });\n return textResult(`Subtask created with ID: ${result.id}`);\n } catch (error) {\n return textResult(\n `Failed to create subtask: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildUpdateSubtaskTool(connection: AgentConnection) {\n return defineTool(\n \"update_subtask\",\n \"Update an existing subtask's fields\",\n {\n subtaskId: z.string().describe(\"The subtask ID to update\"),\n title: z.string().optional(),\n description: z.string().optional(),\n plan: z.string().optional(),\n ordinal: z.number().optional(),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n },\n async ({ subtaskId, title, description, plan, storyPointValue }) => {\n try {\n await connection.call(\"updateSubtask\", {\n sessionId: connection.sessionId,\n subtaskId,\n ...(title !== undefined && { title }),\n ...(description !== undefined && { description }),\n ...(plan !== undefined && { plan }),\n ...(storyPointValue !== undefined && { storyPointValue }),\n });\n return textResult(\"Subtask updated.\");\n } catch (error) {\n return textResult(`Failed: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n },\n );\n}\n\nfunction buildDeleteSubtaskTool(connection: AgentConnection) {\n return defineTool(\n \"delete_subtask\",\n \"Delete a subtask\",\n { subtaskId: z.string().describe(\"The subtask ID to delete\") },\n async ({ subtaskId }) => {\n try {\n await connection.call(\"deleteSubtask\", {\n sessionId: connection.sessionId,\n subtaskId,\n });\n return textResult(\"Subtask deleted.\");\n } catch (error) {\n return textResult(`Failed: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n },\n );\n}\n\nfunction buildListSubtasksTool(connection: AgentConnection) {\n return defineTool(\n \"list_subtasks\",\n \"List all subtasks under the current parent task. Returns status, PR info (githubPRNumber, githubPRUrl), agent assignment (agentId), and plan for each child.\",\n {},\n async () => {\n try {\n const subtasks = await connection.call(\"listSubtasks\", {\n sessionId: connection.sessionId,\n });\n return textResult(JSON.stringify(subtasks, null, 2));\n } catch {\n return textResult(\"Failed to list subtasks.\");\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildPackTools(connection: AgentConnection) {\n return [\n defineTool(\n \"start_child_cloud_build\",\n \"Start a cloud build for a child task. The child must be in Open status with story points and an agent assigned.\",\n {\n childTaskId: z.string().describe(\"The child task ID to start a cloud build for\"),\n },\n async ({ childTaskId }) => {\n try {\n const result = await connection.call(\"startChildCloudBuild\", {\n sessionId: connection.sessionId,\n childTaskId,\n });\n return textResult(`Cloud build started for child task: ${result.childTaskId}`);\n } catch (error) {\n return textResult(\n `Failed to start child cloud build: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n defineTool(\n \"stop_child_build\",\n \"Stop a running cloud build for a child task. Sends a stop signal to the child agent.\",\n {\n childTaskId: z.string().describe(\"The child task ID whose build should be stopped\"),\n },\n async ({ childTaskId }) => {\n try {\n await connection.call(\"stopChildBuild\", {\n sessionId: connection.sessionId,\n childTaskId,\n });\n return textResult(`Stop signal sent to child task: ${childTaskId}`);\n } catch (error) {\n return textResult(\n `Failed to stop child build: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n defineTool(\n \"approve_and_merge_pr\",\n \"Approve and merge a child task's pull request. Only succeeds if all CI/CD checks are passing. Returns an error if checks are pending (retry after waiting) or failed (investigate). The child task must be in ReviewPR status.\",\n {\n childTaskId: z\n .string()\n .describe(\"The child task ID whose PR should be approved and merged\"),\n },\n async ({ childTaskId }) => {\n try {\n const result = await connection.call(\"approveAndMergePR\", {\n sessionId: connection.sessionId,\n childTaskId,\n });\n if (result.merged) {\n return textResult(\n `PR #${result.prNumber} approved and merged for task ${result.childTaskId}. Task status updated to ReviewDev.`,\n );\n }\n return textResult(\n `PR #${result.prNumber} merge queued for task ${result.childTaskId} — CI checks still in progress. The PR will auto-merge when all checks pass. Do NOT proceed as if merged. Wait for the child task status to change to ReviewDev before continuing.`,\n );\n } catch (error) {\n return textResult(\n `Failed to approve and merge PR: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ];\n}\n\nexport function buildPmTools(\n connection: AgentConnection,\n options?: { includePackTools?: boolean },\n) {\n const tools = [\n buildUpdateTaskTool(connection),\n buildCreateSubtaskTool(connection),\n buildUpdateSubtaskTool(connection),\n buildDeleteSubtaskTool(connection),\n buildListSubtasksTool(connection),\n ];\n if (!options?.includePackTools) return tools;\n return [...tools, ...buildPackTools(connection)];\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport { textResult } from \"./helpers.js\";\n\nconst SP_DESCRIPTION = \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\n\nfunction buildSearchIconsTool(connection: AgentConnection) {\n return defineTool(\n \"search_icons\",\n \"Search for icons by keyword. Searches both the Conveyor database (existing icons) and FontAwesome library (~2200 icons). Returns matching icons with IDs and preview info. Use this to find an icon before generating one.\",\n {\n query: z\n .string()\n .describe(\"Search query for icon name or keyword (e.g. 'bug', 'gear', 'star')\"),\n },\n async ({ query }) => {\n try {\n const [dbIcons, faIcons] = await Promise.all([\n connection.call(\"listIcons\", { sessionId: connection.sessionId }),\n connection.call(\"searchFaIcons\", { sessionId: connection.sessionId, query }),\n ]);\n\n const q = query.toLowerCase();\n const matchingDbIcons = dbIcons.filter((icon) => icon.name.toLowerCase().includes(q));\n\n // Deduplicate: DB icons with matching FA IDs take priority\n const dbFaIds = new Set(matchingDbIcons.map((i) => i.name));\n const uniqueFaIcons = faIcons.filter((fa) => !dbFaIds.has(fa.fontAwesomeId));\n\n const results = {\n existingIcons: matchingDbIcons.map((i) => ({\n id: i.id,\n name: i.name,\n source: \"database\" as const,\n })),\n fontAwesomeIcons: uniqueFaIcons.map((fa) => ({\n fontAwesomeId: fa.fontAwesomeId,\n label: fa.label,\n styles: fa.styles,\n source: \"fontawesome\" as const,\n })),\n };\n\n return textResult(JSON.stringify(results, null, 2));\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return textResult(`Failed to search icons: ${message}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildIconTools(connection: AgentConnection) {\n return [\n defineTool(\n \"list_icons\",\n \"List available icons (default library + user-created). Returns icon IDs, names, and whether they're defaults. Call this FIRST before update_task_properties to check for existing matches.\",\n {},\n async () => {\n try {\n const icons = await connection.call(\"listIcons\", {\n sessionId: connection.sessionId,\n });\n return textResult(JSON.stringify(icons, null, 2));\n } catch (error) {\n return textResult(\n `Failed to list icons: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n defineTool(\n \"generate_task_icon\",\n \"Find a FontAwesome icon matching the description and assign it to this task. Falls back to a placeholder if no match is found. Provide a concise keyword or description.\",\n {\n prompt: z\n .string()\n .describe(\n \"Keyword or description to search FontAwesome icons (e.g. 'bug', 'gear', 'rocket')\",\n ),\n aspectRatio: z\n .enum([\"auto\", \"portrait\", \"landscape\", \"square\"])\n .optional()\n .describe(\"Icon aspect ratio, defaults to square\"),\n },\n async ({ prompt, aspectRatio }) => {\n try {\n const result = await connection.call(\"generateTaskIcon\", {\n sessionId: connection.sessionId,\n prompt,\n aspectRatio: aspectRatio ?? \"square\",\n });\n return textResult(`Icon generated and assigned: ${result.iconId}`);\n } catch (error) {\n return textResult(\n `Failed to generate icon: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ];\n}\n\nexport function buildDiscoveryTools(connection: AgentConnection) {\n return [\n defineTool(\n \"update_task_properties\",\n \"Set one or more task properties in a single call. All fields are optional — only include the fields you want to update.\",\n {\n title: z.string().optional().describe(\"The new task title\"),\n storyPointValue: z.number().optional().describe(SP_DESCRIPTION),\n tagIds: z.array(z.string()).optional().describe(\"Array of tag IDs to assign\"),\n iconId: z.string().optional().describe(\"Icon ID to assign (use list_icons first)\"),\n },\n async ({ title, storyPointValue, tagIds, iconId }) => {\n try {\n await connection.call(\"updateTaskProperties\", {\n sessionId: connection.sessionId,\n title,\n storyPointValue,\n tagIds,\n iconId,\n });\n\n const updatedFields = [];\n if (title !== undefined) updatedFields.push(`title to \"${title}\"`);\n if (storyPointValue !== undefined)\n updatedFields.push(`story points to ${storyPointValue}`);\n if (tagIds !== undefined) updatedFields.push(`tags (${tagIds.length} tag(s))`);\n if (iconId !== undefined) updatedFields.push(`icon`);\n\n return textResult(`Task properties updated: ${updatedFields.join(\", \")}`);\n } catch (error) {\n return textResult(\n `Failed to update task properties: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n buildSearchIconsTool(connection),\n ...buildIconTools(connection),\n ];\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport { textResult } from \"./helpers.js\";\n\nexport function buildCodeReviewTools(connection: AgentConnection) {\n return [\n defineTool(\n \"approve_code_review\",\n \"Approve the code review. Use this when the code passes all review criteria and is ready to merge.\",\n {\n summary: z.string().describe(\"Brief summary of what was reviewed and why it looks good\"),\n },\n async ({ summary }) => {\n const content = `**Code Review: Approved** :white_check_mark:\\n\\n${summary}`;\n await connection.call(\"submitCodeReviewResult\", {\n sessionId: connection.sessionId,\n approved: true,\n content,\n });\n connection.sendEvent({\n type: \"code_review_complete\",\n result: \"approved\",\n summary,\n });\n return textResult(\"Code review approved. Exiting.\");\n },\n ),\n defineTool(\n \"request_code_changes\",\n \"Request changes during code review. Use this when substantive issues are found that need to be fixed before merge.\",\n {\n issues: z\n .array(\n z.object({\n file: z.string().describe(\"File path where the issue was found\"),\n line: z.number().optional().describe(\"Line number (if applicable)\"),\n severity: z.enum([\"critical\", \"major\", \"minor\"]).describe(\"Issue severity\"),\n description: z.string().describe(\"What is wrong and how to fix it\"),\n }),\n )\n .describe(\"List of issues found during review\"),\n summary: z.string().describe(\"Brief overall summary of the review findings\"),\n },\n async ({ issues, summary }) => {\n const issueLines = issues\n .map((issue) => {\n const loc = issue.line ? `:${issue.line}` : \"\";\n return `- **[${issue.severity}]** \\`${issue.file}${loc}\\`: ${issue.description}`;\n })\n .join(\"\\n\");\n\n const content = `**Code Review: Changes Requested** :warning:\\n\\n${summary}\\n\\n${issueLines}`;\n await connection.call(\"submitCodeReviewResult\", {\n sessionId: connection.sessionId,\n approved: false,\n content,\n });\n connection.sendEvent({\n type: \"code_review_complete\",\n result: \"changes_requested\",\n summary,\n issues,\n });\n return textResult(\"Code review complete — changes requested. Exiting.\");\n },\n ),\n ];\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { DebugManager } from \"../debug/debug-manager.js\";\nimport { textResult } from \"./index.js\";\n\nimport type { CdpDebugClient } from \"../debug/cdp-client.js\";\nimport { buildTelemetryTools } from \"./telemetry-tools.js\";\nimport { buildClientDebugTools } from \"./client-debug-tools.js\";\n\nfunction requireDebugClient(manager: DebugManager): CdpDebugClient | string {\n if (!manager.isDebugMode()) {\n return \"Debug mode is not active. Use debug_enter_mode first.\";\n }\n const client = manager.getClient();\n if (!client?.isConnected()) {\n return \"CDP client is not connected. Try exiting and re-entering debug mode.\";\n }\n return client;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : \"Unknown error\";\n}\n\nasync function handleEnterDebugMode(\n manager: DebugManager,\n {\n hypothesis,\n serverSide,\n clientSide,\n previewUrl,\n }: {\n hypothesis?: string;\n serverSide?: boolean;\n clientSide?: boolean;\n previewUrl?: string;\n },\n) {\n const wantServer = serverSide ?? !clientSide;\n const wantClient = clientSide ?? false;\n\n const alreadyMsg = checkAlreadyActive(manager, wantServer, wantClient);\n if (alreadyMsg) return textResult(alreadyMsg);\n\n await manager.enterDebugMode(undefined, {\n serverSide: wantServer && !manager.isDebugMode(),\n clientSide: wantClient && !manager.isClientDebugMode(),\n previewUrl,\n });\n\n return textResult(buildActivationMessage(manager, hypothesis));\n}\n\nfunction checkAlreadyActive(\n manager: DebugManager,\n wantServer: boolean,\n wantClient: boolean,\n): string | null {\n if (wantServer && manager.isDebugMode() && !wantClient) return \"Already in server debug mode.\";\n if (wantClient && manager.isClientDebugMode() && !wantServer)\n return \"Already in client debug mode.\";\n if (wantServer && manager.isDebugMode() && wantClient && manager.isClientDebugMode()) {\n return \"Already in both server and client debug mode.\";\n }\n return null;\n}\n\nfunction buildActivationMessage(manager: DebugManager, hypothesis?: string): string {\n const modes: string[] = [];\n if (manager.isDebugMode()) modes.push(\"server\");\n if (manager.isClientDebugMode()) modes.push(\"client\");\n const modeStr = modes.join(\" + \");\n\n const sourceMapWarning =\n manager.getPlaywrightClient()?.hasSourceMaps() === false\n ? \"\\n⚠️ Source maps not detected in the client — client breakpoints will reference bundled code.\"\n : \"\";\n\n return hypothesis\n ? `Debug mode activated (${modeStr}). Hypothesis: ${hypothesis}\\nSet breakpoints to test your hypothesis.${sourceMapWarning}`\n : `Debug mode activated (${modeStr}). Set breakpoints to begin debugging.${sourceMapWarning}`;\n}\n\nfunction buildDebugLifecycleTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_enter_mode\",\n \"Activate debug mode: restarts the dev server with Node.js --inspect flag and connects the CDP debugger. Optionally launch a headless Chromium browser for client-side debugging. Use serverSide for backend breakpoints, clientSide for frontend breakpoints, or both for full-stack.\",\n {\n hypothesis: z\n .string()\n .optional()\n .describe(\"Your hypothesis about the bug — helps track debugging intent\"),\n serverSide: z\n .boolean()\n .optional()\n .describe(\n \"Enable server-side Node.js debugging (default: true if clientSide is not set)\",\n ),\n clientSide: z\n .boolean()\n .optional()\n .describe(\"Enable client-side browser debugging via headless Chromium + Playwright\"),\n previewUrl: z\n .string()\n .optional()\n .describe(\n \"Preview URL for client-side debugging (e.g., http://localhost:3000). Required when clientSide is true.\",\n ),\n },\n async (params) => {\n try {\n return await handleEnterDebugMode(manager, params);\n } catch (error) {\n return textResult(`Failed to enter debug mode: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_exit_mode\",\n \"Exit debug mode: removes all breakpoints, disconnects the debugger, and restarts the dev server normally.\",\n {},\n async () => {\n try {\n if (!manager.isDebugMode()) {\n return textResult(\"Not in debug mode.\");\n }\n await manager.exitDebugMode();\n return textResult(\"Debug mode deactivated. Dev server restarted normally.\");\n } catch (error) {\n return textResult(`Failed to exit debug mode: ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\nfunction buildBreakpointTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_set_breakpoint\",\n \"Set a breakpoint at the specified file and line number. Optionally provide a condition expression that must evaluate to true for the breakpoint to pause execution.\",\n {\n file: z.string().describe(\"Absolute or relative file path to set the breakpoint in\"),\n line: z.number().describe(\"Line number (1-based) to set the breakpoint on\"),\n condition: z\n .string()\n .optional()\n .describe(\"JavaScript condition expression — breakpoint only triggers when truthy\"),\n },\n async ({ file, line, condition }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const client = clientOrErr;\n const breakpointId = await client.setBreakpoint(file, line, condition);\n const condStr = condition ? ` (condition: ${condition})` : \"\";\n return textResult(\n `Breakpoint set: ${file}:${line}${condStr}\\nBreakpoint ID: ${breakpointId}`,\n );\n } catch (error) {\n return textResult(`Failed to set breakpoint: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_remove_breakpoint\",\n \"Remove a previously set breakpoint by its ID.\",\n {\n breakpointId: z.string().describe(\"The breakpoint ID returned by debug_set_breakpoint\"),\n },\n async ({ breakpointId }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const client = clientOrErr;\n await client.removeBreakpoint(breakpointId);\n return textResult(`Breakpoint ${breakpointId} removed.`);\n } catch (error) {\n return textResult(`Failed to remove breakpoint: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_list_breakpoints\",\n \"List all currently active breakpoints with their file, line, and condition.\",\n {},\n // oxlint-disable-next-line require-await\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const breakpoints = clientOrErr.listBreakpoints();\n if (breakpoints.length === 0) {\n return textResult(\"No breakpoints set.\");\n }\n return textResult(JSON.stringify(breakpoints, null, 2));\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nfunction buildInspectionTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_inspect_paused\",\n \"When the debugger is paused at a breakpoint, returns the call stack and local variables. Check this after a breakpoint is hit to understand the current execution state.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n const client = clientOrErr;\n\n const queuedHits = manager.drainBreakpointHitQueue();\n\n if (!client.isPaused()) {\n if (queuedHits.length > 0) {\n return textResult(\n `Debugger was paused but has since resumed. Recent breakpoint hits:\\n${JSON.stringify(queuedHits, null, 2)}`,\n );\n }\n return textResult(\n \"Debugger is not currently paused. Set breakpoints and trigger the code path to pause execution.\",\n );\n }\n\n try {\n const callStack = client.getCallStack();\n const topFrame = callStack[0];\n let variables: { name: string; type: string; value: string }[] = [];\n\n if (topFrame) {\n try {\n variables = await client.getScopeVariables(topFrame.callFrameId);\n } catch {\n // Scope inspection can fail for some frames\n }\n }\n\n const result = {\n reason: client.getPausedState()?.reason,\n hitBreakpoints: client.getPausedState()?.hitBreakpoints,\n callStack,\n localVariables: variables,\n };\n\n return textResult(JSON.stringify(result, null, 2));\n } catch (error) {\n return textResult(`Failed to inspect paused state: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n\n defineTool(\n \"debug_evaluate\",\n \"Evaluate a JavaScript expression in the current paused scope (or globally if not paused). When paused, use frameIndex to evaluate in a specific call frame.\",\n {\n expression: z.string().describe(\"The JavaScript expression to evaluate\"),\n frameIndex: z\n .number()\n .optional()\n .describe(\"Call stack frame index (0 = top frame). Defaults to the top frame.\"),\n },\n async ({ expression, frameIndex }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const client = clientOrErr;\n let callFrameId: string | undefined;\n\n if (client.isPaused()) {\n const callStack = client.getCallStack();\n const frame = callStack[frameIndex ?? 0];\n callFrameId = frame?.callFrameId;\n }\n\n const result = await client.evaluate(expression, callFrameId);\n return textResult(`(${result.type}) ${result.value}`);\n } catch (error) {\n return textResult(`Evaluation failed: ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\nfunction buildProbeManagementTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_add_probe\",\n \"Add a debug probe at a specific code location. Captures expression values each time the line executes — without pausing or modifying source files. Like console.log but better: structured, no diff pollution, auto-cleaned on debug exit.\",\n {\n file: z.string().describe(\"File path to probe\"),\n line: z.number().describe(\"Line number (1-based) to probe\"),\n expressions: z\n .array(z.string())\n .describe(\n 'JavaScript expressions to capture when the line executes (e.g., [\"req.params.id\", \"user.role\"])',\n ),\n label: z\n .string()\n .optional()\n .describe(\"Optional label for this probe (defaults to file:line)\"),\n },\n async ({ file, line, expressions, label }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const probeId = await clientOrErr.setLogpoint(file, line, expressions, label);\n const probeLabel = label ?? `${file}:${line}`;\n const exprList = expressions.join(\", \");\n return textResult(\n `Probe \"${probeLabel}\" set at ${file}:${line}\\nCapturing: ${exprList}\\nProbe ID: ${probeId}\\n\\nTrigger the code path, then use debug_get_probe_results to see captured values.`,\n );\n } catch (error) {\n return textResult(`Failed to add probe: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_remove_probe\",\n \"Remove a previously set debug probe by its ID.\",\n {\n probeId: z.string().describe(\"The probe ID returned by debug_add_probe\"),\n },\n async ({ probeId }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n await clientOrErr.removeProbe(probeId);\n return textResult(`Probe ${probeId} removed.`);\n } catch (error) {\n return textResult(`Failed to remove probe: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_list_probes\",\n \"List all active debug probes with their file, line, expressions, and labels.\",\n {},\n // oxlint-disable-next-line require-await\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const probes = clientOrErr.listProbes();\n if (probes.length === 0) {\n return textResult(\"No probes set.\");\n }\n\n const lines = probes.map(\n (p) =>\n `${p.probeId}: \"${p.label}\" at ${p.file}:${p.line} — [${p.expressions.join(\", \")}]`,\n );\n return textResult(lines.join(\"\\n\"));\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nfunction buildProbeResultTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_get_probe_results\",\n \"Fetch captured probe hit data. Returns expression values from each time a probed line executed.\",\n {\n probeId: z\n .string()\n .optional()\n .describe(\"Filter results by probe ID (resolves to its label)\"),\n label: z.string().optional().describe(\"Filter results by probe label\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of recent hits to return (default: all)\"),\n },\n async ({ probeId, label, limit }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n // Resolve probeId to label if provided\n let filterLabel = label;\n if (probeId && !filterLabel) {\n const probe = clientOrErr.listProbes().find((p) => p.probeId === probeId);\n if (probe) filterLabel = probe.label;\n }\n\n const hits = await clientOrErr.getProbeResults(filterLabel, limit);\n\n if (hits.length === 0) {\n const filterDesc = filterLabel ? ` for \"${filterLabel}\"` : \"\";\n return textResult(\n `No probe hits${filterDesc}. Make sure the probed code path has been triggered.`,\n );\n }\n\n // Format hits for LLM readability\n const formatted = formatProbeHits(hits);\n return textResult(formatted);\n } catch (error) {\n return textResult(`Failed to get probe results: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nfunction formatProbeHits(\n hits: { label: string; data: Record<string, unknown>; timestamp: number }[],\n): string {\n // Group by label\n const grouped = new Map<string, typeof hits>();\n for (const hit of hits) {\n const group = grouped.get(hit.label) ?? [];\n group.push(hit);\n grouped.set(hit.label, group);\n }\n\n const sections: string[] = [];\n for (const [label, labelHits] of grouped) {\n const header = `Probe \"${label}\" — hit ${labelHits.length} time${labelHits.length === 1 ? \"\" : \"s\"}:`;\n const lines = labelHits.map((hit) => {\n const time = new Date(hit.timestamp).toLocaleTimeString(\"en-US\", { hour12: false });\n const entries = Object.entries(hit.data)\n .map(([key, val]) => `${key}=${formatProbeValue(val)}`)\n .join(\", \");\n return ` [${time}] ${entries}`;\n });\n sections.push([header, ...lines].join(\"\\n\"));\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction formatProbeValue(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") {\n return value.length > 100 ? `\"${value.slice(0, 97)}...\"` : `\"${value}\"`;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length <= 3) {\n const preview = keys\n .map((k) => `${k}: ${formatProbeValue((value as Record<string, unknown>)[k])}`)\n .join(\", \");\n return `{${preview}}`;\n }\n return `Object(${keys.length} keys)`;\n }\n return String(value);\n}\n\nfunction buildExecutionControlTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_continue\",\n \"Resume execution after the debugger has paused at a breakpoint.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n if (!clientOrErr.isPaused()) {\n return textResult(\"Debugger is not paused.\");\n }\n\n try {\n await clientOrErr.resume();\n return textResult(\"Execution resumed.\");\n } catch (error) {\n return textResult(`Failed to resume: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_step_over\",\n \"Step over the current line while paused at a breakpoint. Executes the current line and pauses at the next line in the same function.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n if (!clientOrErr.isPaused()) {\n return textResult(\"Debugger is not paused.\");\n }\n\n try {\n await clientOrErr.stepOver();\n return textResult(\"Stepped over. Use debug_inspect_paused to see current state.\");\n } catch (error) {\n return textResult(`Failed to step over: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_step_into\",\n \"Step into the function call on the current line while paused at a breakpoint. Pauses at the first line inside the called function.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n if (!clientOrErr.isPaused()) {\n return textResult(\"Debugger is not paused.\");\n }\n\n try {\n await clientOrErr.stepInto();\n return textResult(\"Stepped into. Use debug_inspect_paused to see current state.\");\n } catch (error) {\n return textResult(`Failed to step into: ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\nexport function buildDebugTools(manager: DebugManager) {\n return [\n ...buildDebugLifecycleTools(manager),\n ...buildBreakpointTools(manager),\n ...buildProbeManagementTools(manager),\n ...buildProbeResultTools(manager),\n ...buildInspectionTools(manager),\n ...buildExecutionControlTools(manager),\n ...buildTelemetryTools(manager),\n ...buildClientDebugTools(manager),\n ];\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { DebugManager } from \"../debug/debug-manager.js\";\nimport { textResult } from \"./index.js\";\n\nimport type { CdpDebugClient } from \"../debug/cdp-client.js\";\nimport { queryTelemetry, clearTelemetry, getTelemetryStatus } from \"../debug/telemetry-injector.js\";\n\nfunction requireDebugClient(manager: DebugManager): CdpDebugClient | string {\n if (!manager.isDebugMode()) {\n return \"Debug mode is not active. Use debug_enter_mode first.\";\n }\n const client = manager.getClient();\n if (!client?.isConnected()) {\n return \"CDP client is not connected. Try exiting and re-entering debug mode.\";\n }\n return client;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : \"Unknown error\";\n}\n\nfunction buildGetTelemetryTool(manager: DebugManager) {\n return defineTool(\n \"debug_get_telemetry\",\n \"Query structured telemetry events (HTTP requests, database queries, Socket.IO events, errors) captured from the running dev server. Returns filtered, structured data instead of raw logs.\",\n {\n type: z.enum([\"http\", \"db\", \"socket\", \"error\"]).optional().describe(\"Filter by event type\"),\n urlPattern: z.string().optional().describe(\"Regex pattern to filter HTTP events by URL\"),\n minDuration: z\n .number()\n .optional()\n .describe(\"Minimum duration in ms — only return events slower than this\"),\n errorOnly: z\n .boolean()\n .optional()\n .describe(\"Only return error events and HTTP 4xx/5xx responses\"),\n since: z\n .number()\n .optional()\n .describe(\"Only return events after this timestamp (ms since epoch)\"),\n limit: z.number().optional().describe(\"Max events to return (default: 20, from most recent)\"),\n },\n async ({ type, urlPattern, minDuration, errorOnly, since, limit }) => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const filter = {\n ...(type && { type }),\n ...(urlPattern && { urlPattern }),\n ...(minDuration && { minDuration }),\n ...(errorOnly && { errorOnly }),\n ...(since && { since }),\n };\n const hasFilter = Object.keys(filter).length > 0;\n const events = await queryTelemetry(clientOrErr, hasFilter ? filter : undefined, limit);\n\n if (events.length === 0) {\n return textResult(\"No telemetry events found matching the filter.\");\n }\n\n return textResult(JSON.stringify(events, null, 2));\n } catch (error) {\n return textResult(`Failed to query telemetry: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildClearTelemetryTool(manager: DebugManager) {\n return defineTool(\n \"debug_clear_telemetry\",\n \"Clear all captured telemetry events from the buffer. Useful to reset before reproducing a specific issue.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n await clearTelemetry(clientOrErr);\n return textResult(\"Telemetry buffer cleared.\");\n } catch (error) {\n return textResult(`Failed to clear telemetry: ${formatError(error)}`);\n }\n },\n );\n}\n\nfunction buildTelemetryStatusTool(manager: DebugManager) {\n return defineTool(\n \"debug_telemetry_status\",\n \"Check if telemetry is active, how many events have been captured, and which framework patches (Express, Prisma, Socket.IO) were successfully applied.\",\n {},\n async () => {\n const clientOrErr = requireDebugClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const status = await getTelemetryStatus(clientOrErr);\n return textResult(JSON.stringify(status, null, 2));\n } catch (error) {\n return textResult(`Failed to get telemetry status: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nexport function buildTelemetryTools(manager: DebugManager) {\n return [\n buildGetTelemetryTool(manager),\n buildClearTelemetryTool(manager),\n buildTelemetryStatusTool(manager),\n ];\n}\n","import type { CdpDebugClient } from \"./cdp-client.js\";\nimport type { TelemetryEvent, TelemetryFilter, TelemetryStatus } from \"./telemetry-types.js\";\n\n// ── Constants ─────────────────────────────────────────────────────────────\n\nconst BUFFER_SIZE = 200;\nconst BODY_MAX_BYTES = 1024;\nconst MAX_DEPTH = 3;\n\n// ── Static asset / noise exclusion patterns ───────────────────────────────\n\nconst EXCLUDED_EXTENSIONS = [\n \".js\",\n \".css\",\n \".ico\",\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".svg\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".eot\",\n \".map\",\n \".webp\",\n];\nconst EXCLUDED_PATHS = [\"/_next/\", \"/__nextjs\", \"/favicon\", \"/_healthz\", \"/healthz\", \"/health\"];\nconst EXCLUDED_SOCKET_EVENTS = [\"ping\", \"pong\", \"connection\", \"disconnect\", \"websocket\", \"upgrade\"];\n\n// ── Script Section Builders ──────────────────────────────────────────────\n\nfunction scriptPreamble(): string {\n return `(function() {\n if (globalThis.__conveyorTelemetry) {\n return JSON.stringify({ success: true, alreadyInjected: true, patches: globalThis.__conveyorTelemetry._patches });\n }\n\n var BUFFER_SIZE = ${BUFFER_SIZE};\n var BODY_MAX_BYTES = ${BODY_MAX_BYTES};\n var MAX_DEPTH = ${MAX_DEPTH};\n var excludedExtensions = ${JSON.stringify(EXCLUDED_EXTENSIONS)};\n var excludedPaths = ${JSON.stringify(EXCLUDED_PATHS)};\n var excludedSocketEvents = ${JSON.stringify(EXCLUDED_SOCKET_EVENTS)};`;\n}\n\nfunction scriptHelpers(): string {\n return `\n function truncate(str, max) {\n if (typeof str !== 'string') return '';\n if (str.length <= max) return str;\n return str.slice(0, max) + '...[truncated]';\n }\n\n function safeStringify(obj, depth) {\n if (depth === undefined) depth = MAX_DEPTH;\n try {\n if (obj === null || obj === undefined) return String(obj);\n if (typeof obj === 'string') return obj;\n if (typeof obj !== 'object') return String(obj);\n if (depth <= 0) return '[Object]';\n var seen = new Set();\n return JSON.stringify(obj, function(key, value) {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n }\n return value;\n }, 0).slice(0, BODY_MAX_BYTES);\n } catch (e) {\n return '[unserializable]';\n }\n }\n\n function isExcludedUrl(url) {\n if (!url) return false;\n var lower = url.toLowerCase();\n for (var i = 0; i < excludedExtensions.length; i++) {\n if (lower.endsWith(excludedExtensions[i])) return true;\n }\n for (var j = 0; j < excludedPaths.length; j++) {\n if (lower.indexOf(excludedPaths[j]) !== -1) return true;\n }\n return false;\n }\n\n function isExcludedSocketEvent(event) {\n return excludedSocketEvents.indexOf(event) !== -1;\n }\n\n function nowMs() { return Date.now(); }`;\n}\n\nfunction scriptBuffer(): string {\n return `\n var buffer = [];\n\n function pushEvent(event) {\n buffer.push(event);\n if (buffer.length > BUFFER_SIZE) { buffer.shift(); }\n }\n\n function getEvents(filter, limit) {\n var result = buffer;\n if (filter) {\n if (filter.type) {\n result = result.filter(function(e) { return e.type === filter.type; });\n }\n if (filter.urlPattern) {\n var re;\n try { re = new RegExp(filter.urlPattern, 'i'); } catch(e) { re = null; }\n if (re) {\n result = result.filter(function(e) { return e.type === 'http' && re.test(e.url); });\n }\n }\n if (filter.minDuration) {\n var minD = filter.minDuration;\n result = result.filter(function(e) { return ('duration' in e) && e.duration >= minD; });\n }\n if (filter.errorOnly) {\n result = result.filter(function(e) {\n return e.type === 'error' || (e.type === 'http' && e.status >= 400);\n });\n }\n if (filter.since) {\n var since = filter.since;\n result = result.filter(function(e) { return e.timestamp >= since; });\n }\n }\n if (limit && limit > 0) { result = result.slice(-limit); }\n return result;\n }\n\n function clear() { buffer = []; }\n\n var patches = { express: false, prisma: false, socketIo: false, errorHandler: false };`;\n}\n\nfunction scriptPatchExpress(): string {\n return `\n function patchExpress() {\n try {\n var http = require('http');\n var originalEmit = http.Server.prototype.emit;\n http.Server.prototype.emit = function(event) {\n if (event === 'request') {\n var req = arguments[1];\n var res = arguments[2];\n if (req && res && !isExcludedUrl(req.url)) {\n var start = nowMs();\n var reqBody = '';\n if (req.readable) {\n var chunks = [];\n var origPush = req.push;\n req.push = function(chunk) {\n if (chunk) { chunks.push(typeof chunk === 'string' ? chunk : chunk.toString()); }\n return origPush.apply(this, arguments);\n };\n var origReqEmit = req.emit;\n req.emit = function(evt) {\n if (evt === 'end') { reqBody = truncate(chunks.join(''), BODY_MAX_BYTES); }\n return origReqEmit.apply(this, arguments);\n };\n }\n var origEnd = res.end;\n res.end = function(chunk) {\n var resBody = '';\n if (chunk) { resBody = truncate(typeof chunk === 'string' ? chunk : chunk.toString(), BODY_MAX_BYTES); }\n var duration = nowMs() - start;\n pushEvent({\n type: 'http', timestamp: start, method: req.method || 'UNKNOWN',\n url: req.url || '/', status: res.statusCode || 0, duration: duration,\n requestBody: reqBody || undefined, responseBody: resBody || undefined,\n error: res.statusCode >= 400 ? ('HTTP ' + res.statusCode) : undefined\n });\n return origEnd.apply(this, arguments);\n };\n }\n }\n return originalEmit.apply(this, arguments);\n };\n patches.express = true;\n } catch (e) {}\n }`;\n}\n\nfunction scriptPatchPrisma(): string {\n return `\n function patchPrisma() {\n try {\n var prismaClient = globalThis.prisma || globalThis.__prisma;\n if (!prismaClient) {\n var cacheKeys = Object.keys(require.cache || {});\n for (var i = 0; i < cacheKeys.length; i++) {\n var mod = require.cache[cacheKeys[i]];\n if (mod && mod.exports && typeof mod.exports.$on === 'function') {\n prismaClient = mod.exports;\n break;\n }\n }\n }\n if (prismaClient && typeof prismaClient.$on === 'function') {\n prismaClient.$on('query', function(e) {\n pushEvent({\n type: 'db', timestamp: nowMs(),\n query: truncate(e.query || '', BODY_MAX_BYTES),\n params: truncate(safeStringify(e.params), BODY_MAX_BYTES),\n duration: e.duration || 0\n });\n });\n patches.prisma = true;\n }\n } catch (e) {}\n }`;\n}\n\nfunction scriptPatchSocketIo(): string {\n return `\n function patchSocketIo() {\n try {\n var io = globalThis.io || globalThis.__io;\n if (io && io.sockets) {\n var origOn = io.sockets.constructor.prototype.on;\n if (origOn) {\n io.sockets.constructor.prototype.on = function(event, handler) {\n if (!isExcludedSocketEvent(event)) {\n var wrappedHandler = function() {\n var args = Array.prototype.slice.call(arguments);\n pushEvent({\n type: 'socket', timestamp: nowMs(), event: event, direction: 'in',\n data: truncate(safeStringify(args[0]), BODY_MAX_BYTES),\n namespace: (this.nsp && this.nsp.name) || '/'\n });\n return handler.apply(this, arguments);\n };\n return origOn.call(this, event, wrappedHandler);\n }\n return origOn.call(this, event, handler);\n };\n }\n var origEmit = io.sockets.constructor.prototype.emit;\n if (origEmit) {\n io.sockets.constructor.prototype.emit = function(event) {\n if (!isExcludedSocketEvent(event)) {\n var args = Array.prototype.slice.call(arguments, 1);\n pushEvent({\n type: 'socket', timestamp: nowMs(), event: event, direction: 'out',\n data: truncate(safeStringify(args[0]), BODY_MAX_BYTES),\n namespace: (this.nsp && this.nsp.name) || '/'\n });\n }\n return origEmit.apply(this, arguments);\n };\n }\n patches.socketIo = true;\n }\n } catch (e) {}\n }`;\n}\n\nfunction scriptPatchErrors(): string {\n return `\n function patchErrorHandler() {\n try {\n process.on('uncaughtException', function(err) {\n pushEvent({\n type: 'error', timestamp: nowMs(),\n message: err.message || String(err),\n stack: truncate(err.stack || '', BODY_MAX_BYTES),\n context: 'uncaughtException'\n });\n });\n process.on('unhandledRejection', function(reason) {\n var msg = (reason && reason.message) ? reason.message : String(reason);\n var stack = (reason && reason.stack) ? reason.stack : '';\n pushEvent({\n type: 'error', timestamp: nowMs(), message: msg,\n stack: truncate(stack, BODY_MAX_BYTES), context: 'unhandledRejection'\n });\n });\n patches.errorHandler = true;\n } catch (e) {}\n }`;\n}\n\nfunction scriptInit(): string {\n return `\n patchExpress();\n patchPrisma();\n patchSocketIo();\n patchErrorHandler();\n\n globalThis.__conveyorTelemetry = {\n getEvents: getEvents,\n clear: clear,\n getStatus: function() {\n return { active: true, eventCount: buffer.length, patches: patches };\n },\n _patches: patches,\n _buffer: buffer\n };\n\n return JSON.stringify({ success: true, alreadyInjected: false, patches: patches });\n})();`;\n}\n\n// ── Public Script Generator ──────────────────────────────────────────────\n\n/**\n * Generates the JavaScript code that will be injected into the running\n * dev server's V8 context via CDP Runtime.evaluate.\n *\n * Creates a global `__conveyorTelemetry` object with:\n * - Circular buffer of recent events\n * - Framework patching (Express, Prisma, Socket.IO)\n * - Query/filter/clear API\n */\nexport function generateTelemetryScript(): string {\n return [\n scriptPreamble(),\n scriptHelpers(),\n scriptBuffer(),\n scriptPatchExpress(),\n scriptPatchPrisma(),\n scriptPatchSocketIo(),\n scriptPatchErrors(),\n scriptInit(),\n ].join(\"\\n\");\n}\n\n// ── Injection via CDP ─────────────────────────────────────────────────────\n\n/**\n * Injects the telemetry runtime into the dev server process via CDP\n * Runtime.evaluate. Non-fatal — if injection fails, telemetry is just\n * unavailable.\n */\nexport async function injectTelemetry(\n cdpClient: CdpDebugClient,\n): Promise<{ success: boolean; patches?: Record<string, boolean>; error?: string }> {\n try {\n const script = generateTelemetryScript();\n const result = await cdpClient.evaluate(script);\n\n if (result.type === \"error\") {\n return { success: false, error: result.value };\n }\n\n // Parse the JSON response from the injection script\n try {\n let parsed = JSON.parse(result.value);\n // CdpDebugClient.evaluate() wraps string values with JSON.stringify,\n // so the result may need a second parse if it came back as a string\n if (typeof parsed === \"string\") parsed = JSON.parse(parsed);\n return {\n success: parsed.success === true,\n patches: parsed.patches,\n };\n } catch {\n // Script returned something unexpected but didn't error\n return { success: true };\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown injection error\",\n };\n }\n}\n\n// ── Query Helpers (used by MCP tools) ─────────────────────────────────────\n\n/**\n * Queries the injected telemetry buffer via CDP Runtime.evaluate.\n */\nexport async function queryTelemetry(\n cdpClient: CdpDebugClient,\n filter?: TelemetryFilter,\n limit?: number,\n): Promise<TelemetryEvent[]> {\n const filterJson = JSON.stringify(filter ?? {});\n const limitVal = limit ?? 20;\n\n const result = await cdpClient.evaluate(\n `JSON.stringify(globalThis.__conveyorTelemetry ? globalThis.__conveyorTelemetry.getEvents(${filterJson}, ${limitVal}) : [])`,\n );\n\n if (result.type === \"error\") {\n throw new Error(`Telemetry query failed: ${result.value}`);\n }\n\n try {\n // The evaluate result value may be JSON-stringified with extra quotes\n let val = result.value;\n // Strip outer quotes if the CDP evaluate returned a string value\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = JSON.parse(val);\n }\n return JSON.parse(val) as TelemetryEvent[];\n } catch {\n return [];\n }\n}\n\n/**\n * Clears the telemetry buffer via CDP.\n */\nexport async function clearTelemetry(cdpClient: CdpDebugClient): Promise<void> {\n await cdpClient.evaluate(\n `globalThis.__conveyorTelemetry ? (globalThis.__conveyorTelemetry.clear(), 'cleared') : 'not active'`,\n );\n}\n\n/**\n * Gets telemetry status via CDP.\n */\nexport async function getTelemetryStatus(cdpClient: CdpDebugClient): Promise<TelemetryStatus> {\n const result = await cdpClient.evaluate(\n `JSON.stringify(globalThis.__conveyorTelemetry ? globalThis.__conveyorTelemetry.getStatus() : { active: false, eventCount: 0, patches: { express: false, prisma: false, socketIo: false, errorHandler: false } })`,\n );\n\n if (result.type === \"error\") {\n return {\n active: false,\n eventCount: 0,\n patches: { express: false, prisma: false, socketIo: false, errorHandler: false },\n };\n }\n\n try {\n let val = result.value;\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = JSON.parse(val);\n }\n return JSON.parse(val) as TelemetryStatus;\n } catch {\n return {\n active: false,\n eventCount: 0,\n patches: { express: false, prisma: false, socketIo: false, errorHandler: false },\n };\n }\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { DebugManager } from \"../debug/debug-manager.js\";\nimport type { PlaywrightDebugClient } from \"../debug/playwright-client.js\";\nimport { textResult, imageBlock } from \"./index.js\";\n\nfunction requirePlaywrightClient(manager: DebugManager): PlaywrightDebugClient | string {\n if (!manager.isClientDebugMode()) {\n return \"Client debug mode is not active. Use debug_enter_mode with clientSide: true first.\";\n }\n const client = manager.getPlaywrightClient();\n if (!client?.isConnected()) {\n return \"Playwright client is not connected. Try exiting and re-entering debug mode.\";\n }\n return client;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : \"Unknown error\";\n}\n\n// ── Breakpoint Tools ────────────────────────────────────────────────────\n\nfunction buildClientBreakpointTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_set_client_breakpoint\",\n \"Set a breakpoint in client-side code running in the headless Chromium browser. V8 resolves source maps automatically, so original .tsx/.ts file paths work. Use this for React components, client utilities, and browser-side code.\",\n {\n file: z\n .string()\n .describe(\n \"Original source file path (e.g., src/components/App.tsx) — source maps resolve automatically\",\n ),\n line: z.number().describe(\"Line number (1-based) in the original source file\"),\n condition: z\n .string()\n .optional()\n .describe(\"JavaScript condition expression — breakpoint only triggers when truthy\"),\n },\n async ({ file, line, condition }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const breakpointId = await clientOrErr.setBreakpoint(file, line, condition);\n const condStr = condition ? ` (condition: ${condition})` : \"\";\n const sourceMapNote =\n clientOrErr.hasSourceMaps() === false\n ? \"\\n⚠️ Source maps not detected — breakpoints will reference bundled code.\"\n : \"\";\n return textResult(\n `Client breakpoint set: ${file}:${line}${condStr}\\nBreakpoint ID: ${breakpointId}${sourceMapNote}`,\n );\n } catch (error) {\n return textResult(`Failed to set client breakpoint: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_remove_client_breakpoint\",\n \"Remove a previously set client-side breakpoint by its ID.\",\n {\n breakpointId: z\n .string()\n .describe(\"The breakpoint ID returned by debug_set_client_breakpoint\"),\n },\n async ({ breakpointId }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n await clientOrErr.removeBreakpoint(breakpointId);\n return textResult(`Client breakpoint ${breakpointId} removed.`);\n } catch (error) {\n return textResult(`Failed to remove client breakpoint: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_list_client_breakpoints\",\n \"List all active client-side breakpoints with their file, line, and condition.\",\n {},\n // oxlint-disable-next-line require-await\n async () => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const breakpoints = clientOrErr.listBreakpoints();\n if (breakpoints.length === 0) {\n return textResult(\"No client breakpoints set.\");\n }\n return textResult(JSON.stringify(breakpoints, null, 2));\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\n// ── Inspection Tools ────────────────────────────────────────────────────\n\nfunction buildClientInspectionTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_inspect_client_paused\",\n \"When the client-side debugger is paused at a breakpoint, returns the call stack and local variables. Includes React component state, props, and hooks when paused inside a component.\",\n {},\n async () => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const queuedHits = manager.drainClientBreakpointHitQueue();\n\n if (!clientOrErr.isPaused()) {\n if (queuedHits.length > 0) {\n return textResult(\n `Client debugger was paused but has since resumed. Recent breakpoint hits:\\n${JSON.stringify(queuedHits, null, 2)}`,\n );\n }\n return textResult(\n \"Client debugger is not currently paused. Set client breakpoints and trigger the code path in the browser to pause execution.\",\n );\n }\n\n try {\n const callStack = clientOrErr.getCallStack();\n const topFrame = callStack[0];\n let variables: { name: string; type: string; value: string }[] = [];\n\n if (topFrame) {\n try {\n variables = await clientOrErr.getScopeVariables(topFrame.callFrameId);\n } catch {\n // Scope inspection can fail for some frames\n }\n }\n\n const result = {\n side: \"client\",\n reason: clientOrErr.getPausedState()?.reason,\n hitBreakpoints: clientOrErr.getPausedState()?.hitBreakpoints,\n callStack,\n localVariables: variables,\n };\n\n return textResult(JSON.stringify(result, null, 2));\n } catch (error) {\n return textResult(`Failed to inspect client paused state: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n\n defineTool(\n \"debug_evaluate_client\",\n \"Evaluate a JavaScript expression in the client-side browser context. When paused at a client breakpoint, evaluates in the paused scope. Can access DOM, window, React internals, etc.\",\n {\n expression: z.string().describe(\"JavaScript expression to evaluate in the browser context\"),\n frameIndex: z\n .number()\n .optional()\n .describe(\"Call stack frame index (0 = top frame). Defaults to the top frame.\"),\n },\n async ({ expression, frameIndex }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n let callFrameId: string | undefined;\n\n if (clientOrErr.isPaused()) {\n const callStack = clientOrErr.getCallStack();\n const frame = callStack[frameIndex ?? 0];\n callFrameId = frame?.callFrameId;\n }\n\n const result = await clientOrErr.evaluate(expression, callFrameId);\n return textResult(`(${result.type}) ${result.value}`);\n } catch (error) {\n return textResult(`Client evaluation failed: ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\n// ── Execution Control Tools ─────────────────────────────────────────────\n\nfunction buildClientExecutionTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_continue_client\",\n \"Resume client-side execution after the browser debugger has paused at a breakpoint.\",\n {},\n async () => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n if (!clientOrErr.isPaused()) {\n return textResult(\"Client debugger is not paused.\");\n }\n\n try {\n await clientOrErr.resume();\n return textResult(\"Client execution resumed.\");\n } catch (error) {\n return textResult(`Failed to resume client: ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\n// ── Page Interaction Tools ──────────────────────────────────────────────\n\nfunction buildClientInteractionTools(manager: DebugManager) {\n return [\n defineTool(\n \"debug_client_screenshot\",\n \"Take a screenshot of the current page state in the headless browser. Returns the image as base64-encoded PNG.\",\n {},\n async () => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n const base64 = await clientOrErr.screenshot();\n return {\n content: [\n imageBlock(base64, \"image/png\"),\n {\n type: \"text\" as const,\n text: `Screenshot captured (${clientOrErr.getCurrentUrl()})`,\n },\n ],\n };\n } catch (error) {\n return textResult(`Failed to capture screenshot: ${formatError(error)}`);\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n\n defineTool(\n \"debug_navigate_client\",\n \"Navigate the headless browser to a specific URL. Use this to reproduce specific flows or visit different pages.\",\n {\n url: z.string().describe(\"URL to navigate to (e.g., http://localhost:3000/dashboard)\"),\n },\n async ({ url }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n await clientOrErr.navigate(url);\n return textResult(`Navigated to: ${clientOrErr.getCurrentUrl()}`);\n } catch (error) {\n return textResult(`Failed to navigate: ${formatError(error)}`);\n }\n },\n ),\n\n defineTool(\n \"debug_click_client\",\n \"Click an element on the page in the headless browser. Use CSS selectors to target elements. Useful for reproducing bugs by interacting with the UI programmatically.\",\n {\n selector: z\n .string()\n .describe(\n \"CSS selector of the element to click (e.g., 'button.submit', '#login-form input[type=submit]')\",\n ),\n },\n async ({ selector }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n try {\n await clientOrErr.click(selector);\n return textResult(`Clicked: ${selector}`);\n } catch (error) {\n return textResult(`Failed to click \"${selector}\": ${formatError(error)}`);\n }\n },\n ),\n ];\n}\n\n// ── Passive Capture Tools ───────────────────────────────────────────────\n\nfunction buildClientConsoleTool(manager: DebugManager) {\n return defineTool(\n \"debug_get_client_console\",\n \"Get console messages captured from the headless browser. Includes console.log, warn, error, etc.\",\n {\n level: z\n .string()\n .optional()\n .describe(\"Filter by console level: log, warn, error, info, debug\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of recent messages to return (default: all)\"),\n },\n // oxlint-disable-next-line require-await\n async ({ level, limit }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const messages = clientOrErr.getConsoleMessages(level, limit);\n if (messages.length === 0) {\n const filterDesc = level ? ` (level: ${level})` : \"\";\n return textResult(`No console messages captured${filterDesc}.`);\n }\n\n const formatted = messages\n .map((m) => {\n const time = new Date(m.timestamp).toLocaleTimeString(\"en-US\", { hour12: false });\n const loc = m.url ? ` [${m.url}${m.line ? `:${m.line}` : \"\"}]` : \"\";\n return `[${time}] ${m.level.toUpperCase()}: ${m.text}${loc}`;\n })\n .join(\"\\n\");\n\n return textResult(`${messages.length} console message(s):\\n${formatted}`);\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildClientNetworkTool(manager: DebugManager) {\n return defineTool(\n \"debug_get_client_network\",\n \"Get network requests captured from the headless browser. Shows URLs, methods, status codes, and timing.\",\n {\n filter: z.string().optional().describe(\"Regex pattern to filter requests by URL\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of recent requests to return (default: all)\"),\n },\n // oxlint-disable-next-line require-await\n async ({ filter, limit }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const requests = clientOrErr.getNetworkRequests(filter, limit);\n if (requests.length === 0) {\n const filterDesc = filter ? ` matching \"${filter}\"` : \"\";\n return textResult(`No network requests captured${filterDesc}.`);\n }\n\n const formatted = requests\n .map((r) => {\n const time = new Date(r.timestamp).toLocaleTimeString(\"en-US\", { hour12: false });\n const status = r.status ? ` → ${r.status}` : \" → (pending)\";\n const dur = r.duration ? ` (${r.duration}ms)` : \"\";\n return `[${time}] ${r.method} ${r.url}${status}${dur}`;\n })\n .join(\"\\n\");\n\n return textResult(`${requests.length} network request(s):\\n${formatted}`);\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildClientErrorsTool(manager: DebugManager) {\n return defineTool(\n \"debug_get_client_errors\",\n \"Get uncaught errors captured from the headless browser. Includes error messages and source-mapped stack traces.\",\n {\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of recent errors to return (default: all)\"),\n },\n // oxlint-disable-next-line require-await\n async ({ limit }) => {\n const clientOrErr = requirePlaywrightClient(manager);\n if (typeof clientOrErr === \"string\") return textResult(clientOrErr);\n\n const errors = clientOrErr.getPageErrors(limit);\n if (errors.length === 0) {\n return textResult(\"No uncaught page errors captured.\");\n }\n\n const formatted = errors\n .map((e) => {\n const time = new Date(e.timestamp).toLocaleTimeString(\"en-US\", { hour12: false });\n const stack = e.stack ? `\\n ${e.stack.split(\"\\n\").slice(0, 5).join(\"\\n \")}` : \"\";\n return `[${time}] ${e.message}${stack}`;\n })\n .join(\"\\n\\n\");\n\n return textResult(`${errors.length} page error(s):\\n${formatted}`);\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildClientCaptureTools(manager: DebugManager) {\n return [\n buildClientConsoleTool(manager),\n buildClientNetworkTool(manager),\n buildClientErrorsTool(manager),\n ];\n}\n\n// ── Export ───────────────────────────────────────────────────────────────\n\nexport function buildClientDebugTools(manager: DebugManager) {\n return [\n ...buildClientBreakpointTools(manager),\n ...buildClientInspectionTools(manager),\n ...buildClientExecutionTools(manager),\n ...buildClientInteractionTools(manager),\n ...buildClientCaptureTools(manager),\n ];\n}\n","import type { AgentHarness, HarnessToolDefinition } from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport type { AgentRunnerConfig } from \"../types.js\";\nimport type { AgentMode, TaskContext } from \"@project/shared\";\nimport {\n buildCommonTools,\n buildForceUpdateTaskStatusTool,\n buildReadTaskChatTool,\n buildGetTaskPlanTool,\n buildGetTaskTool,\n buildGetTaskFileTool,\n buildListTaskFilesTool,\n buildGetTaskCliTool,\n} from \"./common-tools.js\";\nimport { buildPmTools, buildUpdateTaskTool } from \"./pm-tools.js\";\nimport { buildDiscoveryTools } from \"./discovery-tools.js\";\nimport { buildCodeReviewTools } from \"./code-review-tools.js\";\nimport { buildDebugTools } from \"./debug-tools.js\";\nimport type { DebugManager } from \"../debug/debug-manager.js\";\n\n// Re-export helpers\nexport { textResult, imageBlock } from \"./helpers.js\";\n\n// ── Mode-based tool selection ─────────────────────────────────────────\n\nfunction getTaskModeTools(agentMode: AgentMode | undefined, connection: AgentConnection) {\n if (agentMode === \"discovery\" || agentMode === \"auto\") {\n return [buildUpdateTaskTool(connection)];\n }\n return [];\n}\n\nfunction getModeTools(\n agentMode: AgentMode | undefined,\n connection: AgentConnection,\n config: AgentRunnerConfig,\n context?: TaskContext,\n) {\n if (config.mode === \"task\") return getTaskModeTools(agentMode, connection);\n\n switch (agentMode) {\n case \"building\":\n return context?.isParentTask ? buildPmTools(connection, { includePackTools: true }) : [];\n case \"review\":\n case \"auto\":\n case \"discovery\":\n case \"help\":\n return buildPmTools(connection, {\n includePackTools: !!context?.isParentTask,\n });\n default:\n return config.mode === \"pm\" ? buildPmTools(connection, { includePackTools: false }) : [];\n }\n}\n\n// ── Tool assembly ─────────────────────────────────────────────────────\n\n/** Collect all tools for the current mode as harness-neutral definitions. */\nexport function buildConveyorTools(\n connection: AgentConnection,\n config: AgentRunnerConfig,\n context?: TaskContext,\n agentMode?: AgentMode,\n debugManager?: DebugManager,\n): HarnessToolDefinition[] {\n const effectiveMode = agentMode ?? context?.agentMode ?? undefined;\n\n // Code-review mode: minimal read-only set + specialized review tools\n if (effectiveMode === \"code-review\") {\n return [\n buildReadTaskChatTool(connection),\n buildGetTaskPlanTool(connection),\n buildGetTaskTool(connection),\n buildGetTaskCliTool(connection),\n buildListTaskFilesTool(connection),\n buildGetTaskFileTool(connection),\n ...buildCodeReviewTools(connection),\n ];\n }\n\n const commonTools = buildCommonTools(connection, config);\n const modeTools = getModeTools(effectiveMode, connection, config, context);\n\n const discoveryTools =\n effectiveMode === \"discovery\" || effectiveMode === \"auto\"\n ? buildDiscoveryTools(connection)\n : [];\n\n const emergencyTools = [buildForceUpdateTaskStatusTool(connection)];\n\n // Debug tools only available in building mode\n const debugTools =\n debugManager && effectiveMode === \"building\" ? buildDebugTools(debugManager) : [];\n\n return [...commonTools, ...modeTools, ...discoveryTools, ...emergencyTools, ...debugTools];\n}\n\n// ── MCP server factory ────────────────────────────────────────────────\n\n// oxlint-disable-next-line typescript/explicit-function-return-type\nexport function createConveyorMcpServer(\n harness: AgentHarness,\n connection: AgentConnection,\n config: AgentRunnerConfig,\n context?: TaskContext,\n agentMode?: AgentMode,\n debugManager?: DebugManager,\n) {\n return harness.createMcpServer({\n name: \"conveyor\",\n tools: buildConveyorTools(connection, config, context, agentMode, debugManager),\n });\n}\n","import type {\n HarnessAssistantEvent,\n HarnessResultEvent,\n HarnessResultSuccessEvent,\n HarnessResultErrorEvent,\n HarnessSystemInitEvent,\n HarnessCompactBoundaryEvent,\n HarnessTaskStartedEvent,\n HarnessTaskProgressEvent,\n HarnessRateLimitEvent,\n} from \"../harness/index.js\";\nimport type { TaskContext, ActivityEventSummary } from \"@project/shared\";\nimport type { QueryHost } from \"./query-executor.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"event-handlers\");\n\nfunction safeVoid(promise: void | Promise<unknown>, context: string): void {\n if (promise && typeof (promise as Promise<unknown>).catch === \"function\") {\n (promise as Promise<unknown>).catch((err) => {\n process.stderr.write(`[safeVoid] ${context}: ${err}\\n`);\n });\n }\n}\n\nexport type UsageInfo = {\n input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n};\n\n/** Convert a resetsAt value (epoch seconds, epoch ms, or ISO string) to an ISO string. */\nfunction epochSecondsToISO(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (typeof value !== \"number\" || value <= 0) return undefined;\n // Heuristic: epoch seconds for dates after 2000 are < 1e12; milliseconds are >= 1e12\n const ms = value < 1e12 ? value * 1000 : value;\n return new Date(ms).toISOString();\n}\n\nexport async function processAssistantEvent(\n event: HarnessAssistantEvent,\n host: QueryHost,\n turnToolCalls: ActivityEventSummary[],\n): Promise<void> {\n const { content } = event.message;\n const turnTextParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"text\" && block.text) {\n turnTextParts.push(block.text);\n host.connection.sendEvent({ type: \"message\", content: block.text });\n await host.callbacks.onEvent({ type: \"message\", content: block.text });\n } else if (block.type === \"tool_use\" && block.name) {\n const inputStr = typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n const isContentTool = [\"edit\", \"write\"].includes(block.name.toLowerCase());\n const inputLimit = isContentTool ? 10_000 : 500;\n const summary: ActivityEventSummary = {\n tool: block.name,\n input: inputStr.slice(0, inputLimit),\n timestamp: new Date().toISOString(),\n };\n turnToolCalls.push(summary);\n host.connection.sendEvent({ type: \"tool_use\", tool: block.name, input: inputStr });\n await host.callbacks.onEvent({ type: \"tool_use\", tool: block.name, input: inputStr });\n }\n }\n\n if (turnTextParts.length > 0) {\n host.connection.postChatMessage(turnTextParts.join(\"\\n\\n\"));\n }\n}\n\nconst API_ERROR_PATTERN = /API Error: [45]\\d\\d/;\nconst IMAGE_ERROR_PATTERN = /Could not process image/i;\nconst AUTH_ERROR_PATTERN =\n /Not logged in|Please run \\/login|authentication failed|invalid.*token|unauthorized/i;\n\nexport function isAuthError(msg: string): boolean {\n return AUTH_ERROR_PATTERN.test(msg);\n}\n\nfunction isRetriableMessage(msg: string): boolean {\n if (IMAGE_ERROR_PATTERN.test(msg)) return true;\n if (API_ERROR_PATTERN.test(msg)) return true;\n return false;\n}\n\nfunction aggregateModelUsage(modelUsage: Record<string, unknown>): {\n queryInputTokens: number;\n contextWindow: number;\n totalInputTokens: number;\n totalCacheRead: number;\n totalCacheCreation: number;\n} {\n let queryInputTokens = 0;\n let contextWindow = 0;\n let totalInputTokens = 0;\n let totalCacheRead = 0;\n let totalCacheCreation = 0;\n for (const data of Object.values(modelUsage)) {\n const d = data as {\n inputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n };\n const input = d.inputTokens ?? 0;\n const cacheRead = d.cacheReadInputTokens ?? 0;\n const cacheCreation = d.cacheCreationInputTokens ?? 0;\n totalInputTokens += input;\n totalCacheRead += cacheRead;\n totalCacheCreation += cacheCreation;\n queryInputTokens += input + cacheRead + cacheCreation;\n const cw = (data as { contextWindow?: number }).contextWindow ?? 0;\n if (cw > contextWindow) contextWindow = cw;\n }\n return { queryInputTokens, contextWindow, totalInputTokens, totalCacheRead, totalCacheCreation };\n}\n\nfunction emitContextUpdate(\n modelUsage: Record<string, unknown>,\n host: QueryHost,\n context: TaskContext,\n lastAssistantUsage?: UsageInfo,\n): void {\n const usage = aggregateModelUsage(modelUsage);\n let { contextWindow } = usage;\n\n // Override contextWindow when 1M beta is enabled but SDK reports ≤200K\n const settings = context.agentSettings ?? host.config.agentSettings ?? {};\n const has1mBeta = (settings.betas as string[] | undefined)?.includes(\"context-1m-2025-08-07\");\n if (has1mBeta && contextWindow > 0 && contextWindow <= 200_000) {\n contextWindow = 1_000_000;\n }\n\n if (contextWindow > 0) {\n // Current context fill = last API call's input tokens (per-call, not cumulative)\n const currentContextTokens = lastAssistantUsage\n ? (lastAssistantUsage.input_tokens ?? 0) +\n (lastAssistantUsage.cache_read_input_tokens ?? 0) +\n (lastAssistantUsage.cache_creation_input_tokens ?? 0)\n : usage.queryInputTokens;\n\n host.connection.sendEvent({\n type: \"context_update\",\n contextTokens: currentContextTokens,\n contextWindow,\n inputTokens: usage.totalInputTokens,\n cacheReadInputTokens: usage.totalCacheRead,\n cacheCreationInputTokens: usage.totalCacheCreation,\n totalTokensUsed: usage.queryInputTokens,\n });\n }\n}\n\nfunction trackCostSpending(host: QueryHost, context: TaskContext, cumulativeTotal: number): void {\n if (cumulativeTotal > 0 && context.agentId && context._runnerSessionId) {\n const breakdown = host.costTracker.modelBreakdown;\n host.connection.trackSpending({\n agentId: context.agentId,\n sessionId: context._runnerSessionId,\n totalCostUsd: cumulativeTotal,\n onSubscription: host.config.mode === \"pm\" || !!process.env.CLAUDE_CODE_OAUTH_TOKEN,\n modelUsage: breakdown.length > 0 ? breakdown : undefined,\n });\n }\n}\n\nfunction handleSuccessResult(\n event: HarnessResultSuccessEvent,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): { totalCostUsd: number; retriable: boolean } {\n const durationMs = Date.now() - startTime;\n const summary = event.result || \"Task completed.\";\n const retriable = isRetriableMessage(summary);\n\n const cumulativeTotal = host.costTracker.addQueryCost(event.total_cost_usd);\n\n const { modelUsage } = event;\n if (modelUsage && typeof modelUsage === \"object\") {\n host.costTracker.addModelUsage(\n modelUsage as Parameters<typeof host.costTracker.addModelUsage>[0],\n );\n }\n\n host.connection.sendEvent({ type: \"completed\", summary, costUsd: cumulativeTotal, durationMs });\n\n if (modelUsage && typeof modelUsage === \"object\") {\n emitContextUpdate(modelUsage as Record<string, unknown>, host, context, lastAssistantUsage);\n }\n\n trackCostSpending(host, context, cumulativeTotal);\n\n return { totalCostUsd: cumulativeTotal, retriable };\n}\n\nfunction handleErrorResult(\n event: HarnessResultErrorEvent,\n host: QueryHost,\n): { retriable: boolean; staleSession?: boolean; authError?: boolean } {\n const errorMsg =\n event.errors.length > 0 ? event.errors.join(\", \") : `Agent stopped: ${event.subtype}`;\n\n // Check for stale session error pattern\n const isStaleSession = errorMsg.includes(\"No conversation found with session ID\");\n\n if (isStaleSession) {\n // Suppress the error event for stale session - this will be handled by session recovery\n return { retriable: false, staleSession: true };\n }\n\n // Check for auth error pattern — will be handled by auth recovery\n if (isAuthError(errorMsg)) {\n host.connection.sendEvent({ type: \"error\", message: errorMsg });\n return { retriable: false, authError: true };\n }\n\n const retriable = isRetriableMessage(errorMsg);\n host.connection.sendEvent({ type: \"error\", message: errorMsg });\n return { retriable };\n}\n\nfunction handleResultEvent(\n event: HarnessResultEvent,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): {\n totalCostUsd: number;\n retriable: boolean;\n resultSummary?: string;\n staleSession?: boolean;\n authError?: boolean;\n} {\n const resultSummary =\n event.subtype === \"success\"\n ? (event as HarnessResultSuccessEvent).result\n : (event as HarnessResultErrorEvent).errors.join(\", \");\n\n if (event.subtype === \"success\") {\n const result = handleSuccessResult(\n event as HarnessResultSuccessEvent,\n host,\n context,\n startTime,\n lastAssistantUsage,\n );\n return { ...result, resultSummary };\n }\n\n const result = handleErrorResult(event as HarnessResultErrorEvent, host);\n return { totalCostUsd: 0, ...result, resultSummary };\n}\n\nexport async function emitResultEvent(\n event: HarnessResultEvent,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): Promise<{\n retriable: boolean;\n resultSummary?: string;\n staleSession?: boolean;\n authError?: boolean;\n}> {\n const result = handleResultEvent(event, host, context, startTime, lastAssistantUsage);\n const durationMs = Date.now() - startTime;\n\n if (event.subtype === \"success\") {\n const successEvent = event as HarnessResultSuccessEvent;\n const summary = successEvent.result || \"Task completed.\";\n await host.callbacks.onEvent({\n type: \"completed\",\n summary,\n costUsd: result.totalCostUsd,\n durationMs,\n });\n } else if (!result.staleSession) {\n // Only emit error event if it's not a stale session (which is handled by recovery logic)\n const errorEvent = event as HarnessResultErrorEvent;\n const errorMsg =\n errorEvent.errors.length > 0\n ? errorEvent.errors.join(\", \")\n : `Agent stopped: ${errorEvent.subtype}`;\n await host.callbacks.onEvent({ type: \"error\", message: errorMsg });\n }\n\n return {\n retriable: result.retriable,\n resultSummary: result.resultSummary,\n staleSession: result.staleSession,\n authError: result.authError,\n };\n}\n\nexport function handleRateLimitEvent(\n event: HarnessRateLimitEvent,\n host: QueryHost,\n): string | undefined {\n const { rate_limit_info } = event;\n logger.info(\"Rate limit event received\", { rate_limit_info });\n const status = rate_limit_info.status;\n\n // Send structured rate limit update for persistence\n // On rejection without explicit utilization, default to 1.0 (fully consumed)\n const utilization = rate_limit_info.utilization ?? (status === \"rejected\" ? 1.0 : undefined);\n if (utilization !== undefined && rate_limit_info.rateLimitType) {\n host.connection.sendEvent({\n type: \"rate_limit_update\",\n rateLimitType: rate_limit_info.rateLimitType,\n utilization,\n status,\n });\n }\n\n if (status === \"rejected\") {\n const resetsAt = epochSecondsToISO(rate_limit_info.resetsAt);\n const resetsAtDisplay = resetsAt ?? \"unknown\";\n const message = `Rate limit rejected (type: ${rate_limit_info.rateLimitType ?? \"unknown\"}, resets at: ${resetsAtDisplay})`;\n host.connection.sendEvent({ type: \"error\", message });\n safeVoid(host.callbacks.onEvent({ type: \"error\", message }), \"rateLimitRejected\");\n return resetsAt;\n } else if (status === \"allowed_warning\") {\n const utilizationLabel = rate_limit_info.utilization\n ? `${Math.round(rate_limit_info.utilization * 100)}%`\n : \"high\";\n const message = `Rate limit warning: ${utilizationLabel} utilization (type: ${rate_limit_info.rateLimitType ?? \"unknown\"})`;\n host.connection.sendEvent({ type: \"thinking\", message });\n safeVoid(host.callbacks.onEvent({ type: \"thinking\", message }), \"rateLimitWarning\");\n }\n return undefined;\n}\n\nexport async function handleSystemEvent(\n event: HarnessSystemInitEvent,\n host: QueryHost,\n context: TaskContext,\n sessionIdStored: boolean,\n): Promise<boolean> {\n if (event.subtype !== \"init\") return false;\n if (event.session_id && !sessionIdStored) {\n host.connection.storeSessionId(event.session_id);\n context.claudeSessionId = event.session_id;\n }\n await host.callbacks.onEvent({\n type: \"thinking\",\n message: `Agent initialized (model: ${event.model})`,\n });\n return !!(event.session_id && !sessionIdStored);\n}\n\nexport function handleSystemSubevents(\n systemEvent: HarnessCompactBoundaryEvent | HarnessTaskStartedEvent | HarnessTaskProgressEvent,\n host: QueryHost,\n): void {\n if (systemEvent.subtype === \"compact_boundary\") {\n safeVoid(\n host.callbacks.onEvent({\n type: \"context_compacted\",\n trigger: systemEvent.compact_metadata.trigger,\n preTokens: systemEvent.compact_metadata.pre_tokens,\n }),\n \"compactBoundary\",\n );\n } else if (systemEvent.subtype === \"task_started\") {\n safeVoid(\n host.callbacks.onEvent({\n type: \"subagent_started\",\n sdkTaskId: systemEvent.task_id,\n description: systemEvent.description,\n }),\n \"taskStarted\",\n );\n } else if (systemEvent.subtype === \"task_progress\") {\n safeVoid(\n host.callbacks.onEvent({\n type: \"subagent_progress\",\n sdkTaskId: systemEvent.task_id,\n description: systemEvent.description,\n toolUses: systemEvent.usage?.tool_uses ?? 0,\n durationMs: systemEvent.usage?.duration_ms ?? 0,\n }),\n \"taskProgress\",\n );\n }\n}\n\nexport function handleToolProgressEvent(event: unknown, host: QueryHost): void {\n const msg = event as { tool_name?: string; elapsed_time_seconds?: number };\n safeVoid(\n host.callbacks.onEvent({\n type: \"tool_progress\",\n toolName: msg.tool_name ?? \"\",\n elapsedSeconds: msg.elapsed_time_seconds ?? 0,\n }),\n \"toolProgress\",\n );\n}\n\nexport async function handleAssistantCase(\n event: HarnessAssistantEvent,\n host: QueryHost,\n turnToolCalls: ActivityEventSummary[],\n): Promise<UsageInfo | undefined> {\n await processAssistantEvent(event, host, turnToolCalls);\n const msgUsage = (event.message as { usage?: UsageInfo }).usage;\n return msgUsage ?? undefined;\n}\n\nexport async function handleResultCase(\n event: HarnessResultEvent,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n isTyping: boolean,\n lastAssistantUsage: UsageInfo | undefined,\n): Promise<{\n retriable: boolean;\n resultSummary?: string;\n staleSession?: boolean;\n authError?: boolean;\n stoppedTyping: boolean;\n}> {\n let stoppedTyping = false;\n if (isTyping) {\n host.connection.sendTypingStop();\n stoppedTyping = true;\n }\n const resultInfo = await emitResultEvent(event, host, context, startTime, lastAssistantUsage);\n return {\n retriable: resultInfo.retriable,\n resultSummary: resultInfo.resultSummary,\n staleSession: resultInfo.staleSession,\n authError: resultInfo.authError,\n stoppedTyping,\n };\n}\n","import type {\n HarnessEvent,\n HarnessAssistantEvent,\n HarnessResultEvent,\n HarnessSystemInitEvent,\n HarnessCompactBoundaryEvent,\n HarnessTaskStartedEvent,\n HarnessTaskProgressEvent,\n HarnessRateLimitEvent,\n} from \"../harness/index.js\";\nimport type { TaskContext, ActivityEventSummary } from \"@project/shared\";\nimport type { QueryHost } from \"./query-executor.js\";\nimport type { UsageInfo } from \"./event-handlers.js\";\nimport {\n handleAssistantCase,\n handleResultCase,\n handleRateLimitEvent,\n handleSystemEvent,\n handleSystemSubevents,\n handleToolProgressEvent,\n} from \"./event-handlers.js\";\n\nconst API_ERROR_PATTERN = /API Error: [45]\\d\\d/;\n\n/** Mutable state bag threaded through the event loop. */\ninterface EventLoopState {\n sessionIdStored: boolean;\n isTyping: boolean;\n retriable: boolean;\n sawApiError: boolean;\n resultSummary: string | undefined;\n rateLimitResetsAt: string | undefined;\n staleSession: boolean | undefined;\n authError: boolean | undefined;\n lastAssistantUsage: UsageInfo | undefined;\n turnToolCalls: ActivityEventSummary[];\n}\n\nfunction stopTypingIfNeeded(host: QueryHost, isTyping: boolean): void {\n if (isTyping) host.connection.sendTypingStop();\n}\n\n/** Merge pending tool outputs into accumulated tool call summaries and emit turn_end. */\nfunction flushPendingToolCalls(host: QueryHost, turnToolCalls: ActivityEventSummary[]): void {\n if (turnToolCalls.length === 0) return;\n for (let i = 0; i < turnToolCalls.length; i++) {\n if (i < host.pendingToolOutputs.length) {\n turnToolCalls[i].output = host.pendingToolOutputs[i];\n }\n }\n host.connection.sendEvent({ type: \"turn_end\", toolCalls: [...turnToolCalls] });\n turnToolCalls.length = 0;\n host.pendingToolOutputs.length = 0;\n}\n\nasync function processSystemCase(\n event:\n | HarnessSystemInitEvent\n | HarnessCompactBoundaryEvent\n | HarnessTaskStartedEvent\n | HarnessTaskProgressEvent,\n host: QueryHost,\n context: TaskContext,\n state: EventLoopState,\n): Promise<void> {\n if (event.subtype === \"init\") {\n const stored = await handleSystemEvent(event, host, context, state.sessionIdStored);\n if (stored) state.sessionIdStored = true;\n } else {\n handleSystemSubevents(\n event as HarnessCompactBoundaryEvent | HarnessTaskStartedEvent | HarnessTaskProgressEvent,\n host,\n );\n }\n}\n\nasync function processAssistantCase(\n event: HarnessAssistantEvent,\n host: QueryHost,\n state: EventLoopState,\n): Promise<void> {\n if (!state.isTyping) {\n setTimeout(() => host.connection.sendTypingStart(), 200);\n state.isTyping = true;\n }\n const usage = await handleAssistantCase(event, host, state.turnToolCalls);\n if (usage) state.lastAssistantUsage = usage;\n\n // Check for API error patterns in assistant message text.\n // The SDK may emit API errors as assistant message content before ending\n // with a clean success result, which would bypass the result-level retry check.\n if (!state.sawApiError) {\n const fullText = event.message.content\n .filter((b: { type: string }) => b.type === \"text\")\n .map((b: { type: string; text?: string }) => (b as { text: string }).text)\n .join(\" \");\n if (API_ERROR_PATTERN.test(fullText)) {\n state.sawApiError = true;\n }\n }\n}\n\nasync function processResultCase(\n event: HarnessResultEvent,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n state: EventLoopState,\n): Promise<void> {\n const info = await handleResultCase(\n event,\n host,\n context,\n startTime,\n state.isTyping,\n state.lastAssistantUsage,\n );\n if (info.stoppedTyping) state.isTyping = false;\n state.retriable = info.retriable;\n // If the result itself is clean (not retriable), any API error the agent\n // mentioned in assistant text was already recovered from — don't retry.\n if (!info.retriable) state.sawApiError = false;\n state.resultSummary = info.resultSummary;\n if (info.staleSession) state.staleSession = true;\n if (info.authError) state.authError = true;\n}\n\nexport async function processEvents(\n events: AsyncGenerator<HarnessEvent, void>,\n context: TaskContext,\n host: QueryHost,\n): Promise<{\n retriable: boolean;\n resultSummary?: string;\n modeRestart?: boolean;\n rateLimitResetsAt?: string;\n staleSession?: boolean;\n authError?: boolean;\n}> {\n const startTime = Date.now();\n let lastStatusEmit = Date.now();\n const STATUS_REEMIT_INTERVAL_MS = 5_000;\n\n const state: EventLoopState = {\n sessionIdStored: false,\n isTyping: false,\n retriable: false,\n sawApiError: false,\n resultSummary: undefined,\n rateLimitResetsAt: undefined,\n staleSession: undefined,\n authError: undefined,\n lastAssistantUsage: undefined,\n turnToolCalls: [],\n };\n\n for await (const event of events) {\n if (host.isStopped()) break;\n\n // Flush any pending tool calls from the previous assistant turn\n // (tool outputs have been collected by PostToolUse hooks between events)\n flushPendingToolCalls(host, state.turnToolCalls);\n\n // Re-emit \"running\" periodically so missed status events self-correct\n const now = Date.now();\n if (now - lastStatusEmit >= STATUS_REEMIT_INTERVAL_MS) {\n host.connection.emitStatus(\"running\");\n lastStatusEmit = now;\n }\n\n if (host.pendingModeRestart) {\n stopTypingIfNeeded(host, state.isTyping);\n return { retriable: false, modeRestart: true };\n }\n\n switch (event.type) {\n case \"system\":\n await processSystemCase(event as HarnessSystemInitEvent, host, context, state);\n break;\n case \"assistant\":\n await processAssistantCase(event as HarnessAssistantEvent, host, state);\n break;\n case \"result\":\n await processResultCase(event as HarnessResultEvent, host, context, startTime, state);\n break;\n case \"rate_limit_event\": {\n const resetsAt = handleRateLimitEvent(event as HarnessRateLimitEvent, host);\n if (resetsAt) state.rateLimitResetsAt = resetsAt;\n break;\n }\n case \"tool_progress\":\n handleToolProgressEvent(event, host);\n break;\n }\n }\n\n flushPendingToolCalls(host, state.turnToolCalls);\n stopTypingIfNeeded(host, state.isTyping);\n\n return {\n retriable: state.retriable || state.sawApiError,\n resultSummary: state.resultSummary,\n rateLimitResetsAt: state.rateLimitResetsAt,\n ...(state.staleSession && { staleSession: state.staleSession }),\n ...(state.authError && { authError: state.authError }),\n };\n}\n","/**\n * Shared utility for checking missing task properties.\n * Used by both ExitPlanMode validation and post-PR backfill nudge.\n */\n\nexport function collectMissingProps(taskProps: {\n plan?: string | null;\n storyPointId?: string | null;\n title?: string | null;\n}): string[] {\n const missing: string[] = [];\n if (!taskProps.plan?.trim()) missing.push(\"plan (save via update_task)\");\n if (!taskProps.storyPointId) missing.push(\"story points (use update_task_properties)\");\n if (!taskProps.title || taskProps.title === \"Untitled\")\n missing.push(\"title (use update_task_properties)\");\n return missing;\n}\n","import type { QueryHost } from \"./query-executor.js\";\nimport { collectMissingProps } from \"./task-property-utils.js\";\n\nconst PM_PLAN_FILE_TOOLS = new Set([\"Write\", \"Edit\", \"MultiEdit\"]);\nconst DESTRUCTIVE_CMD_PATTERN =\n /git\\s+push\\s+--force(?!\\s*-with-lease)|git\\s+reset\\s+--hard|rm\\s+-rf\\s+\\//;\nconst CODE_REVIEW_WRITE_CMD_PATTERN =\n /git\\s+push|git\\s+commit|git\\s+add|rm\\s+|mv\\s+|cp\\s+|mkdir\\s+|touch\\s+|chmod\\s+|chown\\s+/;\n\n// Commands that need at least \"light\" tier resources to avoid OOM/eviction\nconst RESOURCE_HEAVY_PATTERNS = [\n /\\bbun\\s+(install|i|add)\\b/,\n /\\bnpm\\s+(install|ci|i)\\b/,\n /\\byarn(\\s+install)?\\s/,\n /\\bpnpm\\s+(install|i|add)\\b/,\n /\\bpip\\s+install\\b/,\n /\\bcargo\\s+build\\b/,\n];\n\ntype ToolResult =\n | { behavior: \"allow\"; updatedInput?: Record<string, unknown> }\n | { behavior: \"deny\"; message: string };\n\nfunction isPlanFile(input: Record<string, unknown>): boolean {\n const filePath = String(input.file_path ?? input.path ?? \"\");\n return filePath.includes(\".claude/plans/\");\n}\n\nfunction handleDiscoveryToolAccess(toolName: string, input: Record<string, unknown>): ToolResult {\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n if (isPlanFile(input)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n return {\n behavior: \"deny\",\n message: \"Discovery mode is read-only. File writes are restricted to plan files.\",\n };\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleBuildingToolAccess(toolName: string, input: Record<string, unknown>): ToolResult {\n if (toolName === \"Bash\") {\n const cmd = String(input.command ?? \"\");\n if (DESTRUCTIVE_CMD_PATTERN.test(cmd)) {\n return {\n behavior: \"deny\",\n message: \"Destructive operation blocked. Use safer alternatives.\",\n };\n }\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleReviewToolAccess(\n toolName: string,\n input: Record<string, unknown>,\n isParentTask: boolean,\n): ToolResult {\n if (isParentTask) {\n return handleBuildingToolAccess(toolName, input);\n }\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n if (isPlanFile(input)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n return {\n behavior: \"deny\",\n message: \"Review mode restricts file writes. Use bash to run tests and linting instead.\",\n };\n }\n if (toolName === \"Bash\") {\n const cmd = String(input.command ?? \"\");\n if (DESTRUCTIVE_CMD_PATTERN.test(cmd)) {\n return { behavior: \"deny\", message: \"Destructive operation blocked in review mode.\" };\n }\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleCodeReviewToolAccess(toolName: string, input: Record<string, unknown>): ToolResult {\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n return {\n behavior: \"deny\",\n message: \"Code review mode is fully read-only. File writes are not permitted.\",\n };\n }\n if (toolName === \"Bash\") {\n const cmd = String(input.command ?? \"\");\n if (DESTRUCTIVE_CMD_PATTERN.test(cmd) || CODE_REVIEW_WRITE_CMD_PATTERN.test(cmd)) {\n return {\n behavior: \"deny\",\n message:\n \"Code review mode is read-only. Write operations and destructive commands are blocked.\",\n };\n }\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleAutoToolAccess(\n toolName: string,\n input: Record<string, unknown>,\n hasExitedPlanMode: boolean,\n isParentTask: boolean,\n): ToolResult {\n if (hasExitedPlanMode) {\n return isParentTask\n ? handleReviewToolAccess(toolName, input, true)\n : handleBuildingToolAccess(toolName, input);\n }\n // Pre-ExitPlanMode: trust the SDK's native plan mode for restrictions.\n return { behavior: \"allow\", updatedInput: input };\n}\n\nasync function handleExitPlanMode(\n host: QueryHost,\n input: Record<string, unknown>,\n): Promise<ToolResult> {\n if (host.hasExitedPlanMode) {\n return { behavior: \"allow\" as const, updatedInput: input };\n }\n\n host.exitPlanAttempts++;\n\n try {\n // Flush any locally-written plan files to the server before validation.\n // syncPlanFile fires updateTaskFields (fire-and-forget), and Socket.IO\n // guarantees ordering on a single connection, so the update will be\n // processed before the subsequent getTaskProperties request-response.\n host.syncPlanFile();\n\n const taskProps = await host.connection.getTaskProperties();\n const missingProps = collectMissingProps(taskProps);\n\n // Validate subtasks have plans if this is a parent task\n if (host.isParentTask) {\n try {\n const subtasks = await host.connection.call(\"listSubtasks\", {\n sessionId: host.connection.sessionId,\n });\n const subtasksWithoutPlans = subtasks.filter(\n (s: { plan?: string | null; title: string }) => !s.plan?.trim(),\n );\n if (subtasksWithoutPlans.length > 0) {\n const names = subtasksWithoutPlans.map((s: { title: string }) => s.title).join(\", \");\n missingProps.push(\n `subtask plans — these subtasks are missing plans: ${names} (use update_subtask with plan field)`,\n );\n }\n } catch {\n // If we can't list subtasks, skip this validation\n }\n }\n\n if (missingProps.length > 0) {\n if (host.exitPlanAttempts <= 1) {\n // First attempt: deny with details\n return {\n behavior: \"deny\" as const,\n message: [\n \"Cannot exit plan mode yet. Required task properties are missing:\",\n ...missingProps.map((p) => `- ${p}`),\n \"\",\n \"Fill these in using MCP tools, then try ExitPlanMode again.\",\n ].join(\"\\n\"),\n };\n }\n // Second+ attempt: allow through with warning\n host.connection.postChatMessage(\n `⚠️ ExitPlanMode allowed with missing properties: ${missingProps.join(\", \")}. Consider backfilling these later.`,\n );\n }\n\n if (host.agentMode === \"discovery\") {\n // Discovery mode: plan is validated, but do NOT move to Open.\n // The task stays in Planning — the user controls when to identify.\n host.hasExitedPlanMode = true;\n host.connection.postChatMessage(\n \"Plan complete. The task stays in Planning — identify it or switch to Build mode when ready.\",\n );\n host.requestSoftStop();\n return { behavior: \"allow\" as const, updatedInput: input };\n }\n\n await host.connection.triggerIdentification();\n host.connection.updateStatus(\"InProgress\");\n host.hasExitedPlanMode = true;\n\n const newMode = host.isParentTask ? \"review\" : \"building\";\n host.pendingModeRestart = true;\n if (host.onModeTransition) {\n host.onModeTransition(newMode);\n }\n\n return { behavior: \"allow\" as const, updatedInput: input };\n } catch (err) {\n return {\n behavior: \"deny\" as const,\n message: `Identification failed: ${err instanceof Error ? err.message : String(err)}. Fix the issue and try again.`,\n };\n }\n}\n\nasync function handleAskUserQuestion(\n host: QueryHost,\n input: Record<string, unknown>,\n): Promise<ToolResult> {\n const QUESTION_TIMEOUT_MS = 5 * 60 * 1000;\n const questions = input.questions as {\n question: string;\n header: string;\n options: { label: string; description: string; preview?: string }[];\n multiSelect?: boolean;\n }[];\n\n host.connection.emitStatus(\"waiting_for_input\");\n host.connection.sendEvent({\n type: \"tool_use\",\n tool: \"AskUserQuestion\",\n input: JSON.stringify(input),\n });\n\n const answerPromise = host.connection.askUserQuestion(questions);\n const timeoutPromise = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), QUESTION_TIMEOUT_MS);\n });\n\n const answers = await Promise.race([answerPromise, timeoutPromise]);\n host.connection.emitStatus(\"running\");\n\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message:\n \"User did not respond to clarifying questions in time. Proceed with your best judgment.\",\n };\n }\n\n return { behavior: \"allow\", updatedInput: { questions: input.questions, answers } };\n}\n\nconst DENIAL_WARNING_THRESHOLD = 3;\nconst DENIAL_FORCE_STOP_THRESHOLD = 8;\n\nfunction isResourceHeavyCommand(command: string): boolean {\n return RESOURCE_HEAVY_PATTERNS.some((p) => p.test(command));\n}\n\nlet autoScaled = false;\n\nasync function maybeAutoScale(\n host: QueryHost,\n toolName: string,\n input: Record<string, unknown>,\n): Promise<void> {\n if (\n autoScaled ||\n !process.env.CLAUDESPACE_NAME ||\n toolName !== \"Bash\" ||\n typeof input.command !== \"string\" ||\n !isResourceHeavyCommand(input.command)\n ) {\n return;\n }\n autoScaled = true;\n try {\n await host.connection.requestScaleUp(\"light\", `auto-scale: ${input.command.slice(0, 60)}`);\n } catch {\n // Best-effort — don't block the command if scale-up fails\n }\n}\n\nfunction resolveToolAccess(\n host: QueryHost,\n toolName: string,\n input: Record<string, unknown>,\n): ToolResult {\n switch (host.agentMode) {\n case \"discovery\":\n return handleDiscoveryToolAccess(toolName, input);\n case \"building\":\n return handleBuildingToolAccess(toolName, input);\n case \"review\":\n return handleReviewToolAccess(toolName, input, host.isParentTask);\n case \"auto\":\n return handleAutoToolAccess(toolName, input, host.hasExitedPlanMode, host.isParentTask);\n case \"code-review\":\n return handleCodeReviewToolAccess(toolName, input);\n default:\n return { behavior: \"allow\", updatedInput: input };\n }\n}\n\nexport function buildCanUseTool(\n host: QueryHost,\n): (toolName: string, input: Record<string, unknown>) => Promise<ToolResult> {\n let consecutiveDenials = 0;\n\n return async (toolName, input) => {\n await maybeAutoScale(host, toolName, input);\n\n if (\n toolName === \"ExitPlanMode\" &&\n (host.agentMode === \"auto\" || host.agentMode === \"discovery\") &&\n !host.hasExitedPlanMode\n ) {\n return await handleExitPlanMode(host, input);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return await handleAskUserQuestion(host, input);\n }\n\n const result = resolveToolAccess(host, toolName, input);\n\n if (result.behavior === \"deny\") {\n consecutiveDenials++;\n if (consecutiveDenials === DENIAL_WARNING_THRESHOLD) {\n host.connection.postChatMessage(\n `⚠️ Multiple tool denials detected. You are in ${host.agentMode} mode — ` +\n `file writes outside .claude/plans/ are not permitted. ` +\n `Focus on creating a plan instead of implementing code changes.`,\n );\n }\n if (consecutiveDenials >= DENIAL_FORCE_STOP_THRESHOLD) {\n host.connection.postChatMessage(\n `Agent force-stopped after ${DENIAL_FORCE_STOP_THRESHOLD} consecutive tool denials. ` +\n `The agent appears stuck — send a message to resume.`,\n );\n host.requestStop();\n }\n } else {\n consecutiveDenials = 0;\n }\n\n return result;\n };\n}\n","/* oxlint-disable max-lines, max-dependencies -- query orchestration + retry logic is cohesive; splitting would scatter tightly-coupled control flow */\nimport type {\n AgentHarness,\n HarnessEvent,\n HarnessUserMessage,\n HarnessQueryOptions,\n HarnessHookInput,\n HarnessHookOutput,\n} from \"../harness/index.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\nimport type { TaskContext, MultimodalBlock, AgentMode } from \"@project/shared\";\nimport type { AgentRunnerConfig, AgentRunnerCallbacks } from \"../types.js\";\nimport { buildInitialPrompt } from \"./prompt-builder.js\";\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { createConveyorMcpServer } from \"../tools/index.js\";\nimport { processEvents } from \"./event-processor.js\";\nimport { isAuthError } from \"./event-handlers.js\";\nimport type { CostTracker } from \"./cost-tracker.js\";\nimport { buildCanUseTool } from \"./tool-access.js\";\nimport { collectMissingProps } from \"./task-property-utils.js\";\n\nconst logger = createServiceLogger(\"QueryExecutor\");\nconst API_ERROR_PATTERN = /API Error: [45]\\d\\d/;\nconst IMAGE_ERROR_PATTERN = /Could not process image/i;\nconst RETRY_DELAYS_MS = [60_000, 120_000, 180_000, 300_000];\n\nexport interface QueryHost {\n config: AgentRunnerConfig;\n connection: AgentConnection;\n callbacks: AgentRunnerCallbacks;\n harness: AgentHarness;\n setupLog: string[];\n costTracker: CostTracker;\n agentMode: AgentMode;\n isParentTask: boolean;\n hasExitedPlanMode: boolean;\n exitPlanAttempts: number;\n pendingModeRestart: boolean;\n sessionIds: Map<string, string>;\n activeQuery: AsyncGenerator<HarnessEvent, void> | null;\n pendingToolOutputs: string[];\n abortController: AbortController | null;\n isStopped(): boolean;\n requestStop(): void;\n requestSoftStop(): void;\n createInputStream(\n prompt: string | MultimodalBlock[],\n ): AsyncGenerator<HarnessUserMessage, void, unknown>;\n snapshotPlanFiles(): void;\n syncPlanFile(): void;\n onModeTransition?: (newMode: AgentMode) => void;\n}\n\n// ── Query options builder ───────────────────────────────────────────────────\n\nfunction buildHooks(host: QueryHost): HarnessQueryOptions[\"hooks\"] {\n return {\n PostToolUse: [\n {\n hooks: [\n async (input: HarnessHookInput): Promise<HarnessHookOutput> => {\n if (host.isStopped()) return await Promise.resolve({ continue: false });\n if (input.hook_event_name === \"PostToolUse\") {\n const output =\n typeof input.tool_response === \"string\"\n ? input.tool_response.slice(0, 500)\n : JSON.stringify(input.tool_response).slice(0, 500);\n host.connection.sendEvent({\n type: \"tool_result\",\n tool: input.tool_name,\n output,\n isError: false,\n });\n host.pendingToolOutputs.push(output);\n\n // After PR creation, nudge agent to backfill missing task properties\n if (input.tool_name === \"mcp__conveyor__create_pull_request\") {\n try {\n const props = await host.connection.getTaskProperties();\n const missing = collectMissingProps(props);\n if (missing.length > 0) {\n host.connection.postChatMessage(\n `PR created! Please backfill missing task properties: ${missing.join(\", \")}`,\n );\n }\n } catch {\n /* best-effort */\n }\n }\n }\n return await Promise.resolve({ continue: true });\n },\n ],\n timeout: 5,\n },\n ],\n };\n}\n\nfunction isReadOnlyMode(mode: AgentMode, hasExitedPlanMode: boolean): boolean {\n return (\n mode === \"discovery\" ||\n mode === \"help\" ||\n mode === \"code-review\" ||\n (mode === \"auto\" && !hasExitedPlanMode)\n );\n}\n\nfunction buildDisallowedTools(\n settings: { disallowedTools?: string[] },\n mode: AgentMode,\n hasExitedPlanMode: boolean,\n): string[] | undefined {\n const modeDisallowed = isReadOnlyMode(mode, hasExitedPlanMode)\n ? [\"TodoWrite\", \"TodoRead\", \"NotebookEdit\"]\n : [];\n // Code-review mode additionally blocks plan-mode tools that aren't relevant\n if (mode === \"code-review\") {\n modeDisallowed.push(\"ExitPlanMode\", \"EnterPlanMode\");\n }\n const configured = settings.disallowedTools ?? [];\n const combined = [...configured, ...modeDisallowed];\n return combined.length > 0 ? combined : undefined;\n}\n\nfunction buildQueryOptions(host: QueryHost, context: TaskContext): HarnessQueryOptions {\n const settings = context.agentSettings ?? host.config.agentSettings ?? {};\n const mode = host.agentMode;\n\n // Read-only modes (auto pre-exit, discovery, help) use the SDK's native \"plan\"\n // permission mode which enforces no-execution (blocks file edits and destructive commands).\n // canUseTool is still registered to intercept ExitPlanMode for custom validation\n // (plan/SP/title checks, triggerIdentification, mode restart).\n const isReadOnly = isReadOnlyMode(mode, host.hasExitedPlanMode);\n const needsCanUseTool = isReadOnly;\n\n const systemPromptText = buildSystemPrompt(\n host.config.mode,\n context,\n host.config,\n host.setupLog,\n mode,\n );\n const settingSources = (settings.settingSources ?? [\"user\", \"project\"]) as (\n | \"user\"\n | \"project\"\n | \"local\"\n )[];\n\n return {\n model: context.model || host.config.model,\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: systemPromptText || undefined,\n },\n settingSources,\n cwd: host.config.workspaceDir,\n permissionMode: needsCanUseTool ? \"plan\" : \"bypassPermissions\",\n allowDangerouslySkipPermissions: !needsCanUseTool,\n canUseTool: buildCanUseTool(host),\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n mcpServers: {\n conveyor: createConveyorMcpServer(host.harness, host.connection, host.config, context, mode),\n },\n sandbox: context.useSandbox ? { enabled: true } : { enabled: false },\n hooks: buildHooks(host),\n maxTurns: mode === \"code-review\" ? Math.min(settings.maxTurns ?? 15, 15) : settings.maxTurns,\n effort: settings.effort,\n thinking: settings.thinking,\n betas: settings.betas,\n maxBudgetUsd:\n mode === \"code-review\"\n ? Math.min(settings.maxBudgetUsd ?? 10, 10)\n : (settings.maxBudgetUsd ?? 50),\n abortController: host.abortController ?? undefined,\n disallowedTools: buildDisallowedTools(settings, mode, host.hasExitedPlanMode),\n enableFileCheckpointing: settings.enableFileCheckpointing,\n stderr: (data: string) => {\n logger.warn(\"Claude Code stderr\", { data: data.trimEnd() });\n },\n };\n}\n\n// ── Multimodal prompt builder ────────────────────────────────────────────\n\ntype ImageMediaType = \"image/gif\" | \"image/jpeg\" | \"image/png\" | \"image/webp\";\n\nfunction buildMultimodalPrompt(\n textPrompt: string,\n context: TaskContext,\n skipImages = false,\n): string | MultimodalBlock[] {\n if (skipImages) return textPrompt;\n\n const taskImages = (context.files ?? []).filter(\n (f) => f.content && f.contentEncoding === \"base64\",\n );\n const chatImages: { fileName: string; mimeType: string; content: string }[] = [];\n for (const msg of context.chatHistory) {\n for (const f of msg.files ?? []) {\n if (f.content && f.contentEncoding === \"base64\") {\n chatImages.push({ fileName: f.fileName, mimeType: f.mimeType, content: f.content });\n }\n }\n }\n\n if (taskImages.length === 0 && chatImages.length === 0) return textPrompt;\n\n const blocks: MultimodalBlock[] = [{ type: \"text\", text: textPrompt }];\n for (const file of taskImages) {\n blocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as ImageMediaType,\n data: file.content ?? \"\",\n },\n });\n blocks.push({ type: \"text\", text: `[Attached image: ${file.fileName} (${file.mimeType})]` });\n }\n for (const file of chatImages) {\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: file.mimeType as ImageMediaType, data: file.content },\n });\n blocks.push({ type: \"text\", text: `[Chat image: ${file.fileName} (${file.mimeType})]` });\n }\n return blocks;\n}\n\n// ── Follow-up prompt builder ─────────────────────────────────────────────\n\nasync function buildFollowUpPrompt(\n host: QueryHost,\n context: TaskContext,\n followUpContent: string | MultimodalBlock[],\n): Promise<string | MultimodalBlock[]> {\n const isPmMode = host.config.mode === \"pm\";\n const followUpText =\n typeof followUpContent === \"string\"\n ? followUpContent\n : followUpContent\n .filter((b): b is Extract<MultimodalBlock, { type: \"text\" }> => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n\n const followUpImages =\n typeof followUpContent === \"string\"\n ? []\n : followUpContent.filter(\n (b): b is Extract<MultimodalBlock, { type: \"image\" }> => b.type === \"image\",\n );\n\n const textPrompt = isPmMode\n ? `${await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode)}\\n\\n---\\n\\nThe team says:\\n${followUpText}`\n : followUpText;\n\n if (isPmMode) {\n const prompt = buildMultimodalPrompt(textPrompt, context);\n if (followUpImages.length > 0 && Array.isArray(prompt)) {\n prompt.push(...followUpImages);\n }\n return prompt;\n }\n if (followUpImages.length > 0) {\n return [{ type: \"text\", text: textPrompt }, ...followUpImages];\n }\n return textPrompt;\n}\n\n// ── SDK query execution ──────────────────────────────────────────────────\n\nexport async function runSdkQuery(\n host: QueryHost,\n context: TaskContext,\n followUpContent?: string | MultimodalBlock[],\n): Promise<void> {\n if (host.isStopped()) return;\n\n const mode = host.agentMode;\n const isDiscoveryLike = mode === \"discovery\" || mode === \"help\";\n const needsPlanSync = isDiscoveryLike || (mode === \"auto\" && !host.hasExitedPlanMode);\n if (needsPlanSync) {\n host.snapshotPlanFiles();\n }\n\n const options = buildQueryOptions(host, context);\n const resume = context.claudeSessionId ?? undefined;\n\n if (followUpContent) {\n const prompt = await buildFollowUpPrompt(host, context, followUpContent);\n const agentQuery = host.harness.executeQuery({\n prompt: typeof prompt === \"string\" ? prompt : host.createInputStream(prompt),\n options: { ...options },\n resume,\n });\n host.activeQuery = agentQuery;\n try {\n await runWithRetry(agentQuery, context, host, options);\n } finally {\n host.activeQuery = null;\n }\n } else if (isDiscoveryLike) {\n return;\n } else {\n const initialPrompt = await buildInitialPrompt(\n host.config.mode,\n context,\n host.config.isAuto,\n mode,\n );\n const prompt = buildMultimodalPrompt(initialPrompt, context);\n const agentQuery = host.harness.executeQuery({\n prompt: host.createInputStream(prompt),\n options: { ...options },\n resume,\n });\n host.activeQuery = agentQuery;\n try {\n await runWithRetry(agentQuery, context, host, options);\n } finally {\n host.activeQuery = null;\n }\n }\n\n if (needsPlanSync) {\n host.syncPlanFile();\n }\n}\n\n// ── Retry logic ──────────────────────────────────────────────────────────\n\nasync function buildRetryQuery(\n host: QueryHost,\n context: TaskContext,\n options: HarnessQueryOptions,\n lastErrorWasImage: boolean,\n): Promise<AsyncGenerator<HarnessEvent, void>> {\n if (lastErrorWasImage) {\n host.connection.postChatMessage(\n \"An attached image could not be processed. Retrying without images...\",\n );\n }\n const retryPrompt = buildMultimodalPrompt(\n await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode),\n context,\n lastErrorWasImage,\n );\n return host.harness.executeQuery({\n prompt: host.createInputStream(retryPrompt),\n options: { ...options },\n resume: undefined,\n });\n}\n\nasync function handleAuthError(\n context: TaskContext,\n host: QueryHost,\n options: HarnessQueryOptions,\n): Promise<void> {\n host.connection.postChatMessage(\"Authentication expired. Re-bootstrapping credentials...\");\n\n const refreshed = await host.connection.refreshAuthToken();\n if (!refreshed) {\n host.connection.postChatMessage(\"Failed to refresh authentication. Agent will restart.\");\n host.connection.sendEvent({\n type: \"error\",\n message: \"Auth re-bootstrap failed, exiting for restart\",\n });\n process.exit(1);\n }\n\n // Clear session since it's tied to the old token\n context.claudeSessionId = null;\n host.connection.storeSessionId(\"\");\n\n const freshPrompt = buildMultimodalPrompt(\n await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode),\n context,\n );\n const freshQuery = host.harness.executeQuery({\n prompt: host.createInputStream(freshPrompt),\n options: { ...options },\n resume: undefined,\n });\n return runWithRetry(freshQuery, context, host, options);\n}\n\nasync function handleStaleSession(\n context: TaskContext,\n host: QueryHost,\n options: HarnessQueryOptions,\n): Promise<void> {\n context.claudeSessionId = null;\n host.connection.storeSessionId(\"\");\n const freshPrompt = buildMultimodalPrompt(\n await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode),\n context,\n );\n const freshQuery = host.harness.executeQuery({\n prompt: host.createInputStream(freshPrompt),\n options: { ...options },\n resume: undefined,\n });\n return runWithRetry(freshQuery, context, host, options);\n}\n\nasync function waitForRetryDelay(host: QueryHost, delayMs: number): Promise<void> {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, delayMs);\n const checkStopped = setInterval(() => {\n if (host.isStopped()) {\n clearTimeout(timer);\n clearInterval(checkStopped);\n resolve();\n }\n }, 1000);\n setTimeout(() => clearInterval(checkStopped), delayMs + 100);\n });\n}\n\nfunction isStaleOrExitedSession(error: unknown, context: TaskContext): boolean {\n if (!(error instanceof Error)) return false;\n if (error.message.includes(\"No conversation found with session ID\")) return true;\n return !!context.claudeSessionId && error.message.includes(\"process exited\");\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n return String(error);\n}\n\nfunction isRetriableError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return API_ERROR_PATTERN.test(message) || IMAGE_ERROR_PATTERN.test(message);\n}\n\nfunction classifyImageError(error: unknown): boolean {\n return IMAGE_ERROR_PATTERN.test(getErrorMessage(error));\n}\n\nasync function emitRetryStatus(host: QueryHost, attempt: number, delayMs: number): Promise<void> {\n const delayMin = Math.round(delayMs / 60_000);\n host.connection.postChatMessage(\n `API error encountered. Retrying in ${delayMin} minute${delayMin > 1 ? \"s\" : \"\"}... (attempt ${attempt + 1}/${RETRY_DELAYS_MS.length})`,\n );\n host.connection.sendEvent({\n type: \"error\",\n message: `API error, retrying in ${delayMin}m (${attempt + 1}/${RETRY_DELAYS_MS.length})`,\n });\n host.connection.emitStatus(\"waiting_for_input\");\n await host.callbacks.onStatusChange(\"waiting_for_input\");\n\n await waitForRetryDelay(host, delayMs);\n\n host.connection.emitStatus(\"running\");\n await host.callbacks.onStatusChange(\"running\");\n}\n\nfunction handleRateLimitPause(host: QueryHost, rateLimitResetsAt: string): void {\n host.connection.emitRateLimitPause(rateLimitResetsAt);\n host.connection.postChatMessage(\n `Rate limited. The task will be automatically re-queued and resume after ${new Date(rateLimitResetsAt).toLocaleString()}.`,\n );\n}\n\ntype RetryOutcome = { action: \"return\" } | { action: \"continue\"; lastErrorWasImage: boolean };\n\nfunction handleRetryError(\n error: unknown,\n context: TaskContext,\n host: QueryHost,\n options: HarnessQueryOptions,\n prevImageError: boolean,\n): RetryOutcome | Promise<void> {\n if (isStaleOrExitedSession(error, context) && context.claudeSessionId) {\n return handleStaleSession(context, host, options);\n }\n if (isAuthError(getErrorMessage(error))) {\n return handleAuthError(context, host, options);\n }\n if (!isRetriableError(error)) throw error;\n return { action: \"continue\", lastErrorWasImage: classifyImageError(error) || prevImageError };\n}\n\ntype ProcessResult =\n | { action: \"return\" }\n | { action: \"return_promise\"; promise: Promise<void> }\n | { action: \"continue\"; lastErrorWasImage: boolean };\n\nfunction handleProcessResult(\n result: Awaited<ReturnType<typeof processEvents>>,\n context: TaskContext,\n host: QueryHost,\n options: HarnessQueryOptions,\n): ProcessResult {\n if (result.modeRestart || host.isStopped()) return { action: \"return\" };\n\n if (result.rateLimitResetsAt) {\n handleRateLimitPause(host, result.rateLimitResetsAt);\n return { action: \"return\" };\n }\n\n // Handle stale session result errors (same recovery as thrown exceptions)\n if (result.staleSession && context.claudeSessionId) {\n return { action: \"return_promise\", promise: handleStaleSession(context, host, options) };\n }\n\n // Handle auth errors — re-bootstrap token and retry\n if (result.authError) {\n return { action: \"return_promise\", promise: handleAuthError(context, host, options) };\n }\n\n if (!result.retriable) return { action: \"return\" };\n return {\n action: \"continue\",\n lastErrorWasImage: IMAGE_ERROR_PATTERN.test(result.resultSummary ?? \"\"),\n };\n}\n\nasync function runWithRetry(\n initialQuery: AsyncGenerator<HarnessEvent, void>,\n context: TaskContext,\n host: QueryHost,\n options: HarnessQueryOptions,\n): Promise<void> {\n let lastErrorWasImage = false;\n\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {\n if (host.isStopped()) return;\n\n const agentQuery =\n attempt === 0\n ? initialQuery\n : await buildRetryQuery(host, context, options, lastErrorWasImage);\n\n try {\n const result = await processEvents(agentQuery, context, host);\n const outcome = handleProcessResult(result, context, host, options);\n if (outcome.action === \"return\") return;\n if (outcome.action === \"return_promise\") return outcome.promise;\n lastErrorWasImage = outcome.lastErrorWasImage;\n } catch (error) {\n const outcome = handleRetryError(error, context, host, options, lastErrorWasImage);\n if (outcome instanceof Promise) return outcome;\n if (outcome.action === \"return\") return;\n lastErrorWasImage = outcome.lastErrorWasImage;\n }\n\n if (attempt >= RETRY_DELAYS_MS.length) {\n host.connection.postChatMessage(\n `Agent shutting down after ${RETRY_DELAYS_MS.length} failed retry attempts due to API errors. ` +\n `The task will resume automatically when the codespace restarts.`,\n );\n return;\n }\n\n await emitRetryStatus(host, attempt, RETRY_DELAYS_MS[attempt]);\n }\n}\n","export interface ModelUsageEntry {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadInputTokens: number;\n cacheCreationInputTokens: number;\n costUSD: number;\n}\n\nexport class CostTracker {\n private cumulativeCostUsd = 0;\n private modelUsage = new Map<string, ModelUsageEntry>();\n\n /** Add cost from a completed query and return the running total */\n addQueryCost(queryCostUsd: number): number {\n this.cumulativeCostUsd += queryCostUsd;\n return this.cumulativeCostUsd;\n }\n\n /** Merge per-model usage from a completed query */\n addModelUsage(\n usage: Record<\n string,\n {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n costUSD?: number;\n }\n >,\n ): void {\n for (const [model, data] of Object.entries(usage)) {\n const existing = this.modelUsage.get(model) ?? {\n model,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n costUSD: 0,\n };\n existing.inputTokens += data.inputTokens ?? 0;\n existing.outputTokens += data.outputTokens ?? 0;\n existing.cacheReadInputTokens += data.cacheReadInputTokens ?? 0;\n existing.cacheCreationInputTokens += data.cacheCreationInputTokens ?? 0;\n existing.costUSD += data.costUSD ?? 0;\n this.modelUsage.set(model, existing);\n }\n }\n\n get totalCostUsd(): number {\n return this.cumulativeCostUsd;\n }\n\n get modelBreakdown(): ModelUsageEntry[] {\n return [...this.modelUsage.values()];\n }\n}\n","/**\n * QueryBridge — wires SessionRunner lifecycle state to QueryExecutor execution.\n *\n * SessionRunner handles connect/idle/message lifecycle.\n * QueryExecutor handles Claude SDK query orchestration.\n * QueryBridge adapts between them by constructing the QueryHost interface\n * that QueryExecutor expects, using live references to ModeController state.\n */\n\nimport type { HarnessEvent, HarnessUserMessage } from \"../harness/index.js\";\nimport { createHarness } from \"../harness/index.js\";\nimport { runSdkQuery, type QueryHost } from \"../execution/query-executor.js\";\nimport { CostTracker } from \"../execution/cost-tracker.js\";\nimport { PlanSync } from \"./plan-sync.js\";\nimport type { AgentConnection } from \"../connection/agent-connection.js\";\nimport type { ModeController } from \"./mode-controller.js\";\nimport type { AgentRunnerConfig, AgentRunnerCallbacks } from \"../types.js\";\nimport type { TaskContext, AgentMode, MultimodalBlock } from \"@project/shared\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"QueryBridge\");\n\nexport class QueryBridge {\n private readonly harness;\n private readonly costTracker: CostTracker;\n private readonly planSync: PlanSync;\n private readonly sessionIds = new Map<string, string>();\n private activeQuery: AsyncGenerator<HarnessEvent, void> | null = null;\n private readonly pendingToolOutputs: string[] = [];\n private _stopped = false;\n private _isParentTask = false;\n private _abortController: AbortController | null = null;\n\n /** Called by SessionRunner when ExitPlanMode triggers a mode transition. */\n onModeTransition?: (newMode: AgentMode) => void;\n\n /** Called by tool handlers to soft-stop (abort query, keep session alive). */\n onSoftStop?: () => void;\n\n constructor(\n private readonly connection: AgentConnection,\n private readonly mode: ModeController,\n private readonly runnerConfig: AgentRunnerConfig,\n private readonly callbacks: AgentRunnerCallbacks,\n workspaceDir: string,\n ) {\n this.harness = createHarness();\n this.costTracker = new CostTracker();\n this.planSync = new PlanSync(workspaceDir, connection);\n }\n\n get isStopped(): boolean {\n return this._stopped;\n }\n\n get isParentTask(): boolean {\n return this._isParentTask;\n }\n\n set isParentTask(val: boolean) {\n this._isParentTask = val;\n }\n\n stop(): void {\n this._stopped = true;\n this._abortController?.abort();\n }\n\n resume(): void {\n this._stopped = false;\n }\n\n /**\n * Execute a Claude SDK query.\n * Without followUpContent: runs initial mode execution (build/plan).\n * With followUpContent: processes a follow-up user message.\n */\n async execute(context: TaskContext, followUpContent?: string | MultimodalBlock[]): Promise<void> {\n this._stopped = false;\n this._abortController = new AbortController();\n const host = this.buildHost();\n try {\n await runSdkQuery(host, context, followUpContent);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const isAbort = this._stopped || /abort/i.test(msg);\n if (isAbort) {\n logger.info(\"Query stopped by user\", { error: msg });\n } else {\n logger.error(\"Query execution failed\", { error: msg });\n this.connection.sendEvent({ type: \"error\", message: msg });\n }\n } finally {\n this.mode.pendingModeRestart = false;\n }\n }\n\n // ── QueryHost construction ──────────────────────────────────────────\n\n private buildHost(): QueryHost {\n // oxlint-disable-next-line no-this-alias -- closure needed for live getter/setter delegation\n const bridge = this;\n return {\n config: this.runnerConfig,\n connection: this.connection,\n callbacks: this.callbacks,\n harness: this.harness,\n setupLog: [],\n costTracker: this.costTracker,\n sessionIds: this.sessionIds,\n pendingToolOutputs: this.pendingToolOutputs,\n\n // Live getters/setters delegating to ModeController + bridge state\n get agentMode() {\n return bridge.mode.effectiveMode;\n },\n get isParentTask() {\n return bridge._isParentTask;\n },\n get hasExitedPlanMode() {\n return bridge.mode.hasExitedPlanMode;\n },\n set hasExitedPlanMode(val: boolean) {\n bridge.mode.hasExitedPlanMode = val;\n },\n exitPlanAttempts: 0,\n get pendingModeRestart() {\n return bridge.mode.pendingModeRestart;\n },\n set pendingModeRestart(val: boolean) {\n bridge.mode.pendingModeRestart = val;\n },\n get activeQuery() {\n return bridge.activeQuery;\n },\n set activeQuery(val: AsyncGenerator<HarnessEvent, void> | null) {\n bridge.activeQuery = val;\n },\n get abortController() {\n return bridge._abortController;\n },\n\n isStopped: () => bridge._stopped,\n requestStop: () => bridge.stop(),\n requestSoftStop: () => {\n if (bridge.onSoftStop) bridge.onSoftStop();\n },\n createInputStream: (prompt) => bridge.createInputStream(prompt),\n snapshotPlanFiles: () => bridge.planSync.snapshotPlanFiles(),\n syncPlanFile: () => bridge.planSync.syncPlanFile(),\n onModeTransition: bridge.onModeTransition,\n };\n }\n\n // ── Input stream for Claude SDK ─────────────────────────────────────\n\n private async *createInputStream(\n prompt: string | MultimodalBlock[],\n ): AsyncGenerator<HarnessUserMessage, void, unknown> {\n yield {\n type: \"user\" as const,\n session_id: \"\",\n message: { role: \"user\" as const, content: prompt },\n parent_tool_use_id: null,\n };\n }\n}\n","import type { AgentRunnerStatus, AgentMode, TaskContext, ChatMessage } from \"@project/shared\";\nimport {\n AgentConnection,\n type AgentConnectionConfig,\n type IncomingMessage,\n} from \"../connection/agent-connection.js\";\nimport { ModeController, type ModeTaskContext } from \"./mode-controller.js\";\nimport { Lifecycle, DEFAULT_LIFECYCLE_CONFIG, type LifecycleConfig } from \"./lifecycle.js\";\nimport { QueryBridge } from \"./query-bridge.js\";\nimport type { AgentRunnerConfig } from \"../types.js\";\nimport type { TaskContextDTO } from \"@project/shared\";\nimport { syncWithBaseBranch } from \"./git-utils.js\";\n\n// ── Configuration ──────────────────────────────────────────────────────────\n\nexport interface SessionRunnerConfig {\n connection: AgentConnectionConfig;\n agentMode?: AgentMode;\n runnerMode?: \"task\" | \"pm\" | \"code-review\";\n isAuto?: boolean;\n workspaceDir: string;\n model?: string;\n lifecycle?: Partial<LifecycleConfig>;\n}\n\nexport interface SessionRunnerCallbacks {\n onStatusChange: (status: AgentRunnerStatus) => void | Promise<void>;\n onEvent: (event: Record<string, unknown>) => void | Promise<void>;\n}\n\n// ── SessionRunner: main lifecycle orchestrator ─────────────────────────────\n\nexport class SessionRunner {\n readonly connection: AgentConnection;\n readonly mode: ModeController;\n readonly lifecycle: Lifecycle;\n\n private readonly config: SessionRunnerConfig;\n private readonly callbacks: SessionRunnerCallbacks;\n private _state: AgentRunnerStatus = \"connecting\";\n private stopped = false;\n private hasCompleted = false;\n private interrupted = false;\n private taskContext: ModeTaskContext | null = null;\n private fullContext: TaskContext | null = null;\n private queryBridge: QueryBridge | null = null;\n private inputResolver: ((msg: IncomingMessage | null) => void) | null = null;\n private pendingMessages: IncomingMessage[] = [];\n private prNudgeCount = 0;\n\n constructor(config: SessionRunnerConfig, callbacks: SessionRunnerCallbacks) {\n this.config = config;\n this.callbacks = callbacks;\n\n // Compose components\n this.connection = new AgentConnection(config.connection);\n\n const initialMode =\n config.agentMode ??\n (config.runnerMode === \"pm\" ? (config.isAuto ? \"auto\" : \"discovery\") : \"building\");\n this.mode = new ModeController(initialMode, config.runnerMode, config.isAuto);\n\n const lifecycleConfig = { ...DEFAULT_LIFECYCLE_CONFIG, ...config.lifecycle };\n this.lifecycle = new Lifecycle(lifecycleConfig, {\n onHeartbeat: () => this.connection.sendHeartbeat(),\n onIdleTimeout: () => {\n process.stderr.write(\"[conveyor-agent] Idle timeout reached, entering sleep\\n\");\n this.connection.emitStatus(\"sleeping\");\n },\n onSleep: () => {\n process.stderr.write(\"[conveyor-agent] Sleep mode active\\n\");\n this.connection.postChatMessage(\"Agent sleeping — send a message or click Resume to wake.\");\n },\n onSleepGraceExpired: () => {\n this.stopped = true;\n if (this.inputResolver) {\n const resolver = this.inputResolver;\n this.inputResolver = null;\n resolver(null);\n }\n },\n onWake: () => {\n process.stderr.write(\"[conveyor-agent] Woken from sleep\\n\");\n this.lifecycle.cancelSleepShutdown();\n },\n });\n }\n\n get state(): AgentRunnerStatus {\n return this._state;\n }\n\n get sessionId(): string {\n return this.connection.sessionId;\n }\n\n get isStopped(): boolean {\n return this.stopped;\n }\n\n // ── Main lifecycle ─────────────────────────────────────────────────\n\n /**\n * Establish the API connection, wire callbacks, and join the session room.\n * Call this before run() when you need to send events (e.g. setup/start\n * command output) before the main agent lifecycle begins.\n */\n async connect(): Promise<void> {\n await this.setState(\"connecting\");\n\n // 1. Connect\n await this.connection.connect();\n await this.setState(\"connected\");\n this.connection.sendEvent({ type: \"connected\", sessionId: this.sessionId });\n\n // 2. Wire callbacks\n this.wireConnectionCallbacks();\n this.lifecycle.startHeartbeat();\n\n // 2.5. Join session room and retrieve pending messages\n const { pendingMessages: serverMessages } = await this.connection.call(\"connectAgent\", {\n sessionId: this.sessionId,\n });\n for (const msg of serverMessages) {\n if (msg.content) {\n this.pendingMessages.push({ content: msg.content, userId: msg.userId });\n }\n }\n }\n\n /**\n * Run the main agent lifecycle: fetch context, resolve mode, execute, loop.\n * Requires connect() to have been called first.\n */\n // oxlint-disable-next-line max-lines-per-function, complexity -- lifecycle orchestration is inherently sequential\n async run(): Promise<void> {\n // 3. Fetch context\n await this.setState(\"fetching_context\");\n try {\n const ctx = await this.connection.call(\"getTaskContext\", {\n sessionId: this.sessionId,\n includeHistory: true,\n });\n this.fullContext = this.buildFullContext(ctx);\n this.taskContext = {\n status: ctx.status,\n plan: ctx.plan,\n storyPointId:\n ctx.storyPoints === null || ctx.storyPoints === undefined\n ? null\n : String(ctx.storyPoints),\n model: ctx.model,\n githubPRUrl: ctx.githubPRUrl,\n isParentTask: this.fullContext.isParentTask,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to fetch task context\";\n this.connection.sendEvent({ type: \"error\", message });\n await this.callbacks.onEvent({ type: \"error\", message });\n await this.shutdown(\"error\");\n return;\n }\n\n // 3.5. Sync with latest base branch to prevent merge conflicts\n if (this.fullContext?.baseBranch) {\n syncWithBaseBranch(this.config.workspaceDir, this.fullContext.baseBranch);\n }\n\n // 4. Resolve initial mode\n this.mode.resolveInitialMode(this.taskContext);\n\n // 4.5. Create query bridge for SDK execution\n this.queryBridge = this.createQueryBridge();\n\n // 5. Log initialization\n this.logInitialization();\n\n // 6. Execute initial mode\n await this.executeInitialMode();\n\n // Mark that the agent has completed its initial task\n if (!this.stopped && this._state !== \"error\") {\n this.hasCompleted = true;\n }\n\n // 6.5. Auto-mode nudge: if agent finished without PR, nudge it\n // Skip if a user message arrived during initial execution (it interrupted the query)\n if (!this.stopped && this.pendingMessages.length === 0) {\n await this.maybeSendPRNudge();\n }\n\n // 7. Core loop: idle → message → execute → idle\n if (!this.stopped) {\n process.stderr.write(\n `[conveyor-agent] Listening for messages (mode: ${this.mode.effectiveMode})\\n`,\n );\n }\n while (!this.stopped) {\n if (this._state !== \"idle\") await this.setState(\"idle\");\n await this.coreLoop();\n }\n\n // 8. Shutdown\n await this.shutdown(\"finished\");\n }\n\n /** Convenience wrapper: connect() then run(). */\n async start(): Promise<void> {\n await this.connect();\n await this.run();\n }\n\n // ── Core loop ──────────────────────────────────────────────────────\n\n private async coreLoop(): Promise<void> {\n while (!this.stopped) {\n if (this._state === \"idle\") {\n this.lifecycle.startIdleTimer();\n const msg = await this.waitForMessage();\n this.lifecycle.cancelIdleTimer();\n\n if (!msg) {\n if (this.interrupted && !this.stopped) {\n this.interrupted = false;\n continue;\n }\n break;\n }\n\n // Skip automated system messages after agent has already completed\n if (this.hasCompleted && msg.userId === \"system\") {\n continue;\n }\n\n // A real user message resets completion state (user wants more work)\n if (msg.userId !== \"system\") {\n this.hasCompleted = false;\n }\n\n await this.setState(\"running\");\n this.interrupted = false;\n await this.callbacks.onEvent({\n type: \"user_message\",\n content: msg.content,\n userId: msg.userId,\n });\n\n // Execute the Claude SDK query with the user's message\n await this.executeQuery(msg.content);\n\n if (this.stopped) break;\n if (this.interrupted) {\n this.interrupted = false;\n continue;\n }\n\n // After user message execution, check for auto-mode nudge\n // Skip if a new message arrived during execution (it interrupted the query)\n if (!this.stopped && this.pendingMessages.length === 0) {\n await this.maybeSendPRNudge();\n }\n // Re-arm completion guard — system messages will be skipped until a real user message arrives\n this.hasCompleted = true;\n if (!this.stopped) await this.setState(\"idle\");\n } else if (this._state === \"error\") {\n await this.setState(\"idle\");\n } else {\n break;\n }\n }\n }\n\n // ── Initial mode execution ─────────────────────────────────────────\n\n private async executeInitialMode(): Promise<void> {\n if (!this.taskContext || !this.fullContext) return;\n const effectiveMode = this.mode.effectiveMode;\n\n // Code-review is one-shot\n if (effectiveMode === \"code-review\") {\n await this.setState(\"running\");\n await this.callbacks.onEvent({ type: \"execute_mode\", mode: effectiveMode });\n await this.executeQuery();\n this.stopped = true;\n return;\n }\n\n const shouldRun =\n effectiveMode === \"building\" ||\n effectiveMode === \"auto\" ||\n (effectiveMode === \"review\" && this.mode.isPackRunner(this.taskContext));\n\n if (shouldRun) {\n await this.setState(\"running\");\n await this.callbacks.onEvent({ type: \"execute_mode\", mode: effectiveMode });\n await this.executeQuery();\n if (!this.stopped) await this.setState(\"idle\");\n } else {\n await this.setState(\"idle\");\n }\n }\n\n // ── Message waiting ────────────────────────────────────────────────\n\n private waitForMessage(): Promise<IncomingMessage | null> {\n if (this.pendingMessages.length > 0) {\n return Promise.resolve(this.pendingMessages.shift() ?? null);\n }\n return new Promise<IncomingMessage | null>((resolve) => {\n this.inputResolver = resolve;\n });\n }\n\n /** Inject a message (from connection callback or external source) */\n injectMessage(msg: IncomingMessage): void {\n // Cancel sleep shutdown if a message arrives during grace window\n this.lifecycle.cancelSleepShutdown();\n\n if (this.inputResolver) {\n const resolve = this.inputResolver;\n this.inputResolver = null;\n resolve(msg);\n } else {\n this.pendingMessages.push(msg);\n // Interrupt running query so the new message is processed quickly\n if (this._state === \"running\") {\n this.queryBridge?.stop();\n }\n }\n }\n\n // ── Query execution with abort handling ────────────────────────────\n\n /** Run queryBridge.execute, swallowing abort errors from stop/softStop. */\n private async executeQuery(followUpContent?: string): Promise<void> {\n if (!this.fullContext || !this.queryBridge) return;\n try {\n await this.queryBridge.execute(this.fullContext, followUpContent);\n } catch (err) {\n if (this.interrupted || this.stopped) {\n process.stderr.write(\"[conveyor-agent] Query aborted by stop/softStop signal\\n\");\n return;\n }\n throw err;\n }\n }\n\n // ── Stop / soft-stop ───────────────────────────────────────────────\n\n stop(): void {\n this.stopped = true;\n this.queryBridge?.stop();\n this.lifecycle.destroy();\n this.connection.disconnect();\n if (this.inputResolver) {\n const resolver = this.inputResolver;\n this.inputResolver = null;\n resolver(null);\n }\n }\n\n softStop(): void {\n this.interrupted = true;\n this.queryBridge?.stop();\n if (this.inputResolver) {\n const resolver = this.inputResolver;\n this.inputResolver = null;\n resolver(null);\n }\n }\n\n // ── Auto-mode PR nudge ──────────────────────────────────────────────\n\n private static readonly MAX_PR_NUDGES = 3;\n\n private needsPRNudge(): boolean {\n if (!this.config.isAuto || this.stopped) return false;\n if (this.prNudgeCount > SessionRunner.MAX_PR_NUDGES) return false;\n if (!this.taskContext) return false;\n return this.taskContext.status === \"InProgress\" && !this.taskContext.githubPRUrl;\n }\n\n private async refreshTaskContext(): Promise<void> {\n try {\n const ctx = await this.connection.call(\"getTaskContext\", {\n sessionId: this.sessionId,\n includeHistory: false,\n });\n this.taskContext = {\n status: ctx.status,\n plan: ctx.plan,\n storyPointId:\n ctx.storyPoints === null || ctx.storyPoints === undefined\n ? null\n : String(ctx.storyPoints),\n model: ctx.model,\n githubPRUrl: ctx.githubPRUrl,\n };\n // Keep fullContext in sync for PR nudge execution\n if (this.fullContext) {\n this.fullContext.status = ctx.status;\n this.fullContext.plan = ctx.plan;\n this.fullContext.githubPRUrl = ctx.githubPRUrl;\n this.fullContext.model = ctx.model;\n }\n } catch {\n // Continue with stale context\n }\n }\n\n private async maybeSendPRNudge(): Promise<void> {\n await this.refreshTaskContext();\n if (!this.needsPRNudge()) return;\n\n while (!this.stopped && !this.interrupted && this.needsPRNudge()) {\n this.prNudgeCount++;\n\n if (this.prNudgeCount > SessionRunner.MAX_PR_NUDGES) {\n this.connection.postChatMessage(\n `Auto-mode agent failed to open a PR after ${SessionRunner.MAX_PR_NUDGES} nudges. Shutting down.`,\n );\n this.stop();\n return;\n }\n\n const isFirst = this.prNudgeCount === 1;\n const chatMsg = isFirst\n ? \"Auto-nudge: Task is still In Progress with no PR. Prompting agent to continue...\"\n : `Auto-nudge (attempt ${this.prNudgeCount}/${SessionRunner.MAX_PR_NUDGES}): Task still has no PR. Prompting agent again...`;\n\n const prompt = isFirst\n ? \"You are in Auto mode and your task is still In Progress with no pull request. You MUST create a pull request before finishing. Use the create_pull_request tool now to open a PR for your changes. If you are blocked, explain what is preventing you from creating a PR.\"\n : `This is reminder ${this.prNudgeCount} of ${SessionRunner.MAX_PR_NUDGES}. You MUST open a pull request using create_pull_request NOW or explain what is blocking you. Do NOT go idle — either create the PR or describe the specific blocker.`;\n\n this.connection.postChatMessage(chatMsg);\n await this.setState(\"running\");\n await this.callbacks.onEvent({ type: \"pr_nudge\", prompt });\n\n // Execute the nudge prompt through the query bridge\n if (this.interrupted || this.stopped) return;\n await this.executeQuery(prompt);\n if (this.interrupted || this.stopped) return;\n\n // Re-fetch to check if PR was created\n await this.refreshTaskContext();\n }\n }\n\n // ── Context & bridge construction ────────────────────────────────\n\n private buildFullContext(ctx: TaskContextDTO): TaskContext {\n const chatHistory: ChatMessage[] = (ctx.chatHistory ?? []).map((m) => ({\n role: (m.role ?? \"user\") as \"user\" | \"assistant\" | \"system\",\n content: m.content ?? \"\",\n userId: m.userId,\n userName: m.user?.name ?? undefined,\n createdAt: m.createdAt,\n ...(m.files && m.files.length > 0\n ? {\n files: m.files.map((f) => ({\n fileId: f.id,\n fileName: f.fileName,\n mimeType: f.mimeType,\n fileSize: f.fileSize,\n downloadUrl: f.downloadUrl ?? \"\",\n content: f.content,\n contentEncoding: f.contentEncoding,\n })),\n }\n : {}),\n }));\n\n return {\n taskId: ctx.id,\n projectId: ctx.projectId ?? \"\",\n title: ctx.title,\n description: ctx.description,\n plan: ctx.plan,\n status: ctx.status,\n chatHistory,\n agentId: null,\n agentInstructions: ctx.agentInstructions ?? \"\",\n model: ctx.model,\n githubBranch: ctx.githubBranch ?? \"\",\n baseBranch: ctx.baseBranch ?? \"\",\n projectName: ctx.projectName ?? null,\n projectDescription: ctx.projectDescription ?? null,\n githubPRUrl: ctx.githubPRUrl,\n claudeSessionId: ctx.claudeSessionId ?? null,\n isParentTask: !!ctx.parentTaskId,\n storyPoints: ctx.storyPoints ?? undefined,\n projectAgents: ctx.projectAgents ?? undefined,\n projectTags: ctx.projectTags ?? undefined,\n taskTagIds: ctx.taskTagIds ?? undefined,\n projectObjectives: ctx.projectObjectives ?? undefined,\n };\n }\n\n private createQueryBridge(): QueryBridge {\n const runnerConfig: AgentRunnerConfig = {\n conveyorApiUrl: this.config.connection.apiUrl,\n taskToken: this.config.connection.taskToken,\n taskId: this.fullContext?.taskId ?? \"\",\n model: this.fullContext?.model ?? \"claude-sonnet-4-20250514\",\n instructions: this.fullContext?.agentInstructions ?? \"\",\n workspaceDir: this.config.workspaceDir,\n mode: this.config.runnerMode,\n isAuto: this.config.isAuto,\n };\n\n const bridge = new QueryBridge(\n this.connection,\n this.mode,\n runnerConfig,\n {\n onStatusChange: (status) => this.callbacks.onStatusChange(status as AgentRunnerStatus),\n onEvent: (event) => this.callbacks.onEvent(event),\n },\n this.config.workspaceDir,\n );\n\n bridge.isParentTask = this.fullContext?.isParentTask ?? false;\n bridge.onSoftStop = () => {\n process.stderr.write(\"[conveyor-agent] Soft stop requested (discovery ExitPlanMode)\\n\");\n this.softStop();\n };\n\n bridge.onModeTransition = (newMode: AgentMode) => {\n const oldMode = this.mode.effectiveMode;\n process.stderr.write(`[conveyor-agent] Mode transition: ${oldMode} → ${newMode}\\n`);\n this.connection.sendEvent({ type: \"mode_transition\", from: oldMode, to: newMode });\n this.mode.pendingModeRestart = true;\n this.connection.emitModeChanged(newMode);\n this.softStop();\n };\n\n return bridge;\n }\n\n // ── Private helpers ────────────────────────────────────────────────\n\n private wireConnectionCallbacks(): void {\n this.connection.onMessage((msg) => this.injectMessage(msg));\n this.connection.onStop(() => this.stop());\n this.connection.onSoftStop(() => this.softStop());\n this.connection.onModeChange((data) => {\n const action = this.mode.handleModeChange(data.agentMode);\n if (action.type === \"start_auto\") {\n this.connection.emitModeChanged(this.mode.effectiveMode);\n this.softStop();\n }\n });\n this.connection.onWake(() => this.lifecycle.wake());\n this.connection.onApiKeyUpdate((data) => {\n if (data.isSubscription) {\n process.env.CLAUDE_CODE_OAUTH_TOKEN = data.apiKey;\n delete process.env.ANTHROPIC_API_KEY;\n } else {\n process.env.ANTHROPIC_API_KEY = data.apiKey;\n delete process.env.CLAUDE_CODE_OAUTH_TOKEN;\n }\n });\n }\n\n private async setState(status: AgentRunnerStatus): Promise<void> {\n this._state = status;\n this.connection.emitStatus(status);\n await this.callbacks.onStatusChange(status);\n }\n\n private async shutdown(finalState: AgentRunnerStatus): Promise<void> {\n process.stderr.write(`[conveyor-agent] Shutdown: reason=${finalState}\\n`);\n this.connection.sendEvent({ type: \"shutdown\", reason: finalState });\n this.lifecycle.destroy();\n await this.setState(finalState);\n this.connection.disconnect();\n }\n\n private logInitialization(): void {\n const context = {\n mode: this.mode.effectiveMode,\n runnerMode: this.config.runnerMode ?? \"task\",\n sessionId: this.sessionId,\n // Task context\n isParentTask: this.fullContext?.isParentTask ?? false,\n status: this.taskContext?.status,\n taskTitle: this.fullContext?.title,\n hasExistingPR: !!this.fullContext?.githubPRUrl,\n hasExistingSession: !!this.fullContext?.claudeSessionId,\n chatHistoryLength: this.fullContext?.chatHistory?.length ?? 0,\n tagIds: this.fullContext?.taskTagIds ?? [],\n // Agent config\n model: this.taskContext?.model,\n isAuto: this.config.isAuto ?? false,\n };\n process.stderr.write(`[conveyor-agent] Initialized: ${JSON.stringify(context)}\\n`);\n this.connection.sendEvent({ type: \"session_manifest\", ...context });\n }\n}\n","import { io, type Socket } from \"socket.io-client\";\nimport type {\n AgentSessionServiceMethods,\n SocketResponse,\n TagAuditRunnerRequest,\n} from \"@project/shared\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"ProjectConnection\");\n\n// ── Configuration ──────────────────────────────────────────────────────────\n\nexport interface ProjectConnectionConfig {\n apiUrl: string;\n projectToken: string;\n projectId: string;\n}\n\n// ── Incoming event types ───────────────────────────────────────────────────\n\nexport interface TaskAssignment {\n taskId: string;\n taskToken: string;\n sessionId?: string;\n apiUrl: string;\n mode: string;\n branch: string;\n devBranch: string;\n useWorktree?: boolean;\n isAuto?: boolean;\n useSandbox?: boolean;\n agentMode?: string;\n}\n\nexport interface IncomingChatMessage {\n content: string;\n userId: string;\n chatId?: string;\n projectId: string;\n timestamp: string;\n}\n\nexport interface SwitchBranchRequest {\n branch: string;\n syncAfter?: boolean;\n}\n\n// ── Connection class ───────────────────────────────────────────────────────\n\nconst EVENT_BATCH_MS = 500;\n\nexport class ProjectConnection {\n private socket: Socket | null = null;\n private readonly config: ProjectConnectionConfig;\n private eventBuffer: Array<{ event: Record<string, unknown> }> = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectCallbacks: Array<() => void> = [];\n\n constructor(config: ProjectConnectionConfig) {\n this.config = config;\n }\n\n get projectId(): string {\n return this.config.projectId;\n }\n\n get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n // ── Typed service method call ──────────────────────────────────────────\n\n call<M extends keyof AgentSessionServiceMethods>(\n method: M,\n payload: AgentSessionServiceMethods[M][\"payload\"],\n ): Promise<AgentSessionServiceMethods[M][\"response\"]> {\n const socket = this.requireSocket();\n return new Promise((resolve, reject) => {\n socket.emit(\n `agentSessionService:${String(method)}`,\n payload,\n (response: SocketResponse<AgentSessionServiceMethods[M][\"response\"]>) => {\n if (response.success && response.data !== undefined) {\n resolve(response.data);\n } else {\n reject(new Error(response.error ?? `Service call failed: ${String(method)}`));\n }\n },\n );\n });\n }\n\n // ── Connection lifecycle ───────────────────────────────────────────────\n\n connect(): Promise<void> {\n if (!this.config.apiUrl) {\n return Promise.reject(new Error(\"Cannot connect: apiUrl is empty\"));\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n let attempts = 0;\n const maxInitialAttempts = 30;\n\n logger.info(\"Connecting\", { apiUrl: this.config.apiUrl, projectId: this.config.projectId });\n\n this.socket = io(this.config.apiUrl, {\n auth: {\n projectToken: this.config.projectToken,\n runnerMode: \"project\",\n },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 30000,\n randomizationFactor: 0.3,\n extraHeaders: { \"ngrok-skip-browser-warning\": \"true\" },\n });\n\n this.socket.on(\"connect\", () => {\n // Always re-subscribe to project room (handles both first connect and reconnect)\n this.socket?.emit(\"projectService:subscribe\", { entryId: this.config.projectId });\n if (!settled) {\n settled = true;\n resolve();\n }\n logger.info(\"Connected to API\");\n });\n\n this.socket.on(\"connect_error\", (error: Error) => {\n attempts++;\n if (!settled && attempts >= maxInitialAttempts) {\n settled = true;\n reject(\n new Error(`Failed to connect after ${maxInitialAttempts} attempts: ${error.message}`),\n );\n }\n });\n\n this.socket.on(\"disconnect\", (reason: string) => {\n logger.warn(\"Disconnected from API\", { reason });\n });\n\n this.socket.io.on(\"reconnect\", () => {\n logger.info(\"Reconnected to API\");\n for (const cb of this.reconnectCallbacks) cb();\n });\n });\n }\n\n disconnect(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n this.flushEvents();\n this.socket?.disconnect();\n this.socket = null;\n }\n\n onReconnect(callback: () => void): void {\n this.reconnectCallbacks.push(callback);\n }\n\n // ── Event listeners ────────────────────────────────────────────────────\n\n onTaskAssignment(callback: (assignment: TaskAssignment) => void): void {\n this.requireSocket().on(\"projectRunner:assignTask\", callback);\n }\n\n onStopTask(callback: (data: { taskId: string }) => void): void {\n this.requireSocket().on(\"projectRunner:stopTask\", callback);\n }\n\n onShutdown(callback: () => void): void {\n this.requireSocket().on(\"projectRunner:shutdown\", callback);\n }\n\n onChatMessage(callback: (msg: IncomingChatMessage) => void): void {\n this.requireSocket().on(\"projectRunner:incomingChatMessage\", callback);\n }\n\n onSwitchBranch(\n callback: (\n data: SwitchBranchRequest,\n cb: (res: { ok: boolean; error?: string }) => void,\n ) => void,\n ): void {\n this.requireSocket().on(\"projectRunner:switchBranch\", callback);\n }\n\n onSyncEnvironment(callback: (cb: (res: { ok: boolean; error?: string }) => void) => void): void {\n this.requireSocket().on(\"projectRunner:syncEnvironment\", callback);\n }\n\n onRestartStartCommand(\n callback: (cb: (res: { ok: boolean; error?: string }) => void) => void,\n ): void {\n this.requireSocket().on(\"projectRunner:restartStartCommand\", callback);\n }\n\n onAuditTags(callback: (request: TagAuditRunnerRequest) => void): void {\n this.requireSocket().on(\"projectRunner:auditTags\", callback);\n }\n\n // ── Outgoing helpers ───────────────────────────────────────────────────\n\n sendHeartbeat(): void {\n void this.call(\"projectRunnerHeartbeat\", { projectId: this.config.projectId }).catch(() => {});\n }\n\n sendEvent(event: Record<string, unknown>): void {\n this.eventBuffer.push({ event });\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(() => this.flushEvents(), EVENT_BATCH_MS);\n }\n }\n\n emitStatus(status: \"busy\" | \"idle\"): void {\n void this.call(\"reportProjectAgentStatus\", {\n projectId: this.config.projectId,\n status,\n }).catch(() => {});\n }\n\n emitTaskStarted(taskId: string): void {\n this.sendEvent({ type: \"task_started\", taskId });\n }\n\n emitTaskStopped(taskId: string, reason: string): void {\n this.sendEvent({ type: \"task_stopped\", taskId, reason });\n }\n\n // ── Private helpers ────────────────────────────────────────────────────\n\n private flushEvents(): void {\n this.flushTimer = null;\n if (this.eventBuffer.length === 0) return;\n const batch = this.eventBuffer;\n this.eventBuffer = [];\n for (const { event } of batch) {\n void this.call(\"reportProjectAgentEvent\", {\n projectId: this.config.projectId,\n event,\n }).catch(() => {});\n }\n }\n\n private requireSocket(): Socket {\n if (!this.socket) throw new Error(\"Not connected\");\n return this.socket;\n }\n}\n","import { spawn, execSync, type ChildProcess } from \"node:child_process\";\n\nexport function runSetupCommand(\n cmd: string,\n cwd: string,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Setup command exited with code ${code}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\nconst AUTH_TOKEN_TIMEOUT_MS = 30_000;\n\nexport function runAuthTokenCommand(cmd: string, userEmail: string, cwd: string): string | null {\n try {\n const output = execSync(`${cmd} ${JSON.stringify(userEmail)}`, {\n cwd,\n timeout: AUTH_TOKEN_TIMEOUT_MS,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n env: { ...process.env },\n });\n const token = output.toString().trim();\n return token || null;\n } catch {\n return null;\n }\n}\n\nexport function runStartCommand(\n cmd: string,\n cwd: string,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): ChildProcess {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n env: { ...process.env },\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.unref();\n return child;\n}\n","import { execSync } from \"node:child_process\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"CommitWatcher\");\n\nexport interface CommitWatcherConfig {\n projectDir: string;\n pollIntervalMs: number;\n debounceMs: number;\n}\n\nexport interface NewCommitsData {\n branch: string;\n previousSha: string;\n newCommitSha: string;\n commitCount: number;\n latestMessage: string;\n latestAuthor: string;\n}\n\nexport interface CommitWatcherCallbacks {\n onNewCommits: (data: NewCommitsData) => Promise<void>;\n}\n\nexport class CommitWatcher {\n private interval: ReturnType<typeof setInterval> | null = null;\n private lastKnownRemoteSha: string | null = null;\n private branch: string | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private isSyncing = false;\n\n constructor(\n private config: CommitWatcherConfig,\n private callbacks: CommitWatcherCallbacks,\n ) {}\n\n start(branch: string): void {\n this.stop();\n this.branch = branch;\n this.lastKnownRemoteSha = this.getLocalHeadSha();\n this.interval = setInterval(() => void this.poll(), this.config.pollIntervalMs);\n logger.info(\"Commit watcher started\", {\n branch,\n baseSha: this.lastKnownRemoteSha?.slice(0, 8),\n });\n }\n\n stop(): void {\n if (this.interval) clearInterval(this.interval);\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.interval = null;\n this.debounceTimer = null;\n this.branch = null;\n this.lastKnownRemoteSha = null;\n this.isSyncing = false;\n }\n\n private getLocalHeadSha(): string {\n return execSync(\"git rev-parse HEAD\", {\n cwd: this.config.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n }\n\n private poll(): void {\n if (!this.branch || this.isSyncing) return;\n\n try {\n execSync(`git fetch origin ${this.branch} --quiet`, {\n cwd: this.config.projectDir,\n stdio: \"ignore\",\n timeout: 30_000,\n });\n\n const remoteSha = execSync(`git rev-parse origin/${this.branch}`, {\n cwd: this.config.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n\n if (remoteSha !== this.lastKnownRemoteSha) {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(\n () => void this.handleNewCommits(remoteSha),\n this.config.debounceMs,\n );\n }\n } catch {\n // Network error, branch deleted, etc. — silently retry next interval\n }\n }\n\n private async handleNewCommits(remoteSha: string): Promise<void> {\n if (!this.branch) return;\n const previousSha = this.lastKnownRemoteSha ?? \"HEAD\";\n\n let commitCount = 1;\n let latestMessage = \"\";\n let latestAuthor = \"\";\n try {\n const countOutput = execSync(`git rev-list --count ${previousSha}..origin/${this.branch}`, {\n cwd: this.config.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n commitCount = parseInt(countOutput, 10) || 1;\n\n const logOutput = execSync(`git log -1 --format=\"%s|||%an\" origin/${this.branch}`, {\n cwd: this.config.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n const parts = logOutput.split(\"|||\");\n latestMessage = parts[0] ?? \"\";\n latestAuthor = parts[1] ?? \"\";\n } catch {\n // best effort — counts and messages are informational\n }\n\n this.lastKnownRemoteSha = remoteSha;\n this.isSyncing = true;\n\n logger.info(\"New commits detected\", {\n branch: this.branch,\n commitCount,\n sha: remoteSha.slice(0, 8),\n });\n\n try {\n await this.callbacks.onNewCommits({\n branch: this.branch,\n previousSha,\n newCommitSha: remoteSha,\n commitCount,\n latestMessage,\n latestAuthor,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.error(\"Error handling new commits\", { error: msg });\n } finally {\n this.isSyncing = false;\n }\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { hasUncommittedChanges } from \"./git-utils.js\";\n\nconst WORKTREE_DIR = \".worktrees\";\n\nexport function ensureWorktree(projectDir: string, taskId: string, branch?: string): string {\n if (projectDir.includes(`/${WORKTREE_DIR}/`)) {\n return projectDir;\n }\n\n const worktreePath = join(projectDir, WORKTREE_DIR, taskId);\n\n if (existsSync(worktreePath)) {\n if (branch) {\n if (hasUncommittedChanges(worktreePath)) {\n return worktreePath;\n }\n try {\n execSync(`git checkout --detach origin/${branch}`, {\n cwd: worktreePath,\n stdio: \"ignore\",\n });\n } catch {\n /* branch doesn't exist on remote yet */\n }\n }\n return worktreePath;\n }\n\n const ref = branch ? `origin/${branch}` : \"HEAD\";\n execSync(`git worktree add --detach \"${worktreePath}\" ${ref}`, {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n\n return worktreePath;\n}\n\n/**\n * Detach any task worktree that has `branch` checked out, releasing the branch lock\n * so the main project directory can check it out. Only touches worktrees inside\n * `.worktrees/` — never the main project directory.\n */\nexport function detachWorktreeBranch(projectDir: string, branch: string): void {\n try {\n const output = execSync(\"git worktree list --porcelain\", {\n cwd: projectDir,\n encoding: \"utf-8\",\n });\n const entries = output.split(\"\\n\\n\");\n for (const entry of entries) {\n const lines = entry.trim().split(\"\\n\");\n const worktreeLine = lines.find((l) => l.startsWith(\"worktree \"));\n const branchLine = lines.find((l) => l.startsWith(\"branch \"));\n if (!worktreeLine || branchLine !== `branch refs/heads/${branch}`) continue;\n\n const worktreePath = worktreeLine.replace(\"worktree \", \"\");\n if (!worktreePath.includes(`/${WORKTREE_DIR}/`)) continue;\n\n try {\n execSync(\"git checkout --detach\", { cwd: worktreePath, stdio: \"ignore\" });\n } catch {\n /* best effort */\n }\n }\n } catch {\n /* best effort */\n }\n}\n\n/**\n * Force-remove is intentional: this runs after task completion or explicit stop.\n * Any uncommitted changes at this point are scratch artifacts, not valuable work.\n */\nexport function removeWorktree(projectDir: string, taskId: string): void {\n const worktreePath = join(projectDir, WORKTREE_DIR, taskId);\n if (!existsSync(worktreePath)) return;\n try {\n execSync(`git worktree remove \"${worktreePath}\" --force`, {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n } catch {\n /* best effort */\n }\n}\n","/* oxlint-disable max-lines -- project runner lifecycle requires co-located state management */\nimport { fork, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { ProjectConnection, type TaskAssignment } from \"../connection/project-connection.js\";\nimport { runSetupCommand, runStartCommand } from \"../setup/commands.js\";\nimport { CommitWatcher } from \"./commit-watcher.js\";\nimport { ensureWorktree, removeWorktree, detachWorktreeBranch } from \"./worktree.js\";\nimport {\n hasUncommittedChanges,\n getCurrentBranch as gitGetCurrentBranch,\n syncWithBaseBranch,\n} from \"./git-utils.js\";\nimport { handleProjectChatMessage } from \"./project-chat-handler.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"ProjectRunner\");\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface ProjectRunnerConfig {\n conveyorApiUrl: string;\n projectToken: string;\n projectId: string;\n projectDir: string;\n}\n\ninterface ActiveAgent {\n process: ChildProcess;\n worktreePath: string;\n mode: string;\n usesWorktree: boolean;\n}\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst MAX_CONCURRENT = Math.max(1, parseInt(process.env.CONVEYOR_MAX_CONCURRENT ?? \"10\", 10) || 10);\nconst STOP_TIMEOUT_MS = 30_000;\nconst START_CMD_KILL_TIMEOUT_MS = 5_000;\n\n// ── Setup helpers ────────────────────────────────────────────────────────\n\nfunction setupWorkDir(\n projectDir: string,\n assignment: TaskAssignment,\n): { workDir: string; usesWorktree: boolean } {\n const { taskId, branch, devBranch, useWorktree } = assignment;\n const shortId = taskId.slice(0, 8);\n const shouldWorktree = useWorktree === true;\n\n let workDir: string;\n if (shouldWorktree) {\n workDir = ensureWorktree(projectDir, taskId, devBranch);\n } else {\n workDir = projectDir;\n }\n\n if (branch && branch !== devBranch) {\n if (hasUncommittedChanges(workDir)) {\n logger.warn(\"Uncommitted changes, skipping checkout\", { taskId: shortId, branch });\n } else {\n try {\n execSync(`git checkout ${branch}`, { cwd: workDir, stdio: \"ignore\" });\n } catch {\n try {\n execSync(`git checkout -b ${branch}`, { cwd: workDir, stdio: \"ignore\" });\n } catch {\n logger.warn(\"Could not checkout branch\", { taskId: shortId, branch });\n }\n }\n }\n }\n\n return { workDir, usesWorktree: shouldWorktree };\n}\n\nfunction spawnChildAgent(assignment: TaskAssignment, workDir: string): ChildProcess {\n const { taskToken, apiUrl, taskId, sessionId, mode, isAuto, useSandbox, agentMode } = assignment;\n const cliPath = path.resolve(__dirname, \"cli.js\");\n\n const childEnv = { ...process.env };\n delete childEnv.CONVEYOR_PROJECT_TOKEN;\n delete childEnv.CONVEYOR_PROJECT_ID;\n delete childEnv.CONVEYOR_SETUP_COMMAND;\n delete childEnv.CONVEYOR_START_COMMAND;\n\n const effectiveAgentMode = agentMode ?? (isAuto ? \"auto\" : \"\");\n // Prefer the assignment's apiUrl, but fall back to the parent's CONVEYOR_API_URL.\n // The assignment's apiUrl comes from NEXT_PUBLIC_SERVER on the API server, which\n // may be empty or differ from the URL the project runner actually connected to.\n const effectiveApiUrl = apiUrl || process.env.CONVEYOR_API_URL || \"\";\n if (!effectiveApiUrl) {\n logger.error(\"No API URL available for child agent\", { taskId: taskId.slice(0, 8) });\n }\n\n const child = fork(cliPath, [], {\n env: {\n ...childEnv,\n CONVEYOR_API_URL: effectiveApiUrl,\n CONVEYOR_TASK_TOKEN: taskToken,\n CONVEYOR_TASK_ID: taskId,\n ...(sessionId ? { CONVEYOR_SESSION_ID: sessionId } : {}),\n CONVEYOR_MODE: agentMode === \"code-review\" ? \"code-review\" : mode,\n CONVEYOR_WORKSPACE: workDir,\n CONVEYOR_USE_WORKTREE: \"false\",\n CONVEYOR_AGENT_MODE: effectiveAgentMode,\n CONVEYOR_IS_AUTO: isAuto ? \"true\" : \"false\",\n CONVEYOR_USE_SANDBOX: useSandbox === true ? \"true\" : \"false\",\n },\n cwd: workDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\", \"ipc\"],\n });\n\n child.stdin?.on(\"error\", () => {});\n child.stdout?.on(\"error\", () => {});\n child.stderr?.on(\"error\", () => {});\n\n const shortId = taskId.slice(0, 8);\n child.stdout?.on(\"data\", (data: Buffer) => {\n for (const line of data.toString().trimEnd().split(\"\\n\")) {\n logger.info(line, { taskId: shortId });\n }\n });\n child.stderr?.on(\"data\", (data: Buffer) => {\n for (const line of data.toString().trimEnd().split(\"\\n\")) {\n // Child loggers write to stderr by default — not necessarily errors\n logger.info(line, { taskId: shortId });\n }\n });\n\n return child;\n}\n\n// ── ProjectRunner class ──────────────────────────────────────────────────\n\nexport class ProjectRunner {\n private connection: ProjectConnection;\n private projectDir: string;\n private activeAgents = new Map<string, ActiveAgent>();\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private stopping = false;\n private resolveLifecycle: (() => void) | null = null;\n private chatSessionIds = new Map<string, string>();\n\n private startCommandChild: ChildProcess | null = null;\n private startCommandRunning = false;\n private setupComplete = false;\n private branchSwitchCommand: string | undefined;\n private commitWatcher: CommitWatcher;\n\n constructor(config: ProjectRunnerConfig) {\n this.projectDir = config.projectDir;\n this.connection = new ProjectConnection({\n apiUrl: config.conveyorApiUrl,\n projectToken: config.projectToken,\n projectId: config.projectId,\n });\n this.commitWatcher = new CommitWatcher(\n {\n projectDir: this.projectDir,\n pollIntervalMs: Number(process.env.CONVEYOR_COMMIT_POLL_INTERVAL) || 10_000,\n debounceMs: 3_000,\n },\n {\n onNewCommits: async (data) => {\n await this.handleNewCommits(data);\n },\n },\n );\n }\n\n // ── Public lifecycle ───────────────────────────────────────────────────\n\n // oxlint-disable-next-line max-lines-per-function -- sequential lifecycle orchestration\n async start(): Promise<void> {\n this.checkoutWorkspaceBranch();\n await this.connection.connect();\n\n // Register with the API\n const registration = await this.connection.call(\"registerProjectAgent\", {\n projectId: this.connection.projectId,\n capabilities: [\"task\", \"pm\", \"code-review\", \"audit\"],\n });\n this.branchSwitchCommand =\n registration.branchSwitchCommand ?? process.env.CONVEYOR_BRANCH_SWITCH_COMMAND;\n\n logger.info(\"Registered as project agent\", { agentName: registration.agentName });\n\n // Run setup command (blocking), then start command (background)\n try {\n await this.executeSetupCommand();\n this.executeStartCommand();\n this.setupComplete = true;\n this.connection.sendEvent({\n type: \"setup_complete\",\n startCommandRunning: this.startCommandRunning,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Environment setup failed\", { error: msg });\n this.setupComplete = false;\n }\n\n // Wire event handlers\n this.wireEventHandlers();\n\n // Re-register on reconnect so the server broadcasts connected status to UI\n this.connection.onReconnect(() => void this.handleReconnect());\n\n // Start heartbeat\n this.heartbeatTimer = setInterval(() => {\n this.connection.sendHeartbeat();\n }, HEARTBEAT_INTERVAL_MS);\n\n // Start commit watcher\n const currentBranch = this.getCurrentBranch();\n if (currentBranch) {\n this.commitWatcher.start(currentBranch);\n }\n\n logger.info(\"Connected, waiting for task assignments\");\n\n await new Promise<void>((resolve) => {\n this.resolveLifecycle = resolve;\n });\n }\n\n async stop(): Promise<void> {\n if (this.stopping) return;\n this.stopping = true;\n logger.info(\"Shutting down\");\n\n this.commitWatcher.stop();\n await this.killStartCommand();\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n const stopPromises = [...this.activeAgents.keys()].map(\n (key) =>\n new Promise<void>((resolve) => {\n const agent = this.activeAgents.get(key);\n if (!agent) {\n resolve();\n return;\n }\n agent.process.on(\"exit\", () => resolve());\n this.handleStopTask(key);\n }),\n );\n\n await Promise.race([\n Promise.all(stopPromises),\n new Promise<void>((resolve) => {\n setTimeout(resolve, STOP_TIMEOUT_MS + 5_000);\n }),\n ]);\n\n // Disconnect from API\n try {\n await this.connection.call(\"disconnectProjectRunner\", {\n projectId: this.connection.projectId,\n });\n } catch {\n // best effort\n }\n this.connection.disconnect();\n logger.info(\"Shutdown complete\");\n\n if (this.resolveLifecycle) {\n this.resolveLifecycle();\n this.resolveLifecycle = null;\n }\n }\n\n // ── Event wiring ───────────────────────────────────────────────────────\n\n private wireEventHandlers(): void {\n this.connection.onTaskAssignment((assignment) => void this.handleAssignment(assignment));\n this.connection.onStopTask((data) => this.handleStopTask(data.taskId));\n this.connection.onShutdown(() => void this.stop());\n\n this.connection.onChatMessage((msg) => {\n const chatId = msg.chatId ?? \"default\";\n const existingSessionId = this.chatSessionIds.get(chatId);\n void handleProjectChatMessage(msg, this.connection, this.projectDir, existingSessionId).then(\n (newSessionId) => {\n if (newSessionId) this.chatSessionIds.set(chatId, newSessionId);\n },\n );\n });\n\n this.connection.onAuditTags((request) => void this.handleAuditTags(request));\n\n this.connection.onSwitchBranch((data, cb) => void this.handleSwitchBranch(data, cb));\n this.connection.onSyncEnvironment((cb) => void this.handleSyncEnvironment(cb));\n this.connection.onRestartStartCommand((cb) => {\n void this.restartStartCommand()\n .then(() => cb({ ok: true }))\n .catch((err) =>\n cb({ ok: false, error: err instanceof Error ? err.message : \"Restart failed\" }),\n );\n });\n }\n\n private async handleReconnect(): Promise<void> {\n try {\n await this.connection.call(\"registerProjectAgent\", {\n projectId: this.connection.projectId,\n capabilities: [\"task\", \"pm\", \"code-review\", \"audit\"],\n });\n this.connection.emitStatus(this.activeAgents.size > 0 ? \"busy\" : \"idle\");\n logger.info(\"Re-registered after reconnect\");\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to re-register after reconnect\", { error: msg });\n }\n }\n\n // ── Tag audit ──────────────────────────────────────────────────────────\n\n private async handleAuditTags(\n request: import(\"@project/shared\").TagAuditRunnerRequest,\n ): Promise<void> {\n this.connection.emitStatus(\"busy\");\n try {\n const { handleTagAudit } = await import(\"./tag-audit-handler.js\");\n await handleTagAudit(request, this.connection, this.projectDir);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Tag audit failed\", { error: msg, requestId: request.requestId });\n try {\n await this.connection.call(\"reportTagAuditResult\", {\n projectId: this.connection.projectId,\n requestId: request.requestId,\n recommendations: [],\n summary: `Audit failed: ${msg}`,\n complete: true,\n });\n } catch {\n // best effort\n }\n } finally {\n this.connection.emitStatus(\"idle\");\n }\n }\n\n // ── Task management ────────────────────────────────────────────────────\n\n private async killAgent(agent: ActiveAgent, taskId: string): Promise<void> {\n const shortId = taskId.slice(0, 8);\n\n // Already dead — nothing to kill\n if (agent.process.exitCode !== null) {\n logger.info(\"Agent process already exited\", { taskId: shortId });\n return;\n }\n\n logger.info(\"Killing agent process\", { taskId: shortId });\n agent.process.kill(\"SIGTERM\");\n\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (agent.process.exitCode === null) {\n logger.warn(\"Agent did not exit after SIGTERM, sending SIGKILL\", { taskId: shortId });\n agent.process.kill(\"SIGKILL\");\n }\n resolve();\n }, STOP_TIMEOUT_MS);\n\n agent.process.on(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n // oxlint-disable-next-line max-lines-per-function -- re-assignment logic requires sequential checks\n private async handleAssignment(assignment: TaskAssignment): Promise<void> {\n const { taskId, mode } = assignment;\n const shortId = taskId.slice(0, 8);\n const agentKey = assignment.agentMode === \"code-review\" ? `${taskId}:code-review` : taskId;\n\n const existing = this.activeAgents.get(agentKey);\n if (existing) {\n if (existing.process.exitCode === null) {\n // Process alive but socket may be dead — kill and re-spawn\n logger.info(\"Re-assignment received, killing existing agent\", { taskId: shortId });\n await this.killAgent(existing, taskId);\n } else {\n // Process already dead — clean up stale entry and re-spawn below\n logger.info(\"Stale agent entry (process already exited), cleaning up\", { taskId: shortId });\n }\n this.activeAgents.delete(agentKey);\n }\n\n if (this.activeAgents.size >= MAX_CONCURRENT) {\n logger.warn(\"Max concurrent agents reached\", { maxConcurrent: MAX_CONCURRENT });\n this.connection.emitTaskStopped(taskId, \"max_concurrent_reached\");\n return;\n }\n\n try {\n try {\n execSync(\"git fetch origin\", { cwd: this.projectDir, stdio: \"ignore\" });\n } catch {\n logger.warn(\"Git fetch failed\", { taskId: shortId });\n }\n\n const { workDir, usesWorktree } = setupWorkDir(this.projectDir, assignment);\n\n if (assignment.devBranch) {\n syncWithBaseBranch(workDir, assignment.devBranch);\n }\n\n const child = spawnChildAgent(assignment, workDir);\n\n this.activeAgents.set(agentKey, {\n process: child,\n worktreePath: workDir,\n mode,\n usesWorktree,\n });\n this.connection.emitTaskStarted(taskId);\n logger.info(\"Started task\", { taskId: shortId, mode, workDir });\n\n child.on(\"exit\", (code) => {\n this.activeAgents.delete(agentKey);\n const reason = code === 0 ? \"completed\" : `exited with code ${code}`;\n this.connection.emitTaskStopped(taskId, reason);\n logger.info(\"Task exited\", { taskId: shortId, reason });\n if (code === 0 && usesWorktree) {\n try {\n removeWorktree(this.projectDir, taskId);\n } catch {\n // best effort\n }\n }\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Unknown\";\n logger.error(\"Failed to start task\", { taskId: shortId, error: msg });\n this.connection.emitTaskStopped(taskId, `start_failed: ${msg}`);\n }\n }\n\n private handleStopTask(taskId: string): void {\n const agentKey = this.activeAgents.has(taskId) ? taskId : `${taskId}:code-review`;\n const agent = this.activeAgents.get(agentKey);\n if (!agent) return;\n\n logger.info(\"Stopping task\", { taskId: taskId.slice(0, 8) });\n\n void this.killAgent(agent, taskId).then(() => {\n if (agent.usesWorktree) {\n try {\n removeWorktree(this.projectDir, taskId);\n } catch {\n // best effort\n }\n }\n });\n }\n\n // ── Environment management ─────────────────────────────────────────────\n\n private checkoutWorkspaceBranch(): void {\n const workspaceBranch = process.env.CONVEYOR_WORKSPACE_BRANCH;\n if (!workspaceBranch) return;\n\n const currentBranch = this.getCurrentBranch();\n if (currentBranch === workspaceBranch) return;\n\n if (hasUncommittedChanges(this.projectDir)) {\n logger.warn(\"Uncommitted changes, skipping workspace branch checkout\");\n return;\n }\n\n try {\n execSync(`git fetch origin ${workspaceBranch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n execSync(`git checkout ${workspaceBranch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n logger.info(\"Checked out workspace branch\", { workspaceBranch });\n } catch {\n logger.warn(\"Failed to checkout workspace branch\", { workspaceBranch });\n }\n }\n\n private async executeSetupCommand(): Promise<void> {\n const cmd = process.env.CONVEYOR_SETUP_COMMAND;\n if (!cmd) return;\n\n logger.info(\"Running setup command\", { command: cmd });\n try {\n await runSetupCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.sendEvent({ type: \"setup_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n logger.info(\"Setup command completed\");\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Setup command failed\";\n logger.error(\"Setup command failed\", { error: msg });\n this.connection.sendEvent({ type: \"setup_error\", message: msg });\n throw error;\n }\n }\n\n private executeStartCommand(): void {\n const cmd = process.env.CONVEYOR_START_COMMAND;\n if (!cmd) return;\n\n logger.info(\"Running start command\", { command: cmd });\n const child = runStartCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.sendEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n\n this.startCommandChild = child;\n this.startCommandRunning = true;\n\n child.on(\"exit\", (code, signal) => {\n this.startCommandRunning = false;\n this.startCommandChild = null;\n logger.info(\"Start command exited\", { code, signal });\n this.connection.sendEvent({ type: \"start_command_exited\", code, signal });\n });\n\n child.on(\"error\", (err) => {\n this.startCommandRunning = false;\n this.startCommandChild = null;\n logger.error(\"Start command error\", { error: err.message });\n });\n }\n\n private async killStartCommand(): Promise<void> {\n const child = this.startCommandChild;\n if (!child || !this.startCommandRunning) return;\n\n try {\n if (child.pid) process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (this.startCommandRunning && child.pid) {\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n child.kill(\"SIGKILL\");\n }\n }\n resolve();\n }, START_CMD_KILL_TIMEOUT_MS);\n\n child.on(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n\n this.startCommandChild = null;\n this.startCommandRunning = false;\n }\n\n private async restartStartCommand(): Promise<void> {\n await this.killStartCommand();\n this.executeStartCommand();\n }\n\n private getCurrentBranch(): string | null {\n return gitGetCurrentBranch(this.projectDir);\n }\n\n // ── Branch switching ───────────────────────────────────────────────────\n\n private async handleSwitchBranch(\n data: { branch: string; syncAfter?: boolean },\n callback: (res: { ok: boolean; error?: string }) => void,\n ): Promise<void> {\n try {\n try {\n execSync(\"git fetch origin\", { cwd: this.projectDir, stdio: \"pipe\" });\n } catch {\n logger.warn(\"Git fetch failed during branch switch\");\n }\n\n detachWorktreeBranch(this.projectDir, data.branch);\n\n try {\n execSync(`git checkout ${data.branch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Checkout failed\";\n callback({ ok: false, error: `Failed to checkout branch: ${msg}` });\n return;\n }\n\n try {\n execSync(`git pull origin ${data.branch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n } catch {\n logger.warn(\"Git pull failed during branch switch\");\n }\n\n if (data.syncAfter !== false) {\n await this.handleSyncEnvironment();\n }\n\n this.commitWatcher.start(data.branch);\n callback({ ok: true });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Branch switch failed\";\n logger.error(\"Branch switch failed\", { error: msg });\n callback({ ok: false, error: msg });\n }\n }\n\n private async handleSyncEnvironment(\n callback?: (res: { ok: boolean; error?: string }) => void,\n ): Promise<void> {\n try {\n await this.killStartCommand();\n\n const cmd = this.branchSwitchCommand ?? process.env.CONVEYOR_BRANCH_SWITCH_COMMAND;\n if (cmd) {\n try {\n await runSetupCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.sendEvent({ type: \"sync_output\", stream, data });\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Sync command failed\";\n logger.error(\"Branch switch sync command failed\", { error: msg });\n }\n }\n\n this.executeStartCommand();\n callback?.({ ok: true });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Sync failed\";\n logger.error(\"Environment sync failed\", { error: msg });\n callback?.({ ok: false, error: msg });\n }\n }\n\n // ── Commit watching ────────────────────────────────────────────────────\n\n // oxlint-disable-next-line max-lines-per-function -- sequential sync steps\n private async handleNewCommits(data: {\n branch: string;\n previousSha: string;\n newCommitSha: string;\n commitCount: number;\n latestMessage: string;\n latestAuthor: string;\n }): Promise<void> {\n await this.connection.call(\"reportNewCommitsDetected\", {\n projectId: this.connection.projectId,\n branch: data.branch,\n commits: [\n {\n sha: data.newCommitSha,\n message: data.latestMessage,\n author: data.latestAuthor,\n },\n ],\n });\n\n const stepsRun = await this.smartSync(data.previousSha, data.newCommitSha, data.branch);\n\n await this.connection.call(\"reportEnvironmentReady\", {\n projectId: this.connection.projectId,\n branch: data.branch,\n setupComplete: this.setupComplete,\n startCommandRunning: this.startCommandRunning,\n });\n\n logger.info(\"Commit sync complete\", { steps: stepsRun.join(\", \") });\n }\n\n private async smartSync(previousSha: string, newSha: string, branch: string): Promise<string[]> {\n if (hasUncommittedChanges(this.projectDir)) {\n this.connection.sendEvent({\n type: \"commit_watch_warning\",\n message: \"Working tree has uncommitted changes. Auto-pull skipped.\",\n });\n return [\"skipped:dirty_tree\"];\n }\n\n await this.killStartCommand();\n\n try {\n execSync(`git pull origin ${branch}`, {\n cwd: this.projectDir,\n stdio: \"pipe\",\n timeout: 60_000,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Pull failed\";\n logger.error(\"Git pull failed during commit sync\", { error: msg });\n this.executeStartCommand();\n return [\"error:pull\"];\n }\n\n const stepsRun = [\"pull\"];\n const changedFiles = this.getChangedFiles(previousSha, newSha);\n await this.syncDependencies(changedFiles, stepsRun);\n\n this.executeStartCommand();\n stepsRun.push(\"startCommand\");\n return stepsRun;\n }\n\n private async syncDependencies(changedFiles: string[], stepsRun: string[]): Promise<void> {\n const needsInstall = changedFiles.some(\n (f) =>\n f === \"package.json\" ||\n f === \"bun.lockb\" ||\n f.endsWith(\"/package.json\") ||\n f.endsWith(\"/bun.lockb\"),\n );\n const needsPrisma = changedFiles.some(\n (f) => f.includes(\"prisma/schema.prisma\") || f.includes(\"prisma/migrations/\"),\n );\n\n const cmd = this.branchSwitchCommand ?? process.env.CONVEYOR_BRANCH_SWITCH_COMMAND;\n if (cmd && (needsInstall || needsPrisma)) {\n try {\n await runSetupCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.sendEvent({ type: \"sync_output\", stream, data });\n });\n stepsRun.push(\"branchSwitchCommand\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Sync command failed\";\n logger.error(\"Branch switch command failed\", { error: msg });\n }\n } else if (!cmd) {\n this.runIndividualSyncSteps(needsInstall, needsPrisma, stepsRun);\n }\n }\n\n private runIndividualSyncSteps(\n needsInstall: boolean,\n needsPrisma: boolean,\n stepsRun: string[],\n ): void {\n if (needsInstall) {\n try {\n execSync(\"bun install\", { cwd: this.projectDir, timeout: 120_000, stdio: \"pipe\" });\n stepsRun.push(\"install\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Install failed\";\n logger.error(\"bun install failed\", { error: msg });\n }\n }\n if (needsPrisma) {\n try {\n execSync(\"bunx prisma generate\", { cwd: this.projectDir, timeout: 60_000, stdio: \"pipe\" });\n execSync(\"bunx prisma db push --accept-data-loss\", {\n cwd: this.projectDir,\n timeout: 60_000,\n stdio: \"pipe\",\n });\n stepsRun.push(\"prisma\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Prisma sync failed\";\n logger.error(\"Prisma sync failed\", { error: msg });\n }\n }\n }\n\n private getChangedFiles(previousSha: string, newSha: string): string[] {\n try {\n return execSync(`git diff --name-only ${previousSha}..${newSha}`, {\n cwd: this.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim()\n .split(\"\\n\")\n .filter(Boolean);\n } catch {\n return [];\n }\n }\n}\n","import { z } from \"zod\";\nimport { defineTool } from \"../harness/index.js\";\nimport type { ProjectConnection } from \"../connection/project-connection.js\";\nimport { textResult } from \"./helpers.js\";\n\nfunction buildTaskListTools(connection: ProjectConnection) {\n const projectId = connection.projectId;\n\n return [\n defineTool(\n \"list_tasks\",\n \"List tasks in the project. Optionally filter by status or assignee.\",\n {\n status: z.string().optional().describe(\"Filter by task status\"),\n assigneeId: z.string().optional().describe(\"Filter by assigned user ID\"),\n limit: z.number().optional().describe(\"Max number of tasks to return (default 50)\"),\n },\n async (params) => {\n try {\n const tasks = await connection.call(\"listProjectTasks\", { projectId, ...params });\n return textResult(JSON.stringify(tasks, null, 2));\n } catch (error) {\n return textResult(\n `Failed to list tasks: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n defineTool(\n \"get_task\",\n \"Get detailed information about a task including chat messages, child tasks, and session.\",\n { task_id: z.string().describe(\"The task ID to look up\") },\n async ({ task_id }) => {\n try {\n const task = await connection.call(\"getProjectTask\", { projectId, taskId: task_id });\n return textResult(JSON.stringify(task, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n defineTool(\n \"search_tasks\",\n \"Search tasks by tags, text query, or status filters.\",\n {\n tagNames: z.array(z.string()).optional().describe(\"Filter by tag names\"),\n searchQuery: z.string().optional().describe(\"Text search in title/description\"),\n statusFilters: z.array(z.string()).optional().describe(\"Filter by statuses\"),\n limit: z.number().optional().describe(\"Max results (default 20)\"),\n },\n async (params) => {\n try {\n const tasks = await connection.call(\"searchProjectTasks\", { projectId, ...params });\n return textResult(JSON.stringify(tasks, null, 2));\n } catch (error) {\n return textResult(\n `Failed to search tasks: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nfunction buildProjectInfoTools(connection: ProjectConnection) {\n const projectId = connection.projectId;\n\n return [\n defineTool(\n \"list_tags\",\n \"List all tags available in the project.\",\n {},\n async () => {\n try {\n const tags = await connection.call(\"listProjectTags\", { projectId });\n return textResult(JSON.stringify(tags, null, 2));\n } catch (error) {\n return textResult(\n `Failed to list tags: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n defineTool(\n \"get_project_summary\",\n \"Get a summary of the project including task counts by status and active builds.\",\n {},\n async () => {\n try {\n const summary = await connection.call(\"getProjectSummary\", { projectId });\n return textResult(JSON.stringify(summary, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get project summary: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nfunction buildMutationTools(connection: ProjectConnection) {\n const projectId = connection.projectId;\n\n return [\n defineTool(\n \"create_task\",\n \"Create a new task in the project.\",\n {\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n plan: z.string().optional().describe(\"Implementation plan in markdown\"),\n status: z.string().optional().describe(\"Initial status (default: Planning)\"),\n isBug: z.boolean().optional().describe(\"Whether this is a bug report\"),\n },\n async (params) => {\n try {\n const result = await connection.call(\"createProjectTask\", { projectId, ...params });\n return textResult(`Task created: ${result.slug} (ID: ${result.id})`);\n } catch (error) {\n return textResult(\n `Failed to create task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n defineTool(\n \"update_task\",\n \"Update an existing task's title, description, plan, status, or assignee.\",\n {\n task_id: z.string().describe(\"The task ID to update\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n plan: z.string().optional().describe(\"New plan in markdown\"),\n status: z.string().optional().describe(\"New status\"),\n assignedUserId: z\n .string()\n .nullable()\n .optional()\n .describe(\"Assign to user ID, or null to unassign\"),\n },\n async ({ task_id, ...fields }) => {\n try {\n await connection.call(\"updateProjectTask\", { projectId, taskId: task_id, ...fields });\n return textResult(\"Task updated successfully.\");\n } catch (error) {\n return textResult(\n `Failed to update task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ];\n}\n\nexport function buildProjectTools(connection: ProjectConnection) {\n return [\n ...buildTaskListTools(connection),\n ...buildProjectInfoTools(connection),\n ...buildMutationTools(connection),\n ];\n}\n","import {\n createHarness,\n type HarnessAssistantEvent,\n type HarnessQueryOptions,\n} from \"../harness/index.js\";\nimport type { ProjectConnection, IncomingChatMessage } from \"../connection/project-connection.js\";\nimport { buildProjectTools } from \"../tools/project-tools.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"ProjectChat\");\n\nconst FALLBACK_MODEL = \"claude-sonnet-4-20250514\";\n\ninterface AgentContext {\n projectName: string;\n projectDescription: string | null;\n agentInstructions: string;\n model: string;\n agentSettings: Record<string, unknown> | null;\n}\n\ninterface ChatHistoryMessage {\n role: string;\n content: string;\n userId: string | null;\n userName: string | null;\n createdAt: string;\n}\n\n// ── Prompt builders ──────────────────────────────────────────────────────\n\nfunction buildSystemPrompt(projectDir: string, agentCtx: AgentContext | null): string {\n const parts: string[] = [];\n\n if (agentCtx?.agentInstructions) {\n parts.push(agentCtx.agentInstructions);\n }\n\n const projectName = agentCtx?.projectName ?? \"this project\";\n parts.push(`\\nYou are the project management assistant for ${projectName}.`);\n if (agentCtx?.projectDescription) {\n parts.push(`Project description: ${agentCtx.projectDescription}`);\n }\n\n parts.push(\n `You are running locally on the developer's machine with full access to the codebase at: ${projectDir}`,\n ``,\n `Your role is to help team members:`,\n `- Discuss project direction and priorities`,\n `- Answer questions about the codebase, architecture, and implementation`,\n `- Help plan new work and break it into tasks`,\n `- Review code and suggest improvements`,\n ``,\n `Keep responses concise and helpful. When referencing code, cite specific files and line numbers.`,\n );\n\n return parts.join(\"\\n\");\n}\n\nfunction buildPrompt(message: IncomingChatMessage, chatHistory: ChatHistoryMessage[]): string {\n const parts: string[] = [];\n\n if (chatHistory.length > 0) {\n parts.push(\"Recent conversation history:\");\n for (const msg of chatHistory.slice(-20)) {\n const prefix = msg.role === \"assistant\" ? \"Agent\" : (msg.userName ?? \"User\");\n parts.push(`[${prefix}]: ${msg.content}`);\n }\n parts.push(\"\");\n }\n\n parts.push(`Latest message from the user:\\n${message.content}`);\n return parts.join(\"\\n\");\n}\n\n// ── Context fetching ─────────────────────────────────────────────────────\n\nasync function fetchContext(\n connection: ProjectConnection,\n chatId?: string,\n): Promise<{ agentCtx: AgentContext | null; chatHistory: ChatHistoryMessage[] }> {\n let agentCtx: AgentContext | null = null;\n try {\n agentCtx = await connection.call(\"getProjectAgentContext\", {\n projectId: connection.projectId,\n });\n } catch {\n logger.warn(\"Could not fetch agent context, using defaults\");\n }\n\n let chatHistory: ChatHistoryMessage[] = [];\n try {\n chatHistory = await connection.call(\"getProjectChatHistory\", {\n projectId: connection.projectId,\n limit: 30,\n chatId,\n });\n } catch {\n logger.warn(\"Could not fetch chat history, proceeding without it\");\n }\n\n return { agentCtx, chatHistory };\n}\n\n// ── Query options ────────────────────────────────────────────────────────\n\nfunction buildChatQueryOptions(\n agentCtx: AgentContext | null,\n projectDir: string,\n connection: ProjectConnection,\n): { options: HarnessQueryOptions; harness: ReturnType<typeof createHarness> } {\n const model = agentCtx?.model || FALLBACK_MODEL;\n const settings = agentCtx?.agentSettings ?? {};\n\n const harness = createHarness();\n const mcpServer = harness.createMcpServer({\n name: \"conveyor\",\n tools: buildProjectTools(connection),\n });\n\n return {\n options: {\n model,\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: buildSystemPrompt(projectDir, agentCtx),\n },\n cwd: projectDir,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n mcpServers: { conveyor: mcpServer },\n maxTurns: (settings.maxTurns as number | undefined) ?? 30,\n maxBudgetUsd: (settings.maxBudgetUsd as number | undefined) ?? 50,\n effort: settings.effort as \"low\" | \"medium\" | \"high\" | \"max\" | undefined,\n thinking: settings.thinking as\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" }\n | undefined,\n },\n harness,\n };\n}\n\n// ── Event processing ─────────────────────────────────────────────────────\n\ninterface ToolCallSummary {\n tool: string;\n input?: string;\n timestamp: string;\n}\n\nfunction processContentBlock(\n block: { type: string; text?: string; name?: string; input?: unknown },\n responseParts: string[],\n turnToolCalls: ToolCallSummary[],\n): void {\n if (block.type === \"text\" && block.text) {\n responseParts.push(block.text);\n } else if (block.type === \"tool_use\" && block.name) {\n const inputStr = typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n turnToolCalls.push({\n tool: block.name,\n input: inputStr.slice(0, 10_000),\n timestamp: new Date().toISOString(),\n });\n }\n}\n\nfunction processEvent(\n event: { type: string },\n connection: ProjectConnection,\n responseParts: string[],\n turnToolCalls: ToolCallSummary[],\n isTyping: { value: boolean },\n): boolean {\n if (event.type === \"assistant\") {\n if (!isTyping.value) {\n setTimeout(() => connection.sendEvent({ type: \"agent_typing_start\" }), 200);\n isTyping.value = true;\n }\n\n const assistantEvent = event as HarnessAssistantEvent;\n for (const block of assistantEvent.message.content) {\n processContentBlock(block, responseParts, turnToolCalls);\n }\n\n if (turnToolCalls.length > 0) {\n connection.sendEvent({ type: \"activity_block\", events: [...turnToolCalls] });\n turnToolCalls.length = 0;\n }\n return false;\n }\n if (event.type === \"result\") {\n if (isTyping.value) {\n connection.sendEvent({ type: \"agent_typing_stop\" });\n isTyping.value = false;\n }\n emitResultCost(event, connection);\n return true;\n }\n return false;\n}\n\nfunction emitResultCost(event: { type: string }, connection: ProjectConnection): void {\n const resultEvent = event as {\n type: string;\n total_cost_usd?: number;\n modelUsage?: Record<string, unknown>;\n };\n if (resultEvent.total_cost_usd !== undefined && resultEvent.total_cost_usd > 0) {\n connection.sendEvent({ type: \"cost_update\", costUsd: resultEvent.total_cost_usd });\n }\n}\n\n// ── Main handler ─────────────────────────────────────────────────────────\n\nasync function runChatQuery(\n message: IncomingChatMessage,\n connection: ProjectConnection,\n projectDir: string,\n sessionId?: string,\n): Promise<string | undefined> {\n const { agentCtx, chatHistory } = await fetchContext(connection, message.chatId);\n const { options, harness } = buildChatQueryOptions(agentCtx, projectDir, connection);\n const prompt = buildPrompt(message, chatHistory);\n\n connection.emitStatus(\"busy\");\n const events = harness.executeQuery({\n prompt,\n options,\n ...(sessionId ? { resume: sessionId } : {}),\n });\n\n const responseParts: string[] = [];\n const turnToolCalls: ToolCallSummary[] = [];\n const isTyping = { value: false };\n let resultSessionId: string | undefined;\n\n for await (const event of events) {\n if (event.type === \"result\") {\n const resultEvent = event as { type: string; sessionId?: string };\n resultSessionId = resultEvent.sessionId;\n }\n const done = processEvent(event, connection, responseParts, turnToolCalls, isTyping);\n if (done) break;\n }\n\n if (isTyping.value) {\n connection.sendEvent({ type: \"agent_typing_stop\" });\n }\n\n const responseText = responseParts.join(\"\\n\\n\").trim();\n if (responseText) {\n await connection.call(\"postProjectAgentMessage\", {\n projectId: connection.projectId,\n content: responseText,\n chatId: message.chatId,\n });\n }\n\n return resultSessionId;\n}\n\nexport async function handleProjectChatMessage(\n message: IncomingChatMessage,\n connection: ProjectConnection,\n projectDir: string,\n sessionId?: string,\n): Promise<string | undefined> {\n connection.emitStatus(\"busy\");\n\n try {\n return await runChatQuery(message, connection, projectDir, sessionId);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Failed to handle message\", { error: msg });\n try {\n await connection.call(\"postProjectAgentMessage\", {\n projectId: connection.projectId,\n content: \"I encountered an error processing your message. Please try again.\",\n chatId: message.chatId,\n });\n } catch {\n // best effort\n }\n return undefined;\n } finally {\n connection.emitStatus(\"idle\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface ConveyorConfig {\n setupCommand?: string;\n startCommand?: string;\n previewPort?: number;\n}\n\nconst DEVCONTAINER_PATH = \".devcontainer/conveyor/devcontainer.json\";\n\nexport async function loadForwardPorts(workspaceDir: string): Promise<number[]> {\n try {\n const raw = await readFile(join(workspaceDir, DEVCONTAINER_PATH), \"utf-8\");\n const parsed = JSON.parse(raw) as { forwardPorts?: number[] };\n return parsed.forwardPorts ?? [];\n } catch {\n return [];\n }\n}\n\n/** Load config from env vars (project-level settings injected via bootstrap). */\nexport function loadConveyorConfig(): ConveyorConfig | null {\n const envSetup = process.env.CONVEYOR_SETUP_COMMAND;\n const envStart = process.env.CONVEYOR_START_COMMAND;\n const envPort = process.env.CONVEYOR_PREVIEW_PORT;\n if (envSetup || envStart) {\n return {\n setupCommand: envSetup,\n startCommand: envStart,\n previewPort: envPort ? Number(envPort) : undefined,\n };\n }\n return null;\n}\n"],"mappings":"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","names":["resolve","findLastAgentMessageIndex","result","z","z","z","SP_DESCRIPTION","z","z","z","z","z","z","z","formatError","z","requireDebugClient","formatError","z","isAuthError","result","API_ERROR_PATTERN","resolve","logger","API_ERROR_PATTERN","IMAGE_ERROR_PATTERN","resolve","isAuthError","logger","resolve","io","logger","EVENT_BATCH_MS","resolve","io","execSync","resolve","execSync","logger","execSync","execSync","join","join","execSync","execSync","z","z","logger","buildSystemPrompt","logger","execSync","resolve","readFile","join"]}