@agent-native/dispatch 0.24.0 → 0.24.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/actions/provider-api-register.d.ts +12 -12
  2. package/dist/components/admin-navigation.d.ts.map +1 -1
  3. package/dist/components/admin-navigation.js +21 -5
  4. package/dist/components/admin-navigation.js.map +1 -1
  5. package/dist/components/agents-panel.d.ts.map +1 -1
  6. package/dist/components/agents-panel.js +7 -2
  7. package/dist/components/agents-panel.js.map +1 -1
  8. package/dist/components/app-list-row.d.ts +1 -1
  9. package/dist/components/app-list-row.d.ts.map +1 -1
  10. package/dist/components/app-list-row.js +1 -1
  11. package/dist/components/app-list-row.js.map +1 -1
  12. package/dist/components/app-open-actions.d.ts +1 -17
  13. package/dist/components/app-open-actions.d.ts.map +1 -1
  14. package/dist/components/app-open-actions.js +1 -20
  15. package/dist/components/app-open-actions.js.map +1 -1
  16. package/dist/components/app-row-settings.d.ts +6 -0
  17. package/dist/components/app-row-settings.d.ts.map +1 -0
  18. package/dist/components/app-row-settings.js +11 -0
  19. package/dist/components/app-row-settings.js.map +1 -0
  20. package/dist/components/automation-run-history-dialog.d.ts.map +1 -1
  21. package/dist/components/automation-run-history-dialog.js +3 -2
  22. package/dist/components/automation-run-history-dialog.js.map +1 -1
  23. package/dist/components/connected-app-card.d.ts.map +1 -1
  24. package/dist/components/connected-app-card.js +1 -1
  25. package/dist/components/connected-app-card.js.map +1 -1
  26. package/dist/components/create-app-popover.js +2 -2
  27. package/dist/components/create-app-popover.js.map +1 -1
  28. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  29. package/dist/components/dispatch-control-plane.js +23 -7
  30. package/dist/components/dispatch-control-plane.js.map +1 -1
  31. package/dist/components/dispatch-shell.d.ts.map +1 -1
  32. package/dist/components/dispatch-shell.js +5 -1
  33. package/dist/components/dispatch-shell.js.map +1 -1
  34. package/dist/components/docs-link.d.ts +16 -0
  35. package/dist/components/docs-link.d.ts.map +1 -0
  36. package/dist/components/docs-link.js +34 -0
  37. package/dist/components/docs-link.js.map +1 -0
  38. package/dist/components/layout/Layout.d.ts +1 -0
  39. package/dist/components/layout/Layout.d.ts.map +1 -1
  40. package/dist/components/layout/Layout.js +37 -28
  41. package/dist/components/layout/Layout.js.map +1 -1
  42. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  43. package/dist/components/messaging-setup-panel.js +3 -2
  44. package/dist/components/messaging-setup-panel.js.map +1 -1
  45. package/dist/components/usage-alerts-panel.d.ts +11 -0
  46. package/dist/components/usage-alerts-panel.d.ts.map +1 -0
  47. package/dist/components/usage-alerts-panel.js +125 -0
  48. package/dist/components/usage-alerts-panel.js.map +1 -0
  49. package/dist/components/workspace-app-card.d.ts +3 -1
  50. package/dist/components/workspace-app-card.d.ts.map +1 -1
  51. package/dist/components/workspace-app-card.js +70 -29
  52. package/dist/components/workspace-app-card.js.map +1 -1
  53. package/dist/components/workspace-app-search.d.ts +10 -0
  54. package/dist/components/workspace-app-search.d.ts.map +1 -0
  55. package/dist/components/workspace-app-search.js +27 -0
  56. package/dist/components/workspace-app-search.js.map +1 -0
  57. package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -1
  58. package/dist/components/workspace-resource-effective-stack.js +3 -2
  59. package/dist/components/workspace-resource-effective-stack.js.map +1 -1
  60. package/dist/components/workspace-template-card.d.ts.map +1 -1
  61. package/dist/components/workspace-template-card.js +2 -1
  62. package/dist/components/workspace-template-card.js.map +1 -1
  63. package/dist/lib/workspace-app-layout.d.ts +19 -0
  64. package/dist/lib/workspace-app-layout.d.ts.map +1 -0
  65. package/dist/lib/workspace-app-layout.js +75 -0
  66. package/dist/lib/workspace-app-layout.js.map +1 -0
  67. package/dist/lib/workspace-apps.d.ts +10 -0
  68. package/dist/lib/workspace-apps.d.ts.map +1 -1
  69. package/dist/lib/workspace-apps.js +59 -0
  70. package/dist/lib/workspace-apps.js.map +1 -1
  71. package/dist/lib/workspace-apps.test.js +18 -1
  72. package/dist/lib/workspace-apps.test.js.map +1 -1
  73. package/dist/routes/pages/$appId.d.ts.map +1 -1
  74. package/dist/routes/pages/$appId.js +4 -2
  75. package/dist/routes/pages/$appId.js.map +1 -1
  76. package/dist/routes/pages/agents.d.ts.map +1 -1
  77. package/dist/routes/pages/agents.js +2 -3
  78. package/dist/routes/pages/agents.js.map +1 -1
  79. package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
  80. package/dist/routes/pages/apps.$appId.js +8 -3
  81. package/dist/routes/pages/apps.$appId.js.map +1 -1
  82. package/dist/routes/pages/apps.d.ts.map +1 -1
  83. package/dist/routes/pages/apps.js +31 -16
  84. package/dist/routes/pages/apps.js.map +1 -1
  85. package/dist/routes/pages/audit.d.ts.map +1 -1
  86. package/dist/routes/pages/audit.js +2 -1
  87. package/dist/routes/pages/audit.js.map +1 -1
  88. package/dist/routes/pages/dreams.d.ts.map +1 -1
  89. package/dist/routes/pages/dreams.js +14 -18
  90. package/dist/routes/pages/dreams.js.map +1 -1
  91. package/dist/routes/pages/integrations.d.ts.map +1 -1
  92. package/dist/routes/pages/integrations.js +51 -14
  93. package/dist/routes/pages/integrations.js.map +1 -1
  94. package/dist/routes/pages/metrics.d.ts.map +1 -1
  95. package/dist/routes/pages/metrics.js +4 -1
  96. package/dist/routes/pages/metrics.js.map +1 -1
  97. package/dist/routes/pages/operations.js +1 -1
  98. package/dist/routes/pages/operations.js.map +1 -1
  99. package/dist/routes/pages/settings.d.ts.map +1 -1
  100. package/dist/routes/pages/settings.js +7 -2
  101. package/dist/routes/pages/settings.js.map +1 -1
  102. package/dist/routes/pages/thread-debug.d.ts.map +1 -1
  103. package/dist/routes/pages/thread-debug.js +5 -8
  104. package/dist/routes/pages/thread-debug.js.map +1 -1
  105. package/dist/routes/pages/vault.d.ts.map +1 -1
  106. package/dist/routes/pages/vault.js +1 -1
  107. package/dist/routes/pages/vault.js.map +1 -1
  108. package/dist/routes/pages/workspace.d.ts.map +1 -1
  109. package/dist/routes/pages/workspace.js +13 -10
  110. package/dist/routes/pages/workspace.js.map +1 -1
  111. package/dist/server/index.d.ts.map +1 -1
  112. package/dist/server/index.js +3 -0
  113. package/dist/server/index.js.map +1 -1
  114. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  115. package/dist/server/lib/app-creation-store.js +12 -52
  116. package/dist/server/lib/app-creation-store.js.map +1 -1
  117. package/dist/shared/app-roles.d.ts +9 -0
  118. package/dist/shared/app-roles.d.ts.map +1 -0
  119. package/dist/shared/app-roles.js +7 -0
  120. package/dist/shared/app-roles.js.map +1 -0
  121. package/package.json +4 -3
  122. package/src/components/admin-navigation.tsx +57 -11
  123. package/src/components/agents-panel.tsx +54 -29
  124. package/src/components/app-list-row.tsx +1 -2
  125. package/src/components/app-open-actions.tsx +5 -114
  126. package/src/components/app-row-settings.tsx +54 -0
  127. package/src/components/automation-run-history-dialog.tsx +8 -4
  128. package/src/components/connected-app-card.tsx +0 -1
  129. package/src/components/create-app-popover.spec.tsx +1 -1
  130. package/src/components/create-app-popover.tsx +2 -2
  131. package/src/components/dispatch-control-plane.spec.tsx +36 -2
  132. package/src/components/dispatch-control-plane.tsx +83 -27
  133. package/src/components/dispatch-shell.tsx +7 -1
  134. package/src/components/docs-link.tsx +52 -0
  135. package/src/components/layout/Layout.spec.tsx +10 -0
  136. package/src/components/layout/Layout.tsx +50 -23
  137. package/src/components/messaging-setup-panel.tsx +10 -3
  138. package/src/components/usage-alerts-panel.tsx +445 -0
  139. package/src/components/workspace-app-card.spec.tsx +130 -9
  140. package/src/components/workspace-app-card.tsx +128 -71
  141. package/src/components/workspace-app-search.tsx +96 -0
  142. package/src/components/workspace-resource-effective-stack.tsx +10 -5
  143. package/src/components/workspace-template-card.spec.tsx +52 -23
  144. package/src/components/workspace-template-card.tsx +7 -10
  145. package/src/lib/workspace-app-layout.spec.ts +47 -0
  146. package/src/lib/workspace-app-layout.ts +121 -0
  147. package/src/lib/workspace-apps.test.ts +45 -1
  148. package/src/lib/workspace-apps.ts +72 -0
  149. package/src/routes/pages/$appId.tsx +3 -6
  150. package/src/routes/pages/agents.tsx +6 -3
  151. package/src/routes/pages/apps.$appId.tsx +6 -6
  152. package/src/routes/pages/apps.tsx +116 -62
  153. package/src/routes/pages/audit.tsx +28 -8
  154. package/src/routes/pages/dreams.tsx +92 -142
  155. package/src/routes/pages/integrations.tsx +147 -68
  156. package/src/routes/pages/metrics.tsx +8 -0
  157. package/src/routes/pages/operations.tsx +2 -2
  158. package/src/routes/pages/settings.tsx +14 -9
  159. package/src/routes/pages/thread-debug.tsx +18 -36
  160. package/src/routes/pages/vault.tsx +7 -2
  161. package/src/routes/pages/workspace.tsx +92 -56
  162. package/src/server/index.ts +4 -0
  163. package/src/server/lib/app-creation-store.spec.ts +90 -43
  164. package/src/server/lib/app-creation-store.ts +15 -61
  165. package/src/shared/app-roles.ts +8 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useActionMutation, useActionQuery, } from "@agent-native/core/client/hooks";
