{"version":3,"file":"format.cli.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.ts"],"sourcesContent":["import { agentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport { DoomToolCall, renderToolHeading } from '@agimon-ai/doompi-ui/toolChrome';\nimport type { Theme } from '@earendil-works/pi-coding-agent';\nimport { type Component, Text, truncateToWidth, visibleWidth } from '@earendil-works/pi-tui';\n\nimport type {\n  Task,\n  TaskAction,\n  TaskDetails,\n  TaskItemMutation,\n  TaskMutationParams,\n  TaskStatus,\n} from '../../../../../models/task';\nimport { DelegationManager, type DelegationProgress } from '../../../../../services/delegation';\n\nexport const STATUS_GLYPH: Record<TaskStatus, string> = {\n  pending: '○',\n  in_progress: '◐',\n  completed: '●',\n  failed: '✗',\n  deleted: '⊘',\n};\n\ntype TaskStatusColor = 'dim' | 'warning' | 'success' | 'error' | 'muted';\n\nexport const STATUS_COLOR: Record<TaskStatus, TaskStatusColor> = {\n  pending: 'dim',\n  in_progress: 'warning',\n  completed: 'success',\n  failed: 'error',\n  deleted: 'muted',\n};\n\nexport const STATUS_LABEL: Record<TaskStatus, string> = {\n  pending: 'pending',\n  in_progress: 'in progress',\n  completed: 'completed',\n  failed: 'failed',\n  deleted: 'deleted',\n};\n\nconst OVERLAY_STATUS_GLYPH: Record<TaskStatus, string> = {\n  ...STATUS_GLYPH,\n  completed: '✓',\n  deleted: STATUS_GLYPH.failed,\n};\n\nconst OVERLAY_STATUS_COLOR: Record<TaskStatus, TaskStatusColor> = {\n  ...STATUS_COLOR,\n  deleted: 'error',\n};\nconst MILLISECONDS_PER_SECOND = 1000;\nconst SECONDS_PER_MINUTE = 60;\nconst MINUTES_PER_HOUR = 60;\nconst TOKENS_PER_KILO = 1000;\nconst TOKEN_DECIMAL_LIMIT = 10_000;\nconst REDUNDANT_WORKING_PREFIX = /^working:\\s*/i;\nconst INLINE_WHITESPACE = /\\s+/gu;\n\n/** Keep dynamic content inside the overlay's one-physical-line contract. */\nfunction inlineText(text: string): string {\n  return text.replace(INLINE_WHITESPACE, ' ').trim();\n}\n\n/** Thinking text already communicates activity; keep only its useful content. */\nfunction progressText(currentTool: string | undefined): string | undefined {\n  if (!currentTool) return undefined;\n  const text = inlineText(currentTool.replace(REDUNDANT_WORKING_PREFIX, ''));\n  return text || undefined;\n}\n\nexport const ACTION_GLYPH: Record<TaskAction, string> = {\n  upsert: '✎',\n  delete: '×',\n  get: '›',\n  list: '☰',\n  clear: '∅',\n  assign: '⇒',\n  cancel: '⊗',\n};\n\n/**\n * `upsert` is two operations behind one name, so a homogeneous batch narrows to\n * the glyph the operator already reads: `+` means new work appeared, `→` means\n * work moved. A mixed batch keeps the neutral write glyph.\n */\nconst UPSERT_CREATE_GLYPH = '+';\nconst UPSERT_UPDATE_GLYPH = '→';\n\nfunction upsertGlyph(items: readonly TaskItemMutation[]): string {\n  if (items.length === 0) return ACTION_GLYPH.upsert;\n  if (items.every((item) => item.id === undefined)) return UPSERT_CREATE_GLYPH;\n  if (items.every((item) => item.id !== undefined)) return UPSERT_UPDATE_GLYPH;\n  return ACTION_GLYPH.upsert;\n}\n\nexport function overlayStatusGlyph(status: TaskStatus, theme: Theme): string {\n  return theme.fg(OVERLAY_STATUS_COLOR[status], OVERLAY_STATUS_GLYPH[status]);\n}\n\nexport function formatElapsedMs(durationMs: number): string {\n  const totalSeconds = Math.max(0, Math.floor(durationMs / MILLISECONDS_PER_SECOND));\n  const seconds = totalSeconds % SECONDS_PER_MINUTE;\n  const totalMinutes = Math.floor(totalSeconds / SECONDS_PER_MINUTE);\n  if (totalMinutes < MINUTES_PER_HOUR) {\n    return totalMinutes === 0 ? `${seconds}s` : `${totalMinutes}m${String(seconds).padStart(2, '0')}s`;\n  }\n  const minutes = totalMinutes % MINUTES_PER_HOUR;\n  const hours = Math.floor(totalMinutes / MINUTES_PER_HOUR);\n  return `${hours}h${String(minutes).padStart(2, '0')}m${String(seconds).padStart(2, '0')}s`;\n}\n\nexport function formatTokenCount(tokens: number): string {\n  const count = Math.max(0, Math.round(tokens));\n  if (count < TOKENS_PER_KILO) return String(count);\n  if (count < TOKEN_DECIMAL_LIMIT) return `${(count / TOKENS_PER_KILO).toFixed(1)}k`;\n  return `${Math.round(count / TOKENS_PER_KILO)}k`;\n}\n\n/**\n * One task row for the persistent overlay.\n *\n * A delegated row carries the agent name and its current tool so the operator\n * can see that background work is progressing without opening a transcript.\n */\nexport function formatOverlayTaskLine(\n  task: Task,\n  theme: Theme,\n  showId: boolean,\n  progress?: DelegationProgress,\n  nowMs = Date.now(),\n  agentColor?: Parameters<Theme['fg']>[0],\n): string {\n  const subjectColor =\n    task.status === 'in_progress'\n      ? 'accent'\n      : task.status === 'completed' || task.status === 'deleted'\n        ? 'muted'\n        : 'text';\n  let subject = theme.fg(subjectColor, inlineText(task.subject));\n  if (task.status === 'completed' || task.status === 'deleted') {\n    subject = theme.strikethrough(subject);\n  }\n\n  let line = overlayStatusGlyph(task.status, theme);\n  if (showId) line += ` ${theme.fg('dim', `#${task.id}`)}`;\n  line += ` ${subject}`;\n\n  const agent = task.delegation?.agent;\n  const agentLabel = agent ? inlineText(agent) : undefined;\n  if (agentLabel && task.delegation?.state === 'running') {\n    // No progress means no timing is known, so the chips are omitted rather than\n    // reported as `[0s]`. The transcript renderer has no progress feed at all.\n    const chips: string[] = [];\n    if (progress) {\n      chips.push(theme.fg('muted', `[${formatElapsedMs(DelegationManager.elapsedMs(progress, nowMs))}]`));\n      if (progress.tokens !== undefined) chips.push(theme.fg('muted', `[${formatTokenCount(progress.tokens)}]`));\n    }\n    const identity = task.delegation.runId ?? task.delegation.requestId;\n    chips.push(theme.fg(agentColor ?? agentIdentityColor(identity), `[${agentLabel}]`));\n    line += ` ${chips.join('')}`;\n    const activity = progressText(progress?.currentTool);\n    if (activity) line += ` ${theme.fg('muted', `· ${activity}`)}`;\n  } else if (agentLabel) {\n    line += ` ${theme.fg('muted', `[${agentLabel}]`)}`;\n  }\n\n  if (task.status === 'in_progress' && task.activeForm) {\n    line += ` ${theme.fg('muted', `(${inlineText(task.activeForm)})`)}`;\n  }\n  if (task.blockedBy?.length) {\n    line += ` ${theme.fg('muted', `⛓ ${task.blockedBy.map((id) => `#${id}`).join(',')}`)}`;\n  }\n  return line;\n}\n\n/** One task line for the `/tasks` command output. */\nexport function formatCommandTaskLine(task: Task, glyph: string): string {\n  const form = task.status === 'in_progress' && task.activeForm ? ` (${task.activeForm})` : '';\n  const agent = task.delegation?.agent ? ` [${task.delegation.agent}]` : '';\n  const block = task.blockedBy?.length ? `    ⛓ ${task.blockedBy.map((id) => `#${id}`).join(',')}` : '';\n  return `  ${glyph} #${task.id} ${task.subject}${form}${agent}${block}`;\n}\n\nexport function renderTaskCall(\n  args: TaskMutationParams & { action: TaskAction },\n  theme: Theme,\n  tasks: readonly Task[],\n): Component {\n  const items = args.action === 'upsert' ? (args.tasks ?? []) : [];\n  const glyph = args.action === 'upsert' ? upsertGlyph(items) : (ACTION_GLYPH[args.action] ?? args.action);\n  let text = renderToolHeading('task', `${glyph} ${args.action}`, theme);\n\n  if (args.action === 'upsert') {\n    // One entry reads exactly as create or update did; a batch reads as a count\n    // rather than a subject it would have to pick arbitrarily.\n    if (items.length === 1) {\n      const only = items[0];\n      if (only.id === undefined) {\n        if (only.subject) text += ` ${theme.fg('dim', only.subject)}`;\n      } else {\n        const subject = tasks.find((task) => task.id === only.id)?.subject ?? only.subject ?? `#${only.id}`;\n        text += ` ${theme.fg('accent', subject)}`;\n      }\n    } else if (items.length > 1) {\n      text += ` ${theme.fg('dim', `${items.length} tasks`)}`;\n    }\n  } else if (args.action === 'assign') {\n    const assignments = args.assignments ?? [];\n    if (assignments.length === 1) {\n      const only = assignments[0];\n      const subject = tasks.find((task) => task.id === only.id)?.subject ?? `#${only.id}`;\n      text += ` ${theme.fg('accent', subject)}`;\n      if (only.agent) text += ` ${theme.fg('muted', `→ ${only.agent}`)}`;\n    } else if (assignments.length > 1) {\n      text += ` ${theme.fg('dim', `${assignments.length} tasks`)}`;\n    }\n  } else if ((args.action === 'get' || args.action === 'delete' || args.action === 'cancel') && args.id !== undefined) {\n    const subject = tasks.find((task) => task.id === args.id)?.subject ?? `#${args.id}`;\n    text += ` ${theme.fg('accent', subject)}`;\n  } else if (args.action === 'list' && args.status) {\n    text += ` ${theme.fg('muted', STATUS_LABEL[args.status])}`;\n  }\n  return new DoomToolCall(text);\n}\n\n/** Task rows kept in a collapsed result, before `ctrl+o` reveals the rest. */\nconst TRANSCRIPT_TASK_ROWS = 8;\n/** Minimum gap between a row's subject and its right-aligned status. */\nconst STATUS_GUTTER = 2;\n\nexport interface JustifiedRow {\n  left: string;\n  /** Pinned to the right edge. The subject is truncated before this is dropped. */\n  right?: string;\n}\n\n/**\n * Rows whose trailing text is flushed right.\n *\n * `Text` cannot do this: the status has to be placed against the viewport edge,\n * which is only known at render time.\n */\nexport class JustifiedRows implements Component {\n  constructor(private readonly rows: readonly JustifiedRow[]) {}\n\n  /**\n   * Nothing to discard: the rows are themed by the caller and held verbatim, and\n   * Pi rebuilds this component from `renderResult` whenever the theme changes.\n   */\n  invalidate(): void {}\n\n  render(width: number): string[] {\n    return this.rows.map(({ left, right }) => {\n      if (right === undefined || right.length === 0) return truncateToWidth(left, width);\n      const rightWidth = visibleWidth(right);\n      const room = width - rightWidth - STATUS_GUTTER;\n      if (room <= 0) return truncateToWidth(left, width);\n      const subject = truncateToWidth(left, room);\n      const gap = Math.max(STATUS_GUTTER, width - visibleWidth(subject) - rightWidth);\n      return subject + ' '.repeat(gap) + right;\n    });\n  }\n}\n\n/**\n * Self-owned task shell with the same structural divider as the bash tool.\n *\n * Task rows already carry precise per-task state, so the divider stays neutral\n * instead of competing with or appearing to animate between those states.\n */\nclass TaskResultFrame implements Component {\n  constructor(\n    private readonly content: Component,\n    private readonly theme: Theme,\n  ) {}\n\n  render(width: number): string[] {\n    if (width <= 0) return [];\n    if (width < 3) return this.content.render(width);\n\n    const contentWidth = width - 2;\n    const divider = this.theme.fg('borderMuted', '─'.repeat(contentWidth));\n    const lines = this.content.render(contentWidth).map((line) => ` ${line}`);\n    return [` ${divider}`, ...lines, ''];\n  }\n\n  invalidate(): void {\n    this.content.invalidate();\n  }\n}\n\nexport interface TaskResultLike {\n  content?: Array<{ type: string; text?: string }>;\n  details?: unknown;\n  isError?: boolean;\n}\n\nexport interface TaskResultOptions {\n  expanded: boolean;\n  isPartial: boolean;\n}\n\n/** Concatenated result text, which is all a thrown failure leaves behind. */\nfunction contentText(result: TaskResultLike): string {\n  return (result.content ?? []).map((block) => block.text ?? '').join('');\n}\n\nfunction nonEmptyLines(text: string): string[] {\n  return text.split('\\n').filter((line) => line.trim().length > 0);\n}\n\n/**\n * The rows `list` reported to the model.\n *\n * `details.tasks` is the whole post-mutation document, so the filters applied by\n * `formatContent` have to be applied again here or the transcript would disagree\n * with the text the model was given.\n */\nfunction listedTasks(details: TaskDetails): Task[] {\n  const params = details.params as TaskMutationParams;\n  let view = details.tasks;\n  if (params.includeDeleted !== true) view = view.filter((task) => task.status !== 'deleted');\n  if (params.status) view = view.filter((task) => task.status === params.status);\n  return view;\n}\n\n/** The single task an id-bearing action acted on, so the transcript names it rather than a bare tick. */\nfunction subjectTask(details: TaskDetails): Task | undefined {\n  const params = details.params as TaskMutationParams;\n  if (params.id === undefined) return undefined;\n  return details.tasks.find((task) => task.id === params.id);\n}\n\n/**\n * Tasks an upsert applied, resolved from the ids the reducer reported.\n *\n * The ids are read rather than guessed from the tail of the list: a batch\n * touches many rows, and a failed entry contributes none.\n */\nfunction upsertTasks(details: TaskDetails): Task[] {\n  return (details.upsert?.applied ?? []).flatMap((id) => details.tasks.find((task) => task.id === id) ?? []);\n}\n\n/** Tasks successfully handed off by a native assignment batch. */\nfunction assignedTasks(details: TaskDetails): Task[] {\n  return (details.assignment?.assigned ?? []).flatMap((id) => details.tasks.find((task) => task.id === id) ?? []);\n}\n\nfunction renderTaskResultBody(result: TaskResultLike, options: TaskResultOptions, theme: Theme): Component {\n  const details = result.details as TaskDetails | undefined;\n\n  // Running. `assign` and `cancel` stream a placeholder before the run settles.\n  if (options.isPartial) {\n    const text = nonEmptyLines(contentText(result)).at(-1) ?? 'working';\n    return new Text(theme.fg('warning', '◐') + theme.fg('dim', ` ${text}`), 0, 0);\n  }\n\n  // Failed. Every failure path throws, so Pi hands back error text and no\n  // details; without this the block would render a green tick on a failure.\n  if (result.isError === true || details?.error !== undefined) {\n    const message = details?.error ?? contentText(result);\n    const all = nonEmptyLines(message);\n    if (all.length <= 1) {\n      return new Text(theme.fg('error', '✗') + theme.fg('dim', all[0] ? ` ${all[0]}` : ''), 0, 0);\n    }\n    const body = options.expanded ? all : all.slice(0, TRANSCRIPT_TASK_ROWS);\n    return new Text([...body.map((line) => theme.fg('toolOutput', line)), theme.fg('error', '✗')].join('\\n'), 0, 0);\n  }\n\n  if (!details) return new Text(theme.fg('success', '✓'), 0, 0);\n\n  /** Status rides on the task's own row, flushed right, rather than costing a line. */\n  const row = (task: Task): JustifiedRow => ({\n    left: formatOverlayTaskLine(task, theme, true),\n    right: theme.fg(STATUS_COLOR[task.status], STATUS_LABEL[task.status]),\n  });\n\n  if (details.action === 'list') {\n    const tasks = listedTasks(details);\n    const shown = options.expanded ? tasks : tasks.slice(0, TRANSCRIPT_TASK_ROWS);\n    const rows: JustifiedRow[] = shown.map(row);\n    let summary = tasks.length === 0 ? 'no tasks' : `${tasks.length} task${tasks.length === 1 ? '' : 's'}`;\n    if (tasks.length > shown.length) summary += ' · ctrl+o';\n    rows.push({ left: theme.fg('success', '✓') + theme.fg('dim', ` ${summary}`) });\n    return new JustifiedRows(rows);\n  }\n\n  if (details.action === 'clear') {\n    return new Text(theme.fg('success', '✓') + theme.fg('dim', ' cleared'), 0, 0);\n  }\n\n  if (details.action === 'assign' && details.assignment) {\n    const assigned = assignedTasks(details);\n    const failed = details.assignment.failed;\n    if (assigned.length === 1 && failed === 0) return new JustifiedRows([row(assigned[0])]);\n\n    const shown = options.expanded ? assigned : assigned.slice(0, TRANSCRIPT_TASK_ROWS);\n    const rows: JustifiedRow[] = shown.map(row);\n    let summary = `${assigned.length} assigned`;\n    if (failed > 0) summary += ` · ${failed} failed`;\n    if (assigned.length > shown.length) summary += ' · ctrl+o';\n    const mark = failed > 0 ? theme.fg('warning', '!') : theme.fg('success', '✓');\n    rows.push({ left: mark + theme.fg('dim', ` ${summary}`) });\n    return new JustifiedRows(rows);\n  }\n\n  if (details.action === 'upsert') {\n    const touched = upsertTasks(details);\n    const failed = details.upsert?.failed ?? 0;\n    // One applied task and nothing failed is the common case: keep the single\n    // row it has always had rather than dressing it as a bulk report.\n    if (touched.length === 1 && failed === 0) return new JustifiedRows([row(touched[0])]);\n\n    const shown = options.expanded ? touched : touched.slice(0, TRANSCRIPT_TASK_ROWS);\n    const rows: JustifiedRow[] = shown.map(row);\n    let summary = `${touched.length} applied`;\n    if (failed > 0) summary += ` · ${failed} failed`;\n    if (touched.length > shown.length) summary += ' · ctrl+o';\n    // Failed entries get no row: there is no task to render, and their messages\n    // are already in the text the model was given.\n    const mark = failed > 0 ? theme.fg('warning', '!') : theme.fg('success', '✓');\n    rows.push({ left: mark + theme.fg('dim', ` ${summary}`) });\n    return new JustifiedRows(rows);\n  }\n\n  const task = subjectTask(details);\n  if (!task) return new Text(theme.fg('success', '✓'), 0, 0);\n  return new JustifiedRows([row(task)]);\n}\n\nexport function renderTaskResult(result: TaskResultLike, options: TaskResultOptions, theme: Theme): Component {\n  return new TaskResultFrame(renderTaskResultBody(result, options, theme), theme);\n}\n"],"mappings":"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"}