@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.
Files changed (288) hide show
  1. package/.turbo/turbo-build.log +126 -105
  2. package/AGENTS.md +52 -31
  3. package/CHANGELOG.md +29 -0
  4. package/README.md +112 -83
  5. package/dist/agent/agent.event.js +1 -1
  6. package/dist/agent/agent.handler.d.ts +3 -0
  7. package/dist/agent/agent.handler.js +730 -1
  8. package/dist/agent/agent.operation.js +1 -1
  9. package/dist/agent/index.d.ts +5 -5
  10. package/dist/agent/index.js +74 -73
  11. package/dist/agent.feature.js +179 -0
  12. package/dist/browser/agent/agent.event.js +1 -1
  13. package/dist/browser/agent/agent.handler.js +730 -1
  14. package/dist/browser/agent/agent.operation.js +1 -1
  15. package/dist/browser/agent/index.js +74 -73
  16. package/dist/browser/agent.feature.js +179 -0
  17. package/dist/browser/docs/agent-console.docblock.js +11 -8
  18. package/dist/browser/docs/index.js +11 -8
  19. package/dist/browser/example.js +2 -3
  20. package/dist/browser/handlers/agent.handlers.js +1883 -2
  21. package/dist/browser/handlers/index.js +2142 -8
  22. package/dist/browser/index.js +4075 -3161
  23. package/dist/browser/presentations/index.js +51 -51
  24. package/dist/browser/run/index.js +380 -374
  25. package/dist/browser/run/run.event.js +2 -2
  26. package/dist/browser/run/run.handler.js +666 -1
  27. package/dist/browser/run/run.presentation.js +2 -2
  28. package/dist/browser/shared/index.js +293 -1
  29. package/dist/browser/shared/mock-runs.js +5 -0
  30. package/dist/browser/tool/index.js +161 -161
  31. package/dist/browser/tool/tool.event.js +1 -1
  32. package/dist/browser/tool/tool.handler.js +479 -3
  33. package/dist/browser/tool/tool.presentation.js +2 -2
  34. package/dist/browser/ui/AgentDashboard.js +1816 -931
  35. package/dist/browser/ui/AgentDashboard.visualizations.js +217 -0
  36. package/dist/browser/ui/AgentRunList.js +360 -128
  37. package/dist/browser/ui/AgentToolRegistry.js +9 -9
  38. package/dist/browser/ui/hooks/index.js +611 -161
  39. package/dist/browser/ui/hooks/useAgentList.js +1 -1
  40. package/dist/browser/ui/hooks/useAgentMutations.js +444 -9
  41. package/dist/browser/ui/hooks/useRunList.js +26 -11
  42. package/dist/browser/ui/hooks/useToolList.js +1 -1
  43. package/dist/browser/ui/index.js +2161 -1258
  44. package/dist/browser/ui/modals/AgentActionsModal.js +13 -13
  45. package/dist/browser/ui/modals/CreateAgentModal.js +15 -15
  46. package/dist/browser/ui/modals/index.js +297 -297
  47. package/dist/browser/ui/renderers/agent-list.markdown.js +14 -5
  48. package/dist/browser/ui/renderers/agent-list.renderer.js +7 -7
  49. package/dist/browser/ui/renderers/dashboard.markdown.js +207 -36
  50. package/dist/browser/ui/renderers/index.js +359 -163
  51. package/dist/browser/ui/renderers/run-list.markdown.js +9 -4
  52. package/dist/browser/ui/renderers/tool-registry.markdown.js +15 -4
  53. package/dist/browser/ui/views/AgentListView.js +7 -7
  54. package/dist/browser/ui/views/RunDataTable.js +326 -0
  55. package/dist/browser/ui/views/RunListView.js +360 -128
  56. package/dist/browser/ui/views/ToolRegistryView.js +9 -9
  57. package/dist/browser/ui/views/index.js +478 -246
  58. package/dist/browser/ui/views/run-data-table.columns.js +271 -0
  59. package/dist/browser/ui/views/run-list.shared.js +177 -0
  60. package/dist/browser/visualizations/catalog.js +134 -0
  61. package/dist/browser/visualizations/index.js +187 -0
  62. package/dist/browser/visualizations/selectors.js +181 -0
  63. package/dist/docs/agent-console.docblock.js +11 -8
  64. package/dist/docs/index.js +11 -8
  65. package/dist/example.js +2 -3
  66. package/dist/example.test.d.ts +1 -0
  67. package/dist/handlers/agent.handlers.d.ts +2 -0
  68. package/dist/handlers/agent.handlers.js +1883 -2
  69. package/dist/handlers/index.d.ts +2 -4
  70. package/dist/handlers/index.js +2142 -8
  71. package/dist/handlers/mock-handlers.test.d.ts +1 -0
  72. package/dist/index.d.ts +6 -4
  73. package/dist/index.js +4075 -3161
  74. package/dist/node/agent/agent.event.js +1 -1
  75. package/dist/node/agent/agent.handler.js +730 -1
  76. package/dist/node/agent/agent.operation.js +1 -1
  77. package/dist/node/agent/index.js +74 -73
  78. package/dist/node/agent.feature.js +179 -0
  79. package/dist/node/docs/agent-console.docblock.js +11 -8
  80. package/dist/node/docs/index.js +11 -8
  81. package/dist/node/example.js +2 -3
  82. package/dist/node/handlers/agent.handlers.js +1883 -2
  83. package/dist/node/handlers/index.js +2142 -8
  84. package/dist/node/index.js +4075 -3161
  85. package/dist/node/presentations/index.js +51 -51
  86. package/dist/node/run/index.js +380 -374
  87. package/dist/node/run/run.event.js +2 -2
  88. package/dist/node/run/run.handler.js +666 -1
  89. package/dist/node/run/run.presentation.js +2 -2
  90. package/dist/node/shared/index.js +293 -1
  91. package/dist/node/shared/mock-runs.js +5 -0
  92. package/dist/node/tool/index.js +161 -161
  93. package/dist/node/tool/tool.event.js +1 -1
  94. package/dist/node/tool/tool.handler.js +479 -3
  95. package/dist/node/tool/tool.presentation.js +2 -2
  96. package/dist/node/ui/AgentDashboard.js +1816 -931
  97. package/dist/node/ui/AgentDashboard.visualizations.js +217 -0
  98. package/dist/node/ui/AgentRunList.js +360 -128
  99. package/dist/node/ui/AgentToolRegistry.js +9 -9
  100. package/dist/node/ui/hooks/index.js +611 -161
  101. package/dist/node/ui/hooks/useAgentList.js +1 -1
  102. package/dist/node/ui/hooks/useAgentMutations.js +444 -9
  103. package/dist/node/ui/hooks/useRunList.js +26 -11
  104. package/dist/node/ui/hooks/useToolList.js +1 -1
  105. package/dist/node/ui/index.js +2161 -1258
  106. package/dist/node/ui/modals/AgentActionsModal.js +13 -13
  107. package/dist/node/ui/modals/CreateAgentModal.js +15 -15
  108. package/dist/node/ui/modals/index.js +297 -297
  109. package/dist/node/ui/renderers/agent-list.markdown.js +14 -5
  110. package/dist/node/ui/renderers/agent-list.renderer.js +7 -7
  111. package/dist/node/ui/renderers/dashboard.markdown.js +207 -36
  112. package/dist/node/ui/renderers/index.js +359 -163
  113. package/dist/node/ui/renderers/run-list.markdown.js +9 -4
  114. package/dist/node/ui/renderers/tool-registry.markdown.js +15 -4
  115. package/dist/node/ui/views/AgentListView.js +7 -7
  116. package/dist/node/ui/views/RunDataTable.js +326 -0
  117. package/dist/node/ui/views/RunListView.js +360 -128
  118. package/dist/node/ui/views/ToolRegistryView.js +9 -9
  119. package/dist/node/ui/views/index.js +478 -246
  120. package/dist/node/ui/views/run-data-table.columns.js +271 -0
  121. package/dist/node/ui/views/run-list.shared.js +177 -0
  122. package/dist/node/visualizations/catalog.js +134 -0
  123. package/dist/node/visualizations/index.js +187 -0
  124. package/dist/node/visualizations/selectors.js +181 -0
  125. package/dist/presentations/index.d.ts +3 -5
  126. package/dist/presentations/index.js +51 -51
  127. package/dist/proof/index.d.ts +2 -0
  128. package/dist/proof/meetup-proof.d.ts +10 -0
  129. package/dist/proof/meetup-proof.runtime.d.ts +22 -0
  130. package/dist/proof/meetup-proof.scenario.d.ts +2 -0
  131. package/dist/proof/meetup-proof.suite.d.ts +1 -0
  132. package/dist/proof/meetup-proof.test.d.ts +1 -0
  133. package/dist/run/index.d.ts +7 -7
  134. package/dist/run/index.js +380 -374
  135. package/dist/run/run.event.js +2 -2
  136. package/dist/run/run.handler.d.ts +7 -0
  137. package/dist/run/run.handler.js +666 -1
  138. package/dist/run/run.presentation.js +2 -2
  139. package/dist/shared/demo-dashboard-data.d.ts +16 -0
  140. package/dist/shared/demo-runtime-seed.d.ts +17 -0
  141. package/dist/shared/demo-runtime.d.ts +8 -0
  142. package/dist/shared/demo-runtime.test.d.ts +1 -0
  143. package/dist/shared/index.d.ts +4 -1
  144. package/dist/shared/index.js +293 -1
  145. package/dist/shared/mock-runs.d.ts +4 -0
  146. package/dist/shared/mock-runs.js +5 -0
  147. package/dist/tool/index.d.ts +7 -7
  148. package/dist/tool/index.js +161 -161
  149. package/dist/tool/tool.event.js +1 -1
  150. package/dist/tool/tool.handler.d.ts +3 -0
  151. package/dist/tool/tool.handler.js +479 -3
  152. package/dist/tool/tool.presentation.js +2 -2
  153. package/dist/ui/AgentDashboard.js +1816 -931
  154. package/dist/ui/AgentDashboard.sandbox.test.d.ts +1 -0
  155. package/dist/ui/AgentDashboard.visualizations.d.ts +4 -0
  156. package/dist/ui/AgentDashboard.visualizations.js +218 -0
  157. package/dist/ui/AgentRunList.js +360 -128
  158. package/dist/ui/AgentToolRegistry.js +9 -9
  159. package/dist/ui/hooks/index.d.ts +4 -4
  160. package/dist/ui/hooks/index.js +611 -161
  161. package/dist/ui/hooks/useAgentList.d.ts +5 -0
  162. package/dist/ui/hooks/useAgentList.js +1 -1
  163. package/dist/ui/hooks/useAgentMutations.d.ts +9 -2
  164. package/dist/ui/hooks/useAgentMutations.js +444 -9
  165. package/dist/ui/hooks/useRunList.d.ts +13 -2
  166. package/dist/ui/hooks/useRunList.js +26 -11
  167. package/dist/ui/hooks/useToolList.d.ts +5 -0
  168. package/dist/ui/hooks/useToolList.js +1 -1
  169. package/dist/ui/index.d.ts +3 -3
  170. package/dist/ui/index.js +2161 -1258
  171. package/dist/ui/modals/AgentActionsModal.js +13 -13
  172. package/dist/ui/modals/CreateAgentModal.js +15 -15
  173. package/dist/ui/modals/index.d.ts +1 -1
  174. package/dist/ui/modals/index.js +297 -297
  175. package/dist/ui/renderers/agent-list.markdown.d.ts +5 -0
  176. package/dist/ui/renderers/agent-list.markdown.js +14 -5
  177. package/dist/ui/renderers/agent-list.renderer.js +7 -7
  178. package/dist/ui/renderers/dashboard.markdown.d.ts +5 -0
  179. package/dist/ui/renderers/dashboard.markdown.js +207 -36
  180. package/dist/ui/renderers/index.d.ts +2 -2
  181. package/dist/ui/renderers/index.js +359 -163
  182. package/dist/ui/renderers/run-list.markdown.d.ts +5 -0
  183. package/dist/ui/renderers/run-list.markdown.js +9 -4
  184. package/dist/ui/renderers/tool-registry.markdown.d.ts +6 -1
  185. package/dist/ui/renderers/tool-registry.markdown.js +15 -4
  186. package/dist/ui/views/AgentListView.js +7 -7
  187. package/dist/ui/views/RunDataTable.d.ts +18 -0
  188. package/dist/ui/views/RunDataTable.js +327 -0
  189. package/dist/ui/views/RunListView.js +360 -128
  190. package/dist/ui/views/ToolRegistryView.js +9 -9
  191. package/dist/ui/views/index.js +478 -246
  192. package/dist/ui/views/run-data-table.columns.d.ts +3 -0
  193. package/dist/ui/views/run-data-table.columns.js +272 -0
  194. package/dist/ui/views/run-list.shared.d.ts +14 -0
  195. package/dist/ui/views/run-list.shared.js +178 -0
  196. package/dist/visualizations/catalog.d.ts +10 -0
  197. package/dist/visualizations/catalog.js +135 -0
  198. package/dist/visualizations/index.d.ts +2 -0
  199. package/dist/visualizations/index.js +188 -0
  200. package/dist/visualizations/selectors.d.ts +3 -0
  201. package/dist/visualizations/selectors.js +182 -0
  202. package/dist/visualizations/selectors.test.d.ts +1 -0
  203. package/package.json +114 -12
  204. package/proofs/agent-console-meetup.replay.json +220 -0
  205. package/src/agent/agent.entity.ts +111 -111
  206. package/src/agent/agent.enum.ts +12 -12
  207. package/src/agent/agent.event.ts +91 -91
  208. package/src/agent/agent.handler.ts +144 -127
  209. package/src/agent/agent.operation.ts +400 -400
  210. package/src/agent/agent.presentation.ts +62 -62
  211. package/src/agent/agent.schema.ts +175 -175
  212. package/src/agent/agent.test-spec.ts +48 -48
  213. package/src/agent/index.ts +46 -51
  214. package/src/agent.capability.ts +11 -11
  215. package/src/agent.feature.ts +134 -131
  216. package/src/docs/agent-console.docblock.ts +52 -49
  217. package/src/example.test.ts +75 -0
  218. package/src/example.ts +34 -35
  219. package/src/handlers/agent.handlers.ts +576 -522
  220. package/src/handlers/index.ts +30 -14
  221. package/src/handlers/mock-handlers.test.ts +77 -0
  222. package/src/index.ts +10 -9
  223. package/src/presentations/index.ts +11 -13
  224. package/src/proof/index.ts +2 -0
  225. package/src/proof/meetup-proof.runtime.ts +196 -0
  226. package/src/proof/meetup-proof.scenario.ts +99 -0
  227. package/src/proof/meetup-proof.suite.ts +29 -0
  228. package/src/proof/meetup-proof.test.ts +28 -0
  229. package/src/proof/meetup-proof.ts +130 -0
  230. package/src/run/index.ts +49 -54
  231. package/src/run/run.entity.ts +137 -137
  232. package/src/run/run.enum.ts +18 -18
  233. package/src/run/run.event.ts +174 -174
  234. package/src/run/run.handler.ts +113 -96
  235. package/src/run/run.operation.ts +474 -474
  236. package/src/run/run.presentation.ts +42 -42
  237. package/src/run/run.schema.ts +126 -126
  238. package/src/run/run.test-spec.ts +48 -48
  239. package/src/seeders/index.ts +21 -21
  240. package/src/shared/demo-dashboard-data.ts +58 -0
  241. package/src/shared/demo-runtime-seed.ts +139 -0
  242. package/src/shared/demo-runtime.test.ts +169 -0
  243. package/src/shared/demo-runtime.ts +260 -0
  244. package/src/shared/index.ts +12 -1
  245. package/src/shared/mock-agents.ts +76 -76
  246. package/src/shared/mock-runs.ts +107 -102
  247. package/src/shared/mock-tools.ts +140 -140
  248. package/src/shared/overlay-types.ts +23 -23
  249. package/src/tool/index.ts +39 -44
  250. package/src/tool/tool.entity.ts +73 -73
  251. package/src/tool/tool.enum.ts +13 -13
  252. package/src/tool/tool.event.ts +80 -80
  253. package/src/tool/tool.handler.ts +124 -107
  254. package/src/tool/tool.operation.ts +328 -328
  255. package/src/tool/tool.presentation.ts +43 -43
  256. package/src/tool/tool.schema.ts +106 -106
  257. package/src/tool/tool.test-spec.ts +48 -48
  258. package/src/ui/AgentDashboard.sandbox.test.tsx +312 -0
  259. package/src/ui/AgentDashboard.tsx +351 -348
  260. package/src/ui/AgentDashboard.visualizations.tsx +35 -0
  261. package/src/ui/hooks/index.ts +7 -7
  262. package/src/ui/hooks/useAgentList.ts +57 -56
  263. package/src/ui/hooks/useAgentMutations.ts +168 -159
  264. package/src/ui/hooks/useRunList.ts +90 -57
  265. package/src/ui/hooks/useToolList.ts +102 -101
  266. package/src/ui/index.ts +6 -9
  267. package/src/ui/modals/AgentActionsModal.tsx +262 -262
  268. package/src/ui/modals/CreateAgentModal.tsx +232 -232
  269. package/src/ui/modals/index.ts +1 -1
  270. package/src/ui/overlays/demo-overlays.ts +52 -52
  271. package/src/ui/renderers/agent-list.markdown.ts +81 -61
  272. package/src/ui/renderers/agent-list.renderer.tsx +14 -14
  273. package/src/ui/renderers/dashboard.markdown.ts +135 -139
  274. package/src/ui/renderers/index.ts +3 -4
  275. package/src/ui/renderers/run-list.markdown.ts +56 -47
  276. package/src/ui/renderers/tool-registry.markdown.ts +79 -66
  277. package/src/ui/views/AgentListView.tsx +90 -90
  278. package/src/ui/views/RunDataTable.tsx +74 -0
  279. package/src/ui/views/RunListView.tsx +84 -158
  280. package/src/ui/views/ToolRegistryView.tsx +113 -113
  281. package/src/ui/views/run-data-table.columns.tsx +102 -0
  282. package/src/ui/views/run-list.shared.tsx +139 -0
  283. package/src/visualizations/catalog.ts +132 -0
  284. package/src/visualizations/index.ts +2 -0
  285. package/src/visualizations/selectors.test.ts +12 -0
  286. package/src/visualizations/selectors.ts +70 -0
  287. package/tsconfig.json +7 -8
  288. package/tsdown.config.js +24 -3