3
- import { IconAlertTriangle, IconBrain, IconCalendarTime, IconCheck, IconCircleDashed, IconClock, IconDatabase, IconFileDiff, IconPlayerPlay, IconRefresh, IconSettings, IconX, } from "@tabler/icons-react";
3
+ import { IconAlertTriangle, IconCalendarTime, IconCheck, IconDatabase, IconFileDiff, IconPlayerPlay, IconRefresh, IconSettings, IconX, } from "@tabler/icons-react";
4
4
  import { useEffect, useMemo, useState } from "react";
5
5
  import { useSearchParams } from "react-router";
6
6
  import { toast } from "sonner";
@@ -200,9 +200,6 @@ function DreamListSkeleton() {
200
200
  function ProposalSkeleton() {
201
201
  return (_jsx("div", { className: "space-y-3", children: Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "rounded-lg border p-4", children: [_jsx(Skeleton, { className: "h-4 w-1/2" }), _jsx(Skeleton, { className: "mt-3 h-3 w-full" }), _jsx(Skeleton, { className: "mt-2 h-3 w-3/4" })] }, index))) }));
202
202
  }
203
- function StatTile({ label, value, icon: Icon, }) {
204
- return (_jsx("div", { className: "rounded-lg bg-card px-3 py-2.5", children: _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: label }), _jsx("div", { className: "mt-1 text-xl font-semibold tabular-nums text-foreground", children: value })] }), _jsx(Icon, { size: 18, className: "shrink-0 text-muted-foreground" })] }) }));
205
- }
206
203
  function DreamSettingsSheet({ open, onOpenChange, draft, onDraftChange, onSave, saving, loading, }) {
207
204
  const sourceIds = splitSourceIds(draft.sourceIdsText);
208
205
  const canSave = draft.schedule.trim().length > 0;
@@ -362,7 +359,6 @@ export default function DreamsRoute() {
362
359
  const inspectedRuns = detail?.inspectedRuns ?? detail?.candidates ?? [];
363
360
  const evidenceItems = detail?.evidence ?? [];
364
361
  const selectedSourceHealth = selectedDream?.sourceHealth ?? [];
365
- const pendingProposalCount = proposals.filter((proposal) => String(proposal.status || "pending").toLowerCase() === "pending").length;
366
362
  const appliedProposalCount = proposals.filter((proposal) => String(proposal.status || "").toLowerCase() === "applied").length;
367
363
  useEffect(() => {
368
364
  if (dreamSettings && !settingsOpen) {
@@ -415,14 +411,14 @@ export default function DreamsRoute() {
415
411
  minCandidateCount: dreamSettings?.minCandidateCount ?? 1,
416
412
  });
417
413
  }
418
- return (_jsx(DispatchShell, { title: "Dreams", description: "Review agent runs, propose memory improvements, and apply evidence-backed learning changes.", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "grid grid-cols-2 gap-2 md:grid-cols-4", children: [_jsx(StatTile, { label: "Dream passes", value: dreams.length, icon: IconBrain }), _jsx(StatTile, { label: "Pending proposals", value: pendingProposalCount, icon: IconCircleDashed }), _jsx(StatTile, { label: "Candidate runs", value: candidates.length, icon: IconClock }), _jsx(StatTile, { label: "Inspected threads", value: selectedDream ? dreamInspectedCount(selectedDream) : 0, icon: IconCheck })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [dreamSettings ? (_jsxs(Badge, { variant: "outline", className: "h-9 max-w-full truncate px-3", children: [dreamSettings.enabled ? "Enabled" : "Paused", " \u00B7", " ", dreamSettings.allSources
414
+ return (_jsx(DispatchShell, { title: "Dreams", description: "Review agent runs, propose memory improvements, and apply evidence-backed learning changes.", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b pb-3", children: [_jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1", children: [dreamSettings ? (_jsxs(Badge, { variant: "outline", className: "max-w-full truncate", children: [dreamSettings.enabled ? "Enabled" : "Paused", " \u00B7", " ", dreamSettings.allSources
419
415
  ? "All sources"
420
- : dreamSettings.sourceId, " ", "\u00B7 ", dreamSettings.schedule] })) : null, _jsx(DreamSettingsSheet, { open: settingsOpen, onOpenChange: handleSettingsOpenChange, draft: settingsDraft, onDraftChange: setSettingsDraft, onSave: saveSettings, saving: saveDreamSettings.isPending, loading: dreamSettingsQuery.isLoading }), _jsxs(Button, { variant: "outline", onClick: () => {
416
+ : dreamSettings.sourceId, " ", "\u00B7 ", dreamSettings.schedule] })) : null, _jsxs("span", { className: "text-xs text-muted-foreground", children: [dreams.length, " passes \u00B7 ", candidates.length, " candidate runs"] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(DreamSettingsSheet, { open: settingsOpen, onOpenChange: handleSettingsOpenChange, draft: settingsDraft, onDraftChange: setSettingsDraft, onSave: saveSettings, saving: saveDreamSettings.isPending, loading: dreamSettingsQuery.isLoading }), _jsxs(Button, { variant: "outline", onClick: () => {
421
417
  dreamsQuery.refetch();
422
418
  candidatesQuery.refetch();
423
419
  if (selectedDreamId)
424
420
  dreamDetailQuery.refetch();
425
- }, children: [_jsx(IconRefresh, { size: 15, className: "mr-1.5" }), "Refresh"] }), _jsxs(Button, { variant: "outline", onClick: ensureSchedule, disabled: ensureDreamSchedule.isPending, children: [ensureDreamSchedule.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconCalendarTime, { size: 15, className: "mr-1.5" })), "Ensure schedule"] }), _jsxs(Button, { variant: "outline", onClick: () => runDream(true), disabled: createDream.isPending, children: [createDream.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconDatabase, { size: 15, className: "mr-1.5" })), "Run all sources"] }), _jsxs(Button, { onClick: () => runDream(false), disabled: createDream.isPending, children: [createDream.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconPlayerPlay, { size: 15, className: "mr-1.5" })), "Run dream"] })] })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2 xl:grid-cols-[280px_minmax(0,1fr)_380px]", children: [_jsxs("section", { className: "rounded-lg bg-card", children: [_jsxs("div", { className: "border-b px-4 py-3", children: [_jsx("div", { className: "text-sm font-semibold text-foreground", children: "Recent passes" }), _jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Reports generated from prior agent activity." })] }), _jsxs("div", { className: "max-h-[720px] overflow-auto p-3", children: [_jsx(QueryState, { error: dreamsQuery.error, label: "Could not load dream passes" }), dreamsQuery.isLoading ? _jsx(DreamListSkeleton, {}) : null, !dreamsQuery.isLoading && !dreamsQuery.error ? (dreams.length > 0 ? (_jsx("div", { className: "space-y-2", children: dreams.map((dream, index) => {
421
+ }, children: [_jsx(IconRefresh, { size: 15, className: "mr-1.5" }), "Refresh"] }), _jsxs(Button, { variant: "outline", onClick: ensureSchedule, disabled: ensureDreamSchedule.isPending, children: [ensureDreamSchedule.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconCalendarTime, { size: 15, className: "mr-1.5" })), "Ensure schedule"] }), _jsxs(Button, { variant: "outline", onClick: () => runDream(true), disabled: createDream.isPending, children: [createDream.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconDatabase, { size: 15, className: "mr-1.5" })), "Run all sources"] }), _jsxs(Button, { onClick: () => runDream(false), disabled: createDream.isPending, children: [createDream.isPending ? (_jsx(Spinner, { className: "mr-1.5 size-3.5" })) : (_jsx(IconPlayerPlay, { size: 15, className: "mr-1.5" })), "Run dream"] })] })] }), _jsxs("div", { className: "grid gap-4 lg:grid-cols-[280px_minmax(0,1fr)]", children: [_jsxs("section", { className: "min-w-0 rounded-lg bg-card", children: [_jsxs("div", { className: "border-b px-4 py-3", children: [_jsx("div", { className: "text-sm font-semibold text-foreground", children: "Recent passes" }), _jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Reports generated from prior agent activity." })] }), _jsxs("div", { className: "max-h-[720px] overflow-auto p-3", children: [_jsx(QueryState, { error: dreamsQuery.error, label: "Could not load dream passes" }), dreamsQuery.isLoading ? _jsx(DreamListSkeleton, {}) : null, !dreamsQuery.isLoading && !dreamsQuery.error ? (dreams.length > 0 ? (_jsx("div", { className: "space-y-2", children: dreams.map((dream, index) => {
426
422
  const selected = dream.id === selectedDreamId;
427
423
  return (_jsxs("button", { type: "button", onClick: () => selectDream(dream.id), className: cn("w-full rounded-lg border px-3 py-3 text-left transition-colors", selected
428
424
  ? "border-foreground bg-muted"
@@ -445,15 +441,15 @@ export default function DreamsRoute() {
445
441
  }), onReject: (reason) => rejectProposal.mutate({
446
442
  id: proposal.id,
447
443
  reason,
448
- }) }, proposal.id))) })) : (_jsx(EmptyPanel, { title: "No proposals", description: "This dream did not produce reviewable memory, skill, job, or instruction changes." })) }), _jsx(TabsContent, { value: "report", className: "mt-4", children: detail?.report || detail?.summary ? (_jsx(RawBlock, { value: detail.report || detail.summary || "" })) : (_jsx(EmptyPanel, { title: "No report text", description: "The dream detail action did not return a report body." })) }), _jsxs(TabsContent, { value: "sources", className: "mt-4", children: [selectedSourceHealth.length > 0 ? (_jsx("div", { className: "mb-4", children: _jsx(SourceHealthPanel, { sources: selectedSourceHealth }) })) : null, inspectedRuns.length > 0 || evidenceItems.length ? (_jsxs(Accordion, { type: "multiple", className: "rounded-lg border", children: [inspectedRuns.map((run, index) => (_jsxs(AccordionItem, { value: candidateId(run) || `run-${index}`, className: "px-4", children: [_jsx(AccordionTrigger, { className: "text-sm hover:no-underline", children: _jsx("span", { className: "min-w-0 truncate text-left", children: candidateLabel(run) }) }), _jsxs(AccordionContent, { className: "pb-4", children: [_jsxs("div", { className: "grid gap-2 text-xs text-muted-foreground sm:grid-cols-2", children: [_jsxs("div", { children: ["Thread:", " ", _jsx("span", { className: "font-mono text-foreground", children: run.thread?.id ?? run.threadId ?? "n/a" })] }), _jsxs("div", { children: ["Run:", " ", _jsx("span", { className: "font-mono text-foreground", children: run.runId ?? run.id })] }), _jsxs("div", { children: ["Owner: ", candidateOwner(run)] }), _jsxs("div", { children: ["Status: ", candidateStatus(run)] })] }), candidateSignals(run).length > 0 ? (_jsx("div", { className: "mt-3 flex flex-wrap gap-1.5", children: candidateSignals(run).map((signal) => (_jsx(Badge, { variant: "outline", children: signal }, signal))) })) : null] })] }, candidateId(run)))), evidenceItems.map((item, index) => (_jsxs(AccordionItem, { value: item.id || `evidence-${index}`, className: "px-4", children: [_jsx(AccordionTrigger, { className: "text-sm hover:no-underline", children: evidenceLabel(item, index) }), _jsx(AccordionContent, { className: "pb-4", children: _jsx(RawBlock, { value: item }) })] }, item.id || `evidence-${index}`)))] })) : (_jsx(EmptyPanel, { title: "No source runs", description: "This dream has no structured source list yet." }))] })] })) : null] })] }), _jsxs("section", { className: "rounded-lg bg-card", children: [_jsx("div", { className: "border-b px-4 py-3", children: _jsxs("div", { children: [_jsx("div", { className: "text-sm font-semibold text-foreground", children: "Candidate runs" }), _jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Grounded signals ready for review." })] }) }), _jsxs("div", { className: "max-h-[720px] overflow-auto p-3", children: [_jsx(QueryState, { error: candidatesQuery.error, label: "Could not load candidates" }), candidatesQuery.isLoading ? _jsx(DreamListSkeleton, {}) : null, !candidatesQuery.isLoading &&
449
- !candidatesQuery.error &&
450
- candidateSourceHealth.length > 0 ? (_jsx("div", { className: "mb-3", children: _jsx(SourceHealthPanel, { sources: candidateSourceHealth }) })) : null, !candidatesQuery.isLoading && !candidatesQuery.error ? (candidates.length > 0 ? (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Run" }), _jsx(TableHead, { children: "Signals" }), _jsx(TableHead, { className: "w-20 text-right", children: "Score" })] }) }), _jsx(TableBody, { children: candidates.map((candidate) => {
451
- const id = candidateId(candidate);
452
- const signals = candidateSignals(candidate);
453
- return (_jsxs(TableRow, { children: [_jsxs(TableCell, { className: "min-w-0 py-3", children: [_jsx("div", { className: "max-w-[230px] truncate text-sm font-medium text-foreground", children: candidateLabel(candidate) }), _jsx("div", { className: "mt-1 truncate font-mono text-[11px] text-muted-foreground", children: candidate.thread?.id ??
454
- candidate.threadId ??
455
- candidate.runId ??
456
- id }), _jsxs("div", { className: "mt-1 text-[11px] text-muted-foreground", children: [candidateOwner(candidate), " \u00B7", " ", compactDate(candidateUpdatedAt(candidate))] })] }), _jsx(TableCell, { className: "py-3", children: _jsxs("div", { className: "mt-1 flex flex-wrap gap-1", children: [_jsx(Badge, { variant: "outline", children: candidateStatus(candidate) }), signals.slice(0, 2).map((signal) => (_jsx(Badge, { variant: "secondary", children: signal }, signal)))] }) }), _jsx(TableCell, { className: "py-3 text-right text-sm tabular-nums text-muted-foreground", children: candidate.score ?? "n/a" })] }, id));
457
- }) })] })) : (_jsx(EmptyPanel, { title: "No candidates", description: "No recent runs matched the dream candidate heuristics." }))) : null] })] })] })] }) }));
444
+ }) }, proposal.id))) })) : (_jsx(EmptyPanel, { title: "No proposals", description: "This dream did not produce reviewable memory, skill, job, or instruction changes." })) }), _jsx(TabsContent, { value: "report", className: "mt-4", children: detail?.report || detail?.summary ? (_jsx(RawBlock, { value: detail.report || detail.summary || "" })) : (_jsx(EmptyPanel, { title: "No report text", description: "The dream detail action did not return a report body." })) }), _jsxs(TabsContent, { value: "sources", className: "mt-4", children: [selectedSourceHealth.length > 0 ? (_jsx("div", { className: "mb-4", children: _jsx(SourceHealthPanel, { sources: selectedSourceHealth }) })) : null, inspectedRuns.length > 0 || evidenceItems.length ? (_jsxs(Accordion, { type: "multiple", className: "rounded-lg border", children: [inspectedRuns.map((run, index) => (_jsxs(AccordionItem, { value: candidateId(run) || `run-${index}`, className: "px-4", children: [_jsx(AccordionTrigger, { className: "text-sm hover:no-underline", children: _jsx("span", { className: "min-w-0 truncate text-left", children: candidateLabel(run) }) }), _jsxs(AccordionContent, { className: "pb-4", children: [_jsxs("div", { className: "grid gap-2 text-xs text-muted-foreground sm:grid-cols-2", children: [_jsxs("div", { children: ["Thread:", " ", _jsx("span", { className: "font-mono text-foreground", children: run.thread?.id ?? run.threadId ?? "n/a" })] }), _jsxs("div", { children: ["Run:", " ", _jsx("span", { className: "font-mono text-foreground", children: run.runId ?? run.id })] }), _jsxs("div", { children: ["Owner: ", candidateOwner(run)] }), _jsxs("div", { children: ["Status: ", candidateStatus(run)] })] }), candidateSignals(run).length > 0 ? (_jsx("div", { className: "mt-3 flex flex-wrap gap-1.5", children: candidateSignals(run).map((signal) => (_jsx(Badge, { variant: "outline", children: signal }, signal))) })) : null] })] }, candidateId(run)))), evidenceItems.map((item, index) => (_jsxs(AccordionItem, { value: item.id || `evidence-${index}`, className: "px-4", children: [_jsx(AccordionTrigger, { className: "text-sm hover:no-underline", children: evidenceLabel(item, index) }), _jsx(AccordionContent, { className: "pb-4", children: _jsx(RawBlock, { value: item }) })] }, item.id || `evidence-${index}`)))] })) : (_jsx(EmptyPanel, { title: "No source runs", description: "This dream has no structured source list yet." }))] })] })) : null] })] })] }), _jsxs("section", { className: "min-w-0 rounded-lg bg-card", children: [_jsx("div", { className: "border-b px-4 py-3", children: _jsxs("div", { children: [_jsx("div", { className: "text-sm font-semibold text-foreground", children: "Candidate runs" }), _jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Grounded signals ready for review." })] }) }), _jsxs("div", { className: "max-h-[720px] overflow-auto p-3", children: [_jsx(QueryState, { error: candidatesQuery.error, label: "Could not load candidates" }), candidatesQuery.isLoading ? _jsx(DreamListSkeleton, {}) : null, !candidatesQuery.isLoading &&
445
+ !candidatesQuery.error &&
446
+ candidateSourceHealth.length > 0 ? (_jsx("div", { className: "mb-3", children: _jsx(SourceHealthPanel, { sources: candidateSourceHealth }) })) : null, !candidatesQuery.isLoading && !candidatesQuery.error ? (candidates.length > 0 ? (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Run" }), _jsx(TableHead, { children: "Signals" }), _jsx(TableHead, { className: "w-20 text-right", children: "Score" })] }) }), _jsx(TableBody, { children: candidates.map((candidate) => {
447
+ const id = candidateId(candidate);
448
+ const signals = candidateSignals(candidate);
449
+ return (_jsxs(TableRow, { children: [_jsxs(TableCell, { className: "min-w-0 py-3", children: [_jsx("div", { className: "max-w-[230px] truncate text-sm font-medium text-foreground", children: candidateLabel(candidate) }), _jsx("div", { className: "mt-1 truncate font-mono text-[11px] text-muted-foreground", children: candidate.thread?.id ??
450
+ candidate.threadId ??
451
+ candidate.runId ??
452
+ id }), _jsxs("div", { className: "mt-1 text-[11px] text-muted-foreground", children: [candidateOwner(candidate), " \u00B7", " ", compactDate(candidateUpdatedAt(candidate))] })] }), _jsx(TableCell, { className: "py-3", children: _jsxs("div", { className: "mt-1 flex flex-wrap gap-1", children: [_jsx(Badge, { variant: "outline", children: candidateStatus(candidate) }), signals.slice(0, 2).map((signal) => (_jsx(Badge, { variant: "secondary", children: signal }, signal)))] }) }), _jsx(TableCell, { className: "py-3 text-right text-sm tabular-nums text-muted-foreground", children: candidate.score ?? "n/a" })] }, id));
453
+ }) })] })) : (_jsx(EmptyPanel, { title: "No candidates", description: "No recent runs matched the dream candidate heuristics." }))) : null] })] })] }) }));
458
454
  }
459
455
  //# sourceMappingURL=dreams.js.map