agent-relay-server 0.111.0 → 0.113.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/openapi.json +1 -1
- package/package.json +3 -3
- package/public/assets/{MessageBubble-WYqSyKPM.js → MessageBubble-CFujR6_L.js} +3 -3
- package/public/assets/{MessageBubble-WYqSyKPM.js.map → MessageBubble-CFujR6_L.js.map} +1 -1
- package/public/assets/{PlanGraphPanel-Dvu17jGe.js → PlanGraphPanel-BfxvqmNS.js} +2 -2
- package/public/assets/{PlanGraphPanel-Dvu17jGe.js.map → PlanGraphPanel-BfxvqmNS.js.map} +1 -1
- package/public/assets/{activity-wAN_upn7.js → activity-C7-gIF9O.js} +2 -2
- package/public/assets/{activity-wAN_upn7.js.map → activity-C7-gIF9O.js.map} +1 -1
- package/public/assets/{agent-profiles-D8WLdTCs.js → agent-profiles-BGPa2-BZ.js} +2 -2
- package/public/assets/{agent-profiles-D8WLdTCs.js.map → agent-profiles-BGPa2-BZ.js.map} +1 -1
- package/public/assets/{agents-C5FajNPw.js → agents-CWCbBuq6.js} +2 -2
- package/public/assets/{agents-C5FajNPw.js.map → agents-CWCbBuq6.js.map} +1 -1
- package/public/assets/{analytics-Q6Dl_CE9.js → analytics-BhGpT0JR.js} +2 -2
- package/public/assets/{analytics-Q6Dl_CE9.js.map → analytics-BhGpT0JR.js.map} +1 -1
- package/public/assets/automation-DnpahVqs.js +2 -0
- package/public/assets/automation-DnpahVqs.js.map +1 -0
- package/public/assets/{branch-state-badge-BRjUWyMT.js → branch-state-badge-CcAq2Igv.js} +2 -2
- package/public/assets/{branch-state-badge-BRjUWyMT.js.map → branch-state-badge-CcAq2Igv.js.map} +1 -1
- package/public/assets/{channels-DOYB1iiA.js → channels-DBP3-Gg0.js} +2 -2
- package/public/assets/{channels-DOYB1iiA.js.map → channels-DBP3-Gg0.js.map} +1 -1
- package/public/assets/{chat-aRCk0pLJ.js → chat-Bue-qNx_.js} +2 -2
- package/public/assets/{chat-aRCk0pLJ.js.map → chat-Bue-qNx_.js.map} +1 -1
- package/public/assets/{connectors-C5CeK-2M.js → connectors-BJxbuxoU.js} +2 -2
- package/public/assets/{connectors-C5CeK-2M.js.map → connectors-BJxbuxoU.js.map} +1 -1
- package/public/assets/{formatted-body-impl-DZc7C4-2.js → formatted-body-impl-CTz6wch8.js} +2 -2
- package/public/assets/formatted-body-impl-CTz6wch8.js.map +1 -0
- package/public/assets/{index-DXEYz_JV.js → index-BMAblAKQ.js} +7 -7
- package/public/assets/index-BMAblAKQ.js.map +1 -0
- package/public/assets/{insights-FzTX2wNh.js → insights-CZ_JrJ8M.js} +2 -2
- package/public/assets/{insights-FzTX2wNh.js.map → insights-CZ_JrJ8M.js.map} +1 -1
- package/public/assets/{integrations-CztQfrI7.js → integrations-L75xhZd5.js} +2 -2
- package/public/assets/{integrations-CztQfrI7.js.map → integrations-L75xhZd5.js.map} +1 -1
- package/public/assets/{maintenance-C8Uw8XiI.js → maintenance-Dpb87NaB.js} +2 -2
- package/public/assets/{maintenance-C8Uw8XiI.js.map → maintenance-Dpb87NaB.js.map} +1 -1
- package/public/assets/{managed-agents-DVbJ2hqh.js → managed-agents-DyGbrKwJ.js} +2 -2
- package/public/assets/{managed-agents-DVbJ2hqh.js.map → managed-agents-DyGbrKwJ.js.map} +1 -1
- package/public/assets/{markdown-preview-impl-C5D-B-9S.js → markdown-preview-impl-Bx4AcI8G.js} +2 -2
- package/public/assets/{markdown-preview-impl-C5D-B-9S.js.map → markdown-preview-impl-Bx4AcI8G.js.map} +1 -1
- package/public/assets/{memory-Bp-D_V80.js → memory-2l6G_m1p.js} +2 -2
- package/public/assets/{memory-Bp-D_V80.js.map → memory-2l6G_m1p.js.map} +1 -1
- package/public/assets/{messages-DE1QSeHI.js → messages-DC-QXNwz.js} +2 -2
- package/public/assets/messages-DC-QXNwz.js.map +1 -0
- package/public/assets/{orchestrators-B0u2lQfw.js → orchestrators-D_X3a0dm.js} +2 -2
- package/public/assets/{orchestrators-B0u2lQfw.js.map → orchestrators-D_X3a0dm.js.map} +1 -1
- package/public/assets/{overview-DpaEvvLT.js → overview-76JPEbGZ.js} +2 -2
- package/public/assets/{overview-DpaEvvLT.js.map → overview-76JPEbGZ.js.map} +1 -1
- package/public/assets/{pairs-DRp_qAu8.js → pairs-IeLXl-Z8.js} +2 -2
- package/public/assets/{pairs-DRp_qAu8.js.map → pairs-IeLXl-Z8.js.map} +1 -1
- package/public/assets/{projects-cOeuiMjl.js → projects-D8ClXDUg.js} +2 -2
- package/public/assets/{projects-cOeuiMjl.js.map → projects-D8ClXDUg.js.map} +1 -1
- package/public/assets/{prompt-settings-CNoBiymk.js → prompt-settings-BRduaHOj.js} +2 -2
- package/public/assets/{prompt-settings-CNoBiymk.js.map → prompt-settings-BRduaHOj.js.map} +1 -1
- package/public/assets/{registry-0A4QFMWC.js → registry-CXyaPToV.js} +2 -2
- package/public/assets/{registry-0A4QFMWC.js.map → registry-CXyaPToV.js.map} +1 -1
- package/public/assets/{security-C9P6yiQ3.js → security-8n8VEsf5.js} +2 -2
- package/public/assets/{security-C9P6yiQ3.js.map → security-8n8VEsf5.js.map} +1 -1
- package/public/assets/{select-B1PVUj6D.js → select-D-wcg_2U.js} +2 -2
- package/public/assets/{select-B1PVUj6D.js.map → select-D-wcg_2U.js.map} +1 -1
- package/public/assets/{settings-TnHlB9-t.js → settings-BhnCGXgo.js} +2 -2
- package/public/assets/{settings-TnHlB9-t.js.map → settings-BhnCGXgo.js.map} +1 -1
- package/public/assets/{store-DDWg67Pg.js → store-Du8k5mLJ.js} +3 -3
- package/public/assets/{store-DDWg67Pg.js.map → store-Du8k5mLJ.js.map} +1 -1
- package/public/assets/{tasks-1oK_ggFC.js → tasks-DEKQqgPB.js} +2 -2
- package/public/assets/tasks-DEKQqgPB.js.map +1 -0
- package/public/assets/{teams-BBb0ZYiF.js → teams-DoRSWZRQ.js} +2 -2
- package/public/assets/{teams-BBb0ZYiF.js.map → teams-DoRSWZRQ.js.map} +1 -1
- package/public/assets/{terminal-viewer-impl-DzvaRjkp.js → terminal-viewer-impl-C_o3BOpu.js} +2 -2
- package/public/assets/{terminal-viewer-impl-DzvaRjkp.js.map → terminal-viewer-impl-C_o3BOpu.js.map} +1 -1
- package/public/assets/types-DSwhOFcJ.js.map +1 -1
- package/public/assets/{user-avatar-X1pfizLv.js → user-avatar-BQoM4jPT.js} +2 -2
- package/public/assets/{user-avatar-X1pfizLv.js.map → user-avatar-BQoM4jPT.js.map} +1 -1
- package/public/assets/work-queue-CWnf1_iE.js +2 -0
- package/public/assets/work-queue-CWnf1_iE.js.map +1 -0
- package/public/assets/{workspaces-BNLP4IlV.js → workspaces-C_fFCoCu.js} +2 -2
- package/public/assets/{workspaces-BNLP4IlV.js.map → workspaces-C_fFCoCu.js.map} +1 -1
- package/public/index.html +2 -2
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/plugins/claude/skills/task/SKILL.md +28 -0
- package/runner/plugins/codex/skills/task/SKILL.md +28 -0
- package/src/agent-lifecycle-events.ts +13 -7
- package/src/db/mappers.ts +2 -0
- package/src/db/migrations.ts +4 -1
- package/src/db/provisioning-registry.ts +148 -2
- package/src/db/schema.ts +2 -0
- package/src/db/task-entity.ts +37 -12
- package/src/db/task-memory.ts +1 -1
- package/src/mcp/tools-spawn.ts +3 -0
- package/src/mcp-dispatch-tools.ts +2 -2
- package/src/mcp-task-tools.ts +11 -4
- package/src/prompt-resolver.ts +7 -7
- package/src/routes/agents-spawn.ts +8 -1
- package/src/routes/tasks.ts +6 -2
- package/src/services/plan-graph.ts +1 -1
- package/src/services/spawn-agent.ts +82 -35
- package/src/services/spawn-registration-watchdog.ts +57 -21
- package/src/services/task-context-hydration.ts +1 -1
- package/src/services/task-done-when.ts +21 -0
- package/src/services/task-entity.ts +10 -1
- package/src/services/task-issue-weave.ts +2 -2
- package/src/services/task-lifecycle.ts +11 -41
- package/src/services/task-semantic-events.ts +4 -4
- package/src/token-db.ts +1 -1
- package/src/validation.ts +1 -1
- package/public/assets/automation-ShdXg0pX.js +0 -2
- package/public/assets/automation-ShdXg0pX.js.map +0 -1
- package/public/assets/formatted-body-impl-DZc7C4-2.js.map +0 -1
- package/public/assets/index-DXEYz_JV.js.map +0 -1
- package/public/assets/messages-DE1QSeHI.js.map +0 -1
- package/public/assets/tasks-1oK_ggFC.js.map +0 -1
- package/public/assets/work-queue-DQMbkSD8.js +0 -2
- package/public/assets/work-queue-DQMbkSD8.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"automation-ShdXg0pX.js","names":[],"sources":["../../dashboard/src/components/views/automation.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { useRelayStore, useNow } from '@/store'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { Switch } from '@/components/ui/switch'\nimport { Textarea } from '@/components/ui/textarea'\nimport { fmtTime, timeAgo } from '@/lib/display'\nimport { LogViewer } from '@/components/shared/log-viewer'\nimport { availableModelsFor, defaultModelFor } from '@/store/helpers'\nimport { CalendarClock, FileText, Pencil, Play, Plus, RotateCw, Save, Trash2 } from 'lucide-react'\nimport { getKnownProviderIds } from '@/lib/provider-display'\nimport { firstAvailableProvider } from '@/store/helpers'\nimport type {\n Agent,\n Automation,\n AutomationConcurrencyPolicy,\n AutomationRun,\n AutomationTargetPolicy,\n CreateAutomationInput,\n Orchestrator,\n SpawnApprovalMode,\n SpawnEffort,\n SpawnProvider,\n TaskSeverity,\n WorkspaceMode,\n} from '@/types'\n\nconst RUN_STATUS_COLORS: Record<string, string> = {\n scheduled: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n dispatching: 'bg-sky-500/10 text-sky-400 border-sky-500/20',\n waiting_agent: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20',\n running: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n succeeded: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n failed: 'bg-red-500/10 text-red-400 border-red-500/20',\n canceled: 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20',\n timed_out: 'bg-red-500/10 text-red-400 border-red-500/20',\n}\n\nconst ACTIVE_RUN_STATUSES = new Set(['scheduled', 'dispatching', 'waiting_agent', 'running'])\n\nfunction runStatusLabel(run: AutomationRun): string {\n return run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true ? 'budget elapsed' : run.status\n}\n\nfunction runStatusClass(run: AutomationRun): string {\n if (run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true) return 'bg-zinc-500/10 text-zinc-400 border-zinc-500/20'\n return RUN_STATUS_COLORS[run.status] || ''\n}\n\nfunction runErrorText(run: AutomationRun): string | undefined {\n return run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true ? undefined : run.error\n}\n\nfunction isActiveRun(run: AutomationRun): boolean {\n return ACTIVE_RUN_STATUSES.has(run.status)\n}\n\nfunction num(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction duration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000))\n const hours = Math.floor(total / 3600)\n const minutes = Math.floor((total % 3600) / 60)\n const seconds = total % 60\n if (hours) return `${hours}h ${minutes}m`\n if (minutes) return `${minutes}m ${seconds}s`\n return `${seconds}s`\n}\n\nfunction runDeadline(run: AutomationRun): number | undefined {\n return num(run.meta?.runtimeBudgetDeadlineAt) ?? num(run.result?.deadlineAt)\n}\n\nfunction elapsedText(run: AutomationRun, now: number): string {\n if (!run.startedAt) return '-'\n const end = run.finishedAt || (isActiveRun(run) ? now : run.updatedAt)\n return duration(Number(end) - Number(run.startedAt))\n}\n\nfunction remainingText(run: AutomationRun, now: number): string | undefined {\n const deadline = runDeadline(run)\n if (!deadline || !isActiveRun(run)) return undefined\n return duration(deadline - now)\n}\n\nfunction shutdownText(run: AutomationRun): string | undefined {\n if (run.status === 'timed_out' && run.result?.runtimeBudgetElapsed === true) return 'runtime budget elapsed'\n return run.error\n}\n\nfunction runLogTarget(run: AutomationRun, agents: Agent[], orchestrators: Orchestrator[]): { orchestratorId: string; session: string } | undefined {\n const agentId = run.targetAgentId || run.spawnedAgentId || str(run.meta?.runtimeAgentId)\n const agent = agentId ? agents.find((candidate) => candidate.id === agentId) : undefined\n const managed = agentId\n ? orchestrators.flatMap((orchestrator) => orchestrator.managedAgents.map((managedAgent) => ({ orchestrator, managedAgent })))\n .find(({ managedAgent }) => managedAgent.agentId === agentId)\n : undefined\n const session = str(run.meta?.terminalSession)\n || str(run.meta?.tmuxSession)\n || str(run.meta?.sessionName)\n || str(agent?.meta?.terminalSession)\n || str(agent?.meta?.tmuxSession)\n || str(agent?.meta?.sessionName)\n || managed?.managedAgent.terminalSession\n || managed?.managedAgent.tmuxSession\n || managed?.managedAgent.sessionName\n const orchestratorId = str(run.meta?.orchestratorId) || managed?.orchestrator.id || run.orchestratorId\n return session ? { orchestratorId, session } : undefined\n}\n\ntype TargetMode = 'existing_agent' | 'on_demand_agent'\n\ninterface AutomationForm {\n id?: string\n name: string\n description: string\n enabled: boolean\n schedule: string\n timezone: string\n orchestratorId: string\n targetMode: TargetMode\n provider: SpawnProvider\n model: string\n effort: string\n profile: string\n label: string\n tags: string\n capabilities: string\n ifNoMatch: 'fail' | 'spawn'\n cwd: string\n approvalMode: SpawnApprovalMode\n workspaceMode: WorkspaceMode\n keepAlive: boolean\n budgetMinutes: string\n warningMinutes: string\n warningMessage: string\n concurrencyPolicy: AutomationConcurrencyPolicy\n title: string\n body: string\n severity: TaskSeverity\n dedupeKey: string\n externalUrl: string\n}\n\nfunction blankForm(orchestratorId = '', orch?: Orchestrator): AutomationForm {\n const provider = firstAvailableProvider(orch)\n return {\n name: '',\n description: '',\n enabled: true,\n schedule: '0 8 * * *',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC',\n orchestratorId,\n targetMode: 'existing_agent',\n provider,\n model: defaultModelFor(provider),\n effort: '',\n profile: 'default-relay',\n label: '',\n tags: '',\n capabilities: '',\n ifNoMatch: 'fail',\n cwd: '',\n approvalMode: 'guarded',\n workspaceMode: 'inherit',\n keepAlive: false,\n budgetMinutes: '',\n warningMinutes: '',\n warningMessage: '',\n concurrencyPolicy: 'skip',\n title: '',\n body: '',\n severity: 'info',\n dedupeKey: '',\n externalUrl: '',\n }\n}\n\nfunction splitCsv(value: string): string[] | undefined {\n const items = value.split(',').map((item) => item.trim()).filter(Boolean)\n return items.length ? items : undefined\n}\n\nfunction automationToForm(automation: Automation): AutomationForm {\n const policy = automation.targetPolicy\n return {\n ...blankForm(automation.orchestratorId),\n id: automation.id,\n name: automation.name,\n description: automation.description || '',\n enabled: automation.enabled,\n schedule: automation.schedule,\n timezone: automation.timezone,\n orchestratorId: automation.orchestratorId,\n targetMode: policy.mode,\n provider: policy.mode === 'on_demand_agent' ? policy.provider : policy.selector.provider || getKnownProviderIds()[0] || '',\n model: policy.mode === 'on_demand_agent' ? policy.model || defaultModelFor(policy.provider) : '',\n effort: policy.mode === 'on_demand_agent' ? policy.effort || '' : '',\n profile: policy.mode === 'on_demand_agent' ? policy.profile || 'default-relay' : 'default-relay',\n label: policy.mode === 'existing_agent' ? policy.selector.label || '' : '',\n tags: policy.mode === 'existing_agent' ? (policy.selector.tags || []).join(', ') : '',\n capabilities: policy.mode === 'existing_agent' ? (policy.selector.capabilities || []).join(', ') : '',\n ifNoMatch: policy.mode === 'existing_agent' ? policy.ifNoMatch || 'fail' : 'fail',\n cwd: policy.mode === 'on_demand_agent' ? policy.cwd || '' : '',\n approvalMode: policy.mode === 'on_demand_agent' ? policy.approvalMode || 'guarded' : 'guarded',\n workspaceMode: policy.mode === 'on_demand_agent' ? policy.workspaceMode || 'inherit' : 'inherit',\n keepAlive: policy.mode === 'on_demand_agent' ? Boolean(policy.keepAlive) : false,\n budgetMinutes: policy.mode === 'on_demand_agent' && policy.runtimeBudget ? String(Math.round(policy.runtimeBudget.maxRuntimeMs / 60_000)) : '',\n warningMinutes: policy.mode === 'on_demand_agent' && policy.runtimeBudget?.warnAtMs !== undefined ? String(Math.round(policy.runtimeBudget.warnAtMs / 60_000)) : '',\n warningMessage: policy.mode === 'on_demand_agent' ? policy.runtimeBudget?.warningMessage || '' : '',\n concurrencyPolicy: automation.concurrencyPolicy,\n title: automation.taskTemplate.title,\n body: automation.taskTemplate.body,\n severity: automation.taskTemplate.severity || 'info',\n dedupeKey: automation.taskTemplate.dedupeKey || '',\n externalUrl: automation.taskTemplate.externalUrl || '',\n }\n}\n\nfunction formToInput(form: AutomationForm): CreateAutomationInput {\n const budgetMinutes = Number(form.budgetMinutes)\n const warningMinutes = Number(form.warningMinutes)\n const runtimeBudget = form.targetMode === 'on_demand_agent' && form.budgetMinutes.trim() && Number.isFinite(budgetMinutes)\n ? {\n maxRuntimeMs: Math.round(budgetMinutes * 60_000),\n warnAtMs: form.warningMinutes.trim() && Number.isFinite(warningMinutes) ? Math.round(warningMinutes * 60_000) : undefined,\n warningMessage: form.warningMessage.trim() || undefined,\n }\n : undefined\n const targetPolicy: AutomationTargetPolicy = form.targetMode === 'existing_agent'\n ? {\n mode: 'existing_agent',\n selector: {\n provider: form.provider || undefined,\n label: form.label.trim() || undefined,\n tags: splitCsv(form.tags),\n capabilities: splitCsv(form.capabilities),\n },\n ifNoMatch: form.ifNoMatch,\n }\n : {\n mode: 'on_demand_agent',\n provider: form.provider,\n model: form.model || undefined,\n effort: form.effort ? form.effort as SpawnEffort : undefined,\n profile: form.profile || undefined,\n cwd: form.cwd.trim() || undefined,\n approvalMode: form.approvalMode,\n workspaceMode: form.workspaceMode,\n keepAlive: form.keepAlive,\n runtimeBudget,\n }\n\n return {\n kind: 'scheduled_task',\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n enabled: form.enabled,\n schedule: form.schedule.trim(),\n timezone: form.timezone.trim() || 'UTC',\n catchUpPolicy: 'skip',\n concurrencyPolicy: form.concurrencyPolicy,\n orchestratorId: form.orchestratorId,\n targetPolicy,\n taskTemplate: {\n title: form.title.trim(),\n body: form.body.trim(),\n severity: form.severity,\n dedupeKey: form.dedupeKey.trim() || undefined,\n externalUrl: form.externalUrl.trim() || undefined,\n },\n }\n}\n\nexport function AutomationView() {\n const now = useNow()\n const automations = useRelayStore((s) => s.automations)\n const automationRuns = useRelayStore((s) => s.automationRuns)\n const orchestrators = useRelayStore((s) => s.orchestrators)\n const agents = useRelayStore((s) => s.agents)\n const apiCall = useRelayStore((s) => s.apiCall)\n const showError = useRelayStore((s) => s.showError)\n const openConfirm = useRelayStore((s) => s.openConfirm)\n const fetchAutomations = useRelayStore((s) => s.fetchAutomations)\n const fetchAutomationRuns = useRelayStore((s) => s.fetchAutomationRuns)\n const fetchTasks = useRelayStore((s) => s.fetchTasks)\n const fetchProviderCatalog = useRelayStore((s) => s.fetchProviderCatalog)\n const agentProfiles = useRelayStore((s) => s.agentProfiles)\n const [selectedId, setSelectedId] = useState<string>('')\n const [form, setForm] = useState<AutomationForm>(() => blankForm(orchestrators[0]?.id || '', orchestrators[0]))\n const [saving, setSaving] = useState(false)\n const [logRunId, setLogRunId] = useState<string | null>(null)\n\n const selected = automations.find((automation) => automation.id === selectedId)\n const onlineOrchestrators = orchestrators.filter((orchestrator) => orchestrator.status === 'online')\n const activeRuns = automationRuns.filter(isActiveRun)\n\n useEffect(() => {\n void Promise.all([fetchAutomations(), fetchAutomationRuns(), fetchProviderCatalog()])\n }, [])\n\n useEffect(() => {\n if (!form.orchestratorId && orchestrators[0]) {\n setForm((current) => ({ ...current, orchestratorId: orchestrators[0]!.id }))\n }\n }, [orchestrators])\n\n const runsByAutomation = useMemo(() => {\n const grouped = new Map<string, AutomationRun[]>()\n for (const run of automationRuns) {\n const list = grouped.get(run.automationId) || []\n list.push(run)\n grouped.set(run.automationId, list)\n }\n return grouped\n }, [automationRuns])\n\n function newAutomation() {\n setSelectedId('')\n setForm(blankForm(orchestrators[0]?.id || '', orchestrators[0]))\n }\n\n function editAutomation(automation: Automation) {\n setSelectedId(automation.id)\n setForm(automationToForm(automation))\n }\n\n async function saveAutomation() {\n setSaving(true)\n try {\n const input = formToInput(form)\n if (form.id) await apiCall('PATCH', '/automations/' + encodeURIComponent(form.id), input)\n else {\n const created = await apiCall<Automation>('POST', '/automations', input)\n setSelectedId(created.id)\n setForm(automationToForm(created))\n }\n await Promise.all([fetchAutomations(), fetchAutomationRuns()])\n } catch (e) {\n showError('Save Failed', (e as Error).message)\n } finally {\n setSaving(false)\n }\n }\n\n async function patchAutomation(automation: Automation, partial: Partial<Automation>) {\n try {\n await apiCall('PATCH', '/automations/' + encodeURIComponent(automation.id), partial)\n await fetchAutomations()\n } catch (e) {\n showError('Update Failed', (e as Error).message)\n }\n }\n\n async function runNow(automation: Automation) {\n try {\n await apiCall('POST', '/automations/' + encodeURIComponent(automation.id) + '/run')\n await Promise.all([fetchAutomationRuns(), fetchTasks()])\n } catch (e) {\n showError('Run Failed', (e as Error).message)\n }\n }\n\n function deleteAutomation(automation: Automation) {\n openConfirm('Delete Automation', `Delete automation \"${automation.name}\"?`, async () => {\n try {\n await apiCall('DELETE', '/automations/' + encodeURIComponent(automation.id))\n if (selectedId === automation.id) newAutomation()\n await Promise.all([fetchAutomations(), fetchAutomationRuns()])\n } catch (e) {\n showError('Delete Failed', (e as Error).message)\n }\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <CalendarClock className=\"w-5 h-5 text-muted-foreground\" />\n <div>\n <h2 className=\"text-lg font-semibold\">Automation</h2>\n <p className=\"text-xs text-muted-foreground\">Scheduled tasks</p>\n </div>\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">{automations.length} schedules</Badge>\n <Badge variant=\"outline\" className=\"text-xs\">{activeRuns.length} running</Badge>\n <Button size=\"sm\" className=\"gap-1\" onClick={newAutomation}>\n <Plus className=\"w-3.5 h-3.5\" />\n New\n </Button>\n </div>\n </div>\n\n {activeRuns.length > 0 && (\n <ActiveRuns\n runs={activeRuns}\n automations={automations}\n agents={agents}\n orchestrators={orchestrators}\n now={now}\n logRunId={logRunId}\n onToggleLogs={(runId) => setLogRunId((current) => current === runId ? null : runId)}\n />\n )}\n\n <div className=\"grid gap-4 xl:grid-cols-[minmax(0,1fr)_420px]\">\n <div className=\"space-y-3\">\n {automations.length === 0 ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">No automations</div>\n ) : automations.map((automation) => (\n <AutomationCard\n key={automation.id}\n automation={automation}\n runs={runsByAutomation.get(automation.id) || []}\n now={now}\n selected={selectedId === automation.id}\n onEdit={() => editAutomation(automation)}\n onRun={() => runNow(automation)}\n onToggle={() => patchAutomation(automation, { enabled: !automation.enabled })}\n onDelete={() => deleteAutomation(automation)}\n />\n ))}\n </div>\n\n <AutomationEditor\n form={form}\n agentProfiles={agentProfiles}\n selected={selected}\n saving={saving}\n orchestrators={onlineOrchestrators.length ? onlineOrchestrators : orchestrators}\n onChange={(patch) => setForm((current) => ({ ...current, ...patch }))}\n onSave={saveAutomation}\n />\n </div>\n\n <RunHistory\n runs={automationRuns}\n automations={automations}\n agents={agents}\n orchestrators={orchestrators}\n now={now}\n logRunId={logRunId}\n onToggleLogs={(runId) => setLogRunId((current) => current === runId ? null : runId)}\n />\n </div>\n )\n}\n\nfunction ActiveRuns({\n runs,\n automations,\n agents,\n orchestrators,\n now,\n logRunId,\n onToggleLogs,\n}: {\n runs: AutomationRun[]\n automations: Automation[]\n agents: Agent[]\n orchestrators: Orchestrator[]\n now: number\n logRunId: string | null\n onToggleLogs: (runId: string) => void\n}) {\n const names = new Map(automations.map((automation) => [automation.id, automation.name]))\n return (\n <div className=\"rounded-lg border border-border bg-card/40\">\n <div className=\"border-b border-border px-3 py-2 text-sm font-medium\">Active runs</div>\n <div className=\"divide-y divide-border\">\n {runs.map((run) => {\n const logTarget = runLogTarget(run, agents, orchestrators)\n const remaining = remainingText(run, now)\n return (\n <div key={run.id} className=\"space-y-3 px-3 py-3\">\n <div className=\"grid gap-3 text-xs md:grid-cols-[minmax(12rem,1fr)_7rem_7rem_7rem_8rem_auto] md:items-center\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{names.get(run.automationId) || run.automationId.slice(0, 12)}</div>\n <div className=\"truncate font-mono text-muted-foreground\">{run.targetAgentId || run.spawnedAgentId || str(run.meta?.onDemandLabel) || '-'}</div>\n </div>\n <Badge variant=\"outline\" className={`border text-[10px] w-fit ${runStatusClass(run)}`}>{runStatusLabel(run)}</Badge>\n <div><span className=\"text-muted-foreground\">elapsed </span>{elapsedText(run, now)}</div>\n <div><span className=\"text-muted-foreground\">left </span>{remaining || '-'}</div>\n <div className=\"font-mono text-muted-foreground\">{run.taskId ? `task #${run.taskId}` : '-'}</div>\n {logTarget && (\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"h-7 gap-1 text-xs\" onClick={() => onToggleLogs(run.id)}>\n <FileText className=\"w-3 h-3\" />\n Logs\n </Button>\n )}\n </div>\n {logRunId === run.id && logTarget && <LogViewer orchestratorId={logTarget.orchestratorId} session={logTarget.session} />}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nfunction AutomationCard({\n automation,\n runs,\n now,\n selected,\n onEdit,\n onRun,\n onToggle,\n onDelete,\n}: {\n automation: Automation\n runs: AutomationRun[]\n now: number\n selected: boolean\n onEdit: () => void\n onRun: () => void\n onToggle: () => void\n onDelete: () => void\n}) {\n const latestRun = runs[0]\n const policy = automation.targetPolicy\n const target = policy.mode === 'existing_agent'\n ? [\n policy.selector.provider,\n policy.selector.label ? `label:${policy.selector.label}` : '',\n ...(policy.selector.tags || []).map((tag) => `tag:${tag}`),\n ...(policy.selector.capabilities || []).map((cap) => `cap:${cap}`),\n ].filter(Boolean).join(' ')\n : `${policy.provider} on demand`\n\n return (\n <Card className={`${selected ? 'ring-1 ring-primary/50' : ''} ${automation.enabled ? '' : 'opacity-60'}`}>\n <CardHeader className=\"px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <Switch checked={automation.enabled} onCheckedChange={onToggle} className=\"mt-0.5\" />\n <div className=\"min-w-0 flex-1\">\n <CardTitle className=\"text-sm truncate\">{automation.name}</CardTitle>\n <div className=\"mt-1 flex flex-wrap gap-1.5 text-xs text-muted-foreground\">\n <span className=\"font-mono\">{automation.schedule}</span>\n <span>{automation.timezone}</span>\n <span>{automation.orchestratorId}</span>\n <span className=\"truncate max-w-[28rem]\">{target}</span>\n </div>\n </div>\n <div className=\"flex gap-1\">\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Run now\" onClick={onRun}>\n <Play className=\"w-3.5 h-3.5\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7\" title=\"Edit\" onClick={onEdit}>\n <Pencil className=\"w-3.5 h-3.5\" />\n </Button>\n <Button size=\"icon\" variant=\"ghost\" className=\"h-7 w-7 text-red-400 hover:text-red-300\" title=\"Delete\" onClick={onDelete}>\n <Trash2 className=\"w-3.5 h-3.5\" />\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"px-4 pb-3 pt-0\">\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-muted-foreground\">\n <span title={automation.nextRunAt ? fmtTime(automation.nextRunAt) : undefined}>\n next {automation.nextRunAt ? timeAgo(now, automation.nextRunAt) : 'disabled'}\n </span>\n {latestRun && (\n <Badge variant=\"outline\" className={`border text-[10px] ${runStatusClass(latestRun)}`}>\n {runStatusLabel(latestRun)}\n </Badge>\n )}\n {latestRun?.taskId && <span>task #{latestRun.taskId}</span>}\n {latestRun && runErrorText(latestRun) && <span className=\"text-red-400 truncate\">{runErrorText(latestRun)}</span>}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nfunction AutomationEditor({\n form,\n selected,\n saving,\n orchestrators,\n agentProfiles,\n onChange,\n onSave,\n}: {\n form: AutomationForm\n selected?: Automation\n saving: boolean\n orchestrators: Array<{ id: string; hostname: string; providers: SpawnProvider[] }>\n agentProfiles: Array<{ name: string }>\n onChange: (patch: Partial<AutomationForm>) => void\n onSave: () => void\n}) {\n const providerCatalog = useRelayStore((s) => s.providerCatalog)\n const selectedOrchestrator = orchestrators.find((orch) => orch.id === form.orchestratorId)\n const providers = selectedOrchestrator?.providers || []\n const models = availableModelsFor(form.provider, providerCatalog)\n const selectedModel = models.find((model) => model.alias === form.model)\n const efforts = selectedModel?.efforts || []\n\n function selectOrchestrator(orchestratorId: string) {\n const orchestrator = orchestrators.find((orch) => orch.id === orchestratorId)\n const provider = orchestrator?.providers[0] || form.provider\n onChange({ orchestratorId, provider, model: defaultModelFor(provider, providerCatalog), effort: '' })\n }\n\n function selectProvider(provider: SpawnProvider) {\n onChange({ provider, model: defaultModelFor(provider, providerCatalog), effort: '' })\n }\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-4 space-y-4 h-fit xl:sticky xl:top-4\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">{selected ? 'Edit schedule' : 'New schedule'}</h3>\n <Badge variant={form.enabled ? 'default' : 'secondary'} className=\"ml-auto text-[10px]\">\n {form.enabled ? 'enabled' : 'disabled'}\n </Badge>\n </div>\n\n <div className=\"grid gap-3\">\n <Field label=\"Name\">\n <Input value={form.name} onChange={(e) => onChange({ name: e.target.value })} />\n </Field>\n <Field label=\"Description\">\n <Input value={form.description} onChange={(e) => onChange({ description: e.target.value })} />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Cron\">\n <Input value={form.schedule} onChange={(e) => onChange({ schedule: e.target.value })} className=\"font-mono\" />\n </Field>\n <Field label=\"Timezone\">\n <Input value={form.timezone} onChange={(e) => onChange({ timezone: e.target.value })} />\n </Field>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Orchestrator\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.orchestratorId} onChange={(e) => selectOrchestrator(e.target.value)}>\n <option value=\"\">Select</option>\n {orchestrators.map((orch) => <option key={orch.id} value={orch.id}>{orch.hostname} ({orch.id})</option>)}\n </select>\n </Field>\n <Field label=\"Concurrency\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.concurrencyPolicy} onChange={(e) => onChange({ concurrencyPolicy: e.target.value as AutomationConcurrencyPolicy })}>\n <option value=\"skip\">skip</option>\n <option value=\"replace\">replace</option>\n <option value=\"queue\">queue</option>\n </select>\n </Field>\n </div>\n <label className=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <span className=\"text-sm\">Enabled</span>\n <Switch checked={form.enabled} onCheckedChange={(enabled) => onChange({ enabled })} />\n </label>\n </div>\n\n <div className=\"space-y-3\">\n <Label>Target</Label>\n <div className=\"grid grid-cols-2 gap-2\">\n <Button type=\"button\" variant={form.targetMode === 'existing_agent' ? 'default' : 'outline'} onClick={() => onChange({ targetMode: 'existing_agent' })}>\n Existing\n </Button>\n <Button type=\"button\" variant={form.targetMode === 'on_demand_agent' ? 'default' : 'outline'} onClick={() => onChange({ targetMode: 'on_demand_agent' })}>\n On demand\n </Button>\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Provider\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.provider} onChange={(e) => selectProvider(e.target.value as SpawnProvider)} disabled={!providers.length}>\n {!providers.length && <option value={form.provider}>No providers available</option>}\n {providers.map((provider) => <option key={provider} value={provider}>{provider}</option>)}\n </select>\n </Field>\n {form.targetMode === 'existing_agent' ? (\n <Field label=\"If no match\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.ifNoMatch} onChange={(e) => onChange({ ifNoMatch: e.target.value as 'fail' | 'spawn' })}>\n <option value=\"fail\">fail</option>\n <option value=\"spawn\">spawn</option>\n </select>\n </Field>\n ) : (\n <Field label=\"Approval\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.approvalMode} onChange={(e) => onChange({ approvalMode: e.target.value as SpawnApprovalMode })}>\n <option value=\"guarded\">guarded</option>\n <option value=\"read-only\">read-only</option>\n <option value=\"open\">open</option>\n </select>\n </Field>\n )}\n </div>\n\n {form.targetMode === 'on_demand_agent' && (\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Model\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.model} onChange={(e) => onChange({ model: e.target.value, effort: '' })}>\n {models.map((model) => <option key={model.alias} value={model.alias}>{model.label}</option>)}\n </select>\n </Field>\n <Field label=\"Effort\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.effort} onChange={(e) => onChange({ effort: e.target.value })} disabled={!efforts.length}>\n <option value=\"\">Default</option>\n {efforts.map((level) => <option key={level} value={level}>{level}</option>)}\n </select>\n </Field>\n <Field label=\"Agent profile\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.profile || 'default-relay'} onChange={(e) => onChange({ profile: e.target.value })}>\n {!agentProfiles.length && <option value=\"default-relay\">default-relay</option>}\n {agentProfiles.map((profile) => <option key={profile.name} value={profile.name}>{profile.name}</option>)}\n </select>\n </Field>\n <Field label=\"Workspace\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.workspaceMode} onChange={(e) => onChange({ workspaceMode: e.target.value as WorkspaceMode })}>\n <option value=\"inherit\">inherit (default → isolated worktree)</option>\n <option value=\"shared\">shared (run in the repo, commit to its branch)</option>\n <option value=\"isolated\">isolated (fresh git worktree per run)</option>\n </select>\n </Field>\n </div>\n )}\n\n {form.targetMode === 'existing_agent' ? (\n <div className=\"grid gap-3\">\n <Field label=\"Label\">\n <Input value={form.label} onChange={(e) => onChange({ label: e.target.value })} />\n </Field>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Tags\">\n <Input value={form.tags} onChange={(e) => onChange({ tags: e.target.value })} />\n </Field>\n <Field label=\"Capabilities\">\n <Input value={form.capabilities} onChange={(e) => onChange({ capabilities: e.target.value })} />\n </Field>\n </div>\n </div>\n ) : (\n <div className=\"grid gap-3\">\n <Field label=\"Cwd\">\n <Input value={form.cwd} onChange={(e) => onChange({ cwd: e.target.value })} />\n </Field>\n <label className=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <span className=\"text-sm\">Keep alive</span>\n <Switch checked={form.keepAlive} onCheckedChange={(keepAlive) => onChange({ keepAlive })} />\n </label>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Budget minutes\">\n <Input type=\"number\" min={1} step={1} value={form.budgetMinutes} onChange={(e) => onChange({ budgetMinutes: e.target.value })} />\n </Field>\n <Field label=\"Warning minute\">\n <Input type=\"number\" min={0} step={1} value={form.warningMinutes} onChange={(e) => onChange({ warningMinutes: e.target.value })} />\n </Field>\n </div>\n <Field label=\"Warning message\">\n <Textarea value={form.warningMessage} onChange={(e) => onChange({ warningMessage: e.target.value })} className=\"min-h-20\" />\n </Field>\n </div>\n )}\n </div>\n\n <div className=\"space-y-3\">\n <Label>Task</Label>\n <Field label=\"Title\">\n <Input value={form.title} onChange={(e) => onChange({ title: e.target.value })} />\n </Field>\n <Field label=\"Body\">\n <Textarea value={form.body} onChange={(e) => onChange({ body: e.target.value })} className=\"min-h-28\" />\n </Field>\n <div className=\"grid grid-cols-3 gap-3\">\n <Field label=\"Severity\">\n <select className=\"h-9 w-full rounded-md border border-input bg-background px-3 text-sm\" value={form.severity} onChange={(e) => onChange({ severity: e.target.value as TaskSeverity })}>\n <option value=\"info\">info</option>\n <option value=\"warning\">warning</option>\n <option value=\"critical\">critical</option>\n </select>\n </Field>\n <Field label=\"Dedupe key\">\n <Input value={form.dedupeKey} onChange={(e) => onChange({ dedupeKey: e.target.value })} />\n </Field>\n <Field label=\"External URL\">\n <Input value={form.externalUrl} onChange={(e) => onChange({ externalUrl: e.target.value })} />\n </Field>\n </div>\n </div>\n\n <Button className=\"w-full gap-2\" onClick={onSave} disabled={saving || !form.name || !form.schedule || !form.orchestratorId || !form.title || !form.body}>\n {saving ? <RotateCw className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\n Save\n </Button>\n </div>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs text-muted-foreground\">{label}</Label>\n {children}\n </div>\n )\n}\n\nfunction RunHistory({\n runs,\n automations,\n agents,\n orchestrators,\n now,\n logRunId,\n onToggleLogs,\n}: {\n runs: AutomationRun[]\n automations: Automation[]\n agents: Agent[]\n orchestrators: Orchestrator[]\n now: number\n logRunId: string | null\n onToggleLogs: (runId: string) => void\n}) {\n const names = new Map(automations.map((automation) => [automation.id, automation.name]))\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold\">Runs</h3>\n <Badge variant=\"secondary\" className=\"text-[10px]\">{runs.length}</Badge>\n </div>\n <div className=\"rounded-lg border border-border overflow-x-auto\">\n <div className=\"grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 bg-muted/30 px-3 py-2 text-xs text-muted-foreground\">\n <span>Automation</span>\n <span>Status</span>\n <span>Agent</span>\n <span>Runtime</span>\n <span>Updated</span>\n <span>Logs</span>\n </div>\n {runs.length === 0 ? (\n <div className=\"px-3 py-10 text-center text-sm text-muted-foreground\">No runs</div>\n ) : runs.slice(0, 80).map((run) => {\n const logTarget = runLogTarget(run, agents, orchestrators)\n const remaining = remainingText(run, now)\n const shutdown = shutdownText(run)\n return (\n <div key={run.id} className=\"border-t border-border\">\n <div className=\"grid grid-cols-[minmax(10rem,1fr)_8rem_8rem_7rem_7rem_5rem] gap-3 px-3 py-2 text-xs items-center\">\n <div className=\"min-w-0\">\n <div className=\"truncate\">{names.get(run.automationId) || run.automationId.slice(0, 12)}</div>\n <div className=\"truncate text-muted-foreground\">\n {run.taskId ? `task #${run.taskId}` : 'no task'}\n {remaining ? ` · ${remaining} left` : ''}\n {shutdown ? ` · ${shutdown}` : ''}\n </div>\n </div>\n <Badge variant=\"outline\" className={`border text-[10px] w-fit ${runStatusClass(run)}`}>{runStatusLabel(run)}</Badge>\n <span className=\"truncate font-mono text-muted-foreground\">{run.targetAgentId || run.spawnedAgentId || '-'}</span>\n <span className=\"text-muted-foreground\">{elapsedText(run, now)}</span>\n <span className=\"text-muted-foreground\" title={fmtTime(run.updatedAt)}>{timeAgo(now, run.updatedAt)}</span>\n {logTarget ? (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-7 w-7 p-0\" title=\"Open logs\" onClick={() => onToggleLogs(run.id)}>\n <FileText className=\"w-3.5 h-3.5\" />\n </Button>\n ) : <span className=\"text-muted-foreground\">-</span>}\n </div>\n {logRunId === run.id && logTarget && (\n <div className=\"border-t border-border px-3 py-3\">\n <LogViewer orchestratorId={logTarget.orchestratorId} session={logTarget.session} />\n </div>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatted-body-impl-DZc7C4-2.js","names":[],"sources":["../../dashboard/src/components/shared/formatted-body-impl.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize'\nimport remarkGfm from 'remark-gfm'\nimport { CodePreview } from './code-preview'\nimport { cn } from '@/lib/utils'\nimport { parseJsonBody } from '@/lib/display'\nimport { useRelayStore } from '@/store'\n\nexport interface FormattedBodyProps {\n text: string\n rawBody?: string\n className?: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n /** Per-message tracker repo (`owner/repo`) for bare `#NNN` linkify (#533) — the originating\n * agent's project repo, resolved server-side. Falls back to the server-global default (#511). */\n issueRepo?: string\n /** Rendered inside a primary-background bubble (operator's outbound message). Flips link\n * color to primary-foreground so links stay legible against the accent bg (#612). */\n onPrimary?: boolean\n}\n\n// Order matters: the issue-ref alternative (`#NNN` or `owner/repo#NNN`) is FIRST so the\n// path matcher can't swallow `owner/repo#NNN` as a file path. URLs still win when they\n// start earlier (leftmost-match), so a URL fragment like `…/a#12` is never mis-linkified.\nconst LINK_RE = /((?:[A-Za-z0-9][\\w.-]*\\/[A-Za-z0-9][\\w.-]*)?#\\d+)\\b|(https?:\\/\\/[^\\s`'\")\\]]+)|((?:\\/[\\w.@+-][^\\s`'\")\\]]*|(?:\\.{1,2}\\/|[\\w.@+-]+\\/)[^\\s`'\")\\]]*))/g\nconst TRAILING_PUNCTUATION = /[.,;:!?]+$/\nconst KNOWN_PROJECT_DIRS = new Set(['src', 'app', 'apps', 'lib', 'server', 'client', 'dashboard', 'orchestrator', 'runner', 'sdk', 'codex', 'claude', 'public', 'docs', 'test', 'tests', 'scripts', 'config', 'configs'])\n\nconst markdownSchema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n code: [\n ...(defaultSchema.attributes?.code || []),\n ['className', /^language-[\\w-]+$/],\n ],\n },\n}\n\nfunction looksLikeFilePath(path: string): boolean {\n if (path === '/api' || path.startsWith('/api/')) return false\n if (path.startsWith('/')) return true\n if (path.startsWith('./') || path.startsWith('../')) return true\n const segments = path.split('/').filter(Boolean)\n const first = segments[0] ?? ''\n const last = segments[segments.length - 1] ?? ''\n if (first.startsWith('.')) return true\n if (KNOWN_PROJECT_DIRS.has(first)) return true\n return last.includes('.')\n}\n\nexport function linkParts(text: string, issueRepo?: string): Array<{ text: string; path?: string; url?: string; line?: number; issueUrl?: string }> {\n const parts: Array<{ text: string; path?: string; url?: string; line?: number; issueUrl?: string }> = []\n let cursor = 0\n for (const match of text.matchAll(LINK_RE)) {\n const rawIssue = match[1]\n const rawUrl = match[2]\n const rawPath = match[3]\n const raw = rawIssue || rawUrl || rawPath\n const index = match.index ?? 0\n if (!raw || index < cursor) continue\n\n if (rawIssue) {\n // `#NNN` (uses the configured default repo) or `owner/repo#NNN` (explicit repo).\n // With no resolvable repo we leave it as plain text — never emit a broken link.\n const hashIdx = rawIssue.lastIndexOf('#')\n const repo = rawIssue.slice(0, hashIdx) || issueRepo\n const num = rawIssue.slice(hashIdx + 1)\n // Slash-shorthand like `#508/509/513` (#531): the trailing `/509/513` is a run of\n // bare ref numbers, NOT a file path. Consume it as plain text so the path matcher\n // (which would otherwise claim `/509/...` as a phantom path link) can't reach it.\n const trailingRefs = text.slice(index + rawIssue.length).match(/^(?:\\/\\d+)+/)?.[0] ?? ''\n if (repo) {\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: rawIssue, issueUrl: `https://github.com/${repo}/issues/${num}` })\n if (trailingRefs) parts.push({ text: trailingRefs })\n cursor = index + rawIssue.length + trailingRefs.length\n } else if (trailingRefs) {\n // No repo to link against, but still neutralize the slash run so it stays plain text.\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: rawIssue + trailingRefs })\n cursor = index + rawIssue.length + trailingRefs.length\n }\n continue\n }\n\n if (rawUrl) {\n const url = rawUrl.replace(TRAILING_PUNCTUATION, '')\n const trimmed = rawUrl.slice(url.length)\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: url, url })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + rawUrl.length\n continue\n }\n\n if (!raw.includes('/')) continue\n let path = raw.replace(TRAILING_PUNCTUATION, '')\n const trimmed = raw.slice(path.length)\n const lineMatch = path.match(/^(.*):(\\d+)$/)\n const line = lineMatch ? Number(lineMatch[2]) : undefined\n if (lineMatch) path = lineMatch[1]!\n if (!looksLikeFilePath(path)) continue\n if (index > cursor) parts.push({ text: text.slice(cursor, index) })\n parts.push({ text: path, path, line: Number.isFinite(line) ? line : undefined })\n if (trimmed) parts.push({ text: trimmed })\n cursor = index + raw.length\n }\n if (cursor < text.length) parts.push({ text: text.slice(cursor) })\n return parts\n}\n\nfunction TextWithLinks({\n text,\n onOpenPath,\n onPreviewPath,\n onPreviewPathEnd,\n isPathLinkable,\n resolvePathTitle,\n issueRepo,\n}: {\n text: string\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n issueRepo?: string\n}) {\n const parts = linkParts(text, issueRepo)\n if (parts.length === 1 && !parts[0]?.path && !parts[0]?.url && !parts[0]?.issueUrl) return <>{text}</>\n return (\n <>\n {parts.map((part, index) => {\n if (part.issueUrl) {\n return (\n <a\n key={`${part.issueUrl}-${index}`}\n href={part.issueUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium underline decoration-dotted underline-offset-2\"\n onClick={(e) => e.stopPropagation()}\n >\n {part.text}\n </a>\n )\n }\n if (part.url) {\n return (\n <a\n key={`${part.url}-${index}`}\n href={part.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"underline decoration-dotted underline-offset-2\"\n onClick={(e) => e.stopPropagation()}\n >\n {part.text}\n </a>\n )\n }\n if (part.path && onOpenPath) {\n if (isPathLinkable && !isPathLinkable(part.path, part.line)) return <span key={`${part.path}-${index}`}>{part.text}{part.line ? `:${part.line}` : ''}</span>\n const resolvedTitle = resolvePathTitle?.(part.path, part.line)\n return (\n <button\n key={`${part.path}-${index}`}\n type=\"button\"\n className=\"chat-link rounded-sm font-mono underline decoration-dotted underline-offset-2\"\n onClick={(e) => { e.stopPropagation(); onOpenPath(part.path!, part.line) }}\n onMouseEnter={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onFocus={(e) => onPreviewPath?.(part.path!, part.line, e.currentTarget.getBoundingClientRect())}\n onMouseLeave={() => onPreviewPathEnd?.()}\n onBlur={() => onPreviewPathEnd?.()}\n title={resolvedTitle ? `Open ${resolvedTitle}` : 'Open file'}\n >\n {part.text}{part.line ? `:${part.line}` : ''}\n </button>\n )\n }\n return <span key={index}>{part.text}</span>\n })}\n </>\n )\n}\n\ninterface LinkifyContext {\n onOpenPath?: (path: string, line?: number) => void\n onPreviewPath?: (path: string, line?: number, anchor?: DOMRect) => void\n onPreviewPathEnd?: () => void\n isPathLinkable?: (path: string, line?: number) => boolean\n resolvePathTitle?: (path: string, line?: number) => string | undefined\n issueRepo?: string\n}\n\n// Inline code & fenced blocks (the `code`/`pre` overrides) — descend with `inCode`\n// set so `#NNN` inside backticks renders verbatim instead of linkifying.\nconst CodeComponent = ({ className: codeClass, children }: { className?: string; children?: React.ReactNode }) => {\n const match = /language-([\\w-]+)/.exec(codeClass || '')\n const code = String(children).replace(/\\n$/, '')\n if (match) {\n return <CodePreview content={code} path={`.${match[1]}`} languageHint={match[1]} compact />\n }\n return <code className={codeClass}>{children}</code>\n}\n\n// Markdown links — render the anchor and pass children through untouched. The\n// recursive walk skips this subtree so we never linkify a `#NNN` *inside* link\n// text (which would nest one <a> inside another). Text adjacent to a link still\n// linkifies via the enclosing block's walk.\nconst AnchorComponent = ({ href, children }: { href?: string; children?: React.ReactNode }) => (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" onClick={(e) => e.stopPropagation()}>\n {children}\n </a>\n)\n\n// Recursively linkify every text leaf in a markdown subtree (#550). react-markdown\n// hands each block override its already-rendered React children, so nested inline\n// elements (strong/em/del/headings/table cells/…) arrive as element children with\n// their text strings buried one or more levels deep. We descend through them and\n// apply `linkParts` (via TextWithLinks) at every string leaf, keeping the linkify\n// rule in this ONE place. `inCode` suppresses linkify inside code/pre; anchors are\n// left whole to avoid nested links.\nfunction processTextChildren(children: React.ReactNode, ctx: LinkifyContext, inCode = false): React.ReactNode {\n return React.Children.map(children, (child) => {\n if (typeof child === 'string') {\n if (inCode) return child\n return (\n <TextWithLinks\n text={child}\n onOpenPath={ctx.onOpenPath}\n onPreviewPath={ctx.onPreviewPath}\n onPreviewPathEnd={ctx.onPreviewPathEnd}\n isPathLinkable={ctx.isPathLinkable}\n resolvePathTitle={ctx.resolvePathTitle}\n issueRepo={ctx.issueRepo}\n />\n )\n }\n if (!React.isValidElement(child)) return child\n const type = child.type\n // Already-linkified leaves carry their text in a prop, not children — leave whole.\n if (type === TextWithLinks) return child\n // Never linkify inside a link (no nested <a>); render the anchor subtree verbatim.\n if (type === AnchorComponent || type === 'a') return child\n const props = child.props as { children?: React.ReactNode }\n if (props?.children == null) return child\n const nextInCode = inCode || type === CodeComponent || type === 'code' || type === 'pre'\n return React.cloneElement(child, undefined, processTextChildren(props.children, ctx, nextInCode))\n })\n}\n\nexport function FormattedBody({ text, rawBody, className, onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle, issueRepo: issueRepoProp, onPrimary }: FormattedBodyProps) {\n const parsed = useMemo(() => parseJsonBody(rawBody || ''), [rawBody])\n const content = unescapeNewlines(parsed ? parsed.text : text)\n // Per-message tracker repo for bare #NNN linkify (#533): the originating agent's project\n // repo (`issueRepoProp`) wins; the server-global default (#511) is only a last-resort\n // fallback for messages with no resolvable project. undefined → #NNN stays plain text.\n const globalIssueRepo = useRelayStore((s) => s.stats?.defaultIssueRepo)\n const issueRepo = issueRepoProp ?? globalIssueRepo\n\n const components = useMemo(() => {\n const ctx: LinkifyContext = { onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle, issueRepo }\n // Every text-bearing block routes its children through the recursive walk, which\n // descends into nested inline elements (strong/em/del/code/links) on its own — so\n // these stay one-liners and the linkify rule lives only in processTextChildren.\n const block = (Tag: 'p' | 'li' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'td' | 'th' | 'blockquote') =>\n ({ children }: { children?: React.ReactNode }) => <Tag>{processTextChildren(children, ctx)}</Tag>\n return {\n p: block('p'),\n li: block('li'),\n h1: block('h1'),\n h2: block('h2'),\n h3: block('h3'),\n h4: block('h4'),\n h5: block('h5'),\n h6: block('h6'),\n td: block('td'),\n th: block('th'),\n blockquote: block('blockquote'),\n a: AnchorComponent,\n code: CodeComponent,\n }\n }, [onOpenPath, onPreviewPath, onPreviewPathEnd, isPathLinkable, resolvePathTitle, issueRepo])\n\n return (\n <div className={className}>\n <div className={cn('chat-markdown', onPrimary && 'chat-markdown-on-primary')}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[[rehypeSanitize, markdownSchema]]} components={components}>\n {content}\n </ReactMarkdown>\n </div>\n {parsed && parsed.meta.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {parsed.meta.map(([k, v]) => (\n <span key={k} className=\"inline-flex text-[10px] leading-tight bg-muted px-1.5 py-0.5 rounded text-muted-foreground font-mono\">\n {k}: {v}\n </span>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction unescapeNewlines(text: string): string {\n if (!text.includes('\\\\n')) return text\n return text.replace(/\\\\n/g, '\\n')\n}\n"],"mappings":"kTA6BM,EAAU,oJACV,EAAuB,aACvB,EAAqB,IAAI,IAAI,CAAC,MAAO,MAAO,OAAQ,MAAO,SAAU,SAAU,YAAa,eAAgB,SAAU,MAAO,QAAS,SAAU,SAAU,OAAQ,OAAQ,QAAS,UAAW,SAAU,UAAU,CAAC,CAEnN,EAAiB,CACrB,GAAG,EACH,WAAY,CACV,GAAG,EAAc,WACjB,KAAM,CACJ,GAAI,EAAc,YAAY,MAAQ,EAAE,CACxC,CAAC,YAAa,oBAAoB,CACnC,CACF,CACF,CAED,SAAS,EAAkB,EAAuB,CAChD,GAAI,IAAS,QAAU,EAAK,WAAW,QAAQ,CAAE,MAAO,GAExD,GADI,EAAK,WAAW,IAAI,EACpB,EAAK,WAAW,KAAK,EAAI,EAAK,WAAW,MAAM,CAAE,MAAO,GAC5D,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAC1C,EAAQ,EAAS,IAAM,GACvB,EAAO,EAAS,EAAS,OAAS,IAAM,GAG9C,OAFI,EAAM,WAAW,IAAI,EACrB,EAAmB,IAAI,EAAM,CAAS,GACnC,EAAK,SAAS,IAAI,CAG3B,SAAgB,EAAU,EAAc,EAA4G,CAClJ,IAAM,EAAgG,EAAE,CACpG,EAAS,EACb,IAAK,IAAM,KAAS,EAAK,SAAS,EAAQ,CAAE,CAC1C,IAAM,EAAW,EAAM,GACjB,EAAS,EAAM,GACf,EAAU,EAAM,GAChB,EAAM,GAAY,GAAU,EAC5B,EAAQ,EAAM,OAAS,EAC7B,GAAI,CAAC,GAAO,EAAQ,EAAQ,SAE5B,GAAI,EAAU,CAGZ,IAAM,EAAU,EAAS,YAAY,IAAI,CACnC,EAAO,EAAS,MAAM,EAAG,EAAQ,EAAI,EACrC,EAAM,EAAS,MAAM,EAAU,EAAE,CAIjC,EAAe,EAAK,MAAM,EAAQ,EAAS,OAAO,CAAC,MAAM,cAAc,GAAG,IAAM,GAClF,GACE,EAAQ,GAAQ,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAQ,EAAM,CAAE,CAAC,CACnE,EAAM,KAAK,CAAE,KAAM,EAAU,SAAU,sBAAsB,EAAK,UAAU,IAAO,CAAC,CAChF,GAAc,EAAM,KAAK,CAAE,KAAM,EAAc,CAAC,CACpD,EAAS,EAAQ,EAAS,OAAS,EAAa,QACvC,IAEL,EAAQ,GAAQ,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAQ,EAAM,CAAE,CAAC,CACnE,EAAM,KAAK,CAAE,KAAM,EAAW,EAAc,CAAC,CAC7C,EAAS,EAAQ,EAAS,OAAS,EAAa,QAElD,SAGF,GAAI,EAAQ,CACV,IAAM,EAAM,EAAO,QAAQ,EAAsB,GAAG,CAC9C,EAAU,EAAO,MAAM,EAAI,OAAO,CACpC,EAAQ,GAAQ,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAQ,EAAM,CAAE,CAAC,CACnE,EAAM,KAAK,CAAE,KAAM,EAAK,MAAK,CAAC,CAC1B,GAAS,EAAM,KAAK,CAAE,KAAM,EAAS,CAAC,CAC1C,EAAS,EAAQ,EAAO,OACxB,SAGF,GAAI,CAAC,EAAI,SAAS,IAAI,CAAE,SACxB,IAAI,EAAO,EAAI,QAAQ,EAAsB,GAAG,CAC1C,EAAU,EAAI,MAAM,EAAK,OAAO,CAChC,EAAY,EAAK,MAAM,eAAe,CACtC,EAAO,EAAY,OAAO,EAAU,GAAG,CAAG,IAAA,GAC5C,IAAW,EAAO,EAAU,IAC3B,EAAkB,EAAK,GACxB,EAAQ,GAAQ,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAQ,EAAM,CAAE,CAAC,CACnE,EAAM,KAAK,CAAE,KAAM,EAAM,OAAM,KAAM,OAAO,SAAS,EAAK,CAAG,EAAO,IAAA,GAAW,CAAC,CAC5E,GAAS,EAAM,KAAK,CAAE,KAAM,EAAS,CAAC,CAC1C,EAAS,EAAQ,EAAI,QAGvB,OADI,EAAS,EAAK,QAAQ,EAAM,KAAK,CAAE,KAAM,EAAK,MAAM,EAAO,CAAE,CAAC,CAC3D,EAGT,SAAS,EAAc,CACrB,OACA,aACA,gBACA,mBACA,iBACA,mBACA,aASC,CACD,IAAM,EAAQ,EAAU,EAAM,EAAU,CAExC,OADI,EAAM,SAAW,GAAK,CAAC,EAAM,IAAI,MAAQ,CAAC,EAAM,IAAI,KAAO,CAAC,EAAM,IAAI,UAAiB,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SAAG,EAAQ,CAAA,EAEpG,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EAAM,KAAK,EAAM,IAAU,CAC1B,GAAI,EAAK,SACP,OACE,EAAA,EAAA,KAAC,IAAD,CAEE,KAAM,EAAK,SACX,OAAO,SACP,IAAI,aACJ,UAAU,6DACV,QAAU,GAAM,EAAE,iBAAiB,UAElC,EAAK,KACJ,CARG,GAAG,EAAK,SAAS,GAAG,IAQvB,CAGR,GAAI,EAAK,IACP,OACE,EAAA,EAAA,KAAC,IAAD,CAEE,KAAM,EAAK,IACX,OAAO,SACP,IAAI,aACJ,UAAU,iDACV,QAAU,GAAM,EAAE,iBAAiB,UAElC,EAAK,KACJ,CARG,GAAG,EAAK,IAAI,GAAG,IAQlB,CAGR,GAAI,EAAK,MAAQ,EAAY,CAC3B,GAAI,GAAkB,CAAC,EAAe,EAAK,KAAM,EAAK,KAAK,CAAE,OAAO,EAAA,EAAA,MAAC,OAAD,CAAA,SAAA,CAAqC,EAAK,KAAM,EAAK,KAAO,IAAI,EAAK,OAAS,GAAU,CAAA,CAA7E,GAAG,EAAK,KAAK,GAAG,IAA6D,CAC5J,IAAM,EAAgB,IAAmB,EAAK,KAAM,EAAK,KAAK,CAC9D,OACE,EAAA,EAAA,MAAC,SAAD,CAEE,KAAK,SACL,UAAU,gFACV,QAAU,GAAM,CAAE,EAAE,iBAAiB,CAAE,EAAW,EAAK,KAAO,EAAK,KAAK,EACxE,aAAe,GAAM,IAAgB,EAAK,KAAO,EAAK,KAAM,EAAE,cAAc,uBAAuB,CAAC,CACpG,QAAU,GAAM,IAAgB,EAAK,KAAO,EAAK,KAAM,EAAE,cAAc,uBAAuB,CAAC,CAC/F,iBAAoB,KAAoB,CACxC,WAAc,KAAoB,CAClC,MAAO,EAAgB,QAAQ,IAAkB,qBATnD,CAWG,EAAK,KAAM,EAAK,KAAO,IAAI,EAAK,OAAS,GACnC,EAXF,GAAG,EAAK,KAAK,GAAG,IAWd,CAGb,OAAO,EAAA,EAAA,KAAC,OAAD,CAAA,SAAmB,EAAK,KAAY,CAAzB,EAAyB,EAC3C,CACD,CAAA,CAeP,IAAM,GAAiB,CAAE,UAAW,EAAW,cAAmE,CAChH,IAAM,EAAQ,oBAAoB,KAAK,GAAa,GAAG,CACjD,EAAO,OAAO,EAAS,CAAC,QAAQ,MAAO,GAAG,CAIhD,OAHI,GACK,EAAA,EAAA,KAAC,EAAD,CAAa,QAAS,EAAM,KAAM,IAAI,EAAM,KAAM,aAAc,EAAM,GAAI,QAAA,GAAU,CAAA,EAEtF,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAY,WAAgB,CAAA,EAOhD,GAAmB,CAAE,OAAM,eAC/B,EAAA,EAAA,KAAC,IAAD,CAAS,OAAM,OAAO,SAAS,IAAI,aAAa,QAAU,GAAM,EAAE,iBAAiB,CAChF,WACC,CAAA,CAUN,SAAS,EAAoB,EAA2B,EAAqB,EAAS,GAAwB,CAC5G,OAAA,EAAa,SAAS,IAAI,EAAW,GAAU,CAC7C,GAAI,OAAO,GAAU,SAEnB,OADI,EAAe,GAEjB,EAAA,EAAA,KAAC,EAAD,CACE,KAAM,EACN,WAAY,EAAI,WAChB,cAAe,EAAI,cACnB,iBAAkB,EAAI,iBACtB,eAAgB,EAAI,eACpB,iBAAkB,EAAI,iBACtB,UAAW,EAAI,UACf,CAAA,CAGN,GAAI,CAAA,EAAO,eAAe,EAAM,CAAE,OAAO,EACzC,IAAM,EAAO,EAAM,KAInB,GAFI,IAAS,GAET,IAAS,GAAmB,IAAS,IAAK,OAAO,EACrD,IAAM,EAAQ,EAAM,MACpB,GAAI,GAAO,UAAY,KAAM,OAAO,EACpC,IAAM,EAAa,GAAU,IAAS,GAAiB,IAAS,QAAU,IAAS,MACnF,OAAA,EAAa,aAAa,EAAO,IAAA,GAAW,EAAoB,EAAM,SAAU,EAAK,EAAW,CAAC,EACjG,CAGJ,SAAgB,EAAc,CAAE,OAAM,UAAS,YAAW,aAAY,gBAAe,mBAAkB,iBAAgB,mBAAkB,UAAW,EAAe,aAAiC,CAClM,IAAM,GAAA,EAAA,EAAA,aAAuB,EAAc,GAAW,GAAG,CAAE,CAAC,EAAQ,CAAC,CAC/D,EAAU,EAAiB,EAAS,EAAO,KAAO,EAAK,CAIvD,EAAkB,EAAe,GAAM,EAAE,OAAO,iBAAiB,CACjE,EAAY,GAAiB,EAE7B,GAAA,EAAA,EAAA,aAA2B,CAC/B,IAAM,EAAsB,CAAE,aAAY,gBAAe,mBAAkB,iBAAgB,mBAAkB,YAAW,CAIlH,EAAS,IACZ,CAAE,eAA+C,EAAA,EAAA,KAAC,EAAD,CAAA,SAAM,EAAoB,EAAU,EAAI,CAAO,CAAA,CACnG,MAAO,CACL,EAAG,EAAM,IAAI,CACb,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,GAAI,EAAM,KAAK,CACf,WAAY,EAAM,aAAa,CAC/B,EAAG,EACH,KAAM,EACP,EACA,CAAC,EAAY,EAAe,EAAkB,EAAgB,EAAkB,EAAU,CAAC,CAE9F,OACE,EAAA,EAAA,MAAC,MAAD,CAAgB,qBAAhB,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAG,gBAAiB,GAAa,2BAA2B,WAC1E,EAAA,EAAA,KAAC,EAAD,CAAe,cAAe,CAAC,EAAU,CAAE,cAAe,CAAC,CAAC,EAAgB,EAAe,CAAC,CAAc,sBACvG,EACa,CAAA,CACZ,CAAA,CACL,GAAU,EAAO,KAAK,OAAS,IAC9B,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,uCACZ,EAAO,KAAK,KAAK,CAAC,EAAG,MACpB,EAAA,EAAA,MAAC,OAAD,CAAc,UAAU,gHAAxB,CACG,EAAE,KAAG,EACD,EAFI,EAEJ,CACP,CACE,CAAA,CAEJ,GAIV,SAAS,EAAiB,EAAsB,CAE9C,OADK,EAAK,SAAS,MAAM,CAClB,EAAK,QAAQ,OAAQ;EAAK,CADC"}
|