@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
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+
3
+ import {
4
+ VisualizationCard,
5
+ VisualizationGrid,
6
+ } from '@contractspec/lib.design-system';
7
+ import { createAgentVisualizationItems } from '../visualizations';
8
+ import type { Run } from './hooks/useRunList';
9
+
10
+ export function AgentVisualizationOverview({ runs }: { runs: Run[] }) {
11
+ const items = createAgentVisualizationItems(runs);
12
+
13
+ return (
14
+ <section className="space-y-3">
15
+ <div>
16
+ <h3 className="font-semibold text-lg">Operational Visualizations</h3>
17
+ <p className="text-muted-foreground text-sm">
18
+ Contract-backed charts derived from recent run activity.
19
+ </p>
20
+ </div>
21
+ <VisualizationGrid>
22
+ {items.map((item) => (
23
+ <VisualizationCard
24
+ key={item.key}
25
+ data={item.data}
26
+ description={item.description}
27
+ height={item.height}
28
+ spec={item.spec}
29
+ title={item.title}
30
+ />
31
+ ))}
32
+ </VisualizationGrid>
33
+ </section>
34
+ );
35
+ }
@@ -3,12 +3,12 @@
3
3
  /**
4
4
  * Data hooks for agent-console template
5
5
  */
6
- export { useAgentList, type UseAgentListOptions } from './useAgentList';
7
- export { useRunList, type UseRunListOptions } from './useRunList';
8
- export { useToolList, type UseToolListOptions } from './useToolList';
6
+ export { type UseAgentListOptions, useAgentList } from './useAgentList';
9
7
  export {
10
- useAgentMutations,
11
- type UseAgentMutationsOptions,
12
- type CreateAgentInput,
13
- type UpdateAgentInput,
8
+ type CreateAgentInput,
9
+ type UpdateAgentInput,
10
+ type UseAgentMutationsOptions,
11
+ useAgentMutations,
14
12
  } from './useAgentMutations';
13
+ export { type UseRunListOptions, useRunList } from './useRunList';
14
+ export { type UseToolListOptions, useToolList } from './useToolList';
@@ -3,78 +3,79 @@
3
3
  *
4
4
  * Uses runtime-local database-backed handlers.
5
5
  */
