@rallycry/conveyor-agent 6.4.2 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-XHJ2Z4AD.js → chunk-HAU4E7IA.js} +3327 -4490
- package/dist/chunk-HAU4E7IA.js.map +1 -0
- package/dist/cli.js +53 -30
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +432 -393
- package/dist/index.js +290 -13
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
- package/dist/chunk-XHJ2Z4AD.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/connection/agent-connection.ts","../src/runner/mode-controller.ts","../src/runner/lifecycle.ts","../src/utils/logger.ts","../src/runner/git-utils.ts","../src/runner/plan-sync.ts","../src/harness/types.ts","../src/harness/claude-code/index.ts","../src/harness/index.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/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"],"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 // 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(\"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 restore status after reconnection\n void this.call(\"connectAgent\", { sessionId: this.config.sessionId }).catch(() => {});\n if (this.lastEmittedStatus) {\n void this.call(\"reportAgentStatus\", {\n sessionId: this.config.sessionId,\n status: this.lastEmittedStatus,\n }).catch(() => {});\n }\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 // ── 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 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 void this.call(\"postAgentMessage\", {\n sessionId: this.config.sessionId,\n content,\n }).catch(() => {});\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 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 const { answers } = await this.call(\"askUserQuestion\", {\n sessionId: this.config.sessionId,\n question: questionText,\n requestId,\n questions,\n });\n\n return answers;\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","/** Minimal structured logger for conveyor-agent (writes to stderr). */\nexport function createServiceLogger(service: string) {\n const prefix = `[conveyor-agent:${service}]`;\n return {\n info(message: string, data?: Record<string, unknown>): void {\n const extra = data ? ` ${JSON.stringify(data)}` : \"\";\n process.stderr.write(`${prefix} ${message}${extra}\\n`);\n },\n warn(message: string, data?: Record<string, unknown>): void {\n const extra = data ? ` ${JSON.stringify(data)}` : \"\";\n process.stderr.write(`${prefix} WARN ${message}${extra}\\n`);\n },\n error(message: string, data?: Record<string, unknown>): void {\n const extra = data ? ` ${JSON.stringify(data)}` : \"\";\n process.stderr.write(`${prefix} ERROR ${message}${extra}\\n`);\n },\n };\n}\n","import { execSync } from \"node:child_process\";\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 2>&1\", { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n return false;\n } catch (err: unknown) {\n const msg =\n err instanceof Error ? ((err as { stderr?: Buffer }).stderr?.toString() ?? 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","/**\n * Harness-neutral types for agent query execution.\n *\n * These types abstract the underlying agent SDK so that the runner,\n * execution, and tool layers never reference SDK-specific imports\n * directly. The only place that should import from\n * `@anthropic-ai/claude-agent-sdk` is `harness/claude-code/`.\n */\n\nimport type { z } from \"zod\";\n\n// ── Events emitted by the harness during a query ────────────────────────\n\nexport interface HarnessSystemInitEvent {\n type: \"system\";\n subtype: \"init\";\n session_id?: string;\n model: string;\n}\n\nexport interface HarnessCompactBoundaryEvent {\n type: \"system\";\n subtype: \"compact_boundary\";\n compact_metadata: { trigger: \"manual\" | \"auto\"; pre_tokens: number };\n}\n\nexport interface HarnessTaskStartedEvent {\n type: \"system\";\n subtype: \"task_started\";\n task_id: string;\n description: string;\n}\n\nexport interface HarnessTaskProgressEvent {\n type: \"system\";\n subtype: \"task_progress\";\n task_id: string;\n description: string;\n usage?: { tool_uses: number; duration_ms: number };\n}\n\nexport type HarnessSystemEvent =\n | HarnessSystemInitEvent\n | HarnessCompactBoundaryEvent\n | HarnessTaskStartedEvent\n | HarnessTaskProgressEvent;\n\nexport interface HarnessContentBlock {\n type: string;\n text?: string;\n name?: string;\n input?: unknown;\n id?: string;\n}\n\nexport interface HarnessAssistantEvent {\n type: \"assistant\";\n message: {\n role: \"assistant\";\n content: HarnessContentBlock[];\n usage?: {\n input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n };\n}\n\nexport interface HarnessResultSuccessEvent {\n type: \"result\";\n subtype: \"success\";\n result: string;\n total_cost_usd: number;\n modelUsage?: Record<string, unknown>;\n sessionId?: string;\n}\n\nexport interface HarnessResultErrorEvent {\n type: \"result\";\n subtype: \"error\";\n errors: string[];\n sessionId?: string;\n}\n\nexport type HarnessResultEvent = HarnessResultSuccessEvent | HarnessResultErrorEvent;\n\nexport interface HarnessRateLimitEvent {\n type: \"rate_limit_event\";\n rate_limit_info: {\n status: string;\n rateLimitType?: string;\n utilization?: number;\n resetsAt?: unknown;\n };\n}\n\nexport interface HarnessToolProgressEvent {\n type: \"tool_progress\";\n tool_name?: string;\n elapsed_time_seconds?: number;\n}\n\nexport type HarnessEvent =\n | HarnessSystemEvent\n | HarnessAssistantEvent\n | HarnessResultEvent\n | HarnessRateLimitEvent\n | HarnessToolProgressEvent;\n\n// ── User message fed into a query ───────────────────────────────────────\n\nexport interface HarnessUserMessage {\n type: \"user\";\n session_id: string;\n message: { role: \"user\"; content: string | unknown[] };\n parent_tool_use_id: null;\n}\n\n// ── Tool definition (harness-neutral) ───────────────────────────────────\n\nexport interface HarnessToolAnnotations {\n readOnlyHint?: boolean;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- generic tool handler */\nexport interface HarnessToolDefinition {\n name: string;\n description: string;\n schema: z.ZodRawShape;\n handler: (\n input: any,\n ) => Promise<{ content: { type: string; text?: string; data?: string; mimeType?: string }[] }>;\n annotations?: HarnessToolAnnotations;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n// ── Hook types ──────────────────────────────────────────────────────────\n\nexport interface HarnessHookInput {\n hook_event_name: string;\n tool_name: string;\n tool_response: unknown;\n}\n\nexport interface HarnessHookOutput {\n continue: boolean;\n}\n\nexport type HarnessPostToolUseHook = (input: HarnessHookInput) => Promise<HarnessHookOutput>;\n\n// ── MCP server handle (opaque to the runner) ────────────────────────────\n\n/** Opaque handle returned by `AgentHarness.createMcpServer()`. */\nexport type HarnessMcpServer = unknown;\n\n// ── Query options ───────────────────────────────────────────────────────\n\nexport interface HarnessQueryOptions {\n model: string;\n systemPrompt: unknown;\n cwd: string;\n permissionMode: \"plan\" | \"bypassPermissions\";\n allowDangerouslySkipPermissions: boolean;\n tools: { type: \"preset\"; preset: \"claude_code\" };\n mcpServers: Record<string, HarnessMcpServer>;\n settingSources?: (\"user\" | \"project\" | \"local\")[];\n sandbox?: { enabled: boolean };\n maxTurns?: number;\n maxBudgetUsd?: number;\n effort?: string;\n thinking?: unknown;\n betas?: unknown;\n disallowedTools?: string[];\n abortController?: AbortController;\n enableFileCheckpointing?: boolean;\n canUseTool?: (\n toolName: string,\n input: Record<string, unknown>,\n ) => Promise<\n | { behavior: \"allow\"; updatedInput?: Record<string, unknown> }\n | { behavior: \"deny\"; message: string }\n >;\n hooks?: Record<string, { hooks: HarnessPostToolUseHook[]; timeout: number }[]>;\n resume?: string;\n stderr?: (data: string) => void;\n}\n\n// ── Tool definition helper ──────────────────────────────────────────────\n\n/**\n * Construct a `HarnessToolDefinition` with the same signature as the SDK's\n * `tool()` helper, but without importing the SDK. The harness implementation\n * converts these into SDK-native tools when `createMcpServer()` is called.\n */\nexport function defineTool<T extends z.ZodRawShape>(\n name: string,\n description: string,\n schema: T,\n handler: (\n input: z.infer<z.ZodObject<T>>,\n ) => Promise<{ content: { type: string; text?: string; data?: string; mimeType?: string }[] }>,\n options?: { annotations?: HarnessToolAnnotations },\n): HarnessToolDefinition {\n return {\n name,\n description,\n schema,\n handler: handler as HarnessToolDefinition[\"handler\"],\n annotations: options?.annotations,\n };\n}\n\n// ── AgentHarness interface ──────────────────────────────────────────────\n\nexport interface AgentHarness {\n /** Start a streaming query and return an async generator of events. */\n executeQuery(options: {\n prompt: string | AsyncGenerator<HarnessUserMessage, void, unknown>;\n options: HarnessQueryOptions;\n resume?: string;\n }): AsyncGenerator<HarnessEvent, void>;\n\n /** Wrap an array of harness-neutral tool definitions into an MCP server. */\n createMcpServer(config: { name: string; tools: HarnessToolDefinition[] }): HarnessMcpServer;\n}\n","/**\n * ClaudeCodeHarness — wraps `@anthropic-ai/claude-agent-sdk` behind the\n * generic `AgentHarness` interface.\n *\n * This is the ONLY module that should import from the SDK.\n */\n\nimport { query, tool, createSdkMcpServer } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentHarness,\n HarnessEvent,\n HarnessQueryOptions,\n HarnessToolDefinition,\n HarnessMcpServer,\n HarnessUserMessage,\n} from \"../types.js\";\n\nexport class ClaudeCodeHarness implements AgentHarness {\n async *executeQuery(opts: {\n prompt: string | AsyncGenerator<HarnessUserMessage, void, unknown>;\n options: HarnessQueryOptions;\n resume?: string;\n }): AsyncGenerator<HarnessEvent, void> {\n const sdkEvents = query({\n prompt: opts.prompt as Parameters<typeof query>[0][\"prompt\"],\n options: {\n ...(opts.options as Parameters<typeof query>[0][\"options\"]),\n ...(opts.resume ? { resume: opts.resume } : {}),\n ...(opts.options.abortController ? { abortController: opts.options.abortController } : {}),\n },\n });\n\n for await (const event of sdkEvents) {\n yield event as unknown as HarnessEvent;\n }\n }\n\n createMcpServer(config: { name: string; tools: HarnessToolDefinition[] }): HarnessMcpServer {\n const sdkTools = config.tools.map((t) =>\n tool(\n t.name,\n t.description,\n t.schema,\n t.handler as Parameters<typeof tool>[3],\n t.annotations ? { annotations: t.annotations } : undefined,\n ),\n );\n return createSdkMcpServer({ name: config.name, tools: sdkTools });\n }\n}\n","export { defineTool } from \"./types.js\";\n\nexport type {\n AgentHarness,\n HarnessEvent,\n HarnessSystemEvent,\n HarnessSystemInitEvent,\n HarnessCompactBoundaryEvent,\n HarnessTaskStartedEvent,\n HarnessTaskProgressEvent,\n HarnessAssistantEvent,\n HarnessContentBlock,\n HarnessResultEvent,\n HarnessResultSuccessEvent,\n HarnessResultErrorEvent,\n HarnessRateLimitEvent,\n HarnessToolProgressEvent,\n HarnessUserMessage,\n HarnessToolDefinition,\n HarnessToolAnnotations,\n HarnessMcpServer,\n HarnessQueryOptions,\n HarnessHookInput,\n HarnessHookOutput,\n HarnessPostToolUseHook,\n} from \"./types.js\";\n\nexport { ClaudeCodeHarness } from \"./claude-code/index.js\";\n\nimport { ClaudeCodeHarness } from \"./claude-code/index.js\";\nimport type { AgentHarness } from \"./types.js\";\n\nexport function createHarness(): AgentHarness {\n return new ClaudeCodeHarness();\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 `- \"Hold\" — PR exists but is on hold for team review. Do not merge — skip and move on.`,\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 ` - \"Hold\": On hold — team must review before merge. Skip.`,\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\", \"Complete\", or \"Hold\" (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 `### 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 `### 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 `### Finishing Planning`,\n `Once your plan is complete and all required properties are set, 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 ];\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 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 `- 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 `### 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 `- 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 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 return parts.join(\"\\n\");\n }\n case \"review\":\n return [\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 `- For parent tasks: you can manage children, review child PRs, fire next child builds`,\n `- You have Pack Runner coordination tools (list_subtasks, fire builds, approve PRs)`,\n `- Goal: ensure quality, provide feedback, coordinate progression`,\n ].join(\"\\n\");\n case \"auto\":\n return buildAutoPrompt(context);\n case \"code-review\":\n return buildCodeReviewPrompt();\n default:\n return null;\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\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(-20);\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.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 `Use list_subtasks to review the current state of child tasks.`,\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 `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<{ time: string; event: EventRecord }>)\n .map((entry) => `[${entry.time}] [${entry.event.type}] ${formatCliEvent(entry.event)}`)\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\", \"Hold\", \"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);\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 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(`Failed to create pull request: ${msg}`);\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. Tiers: 'light' (1 CPU / 4 Gi — installs, basic dev servers), 'standard' (2 CPU / 8 Gi — full dev servers, test suites, typecheck), 'heavy' (4 CPU / 16 Gi — E2E tests, large parallel builds). Scaling is one-way (up only) and capped by project limits.\",\n {\n tier: z\n .enum([\"initial\", \"light\", \"standard\", \"heavy\"])\n .describe(\"The resource tier 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 if (result.currentTier === result.previousTier) {\n return textResult(\n `Already at ${result.currentTier} tier (${result.cpu} CPU / ${result.memory} Gi). No scaling needed.`,\n );\n }\n return textResult(\n `Scaled to ${result.cpu} CPU / ${result.memory} Gi (${result.currentTier} tier, 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: _plan, ordinal, storyPointValue }) => {\n try {\n const result = await connection.call(\"createSubtask\", {\n sessionId: connection.sessionId,\n title,\n description,\n storyPoints: storyPointValue,\n 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 ({\n subtaskId,\n title,\n description,\n plan: _plan,\n ordinal: _ordinal,\n storyPointValue: _sp,\n }) => {\n try {\n await connection.call(\"updateSubtask\", {\n sessionId: connection.sessionId,\n subtaskId,\n title,\n description,\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 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 \"Generate a new SVG icon using AI and assign it to this task. Only use if no existing icon from list_icons is a good fit. Provide a concise visual description.\",\n {\n prompt: z\n .string()\n .describe(\n \"Description of the icon to generate (e.g. 'minimal flat gear and wrench icon')\",\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 ...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\";\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 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","import type { QueryHost } from \"./query-executor.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 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:\n \"You are in auto plan mode. File writes are restricted to plan files. Call ExitPlanMode when your plan is ready to start building.\",\n };\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nasync function handleExitPlanMode(\n host: QueryHost,\n input: Record<string, unknown>,\n): Promise<ToolResult> {\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: string[] = [];\n\n if (!taskProps.plan?.trim()) missingProps.push(\"plan (save via update_task)\");\n if (!taskProps.storyPointId) missingProps.push(\"story points (use update_task_properties)\");\n if (!taskProps.title || taskProps.title === \"Untitled\")\n missingProps.push(\"title (use update_task_properties)\");\n\n if (missingProps.length > 0) {\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\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 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;\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 } 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\";\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 pendingModeRestart: boolean;\n sessionIds: Map<string, string>;\n activeQuery: AsyncGenerator<HarnessEvent, void> | null;\n pendingToolOutputs: string[];\n abortController: AbortController | null;\n isStopped(): boolean;\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 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 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 logger.error(\"Query execution failed\", { error: msg });\n this.connection.sendEvent({ type: \"error\", message: msg });\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 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 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\";\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 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 = config.agentMode ?? (config.runnerMode === \"pm\" ? \"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 this.connection.emitStatus(\"sleeping\");\n },\n onSleep: () => {\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 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 // oxlint-disable-next-line max-lines-per-function -- lifecycle orchestration is inherently sequential\n async start(): 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 // 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 // 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 // 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 // ── 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 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 if (this.fullContext && this.queryBridge) {\n await this.queryBridge.execute(this.fullContext, msg.content);\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 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.queryBridge?.execute(this.fullContext);\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.queryBridge?.execute(this.fullContext);\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 // ── 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.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.fullContext && this.queryBridge) {\n await this.queryBridge.execute(this.fullContext, prompt);\n }\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 githubPRUrl: ctx.githubPRUrl,\n claudeSessionId: ctx.claudeSessionId ?? null,\n isParentTask: !!ctx.parentTaskId,\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.onModeTransition = (newMode: AgentMode) => {\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 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 model: this.taskContext?.model,\n runnerMode: this.config.runnerMode ?? \"task\",\n sessionId: this.sessionId,\n isParentTask: this.fullContext?.isParentTask ?? false,\n status: this.taskContext?.status,\n };\n process.stderr.write(`[conveyor-agent] Initialized: ${JSON.stringify(context)}\\n`);\n this.connection.sendEvent({ type: \"initialization\", ...context });\n }\n}\n","import { io, type Socket } from \"socket.io-client\";\nimport type { AgentSessionServiceMethods, SocketResponse } 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 // ── 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 { hasUncommittedChanges, getCurrentBranch as gitGetCurrentBranch } 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\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\"],\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) => 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.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\"],\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 // ── Task management ────────────────────────────────────────────────────\n\n private handleAssignment(assignment: TaskAssignment): 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 if (this.activeAgents.has(agentKey)) {\n logger.info(\"Task already running, skipping\", { taskId: shortId });\n return;\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 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 let agent = this.activeAgents.get(taskId);\n if (!agent) agent = this.activeAgents.get(`${taskId}:code-review`);\n if (!agent) return;\n\n logger.info(\"Stopping task\", { taskId: taskId.slice(0, 8) });\n agent.process.kill(\"SIGTERM\");\n\n const timer = setTimeout(() => {\n if (this.activeAgents.has(taskId)) agent.process.kill(\"SIGKILL\");\n }, STOP_TIMEOUT_MS);\n\n agent.process.on(\"exit\", () => {\n clearTimeout(timer);\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): HarnessQueryOptions {\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 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}\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 = buildChatQueryOptions(agentCtx, projectDir, connection);\n const prompt = buildPrompt(message, chatHistory);\n\n connection.emitStatus(\"busy\");\n const harness = createHarness();\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 });\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 });\n } catch {\n // best effort\n }\n return undefined;\n } finally {\n connection.emitStatus(\"idle\");\n }\n}\n"],"mappings":"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","names":["resolve","findLastAgentMessageIndex","z","z","z","SP_DESCRIPTION","z","z","z","z","z","z","z","formatError","z","requireDebugClient","formatError","z","isAuthError","result","API_ERROR_PATTERN","resolve","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"]}
|