@contractspec/example.agent-console 3.7.6 → 3.8.2
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/.turbo/turbo-build.log +126 -105
- package/AGENTS.md +52 -31
- package/CHANGELOG.md +29 -0
- package/README.md +112 -83
- package/dist/agent/agent.event.js +1 -1
- package/dist/agent/agent.handler.d.ts +3 -0
- package/dist/agent/agent.handler.js +730 -1
- package/dist/agent/agent.operation.js +1 -1
- package/dist/agent/index.d.ts +5 -5
- package/dist/agent/index.js +74 -73
- package/dist/agent.feature.js +179 -0
- package/dist/browser/agent/agent.event.js +1 -1
- package/dist/browser/agent/agent.handler.js +730 -1
- package/dist/browser/agent/agent.operation.js +1 -1
- package/dist/browser/agent/index.js +74 -73
- package/dist/browser/agent.feature.js +179 -0
- package/dist/browser/docs/agent-console.docblock.js +11 -8
- package/dist/browser/docs/index.js +11 -8
- package/dist/browser/example.js +2 -3
- package/dist/browser/handlers/agent.handlers.js +1883 -2
- package/dist/browser/handlers/index.js +2142 -8
- package/dist/browser/index.js +4075 -3161
- package/dist/browser/presentations/index.js +51 -51
- package/dist/browser/run/index.js +380 -374
- package/dist/browser/run/run.event.js +2 -2
- package/dist/browser/run/run.handler.js +666 -1
- package/dist/browser/run/run.presentation.js +2 -2
- package/dist/browser/shared/index.js +293 -1
- package/dist/browser/shared/mock-runs.js +5 -0
- package/dist/browser/tool/index.js +161 -161
- package/dist/browser/tool/tool.event.js +1 -1
- package/dist/browser/tool/tool.handler.js +479 -3
- package/dist/browser/tool/tool.presentation.js +2 -2
- package/dist/browser/ui/AgentDashboard.js +1816 -931
- package/dist/browser/ui/AgentDashboard.visualizations.js +217 -0
- package/dist/browser/ui/AgentRunList.js +360 -128
- package/dist/browser/ui/AgentToolRegistry.js +9 -9
- package/dist/browser/ui/hooks/index.js +611 -161
- package/dist/browser/ui/hooks/useAgentList.js +1 -1
- package/dist/browser/ui/hooks/useAgentMutations.js +444 -9
- package/dist/browser/ui/hooks/useRunList.js +26 -11
- package/dist/browser/ui/hooks/useToolList.js +1 -1
- package/dist/browser/ui/index.js +2161 -1258
- package/dist/browser/ui/modals/AgentActionsModal.js +13 -13
- package/dist/browser/ui/modals/CreateAgentModal.js +15 -15
- package/dist/browser/ui/modals/index.js +297 -297
- package/dist/browser/ui/renderers/agent-list.markdown.js +14 -5
- package/dist/browser/ui/renderers/agent-list.renderer.js +7 -7
- package/dist/browser/ui/renderers/dashboard.markdown.js +207 -36
- package/dist/browser/ui/renderers/index.js +359 -163
- package/dist/browser/ui/renderers/run-list.markdown.js +9 -4
- package/dist/browser/ui/renderers/tool-registry.markdown.js +15 -4
- package/dist/browser/ui/views/AgentListView.js +7 -7
- package/dist/browser/ui/views/RunDataTable.js +326 -0
- package/dist/browser/ui/views/RunListView.js +360 -128
- package/dist/browser/ui/views/ToolRegistryView.js +9 -9
- package/dist/browser/ui/views/index.js +478 -246
- package/dist/browser/ui/views/run-data-table.columns.js +271 -0
- package/dist/browser/ui/views/run-list.shared.js +177 -0
- package/dist/browser/visualizations/catalog.js +134 -0
- package/dist/browser/visualizations/index.js +187 -0
- package/dist/browser/visualizations/selectors.js +181 -0
- package/dist/docs/agent-console.docblock.js +11 -8
- package/dist/docs/index.js +11 -8
- package/dist/example.js +2 -3
- package/dist/example.test.d.ts +1 -0
- package/dist/handlers/agent.handlers.d.ts +2 -0
- package/dist/handlers/agent.handlers.js +1883 -2
- package/dist/handlers/index.d.ts +2 -4
- package/dist/handlers/index.js +2142 -8
- package/dist/handlers/mock-handlers.test.d.ts +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +4075 -3161
- package/dist/node/agent/agent.event.js +1 -1
- package/dist/node/agent/agent.handler.js +730 -1
- package/dist/node/agent/agent.operation.js +1 -1
- package/dist/node/agent/index.js +74 -73
- package/dist/node/agent.feature.js +179 -0
- package/dist/node/docs/agent-console.docblock.js +11 -8
- package/dist/node/docs/index.js +11 -8
- package/dist/node/example.js +2 -3
- package/dist/node/handlers/agent.handlers.js +1883 -2
- package/dist/node/handlers/index.js +2142 -8
- package/dist/node/index.js +4075 -3161
- package/dist/node/presentations/index.js +51 -51
- package/dist/node/run/index.js +380 -374
- package/dist/node/run/run.event.js +2 -2
- package/dist/node/run/run.handler.js +666 -1
- package/dist/node/run/run.presentation.js +2 -2
- package/dist/node/shared/index.js +293 -1
- package/dist/node/shared/mock-runs.js +5 -0
- package/dist/node/tool/index.js +161 -161
- package/dist/node/tool/tool.event.js +1 -1
- package/dist/node/tool/tool.handler.js +479 -3
- package/dist/node/tool/tool.presentation.js +2 -2
- package/dist/node/ui/AgentDashboard.js +1816 -931
- package/dist/node/ui/AgentDashboard.visualizations.js +217 -0
- package/dist/node/ui/AgentRunList.js +360 -128
- package/dist/node/ui/AgentToolRegistry.js +9 -9
- package/dist/node/ui/hooks/index.js +611 -161
- package/dist/node/ui/hooks/useAgentList.js +1 -1
- package/dist/node/ui/hooks/useAgentMutations.js +444 -9
- package/dist/node/ui/hooks/useRunList.js +26 -11
- package/dist/node/ui/hooks/useToolList.js +1 -1
- package/dist/node/ui/index.js +2161 -1258
- package/dist/node/ui/modals/AgentActionsModal.js +13 -13
- package/dist/node/ui/modals/CreateAgentModal.js +15 -15
- package/dist/node/ui/modals/index.js +297 -297
- package/dist/node/ui/renderers/agent-list.markdown.js +14 -5
- package/dist/node/ui/renderers/agent-list.renderer.js +7 -7
- package/dist/node/ui/renderers/dashboard.markdown.js +207 -36
- package/dist/node/ui/renderers/index.js +359 -163
- package/dist/node/ui/renderers/run-list.markdown.js +9 -4
- package/dist/node/ui/renderers/tool-registry.markdown.js +15 -4
- package/dist/node/ui/views/AgentListView.js +7 -7
- package/dist/node/ui/views/RunDataTable.js +326 -0
- package/dist/node/ui/views/RunListView.js +360 -128
- package/dist/node/ui/views/ToolRegistryView.js +9 -9
- package/dist/node/ui/views/index.js +478 -246
- package/dist/node/ui/views/run-data-table.columns.js +271 -0
- package/dist/node/ui/views/run-list.shared.js +177 -0
- package/dist/node/visualizations/catalog.js +134 -0
- package/dist/node/visualizations/index.js +187 -0
- package/dist/node/visualizations/selectors.js +181 -0
- package/dist/presentations/index.d.ts +3 -5
- package/dist/presentations/index.js +51 -51
- package/dist/proof/index.d.ts +2 -0
- package/dist/proof/meetup-proof.d.ts +10 -0
- package/dist/proof/meetup-proof.runtime.d.ts +22 -0
- package/dist/proof/meetup-proof.scenario.d.ts +2 -0
- package/dist/proof/meetup-proof.suite.d.ts +1 -0
- package/dist/proof/meetup-proof.test.d.ts +1 -0
- package/dist/run/index.d.ts +7 -7
- package/dist/run/index.js +380 -374
- package/dist/run/run.event.js +2 -2
- package/dist/run/run.handler.d.ts +7 -0
- package/dist/run/run.handler.js +666 -1
- package/dist/run/run.presentation.js +2 -2
- package/dist/shared/demo-dashboard-data.d.ts +16 -0
- package/dist/shared/demo-runtime-seed.d.ts +17 -0
- package/dist/shared/demo-runtime.d.ts +8 -0
- package/dist/shared/demo-runtime.test.d.ts +1 -0
- package/dist/shared/index.d.ts +4 -1
- package/dist/shared/index.js +293 -1
- package/dist/shared/mock-runs.d.ts +4 -0
- package/dist/shared/mock-runs.js +5 -0
- package/dist/tool/index.d.ts +7 -7
- package/dist/tool/index.js +161 -161
- package/dist/tool/tool.event.js +1 -1
- package/dist/tool/tool.handler.d.ts +3 -0
- package/dist/tool/tool.handler.js +479 -3
- package/dist/tool/tool.presentation.js +2 -2
- package/dist/ui/AgentDashboard.js +1816 -931
- package/dist/ui/AgentDashboard.sandbox.test.d.ts +1 -0
- package/dist/ui/AgentDashboard.visualizations.d.ts +4 -0
- package/dist/ui/AgentDashboard.visualizations.js +218 -0
- package/dist/ui/AgentRunList.js +360 -128
- package/dist/ui/AgentToolRegistry.js +9 -9
- package/dist/ui/hooks/index.d.ts +4 -4
- package/dist/ui/hooks/index.js +611 -161
- package/dist/ui/hooks/useAgentList.d.ts +5 -0
- package/dist/ui/hooks/useAgentList.js +1 -1
- package/dist/ui/hooks/useAgentMutations.d.ts +9 -2
- package/dist/ui/hooks/useAgentMutations.js +444 -9
- package/dist/ui/hooks/useRunList.d.ts +13 -2
- package/dist/ui/hooks/useRunList.js +26 -11
- package/dist/ui/hooks/useToolList.d.ts +5 -0
- package/dist/ui/hooks/useToolList.js +1 -1
- package/dist/ui/index.d.ts +3 -3
- package/dist/ui/index.js +2161 -1258
- package/dist/ui/modals/AgentActionsModal.js +13 -13
- package/dist/ui/modals/CreateAgentModal.js +15 -15
- package/dist/ui/modals/index.d.ts +1 -1
- package/dist/ui/modals/index.js +297 -297
- package/dist/ui/renderers/agent-list.markdown.d.ts +5 -0
- package/dist/ui/renderers/agent-list.markdown.js +14 -5
- package/dist/ui/renderers/agent-list.renderer.js +7 -7
- package/dist/ui/renderers/dashboard.markdown.d.ts +5 -0
- package/dist/ui/renderers/dashboard.markdown.js +207 -36
- package/dist/ui/renderers/index.d.ts +2 -2
- package/dist/ui/renderers/index.js +359 -163
- package/dist/ui/renderers/run-list.markdown.d.ts +5 -0
- package/dist/ui/renderers/run-list.markdown.js +9 -4
- package/dist/ui/renderers/tool-registry.markdown.d.ts +6 -1
- package/dist/ui/renderers/tool-registry.markdown.js +15 -4
- package/dist/ui/views/AgentListView.js +7 -7
- package/dist/ui/views/RunDataTable.d.ts +18 -0
- package/dist/ui/views/RunDataTable.js +327 -0
- package/dist/ui/views/RunListView.js +360 -128
- package/dist/ui/views/ToolRegistryView.js +9 -9
- package/dist/ui/views/index.js +478 -246
- package/dist/ui/views/run-data-table.columns.d.ts +3 -0
- package/dist/ui/views/run-data-table.columns.js +272 -0
- package/dist/ui/views/run-list.shared.d.ts +14 -0
- package/dist/ui/views/run-list.shared.js +178 -0
- package/dist/visualizations/catalog.d.ts +10 -0
- package/dist/visualizations/catalog.js +135 -0
- package/dist/visualizations/index.d.ts +2 -0
- package/dist/visualizations/index.js +188 -0
- package/dist/visualizations/selectors.d.ts +3 -0
- package/dist/visualizations/selectors.js +182 -0
- package/dist/visualizations/selectors.test.d.ts +1 -0
- package/package.json +114 -12
- package/proofs/agent-console-meetup.replay.json +220 -0
- package/src/agent/agent.entity.ts +111 -111
- package/src/agent/agent.enum.ts +12 -12
- package/src/agent/agent.event.ts +91 -91
- package/src/agent/agent.handler.ts +144 -127
- package/src/agent/agent.operation.ts +400 -400
- package/src/agent/agent.presentation.ts +62 -62
- package/src/agent/agent.schema.ts +175 -175
- package/src/agent/agent.test-spec.ts +48 -48
- package/src/agent/index.ts +46 -51
- package/src/agent.capability.ts +11 -11
- package/src/agent.feature.ts +134 -131
- package/src/docs/agent-console.docblock.ts +52 -49
- package/src/example.test.ts +75 -0
- package/src/example.ts +34 -35
- package/src/handlers/agent.handlers.ts +576 -522
- package/src/handlers/index.ts +30 -14
- package/src/handlers/mock-handlers.test.ts +77 -0
- package/src/index.ts +10 -9
- package/src/presentations/index.ts +11 -13
- package/src/proof/index.ts +2 -0
- package/src/proof/meetup-proof.runtime.ts +196 -0
- package/src/proof/meetup-proof.scenario.ts +99 -0
- package/src/proof/meetup-proof.suite.ts +29 -0
- package/src/proof/meetup-proof.test.ts +28 -0
- package/src/proof/meetup-proof.ts +130 -0
- package/src/run/index.ts +49 -54
- package/src/run/run.entity.ts +137 -137
- package/src/run/run.enum.ts +18 -18
- package/src/run/run.event.ts +174 -174
- package/src/run/run.handler.ts +113 -96
- package/src/run/run.operation.ts +474 -474
- package/src/run/run.presentation.ts +42 -42
- package/src/run/run.schema.ts +126 -126
- package/src/run/run.test-spec.ts +48 -48
- package/src/seeders/index.ts +21 -21
- package/src/shared/demo-dashboard-data.ts +58 -0
- package/src/shared/demo-runtime-seed.ts +139 -0
- package/src/shared/demo-runtime.test.ts +169 -0
- package/src/shared/demo-runtime.ts +260 -0
- package/src/shared/index.ts +12 -1
- package/src/shared/mock-agents.ts +76 -76
- package/src/shared/mock-runs.ts +107 -102
- package/src/shared/mock-tools.ts +140 -140
- package/src/shared/overlay-types.ts +23 -23
- package/src/tool/index.ts +39 -44
- package/src/tool/tool.entity.ts +73 -73
- package/src/tool/tool.enum.ts +13 -13
- package/src/tool/tool.event.ts +80 -80
- package/src/tool/tool.handler.ts +124 -107
- package/src/tool/tool.operation.ts +328 -328
- package/src/tool/tool.presentation.ts +43 -43
- package/src/tool/tool.schema.ts +106 -106
- package/src/tool/tool.test-spec.ts +48 -48
- package/src/ui/AgentDashboard.sandbox.test.tsx +312 -0
- package/src/ui/AgentDashboard.tsx +351 -348
- package/src/ui/AgentDashboard.visualizations.tsx +35 -0
- package/src/ui/hooks/index.ts +7 -7
- package/src/ui/hooks/useAgentList.ts +57 -56
- package/src/ui/hooks/useAgentMutations.ts +168 -159
- package/src/ui/hooks/useRunList.ts +90 -57
- package/src/ui/hooks/useToolList.ts +102 -101
- package/src/ui/index.ts +6 -9
- package/src/ui/modals/AgentActionsModal.tsx +262 -262
- package/src/ui/modals/CreateAgentModal.tsx +232 -232
- package/src/ui/modals/index.ts +1 -1
- package/src/ui/overlays/demo-overlays.ts +52 -52
- package/src/ui/renderers/agent-list.markdown.ts +81 -61
- package/src/ui/renderers/agent-list.renderer.tsx +14 -14
- package/src/ui/renderers/dashboard.markdown.ts +135 -139
- package/src/ui/renderers/index.ts +3 -4
- package/src/ui/renderers/run-list.markdown.ts +56 -47
- package/src/ui/renderers/tool-registry.markdown.ts +79 -66
- package/src/ui/views/AgentListView.tsx +90 -90
- package/src/ui/views/RunDataTable.tsx +74 -0
- package/src/ui/views/RunListView.tsx +84 -158
- package/src/ui/views/ToolRegistryView.tsx +113 -113
- package/src/ui/views/run-data-table.columns.tsx +102 -0
- package/src/ui/views/run-list.shared.tsx +139 -0
- package/src/visualizations/catalog.ts +132 -0
- package/src/visualizations/index.ts +2 -0
- package/src/visualizations/selectors.test.ts +12 -0
- package/src/visualizations/selectors.ts +70 -0
- package/tsconfig.json +7 -8
- package/tsdown.config.js +24 -3
package/dist/ui/views/index.js
CHANGED
|
@@ -1,16 +1,72 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
// src/ui/hooks/
|
|
3
|
-
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
// src/ui/hooks/useAgentList.ts
|
|
4
3
|
import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
|
|
5
|
-
|
|
4
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
5
|
+
function useAgentList(options = {}) {
|
|
6
6
|
const { handlers, projectId } = useTemplateRuntime();
|
|
7
7
|
const { agent } = handlers;
|
|
8
8
|
const [data, setData] = useState(null);
|
|
9
|
-
const [metrics, setMetrics] = useState(null);
|
|
10
9
|
const [loading, setLoading] = useState(true);
|
|
11
10
|
const [error, setError] = useState(null);
|
|
12
11
|
const [page, setPage] = useState(1);
|
|
13
12
|
const fetchData = useCallback(async () => {
|
|
13
|
+
setLoading(true);
|
|
14
|
+
setError(null);
|
|
15
|
+
try {
|
|
16
|
+
const result = await agent.listAgents({
|
|
17
|
+
projectId,
|
|
18
|
+
search: options.search,
|
|
19
|
+
status: options.status === "all" ? undefined : options.status,
|
|
20
|
+
limit: options.limit ?? 20,
|
|
21
|
+
offset: (page - 1) * (options.limit ?? 20)
|
|
22
|
+
});
|
|
23
|
+
setData(result);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
setError(err instanceof Error ? err : new Error("Unknown error"));
|
|
26
|
+
} finally {
|
|
27
|
+
setLoading(false);
|
|
28
|
+
}
|
|
29
|
+
}, [agent, projectId, options.search, options.status, options.limit, page]);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
fetchData();
|
|
32
|
+
}, [fetchData]);
|
|
33
|
+
const stats = useMemo(() => {
|
|
34
|
+
if (!data)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
total: data.total,
|
|
38
|
+
active: data.items.filter((a) => a.status === "ACTIVE").length,
|
|
39
|
+
paused: data.items.filter((a) => a.status === "PAUSED").length,
|
|
40
|
+
draft: data.items.filter((a) => a.status === "DRAFT").length
|
|
41
|
+
};
|
|
42
|
+
}, [data]);
|
|
43
|
+
return {
|
|
44
|
+
data,
|
|
45
|
+
loading,
|
|
46
|
+
error,
|
|
47
|
+
stats,
|
|
48
|
+
page,
|
|
49
|
+
refetch: fetchData,
|
|
50
|
+
nextPage: () => setPage((p) => p + 1),
|
|
51
|
+
prevPage: () => page > 1 && setPage((p) => p - 1)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/ui/hooks/useRunList.ts
|
|
56
|
+
import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
|
|
57
|
+
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
|
|
58
|
+
function useRunList(options = {}) {
|
|
59
|
+
const { handlers, projectId } = useTemplateRuntime2();
|
|
60
|
+
const { agent } = handlers;
|
|
61
|
+
const [data, setData] = useState2(null);
|
|
62
|
+
const [metrics, setMetrics] = useState2(null);
|
|
63
|
+
const [loading, setLoading] = useState2(true);
|
|
64
|
+
const [error, setError] = useState2(null);
|
|
65
|
+
const [internalPageIndex, setInternalPageIndex] = useState2(0);
|
|
66
|
+
const pageSize = options.pageSize ?? options.limit ?? 20;
|
|
67
|
+
const pageIndex = options.pageIndex ?? internalPageIndex;
|
|
68
|
+
const [sort] = options.sorting ?? [];
|
|
69
|
+
const fetchData = useCallback2(async () => {
|
|
14
70
|
setLoading(true);
|
|
15
71
|
setError(null);
|
|
16
72
|
try {
|
|
@@ -19,14 +75,14 @@ function useRunList(options = {}) {
|
|
|
19
75
|
projectId,
|
|
20
76
|
agentId: options.agentId,
|
|
21
77
|
status: options.status === "all" ? undefined : options.status,
|
|
22
|
-
|
|
23
|
-
|
|
78
|
+
sortBy: sort?.id,
|
|
79
|
+
sortDirection: sort ? sort.desc ? "desc" : "asc" : undefined,
|
|
80
|
+
limit: pageSize,
|
|
81
|
+
offset: pageIndex * pageSize
|
|
24
82
|
}),
|
|
25
83
|
agent.getRunMetrics({
|
|
26
84
|
projectId,
|
|
27
|
-
agentId: options.agentId
|
|
28
|
-
startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
29
|
-
endDate: new Date
|
|
85
|
+
agentId: options.agentId
|
|
30
86
|
})
|
|
31
87
|
]);
|
|
32
88
|
setData(runsResult);
|
|
@@ -36,31 +92,38 @@ function useRunList(options = {}) {
|
|
|
36
92
|
} finally {
|
|
37
93
|
setLoading(false);
|
|
38
94
|
}
|
|
39
|
-
}, [
|
|
40
|
-
|
|
95
|
+
}, [
|
|
96
|
+
agent,
|
|
97
|
+
pageIndex,
|
|
98
|
+
pageSize,
|
|
99
|
+
projectId,
|
|
100
|
+
options.agentId,
|
|
101
|
+
options.status,
|
|
102
|
+
sort?.desc,
|
|
103
|
+
sort?.id
|
|
104
|
+
]);
|
|
105
|
+
useEffect2(() => {
|
|
41
106
|
fetchData();
|
|
42
107
|
}, [fetchData]);
|
|
108
|
+
const hasControlledPagination = options.pageIndex !== undefined;
|
|
43
109
|
return {
|
|
44
110
|
data,
|
|
45
111
|
metrics,
|
|
46
112
|
loading,
|
|
47
113
|
error,
|
|
48
|
-
page,
|
|
114
|
+
page: pageIndex + 1,
|
|
115
|
+
pageIndex,
|
|
116
|
+
pageSize,
|
|
49
117
|
refetch: fetchData,
|
|
50
|
-
nextPage: () =>
|
|
51
|
-
prevPage:
|
|
118
|
+
nextPage: hasControlledPagination ? undefined : () => setInternalPageIndex((current) => current + 1),
|
|
119
|
+
prevPage: hasControlledPagination ? undefined : () => setInternalPageIndex((current) => Math.max(0, current - 1))
|
|
52
120
|
};
|
|
53
121
|
}
|
|
54
122
|
|
|
55
|
-
// src/ui/views/
|
|
56
|
-
import {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
StatusChip,
|
|
60
|
-
EmptyState,
|
|
61
|
-
LoaderBlock,
|
|
62
|
-
ErrorState
|
|
63
|
-
} from "@contractspec/lib.design-system";
|
|
123
|
+
// src/ui/views/run-list.shared.tsx
|
|
124
|
+
import { Button, StatusChip } from "@contractspec/lib.design-system";
|
|
125
|
+
import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
126
|
+
import { Text } from "@contractspec/lib.ui-kit-web/ui/text";
|
|
64
127
|
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
65
128
|
"use client";
|
|
66
129
|
function getStatusTone(status) {
|
|
@@ -99,15 +162,320 @@ function formatCost(cost) {
|
|
|
99
162
|
return "-";
|
|
100
163
|
return `$${cost.toFixed(4)}`;
|
|
101
164
|
}
|
|
165
|
+
function formatJson(value) {
|
|
166
|
+
return JSON.stringify(value ?? null, null, 2);
|
|
167
|
+
}
|
|
168
|
+
function RunExpandedContent({ run }) {
|
|
169
|
+
return /* @__PURE__ */ jsxDEV(VStack, {
|
|
170
|
+
gap: "sm",
|
|
171
|
+
className: "py-2",
|
|
172
|
+
children: [
|
|
173
|
+
/* @__PURE__ */ jsxDEV(HStack, {
|
|
174
|
+
justify: "between",
|
|
175
|
+
className: "flex-wrap",
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ jsxDEV(StatusChip, {
|
|
178
|
+
tone: getStatusTone(run.status),
|
|
179
|
+
label: run.status
|
|
180
|
+
}, undefined, false, undefined, this),
|
|
181
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
182
|
+
className: "text-muted-foreground text-sm",
|
|
183
|
+
children: [
|
|
184
|
+
"Queued ",
|
|
185
|
+
run.queuedAt.toLocaleString()
|
|
186
|
+
]
|
|
187
|
+
}, undefined, true, undefined, this)
|
|
188
|
+
]
|
|
189
|
+
}, undefined, true, undefined, this),
|
|
190
|
+
/* @__PURE__ */ jsxDEV(HStack, {
|
|
191
|
+
gap: "lg",
|
|
192
|
+
className: "flex-wrap",
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
195
|
+
className: "text-muted-foreground text-sm",
|
|
196
|
+
children: [
|
|
197
|
+
"Prompt ",
|
|
198
|
+
formatTokens(run.promptTokens)
|
|
199
|
+
]
|
|
200
|
+
}, undefined, true, undefined, this),
|
|
201
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
202
|
+
className: "text-muted-foreground text-sm",
|
|
203
|
+
children: [
|
|
204
|
+
"Completion ",
|
|
205
|
+
formatTokens(run.completionTokens)
|
|
206
|
+
]
|
|
207
|
+
}, undefined, true, undefined, this),
|
|
208
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
209
|
+
className: "text-muted-foreground text-sm",
|
|
210
|
+
children: [
|
|
211
|
+
"Duration ",
|
|
212
|
+
formatDuration(run.durationMs)
|
|
213
|
+
]
|
|
214
|
+
}, undefined, true, undefined, this)
|
|
215
|
+
]
|
|
216
|
+
}, undefined, true, undefined, this),
|
|
217
|
+
/* @__PURE__ */ jsxDEV(VStack, {
|
|
218
|
+
gap: "xs",
|
|
219
|
+
children: [
|
|
220
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
221
|
+
className: "font-medium text-sm",
|
|
222
|
+
children: "Input"
|
|
223
|
+
}, undefined, false, undefined, this),
|
|
224
|
+
/* @__PURE__ */ jsxDEV("pre", {
|
|
225
|
+
className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
|
|
226
|
+
children: formatJson(run.input)
|
|
227
|
+
}, undefined, false, undefined, this)
|
|
228
|
+
]
|
|
229
|
+
}, undefined, true, undefined, this),
|
|
230
|
+
/* @__PURE__ */ jsxDEV(VStack, {
|
|
231
|
+
gap: "xs",
|
|
232
|
+
children: [
|
|
233
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
234
|
+
className: "font-medium text-sm",
|
|
235
|
+
children: "Output"
|
|
236
|
+
}, undefined, false, undefined, this),
|
|
237
|
+
/* @__PURE__ */ jsxDEV("pre", {
|
|
238
|
+
className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
|
|
239
|
+
children: formatJson(run.output ?? run.errorMessage ?? "Pending")
|
|
240
|
+
}, undefined, false, undefined, this)
|
|
241
|
+
]
|
|
242
|
+
}, undefined, true, undefined, this)
|
|
243
|
+
]
|
|
244
|
+
}, undefined, true, undefined, this);
|
|
245
|
+
}
|
|
246
|
+
function RunTableToolbar({
|
|
247
|
+
controller,
|
|
248
|
+
totalRuns
|
|
249
|
+
}) {
|
|
250
|
+
const firstRow = controller.rows[0];
|
|
251
|
+
const queuedColumn = controller.columns.find((column) => column.id === "queuedAt");
|
|
252
|
+
const durationColumn = controller.columns.find((column) => column.id === "durationMs");
|
|
253
|
+
const costColumn = controller.columns.find((column) => column.id === "estimatedCostUsd");
|
|
254
|
+
return /* @__PURE__ */ jsxDEV(HStack, {
|
|
255
|
+
gap: "sm",
|
|
256
|
+
className: "flex-wrap",
|
|
257
|
+
children: [
|
|
258
|
+
/* @__PURE__ */ jsxDEV(Text, {
|
|
259
|
+
className: "text-muted-foreground text-sm",
|
|
260
|
+
children: [
|
|
261
|
+
totalRuns,
|
|
262
|
+
" runs"
|
|
263
|
+
]
|
|
264
|
+
}, undefined, true, undefined, this),
|
|
265
|
+
/* @__PURE__ */ jsxDEV(Button, {
|
|
266
|
+
variant: "outline",
|
|
267
|
+
size: "sm",
|
|
268
|
+
onPress: () => firstRow?.toggleExpanded?.(!firstRow?.isExpanded),
|
|
269
|
+
children: "Expand Latest Run"
|
|
270
|
+
}, undefined, false, undefined, this),
|
|
271
|
+
/* @__PURE__ */ jsxDEV(Button, {
|
|
272
|
+
variant: "outline",
|
|
273
|
+
size: "sm",
|
|
274
|
+
onPress: () => queuedColumn?.toggleVisibility?.(!queuedColumn?.visible),
|
|
275
|
+
children: queuedColumn?.visible ? "Hide Time" : "Show Time"
|
|
276
|
+
}, undefined, false, undefined, this),
|
|
277
|
+
/* @__PURE__ */ jsxDEV(Button, {
|
|
278
|
+
variant: "outline",
|
|
279
|
+
size: "sm",
|
|
280
|
+
onPress: () => durationColumn?.toggleVisibility?.(!durationColumn?.visible),
|
|
281
|
+
children: durationColumn?.visible ? "Hide Duration" : "Show Duration"
|
|
282
|
+
}, undefined, false, undefined, this),
|
|
283
|
+
/* @__PURE__ */ jsxDEV(Button, {
|
|
284
|
+
variant: "outline",
|
|
285
|
+
size: "sm",
|
|
286
|
+
onPress: () => costColumn?.toggleVisibility?.(!costColumn?.visible),
|
|
287
|
+
children: costColumn?.visible ? "Hide Cost" : "Show Cost"
|
|
288
|
+
}, undefined, false, undefined, this)
|
|
289
|
+
]
|
|
290
|
+
}, undefined, true, undefined, this);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// src/ui/views/run-data-table.columns.tsx
|
|
294
|
+
import { StatusChip as StatusChip2 } from "@contractspec/lib.design-system";
|
|
295
|
+
import { VStack as VStack2 } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
296
|
+
import { Text as Text2 } from "@contractspec/lib.ui-kit-web/ui/text";
|
|
297
|
+
import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
|
|
298
|
+
"use client";
|
|
299
|
+
function createRunTableColumns() {
|
|
300
|
+
return [
|
|
301
|
+
{
|
|
302
|
+
id: "queuedAt",
|
|
303
|
+
header: "Run",
|
|
304
|
+
label: "Run",
|
|
305
|
+
accessor: (run) => run.queuedAt.getTime(),
|
|
306
|
+
cell: ({ item }) => /* @__PURE__ */ jsxDEV2(VStack2, {
|
|
307
|
+
gap: "xs",
|
|
308
|
+
children: [
|
|
309
|
+
/* @__PURE__ */ jsxDEV2(Text2, {
|
|
310
|
+
className: "font-mono text-sm",
|
|
311
|
+
children: item.id.slice(-8)
|
|
312
|
+
}, undefined, false, undefined, this),
|
|
313
|
+
/* @__PURE__ */ jsxDEV2(Text2, {
|
|
314
|
+
className: "text-muted-foreground text-xs",
|
|
315
|
+
children: item.queuedAt.toLocaleString()
|
|
316
|
+
}, undefined, false, undefined, this)
|
|
317
|
+
]
|
|
318
|
+
}, undefined, true, undefined, this),
|
|
319
|
+
size: 220,
|
|
320
|
+
minSize: 180,
|
|
321
|
+
canSort: true,
|
|
322
|
+
canHide: true,
|
|
323
|
+
canResize: true
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: "agentName",
|
|
327
|
+
header: "Agent",
|
|
328
|
+
label: "Agent",
|
|
329
|
+
accessor: (run) => run.agentName ?? "Unknown Agent",
|
|
330
|
+
cell: ({ value }) => /* @__PURE__ */ jsxDEV2(Text2, {
|
|
331
|
+
className: "font-medium",
|
|
332
|
+
children: typeof value === "string" ? value : "Unknown Agent"
|
|
333
|
+
}, undefined, false, undefined, this),
|
|
334
|
+
size: 220,
|
|
335
|
+
canSort: true,
|
|
336
|
+
canResize: true
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: "status",
|
|
340
|
+
header: "Status",
|
|
341
|
+
label: "Status",
|
|
342
|
+
accessorKey: "status",
|
|
343
|
+
cell: ({ value }) => {
|
|
344
|
+
const status = typeof value === "string" ? value : "QUEUED";
|
|
345
|
+
return /* @__PURE__ */ jsxDEV2(StatusChip2, {
|
|
346
|
+
tone: getStatusTone(status),
|
|
347
|
+
label: status
|
|
348
|
+
}, undefined, false, undefined, this);
|
|
349
|
+
},
|
|
350
|
+
size: 150,
|
|
351
|
+
canSort: true,
|
|
352
|
+
canResize: true
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
id: "totalTokens",
|
|
356
|
+
header: "Tokens",
|
|
357
|
+
label: "Tokens",
|
|
358
|
+
accessorKey: "totalTokens",
|
|
359
|
+
cell: ({ value }) => formatTokens(Number(value ?? 0)),
|
|
360
|
+
align: "right",
|
|
361
|
+
size: 140,
|
|
362
|
+
canSort: true,
|
|
363
|
+
canResize: true
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
id: "durationMs",
|
|
367
|
+
header: "Duration",
|
|
368
|
+
label: "Duration",
|
|
369
|
+
accessorKey: "durationMs",
|
|
370
|
+
cell: ({ value }) => formatDuration(typeof value === "number" ? value : undefined),
|
|
371
|
+
align: "right",
|
|
372
|
+
size: 140,
|
|
373
|
+
canSort: true,
|
|
374
|
+
canHide: true,
|
|
375
|
+
canResize: true
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
id: "estimatedCostUsd",
|
|
379
|
+
header: "Cost",
|
|
380
|
+
label: "Cost",
|
|
381
|
+
accessorKey: "estimatedCostUsd",
|
|
382
|
+
cell: ({ value }) => formatCost(typeof value === "number" ? value : undefined),
|
|
383
|
+
align: "right",
|
|
384
|
+
size: 140,
|
|
385
|
+
canSort: true,
|
|
386
|
+
canHide: true,
|
|
387
|
+
canResize: true
|
|
388
|
+
}
|
|
389
|
+
];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// src/ui/views/RunDataTable.tsx
|
|
393
|
+
import { DataTable } from "@contractspec/lib.design-system";
|
|
394
|
+
import { useContractTable } from "@contractspec/lib.presentation-runtime-react";
|
|
395
|
+
import * as React from "react";
|
|
396
|
+
import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
|
|
397
|
+
"use client";
|
|
398
|
+
function RunDataTable({
|
|
399
|
+
runs,
|
|
400
|
+
totalItems,
|
|
401
|
+
pageIndex,
|
|
402
|
+
pageSize,
|
|
403
|
+
sorting,
|
|
404
|
+
loading,
|
|
405
|
+
onSortingChange,
|
|
406
|
+
onPaginationChange,
|
|
407
|
+
onRunClick
|
|
408
|
+
}) {
|
|
409
|
+
const columns = React.useMemo(() => createRunTableColumns(), []);
|
|
410
|
+
const controller = useContractTable({
|
|
411
|
+
data: runs,
|
|
412
|
+
columns,
|
|
413
|
+
executionMode: "server",
|
|
414
|
+
totalItems,
|
|
415
|
+
state: {
|
|
416
|
+
sorting,
|
|
417
|
+
pagination: { pageIndex, pageSize }
|
|
418
|
+
},
|
|
419
|
+
onSortingChange,
|
|
420
|
+
onPaginationChange,
|
|
421
|
+
initialState: {
|
|
422
|
+
columnVisibility: { estimatedCostUsd: false }
|
|
423
|
+
},
|
|
424
|
+
getRowId: (run) => run.id,
|
|
425
|
+
renderExpandedContent: (run) => /* @__PURE__ */ jsxDEV3(RunExpandedContent, {
|
|
426
|
+
run
|
|
427
|
+
}, undefined, false, undefined, this),
|
|
428
|
+
getCanExpand: () => true
|
|
429
|
+
});
|
|
430
|
+
return /* @__PURE__ */ jsxDEV3(DataTable, {
|
|
431
|
+
controller,
|
|
432
|
+
title: "Run History",
|
|
433
|
+
description: "Server-mode ContractSpec table with shared pagination, sorting, visibility, and expansion.",
|
|
434
|
+
loading,
|
|
435
|
+
onRowPress: (row) => onRunClick?.(row.id),
|
|
436
|
+
toolbar: /* @__PURE__ */ jsxDEV3(RunTableToolbar, {
|
|
437
|
+
controller,
|
|
438
|
+
totalRuns: totalItems
|
|
439
|
+
}, undefined, false, undefined, this),
|
|
440
|
+
emptyState: /* @__PURE__ */ jsxDEV3("div", {
|
|
441
|
+
className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
|
|
442
|
+
children: "No runs yet"
|
|
443
|
+
}, undefined, false, undefined, this)
|
|
444
|
+
}, undefined, false, undefined, this);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// src/ui/views/RunListView.tsx
|
|
448
|
+
import {
|
|
449
|
+
EmptyState,
|
|
450
|
+
ErrorState,
|
|
451
|
+
LoaderBlock,
|
|
452
|
+
StatCard,
|
|
453
|
+
StatCardGroup
|
|
454
|
+
} from "@contractspec/lib.design-system";
|
|
455
|
+
import { useState as useState3 } from "react";
|
|
456
|
+
import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
|
|
457
|
+
"use client";
|
|
102
458
|
function RunListView({ agentId, onRunClick }) {
|
|
103
|
-
const
|
|
459
|
+
const [sorting, setSorting] = useState3([
|
|
460
|
+
{ id: "queuedAt", desc: true }
|
|
461
|
+
]);
|
|
462
|
+
const [pagination, setPagination] = useState3({
|
|
463
|
+
pageIndex: 0,
|
|
464
|
+
pageSize: 3
|
|
465
|
+
});
|
|
466
|
+
const { data, metrics, loading, error, refetch } = useRunList({
|
|
467
|
+
agentId,
|
|
468
|
+
pageIndex: pagination.pageIndex,
|
|
469
|
+
pageSize: pagination.pageSize,
|
|
470
|
+
sorting
|
|
471
|
+
});
|
|
104
472
|
if (loading && !data) {
|
|
105
|
-
return /* @__PURE__ */
|
|
473
|
+
return /* @__PURE__ */ jsxDEV4(LoaderBlock, {
|
|
106
474
|
label: "Loading runs..."
|
|
107
475
|
}, undefined, false, undefined, this);
|
|
108
476
|
}
|
|
109
477
|
if (error) {
|
|
110
|
-
return /* @__PURE__ */
|
|
478
|
+
return /* @__PURE__ */ jsxDEV4(ErrorState, {
|
|
111
479
|
title: "Failed to load runs",
|
|
112
480
|
description: error.message,
|
|
113
481
|
onRetry: refetch,
|
|
@@ -115,146 +483,63 @@ function RunListView({ agentId, onRunClick }) {
|
|
|
115
483
|
}, undefined, false, undefined, this);
|
|
116
484
|
}
|
|
117
485
|
if (!data?.items.length) {
|
|
118
|
-
return /* @__PURE__ */
|
|
486
|
+
return /* @__PURE__ */ jsxDEV4(EmptyState, {
|
|
119
487
|
title: "No runs yet",
|
|
120
488
|
description: "Execute an agent to see run history here."
|
|
121
489
|
}, undefined, false, undefined, this);
|
|
122
490
|
}
|
|
123
|
-
return /* @__PURE__ */
|
|
491
|
+
return /* @__PURE__ */ jsxDEV4("div", {
|
|
124
492
|
className: "space-y-6",
|
|
125
493
|
children: [
|
|
126
|
-
metrics
|
|
494
|
+
metrics ? /* @__PURE__ */ jsxDEV4(StatCardGroup, {
|
|
127
495
|
children: [
|
|
128
|
-
/* @__PURE__ */
|
|
496
|
+
/* @__PURE__ */ jsxDEV4(StatCard, {
|
|
129
497
|
label: "Total Runs",
|
|
130
498
|
value: metrics.totalRuns
|
|
131
499
|
}, undefined, false, undefined, this),
|
|
132
|
-
/* @__PURE__ */
|
|
500
|
+
/* @__PURE__ */ jsxDEV4(StatCard, {
|
|
133
501
|
label: "Success Rate",
|
|
134
502
|
value: `${(metrics.successRate * 100).toFixed(1)}%`
|
|
135
503
|
}, undefined, false, undefined, this),
|
|
136
|
-
/* @__PURE__ */
|
|
504
|
+
/* @__PURE__ */ jsxDEV4(StatCard, {
|
|
137
505
|
label: "Total Tokens",
|
|
138
506
|
value: formatTokens(metrics.totalTokens)
|
|
139
507
|
}, undefined, false, undefined, this),
|
|
140
|
-
/* @__PURE__ */
|
|
508
|
+
/* @__PURE__ */ jsxDEV4(StatCard, {
|
|
141
509
|
label: "Total Cost",
|
|
142
510
|
value: `$${metrics.totalCostUsd.toFixed(2)}`
|
|
143
511
|
}, undefined, false, undefined, this)
|
|
144
512
|
]
|
|
145
|
-
}, undefined, true, undefined, this),
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
|
|
161
|
-
children: "Agent"
|
|
162
|
-
}, undefined, false, undefined, this),
|
|
163
|
-
/* @__PURE__ */ jsxDEV("th", {
|
|
164
|
-
className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
|
|
165
|
-
children: "Status"
|
|
166
|
-
}, undefined, false, undefined, this),
|
|
167
|
-
/* @__PURE__ */ jsxDEV("th", {
|
|
168
|
-
className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
|
|
169
|
-
children: "Tokens"
|
|
170
|
-
}, undefined, false, undefined, this),
|
|
171
|
-
/* @__PURE__ */ jsxDEV("th", {
|
|
172
|
-
className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
|
|
173
|
-
children: "Duration"
|
|
174
|
-
}, undefined, false, undefined, this),
|
|
175
|
-
/* @__PURE__ */ jsxDEV("th", {
|
|
176
|
-
className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
|
|
177
|
-
children: "Cost"
|
|
178
|
-
}, undefined, false, undefined, this)
|
|
179
|
-
]
|
|
180
|
-
}, undefined, true, undefined, this)
|
|
181
|
-
}, undefined, false, undefined, this),
|
|
182
|
-
/* @__PURE__ */ jsxDEV("tbody", {
|
|
183
|
-
className: "divide-border divide-y",
|
|
184
|
-
children: data.items.map((run) => /* @__PURE__ */ jsxDEV("tr", {
|
|
185
|
-
className: "hover:bg-muted/50 cursor-pointer transition-colors",
|
|
186
|
-
onClick: () => onRunClick?.(run.id),
|
|
187
|
-
children: [
|
|
188
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
189
|
-
className: "px-4 py-3",
|
|
190
|
-
children: [
|
|
191
|
-
/* @__PURE__ */ jsxDEV("div", {
|
|
192
|
-
className: "font-mono text-sm",
|
|
193
|
-
children: run.id.slice(-8)
|
|
194
|
-
}, undefined, false, undefined, this),
|
|
195
|
-
/* @__PURE__ */ jsxDEV("div", {
|
|
196
|
-
className: "text-muted-foreground text-xs",
|
|
197
|
-
children: run.queuedAt.toLocaleString()
|
|
198
|
-
}, undefined, false, undefined, this)
|
|
199
|
-
]
|
|
200
|
-
}, undefined, true, undefined, this),
|
|
201
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
202
|
-
className: "px-4 py-3",
|
|
203
|
-
children: /* @__PURE__ */ jsxDEV("span", {
|
|
204
|
-
className: "font-medium",
|
|
205
|
-
children: run.agentName
|
|
206
|
-
}, undefined, false, undefined, this)
|
|
207
|
-
}, undefined, false, undefined, this),
|
|
208
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
209
|
-
className: "px-4 py-3",
|
|
210
|
-
children: /* @__PURE__ */ jsxDEV(StatusChip, {
|
|
211
|
-
tone: getStatusTone(run.status),
|
|
212
|
-
label: run.status
|
|
213
|
-
}, undefined, false, undefined, this)
|
|
214
|
-
}, undefined, false, undefined, this),
|
|
215
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
216
|
-
className: "px-4 py-3 text-right font-mono text-sm",
|
|
217
|
-
children: formatTokens(run.totalTokens)
|
|
218
|
-
}, undefined, false, undefined, this),
|
|
219
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
220
|
-
className: "px-4 py-3 text-right font-mono text-sm",
|
|
221
|
-
children: formatDuration(run.durationMs)
|
|
222
|
-
}, undefined, false, undefined, this),
|
|
223
|
-
/* @__PURE__ */ jsxDEV("td", {
|
|
224
|
-
className: "px-4 py-3 text-right font-mono text-sm",
|
|
225
|
-
children: formatCost(run.estimatedCostUsd)
|
|
226
|
-
}, undefined, false, undefined, this)
|
|
227
|
-
]
|
|
228
|
-
}, run.id, true, undefined, this))
|
|
229
|
-
}, undefined, false, undefined, this)
|
|
230
|
-
]
|
|
231
|
-
}, undefined, true, undefined, this)
|
|
232
|
-
}, undefined, false, undefined, this),
|
|
233
|
-
/* @__PURE__ */ jsxDEV("div", {
|
|
234
|
-
className: "text-muted-foreground text-center text-sm",
|
|
235
|
-
children: [
|
|
236
|
-
"Showing ",
|
|
237
|
-
data.items.length,
|
|
238
|
-
" of ",
|
|
239
|
-
data.total,
|
|
240
|
-
" runs"
|
|
241
|
-
]
|
|
242
|
-
}, undefined, true, undefined, this)
|
|
513
|
+
}, undefined, true, undefined, this) : null,
|
|
514
|
+
/* @__PURE__ */ jsxDEV4(RunDataTable, {
|
|
515
|
+
runs: data.items,
|
|
516
|
+
totalItems: data.total,
|
|
517
|
+
pageIndex: pagination.pageIndex,
|
|
518
|
+
pageSize: pagination.pageSize,
|
|
519
|
+
sorting,
|
|
520
|
+
loading,
|
|
521
|
+
onSortingChange: (nextSorting) => {
|
|
522
|
+
setSorting(nextSorting);
|
|
523
|
+
setPagination((current) => ({ ...current, pageIndex: 0 }));
|
|
524
|
+
},
|
|
525
|
+
onPaginationChange: setPagination,
|
|
526
|
+
onRunClick
|
|
527
|
+
}, undefined, false, undefined, this)
|
|
243
528
|
]
|
|
244
529
|
}, undefined, true, undefined, this);
|
|
245
530
|
}
|
|
246
531
|
|
|
247
532
|
// src/ui/hooks/useToolList.ts
|
|
248
|
-
import {
|
|
249
|
-
import {
|
|
533
|
+
import { useTemplateRuntime as useTemplateRuntime3 } from "@contractspec/lib.example-shared-ui";
|
|
534
|
+
import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useState as useState4 } from "react";
|
|
250
535
|
function useToolList(options = {}) {
|
|
251
|
-
const { handlers, projectId } =
|
|
536
|
+
const { handlers, projectId } = useTemplateRuntime3();
|
|
252
537
|
const { agent } = handlers;
|
|
253
|
-
const [data, setData] =
|
|
254
|
-
const [loading, setLoading] =
|
|
255
|
-
const [error, setError] =
|
|
256
|
-
const [page, setPage] =
|
|
257
|
-
const fetchData =
|
|
538
|
+
const [data, setData] = useState4(null);
|
|
539
|
+
const [loading, setLoading] = useState4(true);
|
|
540
|
+
const [error, setError] = useState4(null);
|
|
541
|
+
const [page, setPage] = useState4(1);
|
|
542
|
+
const fetchData = useCallback3(async () => {
|
|
258
543
|
setLoading(true);
|
|
259
544
|
setError(null);
|
|
260
545
|
try {
|
|
@@ -281,10 +566,10 @@ function useToolList(options = {}) {
|
|
|
281
566
|
options.limit,
|
|
282
567
|
page
|
|
283
568
|
]);
|
|
284
|
-
|
|
569
|
+
useEffect3(() => {
|
|
285
570
|
fetchData();
|
|
286
571
|
}, [fetchData]);
|
|
287
|
-
const { stats, groupedByCategory, categoryStats } =
|
|
572
|
+
const { stats, groupedByCategory, categoryStats } = useMemo3(() => {
|
|
288
573
|
if (!data)
|
|
289
574
|
return { stats: null, groupedByCategory: {}, categoryStats: [] };
|
|
290
575
|
const items = data.items;
|
|
@@ -329,16 +614,16 @@ function useToolList(options = {}) {
|
|
|
329
614
|
|
|
330
615
|
// src/ui/views/ToolRegistryView.tsx
|
|
331
616
|
import {
|
|
332
|
-
|
|
333
|
-
StatCardGroup as StatCardGroup2,
|
|
334
|
-
StatusChip as StatusChip2,
|
|
335
|
-
EntityCard,
|
|
617
|
+
Button as Button2,
|
|
336
618
|
EmptyState as EmptyState2,
|
|
337
|
-
|
|
619
|
+
EntityCard,
|
|
338
620
|
ErrorState as ErrorState2,
|
|
339
|
-
|
|
621
|
+
LoaderBlock as LoaderBlock2,
|
|
622
|
+
StatCard as StatCard2,
|
|
623
|
+
StatCardGroup as StatCardGroup2,
|
|
624
|
+
StatusChip as StatusChip3
|
|
340
625
|
} from "@contractspec/lib.design-system";
|
|
341
|
-
import { jsxDEV as
|
|
626
|
+
import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
|
|
342
627
|
"use client";
|
|
343
628
|
var categoryIcons = {
|
|
344
629
|
RETRIEVAL: "\uD83D\uDD0D",
|
|
@@ -368,12 +653,12 @@ function ToolRegistryView({
|
|
|
368
653
|
}) {
|
|
369
654
|
const { data, loading, error, groupedByCategory, categoryStats, refetch } = useToolList();
|
|
370
655
|
if (loading && !data) {
|
|
371
|
-
return /* @__PURE__ */
|
|
656
|
+
return /* @__PURE__ */ jsxDEV5(LoaderBlock2, {
|
|
372
657
|
label: "Loading tools..."
|
|
373
658
|
}, undefined, false, undefined, this);
|
|
374
659
|
}
|
|
375
660
|
if (error) {
|
|
376
|
-
return /* @__PURE__ */
|
|
661
|
+
return /* @__PURE__ */ jsxDEV5(ErrorState2, {
|
|
377
662
|
title: "Failed to load tools",
|
|
378
663
|
description: error.message,
|
|
379
664
|
onRetry: refetch,
|
|
@@ -381,64 +666,64 @@ function ToolRegistryView({
|
|
|
381
666
|
}, undefined, false, undefined, this);
|
|
382
667
|
}
|
|
383
668
|
if (!data?.items.length) {
|
|
384
|
-
return /* @__PURE__ */
|
|
669
|
+
return /* @__PURE__ */ jsxDEV5(EmptyState2, {
|
|
385
670
|
title: "No tools registered",
|
|
386
671
|
description: "Create your first tool to extend agent capabilities.",
|
|
387
|
-
primaryAction: onCreateTool ? /* @__PURE__ */
|
|
672
|
+
primaryAction: onCreateTool ? /* @__PURE__ */ jsxDEV5(Button2, {
|
|
388
673
|
onPress: onCreateTool,
|
|
389
674
|
children: "Create Tool"
|
|
390
675
|
}, undefined, false, undefined, this) : undefined
|
|
391
676
|
}, undefined, false, undefined, this);
|
|
392
677
|
}
|
|
393
|
-
return /* @__PURE__ */
|
|
678
|
+
return /* @__PURE__ */ jsxDEV5("div", {
|
|
394
679
|
className: "space-y-8",
|
|
395
680
|
children: [
|
|
396
|
-
/* @__PURE__ */
|
|
681
|
+
/* @__PURE__ */ jsxDEV5(StatCardGroup2, {
|
|
397
682
|
children: [
|
|
398
|
-
/* @__PURE__ */
|
|
683
|
+
/* @__PURE__ */ jsxDEV5(StatCard2, {
|
|
399
684
|
label: "Total Tools",
|
|
400
685
|
value: data.total
|
|
401
686
|
}, undefined, false, undefined, this),
|
|
402
|
-
categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */
|
|
687
|
+
categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsxDEV5(StatCard2, {
|
|
403
688
|
label: `${categoryIcons[category] ?? ""} ${category}`,
|
|
404
689
|
value: count
|
|
405
690
|
}, category, false, undefined, this))
|
|
406
691
|
]
|
|
407
692
|
}, undefined, true, undefined, this),
|
|
408
|
-
Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */
|
|
693
|
+
Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV5("section", {
|
|
409
694
|
className: "space-y-4",
|
|
410
695
|
children: [
|
|
411
|
-
/* @__PURE__ */
|
|
696
|
+
/* @__PURE__ */ jsxDEV5("div", {
|
|
412
697
|
className: "flex items-center gap-2",
|
|
413
698
|
children: [
|
|
414
|
-
/* @__PURE__ */
|
|
699
|
+
/* @__PURE__ */ jsxDEV5("span", {
|
|
415
700
|
className: "text-2xl",
|
|
416
701
|
children: categoryIcons[category]
|
|
417
702
|
}, undefined, false, undefined, this),
|
|
418
|
-
/* @__PURE__ */
|
|
419
|
-
className: "text-lg
|
|
703
|
+
/* @__PURE__ */ jsxDEV5("h3", {
|
|
704
|
+
className: "font-semibold text-lg",
|
|
420
705
|
children: category
|
|
421
706
|
}, undefined, false, undefined, this),
|
|
422
|
-
/* @__PURE__ */
|
|
423
|
-
className: "
|
|
707
|
+
/* @__PURE__ */ jsxDEV5("span", {
|
|
708
|
+
className: "rounded-full bg-muted px-2 py-0.5 text-muted-foreground text-xs",
|
|
424
709
|
children: tools.length
|
|
425
710
|
}, undefined, false, undefined, this)
|
|
426
711
|
]
|
|
427
712
|
}, undefined, true, undefined, this),
|
|
428
|
-
/* @__PURE__ */
|
|
713
|
+
/* @__PURE__ */ jsxDEV5("div", {
|
|
429
714
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
430
|
-
children: tools.map((tool) => /* @__PURE__ */
|
|
715
|
+
children: tools.map((tool) => /* @__PURE__ */ jsxDEV5(EntityCard, {
|
|
431
716
|
cardTitle: tool.name,
|
|
432
717
|
cardSubtitle: `v${tool.version}`,
|
|
433
|
-
meta: /* @__PURE__ */
|
|
718
|
+
meta: /* @__PURE__ */ jsxDEV5("p", {
|
|
434
719
|
className: "text-muted-foreground text-sm",
|
|
435
720
|
children: tool.description
|
|
436
721
|
}, undefined, false, undefined, this),
|
|
437
|
-
chips: /* @__PURE__ */
|
|
722
|
+
chips: /* @__PURE__ */ jsxDEV5(StatusChip3, {
|
|
438
723
|
tone: getStatusTone2(tool.status),
|
|
439
724
|
label: tool.status
|
|
440
725
|
}, undefined, false, undefined, this),
|
|
441
|
-
footer: /* @__PURE__ */
|
|
726
|
+
footer: /* @__PURE__ */ jsxDEV5("code", {
|
|
442
727
|
className: "text-muted-foreground text-xs",
|
|
443
728
|
children: tool.name
|
|
444
729
|
}, undefined, false, undefined, this),
|
|
@@ -451,71 +736,18 @@ function ToolRegistryView({
|
|
|
451
736
|
}, undefined, true, undefined, this);
|
|
452
737
|
}
|
|
453
738
|
|
|
454
|
-
// src/ui/hooks/useAgentList.ts
|
|
455
|
-
import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
|
|
456
|
-
import { useTemplateRuntime as useTemplateRuntime3 } from "@contractspec/lib.example-shared-ui";
|
|
457
|
-
function useAgentList(options = {}) {
|
|
458
|
-
const { handlers, projectId } = useTemplateRuntime3();
|
|
459
|
-
const { agent } = handlers;
|
|
460
|
-
const [data, setData] = useState3(null);
|
|
461
|
-
const [loading, setLoading] = useState3(true);
|
|
462
|
-
const [error, setError] = useState3(null);
|
|
463
|
-
const [page, setPage] = useState3(1);
|
|
464
|
-
const fetchData = useCallback3(async () => {
|
|
465
|
-
setLoading(true);
|
|
466
|
-
setError(null);
|
|
467
|
-
try {
|
|
468
|
-
const result = await agent.listAgents({
|
|
469
|
-
projectId,
|
|
470
|
-
search: options.search,
|
|
471
|
-
status: options.status === "all" ? undefined : options.status,
|
|
472
|
-
limit: options.limit ?? 20,
|
|
473
|
-
offset: (page - 1) * (options.limit ?? 20)
|
|
474
|
-
});
|
|
475
|
-
setData(result);
|
|
476
|
-
} catch (err) {
|
|
477
|
-
setError(err instanceof Error ? err : new Error("Unknown error"));
|
|
478
|
-
} finally {
|
|
479
|
-
setLoading(false);
|
|
480
|
-
}
|
|
481
|
-
}, [agent, projectId, options.search, options.status, options.limit, page]);
|
|
482
|
-
useEffect3(() => {
|
|
483
|
-
fetchData();
|
|
484
|
-
}, [fetchData]);
|
|
485
|
-
const stats = useMemo2(() => {
|
|
486
|
-
if (!data)
|
|
487
|
-
return null;
|
|
488
|
-
return {
|
|
489
|
-
total: data.total,
|
|
490
|
-
active: data.items.filter((a) => a.status === "ACTIVE").length,
|
|
491
|
-
paused: data.items.filter((a) => a.status === "PAUSED").length,
|
|
492
|
-
draft: data.items.filter((a) => a.status === "DRAFT").length
|
|
493
|
-
};
|
|
494
|
-
}, [data]);
|
|
495
|
-
return {
|
|
496
|
-
data,
|
|
497
|
-
loading,
|
|
498
|
-
error,
|
|
499
|
-
stats,
|
|
500
|
-
page,
|
|
501
|
-
refetch: fetchData,
|
|
502
|
-
nextPage: () => setPage((p) => p + 1),
|
|
503
|
-
prevPage: () => page > 1 && setPage((p) => p - 1)
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
|
|
507
739
|
// src/ui/views/AgentListView.tsx
|
|
508
740
|
import {
|
|
509
|
-
Button as
|
|
510
|
-
|
|
511
|
-
StatCardGroup as StatCardGroup3,
|
|
741
|
+
Button as Button3,
|
|
742
|
+
EmptyState as EmptyState3,
|
|
512
743
|
EntityCard as EntityCard2,
|
|
513
|
-
StatusChip as StatusChip3,
|
|
514
|
-
LoaderBlock as LoaderBlock3,
|
|
515
744
|
ErrorState as ErrorState3,
|
|
516
|
-
|
|
745
|
+
LoaderBlock as LoaderBlock3,
|
|
746
|
+
StatCard as StatCard3,
|
|
747
|
+
StatCardGroup as StatCardGroup3,
|
|
748
|
+
StatusChip as StatusChip4
|
|
517
749
|
} from "@contractspec/lib.design-system";
|
|
518
|
-
import { jsxDEV as
|
|
750
|
+
import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
|
|
519
751
|
"use client";
|
|
520
752
|
function getStatusTone3(status) {
|
|
521
753
|
switch (status) {
|
|
@@ -533,12 +765,12 @@ function getStatusTone3(status) {
|
|
|
533
765
|
function AgentListView() {
|
|
534
766
|
const { data, loading, error, stats, refetch } = useAgentList();
|
|
535
767
|
if (loading && !data) {
|
|
536
|
-
return /* @__PURE__ */
|
|
768
|
+
return /* @__PURE__ */ jsxDEV6(LoaderBlock3, {
|
|
537
769
|
label: "Loading agents..."
|
|
538
770
|
}, undefined, false, undefined, this);
|
|
539
771
|
}
|
|
540
772
|
if (error) {
|
|
541
|
-
return /* @__PURE__ */
|
|
773
|
+
return /* @__PURE__ */ jsxDEV6(ErrorState3, {
|
|
542
774
|
title: "Failed to load agents",
|
|
543
775
|
description: error.message,
|
|
544
776
|
onRetry: refetch,
|
|
@@ -546,61 +778,61 @@ function AgentListView() {
|
|
|
546
778
|
}, undefined, false, undefined, this);
|
|
547
779
|
}
|
|
548
780
|
if (!data?.items.length) {
|
|
549
|
-
return /* @__PURE__ */
|
|
781
|
+
return /* @__PURE__ */ jsxDEV6(EmptyState3, {
|
|
550
782
|
title: "No agents yet",
|
|
551
783
|
description: "Create your first AI agent to get started."
|
|
552
784
|
}, undefined, false, undefined, this);
|
|
553
785
|
}
|
|
554
|
-
return /* @__PURE__ */
|
|
786
|
+
return /* @__PURE__ */ jsxDEV6("div", {
|
|
555
787
|
className: "space-y-6",
|
|
556
788
|
children: [
|
|
557
|
-
stats && /* @__PURE__ */
|
|
789
|
+
stats && /* @__PURE__ */ jsxDEV6(StatCardGroup3, {
|
|
558
790
|
children: [
|
|
559
|
-
/* @__PURE__ */
|
|
791
|
+
/* @__PURE__ */ jsxDEV6(StatCard3, {
|
|
560
792
|
label: "Total Agents",
|
|
561
793
|
value: stats.total
|
|
562
794
|
}, undefined, false, undefined, this),
|
|
563
|
-
/* @__PURE__ */
|
|
795
|
+
/* @__PURE__ */ jsxDEV6(StatCard3, {
|
|
564
796
|
label: "Active",
|
|
565
797
|
value: stats.active
|
|
566
798
|
}, undefined, false, undefined, this),
|
|
567
|
-
/* @__PURE__ */
|
|
799
|
+
/* @__PURE__ */ jsxDEV6(StatCard3, {
|
|
568
800
|
label: "Paused",
|
|
569
801
|
value: stats.paused
|
|
570
802
|
}, undefined, false, undefined, this),
|
|
571
|
-
/* @__PURE__ */
|
|
803
|
+
/* @__PURE__ */ jsxDEV6(StatCard3, {
|
|
572
804
|
label: "Draft",
|
|
573
805
|
value: stats.draft
|
|
574
806
|
}, undefined, false, undefined, this)
|
|
575
807
|
]
|
|
576
808
|
}, undefined, true, undefined, this),
|
|
577
|
-
/* @__PURE__ */
|
|
809
|
+
/* @__PURE__ */ jsxDEV6("div", {
|
|
578
810
|
className: "flex items-center justify-between",
|
|
579
811
|
children: [
|
|
580
|
-
/* @__PURE__ */
|
|
581
|
-
className: "text-lg
|
|
812
|
+
/* @__PURE__ */ jsxDEV6("h3", {
|
|
813
|
+
className: "font-semibold text-lg",
|
|
582
814
|
children: "Agents"
|
|
583
815
|
}, undefined, false, undefined, this),
|
|
584
|
-
/* @__PURE__ */
|
|
816
|
+
/* @__PURE__ */ jsxDEV6(Button3, {
|
|
585
817
|
onPress: () => alert("Create Agent clicked!"),
|
|
586
818
|
children: "Create Agent"
|
|
587
819
|
}, undefined, false, undefined, this)
|
|
588
820
|
]
|
|
589
821
|
}, undefined, true, undefined, this),
|
|
590
|
-
/* @__PURE__ */
|
|
822
|
+
/* @__PURE__ */ jsxDEV6("div", {
|
|
591
823
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
592
|
-
children: data.items.map((agent) => /* @__PURE__ */
|
|
824
|
+
children: data.items.map((agent) => /* @__PURE__ */ jsxDEV6(EntityCard2, {
|
|
593
825
|
cardTitle: agent.name,
|
|
594
826
|
cardSubtitle: agent.modelName,
|
|
595
|
-
meta: /* @__PURE__ */
|
|
827
|
+
meta: /* @__PURE__ */ jsxDEV6("p", {
|
|
596
828
|
className: "text-muted-foreground text-sm",
|
|
597
829
|
children: agent.description
|
|
598
830
|
}, undefined, false, undefined, this),
|
|
599
|
-
chips: /* @__PURE__ */
|
|
831
|
+
chips: /* @__PURE__ */ jsxDEV6(StatusChip4, {
|
|
600
832
|
tone: getStatusTone3(agent.status),
|
|
601
833
|
label: agent.status
|
|
602
834
|
}, undefined, false, undefined, this),
|
|
603
|
-
footer: /* @__PURE__ */
|
|
835
|
+
footer: /* @__PURE__ */ jsxDEV6("span", {
|
|
604
836
|
className: "text-muted-foreground text-xs",
|
|
605
837
|
children: [
|
|
606
838
|
"Created ",
|