6
- import { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
7
  import { useTemplateRuntime } from '@contractspec/lib.example-shared-ui';
8
+ import { useCallback, useEffect, useMemo, useState } from 'react';
8
9
  import type {
9
- Agent as RuntimeAgent,
10
- ListAgentsOutput as RuntimeListAgentsOutput,
10
+ AgentHandlers,
11
+ Agent as RuntimeAgent,
12
+ ListAgentsOutput as RuntimeListAgentsOutput,
11
13
  } from '../../handlers/agent.handlers';
12
- import type { AgentHandlers } from '../../handlers/agent.handlers';
13
14
 
14
15
  // Re-export types for convenience
15
16
  export type Agent = RuntimeAgent;
16
17
  export type ListAgentsOutput = RuntimeListAgentsOutput;
17
18
 
18
19
  export interface UseAgentListOptions {
19
- search?: string;
20
- status?: 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'all';
21
- limit?: number;
20
+ search?: string;
21
+ status?: 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'all';
22
+ limit?: number;
22
23
  }
23
24
 
24
25
  export function useAgentList(options: UseAgentListOptions = {}) {
25
- const { handlers, projectId } = useTemplateRuntime<{
26
- agent: AgentHandlers;
27
- }>();
28
- const { agent } = handlers;
26
+ const { handlers, projectId } = useTemplateRuntime<{
27
+ agent: AgentHandlers;
28
+ }>();
29
+ const { agent } = handlers;
29
30
 
30
- const [data, setData] = useState<ListAgentsOutput | null>(null);
31
- const [loading, setLoading] = useState(true);
32
- const [error, setError] = useState<Error | null>(null);
33
- const [page, setPage] = useState(1);
31
+ const [data, setData] = useState<ListAgentsOutput | null>(null);
32
+ const [loading, setLoading] = useState(true);
33
+ const [error, setError] = useState<Error | null>(null);
34
+ const [page, setPage] = useState(1);
34
35
 
35
- const fetchData = useCallback(async () => {
36
- setLoading(true);
37
- setError(null);
36
+ const fetchData = useCallback(async () => {
37
+ setLoading(true);
38
+ setError(null);
38
39
 
39
- try {
40
- const result = await agent.listAgents({
41
- projectId,
42
- search: options.search,
43
- status: options.status === 'all' ? undefined : options.status,
44
- limit: options.limit ?? 20,
45
- offset: (page - 1) * (options.limit ?? 20),
46
- });
47
- setData(result);
48
- } catch (err) {
49
- setError(err instanceof Error ? err : new Error('Unknown error'));
50
- } finally {
51
- setLoading(false);
52
- }
53
- }, [agent, projectId, options.search, options.status, options.limit, page]);
40
+ try {
41
+ const result = await agent.listAgents({
42
+ projectId,
43
+ search: options.search,
44
+ status: options.status === 'all' ? undefined : options.status,
45
+ limit: options.limit ?? 20,
46
+ offset: (page - 1) * (options.limit ?? 20),
47
+ });
48
+ setData(result);
49
+ } catch (err) {
50
+ setError(err instanceof Error ? err : new Error('Unknown error'));
51
+ } finally {
52
+ setLoading(false);
53
+ }
54
+ }, [agent, projectId, options.search, options.status, options.limit, page]);
54
55
 
55
- useEffect(() => {
56
- fetchData();
57
- }, [fetchData]);
56
+ useEffect(() => {
57
+ fetchData();
58
+ }, [fetchData]);
58
59
 
59
- // Calculate stats
60
- const stats = useMemo(() => {
61
- if (!data) return null;
62
- return {
63
- total: data.total,
64
- active: data.items.filter((a) => a.status === 'ACTIVE').length,
65
- paused: data.items.filter((a) => a.status === 'PAUSED').length,
66
- draft: data.items.filter((a) => a.status === 'DRAFT').length,
67
- };
68
- }, [data]);
60
+ // Calculate stats
61
+ const stats = useMemo(() => {
62
+ if (!data) return null;
63
+ return {
64
+ total: data.total,
65
+ active: data.items.filter((a) => a.status === 'ACTIVE').length,
66
+ paused: data.items.filter((a) => a.status === 'PAUSED').length,
67
+ draft: data.items.filter((a) => a.status === 'DRAFT').length,
68
+ };
69
+ }, [data]);
69
70
 
70
- return {
71
- data,
72
- loading,
73
- error,
74
- stats,
75
- page,
76
- refetch: fetchData,
77
- nextPage: () => setPage((p) => p + 1),
78
- prevPage: () => page > 1 && setPage((p) => p - 1),
79
- };
71
+ return {
72
+ data,
73
+ loading,
74
+ error,
75
+ stats,
76
+ page,
77
+ refetch: fetchData,
78
+ nextPage: () => setPage((p) => p + 1),
79
+ prevPage: () => page > 1 && setPage((p) => p - 1),
80
+ };
80
81
  }
@@ -5,176 +5,185 @@
5
5
  * - CreateAgentCommand
6
6
  * - UpdateAgentCommand
7
7
  */
8
- import { useCallback, useState } from 'react';
8
+
9
9
  import { useTemplateRuntime } from '@contractspec/lib.example-shared-ui';
10
+ import { useCallback, useState } from 'react';
10
11
  import type {
11
- Agent,
12
- Run,
13
- CreateAgentInput,
14
- UpdateAgentInput,
15
- AgentHandlers,
12
+ Agent,
13
+ AgentHandlers,
14
+ CreateAgentInput,
15
+ Run,
16
+ UpdateAgentInput,
16
17
  } from '../../handlers/agent.handlers';
18
+ import { AGENT_CONSOLE_DEMO_ORGANIZATION_ID } from '../../shared/demo-runtime-seed';
17
19
 
18
20
  export interface MutationState<T> {
19
- loading: boolean;
20
- error: Error | null;
21
- data: T | null;
21
+ loading: boolean;
22
+ error: Error | null;
23
+ data: T | null;
22
24
  }
23
25
 
24
26
  export interface UseAgentMutationsOptions {
25
- onSuccess?: () => void;
26
- onError?: (error: Error) => void;
27
+ onSuccess?: () => void;
28
+ onError?: (error: Error) => void;
29
+ }
30
+
31
+ function normalizeMutationError(
32
+ error: unknown,
33
+ fallbackMessage: string
34
+ ): Error {
35
+ return error instanceof Error ? error : new Error(fallbackMessage);
27
36
  }
28
37
 
29
38
  export function useAgentMutations(options: UseAgentMutationsOptions = {}) {
30
- const { handlers, projectId } = useTemplateRuntime<{
31
- agent: AgentHandlers;
32
- }>();
33
- const { agent } = handlers;
34
-
35
- const [createState, setCreateState] = useState<MutationState<Agent>>({
36
- loading: false,
37
- error: null,
38
- data: null,
39
- });
40
-
41
- const [updateState, setUpdateState] = useState<MutationState<Agent>>({
42
- loading: false,
43
- error: null,
44
- data: null,
45
- });
46
-
47
- const [executeState, setExecuteState] = useState<MutationState<Run>>({
48
- loading: false,
49
- error: null,
50
- data: null,
51
- });
52
-
53
- /**
54
- * Create a new agent
55
- */
56
- const createAgent = useCallback(
57
- async (input: CreateAgentInput): Promise<Agent | null> => {
58
- setCreateState({ loading: true, error: null, data: null });
59
- try {
60
- const result = await agent.createAgent(input, {
61
- projectId,
62
- organizationId: 'demo-org',
63
- });
64
- setCreateState({ loading: false, error: null, data: result });
65
- options.onSuccess?.();
66
- return result;
67
- } catch (err) {
68
- const error =
69
- err instanceof Error ? err : new Error('Failed to create agent');
70
- setCreateState({ loading: false, error, data: null });
71
- options.onError?.(error);
72
- return null;
73
- }
74
- },
75
- [agent, projectId, options]
76
- );
77
-
78
- /**
79
- * Update an agent (name, status)
80
- */
81
- const updateAgent = useCallback(
82
- async (input: UpdateAgentInput): Promise<Agent | null> => {
83
- setUpdateState({ loading: true, error: null, data: null });
84
- try {
85
- const result = await agent.updateAgent(input);
86
- setUpdateState({ loading: false, error: null, data: result });
87
- options.onSuccess?.();
88
- return result;
89
- } catch (err) {
90
- const error =
91
- err instanceof Error ? err : new Error('Failed to update agent');
92
- setUpdateState({ loading: false, error, data: null });
93
- options.onError?.(error);
94
- return null;
95
- }
96
- },
97
- [agent, options]
98
- );
99
-
100
- /**
101
- * Activate an agent
102
- */
103
- const activateAgent = useCallback(
104
- async (agentId: string): Promise<Agent | null> => {
105
- return updateAgent({ id: agentId, status: 'ACTIVE' });
106
- },
107
- [updateAgent]
108
- );
109
-
110
- /**
111
- * Pause an agent
112
- */
113
- const pauseAgent = useCallback(
114
- async (agentId: string): Promise<Agent | null> => {
115
- return updateAgent({ id: agentId, status: 'PAUSED' });
116
- },
117
- [updateAgent]
118
- );
119
-
120
- /**
121
- * Archive an agent
122
- */
123
- const archiveAgent = useCallback(
124
- async (agentId: string): Promise<Agent | null> => {
125
- return updateAgent({ id: agentId, status: 'ARCHIVED' });
126
- },
127
- [updateAgent]
128
- );
129
-
130
- /**
131
- * Execute an agent (creates a queued run).
132
- */
133
- const executeAgent = useCallback(
134
- async (input: {
135
- agentId: string;
136
- message: string;
137
- }): Promise<Run | null> => {
138
- setExecuteState({ loading: true, error: null, data: null });
139
- try {
140
- const result = await agent.executeAgent({
141
- agentId: input.agentId,
142
- message: input.message,
143
- context: { projectId, organizationId: 'demo-org' },
144
- });
145
- setExecuteState({ loading: false, error: null, data: result });
146
- options.onSuccess?.();
147
- return result;
148
- } catch (err) {
149
- const error =
150
- err instanceof Error ? err : new Error('Failed to execute agent');
151
- setExecuteState({ loading: false, error, data: null });
152
- options.onError?.(error);
153
- return null;
154
- }
155
- },
156
- [agent, projectId, options]
157
- );
158
-
159
- return {
160
- // Mutations
161
- createAgent,
162
- updateAgent,
163
- activateAgent,
164
- pauseAgent,
165
- archiveAgent,
166
- executeAgent,
167
-
168
- // State
169
- createState,
170
- updateState,
171
- executeState,
172
-
173
- // Convenience
174
- isLoading:
175
- createState.loading || updateState.loading || executeState.loading,
176
- };
39
+ const { handlers, projectId } = useTemplateRuntime<{
40
+ agent: AgentHandlers;
41
+ }>();
42
+ const { agent } = handlers;
43
+
44
+ const [createState, setCreateState] = useState<MutationState<Agent>>({
45
+ loading: false,
46
+ error: null,
47
+ data: null,
48
+ });
49
+
50
+ const [updateState, setUpdateState] = useState<MutationState<Agent>>({
51
+ loading: false,
52
+ error: null,
53
+ data: null,
54
+ });
55
+
56
+ const [executeState, setExecuteState] = useState<MutationState<Run>>({
57
+ loading: false,
58
+ error: null,
59
+ data: null,
60
+ });
61
+
62
+ /**
63
+ * Create a new agent
64
+ */
65
+ const createAgent = useCallback(
66
+ async (input: CreateAgentInput): Promise<Agent | null> => {
67
+ setCreateState({ loading: true, error: null, data: null });
68
+ try {
69
+ const result = await agent.createAgent(input, {
70
+ projectId,
71
+ organizationId: AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
72
+ });
73
+ setCreateState({ loading: false, error: null, data: result });
74
+ options.onSuccess?.();
75
+ return result;
76
+ } catch (err) {
77
+ const error = normalizeMutationError(err, 'Failed to create agent');
78
+ setCreateState({ loading: false, error, data: null });
79
+ options.onError?.(error);
80
+ throw error;
81
+ }
82
+ },
83
+ [agent, projectId, options]
84
+ );
85
+
86
+ /**
87
+ * Update an agent (name, status)
88
+ */
89
+ const updateAgent = useCallback(
90
+ async (input: UpdateAgentInput): Promise<Agent | null> => {
91
+ setUpdateState({ loading: true, error: null, data: null });
92
+ try {
93
+ const result = await agent.updateAgent(input);
94
+ setUpdateState({ loading: false, error: null, data: result });
95
+ options.onSuccess?.();
96
+ return result;
97
+ } catch (err) {
98
+ const error = normalizeMutationError(err, 'Failed to update agent');
99
+ setUpdateState({ loading: false, error, data: null });
100
+ options.onError?.(error);
101
+ throw error;
102
+ }
103
+ },
104
+ [agent, options]
105
+ );
106
+
107
+ /**
108
+ * Activate an agent
109
+ */
110
+ const activateAgent = useCallback(
111
+ async (agentId: string): Promise<Agent | null> => {
112
+ return updateAgent({ id: agentId, status: 'ACTIVE' });
113
+ },
114
+ [updateAgent]
115
+ );
116
+
117
+ /**
118
+ * Pause an agent
119
+ */
120
+ const pauseAgent = useCallback(
121
+ async (agentId: string): Promise<Agent | null> => {
122
+ return updateAgent({ id: agentId, status: 'PAUSED' });
123
+ },
124
+ [updateAgent]
125
+ );
126
+
127
+ /**
128
+ * Archive an agent
129
+ */
130
+ const archiveAgent = useCallback(
131
+ async (agentId: string): Promise<Agent | null> => {
132
+ return updateAgent({ id: agentId, status: 'ARCHIVED' });
133
+ },
134
+ [updateAgent]
135
+ );
136
+
137
+ /**
138
+ * Execute an agent (creates a queued run).
139
+ */
140
+ const executeAgent = useCallback(
141
+ async (input: {
142
+ agentId: string;
143
+ message: string;
144
+ }): Promise<Run | null> => {
145
+ setExecuteState({ loading: true, error: null, data: null });
146
+ try {
147
+ const result = await agent.executeAgent({
148
+ agentId: input.agentId,
149
+ message: input.message,
150
+ context: {
151
+ projectId,
152
+ organizationId: AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
153
+ },
154
+ });
155
+ setExecuteState({ loading: false, error: null, data: result });
156
+ options.onSuccess?.();
157
+ return result;
158
+ } catch (err) {
159
+ const error = normalizeMutationError(err, 'Failed to execute agent');
160
+ setExecuteState({ loading: false, error, data: null });
161
+ options.onError?.(error);
162
+ throw error;
163
+ }
164
+ },
165
+ [agent, projectId, options]
166
+ );
167
+
168
+ return {
169
+ // Mutations
170
+ createAgent,
171
+ updateAgent,
172
+ activateAgent,
173
+ pauseAgent,
174
+ archiveAgent,
175
+ executeAgent,
176
+
177
+ // State
178
+ createState,
179
+ updateState,
180
+ executeState,
181
+
182
+ // Convenience
183
+ isLoading:
184
+ createState.loading || updateState.loading || executeState.loading,
185
+ };
177
186
  }
178
187
 
179
188
  // Re-export types for convenience
180
- export type { CreateAgentInput, UpdateAgentInput, Agent, Run };
189
+ export type { Agent, CreateAgentInput, Run, UpdateAgentInput };