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