{"version":3,"file":"status-format.d.ts","sourceRoot":"","sources":["../../../src/shared/status-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,KAAK,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAQnD,wBAAgB,mBAAmB,CAClC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,aAAa,CAAC,EAAE,aAAa,EAC7B,GAAG,SAAa,GACd,MAAM,GAAG,SAAS,CAapB;AAMD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,CAOnF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,MAAM,CAYR","sourcesContent":["import type { ActivityState, AsyncJobStep } from \"./types.ts\";\n\ntype StepStatusLike = Pick<AsyncJobStep, \"status\">;\n\nfunction formatActivityAge(ms: number): string {\n\tif (ms < 1000) return \"now\";\n\tif (ms < 60000) return `${Math.floor(ms / 1000)}s`;\n\treturn `${Math.floor(ms / 60000)}m`;\n}\n\nexport function formatActivityLabel(\n\tlastActivityAt: number | undefined,\n\tactivityState?: ActivityState,\n\tnow = Date.now(),\n): string | undefined {\n\tif (lastActivityAt === undefined) {\n\t\tif (activityState === \"needs_attention\") return \"needs attention\";\n\t\tif (activityState === \"active_long_running\") return \"active but long-running\";\n\t\treturn undefined;\n\t}\n\tconst age = formatActivityAge(Math.max(0, now - lastActivityAt));\n\tif (activityState === \"needs_attention\") return `no activity for ${age}`;\n\tif (activityState === \"active_long_running\") {\n\t\tconst activityAge = age === \"now\" ? \"now\" : `${age} ago`;\n\t\treturn `active but long-running · last activity ${activityAge}`;\n\t}\n\treturn age === \"now\" ? \"active now\" : `active ${age} ago`;\n}\n\nfunction isCompletedStepStatus(status: AsyncJobStep[\"status\"]): boolean {\n\treturn status === \"complete\" || status === \"completed\";\n}\n\nexport function aggregateStepStatus(steps: StepStatusLike[]): AsyncJobStep[\"status\"] {\n\tif (steps.some((step) => step.status === \"running\")) return \"running\";\n\tif (steps.some((step) => step.status === \"failed\")) return \"failed\";\n\tif (steps.some((step) => step.status === \"stopped\")) return \"stopped\";\n\tif (steps.some((step) => step.status === \"paused\")) return \"paused\";\n\tif (steps.length > 0 && steps.every((step) => isCompletedStepStatus(step.status))) return \"complete\";\n\treturn \"pending\";\n}\n\nexport function formatAgentRunningLabel(count: number): string {\n\treturn count === 1 ? \"1 agent running\" : `${count} agents running`;\n}\n\nexport function formatParallelOutcome(\n\tsteps: StepStatusLike[],\n\ttotal: number,\n\toptions: { showRunning?: boolean } = {},\n): string {\n\tconst running = steps.filter((step) => step.status === \"running\").length;\n\tconst done = steps.filter((step) => isCompletedStepStatus(step.status)).length;\n\tconst failed = steps.filter((step) => step.status === \"failed\").length;\n\tconst stopped = steps.filter((step) => step.status === \"stopped\").length;\n\tconst paused = steps.filter((step) => step.status === \"paused\").length;\n\tconst parts = [`${done}/${total} done`];\n\tif (options.showRunning !== false && running > 0) parts.unshift(formatAgentRunningLabel(running));\n\tif (failed > 0) parts.push(`${failed} failed`);\n\tif (stopped > 0) parts.push(`${stopped} stopped`);\n\tif (paused > 0) parts.push(`${paused} paused`);\n\treturn parts.join(\" · \");\n}\n"]}