@athenaintel/react 0.50.0 → 0.53.0

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.
Files changed (112) hide show
  1. package/README.md +24 -0
  2. package/dist/agent-runtime/src/desktop-handoff.d.ts +10 -0
  3. package/dist/agent-runtime/src/edit-command.cjs +21 -0
  4. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  5. package/dist/agent-runtime/src/edit-command.d.ts +8 -0
  6. package/dist/agent-runtime/src/edit-command.js +21 -0
  7. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  8. package/dist/agent-runtime/src/handoff-arrival.cjs +19 -0
  9. package/dist/agent-runtime/src/handoff-arrival.cjs.map +1 -1
  10. package/dist/agent-runtime/src/handoff-arrival.d.ts +18 -3
  11. package/dist/agent-runtime/src/handoff-arrival.js +20 -1
  12. package/dist/agent-runtime/src/handoff-arrival.js.map +1 -1
  13. package/dist/agent-runtime/src/handoff-cursor-id.cjs +6 -0
  14. package/dist/agent-runtime/src/handoff-cursor-id.cjs.map +1 -0
  15. package/dist/agent-runtime/src/handoff-cursor-id.d.ts +12 -0
  16. package/dist/agent-runtime/src/handoff-cursor-id.js +6 -0
  17. package/dist/agent-runtime/src/handoff-cursor-id.js.map +1 -0
  18. package/dist/agent-runtime/src/handoff-cursor.cjs +88 -0
  19. package/dist/agent-runtime/src/handoff-cursor.cjs.map +1 -0
  20. package/dist/agent-runtime/src/handoff-cursor.d.ts +120 -0
  21. package/dist/agent-runtime/src/handoff-cursor.js +88 -0
  22. package/dist/agent-runtime/src/handoff-cursor.js.map +1 -0
  23. package/dist/agent-runtime/src/index.d.ts +4 -3
  24. package/dist/agent-runtime/src/thread-handoff-flow-machine.d.ts +6 -0
  25. package/dist/agent-runtime/src/thread-handoff-protocol.d.ts +114 -4
  26. package/dist/agent-runtime/src/thread-handoff.d.ts +1 -1
  27. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs +8 -3
  28. package/dist/agent-runtime/src/use-deep-agent-window-sync.cjs.map +1 -1
  29. package/dist/agent-runtime/src/use-deep-agent-window-sync.d.ts +7 -0
  30. package/dist/agent-runtime/src/use-deep-agent-window-sync.js +9 -4
  31. package/dist/agent-runtime/src/use-deep-agent-window-sync.js.map +1 -1
  32. package/dist/agent-runtime/src/use-thread-handoff-flow.d.ts +5 -0
  33. package/dist/chat/AthenaChat.cjs +27 -12
  34. package/dist/chat/AthenaChat.cjs.map +1 -1
  35. package/dist/chat/AthenaChat.d.ts +13 -0
  36. package/dist/chat/AthenaChat.js +27 -12
  37. package/dist/chat/AthenaChat.js.map +1 -1
  38. package/dist/chat/AthenaPlanStrip.cjs +97 -0
  39. package/dist/chat/AthenaPlanStrip.cjs.map +1 -0
  40. package/dist/chat/AthenaPlanStrip.d.ts +15 -0
  41. package/dist/chat/AthenaPlanStrip.js +97 -0
  42. package/dist/chat/AthenaPlanStrip.js.map +1 -0
  43. package/dist/chat/super-grouping/SuperGroupingCard.cjs +4 -2
  44. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  45. package/dist/chat/super-grouping/SuperGroupingCard.js +4 -2
  46. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  47. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +4 -2
  48. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  49. package/dist/chat/super-grouping/SuperGroupingTranscript.js +4 -2
  50. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  51. package/dist/chat/super-grouping/activity-timeline.cjs +6 -4
  52. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  53. package/dist/chat/super-grouping/activity-timeline.d.ts +9 -1
  54. package/dist/chat/super-grouping/activity-timeline.js +6 -4
  55. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  56. package/dist/chat/super-grouping/index.d.ts +1 -1
  57. package/dist/chat/super-grouping/use-earlier-steps-unloaded.cjs +17 -0
  58. package/dist/chat/super-grouping/use-earlier-steps-unloaded.cjs.map +1 -0
  59. package/dist/chat/super-grouping/use-earlier-steps-unloaded.d.ts +8 -0
  60. package/dist/chat/super-grouping/use-earlier-steps-unloaded.js +17 -0
  61. package/dist/chat/super-grouping/use-earlier-steps-unloaded.js.map +1 -0
  62. package/dist/chat-ui/index.cjs +8 -0
  63. package/dist/chat-ui/index.cjs.map +1 -1
  64. package/dist/chat-ui/index.d.ts +2 -1
  65. package/dist/chat-ui/index.js +9 -1
  66. package/dist/chat-ui/index.js.map +1 -1
  67. package/dist/chat-ui/mentions/mention-chip.cjs +1 -12
  68. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  69. package/dist/chat-ui/mentions/mention-chip.js +1 -12
  70. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  71. package/dist/chat-ui/mentions/use-mention-asset.cjs +18 -3
  72. package/dist/chat-ui/mentions/use-mention-asset.cjs.map +1 -1
  73. package/dist/chat-ui/mentions/use-mention-asset.js +19 -4
  74. package/dist/chat-ui/mentions/use-mention-asset.js.map +1 -1
  75. package/dist/chat-ui/thread/chat-thread-shell.cjs +2 -0
  76. package/dist/chat-ui/thread/chat-thread-shell.cjs.map +1 -1
  77. package/dist/chat-ui/thread/chat-thread-shell.d.ts +4 -0
  78. package/dist/chat-ui/thread/chat-thread-shell.js +2 -0
  79. package/dist/chat-ui/thread/chat-thread-shell.js.map +1 -1
  80. package/dist/chat-ui/thread/handoff-cursor.cjs +216 -0
  81. package/dist/chat-ui/thread/handoff-cursor.cjs.map +1 -0
  82. package/dist/chat-ui/thread/handoff-cursor.d.ts +57 -0
  83. package/dist/chat-ui/thread/handoff-cursor.js +216 -0
  84. package/dist/chat-ui/thread/handoff-cursor.js.map +1 -0
  85. package/dist/chat-ui/thread/statewire-history-edge.cjs +2 -0
  86. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  87. package/dist/chat-ui/thread/statewire-history-edge.d.ts +2 -0
  88. package/dist/chat-ui/thread/statewire-history-edge.js +3 -1
  89. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  90. package/dist/index.cjs +2 -0
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.ts +2 -1
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs +20 -3
  96. package/dist/keryx-http/src/unconfirmed-update-attributions.cjs.map +1 -1
  97. package/dist/keryx-http/src/unconfirmed-update-attributions.d.ts +11 -2
  98. package/dist/keryx-http/src/unconfirmed-update-attributions.js +21 -4
  99. package/dist/keryx-http/src/unconfirmed-update-attributions.js.map +1 -1
  100. package/dist/react/package.json.cjs +1 -1
  101. package/dist/react/package.json.js +1 -1
  102. package/dist/styles.css +1 -1
  103. package/dist/tools/write-todos-tool-ui.cjs +8 -0
  104. package/dist/tools/write-todos-tool-ui.cjs.map +1 -1
  105. package/dist/tools/write-todos-tool-ui.d.ts +2 -0
  106. package/dist/tools/write-todos-tool-ui.js +8 -0
  107. package/dist/tools/write-todos-tool-ui.js.map +1 -1
  108. package/dist/workbench/session-workbench-panes.cjs +1 -8
  109. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  110. package/dist/workbench/session-workbench-panes.js +2 -9
  111. package/dist/workbench/session-workbench-panes.js.map +1 -1
  112. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"session-workbench-panes.js","sources":["../../src/workbench/session-workbench-panes.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The built-in panes of `SessionWorkbench` — Tasks, Shell, Computer, Pull\n * requests and Attachments. Each reads one source:\n *\n * - Tasks: the thread state's `todos` channel (the deepagents plan), else the\n * newest `write_todos` call in the loaded transcript.\n * - Shell: every `execute` call in the loaded transcript; while the thread has\n * older history the chat has not loaded, it says so and loads the next page\n * on request (`StatewireHistoryContext`).\n * - Computer / Attachments: the session's workspace\n * (`GET /api/conversations/threads/{id}/workspace`), plus the computer's\n * status and SSH target; the Computer pane also shows the computer's screen\n * live (`ComputerLiveDesktop`).\n * - Pull requests: the thread list's live pull-request state for the session.\n */\nimport { useAuiState } from '@assistant-ui/react';\nimport { useStatewireState } from '@assistant-ui/react-statewire';\nimport {\n type ConversationPullRequest,\n hasStatewireThreadExtras,\n readDeepAgentStreamValues,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n BookOpenIcon,\n CheckIcon,\n CircleDashedIcon,\n CopyIcon,\n ExternalLinkIcon,\n FileIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n GitPullRequestIcon,\n ImageIcon,\n ListChecksIcon,\n LoaderIcon,\n MonitorIcon,\n PaperclipIcon,\n PresentationIcon,\n SearchIcon,\n TerminalIcon,\n XIcon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useMemo, useState } from 'react';\nimport { type AssetType as AssetPanelType, useAssetPanelStore } from '../assets/asset-panel-store';\nimport { athenaLinkAppUrl, createAthenaSpacesUrl } from '../lib/athena-urls';\nimport { cn } from '../lib/utils';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type StatewireHistoryState,\n useStatewireHistory,\n} from '../provider/statewire-history-context';\nimport { PR_CHECKS_LABEL, PR_STATE_CLASS, PR_STATE_ICON } from '../threads/pull-request-display';\nimport {\n orderedPullRequests,\n pullRequestChipState,\n relativeTime,\n} from '../threads/session-list-model';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { useAthenaSessionAttention } from '../threads/use-athena-session-attention';\nimport { PlanStepMarker, type PlanStepStatus } from '../tools/write-todos-tool-ui';\nimport {\n type SessionWorkbenchPane,\n useSessionWorkbench,\n useSessionWorkbenchWorkspace,\n} from './session-workbench-context';\nimport {\n assetPanelTypeOf,\n assetTypeLabel,\n computerStateBadge,\n deriveShellRows,\n deriveTaskSteps,\n filterShellRows,\n reviewDecisionLabel,\n type ShellRow,\n type ShellRowStatus,\n taskProgress,\n workspaceComputers,\n} from './session-workbench-model';\nimport { ComputerLiveDesktop } from './ComputerLiveDesktop';\nimport type { SessionWorkspaceAsset } from './session-workspace-api';\nimport { useAthenaComputerSshAccess, useAthenaComputerStatus } from './use-session-workspace';\n\n// ─── Shared pieces ───────────────────────────────────────────────────\n\nconst FOCUS_RING_CLASS =\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0';\n\nconst PaneEmpty: FC<{\n icon: FC<{ className?: string }>;\n title: string;\n children?: ReactNode;\n}> = ({ icon: Icon, title, children }) => (\n <div className=\"flex h-full min-h-40 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <Icon className=\"size-5 text-muted-foreground/70\" />\n <p className=\"font-medium text-foreground text-sm\">{title}</p>\n {children ? <p className=\"max-w-64 text-muted-foreground text-xs leading-snug\">{children}</p> : null}\n </div>\n);\n\nconst PaneError: FC<{ error: Error }> = ({ error }) => (\n <div role=\"alert\" className=\"m-3 flex items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-red-900 text-xs\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 break-words\">{error.message}</span>\n </div>\n);\n\nconst PaneSkeleton: FC = () => (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy=\"true\" aria-label=\"Loading\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n);\n\nconst SectionHeading: FC<{ children: ReactNode; trailing?: ReactNode }> = ({ children, trailing }) => (\n <div className=\"flex items-center justify-between gap-2 px-3 pt-3 pb-1.5\">\n <h3 className=\"font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">{children}</h3>\n {trailing}\n </div>\n);\n\n/** The `title` tooltip for an ISO time: the full local date and time. */\nfunction fullTime(iso: string | null): string | undefined {\n if (!iso) return undefined;\n const time = Date.parse(iso);\n return Number.isNaN(time) ? undefined : new Date(time).toLocaleString();\n}\n\n/** Statewire-only panes read the transcript and thread state; elsewhere they say so. */\nconst RequiresStatewireThread: FC<{ children: ReactNode; icon: FC<{ className?: string }> }> = ({\n children,\n icon,\n}) => {\n const extras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(extras)) {\n return <PaneEmpty icon={icon} title=\"No live session\">Open a session to see this pane.</PaneEmpty>;\n }\n return <>{children}</>;\n};\n\n// ─── Tasks ───────────────────────────────────────────────────────────\n\nconst TASK_STATUS_LABEL: Record<PlanStepStatus, string> = {\n pending: 'To do',\n in_progress: 'In progress',\n completed: 'Done',\n failed: 'Failed',\n cancelled: 'Cancelled',\n};\n\nconst TasksPaneContent: FC = () => {\n const stateTodos = useStatewireState((state) => readDeepAgentStreamValues(state).todos);\n const messages = useAuiState((state) => state.thread.messages);\n const progress = useMemo(\n () => taskProgress(deriveTaskSteps({ stateTodos, messages })),\n [stateTodos, messages],\n );\n if (progress.total === 0) {\n return (\n <PaneEmpty icon={ListChecksIcon} title=\"No plan yet\">\n When the agent writes a plan, its steps show here as it works through them.\n </PaneEmpty>\n );\n }\n const percent = Math.round((progress.done / progress.total) * 100);\n return (\n <div className=\"flex flex-col\">\n <SectionHeading\n trailing={\n <span className=\"font-medium text-foreground text-xs tabular-nums\">\n {progress.done}/{progress.total} done\n </span>\n }\n >\n Plan\n </SectionHeading>\n <div className=\"mx-3 mb-2 h-1 overflow-hidden rounded-full bg-muted\">\n {/* A runtime percentage is the one width a static utility cannot express. */}\n <div className=\"h-full rounded-full bg-primary transition-all\" style={{ width: `${percent}%` }} />\n </div>\n <ol className=\"flex flex-col pb-3\" aria-label=\"Plan steps\">\n {progress.steps.map((step, index) => (\n <li\n key={step.id ?? `${index}:${step.content}`}\n data-status={step.status}\n className=\"flex items-start gap-2.5 px-3 py-1.5\"\n >\n {step.status === 'pending' ? (\n // The row already carries its number; a pending marker repeating it reads \"11 11.\".\n <span aria-hidden className=\"size-[18px] shrink-0 rounded-full border border-border border-dashed\" />\n ) : (\n <PlanStepMarker status={step.status} index={index} />\n )}\n <span className=\"sr-only\">{TASK_STATUS_LABEL[step.status]}: </span>\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-[18px]',\n step.status === 'completed' && 'text-muted-foreground line-through',\n step.status === 'in_progress' && 'font-medium text-foreground',\n step.status === 'failed' && 'text-destructive',\n step.status === 'cancelled' && 'text-muted-foreground line-through',\n )}\n >\n <span className=\"mr-1.5 text-muted-foreground tabular-nums\">{index + 1}.</span>\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport const SessionTasksPane: FC = () => (\n <RequiresStatewireThread icon={ListChecksIcon}>\n <TasksPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Shell ───────────────────────────────────────────────────────────\n\nconst SHELL_STATUS_LABEL: Record<ShellRowStatus, string> = {\n running: 'Running',\n succeeded: 'Succeeded',\n failed: 'Failed',\n unknown: 'Finished',\n};\n\nconst ShellStatusIcon: FC<{ status: ShellRowStatus }> = ({ status }) => {\n const label = SHELL_STATUS_LABEL[status];\n if (status === 'running') {\n return <LoaderIcon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-primary\" aria-label={label} />;\n }\n if (status === 'succeeded') {\n return <CheckIcon className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" aria-label={label} />;\n }\n if (status === 'failed') {\n return <XIcon className=\"mt-0.5 size-3.5 shrink-0 text-red-600\" aria-label={label} />;\n }\n return <CircleDashedIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-label={label} />;\n};\n\nfunction shellMeta(row: ShellRow): string {\n const parts = [row.machine.label];\n if (row.exitCode !== null) parts.push(`exit ${row.exitCode}`);\n if (row.createdAt) parts.push(relativeTime(row.createdAt));\n return parts.join(' · ');\n}\n\nconst ShellRowItem: FC<{ row: ShellRow; expanded: boolean; onToggle: () => void }> = ({\n row,\n expanded,\n onToggle,\n}) => {\n const panelId = `athena-shell-${row.id}`;\n return (\n <li data-status={row.status} className=\"border-border/60 border-b last:border-b-0\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={onToggle}\n className={cn(\n 'flex w-full items-start gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n <ShellStatusIcon status={row.status} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-foreground text-xs\">\n <span className=\"text-muted-foreground\">$ </span>\n {row.firstLine || '(empty command)'}\n {row.extraLines > 0 ? (\n <span className=\"text-muted-foreground\"> (+{row.extraLines} lines)</span>\n ) : null}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(row.createdAt)}>\n {shellMeta(row)}\n </span>\n </span>\n </button>\n {expanded ? (\n <div id={panelId} className=\"px-3 pb-2.5\">\n <pre\n aria-label=\"Command\"\n className=\"mb-1.5 max-h-40 overflow-auto whitespace-pre-wrap break-all rounded-md border border-border/60 px-2 py-1.5 font-mono text-[11px] text-foreground\"\n >\n {row.command}\n </pre>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted px-2 py-1.5 font-mono text-[11px] text-foreground\">\n {row.status === 'running' ? 'Running…' : row.output || '(no output)'}\n </pre>\n {row.outputPartial ? (\n <p className=\"pt-1 text-[11px] text-muted-foreground\">\n Output shortened — the full output is on the command's card in the chat.\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * The commands below come from the part of the transcript the chat has\n * loaded; earlier ones arrive a page at a time, through the chat's own history\n * edge (the same page it loads when the reader scrolls up).\n */\nconst ShellHistoryFooter: FC<{ history: StatewireHistoryState; empty: boolean }> = ({\n history,\n empty,\n}) => {\n const { canLoadOlder, loading, loadOlder } = history;\n return (\n <div className=\"flex flex-col items-center gap-2 px-3 py-4 text-center\">\n <p className=\"text-[11px] text-muted-foreground\">\n {empty\n ? 'No commands in the part of this session loaded so far.'\n : 'Earlier commands are in the part of this session not loaded yet.'}\n </p>\n {canLoadOlder && loadOlder ? (\n <button\n type=\"button\"\n onClick={loadOlder}\n disabled={loading}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted disabled:opacity-60',\n FOCUS_RING_CLASS,\n )}\n >\n {loading ? <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden /> : null}\n {loading ? 'Loading earlier commands…' : 'Load earlier commands'}\n </button>\n ) : (\n <p className=\"text-[11px] text-muted-foreground\">\n The rest is further back than one view of the conversation loads.\n </p>\n )}\n </div>\n );\n};\n\nconst ShellPaneContent: FC = () => {\n const { threadId } = useSessionWorkbench();\n const messages = useAuiState((state) => state.thread.messages);\n const workspace = useSessionWorkbenchWorkspace().data ?? null;\n const history = useStatewireHistory(threadId);\n const partial = history?.hasOlder === true;\n const rows = useMemo(() => deriveShellRows({ messages, workspace }), [messages, workspace]);\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const visible = useMemo(() => filterShellRows(rows, query), [rows, query]);\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n if (rows.length === 0) {\n if (partial && history) return <ShellHistoryFooter history={history} empty />;\n return (\n <PaneEmpty icon={TerminalIcon} title=\"No commands yet\">\n Every shell command the agent runs shows here with where it ran and how it ended.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"sticky top-0 z-10 border-border/60 border-b bg-background px-3 py-2\">\n <label className=\"flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 focus-within:ring-2 focus-within:ring-ring/40\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search commands\"\n aria-label=\"Search commands\"\n className=\"min-w-0 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </label>\n <p className=\"pt-1.5 text-[11px] text-muted-foreground\" aria-live=\"polite\">\n {query.trim()\n ? `${visible.length} of ${rows.length} commands`\n : `${rows.length} command${rows.length === 1 ? '' : 's'}`}\n {partial ? ' so far' : ''}\n </p>\n </div>\n {visible.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-muted-foreground text-xs\">No command matches.</p>\n ) : (\n <ul aria-label=\"Shell commands\">\n {visible.map((row) => (\n <ShellRowItem\n key={row.id}\n row={row}\n expanded={expanded.has(row.id)}\n onToggle={() => toggle(row.id)}\n />\n ))}\n </ul>\n )}\n {partial && history ? <ShellHistoryFooter history={history} empty={false} /> : null}\n </div>\n );\n};\n\nexport const SessionShellPane: FC = () => (\n <RequiresStatewireThread icon={TerminalIcon}>\n <ShellPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Computer ────────────────────────────────────────────────────────\n\nconst ComputerStateBadge: FC<{ assetId: string }> = ({ assetId }) => {\n const status = useAthenaComputerStatus({ assetId });\n const badge = status.data ? computerStateBadge(status.data) : null;\n if (!badge) return null;\n return (\n <span\n data-state={status.data?.state}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\"\n >\n <span\n aria-hidden\n className={cn(\n 'size-1.5 rounded-full',\n badge.tone === 'running' && 'bg-emerald-500',\n badge.tone === 'transition' && 'animate-pulse bg-amber-500',\n badge.tone === 'stopped' && 'bg-muted-foreground/50',\n badge.tone === 'error' && 'bg-red-500',\n )}\n />\n {badge.label}\n </span>\n );\n};\n\nconst CopySshCommand: FC<{ assetId: string }> = ({ assetId }) => {\n const ssh = useAthenaComputerSshAccess({ assetId });\n const [copied, setCopied] = useState(false);\n const command = ssh.data?.command;\n if (!command) return null;\n const copy = () => {\n void navigator.clipboard?.writeText(command).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[11px] text-foreground\" title={command}>\n {command}\n </code>\n <button\n type=\"button\"\n onClick={copy}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted',\n FOCUS_RING_CLASS,\n )}\n >\n {copied ? <CheckIcon className=\"size-3.5\" aria-hidden /> : <CopyIcon className=\"size-3.5\" aria-hidden />}\n {copied ? 'Copied' : 'Copy SSH command'}\n </button>\n </div>\n {ssh.data?.keyAuthEnabled === false ? (\n <p className=\"text-[11px] text-muted-foreground\">\n This environment's SSH gateway takes temporary tokens only; create one from the computer in Athena.\n </p>\n ) : null}\n </div>\n );\n};\n\nfunction useAssetHref(assetId: string): string | null {\n const { appUrl, backendUrl } = useAthenaConfig();\n return useMemo(() => {\n const pageOrigin = typeof window === 'undefined' ? null : window.location.origin;\n try {\n return createAthenaSpacesUrl({\n appUrl: athenaLinkAppUrl({ appUrl, backendUrl, pageOrigin }),\n assetIds: assetId,\n });\n } catch {\n return null;\n }\n }, [appUrl, backendUrl, assetId]);\n}\n\nconst OpenInAthenaLink: FC<{ assetId: string; label?: string; compact?: boolean }> = ({\n assetId,\n label = 'Open in Athena',\n compact = false,\n}) => {\n const href = useAssetHref(assetId);\n if (!href) return null;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={compact ? label : undefined}\n title={compact ? label : undefined}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md font-medium text-xs transition-colors hover:bg-muted',\n compact ? 'p-1 text-muted-foreground hover:text-foreground' : 'border border-border px-2 py-1',\n FOCUS_RING_CLASS,\n )}\n >\n <ExternalLinkIcon className=\"size-3.5\" aria-hidden />\n {compact ? null : label}\n </a>\n );\n};\n\nconst ComputerCard: FC<{ computer: SessionWorkspaceAsset }> = ({ computer }) => (\n <article\n aria-label={computer.title ?? computer.assetId}\n className=\"mx-3 mt-3 flex flex-col gap-3 rounded-xl border border-border p-3\"\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground\">\n <MonitorIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-foreground text-sm\">{computer.title ?? computer.assetId}</p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {computer.role === 'session_computer' ? 'Session computer' : 'Used by this session'}\n {computer.updatedAt ? ` · updated ${relativeTime(computer.updatedAt)}` : ''}\n </p>\n </div>\n <ComputerStateBadge assetId={computer.assetId} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <OpenInAthenaLink assetId={computer.assetId} />\n </div>\n <CopySshCommand assetId={computer.assetId} />\n </article>\n);\n\nexport const SessionComputerPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n if (!isPersisted) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer yet\">\n The computer this session works on shows here once it starts.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { primary, others } = workspaceComputers(workspace.data);\n if (!primary) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer used yet\">\n When the agent runs commands on a computer, it shows here with a link and its SSH command.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-3\">\n <ComputerLiveDesktop assetId={primary.assetId} className=\"mx-3 mt-3\" />\n <ComputerCard computer={primary} />\n {others.length > 0 ? (\n <>\n <SectionHeading>Also used</SectionHeading>\n <ul aria-label=\"Other computers\">\n {others.map((computer) => (\n <li key={computer.assetId} className=\"flex items-center gap-2 px-3 py-1.5\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate text-foreground text-sm\">\n {computer.title ?? computer.assetId}\n </span>\n <OpenInAthenaLink assetId={computer.assetId} compact label={`Open ${computer.title ?? 'computer'} in Athena`} />\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n );\n};\n\n// ─── Pull requests ───────────────────────────────────────────────────\n\nconst PullRequestRow: FC<{ pullRequest: ConversationPullRequest }> = ({ pullRequest }) => {\n const state = pullRequestChipState(pullRequest);\n const Icon = PR_STATE_ICON[state];\n const meta = [\n `${pullRequest.repoFullName}#${pullRequest.number}`,\n state,\n PR_CHECKS_LABEL[pullRequest.checksState],\n reviewDecisionLabel(pullRequest.reviewDecision),\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <li>\n <a\n href={pullRequest.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-pr-state={state}\n className={cn('flex items-start gap-2.5 px-3 py-2 transition-colors hover:bg-muted/60', FOCUS_RING_CLASS)}\n >\n <Icon className={cn('mt-0.5 size-4 shrink-0', PR_STATE_CLASS[state])} aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-foreground text-sm leading-snug\">\n {pullRequest.title || `#${pullRequest.number}`}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">{meta}</span>\n </span>\n <ExternalLinkIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n </a>\n </li>\n );\n};\n\nexport const SessionPullRequestsPane: FC = () => {\n const { threadId, isPersisted } = useSessionWorkbench();\n const list = useAthenaStatewireThreadList();\n const attention = useAthenaSessionAttention(threadId ?? undefined);\n if (!list) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests need the session list\">\n Mount the provider with enableThreadList to see the pull requests a session opened.\n </PaneEmpty>\n );\n }\n const pullRequests = isPersisted ? (attention?.pullRequests ?? []) : [];\n if (attention?.pullRequests === null && isPersisted) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests unavailable\">\n GitHub could not be read for this session right now.\n </PaneEmpty>\n );\n }\n if (pullRequests.length === 0) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"No pull requests\">\n Pull requests the agent opens show here with their checks and review state.\n </PaneEmpty>\n );\n }\n const ordered = orderedPullRequests(pullRequests);\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{ordered.length}</span>}\n >\n Pull requests\n </SectionHeading>\n <ul aria-label=\"Pull requests\">\n {ordered.map((pullRequest) => (\n <PullRequestRow key={pullRequest.url} pullRequest={pullRequest} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Attachments ─────────────────────────────────────────────────────\n\nconst ASSET_ICON: Record<string, FC<{ className?: string }>> = {\n spreadsheet: FileSpreadsheetIcon,\n document: FileTextIcon,\n presentation: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n notebook: BookOpenIcon,\n image: ImageIcon,\n folder: FolderIcon,\n markdown: FileTextIcon,\n pdf: FileTextIcon,\n txt: FileTextIcon,\n};\n\nconst AttachmentRow: FC<{ asset: SessionWorkspaceAsset; canOpenHere: boolean }> = ({\n asset,\n canOpenHere,\n}) => {\n const openAsset = useAssetPanelStore((state) => state.openAsset);\n const Icon = ASSET_ICON[asset.assetType] ?? FileIcon;\n const panelType: AssetPanelType | null = assetPanelTypeOf(asset.assetType);\n const title = asset.title ?? asset.assetId;\n const meta = [\n assetTypeLabel(asset.assetType),\n asset.updatedAt ? `updated ${relativeTime(asset.updatedAt)}` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n const body = (\n <>\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-foreground text-sm\">{title}</span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(asset.updatedAt)}>\n {meta}\n </span>\n </span>\n </>\n );\n return (\n <li className=\"flex items-start gap-1 pr-2\">\n {canOpenHere && panelType ? (\n <button\n type=\"button\"\n onClick={() => openAsset(asset.assetId, { name: title, type: panelType })}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2\">{body}</div>\n )}\n <span className=\"pt-1.5\">\n <OpenInAthenaLink assetId={asset.assetId} compact label={`Open ${title} in Athena`} />\n </span>\n </li>\n );\n};\n\nexport const SessionAttachmentsPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n const canOpenHere = useAssetPanelStore((state) => state.assetPanelHostCount > 0);\n if (!isPersisted) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { assets } = workspace.data;\n if (assets.length === 0) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{assets.length}</span>}\n >\n Created or edited\n </SectionHeading>\n <ul aria-label=\"Session files\">\n {assets.map((asset) => (\n <AttachmentRow key={asset.assetId} asset={asset} canOpenHere={canOpenHere} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Registry ────────────────────────────────────────────────────────\n\nexport const SESSION_WORKBENCH_TASKS_PANE: SessionWorkbenchPane = {\n id: 'tasks',\n title: 'Tasks',\n description: \"Follow the agent's plan step by step\",\n icon: ListChecksIcon,\n render: () => <SessionTasksPane />,\n};\n\nexport const SESSION_WORKBENCH_SHELL_PANE: SessionWorkbenchPane = {\n id: 'shell',\n title: 'Shell',\n description: 'Commands the agent ran and their output',\n icon: TerminalIcon,\n render: () => <SessionShellPane />,\n};\n\nexport const SESSION_WORKBENCH_COMPUTER_PANE: SessionWorkbenchPane = {\n id: 'computer',\n title: 'Computer',\n description: 'The machine this session works on, and how to reach it',\n icon: MonitorIcon,\n render: () => <SessionComputerPane />,\n};\n\nexport const SESSION_WORKBENCH_PULL_REQUESTS_PANE: SessionWorkbenchPane = {\n id: 'pull-requests',\n title: 'Pull requests',\n description: 'Pull requests this session opened, with checks and reviews',\n icon: GitPullRequestIcon,\n render: () => <SessionPullRequestsPane />,\n};\n\nexport const SESSION_WORKBENCH_ATTACHMENTS_PANE: SessionWorkbenchPane = {\n id: 'attachments',\n title: 'Attachments',\n description: 'Files and assets this session created or edited',\n icon: PaperclipIcon,\n render: () => <SessionAttachmentsPane />,\n};\n\n/** The built-in panes, in \"+\" menu order. Spread it to add your own. */\nexport const DEFAULT_SESSION_WORKBENCH_PANES: readonly SessionWorkbenchPane[] = [\n SESSION_WORKBENCH_TASKS_PANE,\n SESSION_WORKBENCH_SHELL_PANE,\n SESSION_WORKBENCH_COMPUTER_PANE,\n SESSION_WORKBENCH_PULL_REQUESTS_PANE,\n SESSION_WORKBENCH_ATTACHMENTS_PANE,\n];\n\n/** The panes a thread opens with until the person changes its tabs. */\nexport const DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS: readonly string[] = [\n SESSION_WORKBENCH_TASKS_PANE.id,\n SESSION_WORKBENCH_SHELL_PANE.id,\n SESSION_WORKBENCH_COMPUTER_PANE.id,\n];\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"session-workbench-panes.js","sources":["../../src/workbench/session-workbench-panes.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * The built-in panes of `SessionWorkbench` — Tasks, Shell, Computer, Pull\n * requests and Attachments. Each reads one source:\n *\n * - Tasks: the thread state's `todos` channel (the deepagents plan), else the\n * newest `write_todos` call in the loaded transcript.\n * - Shell: every `execute` call in the loaded transcript; while the thread has\n * older history the chat has not loaded, it says so and loads the next page\n * on request (`StatewireHistoryContext`).\n * - Computer / Attachments: the session's workspace\n * (`GET /api/conversations/threads/{id}/workspace`), plus the computer's\n * status and SSH target; the Computer pane also shows the computer's screen\n * live (`ComputerLiveDesktop`).\n * - Pull requests: the thread list's live pull-request state for the session.\n */\nimport { useAuiState } from '@assistant-ui/react';\nimport { useStatewireState } from '@assistant-ui/react-statewire';\nimport {\n type ConversationPullRequest,\n hasStatewireThreadExtras,\n readDeepAgentStreamValues,\n} from '@athenaintel/agent-runtime';\nimport {\n AlertCircleIcon,\n BookOpenIcon,\n CheckIcon,\n CircleDashedIcon,\n CopyIcon,\n ExternalLinkIcon,\n FileIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FolderIcon,\n GitPullRequestIcon,\n ImageIcon,\n ListChecksIcon,\n LoaderIcon,\n MonitorIcon,\n PaperclipIcon,\n PresentationIcon,\n SearchIcon,\n TerminalIcon,\n XIcon,\n} from 'lucide-react';\nimport { type FC, type ReactNode, useMemo, useState } from 'react';\nimport { type AssetType as AssetPanelType, useAssetPanelStore } from '../assets/asset-panel-store';\nimport { athenaLinkAppUrl, createAthenaSpacesUrl } from '../lib/athena-urls';\nimport { cn } from '../lib/utils';\nimport { useAthenaConfig } from '../provider/AthenaContext';\nimport {\n type StatewireHistoryState,\n useStatewireHistory,\n} from '../provider/statewire-history-context';\nimport { PR_CHECKS_LABEL, PR_STATE_CLASS, PR_STATE_ICON } from '../threads/pull-request-display';\nimport {\n orderedPullRequests,\n pullRequestChipState,\n relativeTime,\n} from '../threads/session-list-model';\nimport { useAthenaStatewireThreadList } from '../threads/statewire-thread-list';\nimport { useAthenaSessionAttention } from '../threads/use-athena-session-attention';\nimport { PLAN_STEP_STATUS_LABEL, PlanStepMarker } from '../tools/write-todos-tool-ui';\nimport {\n type SessionWorkbenchPane,\n useSessionWorkbench,\n useSessionWorkbenchWorkspace,\n} from './session-workbench-context';\nimport {\n assetPanelTypeOf,\n assetTypeLabel,\n computerStateBadge,\n deriveShellRows,\n deriveTaskSteps,\n filterShellRows,\n reviewDecisionLabel,\n type ShellRow,\n type ShellRowStatus,\n taskProgress,\n workspaceComputers,\n} from './session-workbench-model';\nimport { ComputerLiveDesktop } from './ComputerLiveDesktop';\nimport type { SessionWorkspaceAsset } from './session-workspace-api';\nimport { useAthenaComputerSshAccess, useAthenaComputerStatus } from './use-session-workspace';\n\n// ─── Shared pieces ───────────────────────────────────────────────────\n\nconst FOCUS_RING_CLASS =\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-0';\n\nconst PaneEmpty: FC<{\n icon: FC<{ className?: string }>;\n title: string;\n children?: ReactNode;\n}> = ({ icon: Icon, title, children }) => (\n <div className=\"flex h-full min-h-40 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <Icon className=\"size-5 text-muted-foreground/70\" />\n <p className=\"font-medium text-foreground text-sm\">{title}</p>\n {children ? <p className=\"max-w-64 text-muted-foreground text-xs leading-snug\">{children}</p> : null}\n </div>\n);\n\nconst PaneError: FC<{ error: Error }> = ({ error }) => (\n <div role=\"alert\" className=\"m-3 flex items-start gap-2 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-red-900 text-xs\">\n <AlertCircleIcon className=\"mt-0.5 size-3.5 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 break-words\">{error.message}</span>\n </div>\n);\n\nconst PaneSkeleton: FC = () => (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy=\"true\" aria-label=\"Loading\">\n {[0, 1, 2].map((row) => (\n <div key={row} className=\"h-10 animate-pulse rounded-lg bg-muted\" />\n ))}\n </div>\n);\n\nconst SectionHeading: FC<{ children: ReactNode; trailing?: ReactNode }> = ({ children, trailing }) => (\n <div className=\"flex items-center justify-between gap-2 px-3 pt-3 pb-1.5\">\n <h3 className=\"font-medium text-[11px] text-muted-foreground uppercase tracking-wide\">{children}</h3>\n {trailing}\n </div>\n);\n\n/** The `title` tooltip for an ISO time: the full local date and time. */\nfunction fullTime(iso: string | null): string | undefined {\n if (!iso) return undefined;\n const time = Date.parse(iso);\n return Number.isNaN(time) ? undefined : new Date(time).toLocaleString();\n}\n\n/** Statewire-only panes read the transcript and thread state; elsewhere they say so. */\nconst RequiresStatewireThread: FC<{ children: ReactNode; icon: FC<{ className?: string }> }> = ({\n children,\n icon,\n}) => {\n const extras = useAuiState((state) => state.thread.extras);\n if (!hasStatewireThreadExtras(extras)) {\n return <PaneEmpty icon={icon} title=\"No live session\">Open a session to see this pane.</PaneEmpty>;\n }\n return <>{children}</>;\n};\n\n// ─── Tasks ───────────────────────────────────────────────────────────\n\nconst TasksPaneContent: FC = () => {\n const stateTodos = useStatewireState((state) => readDeepAgentStreamValues(state).todos);\n const messages = useAuiState((state) => state.thread.messages);\n const progress = useMemo(\n () => taskProgress(deriveTaskSteps({ stateTodos, messages })),\n [stateTodos, messages],\n );\n if (progress.total === 0) {\n return (\n <PaneEmpty icon={ListChecksIcon} title=\"No plan yet\">\n When the agent writes a plan, its steps show here as it works through them.\n </PaneEmpty>\n );\n }\n const percent = Math.round((progress.done / progress.total) * 100);\n return (\n <div className=\"flex flex-col\">\n <SectionHeading\n trailing={\n <span className=\"font-medium text-foreground text-xs tabular-nums\">\n {progress.done}/{progress.total} done\n </span>\n }\n >\n Plan\n </SectionHeading>\n <div className=\"mx-3 mb-2 h-1 overflow-hidden rounded-full bg-muted\">\n {/* A runtime percentage is the one width a static utility cannot express. */}\n <div className=\"h-full rounded-full bg-primary transition-all\" style={{ width: `${percent}%` }} />\n </div>\n <ol className=\"flex flex-col pb-3\" aria-label=\"Plan steps\">\n {progress.steps.map((step, index) => (\n <li\n key={step.id ?? `${index}:${step.content}`}\n data-status={step.status}\n className=\"flex items-start gap-2.5 px-3 py-1.5\"\n >\n {step.status === 'pending' ? (\n // The row already carries its number; a pending marker repeating it reads \"11 11.\".\n <span aria-hidden className=\"size-[18px] shrink-0 rounded-full border border-border border-dashed\" />\n ) : (\n <PlanStepMarker status={step.status} index={index} />\n )}\n <span className=\"sr-only\">{PLAN_STEP_STATUS_LABEL[step.status]}: </span>\n <span\n className={cn(\n 'min-w-0 flex-1 text-sm leading-[18px]',\n step.status === 'completed' && 'text-muted-foreground line-through',\n step.status === 'in_progress' && 'font-medium text-foreground',\n step.status === 'failed' && 'text-destructive',\n step.status === 'cancelled' && 'text-muted-foreground line-through',\n )}\n >\n <span className=\"mr-1.5 text-muted-foreground tabular-nums\">{index + 1}.</span>\n {step.content}\n </span>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport const SessionTasksPane: FC = () => (\n <RequiresStatewireThread icon={ListChecksIcon}>\n <TasksPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Shell ───────────────────────────────────────────────────────────\n\nconst SHELL_STATUS_LABEL: Record<ShellRowStatus, string> = {\n running: 'Running',\n succeeded: 'Succeeded',\n failed: 'Failed',\n unknown: 'Finished',\n};\n\nconst ShellStatusIcon: FC<{ status: ShellRowStatus }> = ({ status }) => {\n const label = SHELL_STATUS_LABEL[status];\n if (status === 'running') {\n return <LoaderIcon className=\"mt-0.5 size-3.5 shrink-0 animate-spin text-primary\" aria-label={label} />;\n }\n if (status === 'succeeded') {\n return <CheckIcon className=\"mt-0.5 size-3.5 shrink-0 text-emerald-600\" aria-label={label} />;\n }\n if (status === 'failed') {\n return <XIcon className=\"mt-0.5 size-3.5 shrink-0 text-red-600\" aria-label={label} />;\n }\n return <CircleDashedIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-label={label} />;\n};\n\nfunction shellMeta(row: ShellRow): string {\n const parts = [row.machine.label];\n if (row.exitCode !== null) parts.push(`exit ${row.exitCode}`);\n if (row.createdAt) parts.push(relativeTime(row.createdAt));\n return parts.join(' · ');\n}\n\nconst ShellRowItem: FC<{ row: ShellRow; expanded: boolean; onToggle: () => void }> = ({\n row,\n expanded,\n onToggle,\n}) => {\n const panelId = `athena-shell-${row.id}`;\n return (\n <li data-status={row.status} className=\"border-border/60 border-b last:border-b-0\">\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={panelId}\n onClick={onToggle}\n className={cn(\n 'flex w-full items-start gap-2 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n <ShellStatusIcon status={row.status} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-mono text-foreground text-xs\">\n <span className=\"text-muted-foreground\">$ </span>\n {row.firstLine || '(empty command)'}\n {row.extraLines > 0 ? (\n <span className=\"text-muted-foreground\"> (+{row.extraLines} lines)</span>\n ) : null}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(row.createdAt)}>\n {shellMeta(row)}\n </span>\n </span>\n </button>\n {expanded ? (\n <div id={panelId} className=\"px-3 pb-2.5\">\n <pre\n aria-label=\"Command\"\n className=\"mb-1.5 max-h-40 overflow-auto whitespace-pre-wrap break-all rounded-md border border-border/60 px-2 py-1.5 font-mono text-[11px] text-foreground\"\n >\n {row.command}\n </pre>\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-all rounded-md bg-muted px-2 py-1.5 font-mono text-[11px] text-foreground\">\n {row.status === 'running' ? 'Running…' : row.output || '(no output)'}\n </pre>\n {row.outputPartial ? (\n <p className=\"pt-1 text-[11px] text-muted-foreground\">\n Output shortened — the full output is on the command's card in the chat.\n </p>\n ) : null}\n </div>\n ) : null}\n </li>\n );\n};\n\n/**\n * The commands below come from the part of the transcript the chat has\n * loaded; earlier ones arrive a page at a time, through the chat's own history\n * edge (the same page it loads when the reader scrolls up).\n */\nconst ShellHistoryFooter: FC<{ history: StatewireHistoryState; empty: boolean }> = ({\n history,\n empty,\n}) => {\n const { canLoadOlder, loading, loadOlder } = history;\n return (\n <div className=\"flex flex-col items-center gap-2 px-3 py-4 text-center\">\n <p className=\"text-[11px] text-muted-foreground\">\n {empty\n ? 'No commands in the part of this session loaded so far.'\n : 'Earlier commands are in the part of this session not loaded yet.'}\n </p>\n {canLoadOlder && loadOlder ? (\n <button\n type=\"button\"\n onClick={loadOlder}\n disabled={loading}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted disabled:opacity-60',\n FOCUS_RING_CLASS,\n )}\n >\n {loading ? <LoaderIcon className=\"size-3.5 animate-spin\" aria-hidden /> : null}\n {loading ? 'Loading earlier commands…' : 'Load earlier commands'}\n </button>\n ) : (\n <p className=\"text-[11px] text-muted-foreground\">\n The rest is further back than one view of the conversation loads.\n </p>\n )}\n </div>\n );\n};\n\nconst ShellPaneContent: FC = () => {\n const { threadId } = useSessionWorkbench();\n const messages = useAuiState((state) => state.thread.messages);\n const workspace = useSessionWorkbenchWorkspace().data ?? null;\n const history = useStatewireHistory(threadId);\n const partial = history?.hasOlder === true;\n const rows = useMemo(() => deriveShellRows({ messages, workspace }), [messages, workspace]);\n const [query, setQuery] = useState('');\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const visible = useMemo(() => filterShellRows(rows, query), [rows, query]);\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n if (rows.length === 0) {\n if (partial && history) return <ShellHistoryFooter history={history} empty />;\n return (\n <PaneEmpty icon={TerminalIcon} title=\"No commands yet\">\n Every shell command the agent runs shows here with where it ran and how it ended.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col\">\n <div className=\"sticky top-0 z-10 border-border/60 border-b bg-background px-3 py-2\">\n <label className=\"flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 focus-within:ring-2 focus-within:ring-ring/40\">\n <SearchIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search commands\"\n aria-label=\"Search commands\"\n className=\"min-w-0 flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground\"\n />\n </label>\n <p className=\"pt-1.5 text-[11px] text-muted-foreground\" aria-live=\"polite\">\n {query.trim()\n ? `${visible.length} of ${rows.length} commands`\n : `${rows.length} command${rows.length === 1 ? '' : 's'}`}\n {partial ? ' so far' : ''}\n </p>\n </div>\n {visible.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-muted-foreground text-xs\">No command matches.</p>\n ) : (\n <ul aria-label=\"Shell commands\">\n {visible.map((row) => (\n <ShellRowItem\n key={row.id}\n row={row}\n expanded={expanded.has(row.id)}\n onToggle={() => toggle(row.id)}\n />\n ))}\n </ul>\n )}\n {partial && history ? <ShellHistoryFooter history={history} empty={false} /> : null}\n </div>\n );\n};\n\nexport const SessionShellPane: FC = () => (\n <RequiresStatewireThread icon={TerminalIcon}>\n <ShellPaneContent />\n </RequiresStatewireThread>\n);\n\n// ─── Computer ────────────────────────────────────────────────────────\n\nconst ComputerStateBadge: FC<{ assetId: string }> = ({ assetId }) => {\n const status = useAthenaComputerStatus({ assetId });\n const badge = status.data ? computerStateBadge(status.data) : null;\n if (!badge) return null;\n return (\n <span\n data-state={status.data?.state}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\"\n >\n <span\n aria-hidden\n className={cn(\n 'size-1.5 rounded-full',\n badge.tone === 'running' && 'bg-emerald-500',\n badge.tone === 'transition' && 'animate-pulse bg-amber-500',\n badge.tone === 'stopped' && 'bg-muted-foreground/50',\n badge.tone === 'error' && 'bg-red-500',\n )}\n />\n {badge.label}\n </span>\n );\n};\n\nconst CopySshCommand: FC<{ assetId: string }> = ({ assetId }) => {\n const ssh = useAthenaComputerSshAccess({ assetId });\n const [copied, setCopied] = useState(false);\n const command = ssh.data?.command;\n if (!command) return null;\n const copy = () => {\n void navigator.clipboard?.writeText(command).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1.5\">\n <code className=\"min-w-0 flex-1 truncate rounded-md bg-muted px-2 py-1 font-mono text-[11px] text-foreground\" title={command}>\n {command}\n </code>\n <button\n type=\"button\"\n onClick={copy}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md border border-border px-2 py-1 font-medium text-xs transition-colors hover:bg-muted',\n FOCUS_RING_CLASS,\n )}\n >\n {copied ? <CheckIcon className=\"size-3.5\" aria-hidden /> : <CopyIcon className=\"size-3.5\" aria-hidden />}\n {copied ? 'Copied' : 'Copy SSH command'}\n </button>\n </div>\n {ssh.data?.keyAuthEnabled === false ? (\n <p className=\"text-[11px] text-muted-foreground\">\n This environment's SSH gateway takes temporary tokens only; create one from the computer in Athena.\n </p>\n ) : null}\n </div>\n );\n};\n\nfunction useAssetHref(assetId: string): string | null {\n const { appUrl, backendUrl } = useAthenaConfig();\n return useMemo(() => {\n const pageOrigin = typeof window === 'undefined' ? null : window.location.origin;\n try {\n return createAthenaSpacesUrl({\n appUrl: athenaLinkAppUrl({ appUrl, backendUrl, pageOrigin }),\n assetIds: assetId,\n });\n } catch {\n return null;\n }\n }, [appUrl, backendUrl, assetId]);\n}\n\nconst OpenInAthenaLink: FC<{ assetId: string; label?: string; compact?: boolean }> = ({\n assetId,\n label = 'Open in Athena',\n compact = false,\n}) => {\n const href = useAssetHref(assetId);\n if (!href) return null;\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={compact ? label : undefined}\n title={compact ? label : undefined}\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-md font-medium text-xs transition-colors hover:bg-muted',\n compact ? 'p-1 text-muted-foreground hover:text-foreground' : 'border border-border px-2 py-1',\n FOCUS_RING_CLASS,\n )}\n >\n <ExternalLinkIcon className=\"size-3.5\" aria-hidden />\n {compact ? null : label}\n </a>\n );\n};\n\nconst ComputerCard: FC<{ computer: SessionWorkspaceAsset }> = ({ computer }) => (\n <article\n aria-label={computer.title ?? computer.assetId}\n className=\"mx-3 mt-3 flex flex-col gap-3 rounded-xl border border-border p-3\"\n >\n <div className=\"flex items-start gap-2.5\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground\">\n <MonitorIcon className=\"size-4\" aria-hidden />\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-foreground text-sm\">{computer.title ?? computer.assetId}</p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {computer.role === 'session_computer' ? 'Session computer' : 'Used by this session'}\n {computer.updatedAt ? ` · updated ${relativeTime(computer.updatedAt)}` : ''}\n </p>\n </div>\n <ComputerStateBadge assetId={computer.assetId} />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <OpenInAthenaLink assetId={computer.assetId} />\n </div>\n <CopySshCommand assetId={computer.assetId} />\n </article>\n);\n\nexport const SessionComputerPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n if (!isPersisted) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer yet\">\n The computer this session works on shows here once it starts.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { primary, others } = workspaceComputers(workspace.data);\n if (!primary) {\n return (\n <PaneEmpty icon={MonitorIcon} title=\"No computer used yet\">\n When the agent runs commands on a computer, it shows here with a link and its SSH command.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-3\">\n <ComputerLiveDesktop assetId={primary.assetId} className=\"mx-3 mt-3\" />\n <ComputerCard computer={primary} />\n {others.length > 0 ? (\n <>\n <SectionHeading>Also used</SectionHeading>\n <ul aria-label=\"Other computers\">\n {others.map((computer) => (\n <li key={computer.assetId} className=\"flex items-center gap-2 px-3 py-1.5\">\n <MonitorIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate text-foreground text-sm\">\n {computer.title ?? computer.assetId}\n </span>\n <OpenInAthenaLink assetId={computer.assetId} compact label={`Open ${computer.title ?? 'computer'} in Athena`} />\n </li>\n ))}\n </ul>\n </>\n ) : null}\n </div>\n );\n};\n\n// ─── Pull requests ───────────────────────────────────────────────────\n\nconst PullRequestRow: FC<{ pullRequest: ConversationPullRequest }> = ({ pullRequest }) => {\n const state = pullRequestChipState(pullRequest);\n const Icon = PR_STATE_ICON[state];\n const meta = [\n `${pullRequest.repoFullName}#${pullRequest.number}`,\n state,\n PR_CHECKS_LABEL[pullRequest.checksState],\n reviewDecisionLabel(pullRequest.reviewDecision),\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <li>\n <a\n href={pullRequest.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-pr-state={state}\n className={cn('flex items-start gap-2.5 px-3 py-2 transition-colors hover:bg-muted/60', FOCUS_RING_CLASS)}\n >\n <Icon className={cn('mt-0.5 size-4 shrink-0', PR_STATE_CLASS[state])} aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-foreground text-sm leading-snug\">\n {pullRequest.title || `#${pullRequest.number}`}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">{meta}</span>\n </span>\n <ExternalLinkIcon className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n </a>\n </li>\n );\n};\n\nexport const SessionPullRequestsPane: FC = () => {\n const { threadId, isPersisted } = useSessionWorkbench();\n const list = useAthenaStatewireThreadList();\n const attention = useAthenaSessionAttention(threadId ?? undefined);\n if (!list) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests need the session list\">\n Mount the provider with enableThreadList to see the pull requests a session opened.\n </PaneEmpty>\n );\n }\n const pullRequests = isPersisted ? (attention?.pullRequests ?? []) : [];\n if (attention?.pullRequests === null && isPersisted) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"Pull requests unavailable\">\n GitHub could not be read for this session right now.\n </PaneEmpty>\n );\n }\n if (pullRequests.length === 0) {\n return (\n <PaneEmpty icon={GitPullRequestIcon} title=\"No pull requests\">\n Pull requests the agent opens show here with their checks and review state.\n </PaneEmpty>\n );\n }\n const ordered = orderedPullRequests(pullRequests);\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{ordered.length}</span>}\n >\n Pull requests\n </SectionHeading>\n <ul aria-label=\"Pull requests\">\n {ordered.map((pullRequest) => (\n <PullRequestRow key={pullRequest.url} pullRequest={pullRequest} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Attachments ─────────────────────────────────────────────────────\n\nconst ASSET_ICON: Record<string, FC<{ className?: string }>> = {\n spreadsheet: FileSpreadsheetIcon,\n document: FileTextIcon,\n presentation: PresentationIcon,\n presentation_pptx_studio: PresentationIcon,\n pptx: PresentationIcon,\n notebook: BookOpenIcon,\n image: ImageIcon,\n folder: FolderIcon,\n markdown: FileTextIcon,\n pdf: FileTextIcon,\n txt: FileTextIcon,\n};\n\nconst AttachmentRow: FC<{ asset: SessionWorkspaceAsset; canOpenHere: boolean }> = ({\n asset,\n canOpenHere,\n}) => {\n const openAsset = useAssetPanelStore((state) => state.openAsset);\n const Icon = ASSET_ICON[asset.assetType] ?? FileIcon;\n const panelType: AssetPanelType | null = assetPanelTypeOf(asset.assetType);\n const title = asset.title ?? asset.assetId;\n const meta = [\n assetTypeLabel(asset.assetType),\n asset.updatedAt ? `updated ${relativeTime(asset.updatedAt)}` : null,\n ]\n .filter(Boolean)\n .join(' · ');\n const body = (\n <>\n <Icon className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-foreground text-sm\">{title}</span>\n <span className=\"block truncate text-[11px] text-muted-foreground\" title={fullTime(asset.updatedAt)}>\n {meta}\n </span>\n </span>\n </>\n );\n return (\n <li className=\"flex items-start gap-1 pr-2\">\n {canOpenHere && panelType ? (\n <button\n type=\"button\"\n onClick={() => openAsset(asset.assetId, { name: title, type: panelType })}\n className={cn(\n 'flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2 text-left transition-colors hover:bg-muted/60',\n FOCUS_RING_CLASS,\n )}\n >\n {body}\n </button>\n ) : (\n <div className=\"flex min-w-0 flex-1 items-start gap-2.5 px-3 py-2\">{body}</div>\n )}\n <span className=\"pt-1.5\">\n <OpenInAthenaLink assetId={asset.assetId} compact label={`Open ${title} in Athena`} />\n </span>\n </li>\n );\n};\n\nexport const SessionAttachmentsPane: FC = () => {\n const { isPersisted } = useSessionWorkbench();\n const workspace = useSessionWorkbenchWorkspace();\n const canOpenHere = useAssetPanelStore((state) => state.assetPanelHostCount > 0);\n if (!isPersisted) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n if (workspace.isError) return <PaneError error={workspace.error} />;\n if (!workspace.data) return <PaneSkeleton />;\n const { assets } = workspace.data;\n if (assets.length === 0) {\n return (\n <PaneEmpty icon={PaperclipIcon} title=\"No files yet\">\n Documents, sheets and decks the agent creates or edits show here.\n </PaneEmpty>\n );\n }\n return (\n <div className=\"flex flex-col pb-2\">\n <SectionHeading\n trailing={<span className=\"text-muted-foreground text-xs tabular-nums\">{assets.length}</span>}\n >\n Created or edited\n </SectionHeading>\n <ul aria-label=\"Session files\">\n {assets.map((asset) => (\n <AttachmentRow key={asset.assetId} asset={asset} canOpenHere={canOpenHere} />\n ))}\n </ul>\n </div>\n );\n};\n\n// ─── Registry ────────────────────────────────────────────────────────\n\nexport const SESSION_WORKBENCH_TASKS_PANE: SessionWorkbenchPane = {\n id: 'tasks',\n title: 'Tasks',\n description: \"Follow the agent's plan step by step\",\n icon: ListChecksIcon,\n render: () => <SessionTasksPane />,\n};\n\nexport const SESSION_WORKBENCH_SHELL_PANE: SessionWorkbenchPane = {\n id: 'shell',\n title: 'Shell',\n description: 'Commands the agent ran and their output',\n icon: TerminalIcon,\n render: () => <SessionShellPane />,\n};\n\nexport const SESSION_WORKBENCH_COMPUTER_PANE: SessionWorkbenchPane = {\n id: 'computer',\n title: 'Computer',\n description: 'The machine this session works on, and how to reach it',\n icon: MonitorIcon,\n render: () => <SessionComputerPane />,\n};\n\nexport const SESSION_WORKBENCH_PULL_REQUESTS_PANE: SessionWorkbenchPane = {\n id: 'pull-requests',\n title: 'Pull requests',\n description: 'Pull requests this session opened, with checks and reviews',\n icon: GitPullRequestIcon,\n render: () => <SessionPullRequestsPane />,\n};\n\nexport const SESSION_WORKBENCH_ATTACHMENTS_PANE: SessionWorkbenchPane = {\n id: 'attachments',\n title: 'Attachments',\n description: 'Files and assets this session created or edited',\n icon: PaperclipIcon,\n render: () => <SessionAttachmentsPane />,\n};\n\n/** The built-in panes, in \"+\" menu order. Spread it to add your own. */\nexport const DEFAULT_SESSION_WORKBENCH_PANES: readonly SessionWorkbenchPane[] = [\n SESSION_WORKBENCH_TASKS_PANE,\n SESSION_WORKBENCH_SHELL_PANE,\n SESSION_WORKBENCH_COMPUTER_PANE,\n SESSION_WORKBENCH_PULL_REQUESTS_PANE,\n SESSION_WORKBENCH_ATTACHMENTS_PANE,\n];\n\n/** The panes a thread opens with until the person changes its tabs. */\nexport const DEFAULT_SESSION_WORKBENCH_OPEN_PANE_IDS: readonly string[] = [\n SESSION_WORKBENCH_TASKS_PANE.id,\n SESSION_WORKBENCH_SHELL_PANE.id,\n SESSION_WORKBENCH_COMPUTER_PANE.id,\n];\n"],"names":["_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@athenaintel/react",
3
- "version": "0.50.0",
3
+ "version": "0.53.0",
4
4
  "description": "Athena React SDK — Build AI-powered chat applications with the Athena platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -78,7 +78,7 @@
78
78
  ],
79
79
  "scripts": {
80
80
  "dev": "bun run build:css && vite build --watch",
81
- "build": "vite build && bun run scripts/build-declarations.ts && bun run build:css",
81
+ "build": "vite build && bun run scripts/check-dist-self-contained.ts && bun run scripts/build-declarations.ts && bun run build:css",
82
82
  "prepare": "test ! -f src/index.ts || bun run build",
83
83
  "build:css": "tailwindcss -i src/styles.entry.css -o dist/styles.css --minify",
84
84
  "test": "bun test --conditions=@athenaintel/source --isolate mount-tests && bun test --conditions=@athenaintel/source src",