@tangle-network/agent-app 0.60.176 → 0.60.178
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/agent-profiles/d1.js +1 -1
- package/dist/agent-profiles/index.js +9 -1
- package/dist/agent-profiles/self-management.d.ts +82 -0
- package/dist/{chunk-6VXBUIM5.js → chunk-ARBBJWZA.js} +63 -6
- package/dist/{chunk-6VXBUIM5.js.map → chunk-ARBBJWZA.js.map} +1 -1
- package/dist/{chunk-MCAIZKQ5.js → chunk-CPNJRLPN.js} +15 -4
- package/dist/chunk-CPNJRLPN.js.map +1 -0
- package/dist/hub-approvals/index.js +1 -1
- package/dist/hub-approvals/present.d.ts +1 -1
- package/dist/hub-approvals/types.d.ts +35 -0
- package/dist/hub-approvals-react/dock.d.ts +3 -2
- package/dist/hub-approvals-react/email.d.ts +13 -0
- package/dist/hub-approvals-react/feedback.d.ts +20 -0
- package/dist/hub-approvals-react/index.d.ts +1 -0
- package/dist/hub-approvals-react/index.js +535 -286
- package/dist/hub-approvals-react/index.js.map +1 -1
- package/dist/hub-approvals-react/parts.d.ts +1 -1
- package/dist/hub-approvals-react/row.d.ts +3 -2
- package/package.json +1 -1
- package/dist/chunk-MCAIZKQ5.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hub-approvals-react/dock.tsx","../../src/hub-approvals-react/parts.tsx","../../src/hub-approvals-react/preview.tsx","../../src/hub-approvals-react/list.tsx","../../src/hub-approvals-react/row.tsx","../../src/hub-approvals-react/receipt.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, ChevronDown, ExternalLink, Loader2, X } from 'lucide-react'\nimport { Button, Label, RadioGroup, RadioGroupItem } from '@tangle-network/ui/primitives'\n\nimport {\n HUB_APPROVAL_ACTIVE_PHASES,\n HUB_APPROVAL_OPEN_PHASES,\n hubActionReceipt,\n presentHubAction,\n type HubApprovalItem,\n type HubApprovalPhase,\n} from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { closesIn, distinctAccount, HubApprovalPhasePill, HubApprovalWaitNote, HubProviderMark, HubRawDetails, openPhaseLabel } from './parts'\nimport { HubActionPreviewView } from './preview'\n\n/** The owner's answer to one held call. `allow` also grants a standing permission. */\nexport type HubApprovalDecision =\n | { kind: 'approve' }\n | { kind: 'deny' }\n | { kind: 'allow'; duration: '24h' | 'always'; scope: string }\n\n/** What a standing permission for one call may cover, or why none can. */\nexport type HubApprovalPermissions =\n | { scopes: ReadonlyArray<{ id: string; label: string }> }\n | { never: string }\n\nexport interface HubApprovalDockProps {\n /** Every held call; open, running and uncertain calls stay visible until resolved or dismissed. */\n items: readonly HubApprovalItem[]\n onDecide: (item: HubApprovalItem, decision: HubApprovalDecision) => Promise<void>\n /** Standing-permission choices for a call; omit when the host offers none. */\n permissions?: (item: HubApprovalItem) => HubApprovalPermissions | null\n /** Show the call where the agent made it. */\n onOpen?: (item: HubApprovalItem) => void\n /** Bring one call to the front, e.g. after it was picked in the Approvals list. */\n focusId?: string | null\n className?: string\n}\n\n/** How long a finished call stays in the dock, so its result is seen where it was approved. */\nconst DONE_VISIBLE_MS = 6_000\n\nfunction useNow(intervalMs: number) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(timer)\n }, [intervalMs])\n return now\n}\n\nfunction Progress({ item }: { item: HubApprovalItem }) {\n const provider = presentHubAction(item).provider.name\n if (item.phase === 'queued' || item.phase === 'running') {\n return (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <Loader2 aria-hidden className=\"size-4 animate-spin text-[var(--surface-info-text)]\" />\n {item.phase === 'queued' ? 'Approved. It runs when the agent’s turn finishes…' : `Running on ${provider}…`}\n </p>\n )\n }\n if (item.phase === 'done') {\n const receipt = hubActionReceipt(item)\n return (\n <p role=\"status\" className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n <Check aria-hidden className=\"size-4 shrink-0 text-[var(--surface-success-text)]\" />\n {receipt.href\n ? <a href={receipt.href} target=\"_blank\" rel=\"noreferrer\" className=\"inline-flex min-w-0 items-center gap-1 hover:underline\"><span className=\"truncate\">{receipt.title}</span><ExternalLink aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" /></a>\n : <span className=\"truncate\">{receipt.title}</span>}\n </p>\n )\n }\n if (item.phase === 'unknown') {\n return (\n <p role=\"alert\" className=\"break-words text-sm text-[var(--surface-warning-text)]\">\n <span className=\"font-medium\">May have run.</span> {HUB_APPROVAL_UNKNOWN_WARNING}\n </p>\n )\n }\n if (item.phase === 'failed') {\n return (\n <p role=\"alert\" className=\"break-words text-sm text-[var(--surface-danger-text)]\">\n {hubActionReceipt(item).title}{item.error ? `: ${item.error}` : '.'}\n </p>\n )\n }\n return null\n}\n\n/**\n * The calls waiting on the owner, pinned above the composer so a held action\n * never scrolls away. Each shows what it does, where, as which account, and a\n * preview drawn like its integration; Approve, Deny and the standing\n * permissions a host offers sit beside it. Approving shows the run in place —\n * starting, running, then the result — without leaving the conversation.\n */\nexport function HubApprovalDock({ items, onDecide, permissions, onOpen, focusId, className = '' }: HubApprovalDockProps) {\n const now = useNow(30_000)\n // Calls that finished while this dock watched them stay with their result: a\n // success briefly, a failure until dismissed. Uncertain outcomes also stay\n // visible after remount or status reload, until dismissed in this session.\n const watched = useRef(new Map<string, HubApprovalPhase>())\n const [settled, setSettled] = useState<Record<string, number>>({})\n const [dismissed, setDismissed] = useState<ReadonlySet<string>>(new Set())\n const [submitting, setSubmitting] = useState<{ id: string; label: string } | null>(null)\n const [error, setError] = useState<{ id: string; message: string } | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [collapsed, setCollapsed] = useState(false)\n const [permissionsOpen, setPermissionsOpen] = useState(false)\n const [scope, setScope] = useState<string | null>(null)\n\n useEffect(() => {\n const finishedNow: Record<string, number> = {}\n for (const item of items) {\n const before = watched.current.get(item.id)\n const wasLive = before !== undefined && (HUB_APPROVAL_OPEN_PHASES.has(before) || HUB_APPROVAL_ACTIVE_PHASES.has(before))\n if (wasLive && (item.phase === 'done' || item.phase === 'failed' || item.phase === 'unknown')) finishedNow[item.id] = Date.now()\n watched.current.set(item.id, item.phase)\n }\n if (Object.keys(finishedNow).length > 0) setSettled((current) => ({ ...current, ...finishedNow }))\n }, [items])\n\n useEffect(() => {\n const doneIds = Object.entries(settled).filter(([id]) => items.find((item) => item.id === id)?.phase === 'done')\n if (doneIds.length === 0) return\n const oldest = Math.min(...doneIds.map(([, at]) => at))\n const timer = setTimeout(() => {\n const cutoff = Date.now() - DONE_VISIBLE_MS\n setSettled((current) => Object.fromEntries(Object.entries(current).filter(([id, at]) => at > cutoff || items.find((item) => item.id === id)?.phase !== 'done')))\n }, Math.max(0, oldest + DONE_VISIBLE_MS - Date.now()))\n return () => clearTimeout(timer)\n }, [settled, items])\n\n const queue = useMemo(() => items.filter((item) => !dismissed.has(item.id) && (\n HUB_APPROVAL_OPEN_PHASES.has(item.phase)\n || HUB_APPROVAL_ACTIVE_PHASES.has(item.phase)\n || item.phase === 'unknown'\n || item.id in settled\n || submitting?.id === item.id\n )), [items, dismissed, settled, submitting])\n\n useEffect(() => {\n if (focusId && queue.some((item) => item.id === focusId)) {\n setActiveId(focusId)\n setCollapsed(false)\n }\n }, [focusId, queue])\n\n const activeIndex = Math.max(0, queue.findIndex((item) => item.id === activeId))\n const active = queue[activeIndex]\n\n // When the shown call finishes and its result has been seen, move to the next one waiting.\n useEffect(() => {\n if (!active || activeId === active.id) return\n setActiveId(active.id)\n }, [active, activeId])\n useEffect(() => {\n setPermissionsOpen(false)\n setScope(null)\n }, [active?.id])\n\n if (!active) return null\n const presentation = presentHubAction(active)\n const waitingCount = queue.filter((item) => HUB_APPROVAL_OPEN_PHASES.has(item.phase)).length\n const choices = permissions?.(active) ?? null\n const scopes = choices && 'scopes' in choices ? choices.scopes : []\n const chosenScope = scope ?? scopes[0]?.id ?? null\n const busy = submitting?.id === active.id\n const decidable = active.phase === 'waiting' && !busy\n const closing = active.phase === 'waiting' ? closesIn(active.expiresAt, now) : null\n const account = distinctAccount(active.account, presentation.provider.name)\n const subtitle = [presentation.provider.name, account ? `as ${account}` : null, closing].filter(Boolean).join(' · ')\n\n async function decide(decision: HubApprovalDecision, label: string) {\n if (!active || submitting) return\n setSubmitting({ id: active.id, label })\n setError(null)\n try {\n await onDecide(active, decision)\n } catch (cause) {\n setError({ id: active.id, message: cause instanceof Error ? cause.message : 'The decision did not go through. Try again.' })\n } finally {\n setSubmitting(null)\n }\n }\n\n const card = (\n <>\n <div className=\"flex items-start gap-3 px-4 pt-3\">\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={28} />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"line-clamp-2 break-words text-base font-semibold leading-6 text-foreground\" title={presentation.title}>{presentation.title}</h3>\n <p className=\"truncate text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={collapsed ? 'Show the request' : 'Hide the preview'}\n aria-expanded={!collapsed}\n onClick={() => setCollapsed((value) => !value)}\n >\n <ChevronDown className={`transition-transform ${collapsed ? '-rotate-90' : ''}`} />\n </Button>\n </div>\n\n {!collapsed && (\n <div className=\"max-h-48 space-y-3 overflow-y-auto px-4 pt-3 sm:max-h-80\">\n {active.bundle?.steps && active.bundle.steps.length > 0 && (\n <ol className=\"space-y-1 text-sm\" aria-label=\"Steps this approval covers\">\n {active.bundle.steps.map((stepItem, index) => (\n <li key={index} className={`flex items-center gap-2 ${stepItem.state === 'current' ? 'font-medium text-foreground' : 'text-muted-foreground'}`}>\n <span className={`flex size-5 shrink-0 items-center justify-center rounded-full border text-sm tabular-nums ${stepItem.state === 'done' ? 'border-transparent bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]' : 'border-border'}`}>\n {stepItem.state === 'done' ? <Check aria-hidden className=\"size-3.5\" /> : index + 1}\n </span>\n {stepItem.label}\n </li>\n ))}\n </ol>\n )}\n <HubActionPreviewView preview={presentation.preview} account={active.account} />\n <HubRawDetails sections={[{ label: 'Call', value: { action: active.actionPath, input: active.input } }]} />\n </div>\n )}\n\n <div className=\"space-y-3 px-4 pb-4 pt-3\">\n {busy && submitting && !HUB_APPROVAL_ACTIVE_PHASES.has(active.phase) && active.phase === 'waiting' && (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <Loader2 aria-hidden className=\"size-4 animate-spin text-[var(--surface-info-text)]\" />\n {submitting.label}\n </p>\n )}\n <Progress item={active} />\n {error?.id === active.id && active.phase === 'waiting' && <p role=\"alert\" className=\"text-sm text-[var(--surface-danger-text)]\">{error.message}</p>}\n {HUB_APPROVAL_OPEN_PHASES.has(active.phase) && active.wait && <HubApprovalWaitNote wait={active.wait} />}\n {active.phase === 'blocked' && !active.wait && <p className=\"text-sm text-muted-foreground\">The workspace owner approves this request.</p>}\n\n {decidable && permissionsOpen && scopes.length > 0 && (\n <fieldset className=\"space-y-2 rounded-xl border border-border bg-muted/30 px-3 py-3\">\n <legend className=\"sr-only\">Standing permission</legend>\n {scopes.length > 1 && (\n <RadioGroup\n aria-label=\"What the permission covers\"\n value={chosenScope ?? undefined}\n onValueChange={setScope}\n className=\"gap-1.5\"\n >\n {scopes.map((option) => (\n <div key={option.id} className=\"flex min-h-8 items-center gap-2\">\n <RadioGroupItem id={`hub-scope-${active.id}-${option.id}`} value={option.id} />\n <Label htmlFor={`hub-scope-${active.id}-${option.id}`} className=\"cursor-pointer text-sm font-normal text-foreground\">{option.label}</Label>\n </div>\n ))}\n </RadioGroup>\n )}\n {scopes.length === 1 && <p className=\"text-sm text-foreground\">{scopes[0]?.label}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => chosenScope && void decide({ kind: 'allow', duration: '24h', scope: chosenScope }, 'Approving and allowing for 24 hours…')}>\n Approve and allow for 24 hours\n </Button>\n <Button variant=\"outline\" onClick={() => chosenScope && void decide({ kind: 'allow', duration: 'always', scope: chosenScope }, 'Approving and allowing from now on…')}>\n Approve and always allow\n </Button>\n </div>\n </fieldset>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {decidable && (\n <>\n <Button onClick={() => void decide({ kind: 'approve' }, 'Approving…')}>Approve</Button>\n <Button variant=\"outline\" onClick={() => void decide({ kind: 'deny' }, 'Denying…')}>Deny</Button>\n {scopes.length > 0 && (\n <Button variant=\"ghost\" aria-expanded={permissionsOpen} onClick={() => setPermissionsOpen((value) => !value)}>\n {permissionsOpen ? 'Fewer options' : 'Allow future calls…'}\n </Button>\n )}\n </>\n )}\n {(active.phase === 'failed' || active.phase === 'unknown') && (\n <Button variant=\"outline\" onClick={() => setDismissed((current) => new Set([...current, active.id]))}>\n <X aria-hidden /> Dismiss\n </Button>\n )}\n <span className=\"flex-1\" />\n {decidable && choices && 'never' in choices && !active.wait && (\n <span className=\"text-sm text-muted-foreground\">{choices.never}</span>\n )}\n {onOpen && (\n <Button variant=\"ghost\" onClick={() => onOpen(active)}>View in chat</Button>\n )}\n </div>\n </div>\n </>\n )\n\n return (\n <section\n aria-label={active.phase === 'unknown' ? 'Action may have run' : 'Waiting for your approval'}\n data-hub-approval-dock={active.id}\n className={`overflow-hidden rounded-2xl border border-[var(--surface-warning-border)] bg-card shadow-md ${className}`}\n >\n {queue.length > 1 ? (\n <div className=\"max-h-[70vh] overflow-y-auto pt-2.5\">\n <p className=\"px-4 pb-1.5 text-sm font-medium text-muted-foreground\" aria-live=\"polite\">\n {waitingCount === 0 ? `${queue.length} requests` : waitingCount === 1 ? '1 request waiting' : `${waitingCount} requests waiting`}\n </p>\n <ul aria-label=\"Requests in this conversation\" className=\"divide-y divide-border border-t border-border\">\n {queue.map((item) => {\n if (item.id === active.id) return <li key={item.id} aria-current=\"true\">{card}</li>\n const shown = presentHubAction(item)\n return (\n <li key={item.id}>\n <Button\n variant=\"bare\"\n data-hub-approval-dock-row={item.id}\n onClick={() => {\n setActiveId(item.id)\n setCollapsed(false)\n }}\n className=\"flex min-h-11 w-full items-center gap-2.5 px-4 text-left transition-colors hover:bg-muted/60\"\n >\n <HubProviderMark providerId={shown.provider.id} name={shown.provider.name} size={24} />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {item.phase === 'done' ? hubActionReceipt(item).title : shown.title}\n </span>\n {/* Every row here waits unless it says otherwise; on a phone the title keeps that width. */}\n <span className={item.phase === 'waiting' ? 'hidden sm:inline-flex' : 'inline-flex'}>\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item)} />\n </span>\n </Button>\n </li>\n )\n })}\n </ul>\n </div>\n ) : card}\n </section>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { ChevronRight, Clock, Zap } from 'lucide-react'\nimport { ProviderIcon } from '@tangle-network/sandbox-ui/integrations'\nimport { Button, StatusPill, type StatusTone } from '@tangle-network/ui/primitives'\n\nimport { HUB_APPROVAL_PHASE_LABELS, type HubApprovalItem, type HubApprovalPhase, type HubApprovalWait } from '../hub-approvals'\n\nconst PHASE_TONES: Record<HubApprovalPhase, StatusTone> = {\n waiting: 'warning',\n blocked: 'warning',\n queued: 'running',\n running: 'running',\n done: 'success',\n failed: 'danger',\n unknown: 'warning',\n denied: 'neutral',\n expired: 'neutral',\n}\n\n/** A phase as a toned pill: glyph, colour and label. */\nexport function HubApprovalPhasePill({ phase, label }: { phase: HubApprovalPhase; label?: string }) {\n return (\n <StatusPill tone={PHASE_TONES[phase]} size=\"md\" className=\"shrink-0 whitespace-nowrap\">\n {label ?? HUB_APPROVAL_PHASE_LABELS[phase]}\n </StatusPill>\n )\n}\n\n/** The pill an open call shows: who it waits for, or that a permission runs it. */\nexport function openPhaseLabel(item: Pick<HubApprovalItem, 'phase' | 'wait'>, blocked = 'Owner decides'): string | undefined {\n if (item.phase === 'blocked') return blocked\n if (item.phase !== 'waiting') return undefined\n return item.wait?.owner === false ? 'Runs on its own' : 'Waiting'\n}\n\n/** Why an open call waits for the owner, or how it will run without them. */\nexport function HubApprovalWaitNote({ wait, className = '' }: { wait: HubApprovalWait; className?: string }) {\n const Icon = wait.owner ? Clock : Zap\n return (\n <p data-hub-approval-wait={wait.code ?? (wait.owner ? 'owner' : 'auto')} className={`flex items-start gap-2 text-sm ${wait.owner ? 'text-muted-foreground' : 'text-[var(--surface-info-text)]'} ${className}`}>\n <Icon aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <span className=\"min-w-0 break-words\">{wait.reason}</span>\n </p>\n )\n}\n\n/** The integration's own logo on a neutral tile, so dark marks stay legible. */\nexport function HubProviderMark({ providerId, name, size = 28 }: { providerId: string; name: string; size?: number }) {\n const inner = Math.round(size * 0.64)\n return (\n <span\n className=\"flex shrink-0 items-center justify-center rounded-lg border border-border bg-background\"\n style={{ width: size, height: size }}\n >\n <ProviderIcon id={providerId} displayName={name} size={inner} className=\"rounded-sm\" />\n </span>\n )\n}\n\n/** Raw JSON behind a disclosure, for the person who wants the exact call. */\nexport function HubRawDetails({ sections, label = 'Details' }: { sections: ReadonlyArray<{ label: string; value: unknown }>; label?: string }) {\n const [open, setOpen] = useState(false)\n const shown = sections.filter((section) => section.value !== undefined && section.value !== null && section.value !== '')\n if (shown.length === 0) return null\n return (\n <div>\n <Button\n variant=\"bare\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"inline-flex min-h-8 items-center gap-1 rounded-md text-sm font-medium text-muted-foreground hover:text-foreground\"\n >\n <ChevronRight aria-hidden className={`size-4 transition-transform ${open ? 'rotate-90' : ''}`} />\n {label}\n </Button>\n {open && (\n <div className=\"mt-2 space-y-3\">\n {shown.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">{section.label}</p>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-lg border border-border bg-muted/40 p-3 font-mono text-sm leading-5 text-foreground\">\n {typeof section.value === 'string' ? section.value : JSON.stringify(section.value, null, 2)}\n </pre>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** A `label value` list that wraps on a phone. */\nexport function HubFieldList({ fields }: { fields: ReadonlyArray<{ label: string; value: string; href?: string; mono?: boolean }> }) {\n if (fields.length === 0) return null\n return (\n <dl className=\"flex flex-wrap gap-x-6 gap-y-2 text-sm\">\n {fields.map((field) => (\n <div key={`${field.label}:${field.value}`} className=\"flex min-w-0 max-w-full items-baseline gap-2\">\n <dt className=\"shrink-0 text-muted-foreground\">{field.label}</dt>\n <dd className={`min-w-0 truncate text-foreground ${field.mono ? 'font-mono' : ''}`} title={field.value}>\n {field.href\n ? <a href={field.href} target=\"_blank\" rel=\"noreferrer\" className=\"text-[var(--accent-text)] underline-offset-2 hover:underline\">{field.value}</a>\n : field.value}\n </dd>\n </div>\n ))}\n </dl>\n )\n}\n\nexport function Chip({ children, mono }: { children: ReactNode; mono?: boolean }) {\n return (\n <span className={`inline-flex max-w-full items-center truncate rounded-md border border-border bg-muted/50 px-1.5 py-0.5 text-sm text-foreground ${mono ? 'font-mono' : ''}`}>\n {children}\n </span>\n )\n}\n\n/** The account worth naming: none when it only repeats the provider's name. */\nexport function distinctAccount(account: string | null | undefined, providerName: string): string | null {\n const value = account?.trim()\n return value && value.toLowerCase() !== providerName.toLowerCase() ? value : null\n}\n\n/** When a decision window closes, relative to now: `in 23 h`, `in 5 min`. */\nexport function closesIn(expiresAt: string | null | undefined, now = Date.now()): string | null {\n if (!expiresAt) return null\n const minutes = Math.ceil((Date.parse(expiresAt) - now) / 60_000)\n if (!Number.isFinite(minutes) || minutes <= 0) return null\n return minutes >= 120 ? `closes in ${Math.round(minutes / 60)} h` : `closes in ${minutes} min`\n}\n\n/** A short relative time: `just now`, `4 min ago`, `3 h ago`, then the date. */\nexport function relativeTime(at: string | null | undefined, now = Date.now()): string | null {\n if (!at) return null\n const then = Date.parse(at)\n if (!Number.isFinite(then)) return null\n const minutes = Math.round((now - then) / 60_000)\n if (minutes < 1) return 'just now'\n if (minutes < 60) return `${minutes} min ago`\n if (minutes < 24 * 60) return `${Math.round(minutes / 60)} h ago`\n return new Date(then).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n","import { ArrowRight, CalendarDays, GitBranch, GitCommitHorizontal, GitPullRequest, MapPin, Phone, Users } from 'lucide-react'\nimport { ApprovalDiffSummary } from '@tangle-network/ui/run'\n\nimport { formatMinorAmount, formatWhen, type HubActionPreview } from '../hub-approvals'\nimport { Chip, HubFieldList } from './parts'\n\n/** Readable text of an HTML email body, for a preview that never renders markup. */\nfunction plainText(body: string, html: boolean): string {\n if (!html) return body\n return body\n .replace(/<(script|style)[\\s\\S]*?<\\/\\1>/gi, '')\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|div|li|h[1-6]|tr)>/gi, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n\nfunction initial(name: string | null | undefined): string {\n return (name?.trim().replace(/^@/, '').charAt(0) || '?').toUpperCase()\n}\n\nfunction Panel({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <div className={`rounded-lg border border-border bg-background ${className}`}>{children}</div>\n}\n\nfunction PullRequestPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'pull-request' }> }) {\n return (\n <div className=\"space-y-3\">\n <Panel className=\"px-3 py-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm text-muted-foreground\">\n <GitPullRequest aria-hidden className=\"size-4 shrink-0\" />\n {preview.repository && <span className=\"font-medium text-foreground\">{preview.repository}</span>}\n {preview.head && preview.base && (\n <span className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <Chip mono>{preview.head}</Chip>\n <ArrowRight aria-label=\"into\" className=\"size-4 shrink-0\" />\n <Chip mono>{preview.base}</Chip>\n </span>\n )}\n {preview.draft && <span className=\"rounded-md border border-border px-1.5 py-0.5 text-sm text-muted-foreground\">Draft</span>}\n </div>\n {preview.title && <p className=\"mt-2 text-base font-semibold leading-6 text-foreground\">{preview.title}</p>}\n {preview.body && <p className=\"mt-1 line-clamp-3 whitespace-pre-line text-sm leading-6 text-muted-foreground sm:line-clamp-4\">{preview.body}</p>}\n </Panel>\n {preview.files.length > 0 && <ApprovalDiffSummary files={preview.files} />}\n </div>\n )\n}\n\nfunction EmailPreview({ preview, account }: { preview: Extract<HubActionPreview, { kind: 'email' }>; account?: string | null }) {\n const rows: Array<[string, string]> = [\n ...(account ? [['From', account] as [string, string]] : []),\n ...(preview.to.length ? [['To', preview.to.join(', ')] as [string, string]] : []),\n ...(preview.cc.length ? [['Cc', preview.cc.join(', ')] as [string, string]] : []),\n ...(preview.bcc.length ? [['Bcc', preview.bcc.join(', ')] as [string, string]] : []),\n ]\n const body = preview.body ? plainText(preview.body, preview.html) : ''\n return (\n <Panel className=\"overflow-hidden\">\n <dl className=\"grid grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 border-b border-border px-3 py-2.5 text-sm\">\n {rows.map(([label, value]) => (\n <div key={label} className=\"contents\">\n <dt className=\"text-muted-foreground\">{label}</dt>\n <dd className=\"break-words text-foreground\">{value}</dd>\n </div>\n ))}\n {preview.subject && (\n <div className=\"contents\">\n <dt className=\"text-muted-foreground\">Subject</dt>\n <dd className=\"break-words font-semibold text-foreground\">{preview.subject}</dd>\n </div>\n )}\n {preview.reply && !preview.subject && (\n <div className=\"contents\">\n <dt className=\"text-muted-foreground\">Reply</dt>\n <dd className=\"text-foreground\">In the existing conversation</dd>\n </div>\n )}\n </dl>\n {body && <div className=\"max-h-60 overflow-y-auto whitespace-pre-wrap break-words px-3 py-3 text-sm leading-6 text-foreground\">{body}</div>}\n </Panel>\n )\n}\n\nfunction PostPreview({ preview, account }: { preview: Extract<HubActionPreview, { kind: 'post' }>; account?: string | null }) {\n if (preview.channel === 'slack') {\n return (\n <Panel className=\"px-3 py-3\">\n <p className=\"text-sm font-semibold text-foreground\">{preview.where ?? 'Slack'}</p>\n <div className=\"mt-2 flex gap-3\">\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-sm font-semibold text-foreground\">{initial(account)}</span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{account ?? 'Your account'}</p>\n <p className=\"whitespace-pre-wrap break-words text-sm leading-6 text-foreground\">{preview.text}</p>\n </div>\n </div>\n </Panel>\n )\n }\n const x = preview.channel === 'x'\n const length = [...preview.text].length\n return (\n <Panel className=\"px-4 py-3\">\n <div className=\"flex gap-3\">\n <span className={`flex size-10 shrink-0 items-center justify-center rounded-full text-base font-semibold ${x ? 'bg-foreground text-background' : 'bg-[#0a66c2] text-white'}`}>\n {initial(account)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"flex flex-wrap items-baseline gap-x-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{account ?? 'Your account'}</span>\n <span className=\"text-muted-foreground\">{x ? '· now' : '· Post · Anyone'}</span>\n </p>\n <p className={`mt-1 whitespace-pre-wrap break-words text-foreground ${x ? 'text-base leading-6' : 'text-sm leading-6'}`}>{preview.text}</p>\n {preview.link && (\n <div className=\"mt-3 overflow-hidden rounded-lg border border-border\">\n <div className=\"px-3 py-2\">\n <p className=\"truncate text-sm text-muted-foreground\">{preview.link.url.replace(/^https?:\\/\\//, '')}</p>\n {preview.link.title && <p className=\"truncate text-sm font-semibold text-foreground\">{preview.link.title}</p>}\n {preview.link.description && <p className=\"line-clamp-2 text-sm text-muted-foreground\">{preview.link.description}</p>}\n </div>\n </div>\n )}\n </div>\n </div>\n {x && (\n <p className={`mt-2 text-right text-sm tabular-nums ${length > 280 ? 'text-[var(--surface-danger-text)]' : 'text-muted-foreground'}`}>\n {length} / 280\n </p>\n )}\n </Panel>\n )\n}\n\nfunction PaymentPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'payment' }> }) {\n return (\n <Panel className=\"px-4 py-3\">\n <p className=\"text-sm text-muted-foreground\">{preview.label.charAt(0).toUpperCase() + preview.label.slice(1)}</p>\n {preview.amount !== undefined && (\n <p className=\"mt-0.5 text-2xl font-semibold tabular-nums text-foreground\">{formatMinorAmount(preview.amount, preview.currency)}</p>\n )}\n <div className=\"mt-2 space-y-1 text-sm\">\n {preview.customer && (\n <p className=\"text-muted-foreground\">Customer <span className={`text-foreground ${preview.customer.startsWith('cus_') ? 'font-mono' : ''}`}>{preview.customer}</span></p>\n )}\n {preview.description && <p className=\"text-foreground\">{preview.description}</p>}\n </div>\n </Panel>\n )\n}\n\nfunction SpeechPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'speech' }> }) {\n return (\n <Panel className=\"px-4 py-3\">\n <blockquote className=\"border-l-2 border-[var(--accent-text)] pl-3 text-base leading-7 text-foreground\">{preview.text}</blockquote>\n {(preview.voice || preview.seconds) && (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {preview.voice && <Chip>Voice: {preview.voice}</Chip>}\n {preview.seconds && <Chip>About {preview.seconds} s</Chip>}\n </div>\n )}\n </Panel>\n )\n}\n\nfunction CallPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'call' }> }) {\n return (\n <Panel className=\"flex gap-3 px-4 py-3\">\n <span className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-muted\"><Phone aria-hidden className=\"size-5 text-foreground\" /></span>\n <div className=\"min-w-0 space-y-1 text-sm\">\n <p className=\"text-base font-semibold tabular-nums text-foreground\">{preview.to ?? 'Unknown number'}</p>\n {preview.from && <p className=\"text-muted-foreground\">From <span className=\"tabular-nums text-foreground\">{preview.from}</span></p>}\n {preview.purpose && <p className=\"leading-6 text-foreground\">{preview.purpose}</p>}\n </div>\n </Panel>\n )\n}\n\nfunction EventPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'event' }> }) {\n const start = preview.start ? new Date(preview.start) : null\n const valid = start && !Number.isNaN(start.getTime())\n return (\n <Panel className=\"flex gap-4 px-4 py-3\">\n <div className=\"flex w-14 shrink-0 flex-col items-center overflow-hidden rounded-lg border border-border text-center\">\n <span className=\"w-full bg-[var(--surface-danger-bg)] py-0.5 text-sm font-semibold uppercase text-[var(--surface-danger-text)]\">\n {valid ? start!.toLocaleDateString(undefined, { month: 'short' }) : <CalendarDays aria-hidden className=\"mx-auto size-4\" />}\n </span>\n <span className=\"py-1 text-xl font-semibold tabular-nums text-foreground\">{valid ? start!.getDate() : '–'}</span>\n </div>\n <div className=\"min-w-0 space-y-1 text-sm\">\n <p className=\"text-base font-semibold text-foreground\">{preview.title ?? 'Untitled event'}</p>\n {preview.start && <p className=\"text-foreground\">{formatWhen(preview.start, preview.end)}</p>}\n {preview.location && <p className=\"flex items-center gap-1.5 text-muted-foreground\"><MapPin aria-hidden className=\"size-4 shrink-0\" />{preview.location}</p>}\n {preview.attendees.length > 0 && (\n <p className=\"flex items-start gap-1.5 text-muted-foreground\"><Users aria-hidden className=\"mt-0.5 size-4 shrink-0\" /><span className=\"break-words\">{preview.attendees.join(', ')}</span></p>\n )}\n {preview.description && <p className=\"line-clamp-3 leading-6 text-foreground\">{preview.description}</p>}\n </div>\n </Panel>\n )\n}\n\n/**\n * What a held call will do, drawn the way its integration shows it: a pull\n * request with its branch and file changes, an email, a post in the channel's\n * style, a payment, a voice memo, a call or a calendar event. Any other action\n * lists its input fields.\n */\nexport function HubActionPreviewView({ preview, account }: { preview: HubActionPreview; account?: string | null }) {\n switch (preview.kind) {\n case 'pull-request':\n return <PullRequestPreview preview={preview} />\n case 'files':\n return preview.files.length > 0 ? <ApprovalDiffSummary files={preview.files} /> : null\n case 'commit':\n return (\n <Panel className=\"px-3 py-3\">\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <GitCommitHorizontal aria-hidden className=\"size-4 shrink-0\" />\n {preview.repository ?? 'Commit'}\n </p>\n {preview.message && <p className=\"mt-2 whitespace-pre-line text-sm leading-6 text-foreground\">{preview.message}</p>}\n <div className=\"mt-2\"><HubFieldList fields={[\n ...(preview.tree ? [{ label: 'Tree', value: preview.tree.slice(0, 7), mono: true }] : []),\n ...preview.parents.map((parent) => ({ label: 'Parent', value: parent.slice(0, 7), mono: true })),\n ]} /></div>\n </Panel>\n )\n case 'branch':\n return (\n <Panel className=\"flex flex-wrap items-center gap-2 px-3 py-3 text-sm\">\n <GitBranch aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n {preview.branch && <Chip mono>{preview.branch}</Chip>}\n {preview.sha && <span className=\"text-muted-foreground\">at <span className=\"font-mono text-foreground\">{preview.sha.slice(0, 7)}</span></span>}\n </Panel>\n )\n case 'issue':\n return (\n <Panel className=\"px-3 py-3\">\n {preview.verdict && <p className=\"text-sm font-medium capitalize text-foreground\">{preview.verdict}</p>}\n {preview.title && <p className=\"text-base font-semibold leading-6 text-foreground\">{preview.title}</p>}\n {preview.body && <p className=\"mt-1 line-clamp-6 whitespace-pre-line text-sm leading-6 text-foreground\">{preview.body}</p>}\n </Panel>\n )\n case 'email':\n return <EmailPreview preview={preview} account={account} />\n case 'post':\n return <PostPreview preview={preview} account={account} />\n case 'payment':\n return <PaymentPreview preview={preview} />\n case 'speech':\n return <SpeechPreview preview={preview} />\n case 'call':\n return <CallPreview preview={preview} />\n case 'event':\n return <EventPreview preview={preview} />\n case 'fields':\n return preview.fields.length > 0 ? <Panel className=\"px-3 py-3\"><HubFieldList fields={preview.fields} /></Panel> : null\n }\n}\n","import { useEffect, useState } from 'react'\nimport { ChevronRight, ShieldCheck } from 'lucide-react'\nimport { Button } from '@tangle-network/ui/primitives'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalItem, type HubApprovalPhase } from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { closesIn, distinctAccount, HubApprovalPhasePill, HubProviderMark, openPhaseLabel, relativeTime } from './parts'\n\nconst GROUPS: ReadonlyArray<{ id: string; label: string; phases: readonly HubApprovalPhase[] }> = [\n { id: 'waiting', label: 'Waiting', phases: ['waiting', 'blocked'] },\n { id: 'running', label: 'Running', phases: ['queued', 'running'] },\n // Uncertain effects need provider verification, separate from confirmed failures.\n { id: 'unknown', label: 'May have run', phases: ['unknown'] },\n { id: 'failed', label: 'Failed', phases: ['failed'] },\n { id: 'done', label: 'Done', phases: ['done'] },\n { id: 'closed', label: 'Denied or expired', phases: ['denied', 'expired'] },\n]\n\nexport interface HubApprovalsListProps {\n items: readonly HubApprovalItem[]\n /** Show one call: scroll to it in the conversation and open its detail. */\n onSelect?: (item: HubApprovalItem) => void\n selectedId?: string | null\n className?: string\n}\n\n/**\n * Every held call in the conversation, grouped by where it stands — waiting,\n * running, failed, done, then denied or expired — and updated as the host's\n * items change. Picking one hands it to `onSelect`.\n */\nexport function HubApprovalsList({ items, onSelect, selectedId, className = '' }: HubApprovalsListProps) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 30_000)\n return () => clearInterval(timer)\n }, [])\n const waiting = items.filter((item) => item.phase === 'waiting' || item.phase === 'blocked').length\n const groups = GROUPS\n .map((group) => ({ ...group, items: items.filter((item) => group.phases.includes(item.phase)).slice().reverse() }))\n .filter((group) => group.items.length > 0)\n\n return (\n <div className={`flex h-full min-h-0 flex-col ${className}`}>\n <div className=\"shrink-0 border-b border-border px-4 py-3\">\n <h2 className=\"text-base font-semibold text-foreground\">Approvals</h2>\n <p className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {waiting === 0 ? 'Nothing is waiting for you' : waiting === 1 ? '1 request is waiting' : `${waiting} requests are waiting`}\n </p>\n </div>\n {groups.length === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <span className=\"flex size-10 items-center justify-center rounded-xl bg-muted\"><ShieldCheck aria-hidden className=\"size-5 text-muted-foreground\" /></span>\n <p className=\"text-sm font-medium text-foreground\">No approvals in this conversation</p>\n <p className=\"text-sm text-muted-foreground\">Requests to act on your connected accounts appear here.</p>\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 space-y-5 overflow-y-auto px-2 py-3\">\n {groups.map((group) => (\n <section key={group.id} aria-label={group.label}>\n <h3 className=\"px-2 pb-1 text-sm font-medium text-muted-foreground\">\n {group.label} <span className=\"tabular-nums\">· {group.items.length}</span>\n </h3>\n <ul className=\"space-y-1\">\n {group.items.map((item) => {\n const presentation = presentHubAction(item)\n const title = item.phase === 'done' ? hubActionReceipt(item).title : presentation.title\n const when = item.phase === 'waiting' ? closesIn(item.expiresAt, now) ?? relativeTime(item.requestedAt, now) : relativeTime(item.requestedAt, now)\n const detail = [presentation.provider.name, distinctAccount(item.account, presentation.provider.name), when].filter(Boolean).join(' · ')\n const selected = selectedId === item.id\n return (\n <li key={item.id}>\n <Button\n variant=\"bare\"\n onClick={() => onSelect?.(item)}\n aria-current={selected ? 'true' : undefined}\n className={`flex w-full items-start gap-3 rounded-lg px-2 py-2.5 text-left transition-colors hover:bg-muted ${selected ? 'bg-muted' : ''}`}\n >\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={28} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium leading-5 text-foreground\">{title}</span>\n <span className=\"mt-0.5 block truncate text-sm text-muted-foreground\">{detail}</span>\n {item.phase === 'unknown' && <span className=\"mt-1 block text-sm text-[var(--surface-warning-text)]\">{HUB_APPROVAL_UNKNOWN_WARNING}</span>}\n {(item.phase === 'waiting' || item.phase === 'blocked') && item.wait && <span className=\"mt-1 line-clamp-2 block text-sm text-muted-foreground\">{item.wait.reason}</span>}\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item, 'Owner')} />\n <ChevronRight aria-hidden className=\"size-4 text-muted-foreground\" />\n </span>\n </Button>\n </li>\n )\n })}\n </ul>\n </section>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { Button } from '@tangle-network/ui/primitives'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalItem } from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { HubApprovalPhasePill, HubProviderMark, HubRawDetails, openPhaseLabel } from './parts'\nimport { HubActionPreviewView } from './preview'\nimport { HubActionReceiptCard } from './receipt'\n\nexport interface HubApprovalRowProps {\n item: HubApprovalItem\n /** Open the detail, e.g. when the call was picked in the Approvals list. */\n expanded?: boolean\n onExpandedChange?: (expanded: boolean) => void\n /** Bring a waiting call to the front of the dock. */\n onReview?: (item: HubApprovalItem) => void\n /** Extra controls for settled calls; suppressed for unknown outcomes to prevent unsafe retries. */\n actions?: ReactNode\n}\n\n/**\n * A held call where the agent made it: one line with the integration, what\n * the call does and where it stands, opening to its preview, result and the\n * exact call. The decision itself lives in the dock, so the transcript stays\n * readable while a request waits.\n */\nexport function HubApprovalRow({ item, expanded: controlled, onExpandedChange, onReview, actions }: HubApprovalRowProps) {\n const [own, setOwn] = useState(false)\n const expanded = controlled ?? own\n const ref = useRef<HTMLDivElement>(null)\n const presentation = presentHubAction(item)\n const title = item.phase === 'done' ? hubActionReceipt(item).title : presentation.title\n\n useEffect(() => {\n if (controlled) ref.current?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }, [controlled])\n\n const toggle = () => {\n setOwn(!expanded)\n onExpandedChange?.(!expanded)\n }\n\n return (\n <div ref={ref} data-hub-approval-row={item.id} className={`rounded-xl border bg-card ${expanded ? 'border-border shadow-sm' : 'border-border/80'}`}>\n <div className=\"flex items-center gap-3 px-3 py-2\">\n <Button\n variant=\"bare\"\n aria-expanded={expanded}\n onClick={toggle}\n className=\"flex min-h-9 min-w-0 flex-1 items-center gap-3 rounded-md text-left\"\n >\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={24} />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{title}</span>\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item)} />\n <ChevronDown aria-hidden className={`size-4 shrink-0 text-muted-foreground transition-transform ${expanded ? 'rotate-180' : ''}`} />\n </Button>\n {item.phase === 'waiting' && onReview && (\n // On a phone the dock sits just below; the row keeps its width for the title.\n <Button variant=\"outline\" className=\"hidden sm:inline-flex\" onClick={() => onReview(item)}>Review</Button>\n )}\n </div>\n {!expanded && item.phase === 'unknown' && (\n <p className=\"px-3 pb-3 text-sm text-[var(--surface-warning-text)]\">{HUB_APPROVAL_UNKNOWN_WARNING}</p>\n )}\n {expanded && (\n <div className=\"space-y-3 border-t border-border px-3 pb-3 pt-3\">\n {item.phase === 'done' || item.phase === 'failed' || item.phase === 'unknown'\n ? <HubActionReceiptCard item={item} className=\"border-0 px-0 py-0 shadow-none\" />\n : (\n <>\n <HubActionPreviewView preview={presentation.preview} account={item.account} />\n <HubRawDetails sections={[{ label: 'Call', value: { action: item.actionPath, input: item.input } }]} />\n </>\n )}\n {item.phase !== 'unknown' && actions}\n </div>\n )}\n {!expanded && actions && (item.phase === 'expired' || item.phase === 'failed') && (\n <div className=\"border-t border-border px-3 py-2\">{actions}</div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { ExternalLink } from 'lucide-react'\nimport { ApprovalDiffSummary } from '@tangle-network/ui/run'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalItem, type HubApprovalPhase } from '../hub-approvals'\nimport { distinctAccount, HubApprovalPhasePill, HubFieldList, HubProviderMark, HubRawDetails } from './parts'\n\nfunction AudioPlayer({ src }: { src: string }) {\n const [failed, setFailed] = useState(false)\n if (failed) return <p className=\"text-sm text-muted-foreground\">The audio link has expired. Ask the agent for a new one.</p>\n // The memo is generated speech with its text shown beside it, so it carries no caption track.\n // eslint-disable-next-line jsx-a11y/media-has-caption\n return <audio controls preload=\"metadata\" src={src} onError={() => setFailed(true)} className=\"h-10 w-full\" />\n}\n\nexport interface HubActionReceiptCardProps {\n item: HubApprovalItem\n className?: string\n}\n\n/**\n * What one decided Hub action did: the integration's logo, the result in plain\n * words with its link, the key fields, a player or file changes when the\n * result has them, and the exact call and result behind Details.\n */\nexport function HubActionReceiptCard({ item, className = '' }: HubActionReceiptCardProps) {\n const receipt = hubActionReceipt(item)\n const presentation = presentHubAction(item)\n const account = distinctAccount(item.account, receipt.provider.name)\n const subtitle = [receipt.provider.name, account ? `as ${account}` : null, presentation.target && !receipt.title.includes(presentation.target) ? presentation.target : null]\n .filter(Boolean).join(' · ')\n const phase: HubApprovalPhase = item.phase\n return (\n <article aria-label={receipt.title} className={`rounded-xl border border-border bg-card px-4 py-3 shadow-sm ${className}`}>\n <div className=\"flex items-start gap-3\">\n <HubProviderMark providerId={receipt.provider.id} name={receipt.provider.name} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base font-semibold leading-6 text-foreground\">\n {receipt.href\n ? (\n <a href={receipt.href} target=\"_blank\" rel=\"noreferrer\" className=\"inline-flex max-w-full items-center gap-1.5 hover:underline\">\n <span className=\"truncate\">{receipt.title}</span>\n <ExternalLink aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n </a>\n )\n : <span className=\"break-words\">{receipt.title}</span>}\n </p>\n {subtitle && <p className=\"truncate text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n <HubApprovalPhasePill phase={phase} />\n </div>\n {(receipt.fields.length > 0 || receipt.media || receipt.files || receipt.error || receipt.warning) && (\n <div className=\"mt-3 space-y-3\">\n <HubFieldList fields={receipt.fields} />\n {receipt.media && <AudioPlayer src={receipt.media.src} />}\n {receipt.files && <ApprovalDiffSummary files={receipt.files} />}\n {receipt.warning && (\n <p className=\"break-words rounded-lg border border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] px-3 py-2 text-sm text-[var(--surface-warning-text)]\">\n {receipt.warning}\n </p>\n )}\n {receipt.error && (\n <p className=\"break-words rounded-lg border border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] px-3 py-2 text-sm text-[var(--surface-danger-text)]\">\n {receipt.error}\n </p>\n )}\n </div>\n )}\n {(item.grant || item.autoApproved) && (\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {item.autoApproved ?? `Allowed ${item.grant?.expiresAt ? 'for 24 hours' : 'from now on'}: ${item.grant?.scope}`}\n </p>\n )}\n <div className=\"mt-2\">\n <HubRawDetails sections={[\n { label: 'Call', value: { action: item.actionPath, input: item.input } },\n { label: 'Result', value: item.result },\n ]} />\n </div>\n </article>\n )\n}\n\nexport interface HubApprovalReceiptsProps {\n items: readonly HubApprovalItem[]\n /** The message the agent received, shown behind Details so nothing it read is hidden. */\n message?: string\n /** When the decisions were sent. */\n at?: string | Date | null\n}\n\n/**\n * The receipts that stand in for the message resuming the agent after a\n * decision. The agent gets that message unchanged; the transcript shows what\n * happened instead of the machine prompt.\n */\nexport function HubApprovalReceipts({ items, message, at }: HubApprovalReceiptsProps) {\n const decided = items.filter((item) => item.phase !== 'waiting' && item.phase !== 'blocked')\n const count = (phases: readonly HubApprovalPhase[]) => decided.filter((item) => phases.includes(item.phase)).length\n const actions = (n: number) => (n === 1 ? '1 action' : `${n} actions`)\n const approved = count(['queued', 'running', 'done', 'failed', 'unknown'])\n const denied = count(['denied'])\n const expired = count(['expired'])\n const verbs = [approved ? `approved ${actions(approved)}` : null, denied ? `denied ${actions(denied)}` : null].filter(Boolean)\n const summary = verbs.length\n ? `You ${verbs.join(' and ')}${expired ? `; ${actions(expired)} expired` : ''}`\n : expired ? `${actions(expired)} expired` : 'Your decisions'\n const when = at ? new Date(at) : null\n return (\n <section aria-label=\"Approval results\" className=\"space-y-2\">\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>{summary}</span>\n {when && !Number.isNaN(when.getTime()) && (\n <time dateTime={when.toISOString()}>· {when.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' })}</time>\n )}\n </p>\n {decided.map((item) => <HubActionReceiptCard key={item.id} item={item} />)}\n {message && <HubRawDetails label=\"Message sent to the agent\" sections={[{ label: 'The agent received', value: message }]} />}\n </section>\n )\n}\n"],"mappings":"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","names":["useState","Button","jsx","jsxs","jsx","jsxs","useState","Button","useEffect","useState","ChevronRight","Button","jsx","jsxs","useState","useEffect","Button","ChevronRight","useEffect","useRef","useState","ChevronDown","Button","useState","ExternalLink","ApprovalDiffSummary","jsx","jsxs","useState","ExternalLink","ApprovalDiffSummary","Fragment","jsx","jsxs","useState","useRef","useEffect","Button","ChevronDown"]}
|
|
1
|
+
{"version":3,"sources":["../../src/hub-approvals-react/dock.tsx","../../src/hub-approvals-react/parts.tsx","../../src/hub-approvals-react/preview.tsx","../../src/hub-approvals-react/email.tsx","../../src/hub-approvals-react/feedback.tsx","../../src/hub-approvals-react/list.tsx","../../src/hub-approvals-react/row.tsx","../../src/hub-approvals-react/receipt.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, ChevronDown, ExternalLink, Loader2, X } from 'lucide-react'\nimport { Button, Label, RadioGroup, RadioGroupItem } from '@tangle-network/ui/primitives'\n\nimport {\n HUB_APPROVAL_ACTIVE_PHASES,\n HUB_APPROVAL_OPEN_PHASES,\n hubActionReceipt,\n presentHubAction,\n type HubApprovalItem,\n type HubApprovalPhase,\n type HubApprovalFeedback,\n} from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { closesIn, distinctAccount, HubApprovalPhasePill, HubApprovalWaitNote, HubProviderMark, HubRawDetails, openPhaseLabel } from './parts'\nimport { HubActionPreviewView } from './preview'\nimport { HubPreviewFeedback, type HubPreviewFeedbackProps } from './feedback'\n\n/** The owner's answer to one held call. `allow` also grants a standing permission. */\nexport type HubApprovalDecision =\n | { kind: 'approve' }\n | { kind: 'deny' }\n | { kind: 'allow'; duration: '24h' | 'always'; scope: string }\n\n/** What a standing permission for one call may cover, or why none can. */\nexport type HubApprovalPermissions =\n | { scopes: ReadonlyArray<{ id: string; label: string }> }\n | { never: string }\n\nexport interface HubApprovalDockProps {\n /** Every held call; open, running and uncertain calls stay visible until resolved or dismissed. */\n items: readonly HubApprovalItem[]\n onDecide: (item: HubApprovalItem, decision: HubApprovalDecision) => Promise<void>\n /** Standing-permission choices for a call; omit when the host offers none. */\n permissions?: (item: HubApprovalItem) => HubApprovalPermissions | null\n /** Show the call where the agent made it. */\n onOpen?: (item: HubApprovalItem) => void\n /** Bring one call to the front, e.g. after it was picked in the Approvals list. */\n focusId?: string | null\n className?: string\n onFeedback?: (item: HubApprovalItem, feedback: HubApprovalFeedback) => Promise<void>\n}\n\n/** How long a finished call stays in the dock, so its result is seen where it was approved. */\nconst DONE_VISIBLE_MS = 6_000\n\nfunction useNow(intervalMs: number) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(timer)\n }, [intervalMs])\n return now\n}\n\nfunction Progress({ item }: { item: HubApprovalItem }) {\n const provider = presentHubAction(item).provider.name\n if (item.phase === 'queued' || item.phase === 'running') {\n return (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <Loader2 aria-hidden className=\"size-4 animate-spin text-[var(--surface-info-text)]\" />\n {item.phase === 'queued' ? 'Approved. It runs when the agent’s turn finishes…' : `Running on ${provider}…`}\n </p>\n )\n }\n if (item.phase === 'done') {\n const receipt = hubActionReceipt(item)\n return (\n <p role=\"status\" className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n <Check aria-hidden className=\"size-4 shrink-0 text-[var(--surface-success-text)]\" />\n {receipt.href\n ? <a href={receipt.href} target=\"_blank\" rel=\"noreferrer\" className=\"inline-flex min-w-0 items-center gap-1 hover:underline\"><span className=\"truncate\">{receipt.title}</span><ExternalLink aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" /></a>\n : <span className=\"truncate\">{receipt.title}</span>}\n </p>\n )\n }\n if (item.phase === 'unknown') {\n return (\n <p role=\"alert\" className=\"break-words text-sm text-[var(--surface-warning-text)]\">\n <span className=\"font-medium\">May have run.</span> {HUB_APPROVAL_UNKNOWN_WARNING}\n </p>\n )\n }\n if (item.phase === 'failed') {\n return (\n <p role=\"alert\" className=\"break-words text-sm text-[var(--surface-danger-text)]\">\n {hubActionReceipt(item).title}{item.error ? `: ${item.error}` : '.'}\n </p>\n )\n }\n return null\n}\n\n/**\n * The calls waiting on the owner, pinned above the composer so a held action\n * never scrolls away. Each shows what it does, where, as which account, and a\n * preview drawn like its integration; Approve, Deny and the standing\n * permissions a host offers sit beside it. Approving shows the run in place —\n * starting, running, then the result — without leaving the conversation.\n */\nexport function HubApprovalDock({ items, onDecide, permissions, onOpen, focusId, onFeedback, className = '' }: HubApprovalDockProps) {\n const now = useNow(30_000)\n // Calls that finished while this dock watched them stay with their result: a\n // success briefly, a failure until dismissed. Uncertain outcomes also stay\n // visible after remount or status reload, until dismissed in this session.\n const watched = useRef(new Map<string, HubApprovalPhase>())\n const [settled, setSettled] = useState<Record<string, number>>({})\n const [dismissed, setDismissed] = useState<ReadonlySet<string>>(new Set())\n const [submitting, setSubmitting] = useState<{ id: string; label: string } | null>(null)\n const [error, setError] = useState<{ id: string; message: string } | null>(null)\n const [activeId, setActiveId] = useState<string | null>(null)\n const [collapsed, setCollapsed] = useState(false)\n const [permissionsOpen, setPermissionsOpen] = useState(false)\n const [scope, setScope] = useState<string | null>(null)\n const feedbackDrafts = useRef<NonNullable<HubPreviewFeedbackProps['drafts']>>(new Map())\n const [feedbackSaving, setFeedbackSaving] = useState(false)\n\n useEffect(() => {\n const finishedNow: Record<string, number> = {}\n for (const item of items) {\n const before = watched.current.get(item.id)\n const wasLive = before !== undefined && (HUB_APPROVAL_OPEN_PHASES.has(before) || HUB_APPROVAL_ACTIVE_PHASES.has(before))\n if (wasLive && (item.phase === 'done' || item.phase === 'failed' || item.phase === 'unknown')) finishedNow[item.id] = Date.now()\n watched.current.set(item.id, item.phase)\n }\n if (Object.keys(finishedNow).length > 0) setSettled((current) => ({ ...current, ...finishedNow }))\n }, [items])\n\n useEffect(() => {\n const doneIds = Object.entries(settled).filter(([id]) => items.find((item) => item.id === id)?.phase === 'done')\n if (doneIds.length === 0) return\n const oldest = Math.min(...doneIds.map(([, at]) => at))\n const timer = setTimeout(() => {\n const cutoff = Date.now() - DONE_VISIBLE_MS\n setSettled((current) => Object.fromEntries(Object.entries(current).filter(([id, at]) => at > cutoff || items.find((item) => item.id === id)?.phase !== 'done')))\n }, Math.max(0, oldest + DONE_VISIBLE_MS - Date.now()))\n return () => clearTimeout(timer)\n }, [settled, items])\n\n const queue = useMemo(() => items.filter((item) => !dismissed.has(item.id) && (\n HUB_APPROVAL_OPEN_PHASES.has(item.phase)\n || HUB_APPROVAL_ACTIVE_PHASES.has(item.phase)\n || item.phase === 'unknown'\n || item.id in settled\n || submitting?.id === item.id\n )), [items, dismissed, settled, submitting])\n\n useEffect(() => {\n if (!feedbackSaving && focusId && queue.some((item) => item.id === focusId)) {\n setActiveId(focusId)\n setCollapsed(false)\n }\n }, [focusId, queue, feedbackSaving])\n\n const activeIndex = Math.max(0, queue.findIndex((item) => item.id === activeId))\n const active = queue[activeIndex]\n\n // When the shown call finishes and its result has been seen, move to the next one waiting.\n useEffect(() => {\n if (!active || activeId === active.id) return\n setActiveId(active.id)\n }, [active, activeId])\n useEffect(() => {\n setPermissionsOpen(false)\n setScope(null)\n }, [active?.id])\n\n if (!active) return null\n const presentation = presentHubAction(active)\n const waitingCount = queue.filter((item) => HUB_APPROVAL_OPEN_PHASES.has(item.phase)).length\n const choices = active.executionMode === 'dry-run' ? null : permissions?.(active) ?? null\n const scopes = choices && 'scopes' in choices ? choices.scopes : []\n const chosenScope = scope ?? scopes[0]?.id ?? null\n const busy = submitting?.id === active.id\n const decidable = active.phase === 'waiting' && !busy\n const closing = active.phase === 'waiting' ? closesIn(active.expiresAt, now) : null\n const account = distinctAccount(active.account, presentation.provider.name)\n const subtitle = [presentation.provider.name, account ? `as ${account}` : null, closing].filter(Boolean).join(' · ')\n\n async function decide(decision: HubApprovalDecision, label: string) {\n if (!active || submitting) return\n setSubmitting({ id: active.id, label })\n setError(null)\n try {\n await onDecide(active, decision)\n } catch (cause) {\n setError({ id: active.id, message: cause instanceof Error ? cause.message : 'The decision did not go through. Try again.' })\n } finally {\n setSubmitting(null)\n }\n }\n\n const card = (\n <>\n <div className=\"flex items-start gap-3 px-4 pt-3\">\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={28} />\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"line-clamp-2 break-words text-base font-semibold leading-6 text-foreground\" title={presentation.title}>{presentation.title}</h3>\n <p className=\"truncate text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={collapsed ? 'Show the request' : 'Hide the preview'}\n aria-expanded={!collapsed}\n disabled={feedbackSaving}\n onClick={() => setCollapsed((value) => !value)}\n >\n <ChevronDown className={`transition-transform ${collapsed ? '-rotate-90' : ''}`} />\n </Button>\n </div>\n\n {!collapsed && (\n <div className=\"max-h-[55vh] space-y-3 overflow-y-auto px-4 pt-3 sm:max-h-[60vh]\">\n {active.bundle?.steps && active.bundle.steps.length > 0 && (\n <ol className=\"space-y-1 text-sm\" aria-label=\"Steps this approval covers\">\n {active.bundle.steps.map((stepItem, index) => (\n <li key={index} className={`flex items-center gap-2 ${stepItem.state === 'current' ? 'font-medium text-foreground' : 'text-muted-foreground'}`}>\n <span className={`flex size-5 shrink-0 items-center justify-center rounded-full border text-sm tabular-nums ${stepItem.state === 'done' ? 'border-transparent bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]' : 'border-border'}`}>\n {stepItem.state === 'done' ? <Check aria-hidden className=\"size-3.5\" /> : index + 1}\n </span>\n {stepItem.label}\n </li>\n ))}\n </ol>\n )}\n <HubActionPreviewView preview={presentation.preview} account={active.account} />\n <HubRawDetails sections={[{ label: 'Call', value: { action: active.actionPath, input: active.input } }]} />\n {onFeedback && <HubPreviewFeedback key={active.id} item={active} drafts={feedbackDrafts.current} onFeedback={async (item, feedback) => {\n setFeedbackSaving(true)\n try { await onFeedback(item, feedback) } finally { setFeedbackSaving(false) }\n }} />}\n </div>\n )}\n\n <div className=\"space-y-3 px-4 pb-4 pt-3\">\n {busy && submitting && !HUB_APPROVAL_ACTIVE_PHASES.has(active.phase) && active.phase === 'waiting' && (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm font-medium text-foreground\">\n <Loader2 aria-hidden className=\"size-4 animate-spin text-[var(--surface-info-text)]\" />\n {submitting.label}\n </p>\n )}\n <Progress item={active} />\n {HUB_APPROVAL_OPEN_PHASES.has(active.phase) && active.executionMode === 'dry-run' && <p className=\"text-sm text-muted-foreground\">Dry run. This exact payload stays held until you approve this action live.</p>}\n {error?.id === active.id && active.phase === 'waiting' && <p role=\"alert\" className=\"text-sm text-[var(--surface-danger-text)]\">{error.message}</p>}\n {HUB_APPROVAL_OPEN_PHASES.has(active.phase) && active.wait && <HubApprovalWaitNote wait={active.wait} />}\n {active.phase === 'blocked' && !active.wait && <p className=\"text-sm text-muted-foreground\">The workspace owner approves this request.</p>}\n\n {decidable && permissionsOpen && scopes.length > 0 && (\n <fieldset className=\"space-y-2 rounded-xl border border-border bg-muted/30 px-3 py-3\">\n <legend className=\"sr-only\">Standing permission</legend>\n {scopes.length > 1 && (\n <RadioGroup\n aria-label=\"What the permission covers\"\n value={chosenScope ?? undefined}\n onValueChange={setScope}\n className=\"gap-1.5\"\n >\n {scopes.map((option) => (\n <div key={option.id} className=\"flex min-h-8 items-center gap-2\">\n <RadioGroupItem id={`hub-scope-${active.id}-${option.id}`} value={option.id} />\n <Label htmlFor={`hub-scope-${active.id}-${option.id}`} className=\"cursor-pointer text-sm font-normal text-foreground\">{option.label}</Label>\n </div>\n ))}\n </RadioGroup>\n )}\n {scopes.length === 1 && <p className=\"text-sm text-foreground\">{scopes[0]?.label}</p>}\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => chosenScope && void decide({ kind: 'allow', duration: '24h', scope: chosenScope }, 'Approving and allowing for 24 hours…')}>\n Approve and allow for 24 hours\n </Button>\n <Button variant=\"outline\" onClick={() => chosenScope && void decide({ kind: 'allow', duration: 'always', scope: chosenScope }, 'Approving and allowing from now on…')}>\n Approve and always allow\n </Button>\n </div>\n </fieldset>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {decidable && (\n <>\n <Button disabled={feedbackSaving} onClick={() => void decide({ kind: 'approve' }, 'Approving…')}>{active.executionMode === 'dry-run' ? 'Approve live' : 'Approve'}</Button>\n <Button disabled={feedbackSaving} variant=\"outline\" onClick={() => void decide({ kind: 'deny' }, 'Denying…')}>Deny</Button>\n {scopes.length > 0 && (\n <Button variant=\"ghost\" aria-expanded={permissionsOpen} onClick={() => setPermissionsOpen((value) => !value)}>\n {permissionsOpen ? 'Fewer options' : 'Allow future calls…'}\n </Button>\n )}\n </>\n )}\n {(active.phase === 'failed' || active.phase === 'unknown') && (\n <Button variant=\"outline\" onClick={() => setDismissed((current) => new Set([...current, active.id]))}>\n <X aria-hidden /> Dismiss\n </Button>\n )}\n <span className=\"flex-1\" />\n {decidable && choices && 'never' in choices && !active.wait && (\n <span className=\"text-sm text-muted-foreground\">{choices.never}</span>\n )}\n {onOpen && (\n <Button variant=\"ghost\" onClick={() => onOpen(active)}>View in chat</Button>\n )}\n </div>\n </div>\n </>\n )\n\n return (\n <section\n aria-label={active.phase === 'unknown' ? 'Action may have run' : 'Waiting for your approval'}\n data-hub-approval-dock={active.id}\n className={`overflow-hidden rounded-2xl border border-[var(--surface-warning-border)] bg-card shadow-md ${className}`}\n >\n {queue.length > 1 ? (\n <div className=\"max-h-[70vh] overflow-y-auto pt-2.5\">\n <p className=\"px-4 pb-1.5 text-sm font-medium text-muted-foreground\" aria-live=\"polite\">\n {waitingCount === 0 ? `${queue.length} requests` : waitingCount === 1 ? '1 request waiting' : `${waitingCount} requests waiting`}\n </p>\n <ul aria-label=\"Requests in this conversation\" className=\"divide-y divide-border border-t border-border\">\n {queue.map((item) => {\n if (item.id === active.id) return <li key={item.id} aria-current=\"true\">{card}</li>\n const shown = presentHubAction(item)\n return (\n <li key={item.id}>\n <Button\n variant=\"bare\"\n data-hub-approval-dock-row={item.id}\n disabled={feedbackSaving}\n onClick={() => {\n setActiveId(item.id)\n setCollapsed(false)\n }}\n className=\"flex min-h-11 w-full items-center gap-2.5 px-4 text-left transition-colors hover:bg-muted/60\"\n >\n <HubProviderMark providerId={shown.provider.id} name={shown.provider.name} size={24} />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {item.phase === 'done' ? hubActionReceipt(item).title : shown.title}\n </span>\n {/* Every row here waits unless it says otherwise; on a phone the title keeps that width. */}\n <span className={item.phase === 'waiting' ? 'hidden sm:inline-flex' : 'inline-flex'}>\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item)} />\n </span>\n </Button>\n </li>\n )\n })}\n </ul>\n </div>\n ) : card}\n </section>\n )\n}\n","import { useState, type ReactNode } from 'react'\nimport { ChevronRight, Clock, Zap } from 'lucide-react'\nimport { Button, StatusPill, type StatusTone } from '@tangle-network/ui/primitives'\n\nimport { HUB_APPROVAL_PHASE_LABELS, type HubApprovalItem, type HubApprovalPhase, type HubApprovalWait } from '../hub-approvals'\n\nconst PHASE_TONES: Record<HubApprovalPhase, StatusTone> = {\n waiting: 'warning',\n blocked: 'warning',\n queued: 'running',\n running: 'running',\n done: 'success',\n failed: 'danger',\n unknown: 'warning',\n denied: 'neutral',\n expired: 'neutral',\n}\n\n/** A phase as a toned pill: glyph, colour and label. */\nexport function HubApprovalPhasePill({ phase, label }: { phase: HubApprovalPhase; label?: string }) {\n return (\n <StatusPill tone={PHASE_TONES[phase]} size=\"md\" className=\"shrink-0 whitespace-nowrap\">\n {label ?? HUB_APPROVAL_PHASE_LABELS[phase]}\n </StatusPill>\n )\n}\n\n/** The pill an open call shows: who it waits for, or that a permission runs it. */\nexport function openPhaseLabel(item: Pick<HubApprovalItem, 'phase' | 'wait'>, blocked = 'Owner decides'): string | undefined {\n if (item.phase === 'blocked') return blocked\n if (item.phase !== 'waiting') return undefined\n return item.wait?.owner === false ? 'Runs on its own' : 'Waiting'\n}\n\n/** Why an open call waits for the owner, or how it will run without them. */\nexport function HubApprovalWaitNote({ wait, className = '' }: { wait: HubApprovalWait; className?: string }) {\n const Icon = wait.owner ? Clock : Zap\n return (\n <p data-hub-approval-wait={wait.code ?? (wait.owner ? 'owner' : 'auto')} className={`flex items-start gap-2 text-sm ${wait.owner ? 'text-muted-foreground' : 'text-[var(--surface-info-text)]'} ${className}`}>\n <Icon aria-hidden className=\"mt-0.5 size-4 shrink-0\" />\n <span className=\"min-w-0 break-words\">{wait.reason}</span>\n </p>\n )\n}\n\n/** A local provider mark: reviewing a held payload must not fetch a remote logo. */\nexport function HubProviderMark({ providerId, name, size = 28 }: { providerId: string; name: string; size?: number }) {\n return (\n <span\n className=\"flex shrink-0 items-center justify-center rounded-lg border border-border bg-background\"\n style={{ width: size, height: size }}\n title={name}\n data-provider={providerId}\n aria-hidden\n >\n <span className=\"text-sm font-semibold text-muted-foreground\">{name.charAt(0).toUpperCase()}</span>\n </span>\n )\n}\n\n/** Raw JSON behind a disclosure, for the person who wants the exact call. */\nexport function HubRawDetails({ sections, label = 'Details' }: { sections: ReadonlyArray<{ label: string; value: unknown }>; label?: string }) {\n const [open, setOpen] = useState(false)\n const shown = sections.filter((section) => section.value !== undefined && section.value !== null && section.value !== '')\n if (shown.length === 0) return null\n return (\n <div>\n <Button\n variant=\"bare\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n className=\"inline-flex min-h-8 items-center gap-1 rounded-md text-sm font-medium text-muted-foreground hover:text-foreground\"\n >\n <ChevronRight aria-hidden className={`size-4 transition-transform ${open ? 'rotate-90' : ''}`} />\n {label}\n </Button>\n {open && (\n <div className=\"mt-2 space-y-3\">\n {shown.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">{section.label}</p>\n <pre className=\"max-h-64 overflow-auto whitespace-pre-wrap break-all rounded-lg border border-border bg-muted/40 p-3 font-mono text-sm leading-5 text-foreground\">\n {typeof section.value === 'string' ? section.value : JSON.stringify(section.value, null, 2)}\n </pre>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** A `label value` list that wraps on a phone. */\nexport function HubFieldList({ fields }: { fields: ReadonlyArray<{ label: string; value: string; href?: string; mono?: boolean }> }) {\n if (fields.length === 0) return null\n return (\n <dl className=\"flex flex-wrap gap-x-6 gap-y-2 text-sm\">\n {fields.map((field) => (\n <div key={`${field.label}:${field.value}`} className=\"flex min-w-0 max-w-full items-baseline gap-2\">\n <dt className=\"shrink-0 text-muted-foreground\">{field.label}</dt>\n <dd className={`min-w-0 truncate text-foreground ${field.mono ? 'font-mono' : ''}`} title={field.value}>\n {field.href\n ? <a href={field.href} target=\"_blank\" rel=\"noreferrer\" className=\"text-[var(--accent-text)] underline-offset-2 hover:underline\">{field.value}</a>\n : field.value}\n </dd>\n </div>\n ))}\n </dl>\n )\n}\n\nexport function Chip({ children, mono }: { children: ReactNode; mono?: boolean }) {\n return (\n <span className={`inline-flex max-w-full items-center truncate rounded-md border border-border bg-muted/50 px-1.5 py-0.5 text-sm text-foreground ${mono ? 'font-mono' : ''}`}>\n {children}\n </span>\n )\n}\n\n/** The account worth naming: none when it only repeats the provider's name. */\nexport function distinctAccount(account: string | null | undefined, providerName: string): string | null {\n const value = account?.trim()\n return value && value.toLowerCase() !== providerName.toLowerCase() ? value : null\n}\n\n/** When a decision window closes, relative to now: `in 23 h`, `in 5 min`. */\nexport function closesIn(expiresAt: string | null | undefined, now = Date.now()): string | null {\n if (!expiresAt) return null\n const minutes = Math.ceil((Date.parse(expiresAt) - now) / 60_000)\n if (!Number.isFinite(minutes) || minutes <= 0) return null\n return minutes >= 120 ? `closes in ${Math.round(minutes / 60)} h` : `closes in ${minutes} min`\n}\n\n/** A short relative time: `just now`, `4 min ago`, `3 h ago`, then the date. */\nexport function relativeTime(at: string | null | undefined, now = Date.now()): string | null {\n if (!at) return null\n const then = Date.parse(at)\n if (!Number.isFinite(then)) return null\n const minutes = Math.round((now - then) / 60_000)\n if (minutes < 1) return 'just now'\n if (minutes < 60) return `${minutes} min ago`\n if (minutes < 24 * 60) return `${Math.round(minutes / 60)} h ago`\n return new Date(then).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n","import { ArrowRight, CalendarDays, GitBranch, GitCommitHorizontal, GitPullRequest, MapPin, Phone, Users } from 'lucide-react'\nimport { ApprovalDiffSummary } from '@tangle-network/ui/run'\n\nimport { formatMinorAmount, formatWhen, type HubActionPreview } from '../hub-approvals'\nimport { Chip, HubFieldList } from './parts'\nimport { EmailPreview, embeddedPreviewImage, linkedText } from './email'\n\nfunction initial(name: string | null | undefined): string {\n return (name?.trim().replace(/^@/, '').charAt(0) || '?').toUpperCase()\n}\n\nfunction Panel({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <div className={`rounded-lg border border-border bg-background ${className}`}>{children}</div>\n}\n\nfunction PullRequestPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'pull-request' }> }) {\n return (\n <div className=\"space-y-3\">\n <Panel className=\"px-3 py-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm text-muted-foreground\">\n <GitPullRequest aria-hidden className=\"size-4 shrink-0\" />\n {preview.repository && <span className=\"font-medium text-foreground\">{preview.repository}</span>}\n {preview.head && preview.base && (\n <span className=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <Chip mono>{preview.head}</Chip>\n <ArrowRight aria-label=\"into\" className=\"size-4 shrink-0\" />\n <Chip mono>{preview.base}</Chip>\n </span>\n )}\n {preview.draft && <span className=\"rounded-md border border-border px-1.5 py-0.5 text-sm text-muted-foreground\">Draft</span>}\n </div>\n {preview.title && <p className=\"mt-2 text-base font-semibold leading-6 text-foreground\">{preview.title}</p>}\n {preview.body && <p className=\"mt-1 line-clamp-3 whitespace-pre-line text-sm leading-6 text-muted-foreground sm:line-clamp-4\">{preview.body}</p>}\n </Panel>\n {preview.files.length > 0 && <ApprovalDiffSummary files={preview.files} />}\n </div>\n )\n}\n\nfunction PostPreview({ preview, account }: { preview: Extract<HubActionPreview, { kind: 'post' }>; account?: string | null }) {\n if (preview.channel === 'slack') {\n return (\n <Panel className=\"px-3 py-3\">\n <p className=\"text-sm font-semibold text-foreground\">{preview.where ?? 'Slack'}</p>\n <div className=\"mt-2 flex gap-3\">\n <span className=\"flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-sm font-semibold text-foreground\">{initial(account)}</span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{account ?? 'Your account'}</p>\n <p className=\"whitespace-pre-wrap break-words text-sm leading-6 text-foreground\">{linkedText(preview.text)}</p>\n </div>\n </div>\n </Panel>\n )\n }\n const x = preview.channel === 'x'\n const length = [...preview.text].length\n return (\n <Panel className=\"px-4 py-3\">\n <div className=\"flex gap-3\">\n <span className={`flex size-10 shrink-0 items-center justify-center rounded-full text-base font-semibold ${x ? 'bg-foreground text-background' : 'bg-[#0a66c2] text-white'}`}>\n {initial(account)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"flex flex-wrap items-baseline gap-x-1.5 text-sm\">\n <span className=\"font-semibold text-foreground\">{account ?? 'Your account'}</span>\n <span className=\"text-muted-foreground\">{x ? '· now' : '· Post · Anyone'}</span>\n </p>\n <p className={`mt-1 whitespace-pre-wrap break-words text-foreground ${x ? 'text-base leading-6' : 'text-sm leading-6'}`}>{linkedText(preview.text)}</p>\n {preview.images && preview.images.length > 0 && <div className=\"mt-3 grid grid-cols-2 gap-0.5 overflow-hidden rounded-xl border border-border\">\n {preview.images.map((image, index) => <div key={index} className={`${preview.images!.length === 1 ? 'col-span-2 aspect-[16/9]' : 'aspect-square'} overflow-hidden bg-muted`}>\n {embeddedPreviewImage(image.url)\n ? <img src={image.url} alt={image.alt ?? `Post image ${index + 1}`} className=\"size-full object-cover\" />\n : <p className=\"p-3 text-sm text-muted-foreground\">Image not embedded in this preview</p>}\n </div>)}\n </div>}\n {preview.link && (\n <div className=\"mt-3 overflow-hidden rounded-lg border border-border\">\n <div className=\"px-3 py-2\">\n <p className=\"truncate text-sm text-muted-foreground\">{preview.link.url.replace(/^https?:\\/\\//, '')}</p>\n {preview.link.title && <p className=\"truncate text-sm font-semibold text-foreground\">{preview.link.title}</p>}\n {preview.link.description && <p className=\"line-clamp-2 text-sm text-muted-foreground\">{preview.link.description}</p>}\n </div>\n </div>\n )}\n </div>\n </div>\n <p className=\"mt-2 text-right text-sm tabular-nums text-muted-foreground\">{length} characters</p>\n </Panel>\n )\n}\n\nfunction PaymentPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'payment' }> }) {\n return (\n <Panel className=\"px-4 py-3\">\n <p className=\"text-sm text-muted-foreground\">{preview.label.charAt(0).toUpperCase() + preview.label.slice(1)}</p>\n {preview.amount !== undefined && (\n <p className=\"mt-0.5 text-2xl font-semibold tabular-nums text-foreground\">{formatMinorAmount(preview.amount, preview.currency)}</p>\n )}\n <div className=\"mt-2 space-y-1 text-sm\">\n {preview.customer && (\n <p className=\"text-muted-foreground\">Customer <span className={`text-foreground ${preview.customer.startsWith('cus_') ? 'font-mono' : ''}`}>{preview.customer}</span></p>\n )}\n {preview.description && <p className=\"text-foreground\">{preview.description}</p>}\n </div>\n </Panel>\n )\n}\n\nfunction SpeechPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'speech' }> }) {\n return (\n <Panel className=\"px-4 py-3\">\n <blockquote className=\"border-l-2 border-[var(--accent-text)] pl-3 text-base leading-7 text-foreground\">{preview.text}</blockquote>\n {(preview.voice || preview.seconds) && (\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {preview.voice && <Chip>Voice: {preview.voice}</Chip>}\n {preview.seconds && <Chip>About {preview.seconds} s</Chip>}\n </div>\n )}\n </Panel>\n )\n}\n\nfunction CallPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'call' }> }) {\n return (\n <Panel className=\"flex gap-3 px-4 py-3\">\n <span className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-muted\"><Phone aria-hidden className=\"size-5 text-foreground\" /></span>\n <div className=\"min-w-0 space-y-1 text-sm\">\n <p className=\"text-base font-semibold tabular-nums text-foreground\">{preview.to ?? 'Unknown number'}</p>\n {preview.from && <p className=\"text-muted-foreground\">From <span className=\"tabular-nums text-foreground\">{preview.from}</span></p>}\n {preview.purpose && <p className=\"leading-6 text-foreground\">{preview.purpose}</p>}\n </div>\n </Panel>\n )\n}\n\nfunction EventPreview({ preview }: { preview: Extract<HubActionPreview, { kind: 'event' }> }) {\n const start = preview.start ? new Date(preview.start) : null\n const valid = start && !Number.isNaN(start.getTime())\n return (\n <Panel className=\"flex gap-4 px-4 py-3\">\n <div className=\"flex w-14 shrink-0 flex-col items-center overflow-hidden rounded-lg border border-border text-center\">\n <span className=\"w-full bg-[var(--surface-danger-bg)] py-0.5 text-sm font-semibold uppercase text-[var(--surface-danger-text)]\">\n {valid ? start!.toLocaleDateString(undefined, { month: 'short' }) : <CalendarDays aria-hidden className=\"mx-auto size-4\" />}\n </span>\n <span className=\"py-1 text-xl font-semibold tabular-nums text-foreground\">{valid ? start!.getDate() : '–'}</span>\n </div>\n <div className=\"min-w-0 space-y-1 text-sm\">\n <p className=\"text-base font-semibold text-foreground\">{preview.title ?? 'Untitled event'}</p>\n {preview.start && <p className=\"text-foreground\">{formatWhen(preview.start, preview.end)}</p>}\n {preview.location && <p className=\"flex items-center gap-1.5 text-muted-foreground\"><MapPin aria-hidden className=\"size-4 shrink-0\" />{preview.location}</p>}\n {preview.attendees.length > 0 && (\n <p className=\"flex items-start gap-1.5 text-muted-foreground\"><Users aria-hidden className=\"mt-0.5 size-4 shrink-0\" /><span className=\"break-words\">{preview.attendees.join(', ')}</span></p>\n )}\n {preview.description && <p className=\"line-clamp-3 leading-6 text-foreground\">{preview.description}</p>}\n </div>\n </Panel>\n )\n}\n\n/**\n * What a held call will do, drawn the way its integration shows it: a pull\n * request with its branch and file changes, an email, a post in the channel's\n * style, a payment, a voice memo, a call or a calendar event. Any other action\n * lists its input fields.\n */\nexport function HubActionPreviewView({ preview, account }: { preview: HubActionPreview; account?: string | null }) {\n switch (preview.kind) {\n case 'pull-request':\n return <PullRequestPreview preview={preview} />\n case 'files':\n return preview.files.length > 0 ? <ApprovalDiffSummary files={preview.files} /> : null\n case 'commit':\n return (\n <Panel className=\"px-3 py-3\">\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <GitCommitHorizontal aria-hidden className=\"size-4 shrink-0\" />\n {preview.repository ?? 'Commit'}\n </p>\n {preview.message && <p className=\"mt-2 whitespace-pre-line text-sm leading-6 text-foreground\">{preview.message}</p>}\n <div className=\"mt-2\"><HubFieldList fields={[\n ...(preview.tree ? [{ label: 'Tree', value: preview.tree.slice(0, 7), mono: true }] : []),\n ...preview.parents.map((parent) => ({ label: 'Parent', value: parent.slice(0, 7), mono: true })),\n ]} /></div>\n </Panel>\n )\n case 'branch':\n return (\n <Panel className=\"flex flex-wrap items-center gap-2 px-3 py-3 text-sm\">\n <GitBranch aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n {preview.branch && <Chip mono>{preview.branch}</Chip>}\n {preview.sha && <span className=\"text-muted-foreground\">at <span className=\"font-mono text-foreground\">{preview.sha.slice(0, 7)}</span></span>}\n </Panel>\n )\n case 'issue':\n return (\n <Panel className=\"px-3 py-3\">\n {preview.verdict && <p className=\"text-sm font-medium capitalize text-foreground\">{preview.verdict}</p>}\n {preview.title && <p className=\"text-base font-semibold leading-6 text-foreground\">{preview.title}</p>}\n {preview.body && <p className=\"mt-1 line-clamp-6 whitespace-pre-line text-sm leading-6 text-foreground\">{preview.body}</p>}\n </Panel>\n )\n case 'email':\n return <EmailPreview preview={preview} account={account} />\n case 'post':\n return <PostPreview preview={preview} account={account} />\n case 'ad':\n return (\n <Panel className=\"overflow-hidden\">\n <div className=\"space-y-1 px-4 py-3\">\n <p className=\"text-sm font-semibold text-foreground\">{preview.advertiser ?? account ?? 'Advertiser unavailable'}</p>\n <p className=\"text-sm text-muted-foreground\">Sponsored · {preview.placement}</p>\n {preview.text && <p className=\"whitespace-pre-wrap break-words text-sm leading-6 text-foreground\">{preview.text}</p>}\n </div>\n {preview.image && (embeddedPreviewImage(preview.image)\n ? <img src={preview.image} alt={preview.headline ?? 'Ad creative'} className=\"aspect-[1.91/1] w-full object-cover\" />\n : <p className=\"bg-muted p-4 text-sm text-muted-foreground\">Creative image not embedded in this preview</p>)}\n <div className=\"flex flex-wrap items-center gap-3 bg-muted/40 px-4 py-3\">\n <div className=\"min-w-0 flex-1\">{preview.destination && <p className=\"truncate text-sm text-muted-foreground\">{preview.destination}</p>}{preview.headline && <p className=\"break-words font-semibold text-foreground\">{preview.headline}</p>}</div>\n {preview.callToAction && <span className=\"rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground\">{preview.callToAction}</span>}\n </div>\n </Panel>\n )\n case 'page':\n return (\n <Panel className=\"overflow-hidden\">\n <div className=\"border-b border-border px-4 py-2\"><p className=\"text-sm font-medium text-foreground\">{preview.title ?? 'Page preview'}</p>{preview.url && <p className=\"truncate text-sm text-muted-foreground\">{preview.url}</p>}</div>\n {embeddedPreviewImage(preview.screenshot)\n ? <img src={preview.screenshot} alt={preview.title ?? 'Page screenshot'} className=\"h-auto w-full\" />\n : <p className=\"p-4 text-sm text-muted-foreground\">A captured screenshot is needed to preview this page.</p>}\n </Panel>\n )\n case 'payment':\n return <PaymentPreview preview={preview} />\n case 'speech':\n return <SpeechPreview preview={preview} />\n case 'call':\n return <CallPreview preview={preview} />\n case 'event':\n return <EventPreview preview={preview} />\n case 'fields':\n return preview.fields.length > 0 ? <Panel className=\"px-3 py-3\"><HubFieldList fields={preview.fields} /></Panel> : null\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { HubActionPreview } from '../hub-approvals'\n\ntype Email = Extract<HubActionPreview, { kind: 'email' }>\n\nconst EMAIL_TAGS = new Set('a abbr b blockquote br caption center code col colgroup dd del div dl dt em font h1 h2 h3 h4 h5 h6 hr i img li ol p pre s small span strong sub sup table tbody td tfoot th thead tr u ul'.split(' '))\nconst EMAIL_ATTRIBUTES = new Set('align alt bgcolor border cellpadding cellspacing class color colspan dir face height lang rowspan size style title valign width'.split(' '))\n\n/** Only embedded raster images: opening a preview must not contact a tracking pixel. */\nexport function embeddedPreviewImage(value: string | undefined): string | undefined {\n return value && /^data:image\\/(?:png|jpeg|jpg|gif|webp);base64,[a-z0-9+/=\\s]+$/i.test(value) ? value : undefined\n}\n\nfunction emailDocument(body: string): { document: string; text: string } {\n // Template contents are inert, including their resource URLs. DOMParser can fetch\n // images before sanitizing; never attach the untrusted tree to a live document.\n const template = document.createElement('template')\n template.innerHTML = body\n const target = document.createElement('div')\n function copy(source: Node, parent: Node) {\n if (source.nodeType === Node.TEXT_NODE) { parent.appendChild(document.createTextNode(source.textContent ?? '')); return }\n if (!(source instanceof HTMLElement) || !EMAIL_TAGS.has(source.localName)) return\n const element = document.createElement(source.localName)\n for (const attribute of source.attributes) {\n if (EMAIL_ATTRIBUTES.has(attribute.name)) element.setAttribute(attribute.name, attribute.value)\n }\n if (source.localName === 'a') {\n const href = source.getAttribute('href') ?? ''\n if (/^(https?:|mailto:)/i.test(href.trim())) element.setAttribute('href', href)\n // Links keep their real appearance. The sandbox refuses popups/navigation.\n element.setAttribute('target', '_blank')\n element.setAttribute('rel', 'noopener noreferrer')\n }\n if (source.localName === 'img') {\n const image = embeddedPreviewImage(source.getAttribute('src') ?? undefined)\n if (image) element.setAttribute('src', image)\n }\n for (const child of source.childNodes) copy(child, element)\n parent.appendChild(element)\n }\n for (const child of template.content.childNodes) copy(child, target)\n return {\n document: `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; img-src data:; form-action 'none'; base-uri 'none'\"><meta name=\"referrer\" content=\"no-referrer\"><style>body{margin:0;padding:16px 20px;color:#202124;background:#fff;font:14px/1.6 Arial,sans-serif;overflow-wrap:anywhere}a{color:#1155cc}img{max-width:100%;height:auto}table{max-width:100%}pre{white-space:pre-wrap}</style></head><body>${target.innerHTML}</body></html>`,\n text: target.textContent ?? '',\n }\n}\n\n/** Transport-free inbox rendering. No provider SDK, remote images or executable HTML. */\nexport function EmailPreview({ preview, account }: { preview: Email; account?: string | null }) {\n const [html, setHtml] = useState<{ source: string; document: string; text: string } | null>(null)\n useEffect(() => {\n if (preview.html && preview.body) setHtml({ source: preview.body, ...emailDocument(preview.body) })\n else setHtml(null)\n }, [preview.body, preview.html])\n const sender = preview.from ?? account ?? 'Sender unavailable'\n const mailbox = /^(.*?)\\s*<([^>]+)>$/.exec(sender)\n const name = preview.fromName ?? mailbox?.[1]?.replace(/^\"|\"$/g, '') ?? sender\n const address = mailbox?.[2] ?? sender\n const currentHtml = html?.source === preview.body ? html : null\n const snippet = preview.previewText ?? (preview.html ? currentHtml?.text : preview.body)?.replace(/\\s+/g, ' ').trim()\n return (\n <div data-hub-email-preview className=\"overflow-hidden rounded-lg border border-border bg-white font-[Arial,sans-serif] text-[#202124] [color-scheme:light]\">\n <div className=\"flex min-w-0 items-baseline gap-3 border-b border-[#e8eaed] bg-[#f2f6fc] px-4 py-3 text-sm\" aria-label=\"Inbox preview\">\n <span className=\"max-w-[30%] shrink-0 truncate font-semibold\">{name}</span>\n <span className=\"min-w-0 truncate\"><strong>{preview.subject ?? '(no subject)'}</strong>{snippet && <span className=\"text-[#5f6368]\"> — {snippet}</span>}</span>\n </div>\n <div className=\"px-4 pt-5 sm:px-5\">\n <h4 className=\"break-words text-[22px] font-normal leading-7\">{preview.subject ?? (preview.reply ? 'Reply' : '(no subject)')}</h4>\n <div className=\"mb-4 mt-5 flex items-start gap-3\">\n <span aria-hidden className=\"flex size-9 shrink-0 items-center justify-center rounded-full bg-[#e8eaed] text-base text-[#5f6368]\">{name.charAt(0).toUpperCase()}</span>\n <dl className=\"min-w-0 space-y-1 text-[13px]\">\n <div className=\"break-words\"><dt className=\"sr-only\">From</dt><dd><strong>{name}</strong>{name !== address && <span className=\"text-[#5f6368]\"> <{address}></span>}</dd></div>\n <div className=\"break-words text-[#5f6368]\"><dt className=\"inline\">To </dt><dd className=\"inline\">{preview.to.join(', ') || 'Recipient unavailable'}</dd></div>\n {preview.cc.length > 0 && <div className=\"break-words text-[#5f6368]\"><dt className=\"inline\">Cc </dt><dd className=\"inline\">{preview.cc.join(', ')}</dd></div>}\n </dl>\n </div>\n </div>\n {preview.html\n ? currentHtml\n ? <iframe title=\"Email body\" sandbox=\"\" referrerPolicy=\"no-referrer\" srcDoc={currentHtml.document} className=\"h-[360px] w-full border-0 sm:h-[440px]\" />\n : <p role=\"status\" className=\"px-5 pb-5 text-sm\">Rendering email…</p>\n : <div className=\"whitespace-pre-wrap break-words px-4 pb-6 text-[14px] leading-[1.6] sm:px-5\">{linkedText(preview.body ?? '')}</div>}\n {preview.bcc.length > 0 && <p className=\"border-t border-[#e8eaed] px-4 py-2 text-[13px] text-[#5f6368]\">Bcc (sender only): {preview.bcc.join(', ')}</p>}\n </div>\n )\n}\n\nexport function linkedText(value: string) {\n return value.split(/(https?:\\/\\/[^\\s<>\"']+)/g).map((part, index) => /^https?:\\/\\//i.test(part)\n ? <a key={index} href={part} onClick={(event) => event.preventDefault()} title=\"Link shown for review\" className=\"text-[#1155cc] underline\">{part}</a>\n : part)\n}\n","import { useEffect, useId, useState } from 'react'\nimport { Button, Input, Label, Textarea } from '@tangle-network/ui/primitives'\nimport { presentHubAction, type HubApprovalFeedback, type HubApprovalItem } from '../hub-approvals'\n\nexport interface HubPreviewFeedbackProps {\n item: HubApprovalItem\n onFeedback: (item: HubApprovalItem, feedback: HubApprovalFeedback) => Promise<void>\n /** Owner-local drafts survive collapsing/switching previews, never another viewer. */\n drafts?: Map<string, FeedbackDraft>\n}\n\ninterface FeedbackDraft { score: string; comment: string; editing: boolean; edited: boolean; subject: string; body: string; payload: string; saved: boolean }\n\n/** Host callback saves the signal; this component has no execution transport. */\nexport function HubPreviewFeedback({ item, onFeedback, drafts }: HubPreviewFeedbackProps) {\n const id = useId()\n const saved = item.feedback\n const original = item.input && typeof item.input === 'object' && !Array.isArray(item.input) ? item.input as Record<string, unknown> : {}\n const prior = saved?.editedInput && typeof saved.editedInput === 'object' && !Array.isArray(saved.editedInput)\n ? saved.editedInput as Record<string, unknown> : original\n const kind = presentHubAction(item).preview.kind\n const field = kind === 'email'\n ? typeof original.html === 'string' ? 'html' : typeof original.body === 'string' ? 'body' : 'text'\n : typeof original.commentary === 'string' ? 'commentary' : 'text'\n const draft = drafts?.get(item.id)\n const [score, setScore] = useState(draft?.score ?? (saved ? String(saved.score) : ''))\n const [comment, setComment] = useState(draft?.comment ?? saved?.comment ?? '')\n const [editing, setEditing] = useState(draft?.editing ?? false)\n const [edited, setEdited] = useState(draft?.edited ?? saved?.editedInput !== undefined)\n const [subject, setSubject] = useState(draft?.subject ?? String(prior.subject ?? ''))\n const [body, setBody] = useState(draft?.body ?? String(prior[field] ?? ''))\n const [payload, setPayload] = useState(draft?.payload ?? JSON.stringify(prior, null, 2))\n const [busy, setBusy] = useState(false)\n const [status, setStatus] = useState((draft ? draft.saved : saved) ? 'Feedback saved' : '')\n const [error, setError] = useState('')\n\n useEffect(() => {\n drafts?.set(item.id, { score, comment, editing, edited, subject, body, payload, saved: status === 'Feedback saved' })\n }, [drafts, item.id, score, comment, editing, edited, subject, body, payload, status])\n\n async function save() {\n if (busy) return\n if (score.trim() === '' || !Number.isInteger(Number(score)) || Number(score) < 0 || Number(score) > 100) {\n setError('Enter a score from 0 to 100.'); return\n }\n setBusy(true); setError(''); setStatus('')\n try {\n const editedInput: unknown = edited\n ? kind === 'email' ? { ...original, subject, [field]: body }\n : kind === 'post' ? { ...original, [field]: body } : JSON.parse(payload)\n : saved?.editedInput\n await onFeedback(item, { score: Number(score), comment,\n ...(editedInput !== undefined && JSON.stringify(editedInput) !== JSON.stringify(item.input) ? { editedInput } : {}) })\n setStatus('Feedback saved')\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : 'Feedback could not be saved. Your edits are kept here.')\n } finally { setBusy(false) }\n }\n\n return (\n <form aria-label=\"Preview feedback\" className=\"space-y-3 border-t border-border pt-3\" onSubmit={(event) => { event.preventDefault(); void save() }}>\n <div className=\"flex flex-wrap items-end gap-3\">\n <div className=\"w-36 space-y-1\">\n <Label htmlFor={`${id}-score`}>Score (0–100)</Label>\n <Input id={`${id}-score`} type=\"number\" inputMode=\"numeric\" min={0} max={100} step={1} required value={score}\n placeholder=\"Unscored\" disabled={busy} onChange={(event) => { setScore(event.target.value); setStatus('') }} />\n </div>\n <Button type=\"button\" variant=\"outline\" aria-expanded={editing} disabled={busy} onClick={() => { setEditing((value) => !value); setStatus('') }}>Edit to teach</Button>\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor={`${id}-comment`}>Comment</Label>\n <Textarea id={`${id}-comment`} value={comment} rows={2} disabled={busy} onChange={(event) => { setComment(event.target.value); setStatus('') }} />\n </div>\n {editing && <div className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">Your edit is saved as a teaching example. Live approval applies to the original held payload.</p>\n {kind === 'email' && <div className=\"space-y-1\"><Label htmlFor={`${id}-subject`}>Subject</Label><Input id={`${id}-subject`} value={subject} disabled={busy} onChange={(event) => { setSubject(event.target.value); setEdited(true); setStatus('') }} /></div>}\n {kind === 'email' || kind === 'post'\n ? <div className=\"space-y-1\"><Label htmlFor={`${id}-body`}>{kind === 'email' ? 'Body' : 'Post text'}</Label><Textarea id={`${id}-body`} value={body} rows={6} disabled={busy} onChange={(event) => { setBody(event.target.value); setEdited(true); setStatus('') }} /></div>\n : <div className=\"space-y-1\"><Label htmlFor={`${id}-payload`}>Payload</Label><Textarea id={`${id}-payload`} value={payload} rows={6} disabled={busy} onChange={(event) => { setPayload(event.target.value); setEdited(true); setStatus('') }} /></div>}\n </div>}\n {error && <p role=\"alert\" className=\"text-sm text-[var(--surface-danger-text)]\">{error}</p>}\n <div className=\"flex flex-wrap items-center gap-3\"><Button type=\"submit\" variant=\"outline\" disabled={busy}>{busy ? 'Saving feedback…' : 'Save feedback'}</Button><p role=\"status\" className=\"text-sm text-muted-foreground\">{status}</p></div>\n </form>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { ChevronRight, ShieldCheck } from 'lucide-react'\nimport { Button } from '@tangle-network/ui/primitives'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalItem, type HubApprovalPhase } from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { closesIn, distinctAccount, HubApprovalPhasePill, HubProviderMark, openPhaseLabel, relativeTime } from './parts'\n\nconst GROUPS: ReadonlyArray<{ id: string; label: string; phases: readonly HubApprovalPhase[] }> = [\n { id: 'waiting', label: 'Waiting', phases: ['waiting', 'blocked'] },\n { id: 'running', label: 'Running', phases: ['queued', 'running'] },\n // Uncertain effects need provider verification, separate from confirmed failures.\n { id: 'unknown', label: 'May have run', phases: ['unknown'] },\n { id: 'failed', label: 'Failed', phases: ['failed'] },\n { id: 'done', label: 'Done', phases: ['done'] },\n { id: 'closed', label: 'Denied or expired', phases: ['denied', 'expired'] },\n]\n\nexport interface HubApprovalsListProps {\n items: readonly HubApprovalItem[]\n /** Show one call: scroll to it in the conversation and open its detail. */\n onSelect?: (item: HubApprovalItem) => void\n selectedId?: string | null\n className?: string\n}\n\n/**\n * Every held call in the conversation, grouped by where it stands — waiting,\n * running, failed, done, then denied or expired — and updated as the host's\n * items change. Picking one hands it to `onSelect`.\n */\nexport function HubApprovalsList({ items, onSelect, selectedId, className = '' }: HubApprovalsListProps) {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 30_000)\n return () => clearInterval(timer)\n }, [])\n const waiting = items.filter((item) => item.phase === 'waiting' || item.phase === 'blocked').length\n const groups = GROUPS\n .map((group) => ({ ...group, items: items.filter((item) => group.phases.includes(item.phase)).slice().reverse() }))\n .filter((group) => group.items.length > 0)\n\n return (\n <div className={`flex h-full min-h-0 flex-col ${className}`}>\n <div className=\"shrink-0 border-b border-border px-4 py-3\">\n <h2 className=\"text-base font-semibold text-foreground\">Approvals</h2>\n <p className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {waiting === 0 ? 'Nothing is waiting for you' : waiting === 1 ? '1 request is waiting' : `${waiting} requests are waiting`}\n </p>\n </div>\n {groups.length === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-2 px-6 py-10 text-center\">\n <span className=\"flex size-10 items-center justify-center rounded-xl bg-muted\"><ShieldCheck aria-hidden className=\"size-5 text-muted-foreground\" /></span>\n <p className=\"text-sm font-medium text-foreground\">No approvals in this conversation</p>\n <p className=\"text-sm text-muted-foreground\">Requests to act on your connected accounts appear here.</p>\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 space-y-5 overflow-y-auto px-2 py-3\">\n {groups.map((group) => (\n <section key={group.id} aria-label={group.label}>\n <h3 className=\"px-2 pb-1 text-sm font-medium text-muted-foreground\">\n {group.label} <span className=\"tabular-nums\">· {group.items.length}</span>\n </h3>\n <ul className=\"space-y-1\">\n {group.items.map((item) => {\n const presentation = presentHubAction(item)\n const title = item.phase === 'done' ? hubActionReceipt(item).title : presentation.title\n const when = item.phase === 'waiting' ? closesIn(item.expiresAt, now) ?? relativeTime(item.requestedAt, now) : relativeTime(item.requestedAt, now)\n const detail = [presentation.provider.name, distinctAccount(item.account, presentation.provider.name), when].filter(Boolean).join(' · ')\n const selected = selectedId === item.id\n return (\n <li key={item.id}>\n <Button\n variant=\"bare\"\n onClick={() => onSelect?.(item)}\n aria-current={selected ? 'true' : undefined}\n className={`flex w-full items-start gap-3 rounded-lg px-2 py-2.5 text-left transition-colors hover:bg-muted ${selected ? 'bg-muted' : ''}`}\n >\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={28} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium leading-5 text-foreground\">{title}</span>\n <span className=\"mt-0.5 block truncate text-sm text-muted-foreground\">{detail}</span>\n {item.phase === 'unknown' && <span className=\"mt-1 block text-sm text-[var(--surface-warning-text)]\">{HUB_APPROVAL_UNKNOWN_WARNING}</span>}\n {(item.phase === 'waiting' || item.phase === 'blocked') && item.wait && <span className=\"mt-1 line-clamp-2 block text-sm text-muted-foreground\">{item.wait.reason}</span>}\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item, 'Owner')} />\n <ChevronRight aria-hidden className=\"size-4 text-muted-foreground\" />\n </span>\n </Button>\n </li>\n )\n })}\n </ul>\n </section>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { Button } from '@tangle-network/ui/primitives'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalFeedback, type HubApprovalItem } from '../hub-approvals'\nimport { HUB_APPROVAL_UNKNOWN_WARNING } from '../hub-approvals/unknown'\nimport { HubApprovalPhasePill, HubProviderMark, HubRawDetails, openPhaseLabel } from './parts'\nimport { HubActionPreviewView } from './preview'\nimport { HubActionReceiptCard } from './receipt'\nimport { HubPreviewFeedback, type HubPreviewFeedbackProps } from './feedback'\n\nexport interface HubApprovalRowProps {\n item: HubApprovalItem\n /** Open the detail, e.g. when the call was picked in the Approvals list. */\n expanded?: boolean\n onExpandedChange?: (expanded: boolean) => void\n /** Bring a waiting call to the front of the dock. */\n onReview?: (item: HubApprovalItem) => void\n /** Extra controls for settled calls; suppressed for unknown outcomes to prevent unsafe retries. */\n actions?: ReactNode\n onFeedback?: (item: HubApprovalItem, feedback: HubApprovalFeedback) => Promise<void>\n}\n\n/**\n * A held call where the agent made it: one line with the integration, what\n * the call does and where it stands, opening to its preview, result and the\n * exact call. The decision itself lives in the dock, so the transcript stays\n * readable while a request waits.\n */\nexport function HubApprovalRow({ item, expanded: controlled, onExpandedChange, onReview, actions, onFeedback }: HubApprovalRowProps) {\n const [own, setOwn] = useState(false)\n const expanded = controlled ?? own\n const ref = useRef<HTMLDivElement>(null)\n const feedbackDrafts = useRef<NonNullable<HubPreviewFeedbackProps['drafts']>>(new Map())\n const [feedbackSaving, setFeedbackSaving] = useState(false)\n const presentation = presentHubAction(item)\n const title = item.phase === 'done' ? hubActionReceipt(item).title : presentation.title\n\n useEffect(() => {\n if (controlled) ref.current?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n }, [controlled])\n\n const toggle = () => {\n setOwn(!expanded)\n onExpandedChange?.(!expanded)\n }\n\n return (\n <div ref={ref} data-hub-approval-row={item.id} className={`rounded-xl border bg-card ${expanded ? 'border-border shadow-sm' : 'border-border/80'}`}>\n <div className=\"flex items-center gap-3 px-3 py-2\">\n <Button\n variant=\"bare\"\n aria-expanded={expanded}\n disabled={feedbackSaving}\n onClick={toggle}\n className=\"flex min-h-9 min-w-0 flex-1 items-center gap-3 rounded-md text-left\"\n >\n <HubProviderMark providerId={presentation.provider.id} name={presentation.provider.name} size={24} />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{title}</span>\n <HubApprovalPhasePill phase={item.phase} label={openPhaseLabel(item)} />\n <ChevronDown aria-hidden className={`size-4 shrink-0 text-muted-foreground transition-transform ${expanded ? 'rotate-180' : ''}`} />\n </Button>\n {item.phase === 'waiting' && onReview && (\n // On a phone the dock sits just below; the row keeps its width for the title.\n <Button variant=\"outline\" className=\"hidden sm:inline-flex\" onClick={() => onReview(item)}>Review</Button>\n )}\n </div>\n {!expanded && item.phase === 'unknown' && (\n <p className=\"px-3 pb-3 text-sm text-[var(--surface-warning-text)]\">{HUB_APPROVAL_UNKNOWN_WARNING}</p>\n )}\n {expanded && (\n <div className=\"space-y-3 border-t border-border px-3 pb-3 pt-3\">\n {item.phase === 'done' || item.phase === 'failed' || item.phase === 'unknown'\n ? <HubActionReceiptCard item={item} className=\"border-0 px-0 py-0 shadow-none\" />\n : (\n <>\n <HubActionPreviewView preview={presentation.preview} account={item.account} />\n <HubRawDetails sections={[{ label: 'Call', value: { action: item.actionPath, input: item.input } }]} />\n </>\n )}\n {item.phase !== 'unknown' && actions}\n {onFeedback && <HubPreviewFeedback key={item.id} item={item} drafts={feedbackDrafts.current} onFeedback={async (source, feedback) => {\n setFeedbackSaving(true)\n try { await onFeedback(source, feedback) } finally { setFeedbackSaving(false) }\n }} />}\n </div>\n )}\n {!expanded && actions && (item.phase === 'expired' || item.phase === 'failed') && (\n <div className=\"border-t border-border px-3 py-2\">{actions}</div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { ExternalLink } from 'lucide-react'\nimport { ApprovalDiffSummary } from '@tangle-network/ui/run'\n\nimport { hubActionReceipt, presentHubAction, type HubApprovalItem, type HubApprovalPhase } from '../hub-approvals'\nimport { distinctAccount, HubApprovalPhasePill, HubFieldList, HubProviderMark, HubRawDetails } from './parts'\n\nfunction AudioPlayer({ src }: { src: string }) {\n const [failed, setFailed] = useState(false)\n if (failed) return <p className=\"text-sm text-muted-foreground\">The audio link has expired. Ask the agent for a new one.</p>\n // The memo is generated speech with its text shown beside it, so it carries no caption track.\n // eslint-disable-next-line jsx-a11y/media-has-caption\n return <audio controls preload=\"metadata\" src={src} onError={() => setFailed(true)} className=\"h-10 w-full\" />\n}\n\nexport interface HubActionReceiptCardProps {\n item: HubApprovalItem\n className?: string\n}\n\n/**\n * What one decided Hub action did: the integration's logo, the result in plain\n * words with its link, the key fields, a player or file changes when the\n * result has them, and the exact call and result behind Details.\n */\nexport function HubActionReceiptCard({ item, className = '' }: HubActionReceiptCardProps) {\n const receipt = hubActionReceipt(item)\n const presentation = presentHubAction(item)\n const account = distinctAccount(item.account, receipt.provider.name)\n const subtitle = [receipt.provider.name, account ? `as ${account}` : null, presentation.target && !receipt.title.includes(presentation.target) ? presentation.target : null]\n .filter(Boolean).join(' · ')\n const phase: HubApprovalPhase = item.phase\n return (\n <article aria-label={receipt.title} className={`rounded-xl border border-border bg-card px-4 py-3 shadow-sm ${className}`}>\n <div className=\"flex items-start gap-3\">\n <HubProviderMark providerId={receipt.provider.id} name={receipt.provider.name} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-base font-semibold leading-6 text-foreground\">\n {receipt.href\n ? (\n <a href={receipt.href} target=\"_blank\" rel=\"noreferrer\" className=\"inline-flex max-w-full items-center gap-1.5 hover:underline\">\n <span className=\"truncate\">{receipt.title}</span>\n <ExternalLink aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n </a>\n )\n : <span className=\"break-words\">{receipt.title}</span>}\n </p>\n {subtitle && <p className=\"truncate text-sm text-muted-foreground\">{subtitle}</p>}\n </div>\n <HubApprovalPhasePill phase={phase} />\n </div>\n {(receipt.fields.length > 0 || receipt.media || receipt.files || receipt.error || receipt.warning) && (\n <div className=\"mt-3 space-y-3\">\n <HubFieldList fields={receipt.fields} />\n {receipt.media && <AudioPlayer src={receipt.media.src} />}\n {receipt.files && <ApprovalDiffSummary files={receipt.files} />}\n {receipt.warning && (\n <p className=\"break-words rounded-lg border border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] px-3 py-2 text-sm text-[var(--surface-warning-text)]\">\n {receipt.warning}\n </p>\n )}\n {receipt.error && (\n <p className=\"break-words rounded-lg border border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] px-3 py-2 text-sm text-[var(--surface-danger-text)]\">\n {receipt.error}\n </p>\n )}\n </div>\n )}\n {(item.grant || item.autoApproved) && (\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {item.autoApproved ?? `Allowed ${item.grant?.expiresAt ? 'for 24 hours' : 'from now on'}: ${item.grant?.scope}`}\n </p>\n )}\n <div className=\"mt-2\">\n <HubRawDetails sections={[\n { label: 'Call', value: { action: item.actionPath, input: item.input } },\n { label: 'Result', value: item.result },\n ]} />\n </div>\n </article>\n )\n}\n\nexport interface HubApprovalReceiptsProps {\n items: readonly HubApprovalItem[]\n /** The message the agent received, shown behind Details so nothing it read is hidden. */\n message?: string\n /** When the decisions were sent. */\n at?: string | Date | null\n}\n\n/**\n * The receipts that stand in for the message resuming the agent after a\n * decision. The agent gets that message unchanged; the transcript shows what\n * happened instead of the machine prompt.\n */\nexport function HubApprovalReceipts({ items, message, at }: HubApprovalReceiptsProps) {\n const decided = items.filter((item) => item.phase !== 'waiting' && item.phase !== 'blocked')\n const count = (phases: readonly HubApprovalPhase[]) => decided.filter((item) => phases.includes(item.phase)).length\n const actions = (n: number) => (n === 1 ? '1 action' : `${n} actions`)\n const approved = count(['queued', 'running', 'done', 'failed', 'unknown'])\n const denied = count(['denied'])\n const expired = count(['expired'])\n const verbs = [approved ? `approved ${actions(approved)}` : null, denied ? `denied ${actions(denied)}` : null].filter(Boolean)\n const summary = verbs.length\n ? `You ${verbs.join(' and ')}${expired ? `; ${actions(expired)} expired` : ''}`\n : expired ? `${actions(expired)} expired` : 'Your decisions'\n const when = at ? new Date(at) : null\n return (\n <section aria-label=\"Approval results\" className=\"space-y-2\">\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>{summary}</span>\n {when && !Number.isNaN(when.getTime()) && (\n <time dateTime={when.toISOString()}>· {when.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' })}</time>\n )}\n </p>\n {decided.map((item) => <HubActionReceiptCard key={item.id} item={item} />)}\n {message && <HubRawDetails label=\"Message sent to the agent\" sections={[{ label: 'The agent received', value: message }]} />}\n </section>\n )\n}\n"],"mappings":"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","names":["useEffect","useState","Button","Label","useState","jsx","jsxs","jsx","jsxs","useEffect","useState","Button","jsx","jsxs","useState","useEffect","Button","jsx","jsxs","useState","useEffect","Button","Label","useEffect","useState","ChevronRight","Button","jsx","jsxs","useState","useEffect","Button","ChevronRight","useEffect","useRef","useState","ChevronDown","Button","useState","ExternalLink","ApprovalDiffSummary","jsx","jsxs","useState","ExternalLink","ApprovalDiffSummary","Fragment","jsx","jsxs","useState","useRef","useEffect","Button","ChevronDown"]}
|
|
@@ -12,7 +12,7 @@ export declare function HubApprovalWaitNote({ wait, className }: {
|
|
|
12
12
|
wait: HubApprovalWait;
|
|
13
13
|
className?: string;
|
|
14
14
|
}): import("react").JSX.Element;
|
|
15
|
-
/**
|
|
15
|
+
/** A local provider mark: reviewing a held payload must not fetch a remote logo. */
|
|
16
16
|
export declare function HubProviderMark({ providerId, name, size }: {
|
|
17
17
|
providerId: string;
|
|
18
18
|
name: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
import { type HubApprovalItem } from '../hub-approvals';
|
|
2
|
+
import { type HubApprovalFeedback, type HubApprovalItem } from '../hub-approvals';
|
|
3
3
|
export interface HubApprovalRowProps {
|
|
4
4
|
item: HubApprovalItem;
|
|
5
5
|
/** Open the detail, e.g. when the call was picked in the Approvals list. */
|
|
@@ -9,6 +9,7 @@ export interface HubApprovalRowProps {
|
|
|
9
9
|
onReview?: (item: HubApprovalItem) => void;
|
|
10
10
|
/** Extra controls for settled calls; suppressed for unknown outcomes to prevent unsafe retries. */
|
|
11
11
|
actions?: ReactNode;
|
|
12
|
+
onFeedback?: (item: HubApprovalItem, feedback: HubApprovalFeedback) => Promise<void>;
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* A held call where the agent made it: one line with the integration, what
|
|
@@ -16,4 +17,4 @@ export interface HubApprovalRowProps {
|
|
|
16
17
|
* exact call. The decision itself lives in the dock, so the transcript stays
|
|
17
18
|
* readable while a request waits.
|
|
18
19
|
*/
|
|
19
|
-
export declare function HubApprovalRow({ item, expanded: controlled, onExpandedChange, onReview, actions }: HubApprovalRowProps): import("react").JSX.Element;
|
|
20
|
+
export declare function HubApprovalRow({ item, expanded: controlled, onExpandedChange, onReview, actions, onFeedback }: HubApprovalRowProps): import("react").JSX.Element;
|
package/package.json
CHANGED