{"version":3,"file":"async-stop-action.d.ts","sourceRoot":"","sources":["../../../../src/runs/foreground/async-stop-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAoBpE,wBAAgB,YAAY,CAC3B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,OAAO,EAC5D,QAAQ,CAAC,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,CA0CjC","sourcesContent":["import * as path from \"node:path\";\nimport type { AgentToolResult } from \"@lpb-work/pi-agent-core\";\nimport type { Details, SubagentState } from \"../../shared/types.ts\";\nimport { deliverStopRequest } from \"../background/control-channel.ts\";\nimport { reconcileAsyncRun } from \"../background/stale-run-reconciler.ts\";\n\nfunction getAsyncStopTarget(\n\tstate: SubagentState,\n\trunId: string | undefined,\n\tlocation?: { asyncDir: string | null; resolvedId?: string },\n): { asyncId: string; asyncDir: string } | undefined {\n\tif (location?.asyncDir) {\n\t\treturn {\n\t\t\tasyncId: location.resolvedId ?? runId ?? path.basename(location.asyncDir),\n\t\t\tasyncDir: location.asyncDir,\n\t\t};\n\t}\n\tif (!runId) return undefined;\n\tconst direct = state.asyncJobs.get(runId);\n\treturn direct ? { asyncId: direct.asyncId, asyncDir: direct.asyncDir } : undefined;\n}\n\nexport function stopAsyncRun(\n\tstate: SubagentState,\n\trunId: string | undefined,\n\tkill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean,\n\tlocation?: { asyncDir: string | null; resolvedId?: string },\n): AgentToolResult<Details> | null {\n\tconst target = getAsyncStopTarget(state, runId, location);\n\tif (!target) return null;\n\tconst status = reconcileAsyncRun(target.asyncDir, { kill }).status;\n\tif (state.currentSessionId && status?.sessionId !== state.currentSessionId) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Async run '${target.asyncId}' was not found in the active session.` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: \"management\", results: [] },\n\t\t};\n\t}\n\tif (!status || (status.state !== \"running\" && status.state !== \"queued\")) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `No running or queued async run was found for '${runId ?? \"current\"}'.` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: \"management\", results: [] },\n\t\t};\n\t}\n\ttry {\n\t\tdeliverStopRequest({\n\t\t\tasyncDir: target.asyncDir,\n\t\t\tpid: typeof status.pid === \"number\" ? status.pid : undefined,\n\t\t\tkill,\n\t\t\tsource: \"stop-action\",\n\t\t});\n\t\tconst tracked = state.asyncJobs.get(target.asyncId);\n\t\tif (tracked) {\n\t\t\ttracked.activityState = undefined;\n\t\t\ttracked.updatedAt = Date.now();\n\t\t}\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Stop requested for async run ${target.asyncId}.` }],\n\t\t\tdetails: { mode: \"management\", results: [] },\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Failed to stop async run ${target.asyncId}: ${message}` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: \"management\", results: [] },\n\t\t};\n\t}\n}\n"]}