@contractspec/example.agent-console 3.8.14 → 3.8.16

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 (61) hide show
  1. package/.turbo/turbo-build.log +49 -36
  2. package/CHANGELOG.md +38 -0
  3. package/README.md +2 -0
  4. package/dist/agent/agent.handler.d.ts +1 -1
  5. package/dist/agent.feature.js +1 -1
  6. package/dist/browser/agent.feature.js +1 -1
  7. package/dist/browser/index.js +11 -11
  8. package/dist/browser/ui/AgentConsolePreview.data.js +1 -0
  9. package/dist/browser/ui/AgentConsolePreview.js +1 -0
  10. package/dist/browser/ui/AgentConsolePreviewPanels.js +1 -0
  11. package/dist/browser/ui/AgentConsolePreviewTable.js +1 -0
  12. package/dist/browser/ui/AgentDashboard.js +1 -1
  13. package/dist/browser/ui/AgentDashboard.visualizations.js +1 -1
  14. package/dist/browser/ui/ExecutionConsoleHost.js +1 -1
  15. package/dist/browser/ui/index.js +5 -5
  16. package/dist/browser/ui/renderers/dashboard.markdown.js +2 -2
  17. package/dist/browser/ui/renderers/index.js +4 -4
  18. package/dist/browser/visualizations/index.js +1 -1
  19. package/dist/browser/visualizations/selectors.js +1 -1
  20. package/dist/index.js +11 -11
  21. package/dist/node/agent.feature.js +1 -1
  22. package/dist/node/index.js +11 -11
  23. package/dist/node/ui/AgentConsolePreview.data.js +1 -0
  24. package/dist/node/ui/AgentConsolePreview.js +1 -0
  25. package/dist/node/ui/AgentConsolePreviewPanels.js +1 -0
  26. package/dist/node/ui/AgentConsolePreviewTable.js +1 -0
  27. package/dist/node/ui/AgentDashboard.js +1 -1
  28. package/dist/node/ui/AgentDashboard.visualizations.js +1 -1
  29. package/dist/node/ui/ExecutionConsoleHost.js +1 -1
  30. package/dist/node/ui/index.js +5 -5
  31. package/dist/node/ui/renderers/dashboard.markdown.js +2 -2
  32. package/dist/node/ui/renderers/index.js +4 -4
  33. package/dist/node/visualizations/index.js +1 -1
  34. package/dist/node/visualizations/selectors.js +1 -1
  35. package/dist/tool/tool.handler.d.ts +1 -1
  36. package/dist/ui/AgentConsolePreview.d.ts +8 -0
  37. package/dist/ui/AgentConsolePreview.data.d.ts +30 -0
  38. package/dist/ui/AgentConsolePreview.data.js +2 -0
  39. package/dist/ui/AgentConsolePreview.js +2 -0
  40. package/dist/ui/AgentConsolePreviewPanels.d.ts +18 -0
  41. package/dist/ui/AgentConsolePreviewPanels.js +2 -0
  42. package/dist/ui/AgentConsolePreviewTable.d.ts +4 -0
  43. package/dist/ui/AgentConsolePreviewTable.js +2 -0
  44. package/dist/ui/AgentDashboard.js +1 -1
  45. package/dist/ui/AgentDashboard.visualizations.js +1 -1
  46. package/dist/ui/ExecutionConsoleHost.js +1 -1
  47. package/dist/ui/index.d.ts +1 -0
  48. package/dist/ui/index.js +5 -5
  49. package/dist/ui/renderers/dashboard.markdown.js +2 -2
  50. package/dist/ui/renderers/index.js +4 -4
  51. package/dist/visualizations/index.js +1 -1
  52. package/dist/visualizations/selectors.d.ts +10 -2
  53. package/dist/visualizations/selectors.js +1 -1
  54. package/package.json +67 -10
  55. package/src/ui/AgentConsolePreview.data.ts +74 -0
  56. package/src/ui/AgentConsolePreview.tsx +124 -0
  57. package/src/ui/AgentConsolePreviewPanels.tsx +159 -0
  58. package/src/ui/AgentConsolePreviewTable.tsx +109 -0
  59. package/src/ui/ExecutionConsoleHost.tsx +2 -2
  60. package/src/ui/index.ts +2 -0
  61. package/src/visualizations/selectors.ts +10 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/example.agent-console",
