@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,15 +1,71 @@
1
- // src/ui/hooks/useRunList.ts
2
- import { useCallback, useEffect, useState } from "react";
1
+ // src/ui/hooks/useAgentList.ts
3
2
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
4
- function useRunList(options = {}) {
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
- limit: options.limit ?? 20,
22
- offset: (page - 1) * (options.limit ?? 20)
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
- }, [agent, projectId, options.agentId, options.status, options.limit, page]);
39
- useEffect(() => {
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: () => setPage((p) => p + 1),
50
- prevPage: () => page > 1 && setPage((p) => p - 1)
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/RunListView.tsx
55
- import {
56
- StatCard,
57
- StatCardGroup,
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 { data, metrics, loading, error, refetch } = useRunList({ agentId });
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__ */ jsxDEV(LoaderBlock, {
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__ */ jsxDEV(ErrorState, {
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__ */ jsxDEV(EmptyState, {
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__ */ jsxDEV("div", {
490
+ return /* @__PURE__ */ jsxDEV4("div", {
123
491
  className: "space-y-6",
124
492
  children: [
125
- metrics && /* @__PURE__ */ jsxDEV(StatCardGroup, {
493
+ metrics ? /* @__PURE__ */ jsxDEV4(StatCardGroup, {
126
494
  children: [
127
- /* @__PURE__ */ jsxDEV(StatCard, {
495
+ /* @__PURE__ */ jsxDEV4(StatCard, {
128
496
  label: "Total Runs",
129
497
  value: metrics.totalRuns
130
498
  }, undefined, false, undefined, this),
131
- /* @__PURE__ */ jsxDEV(StatCard, {
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__ */ jsxDEV(StatCard, {
503
+ /* @__PURE__ */ jsxDEV4(StatCard, {
136
504
  label: "Total Tokens",
137
505
  value: formatTokens(metrics.totalTokens)
138
506
  }, undefined, false, undefined, this),
139
- /* @__PURE__ */ jsxDEV(StatCard, {
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__ */ jsxDEV("div", {
146
- className: "border-border rounded-lg border",
147
- children: /* @__PURE__ */ jsxDEV("table", {
148
- className: "w-full",
149
- children: [
150
- /* @__PURE__ */ jsxDEV("thead", {
151
- className: "border-border bg-muted/30 border-b",
152
- children: /* @__PURE__ */ jsxDEV("tr", {
153
- children: [
154
- /* @__PURE__ */ jsxDEV("th", {
155
- className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
156
- children: "Run"
157
- }, undefined, false, undefined, this),
158
- /* @__PURE__ */ jsxDEV("th", {
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 { useCallback as useCallback2, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
248
- import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
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 } = useTemplateRuntime2();
535
+ const { handlers, projectId } = useTemplateRuntime3();
251
536
  const { agent } = handlers;
252
- const [data, setData] = useState2(null);
253
- const [loading, setLoading] = useState2(true);
254
- const [error, setError] = useState2(null);
255
- const [page, setPage] = useState2(1);
256
- const fetchData = useCallback2(async () => {
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
- useEffect2(() => {
568
+ useEffect3(() => {
284
569
  fetchData();
285
570
  }, [fetchData]);
286
- const { stats, groupedByCategory, categoryStats } = useMemo(() => {
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
- StatCard as StatCard2,
332
- StatCardGroup as StatCardGroup2,
333
- StatusChip as StatusChip2,
334
- EntityCard,
616
+ Button as Button2,
335
617
  EmptyState as EmptyState2,
336
- LoaderBlock as LoaderBlock2,
618
+ EntityCard,
337
619
  ErrorState as ErrorState2,
338
- Button
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 jsxDEV2 } from "react/jsx-dev-runtime";
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__ */ jsxDEV2(LoaderBlock2, {
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__ */ jsxDEV2(ErrorState2, {
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__ */ jsxDEV2(EmptyState2, {
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__ */ jsxDEV2(Button, {
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__ */ jsxDEV2("div", {
677
+ return /* @__PURE__ */ jsxDEV5("div", {
393
678
  className: "space-y-8",
394
679
  children: [
395
- /* @__PURE__ */ jsxDEV2(StatCardGroup2, {
680
+ /* @__PURE__ */ jsxDEV5(StatCardGroup2, {
396
681
  children: [
397
- /* @__PURE__ */ jsxDEV2(StatCard2, {
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__ */ jsxDEV2(StatCard2, {
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__ */ jsxDEV2("section", {
692
+ Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV5("section", {
408
693
  className: "space-y-4",
409
694
  children: [
410
- /* @__PURE__ */ jsxDEV2("div", {
695
+ /* @__PURE__ */ jsxDEV5("div", {
411
696
  className: "flex items-center gap-2",
412
697
  children: [
413
- /* @__PURE__ */ jsxDEV2("span", {
698
+ /* @__PURE__ */ jsxDEV5("span", {
414
699
  className: "text-2xl",
415
700
  children: categoryIcons[category]
416
701
  }, undefined, false, undefined, this),
417
- /* @__PURE__ */ jsxDEV2("h3", {
418
- className: "text-lg font-semibold",
702
+ /* @__PURE__ */ jsxDEV5("h3", {
703
+ className: "font-semibold text-lg",
419
704
  children: category
420
705
  }, undefined, false, undefined, this),
421
- /* @__PURE__ */ jsxDEV2("span", {
422
- className: "bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs",
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__ */ jsxDEV2("div", {
712
+ /* @__PURE__ */ jsxDEV5("div", {
428
713
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
429
- children: tools.map((tool) => /* @__PURE__ */ jsxDEV2(EntityCard, {
714
+ children: tools.map((tool) => /* @__PURE__ */ jsxDEV5(EntityCard, {
430
715
  cardTitle: tool.name,
431
716
  cardSubtitle: `v${tool.version}`,
432
- meta: /* @__PURE__ */ jsxDEV2("p", {
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__ */ jsxDEV2(StatusChip2, {
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__ */ jsxDEV2("code", {
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 Button2,
509
- StatCard as StatCard3,
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
- EmptyState as EmptyState3
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 jsxDEV3 } from "react/jsx-dev-runtime";
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__ */ jsxDEV3(LoaderBlock3, {
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__ */ jsxDEV3(ErrorState3, {
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__ */ jsxDEV3(EmptyState3, {
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__ */ jsxDEV3("div", {
785
+ return /* @__PURE__ */ jsxDEV6("div", {
554
786
  className: "space-y-6",
555
787
  children: [
556
- stats && /* @__PURE__ */ jsxDEV3(StatCardGroup3, {
788
+ stats && /* @__PURE__ */ jsxDEV6(StatCardGroup3, {
557
789
  children: [
558
- /* @__PURE__ */ jsxDEV3(StatCard3, {
790
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
559
791
  label: "Total Agents",
560
792
  value: stats.total
561
793
  }, undefined, false, undefined, this),
562
- /* @__PURE__ */ jsxDEV3(StatCard3, {
794
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
563
795
  label: "Active",
564
796
  value: stats.active
565
797
  }, undefined, false, undefined, this),
566
- /* @__PURE__ */ jsxDEV3(StatCard3, {
798
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
567
799
  label: "Paused",
568
800
  value: stats.paused
569
801
  }, undefined, false, undefined, this),
570
- /* @__PURE__ */ jsxDEV3(StatCard3, {
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__ */ jsxDEV3("div", {
808
+ /* @__PURE__ */ jsxDEV6("div", {
577
809
  className: "flex items-center justify-between",
578
810
  children: [
579
- /* @__PURE__ */ jsxDEV3("h3", {
580
- className: "text-lg font-semibold",
811
+ /* @__PURE__ */ jsxDEV6("h3", {
812
+ className: "font-semibold text-lg",
581
813
  children: "Agents"
582
814
  }, undefined, false, undefined, this),
583
- /* @__PURE__ */ jsxDEV3(Button2, {
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__ */ jsxDEV3("div", {
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__ */ jsxDEV3(EntityCard2, {
823
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV6(EntityCard2, {
592
824
  cardTitle: agent.name,
593
825
  cardSubtitle: agent.modelName,
594
- meta: /* @__PURE__ */ jsxDEV3("p", {
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__ */ jsxDEV3(StatusChip3, {
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__ */ jsxDEV3("span", {
834
+ footer: /* @__PURE__ */ jsxDEV6("span", {
603
835
  className: "text-muted-foreground text-xs",
604
836
  children: [
605
837
  "Created ",