@@ -1,16 +1,72 @@
1
1
  // @bun
2
- // src/ui/hooks/useRunList.ts
3
- import { useCallback, useEffect, useState } from "react";
2
+ // src/ui/hooks/useAgentList.ts
4
3
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
5
- function useRunList(options = {}) {
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
- limit: options.limit ?? 20,
23
- offset: (page - 1) * (options.limit ?? 20)
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
- }, [agent, projectId, options.agentId, options.status, options.limit, page]);
40
- useEffect(() => {
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: () => setPage((p) => p + 1),
51
- prevPage: () => page > 1 && setPage((p) => p - 1)
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/RunListView.tsx
56
- import {
57
- StatCard,
58
- StatCardGroup,
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 { data, metrics, loading, error, refetch } = useRunList({ agentId });
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__ */ jsxDEV(LoaderBlock, {
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__ */ jsxDEV(ErrorState, {
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__ */ jsxDEV(EmptyState, {
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__ */ jsxDEV("div", {
491
+ return /* @__PURE__ */ jsxDEV4("div", {
124
492
  className: "space-y-6",
125
493
  children: [
126
- metrics && /* @__PURE__ */ jsxDEV(StatCardGroup, {
494
+ metrics ? /* @__PURE__ */ jsxDEV4(StatCardGroup, {
127
495
  children: [
128
- /* @__PURE__ */ jsxDEV(StatCard, {
496
+ /* @__PURE__ */ jsxDEV4(StatCard, {
129
497
  label: "Total Runs",
130
498
  value: metrics.totalRuns
131
499
  }, undefined, false, undefined, this),
132
- /* @__PURE__ */ jsxDEV(StatCard, {
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__ */ jsxDEV(StatCard, {
504
+ /* @__PURE__ */ jsxDEV4(StatCard, {
137
505
  label: "Total Tokens",
138
506
  value: formatTokens(metrics.totalTokens)
139
507
  }, undefined, false, undefined, this),
140
- /* @__PURE__ */ jsxDEV(StatCard, {
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__ */ jsxDEV("div", {
147
- className: "border-border rounded-lg border",
148
- children: /* @__PURE__ */ jsxDEV("table", {
149
- className: "w-full",
150
- children: [
151
- /* @__PURE__ */ jsxDEV("thead", {
152
- className: "border-border bg-muted/30 border-b",
153
- children: /* @__PURE__ */ jsxDEV("tr", {
154
- children: [
155
- /* @__PURE__ */ jsxDEV("th", {
156
- className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
157
- children: "Run"
158
- }, undefined, false, undefined, this),
159
- /* @__PURE__ */ jsxDEV("th", {
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 { useCallback as useCallback2, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
249
- import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
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 } = useTemplateRuntime2();
536
+ const { handlers, projectId } = useTemplateRuntime3();
252
537
  const { agent } = handlers;
253
- const [data, setData] = useState2(null);
254
- const [loading, setLoading] = useState2(true);
255
- const [error, setError] = useState2(null);
256
- const [page, setPage] = useState2(1);
257
- const fetchData = useCallback2(async () => {
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
- useEffect2(() => {
569
+ useEffect3(() => {
285
570
  fetchData();
286
571
  }, [fetchData]);
287
- const { stats, groupedByCategory, categoryStats } = useMemo(() => {
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
- StatCard as StatCard2,
333
- StatCardGroup as StatCardGroup2,
334
- StatusChip as StatusChip2,
335
- EntityCard,
617
+ Button as Button2,
336
618
  EmptyState as EmptyState2,
337
- LoaderBlock as LoaderBlock2,
619
+ EntityCard,
338
620
  ErrorState as ErrorState2,
339
- Button
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 jsxDEV2 } from "react/jsx-dev-runtime";
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__ */ jsxDEV2(LoaderBlock2, {
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__ */ jsxDEV2(ErrorState2, {
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__ */ jsxDEV2(EmptyState2, {
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__ */ jsxDEV2(Button, {
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__ */ jsxDEV2("div", {
678
+ return /* @__PURE__ */ jsxDEV5("div", {
394
679
  className: "space-y-8",
395
680
  children: [
396
- /* @__PURE__ */ jsxDEV2(StatCardGroup2, {
681
+ /* @__PURE__ */ jsxDEV5(StatCardGroup2, {
397
682
  children: [
398
- /* @__PURE__ */ jsxDEV2(StatCard2, {
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__ */ jsxDEV2(StatCard2, {
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__ */ jsxDEV2("section", {
693
+ Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV5("section", {
409
694
  className: "space-y-4",
410
695
  children: [
411
- /* @__PURE__ */ jsxDEV2("div", {
696
+ /* @__PURE__ */ jsxDEV5("div", {
412
697
  className: "flex items-center gap-2",
413
698
  children: [
414
- /* @__PURE__ */ jsxDEV2("span", {
699
+ /* @__PURE__ */ jsxDEV5("span", {
415
700
  className: "text-2xl",
416
701
  children: categoryIcons[category]
417
702
  }, undefined, false, undefined, this),
418
- /* @__PURE__ */ jsxDEV2("h3", {
419
- className: "text-lg font-semibold",
703
+ /* @__PURE__ */ jsxDEV5("h3", {
704
+ className: "font-semibold text-lg",
420
705
  children: category
421
706
  }, undefined, false, undefined, this),
422
- /* @__PURE__ */ jsxDEV2("span", {
423
- className: "bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs",
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__ */ jsxDEV2("div", {
713
+ /* @__PURE__ */ jsxDEV5("div", {
429
714
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
430
- children: tools.map((tool) => /* @__PURE__ */ jsxDEV2(EntityCard, {
715
+ children: tools.map((tool) => /* @__PURE__ */ jsxDEV5(EntityCard, {
431
716
  cardTitle: tool.name,
432
717
  cardSubtitle: `v${tool.version}`,
433
- meta: /* @__PURE__ */ jsxDEV2("p", {
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__ */ jsxDEV2(StatusChip2, {
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__ */ jsxDEV2("code", {
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 Button2,
510
- StatCard as StatCard3,
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
- EmptyState as EmptyState3
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 jsxDEV3 } from "react/jsx-dev-runtime";
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__ */ jsxDEV3(LoaderBlock3, {
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__ */ jsxDEV3(ErrorState3, {
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__ */ jsxDEV3(EmptyState3, {
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__ */ jsxDEV3("div", {
786
+ return /* @__PURE__ */ jsxDEV6("div", {
555
787
  className: "space-y-6",
556
788
  children: [
557
- stats && /* @__PURE__ */ jsxDEV3(StatCardGroup3, {
789
+ stats && /* @__PURE__ */ jsxDEV6(StatCardGroup3, {
558
790
  children: [
559
- /* @__PURE__ */ jsxDEV3(StatCard3, {
791
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
560
792
  label: "Total Agents",
561
793
  value: stats.total
562
794
  }, undefined, false, undefined, this),
563
- /* @__PURE__ */ jsxDEV3(StatCard3, {
795
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
564
796
  label: "Active",
565
797
  value: stats.active
566
798
  }, undefined, false, undefined, this),
567
- /* @__PURE__ */ jsxDEV3(StatCard3, {
799
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
568
800
  label: "Paused",
569
801
  value: stats.paused
570
802
  }, undefined, false, undefined, this),
571
- /* @__PURE__ */ jsxDEV3(StatCard3, {
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__ */ jsxDEV3("div", {
809
+ /* @__PURE__ */ jsxDEV6("div", {
578
810
  className: "flex items-center justify-between",
579
811
  children: [
580
- /* @__PURE__ */ jsxDEV3("h3", {
581
- className: "text-lg font-semibold",
812
+ /* @__PURE__ */ jsxDEV6("h3", {
813
+ className: "font-semibold text-lg",
582
814
  children: "Agents"
583
815
  }, undefined, false, undefined, this),
584
- /* @__PURE__ */ jsxDEV3(Button2, {
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__ */ jsxDEV3("div", {
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__ */ jsxDEV3(EntityCard2, {
824
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV6(EntityCard2, {
593
825
  cardTitle: agent.name,
594
826
  cardSubtitle: agent.modelName,
595
- meta: /* @__PURE__ */ jsxDEV3("p", {
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__ */ jsxDEV3(StatusChip3, {
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__ */ jsxDEV3("span", {
835
+ footer: /* @__PURE__ */ jsxDEV6("span", {
604
836
  className: "text-muted-foreground text-xs",
605
837
  children: [
606
838
  "Created ",