3
- "version": "3.8.14",
3
+ "version": "3.8.16",
4
4
  "description": "Agent Console example - AI agent orchestration with tools, runs, and logs",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -306,6 +306,34 @@
306
306
  "node": "./dist/node/ui/index.js",
307
307
  "default": "./dist/ui/index.js"
308
308
  },
309
+ "./ui/AgentConsolePreview": {
310
+ "types": "./dist/ui/AgentConsolePreview.d.ts",
311
+ "browser": "./dist/browser/ui/AgentConsolePreview.js",
312
+ "bun": "./dist/ui/AgentConsolePreview.js",
313
+ "node": "./dist/node/ui/AgentConsolePreview.js",
314
+ "default": "./dist/ui/AgentConsolePreview.js"
315
+ },
316
+ "./ui/AgentConsolePreview.data": {
317
+ "types": "./dist/ui/AgentConsolePreview.data.d.ts",
318
+ "browser": "./dist/browser/ui/AgentConsolePreview.data.js",
319
+ "bun": "./dist/ui/AgentConsolePreview.data.js",
320
+ "node": "./dist/node/ui/AgentConsolePreview.data.js",
321
+ "default": "./dist/ui/AgentConsolePreview.data.js"
322
+ },
323
+ "./ui/AgentConsolePreviewPanels": {
324
+ "types": "./dist/ui/AgentConsolePreviewPanels.d.ts",
325
+ "browser": "./dist/browser/ui/AgentConsolePreviewPanels.js",
326
+ "bun": "./dist/ui/AgentConsolePreviewPanels.js",
327
+ "node": "./dist/node/ui/AgentConsolePreviewPanels.js",
328
+ "default": "./dist/ui/AgentConsolePreviewPanels.js"
329
+ },
330
+ "./ui/AgentConsolePreviewTable": {
331
+ "types": "./dist/ui/AgentConsolePreviewTable.d.ts",
332
+ "browser": "./dist/browser/ui/AgentConsolePreviewTable.js",
333
+ "bun": "./dist/ui/AgentConsolePreviewTable.js",
334
+ "node": "./dist/node/ui/AgentConsolePreviewTable.js",
335
+ "default": "./dist/ui/AgentConsolePreviewTable.js"
336
+ },
309
337
  "./ui/AgentDashboard": {
310
338
  "types": "./dist/ui/AgentDashboard.d.ts",
311
339
  "browser": "./dist/browser/ui/AgentDashboard.js",
@@ -543,19 +571,20 @@
543
571
  },
544
572
  "dependencies": {
545
573
  "@contractspec/lib.schema": "3.7.14",
546
- "@contractspec/lib.contracts-spec": "5.5.0",
547
- "@contractspec/lib.example-shared-ui": "6.0.22",
548
- "@contractspec/lib.design-system": "3.11.0",
549
- "@contractspec/lib.runtime-sandbox": "2.7.15",
550
- "@contractspec/lib.ui-kit-web": "3.10.3",
551
- "@contractspec/module.execution-console": "0.1.5",
574
+ "@contractspec/lib.contracts-spec": "5.5.1",
575
+ "@contractspec/lib.example-shared-ui": "7.0.1",
576
+ "@contractspec/lib.design-system": "3.11.2",
577
+ "@contractspec/lib.presentation-runtime-react": "38.0.2",
578
+ "@contractspec/lib.runtime-sandbox": "3.0.1",
579
+ "@contractspec/lib.ui-kit-web": "3.11.1",
580
+ "@contractspec/module.execution-console": "0.1.7",
552
581
  "react": "19.2.0",
553
582
  "react-dom": "19.2.0",
554
- "@contractspec/lib.presentation-runtime-core": "5.0.0"
583
+ "@contractspec/lib.presentation-runtime-core": "5.0.2"
555
584
  },
556
585
  "devDependencies": {
557
- "@contractspec/lib.harness": "0.2.14",
558
- "@contractspec/tool.bun": "3.7.15",
586
+ "@contractspec/lib.harness": "0.2.15",
587
+ "@contractspec/tool.bun": "3.7.17",
559
588
  "@contractspec/tool.typescript": "3.7.13",
560
589
  "@types/react": "^19.2.14",
561
590
  "@types/react-dom": "^19.2.2",
@@ -865,6 +894,34 @@
865
894
  "node": "./dist/node/ui/index.js",
866
895
  "default": "./dist/ui/index.js"
867
896
  },
897
+ "./ui/AgentConsolePreview": {
898
+ "types": "./dist/ui/AgentConsolePreview.d.ts",
899
+ "browser": "./dist/browser/ui/AgentConsolePreview.js",
900
+ "bun": "./dist/ui/AgentConsolePreview.js",
901
+ "node": "./dist/node/ui/AgentConsolePreview.js",
902
+ "default": "./dist/ui/AgentConsolePreview.js"
903
+ },
904
+ "./ui/AgentConsolePreview.data": {
905
+ "types": "./dist/ui/AgentConsolePreview.data.d.ts",
906
+ "browser": "./dist/browser/ui/AgentConsolePreview.data.js",
907
+ "bun": "./dist/ui/AgentConsolePreview.data.js",
908
+ "node": "./dist/node/ui/AgentConsolePreview.data.js",
909
+ "default": "./dist/ui/AgentConsolePreview.data.js"
910
+ },
911
+ "./ui/AgentConsolePreviewPanels": {
912
+ "types": "./dist/ui/AgentConsolePreviewPanels.d.ts",
913
+ "browser": "./dist/browser/ui/AgentConsolePreviewPanels.js",
914
+ "bun": "./dist/ui/AgentConsolePreviewPanels.js",
915
+ "node": "./dist/node/ui/AgentConsolePreviewPanels.js",
916
+ "default": "./dist/ui/AgentConsolePreviewPanels.js"
917
+ },
918
+ "./ui/AgentConsolePreviewTable": {
919
+ "types": "./dist/ui/AgentConsolePreviewTable.d.ts",
920
+ "browser": "./dist/browser/ui/AgentConsolePreviewTable.js",
921
+ "bun": "./dist/ui/AgentConsolePreviewTable.js",
922
+ "node": "./dist/node/ui/AgentConsolePreviewTable.js",
923
+ "default": "./dist/ui/AgentConsolePreviewTable.js"
924
+ },
868
925
  "./ui/AgentDashboard": {
869
926
  "types": "./dist/ui/AgentDashboard.d.ts",
870
927
  "browser": "./dist/browser/ui/AgentDashboard.js",
@@ -0,0 +1,74 @@
1
+ import { MOCK_AGENTS } from '../shared/mock-agents';
2
+ import { MOCK_RUNS } from '../shared/mock-runs';
3
+ import { MOCK_TOOLS } from '../shared/mock-tools';
4
+
5
+ export type AgentConsolePreviewAgent = (typeof MOCK_AGENTS)[number];
6
+ export type AgentConsolePreviewRun = (typeof MOCK_RUNS)[number];
7
+ export type AgentConsolePreviewTool = (typeof MOCK_TOOLS)[number];
8
+ export type AgentConsolePreviewTab = 'runs' | 'agents' | 'tools' | 'metrics';
9
+
10
+ export const AGENT_CONSOLE_PREVIEW_TABS: readonly {
11
+ id: AgentConsolePreviewTab;
12
+ label: string;
13
+ icon: string;
14
+ }[] = [
15
+ { id: 'runs', label: 'Runs', icon: '▶' },
16
+ { id: 'agents', label: 'Agents', icon: '🤖' },
17
+ { id: 'tools', label: 'Tools', icon: '🔧' },
18
+ { id: 'metrics', label: 'Metrics', icon: '📊' },
19
+ ];
20
+
21
+ export function createAgentConsolePreviewMetrics(
22
+ runs: readonly AgentConsolePreviewRun[]
23
+ ) {
24
+ const completedRuns = runs.filter((run) => run.status === 'COMPLETED').length;
25
+ const totalTokens = runs.reduce((sum, run) => sum + run.totalTokens, 0);
26
+ const totalCostUsd = runs.reduce(
27
+ (sum, run) => sum + (run.estimatedCostUsd ?? 0),
28
+ 0
29
+ );
30
+ const durations = runs
31
+ .map((run) => run.durationMs)
32
+ .filter((duration): duration is number => typeof duration === 'number');
33
+
34
+ return {
35
+ averageDurationMs:
36
+ durations.length > 0
37
+ ? durations.reduce((sum, duration) => sum + duration, 0) /
38
+ durations.length
39
+ : 0,
40
+ completedRuns,
41
+ successRate: runs.length > 0 ? completedRuns / runs.length : 0,
42
+ totalCostUsd,
43
+ totalRuns: runs.length,
44
+ totalTokens,
45
+ };
46
+ }
47
+
48
+ export function formatAgentConsoleTokens(tokens: number): string {
49
+ if (tokens < 1000) return tokens.toString();
50
+ if (tokens < 1_000_000) return `${(tokens / 1000).toFixed(1)}K`;
51
+ return `${(tokens / 1_000_000).toFixed(2)}M`;
52
+ }
53
+
54
+ export function formatAgentConsoleDuration(ms?: number): string {
55
+ if (!ms) return '-';
56
+ if (ms < 1000) return `${ms}ms`;
57
+ if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
58
+ return `${(ms / 60_000).toFixed(1)}m`;
59
+ }
60
+
61
+ export function formatAgentConsoleDate(value: Date): string {
62
+ return new Intl.DateTimeFormat('en-US', {
63
+ dateStyle: 'medium',
64
+ timeStyle: 'short',
65
+ }).format(value);
66
+ }
67
+
68
+ export function getAgentConsolePressProps(handler: () => void) {
69
+ if (typeof document === 'undefined') {
70
+ return { onPress: handler };
71
+ }
72
+
73
+ return { onClick: handler };
74
+ }
@@ -0,0 +1,124 @@
1
+ 'use client';
2
+
3
+ import { createVisualizationModel } from '@contractspec/lib.presentation-runtime-core';
4
+ import { Button } from '@contractspec/lib.ui-kit-web/ui/button';
5
+ import {
6
+ Card,
7
+ CardContent,
8
+ CardDescription,
9
+ CardHeader,
10
+ CardTitle,
11
+ } from '@contractspec/lib.ui-kit-web/ui/card';
12
+ import { HStack, VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
13
+ import { Text } from '@contractspec/lib.ui-kit-web/ui/text';
14
+ import { Visualization } from '@contractspec/lib.ui-kit-web/ui/visualization';
15
+ import { useMemo, useState } from 'react';
16
+ import { MOCK_AGENTS } from '../shared/mock-agents';
17
+ import { MOCK_RUNS } from '../shared/mock-runs';
18
+ import { MOCK_TOOLS } from '../shared/mock-tools';
19
+ import { createAgentVisualizationItems } from '../visualizations';
20
+ import {
21
+ AGENT_CONSOLE_PREVIEW_TABS,
22
+ type AgentConsolePreviewAgent,
23
+ type AgentConsolePreviewRun,
24
+ type AgentConsolePreviewTab,
25
+ type AgentConsolePreviewTool,
26
+ createAgentConsolePreviewMetrics,
27
+ getAgentConsolePressProps,
28
+ } from './AgentConsolePreview.data';
29
+ import {
30
+ AgentConsoleAgentCards,
31
+ AgentConsoleMetricCards,
32
+ AgentConsoleMetricsPanel,
33
+ AgentConsoleToolCards,
34
+ } from './AgentConsolePreviewPanels';
35
+ import { AgentConsoleRunHistoryTable } from './AgentConsolePreviewTable';
36
+
37
+ export interface AgentConsolePreviewProps {
38
+ agents?: readonly AgentConsolePreviewAgent[];
39
+ runs?: readonly AgentConsolePreviewRun[];
40
+ showHeaderAction?: boolean;
41
+ tools?: readonly AgentConsolePreviewTool[];
42
+ }
43
+
44
+ export function AgentConsolePreview({
45
+ agents = MOCK_AGENTS,
46
+ runs = MOCK_RUNS,
47
+ showHeaderAction = true,
48
+ tools = MOCK_TOOLS,
49
+ }: AgentConsolePreviewProps) {
50
+ const [activeTab, setActiveTab] = useState<AgentConsolePreviewTab>('runs');
51
+ const metrics = useMemo(() => createAgentConsolePreviewMetrics(runs), [runs]);
52
+ const visualizationItems = useMemo(
53
+ () => createAgentVisualizationItems(runs),
54
+ [runs]
55
+ );
56
+
57
+ return (
58
+ <VStack gap="xl" align="stretch">
59
+ <HStack justify="between" align="center" className="gap-3">
60
+ <Text className="font-bold text-2xl">AI Agent Console</Text>
61
+ {showHeaderAction ? (
62
+ <Button {...getAgentConsolePressProps(() => undefined)}>
63
+ <Text>+ New Agent</Text>
64
+ </Button>
65
+ ) : null}
66
+ </HStack>
67
+
68
+ <AgentConsoleMetricCards metrics={metrics} />
69
+ <VStack gap="md">
70
+ <VStack gap="xs">
71
+ <Text className="font-semibold text-lg">
72
+ Operational Visualizations
73
+ </Text>
74
+ <Text className="text-muted-foreground text-sm">
75
+ Contract-backed charts derived from recent run activity.
76
+ </Text>
77
+ </VStack>
78
+ <VStack gap="md">
79
+ {visualizationItems.map((item) => (
80
+ <Card key={item.key}>
81
+ <CardHeader>
82
+ <CardTitle>{item.title}</CardTitle>
83
+ <CardDescription>{item.description}</CardDescription>
84
+ </CardHeader>
85
+ <CardContent>
86
+ <Visualization
87
+ height={item.height}
88
+ model={createVisualizationModel(item.spec, item.data)}
89
+ />
90
+ </CardContent>
91
+ </Card>
92
+ ))}
93
+ </VStack>
94
+ </VStack>
95
+
96
+ <HStack className="rounded-lg bg-muted p-1" gap="xs">
97
+ {AGENT_CONSOLE_PREVIEW_TABS.map((tab) => (
98
+ <Button
99
+ key={tab.id}
100
+ size="sm"
101
+ variant={activeTab === tab.id ? 'secondary' : 'ghost'}
102
+ className="flex-1"
103
+ {...getAgentConsolePressProps(() => setActiveTab(tab.id))}
104
+ >
105
+ <Text>
106
+ {tab.icon} {tab.label}
107
+ </Text>
108
+ </Button>
109
+ ))}
110
+ </HStack>
111
+
112
+ {activeTab === 'runs' ? (
113
+ <AgentConsoleRunHistoryTable runs={runs} />
114
+ ) : null}
115
+ {activeTab === 'agents' ? (
116
+ <AgentConsoleAgentCards agents={agents} />
117
+ ) : null}
118
+ {activeTab === 'tools' ? <AgentConsoleToolCards tools={tools} /> : null}
119
+ {activeTab === 'metrics' ? (
120
+ <AgentConsoleMetricsPanel metrics={metrics} />
121
+ ) : null}
122
+ </VStack>
123
+ );
124
+ }
@@ -0,0 +1,159 @@
1
+ 'use client';
2
+
3
+ import { Badge } from '@contractspec/lib.ui-kit-web/ui/badge';
4
+ import {
5
+ Card,
6
+ CardContent,
7
+ CardHeader,
8
+ CardTitle,
9
+ } from '@contractspec/lib.ui-kit-web/ui/card';
10
+ import { HStack, VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
11
+ import { Text } from '@contractspec/lib.ui-kit-web/ui/text';
12
+ import type {
13
+ AgentConsolePreviewAgent,
14
+ AgentConsolePreviewTool,
15
+ createAgentConsolePreviewMetrics,
16
+ } from './AgentConsolePreview.data';
17
+ import { formatAgentConsoleTokens } from './AgentConsolePreview.data';
18
+
19
+ type PreviewMetrics = ReturnType<typeof createAgentConsolePreviewMetrics>;
20
+
21
+ export function AgentConsoleMetricCards({
22
+ metrics,
23
+ }: {
24
+ metrics: PreviewMetrics;
25
+ }) {
26
+ const stats = [
27
+ {
28
+ label: 'Total Runs',
29
+ value: String(metrics.totalRuns),
30
+ hint: `${Math.round(metrics.successRate * 100)}% success`,
31
+ },
32
+ {
33
+ label: 'Success Rate',
34
+ value: `${Math.round(metrics.successRate * 100)}%`,
35
+ hint: 'of all runs',
36
+ },
37
+ {
38
+ label: 'Total Tokens',
39
+ value: formatAgentConsoleTokens(metrics.totalTokens),
40
+ hint: 'This period',
41
+ },
42
+ {
43
+ label: 'Total Cost',
44
+ value: `$${metrics.totalCostUsd.toFixed(2)}`,
45
+ hint: 'This period',
46
+ },
47
+ ];
48
+
49
+ return (
50
+ <HStack gap="md" className="flex-wrap">
51
+ {stats.map((stat) => (
52
+ <Card key={stat.label} className="min-w-52 flex-1">
53
+ <CardContent className="flex flex-col gap-1 pt-6">
54
+ <Text className="text-muted-foreground text-sm">{stat.label}</Text>
55
+ <Text className="font-bold text-2xl">{stat.value}</Text>
56
+ <Text className="text-muted-foreground text-sm">{stat.hint}</Text>
57
+ </CardContent>
58
+ </Card>
59
+ ))}
60
+ </HStack>
61
+ );
62
+ }
63
+
64
+ export function AgentConsoleAgentCards({
65
+ agents,
66
+ }: {
67
+ agents: readonly AgentConsolePreviewAgent[];
68
+ }) {
69
+ return (
70
+ <VStack gap="md">
71
+ {agents.map((agent) => (
72
+ <Card key={agent.id}>
73
+ <CardContent className="flex flex-col gap-2 pt-6">
74
+ <HStack justify="between" align="start">
75
+ <VStack gap="xs" className="flex-1">
76
+ <Text className="font-semibold text-lg">{agent.name}</Text>
77
+ <Text className="text-muted-foreground text-sm">
78
+ {agent.modelProvider} / {agent.modelName}
79
+ </Text>
80
+ </VStack>
81
+ <AgentConsoleStatusBadge status={agent.status} />
82
+ </HStack>
83
+ <Text className="text-muted-foreground text-sm">
84
+ {agent.description}
85
+ </Text>
86
+ </CardContent>
87
+ </Card>
88
+ ))}
89
+ </VStack>
90
+ );
91
+ }
92
+
93
+ export function AgentConsoleToolCards({
94
+ tools,
95
+ }: {
96
+ tools: readonly AgentConsolePreviewTool[];
97
+ }) {
98
+ return (
99
+ <VStack gap="md">
100
+ {tools.map((tool) => (
101
+ <Card key={tool.id}>
102
+ <CardContent className="flex flex-col gap-2 pt-6">
103
+ <HStack justify="between" align="start">
104
+ <VStack gap="xs" className="flex-1">
105
+ <Text className="font-semibold text-lg">{tool.name}</Text>
106
+ <Text className="text-muted-foreground text-sm">
107
+ {tool.category} / {tool.implementationType}
108
+ </Text>
109
+ </VStack>
110
+ <AgentConsoleStatusBadge status={tool.status} />
111
+ </HStack>
112
+ <Text className="text-muted-foreground text-sm">
113
+ {tool.description}
114
+ </Text>
115
+ </CardContent>
116
+ </Card>
117
+ ))}
118
+ </VStack>
119
+ );
120
+ }
121
+
122
+ export function AgentConsoleMetricsPanel({
123
+ metrics,
124
+ }: {
125
+ metrics: PreviewMetrics;
126
+ }) {
127
+ return (
128
+ <VStack gap="md">
129
+ <Text className="font-semibold text-lg">Usage Analytics</Text>
130
+ <Card>
131
+ <CardHeader>
132
+ <CardTitle>Run Outcomes</CardTitle>
133
+ </CardHeader>
134
+ <CardContent className="flex flex-col gap-3">
135
+ <Text>Completed: {metrics.completedRuns}</Text>
136
+ <Text>Failed: {metrics.totalRuns - metrics.completedRuns}</Text>
137
+ <Text>
138
+ Average duration: {(metrics.averageDurationMs / 1000).toFixed(1)}s
139
+ </Text>
140
+ </CardContent>
141
+ </Card>
142
+ </VStack>
143
+ );
144
+ }
145
+
146
+ export function AgentConsoleStatusBadge({ status }: { status: string }) {
147
+ const variant =
148
+ status === 'FAILED' || status === 'CANCELLED'
149
+ ? 'destructive'
150
+ : status === 'ACTIVE' || status === 'COMPLETED'
151
+ ? 'secondary'
152
+ : 'outline';
153
+
154
+ return (
155
+ <Badge variant={variant}>
156
+ <Text className="font-semibold text-xs">{status}</Text>
157
+ </Badge>
158
+ );
159
+ }
@@ -0,0 +1,109 @@
1
+ 'use client';
2
+
3
+ import {
4
+ type ContractTableColumnDef,
5
+ useContractTable,
6
+ } from '@contractspec/lib.presentation-runtime-react';
7
+ import { Card, CardContent } from '@contractspec/lib.ui-kit-web/ui/card';
8
+ import { DataTable } from '@contractspec/lib.ui-kit-web/ui/data-table';
9
+ import { VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
10
+ import { Text } from '@contractspec/lib.ui-kit-web/ui/text';
11
+ import { useMemo } from 'react';
12
+ import {
13
+ type AgentConsolePreviewRun,
14
+ formatAgentConsoleDate,
15
+ formatAgentConsoleDuration,
16
+ formatAgentConsoleTokens,
17
+ } from './AgentConsolePreview.data';
18
+ import { AgentConsoleStatusBadge } from './AgentConsolePreviewPanels';
19
+
20
+ export function AgentConsoleRunHistoryTable({
21
+ runs,
22
+ }: {
23
+ runs: readonly AgentConsolePreviewRun[];
24
+ }) {
25
+ const columns = useMemo<ContractTableColumnDef<AgentConsolePreviewRun>[]>(
26
+ () => [
27
+ {
28
+ id: 'queuedAt',
29
+ header: 'Run',
30
+ label: 'Run',
31
+ accessor: (run) => run.queuedAt.getTime(),
32
+ cell: ({ item }) => (
33
+ <VStack gap="xs">
34
+ <Text className="font-mono text-sm">{item.id}</Text>
35
+ <Text className="text-muted-foreground text-xs">
36
+ {formatAgentConsoleDate(item.queuedAt)}
37
+ </Text>
38
+ </VStack>
39
+ ),
40
+ size: 180,
41
+ canSort: true,
42
+ canHide: true,
43
+ },
44
+ {
45
+ id: 'agentName',
46
+ header: 'Agent',
47
+ label: 'Agent',
48
+ accessorKey: 'agentName',
49
+ size: 220,
50
+ canSort: true,
51
+ },
52
+ {
53
+ id: 'status',
54
+ header: 'Status',
55
+ label: 'Status',
56
+ accessorKey: 'status',
57
+ cell: ({ value }) => <AgentConsoleStatusBadge status={String(value)} />,
58
+ size: 140,
59
+ canSort: true,
60
+ },
61
+ {
62
+ id: 'totalTokens',
63
+ header: 'Tokens',
64
+ label: 'Tokens',
65
+ accessorKey: 'totalTokens',
66
+ cell: ({ value }) => formatAgentConsoleTokens(Number(value ?? 0)),
67
+ align: 'right',
68
+ size: 120,
69
+ canSort: true,
70
+ },
71
+ {
72
+ id: 'durationMs',
73
+ header: 'Duration',
74
+ label: 'Duration',
75
+ accessorKey: 'durationMs',
76
+ cell: ({ value }) =>
77
+ formatAgentConsoleDuration(
78
+ typeof value === 'number' ? value : undefined
79
+ ),
80
+ align: 'right',
81
+ size: 130,
82
+ canHide: true,
83
+ },
84
+ ],
85
+ []
86
+ );
87
+ const controller = useContractTable({
88
+ data: runs,
89
+ columns,
90
+ initialState: { pagination: { pageIndex: 0, pageSize: 5 } },
91
+ getRowId: (run) => run.id,
92
+ });
93
+
94
+ return (
95
+ <DataTable
96
+ controller={controller}
97
+ toolbar={
98
+ <Text className="text-muted-foreground text-sm">Run History</Text>
99
+ }
100
+ emptyState={
101
+ <Card>
102
+ <CardContent className="pt-6">
103
+ <Text className="text-muted-foreground">No runs yet</Text>
104
+ </CardContent>
105
+ </Card>
106
+ }
107
+ />
108
+ );
109
+ }
@@ -2,12 +2,12 @@
2
2
 
3
3
  import { VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
4
4
  import { ExecutionLaneConsoleDemo } from '@contractspec/module.execution-console';
5
- import { AgentDashboard } from './AgentDashboard';
5
+ import { AgentConsolePreview } from './AgentConsolePreview';
6
6
 
7
7
  export function ExecutionConsoleHost() {
8
8
  return (
9
9
  <VStack gap="xl" align="stretch">
10
- <AgentDashboard />
10
+ <AgentConsolePreview />
11
11
  <ExecutionLaneConsoleDemo />
12
12
  </VStack>
13
13
  );
package/src/ui/index.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  // Main dashboard component
2
+
3
+ export * from './AgentConsolePreview';
2
4
  export * from './AgentDashboard';
3
5
  // Backward-compatible exports
4
6
  export * from './AgentRunList';
@@ -1,18 +1,26 @@
1
1
  import type { VisualizationSurfaceItem } from '@contractspec/lib.design-system';
2
- import type { Run } from '../ui/hooks/useRunList';
3
2
  import {
4
3
  AgentRunActivityVisualization,
5
4
  AgentRunEfficiencyVisualization,
6
5
  AgentRunStatusVisualization,
7
6
  } from './catalog';
8
7
 
8
+ interface AgentVisualizationRun {
9
+ durationMs?: number;
10
+ estimatedCostUsd?: number;
11
+ queuedAt?: Date;
12
+ startedAt?: Date;
13
+ status: string;
14
+ totalTokens: number;
15
+ }
16
+
9
17
  function dayKey(value: Date | undefined): string {
10
18
  if (!value) return 'unknown';
11
19
  return value.toISOString().slice(0, 10);
12
20
  }
13
21
 
14
22
  export function createAgentVisualizationItems(
15
- runs: Run[]
23
+ runs: readonly AgentVisualizationRun[]
16
24
  ): VisualizationSurfaceItem[] {
17
25
  const statusCounts = new Map<string, number>();
18
26
  const activityCounts = new Map<string, number>();