@contractspec/example.agent-console 1.57.0 → 1.58.0

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 (386) hide show
  1. package/.turbo/turbo-build.log +210 -278
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +16 -0
  4. package/dist/agent/agent.entity.d.ts +35 -40
  5. package/dist/agent/agent.entity.d.ts.map +1 -1
  6. package/dist/agent/agent.entity.js +124 -132
  7. package/dist/agent/agent.enum.d.ts +3 -8
  8. package/dist/agent/agent.enum.d.ts.map +1 -1
  9. package/dist/agent/agent.enum.js +22 -30
  10. package/dist/agent/agent.event.d.ts +105 -111
  11. package/dist/agent/agent.event.d.ts.map +1 -1
  12. package/dist/agent/agent.event.js +107 -200
  13. package/dist/agent/agent.handler.d.ts +74 -77
  14. package/dist/agent/agent.handler.d.ts.map +1 -1
  15. package/dist/agent/agent.handler.js +293 -75
  16. package/dist/agent/agent.operation.d.ts +424 -430
  17. package/dist/agent/agent.operation.d.ts.map +1 -1
  18. package/dist/agent/agent.operation.js +728 -478
  19. package/dist/agent/agent.presentation.d.ts +3 -8
  20. package/dist/agent/agent.presentation.d.ts.map +1 -1
  21. package/dist/agent/agent.presentation.js +275 -84
  22. package/dist/agent/agent.schema.d.ts +371 -376
  23. package/dist/agent/agent.schema.d.ts.map +1 -1
  24. package/dist/agent/agent.schema.js +209 -399
  25. package/dist/agent/agent.test-spec.d.ts +2 -7
  26. package/dist/agent/agent.test-spec.d.ts.map +1 -1
  27. package/dist/agent/agent.test-spec.js +56 -62
  28. package/dist/agent/index.d.ts +11 -8
  29. package/dist/agent/index.d.ts.map +1 -0
  30. package/dist/agent/index.js +1245 -9
  31. package/dist/agent.capability.d.ts +1 -6
  32. package/dist/agent.capability.d.ts.map +1 -1
  33. package/dist/agent.capability.js +17 -20
  34. package/dist/agent.feature.d.ts +7 -6
  35. package/dist/agent.feature.d.ts.map +1 -1
  36. package/dist/agent.feature.js +117 -303
  37. package/dist/browser/agent/agent.entity.js +127 -0
  38. package/dist/browser/agent/agent.enum.js +25 -0
  39. package/dist/browser/agent/agent.event.js +116 -0
  40. package/dist/browser/agent/agent.handler.js +301 -0
  41. package/dist/browser/agent/agent.operation.js +735 -0
  42. package/dist/browser/agent/agent.presentation.js +279 -0
  43. package/dist/browser/agent/agent.schema.js +215 -0
  44. package/dist/browser/agent/agent.test-spec.js +58 -0
  45. package/dist/browser/agent/index.js +1244 -0
  46. package/dist/browser/agent.capability.js +16 -0
  47. package/dist/browser/agent.feature.js +118 -0
  48. package/dist/browser/docs/agent-console.docblock.js +93 -0
  49. package/dist/browser/docs/index.js +93 -0
  50. package/dist/browser/example.js +42 -0
  51. package/dist/browser/handlers/agent.handlers.js +252 -0
  52. package/dist/browser/handlers/index.js +799 -0
  53. package/dist/browser/index.js +5895 -0
  54. package/dist/browser/presentations/index.js +684 -0
  55. package/dist/browser/run/index.js +1350 -0
  56. package/dist/browser/run/run.entity.js +160 -0
  57. package/dist/browser/run/run.enum.js +34 -0
  58. package/dist/browser/run/run.event.js +213 -0
  59. package/dist/browser/run/run.handler.js +254 -0
  60. package/dist/browser/run/run.operation.js +667 -0
  61. package/dist/browser/run/run.presentation.js +220 -0
  62. package/dist/browser/run/run.schema.js +179 -0
  63. package/dist/browser/run/run.test-spec.js +58 -0
  64. package/dist/browser/seeders/index.js +21 -0
  65. package/dist/browser/shared/index.js +334 -0
  66. package/dist/browser/shared/mock-agents.js +82 -0
  67. package/dist/browser/shared/mock-runs.js +108 -0
  68. package/dist/browser/shared/mock-tools.js +146 -0
  69. package/dist/browser/shared/overlay-types.js +0 -0
  70. package/dist/browser/tool/index.js +946 -0
  71. package/dist/browser/tool/tool.entity.js +90 -0
  72. package/dist/browser/tool/tool.enum.js +26 -0
  73. package/dist/browser/tool/tool.event.js +99 -0
  74. package/dist/browser/tool/tool.handler.js +223 -0
  75. package/dist/browser/tool/tool.operation.js +482 -0
  76. package/dist/browser/tool/tool.presentation.js +185 -0
  77. package/dist/browser/tool/tool.schema.js +141 -0
  78. package/dist/browser/tool/tool.test-spec.js +58 -0
  79. package/dist/browser/ui/AgentDashboard.js +1607 -0
  80. package/dist/browser/ui/AgentRunList.js +250 -0
  81. package/dist/browser/ui/AgentToolRegistry.js +212 -0
  82. package/dist/browser/ui/hooks/index.js +271 -0
  83. package/dist/browser/ui/hooks/useAgentList.js +55 -0
  84. package/dist/browser/ui/hooks/useAgentMutations.js +76 -0
  85. package/dist/browser/ui/hooks/useRunList.js +55 -0
  86. package/dist/browser/ui/hooks/useToolList.js +85 -0
  87. package/dist/browser/ui/index.js +2080 -0
  88. package/dist/browser/ui/modals/AgentActionsModal.js +304 -0
  89. package/dist/browser/ui/modals/CreateAgentModal.js +229 -0
  90. package/dist/browser/ui/modals/index.js +532 -0
  91. package/dist/browser/ui/overlays/demo-overlays.js +64 -0
  92. package/dist/browser/ui/overlays/index.js +64 -0
  93. package/dist/browser/ui/renderers/agent-list.markdown.js +55 -0
  94. package/dist/browser/ui/renderers/agent-list.renderer.js +180 -0
  95. package/dist/browser/ui/renderers/dashboard.markdown.js +117 -0
  96. package/dist/browser/ui/renderers/index.js +446 -0
  97. package/dist/browser/ui/renderers/run-list.markdown.js +45 -0
  98. package/dist/browser/ui/renderers/tool-registry.markdown.js +53 -0
  99. package/dist/browser/ui/views/AgentListView.js +165 -0
  100. package/dist/browser/ui/views/RunListView.js +247 -0
  101. package/dist/browser/ui/views/ToolRegistryView.js +209 -0
  102. package/dist/browser/ui/views/index.js +619 -0
  103. package/dist/docs/agent-console.docblock.d.ts +2 -1
  104. package/dist/docs/agent-console.docblock.d.ts.map +1 -0
  105. package/dist/docs/agent-console.docblock.js +45 -64
  106. package/dist/docs/index.d.ts +2 -1
  107. package/dist/docs/index.d.ts.map +1 -0
  108. package/dist/docs/index.js +94 -1
  109. package/dist/example.d.ts +2 -6
  110. package/dist/example.d.ts.map +1 -1
  111. package/dist/example.js +41 -55
  112. package/dist/handlers/agent.handlers.d.ts +121 -120
  113. package/dist/handlers/agent.handlers.d.ts.map +1 -1
  114. package/dist/handlers/agent.handlers.js +235 -245
  115. package/dist/handlers/index.d.ts +8 -5
  116. package/dist/handlers/index.d.ts.map +1 -0
  117. package/dist/handlers/index.js +799 -5
  118. package/dist/index.d.ts +26 -48
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +5896 -50
  121. package/dist/node/agent/agent.entity.js +127 -0
  122. package/dist/node/agent/agent.enum.js +25 -0
  123. package/dist/node/agent/agent.event.js +116 -0
  124. package/dist/node/agent/agent.handler.js +301 -0
  125. package/dist/node/agent/agent.operation.js +735 -0
  126. package/dist/node/agent/agent.presentation.js +279 -0
  127. package/dist/node/agent/agent.schema.js +215 -0
  128. package/dist/node/agent/agent.test-spec.js +58 -0
  129. package/dist/node/agent/index.js +1244 -0
  130. package/dist/node/agent.capability.js +16 -0
  131. package/dist/node/agent.feature.js +118 -0
  132. package/dist/node/docs/agent-console.docblock.js +93 -0
  133. package/dist/node/docs/index.js +93 -0
  134. package/dist/node/example.js +42 -0
  135. package/dist/node/handlers/agent.handlers.js +252 -0
  136. package/dist/node/handlers/index.js +799 -0
  137. package/dist/node/index.js +5895 -0
  138. package/dist/node/presentations/index.js +684 -0
  139. package/dist/node/run/index.js +1350 -0
  140. package/dist/node/run/run.entity.js +160 -0
  141. package/dist/node/run/run.enum.js +34 -0
  142. package/dist/node/run/run.event.js +213 -0
  143. package/dist/node/run/run.handler.js +254 -0
  144. package/dist/node/run/run.operation.js +667 -0
  145. package/dist/node/run/run.presentation.js +220 -0
  146. package/dist/node/run/run.schema.js +179 -0
  147. package/dist/node/run/run.test-spec.js +58 -0
  148. package/dist/node/seeders/index.js +21 -0
  149. package/dist/node/shared/index.js +334 -0
  150. package/dist/node/shared/mock-agents.js +82 -0
  151. package/dist/node/shared/mock-runs.js +108 -0
  152. package/dist/node/shared/mock-tools.js +146 -0
  153. package/dist/node/shared/overlay-types.js +0 -0
  154. package/dist/node/tool/index.js +946 -0
  155. package/dist/node/tool/tool.entity.js +90 -0
  156. package/dist/node/tool/tool.enum.js +26 -0
  157. package/dist/node/tool/tool.event.js +99 -0
  158. package/dist/node/tool/tool.handler.js +223 -0
  159. package/dist/node/tool/tool.operation.js +482 -0
  160. package/dist/node/tool/tool.presentation.js +185 -0
  161. package/dist/node/tool/tool.schema.js +141 -0
  162. package/dist/node/tool/tool.test-spec.js +58 -0
  163. package/dist/node/ui/AgentDashboard.js +1607 -0
  164. package/dist/node/ui/AgentRunList.js +250 -0
  165. package/dist/node/ui/AgentToolRegistry.js +212 -0
  166. package/dist/node/ui/hooks/index.js +271 -0
  167. package/dist/node/ui/hooks/useAgentList.js +55 -0
  168. package/dist/node/ui/hooks/useAgentMutations.js +76 -0
  169. package/dist/node/ui/hooks/useRunList.js +55 -0
  170. package/dist/node/ui/hooks/useToolList.js +85 -0
  171. package/dist/node/ui/index.js +2080 -0
  172. package/dist/node/ui/modals/AgentActionsModal.js +304 -0
  173. package/dist/node/ui/modals/CreateAgentModal.js +229 -0
  174. package/dist/node/ui/modals/index.js +532 -0
  175. package/dist/node/ui/overlays/demo-overlays.js +64 -0
  176. package/dist/node/ui/overlays/index.js +64 -0
  177. package/dist/node/ui/renderers/agent-list.markdown.js +55 -0
  178. package/dist/node/ui/renderers/agent-list.renderer.js +180 -0
  179. package/dist/node/ui/renderers/dashboard.markdown.js +117 -0
  180. package/dist/node/ui/renderers/index.js +446 -0
  181. package/dist/node/ui/renderers/run-list.markdown.js +45 -0
  182. package/dist/node/ui/renderers/tool-registry.markdown.js +53 -0
  183. package/dist/node/ui/views/AgentListView.js +165 -0
  184. package/dist/node/ui/views/RunListView.js +247 -0
  185. package/dist/node/ui/views/ToolRegistryView.js +209 -0
  186. package/dist/node/ui/views/index.js +619 -0
  187. package/dist/presentations/index.d.ts +9 -4
  188. package/dist/presentations/index.d.ts.map +1 -0
  189. package/dist/presentations/index.js +684 -4
  190. package/dist/run/index.d.ts +11 -8
  191. package/dist/run/index.d.ts.map +1 -0
  192. package/dist/run/index.js +1351 -9
  193. package/dist/run/run.entity.d.ts +55 -60
  194. package/dist/run/run.entity.d.ts.map +1 -1
  195. package/dist/run/run.entity.js +155 -199
  196. package/dist/run/run.enum.d.ts +4 -9
  197. package/dist/run/run.enum.d.ts.map +1 -1
  198. package/dist/run/run.enum.js +30 -40
  199. package/dist/run/run.event.d.ts +255 -261
  200. package/dist/run/run.event.d.ts.map +1 -1
  201. package/dist/run/run.event.js +198 -418
  202. package/dist/run/run.handler.d.ts +169 -172
  203. package/dist/run/run.handler.d.ts.map +1 -1
  204. package/dist/run/run.handler.js +246 -74
  205. package/dist/run/run.operation.d.ts +658 -664
  206. package/dist/run/run.operation.d.ts.map +1 -1
  207. package/dist/run/run.operation.js +659 -617
  208. package/dist/run/run.presentation.d.ts +2 -7
  209. package/dist/run/run.presentation.d.ts.map +1 -1
  210. package/dist/run/run.presentation.js +217 -61
  211. package/dist/run/run.schema.d.ts +367 -372
  212. package/dist/run/run.schema.d.ts.map +1 -1
  213. package/dist/run/run.schema.js +172 -330
  214. package/dist/run/run.test-spec.d.ts +2 -7
  215. package/dist/run/run.test-spec.d.ts.map +1 -1
  216. package/dist/run/run.test-spec.js +56 -62
  217. package/dist/seeders/index.d.ts +4 -8
  218. package/dist/seeders/index.d.ts.map +1 -1
  219. package/dist/seeders/index.js +19 -17
  220. package/dist/shared/index.d.ts +7 -4
  221. package/dist/shared/index.d.ts.map +1 -0
  222. package/dist/shared/index.js +334 -4
  223. package/dist/shared/mock-agents.d.ts +77 -80
  224. package/dist/shared/mock-agents.d.ts.map +1 -1
  225. package/dist/shared/mock-agents.js +82 -93
  226. package/dist/shared/mock-runs.d.ts +107 -110
  227. package/dist/shared/mock-runs.d.ts.map +1 -1
  228. package/dist/shared/mock-runs.js +108 -117
  229. package/dist/shared/mock-tools.d.ts +217 -220
  230. package/dist/shared/mock-tools.d.ts.map +1 -1
  231. package/dist/shared/mock-tools.js +146 -180
  232. package/dist/shared/overlay-types.d.ts +25 -28
  233. package/dist/shared/overlay-types.d.ts.map +1 -1
  234. package/dist/shared/overlay-types.js +1 -0
  235. package/dist/tool/index.d.ts +11 -8
  236. package/dist/tool/index.d.ts.map +1 -0
  237. package/dist/tool/index.js +947 -9
  238. package/dist/tool/tool.entity.d.ts +23 -28
  239. package/dist/tool/tool.entity.d.ts.map +1 -1
  240. package/dist/tool/tool.entity.js +87 -101
  241. package/dist/tool/tool.enum.d.ts +3 -8
  242. package/dist/tool/tool.enum.d.ts.map +1 -1
  243. package/dist/tool/tool.enum.js +23 -31
  244. package/dist/tool/tool.event.d.ts +84 -90
  245. package/dist/tool/tool.event.d.ts.map +1 -1
  246. package/dist/tool/tool.event.js +92 -151
  247. package/dist/tool/tool.handler.d.ts +266 -269
  248. package/dist/tool/tool.handler.d.ts.map +1 -1
  249. package/dist/tool/tool.handler.js +213 -76
  250. package/dist/tool/tool.operation.d.ts +359 -365
  251. package/dist/tool/tool.operation.d.ts.map +1 -1
  252. package/dist/tool/tool.operation.js +477 -400
  253. package/dist/tool/tool.presentation.d.ts +2 -7
  254. package/dist/tool/tool.presentation.d.ts.map +1 -1
  255. package/dist/tool/tool.presentation.js +182 -61
  256. package/dist/tool/tool.schema.d.ts +196 -201
  257. package/dist/tool/tool.schema.d.ts.map +1 -1
  258. package/dist/tool/tool.schema.js +137 -231
  259. package/dist/tool/tool.test-spec.d.ts +2 -7
  260. package/dist/tool/tool.test-spec.d.ts.map +1 -1
  261. package/dist/tool/tool.test-spec.js +56 -62
  262. package/dist/ui/AgentDashboard.d.ts +1 -6
  263. package/dist/ui/AgentDashboard.d.ts.map +1 -1
  264. package/dist/ui/AgentDashboard.js +1598 -410
  265. package/dist/ui/AgentRunList.d.ts +7 -2
  266. package/dist/ui/AgentRunList.d.ts.map +1 -0
  267. package/dist/ui/AgentRunList.js +249 -3
  268. package/dist/ui/AgentToolRegistry.d.ts +7 -2
  269. package/dist/ui/AgentToolRegistry.d.ts.map +1 -0
  270. package/dist/ui/AgentToolRegistry.js +211 -3
  271. package/dist/ui/hooks/index.d.ts +8 -6
  272. package/dist/ui/hooks/index.d.ts.map +1 -0
  273. package/dist/ui/hooks/index.js +270 -6
  274. package/dist/ui/hooks/useAgentList.d.ts +21 -25
  275. package/dist/ui/hooks/useAgentList.d.ts.map +1 -1
  276. package/dist/ui/hooks/useAgentList.js +52 -62
  277. package/dist/ui/hooks/useAgentMutations.d.ts +22 -25
  278. package/dist/ui/hooks/useAgentMutations.d.ts.map +1 -1
  279. package/dist/ui/hooks/useAgentMutations.js +73 -120
  280. package/dist/ui/hooks/useRunList.d.ts +17 -21
  281. package/dist/ui/hooks/useRunList.d.ts.map +1 -1
  282. package/dist/ui/hooks/useRunList.js +52 -62
  283. package/dist/ui/hooks/useToolList.d.ts +32 -36
  284. package/dist/ui/hooks/useToolList.d.ts.map +1 -1
  285. package/dist/ui/hooks/useToolList.js +82 -92
  286. package/dist/ui/index.d.ts +9 -24
  287. package/dist/ui/index.d.ts.map +1 -0
  288. package/dist/ui/index.js +2081 -24
  289. package/dist/ui/modals/AgentActionsModal.d.ts +11 -24
  290. package/dist/ui/modals/AgentActionsModal.d.ts.map +1 -1
  291. package/dist/ui/modals/AgentActionsModal.js +300 -257
  292. package/dist/ui/modals/CreateAgentModal.d.ts +12 -21
  293. package/dist/ui/modals/CreateAgentModal.d.ts.map +1 -1
  294. package/dist/ui/modals/CreateAgentModal.js +226 -210
  295. package/dist/ui/modals/index.d.ts +3 -3
  296. package/dist/ui/modals/index.d.ts.map +1 -0
  297. package/dist/ui/modals/index.js +532 -3
  298. package/dist/ui/overlays/demo-overlays.d.ts +10 -8
  299. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -1
  300. package/dist/ui/overlays/demo-overlays.js +63 -71
  301. package/dist/ui/overlays/index.d.ts +2 -2
  302. package/dist/ui/overlays/index.d.ts.map +1 -0
  303. package/dist/ui/overlays/index.js +65 -3
  304. package/dist/ui/renderers/agent-list.markdown.d.ts +9 -8
  305. package/dist/ui/renderers/agent-list.markdown.d.ts.map +1 -1
  306. package/dist/ui/renderers/agent-list.markdown.js +55 -50
  307. package/dist/ui/renderers/agent-list.renderer.d.ts +5 -6
  308. package/dist/ui/renderers/agent-list.renderer.d.ts.map +1 -1
  309. package/dist/ui/renderers/agent-list.renderer.js +179 -17
  310. package/dist/ui/renderers/dashboard.markdown.d.ts +9 -8
  311. package/dist/ui/renderers/dashboard.markdown.d.ts.map +1 -1
  312. package/dist/ui/renderers/dashboard.markdown.js +115 -97
  313. package/dist/ui/renderers/index.d.ts +9 -6
  314. package/dist/ui/renderers/index.d.ts.map +1 -0
  315. package/dist/ui/renderers/index.js +446 -6
  316. package/dist/ui/renderers/run-list.markdown.d.ts +9 -8
  317. package/dist/ui/renderers/run-list.markdown.d.ts.map +1 -1
  318. package/dist/ui/renderers/run-list.markdown.js +42 -40
  319. package/dist/ui/renderers/tool-registry.markdown.d.ts +9 -8
  320. package/dist/ui/renderers/tool-registry.markdown.d.ts.map +1 -1
  321. package/dist/ui/renderers/tool-registry.markdown.js +52 -53
  322. package/dist/ui/views/AgentListView.d.ts +1 -6
  323. package/dist/ui/views/AgentListView.d.ts.map +1 -1
  324. package/dist/ui/views/AgentListView.js +161 -88
  325. package/dist/ui/views/RunListView.d.ts +4 -11
  326. package/dist/ui/views/RunListView.d.ts.map +1 -1
  327. package/dist/ui/views/RunListView.js +237 -154
  328. package/dist/ui/views/ToolRegistryView.d.ts +4 -11
  329. package/dist/ui/views/ToolRegistryView.d.ts.map +1 -1
  330. package/dist/ui/views/ToolRegistryView.js +205 -92
  331. package/dist/ui/views/index.d.ts +7 -4
  332. package/dist/ui/views/index.d.ts.map +1 -0
  333. package/dist/ui/views/index.js +619 -4
  334. package/package.json +656 -118
  335. package/tsdown.config.js +1 -2
  336. package/.turbo/turbo-build$colon$bundle.log +0 -285
  337. package/dist/agent/agent.entity.js.map +0 -1
  338. package/dist/agent/agent.enum.js.map +0 -1
  339. package/dist/agent/agent.event.js.map +0 -1
  340. package/dist/agent/agent.handler.js.map +0 -1
  341. package/dist/agent/agent.operation.js.map +0 -1
  342. package/dist/agent/agent.presentation.js.map +0 -1
  343. package/dist/agent/agent.schema.js.map +0 -1
  344. package/dist/agent/agent.test-spec.js.map +0 -1
  345. package/dist/agent.capability.js.map +0 -1
  346. package/dist/agent.feature.js.map +0 -1
  347. package/dist/docs/agent-console.docblock.js.map +0 -1
  348. package/dist/example.js.map +0 -1
  349. package/dist/handlers/agent.handlers.js.map +0 -1
  350. package/dist/run/run.entity.js.map +0 -1
  351. package/dist/run/run.enum.js.map +0 -1
  352. package/dist/run/run.event.js.map +0 -1
  353. package/dist/run/run.handler.js.map +0 -1
  354. package/dist/run/run.operation.js.map +0 -1
  355. package/dist/run/run.presentation.js.map +0 -1
  356. package/dist/run/run.schema.js.map +0 -1
  357. package/dist/run/run.test-spec.js.map +0 -1
  358. package/dist/seeders/index.js.map +0 -1
  359. package/dist/shared/mock-agents.js.map +0 -1
  360. package/dist/shared/mock-runs.js.map +0 -1
  361. package/dist/shared/mock-tools.js.map +0 -1
  362. package/dist/tool/tool.entity.js.map +0 -1
  363. package/dist/tool/tool.enum.js.map +0 -1
  364. package/dist/tool/tool.event.js.map +0 -1
  365. package/dist/tool/tool.handler.js.map +0 -1
  366. package/dist/tool/tool.operation.js.map +0 -1
  367. package/dist/tool/tool.presentation.js.map +0 -1
  368. package/dist/tool/tool.schema.js.map +0 -1
  369. package/dist/tool/tool.test-spec.js.map +0 -1
  370. package/dist/ui/AgentDashboard.js.map +0 -1
  371. package/dist/ui/hooks/useAgentList.js.map +0 -1
  372. package/dist/ui/hooks/useAgentMutations.js.map +0 -1
  373. package/dist/ui/hooks/useRunList.js.map +0 -1
  374. package/dist/ui/hooks/useToolList.js.map +0 -1
  375. package/dist/ui/modals/AgentActionsModal.js.map +0 -1
  376. package/dist/ui/modals/CreateAgentModal.js.map +0 -1
  377. package/dist/ui/overlays/demo-overlays.js.map +0 -1
  378. package/dist/ui/renderers/agent-list.markdown.js.map +0 -1
  379. package/dist/ui/renderers/agent-list.renderer.js.map +0 -1
  380. package/dist/ui/renderers/dashboard.markdown.js.map +0 -1
  381. package/dist/ui/renderers/run-list.markdown.js.map +0 -1
  382. package/dist/ui/renderers/tool-registry.markdown.js.map +0 -1
  383. package/dist/ui/views/AgentListView.js.map +0 -1
  384. package/dist/ui/views/RunListView.js.map +0 -1
  385. package/dist/ui/views/ToolRegistryView.js.map +0 -1
  386. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,1607 @@
1
+ // src/ui/hooks/useRunList.ts
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
4
+ function useRunList(options = {}) {
5
+ const { handlers, projectId } = useTemplateRuntime();
6
+ const { agent } = handlers;
7
+ const [data, setData] = useState(null);
8
+ const [metrics, setMetrics] = useState(null);
9
+ const [loading, setLoading] = useState(true);
10
+ const [error, setError] = useState(null);
11
+ const [page, setPage] = useState(1);
12
+ const fetchData = useCallback(async () => {
13
+ setLoading(true);
14
+ setError(null);
15
+ try {
16
+ const [runsResult, metricsResult] = await Promise.all([
17
+ agent.listRuns({
18
+ projectId,
19
+ agentId: options.agentId,
20
+ status: options.status === "all" ? undefined : options.status,
21
+ limit: options.limit ?? 20,
22
+ offset: (page - 1) * (options.limit ?? 20)
23
+ }),
24
+ agent.getRunMetrics({
25
+ projectId,
26
+ agentId: options.agentId,
27
+ startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
28
+ endDate: new Date
29
+ })
30
+ ]);
31
+ setData(runsResult);
32
+ setMetrics(metricsResult);
33
+ } catch (err) {
34
+ setError(err instanceof Error ? err : new Error("Unknown error"));
35
+ } finally {
36
+ setLoading(false);
37
+ }
38
+ }, [agent, projectId, options.agentId, options.status, options.limit, page]);
39
+ useEffect(() => {
40
+ fetchData();
41
+ }, [fetchData]);
42
+ return {
43
+ data,
44
+ metrics,
45
+ loading,
46
+ error,
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/views/RunListView.tsx
55
+ import {
56
+ StatCard,
57
+ StatCardGroup,
58
+ StatusChip,
59
+ EmptyState,
60
+ LoaderBlock,
61
+ ErrorState
62
+ } from "@contractspec/lib.design-system";
63
+ import { jsxDEV } from "react/jsx-dev-runtime";
64
+ "use client";
65
+ function getStatusTone(status) {
66
+ switch (status) {
67
+ case "COMPLETED":
68
+ return "success";
69
+ case "RUNNING":
70
+ return "warning";
71
+ case "QUEUED":
72
+ return "neutral";
73
+ case "FAILED":
74
+ case "CANCELLED":
75
+ return "danger";
76
+ default:
77
+ return "neutral";
78
+ }
79
+ }
80
+ function formatDuration(ms) {
81
+ if (!ms)
82
+ return "-";
83
+ if (ms < 1000)
84
+ return `${ms}ms`;
85
+ if (ms < 60000)
86
+ return `${(ms / 1000).toFixed(1)}s`;
87
+ return `${(ms / 60000).toFixed(1)}m`;
88
+ }
89
+ function formatTokens(tokens) {
90
+ if (tokens < 1000)
91
+ return tokens.toString();
92
+ if (tokens < 1e6)
93
+ return `${(tokens / 1000).toFixed(1)}K`;
94
+ return `${(tokens / 1e6).toFixed(2)}M`;
95
+ }
96
+ function formatCost(cost) {
97
+ if (!cost)
98
+ return "-";
99
+ return `$${cost.toFixed(4)}`;
100
+ }
101
+ function RunListView({ agentId, onRunClick }) {
102
+ const { data, metrics, loading, error, refetch } = useRunList({ agentId });
103
+ if (loading && !data) {
104
+ return /* @__PURE__ */ jsxDEV(LoaderBlock, {
105
+ label: "Loading runs..."
106
+ }, undefined, false, undefined, this);
107
+ }
108
+ if (error) {
109
+ return /* @__PURE__ */ jsxDEV(ErrorState, {
110
+ title: "Failed to load runs",
111
+ description: error.message,
112
+ onRetry: refetch,
113
+ retryLabel: "Retry"
114
+ }, undefined, false, undefined, this);
115
+ }
116
+ if (!data?.items.length) {
117
+ return /* @__PURE__ */ jsxDEV(EmptyState, {
118
+ title: "No runs yet",
119
+ description: "Execute an agent to see run history here."
120
+ }, undefined, false, undefined, this);
121
+ }
122
+ return /* @__PURE__ */ jsxDEV("div", {
123
+ className: "space-y-6",
124
+ children: [
125
+ metrics && /* @__PURE__ */ jsxDEV(StatCardGroup, {
126
+ children: [
127
+ /* @__PURE__ */ jsxDEV(StatCard, {
128
+ label: "Total Runs",
129
+ value: metrics.totalRuns
130
+ }, undefined, false, undefined, this),
131
+ /* @__PURE__ */ jsxDEV(StatCard, {
132
+ label: "Success Rate",
133
+ value: `${(metrics.successRate * 100).toFixed(1)}%`
134
+ }, undefined, false, undefined, this),
135
+ /* @__PURE__ */ jsxDEV(StatCard, {
136
+ label: "Total Tokens",
137
+ value: formatTokens(metrics.totalTokens)
138
+ }, undefined, false, undefined, this),
139
+ /* @__PURE__ */ jsxDEV(StatCard, {
140
+ label: "Total Cost",
141
+ value: `$${metrics.totalCostUsd.toFixed(2)}`
142
+ }, undefined, false, undefined, this)
143
+ ]
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)
242
+ ]
243
+ }, undefined, true, undefined, this);
244
+ }
245
+
246
+ // 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";
249
+ function useToolList(options = {}) {
250
+ const { handlers, projectId } = useTemplateRuntime2();
251
+ 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 () => {
257
+ setLoading(true);
258
+ setError(null);
259
+ try {
260
+ const result = await agent.listTools({
261
+ projectId,
262
+ search: options.search,
263
+ category: options.category,
264
+ status: options.status === "all" ? undefined : options.status,
265
+ limit: options.limit ?? 50,
266
+ offset: (page - 1) * (options.limit ?? 50)
267
+ });
268
+ setData(result);
269
+ } catch (err) {
270
+ setError(err instanceof Error ? err : new Error("Unknown error"));
271
+ } finally {
272
+ setLoading(false);
273
+ }
274
+ }, [
275
+ agent,
276
+ projectId,
277
+ options.search,
278
+ options.category,
279
+ options.status,
280
+ options.limit,
281
+ page
282
+ ]);
283
+ useEffect2(() => {
284
+ fetchData();
285
+ }, [fetchData]);
286
+ const { stats, groupedByCategory, categoryStats } = useMemo(() => {
287
+ if (!data)
288
+ return { stats: null, groupedByCategory: {}, categoryStats: [] };
289
+ const items = data.items;
290
+ const active = items.filter((t) => t.status === "ACTIVE").length;
291
+ const deprecated = items.filter((t) => t.status === "DEPRECATED").length;
292
+ const disabled = items.filter((t) => t.status === "DISABLED").length;
293
+ const grouped = {};
294
+ const byCategory = {};
295
+ items.forEach((t) => {
296
+ const cat = t.category;
297
+ if (!grouped[cat])
298
+ grouped[cat] = [];
299
+ grouped[cat].push(t);
300
+ byCategory[cat] = (byCategory[cat] || 0) + 1;
301
+ });
302
+ const catStats = Object.entries(byCategory).map(([category, count]) => ({ category, count })).sort((a, b) => b.count - a.count);
303
+ return {
304
+ stats: {
305
+ total: data.total,
306
+ active,
307
+ deprecated,
308
+ disabled,
309
+ topCategories: catStats.slice(0, 5)
310
+ },
311
+ groupedByCategory: grouped,
312
+ categoryStats: catStats
313
+ };
314
+ }, [data]);
315
+ return {
316
+ data,
317
+ loading,
318
+ error,
319
+ stats,
320
+ groupedByCategory,
321
+ categoryStats,
322
+ page,
323
+ refetch: fetchData,
324
+ nextPage: () => setPage((p) => p + 1),
325
+ prevPage: () => page > 1 && setPage((p) => p - 1)
326
+ };
327
+ }
328
+
329
+ // src/ui/views/ToolRegistryView.tsx
330
+ import {
331
+ StatCard as StatCard2,
332
+ StatCardGroup as StatCardGroup2,
333
+ StatusChip as StatusChip2,
334
+ EntityCard,
335
+ EmptyState as EmptyState2,
336
+ LoaderBlock as LoaderBlock2,
337
+ ErrorState as ErrorState2,
338
+ Button
339
+ } from "@contractspec/lib.design-system";
340
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
341
+ "use client";
342
+ var categoryIcons = {
343
+ RETRIEVAL: "\uD83D\uDD0D",
344
+ COMPUTATION: "\uD83E\uDDEE",
345
+ COMMUNICATION: "\uD83D\uDCE7",
346
+ INTEGRATION: "\uD83D\uDD17",
347
+ UTILITY: "\uD83D\uDEE0️",
348
+ CUSTOM: "⚙️"
349
+ };
350
+ function getStatusTone2(status) {
351
+ switch (status) {
352
+ case "ACTIVE":
353
+ return "success";
354
+ case "DRAFT":
355
+ return "neutral";
356
+ case "DEPRECATED":
357
+ return "warning";
358
+ case "DISABLED":
359
+ return "danger";
360
+ default:
361
+ return "neutral";
362
+ }
363
+ }
364
+ function ToolRegistryView({
365
+ onToolClick,
366
+ onCreateTool
367
+ }) {
368
+ const { data, loading, error, groupedByCategory, categoryStats, refetch } = useToolList();
369
+ if (loading && !data) {
370
+ return /* @__PURE__ */ jsxDEV2(LoaderBlock2, {
371
+ label: "Loading tools..."
372
+ }, undefined, false, undefined, this);
373
+ }
374
+ if (error) {
375
+ return /* @__PURE__ */ jsxDEV2(ErrorState2, {
376
+ title: "Failed to load tools",
377
+ description: error.message,
378
+ onRetry: refetch,
379
+ retryLabel: "Retry"
380
+ }, undefined, false, undefined, this);
381
+ }
382
+ if (!data?.items.length) {
383
+ return /* @__PURE__ */ jsxDEV2(EmptyState2, {
384
+ title: "No tools registered",
385
+ description: "Create your first tool to extend agent capabilities.",
386
+ primaryAction: onCreateTool ? /* @__PURE__ */ jsxDEV2(Button, {
387
+ onPress: onCreateTool,
388
+ children: "Create Tool"
389
+ }, undefined, false, undefined, this) : undefined
390
+ }, undefined, false, undefined, this);
391
+ }
392
+ return /* @__PURE__ */ jsxDEV2("div", {
393
+ className: "space-y-8",
394
+ children: [
395
+ /* @__PURE__ */ jsxDEV2(StatCardGroup2, {
396
+ children: [
397
+ /* @__PURE__ */ jsxDEV2(StatCard2, {
398
+ label: "Total Tools",
399
+ value: data.total
400
+ }, undefined, false, undefined, this),
401
+ categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsxDEV2(StatCard2, {
402
+ label: `${categoryIcons[category] ?? ""} ${category}`,
403
+ value: count
404
+ }, category, false, undefined, this))
405
+ ]
406
+ }, undefined, true, undefined, this),
407
+ Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV2("section", {
408
+ className: "space-y-4",
409
+ children: [
410
+ /* @__PURE__ */ jsxDEV2("div", {
411
+ className: "flex items-center gap-2",
412
+ children: [
413
+ /* @__PURE__ */ jsxDEV2("span", {
414
+ className: "text-2xl",
415
+ children: categoryIcons[category]
416
+ }, undefined, false, undefined, this),
417
+ /* @__PURE__ */ jsxDEV2("h3", {
418
+ className: "text-lg font-semibold",
419
+ children: category
420
+ }, undefined, false, undefined, this),
421
+ /* @__PURE__ */ jsxDEV2("span", {
422
+ className: "bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs",
423
+ children: tools.length
424
+ }, undefined, false, undefined, this)
425
+ ]
426
+ }, undefined, true, undefined, this),
427
+ /* @__PURE__ */ jsxDEV2("div", {
428
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
429
+ children: tools.map((tool) => /* @__PURE__ */ jsxDEV2(EntityCard, {
430
+ cardTitle: tool.name,
431
+ cardSubtitle: `v${tool.version}`,
432
+ meta: /* @__PURE__ */ jsxDEV2("p", {
433
+ className: "text-muted-foreground text-sm",
434
+ children: tool.description
435
+ }, undefined, false, undefined, this),
436
+ chips: /* @__PURE__ */ jsxDEV2(StatusChip2, {
437
+ tone: getStatusTone2(tool.status),
438
+ label: tool.status
439
+ }, undefined, false, undefined, this),
440
+ footer: /* @__PURE__ */ jsxDEV2("code", {
441
+ className: "text-muted-foreground text-xs",
442
+ children: tool.name
443
+ }, undefined, false, undefined, this),
444
+ onClick: onToolClick ? () => onToolClick(tool.id) : undefined
445
+ }, tool.id, false, undefined, this))
446
+ }, undefined, false, undefined, this)
447
+ ]
448
+ }, category, true, undefined, this))
449
+ ]
450
+ }, undefined, true, undefined, this);
451
+ }
452
+
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
+ // src/ui/hooks/useAgentMutations.ts
507
+ import { useCallback as useCallback4, useState as useState4 } from "react";
508
+ import { useTemplateRuntime as useTemplateRuntime4 } from "@contractspec/lib.example-shared-ui";
509
+ function useAgentMutations(options = {}) {
510
+ const { handlers, projectId } = useTemplateRuntime4();
511
+ const { agent } = handlers;
512
+ const [createState, setCreateState] = useState4({
513
+ loading: false,
514
+ error: null,
515
+ data: null
516
+ });
517
+ const [updateState, setUpdateState] = useState4({
518
+ loading: false,
519
+ error: null,
520
+ data: null
521
+ });
522
+ const createAgent = useCallback4(async (input) => {
523
+ setCreateState({ loading: true, error: null, data: null });
524
+ try {
525
+ const result = await agent.createAgent(input, {
526
+ projectId,
527
+ organizationId: "demo-org"
528
+ });
529
+ setCreateState({ loading: false, error: null, data: result });
530
+ options.onSuccess?.();
531
+ return result;
532
+ } catch (err) {
533
+ const error = err instanceof Error ? err : new Error("Failed to create agent");
534
+ setCreateState({ loading: false, error, data: null });
535
+ options.onError?.(error);
536
+ return null;
537
+ }
538
+ }, [agent, projectId, options]);
539
+ const updateAgent = useCallback4(async (input) => {
540
+ setUpdateState({ loading: true, error: null, data: null });
541
+ try {
542
+ const result = await agent.updateAgent(input);
543
+ setUpdateState({ loading: false, error: null, data: result });
544
+ options.onSuccess?.();
545
+ return result;
546
+ } catch (err) {
547
+ const error = err instanceof Error ? err : new Error("Failed to update agent");
548
+ setUpdateState({ loading: false, error, data: null });
549
+ options.onError?.(error);
550
+ return null;
551
+ }
552
+ }, [agent, options]);
553
+ const activateAgent = useCallback4(async (agentId) => {
554
+ return updateAgent({ id: agentId, status: "ACTIVE" });
555
+ }, [updateAgent]);
556
+ const pauseAgent = useCallback4(async (agentId) => {
557
+ return updateAgent({ id: agentId, status: "PAUSED" });
558
+ }, [updateAgent]);
559
+ const archiveAgent = useCallback4(async (agentId) => {
560
+ return updateAgent({ id: agentId, status: "ARCHIVED" });
561
+ }, [updateAgent]);
562
+ const executeAgent = useCallback4(async (input) => {
563
+ console.log("Execute agent:", input);
564
+ options.onSuccess?.();
565
+ return null;
566
+ }, [options]);
567
+ return {
568
+ createAgent,
569
+ updateAgent,
570
+ activateAgent,
571
+ pauseAgent,
572
+ archiveAgent,
573
+ executeAgent,
574
+ createState,
575
+ updateState,
576
+ isLoading: createState.loading || updateState.loading
577
+ };
578
+ }
579
+
580
+ // src/ui/modals/CreateAgentModal.tsx
581
+ import { useState as useState5 } from "react";
582
+ import { Button as Button2, Input } from "@contractspec/lib.design-system";
583
+ import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
584
+ "use client";
585
+ var MODEL_PROVIDERS = [
586
+ {
587
+ value: "openai",
588
+ label: "OpenAI",
589
+ models: ["gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"]
590
+ },
591
+ {
592
+ value: "anthropic",
593
+ label: "Anthropic",
594
+ models: ["claude-3-opus", "claude-3-sonnet", "claude-3-haiku"]
595
+ },
596
+ { value: "google", label: "Google", models: ["gemini-pro", "gemini-ultra"] },
597
+ {
598
+ value: "mistral",
599
+ label: "Mistral",
600
+ models: ["mistral-large", "mistral-medium", "mistral-small"]
601
+ }
602
+ ];
603
+ function CreateAgentModal({
604
+ isOpen,
605
+ onClose,
606
+ onSubmit,
607
+ isLoading = false
608
+ }) {
609
+ const [name, setName] = useState5("");
610
+ const [description, setDescription] = useState5("");
611
+ const [modelProvider, setModelProvider] = useState5("openai");
612
+ const [modelName, setModelName] = useState5("gpt-4o");
613
+ const [systemPrompt, setSystemPrompt] = useState5("");
614
+ const [error, setError] = useState5(null);
615
+ const selectedProvider = MODEL_PROVIDERS.find((p) => p.value === modelProvider);
616
+ const handleSubmit = async (e) => {
617
+ e.preventDefault();
618
+ setError(null);
619
+ if (!name.trim()) {
620
+ setError("Agent name is required");
621
+ return;
622
+ }
623
+ try {
624
+ await onSubmit({
625
+ name: name.trim(),
626
+ description: description.trim() || undefined,
627
+ modelProvider,
628
+ modelName,
629
+ systemPrompt: systemPrompt.trim() || undefined
630
+ });
631
+ setName("");
632
+ setDescription("");
633
+ setModelProvider("openai");
634
+ setModelName("gpt-4o");
635
+ setSystemPrompt("");
636
+ onClose();
637
+ } catch (err) {
638
+ setError(err instanceof Error ? err.message : "Failed to create agent");
639
+ }
640
+ };
641
+ const handleProviderChange = (provider) => {
642
+ setModelProvider(provider);
643
+ const providerConfig = MODEL_PROVIDERS.find((p) => p.value === provider);
644
+ if (providerConfig) {
645
+ setModelName(providerConfig.models[0]);
646
+ }
647
+ };
648
+ if (!isOpen)
649
+ return null;
650
+ return /* @__PURE__ */ jsxDEV3("div", {
651
+ className: "fixed inset-0 z-50 flex items-center justify-center",
652
+ children: [
653
+ /* @__PURE__ */ jsxDEV3("div", {
654
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
655
+ onClick: onClose,
656
+ role: "button",
657
+ tabIndex: 0,
658
+ onKeyDown: (e) => {
659
+ if (e.key === "Enter" || e.key === " ")
660
+ onClose();
661
+ },
662
+ "aria-label": "Close modal"
663
+ }, undefined, false, undefined, this),
664
+ /* @__PURE__ */ jsxDEV3("div", {
665
+ className: "bg-card border-border relative z-10 max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-xl border p-6 shadow-xl",
666
+ children: [
667
+ /* @__PURE__ */ jsxDEV3("h2", {
668
+ className: "mb-4 text-xl font-semibold",
669
+ children: "Create New Agent"
670
+ }, undefined, false, undefined, this),
671
+ /* @__PURE__ */ jsxDEV3("form", {
672
+ onSubmit: handleSubmit,
673
+ className: "space-y-4",
674
+ children: [
675
+ /* @__PURE__ */ jsxDEV3("div", {
676
+ children: [
677
+ /* @__PURE__ */ jsxDEV3("label", {
678
+ htmlFor: "agent-name",
679
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
680
+ children: "Agent Name *"
681
+ }, undefined, false, undefined, this),
682
+ /* @__PURE__ */ jsxDEV3(Input, {
683
+ id: "agent-name",
684
+ value: name,
685
+ onChange: (e) => setName(e.target.value),
686
+ placeholder: "e.g., Customer Support Bot",
687
+ disabled: isLoading
688
+ }, undefined, false, undefined, this)
689
+ ]
690
+ }, undefined, true, undefined, this),
691
+ /* @__PURE__ */ jsxDEV3("div", {
692
+ children: [
693
+ /* @__PURE__ */ jsxDEV3("label", {
694
+ htmlFor: "agent-description",
695
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
696
+ children: "Description"
697
+ }, undefined, false, undefined, this),
698
+ /* @__PURE__ */ jsxDEV3("textarea", {
699
+ id: "agent-description",
700
+ value: description,
701
+ onChange: (e) => setDescription(e.target.value),
702
+ placeholder: "Describe what this agent does...",
703
+ rows: 2,
704
+ disabled: isLoading,
705
+ className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
706
+ }, undefined, false, undefined, this)
707
+ ]
708
+ }, undefined, true, undefined, this),
709
+ /* @__PURE__ */ jsxDEV3("div", {
710
+ className: "flex gap-3",
711
+ children: [
712
+ /* @__PURE__ */ jsxDEV3("div", {
713
+ className: "flex-1",
714
+ children: [
715
+ /* @__PURE__ */ jsxDEV3("label", {
716
+ htmlFor: "model-provider",
717
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
718
+ children: "Provider *"
719
+ }, undefined, false, undefined, this),
720
+ /* @__PURE__ */ jsxDEV3("select", {
721
+ id: "model-provider",
722
+ value: modelProvider,
723
+ onChange: (e) => handleProviderChange(e.target.value),
724
+ disabled: isLoading,
725
+ className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50",
726
+ children: MODEL_PROVIDERS.map((p) => /* @__PURE__ */ jsxDEV3("option", {
727
+ value: p.value,
728
+ children: p.label
729
+ }, p.value, false, undefined, this))
730
+ }, undefined, false, undefined, this)
731
+ ]
732
+ }, undefined, true, undefined, this),
733
+ /* @__PURE__ */ jsxDEV3("div", {
734
+ className: "flex-1",
735
+ children: [
736
+ /* @__PURE__ */ jsxDEV3("label", {
737
+ htmlFor: "model-name",
738
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
739
+ children: "Model *"
740
+ }, undefined, false, undefined, this),
741
+ /* @__PURE__ */ jsxDEV3("select", {
742
+ id: "model-name",
743
+ value: modelName,
744
+ onChange: (e) => setModelName(e.target.value),
745
+ disabled: isLoading,
746
+ className: "border-input bg-background focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50",
747
+ children: selectedProvider?.models.map((m) => /* @__PURE__ */ jsxDEV3("option", {
748
+ value: m,
749
+ children: m
750
+ }, m, false, undefined, this))
751
+ }, undefined, false, undefined, this)
752
+ ]
753
+ }, undefined, true, undefined, this)
754
+ ]
755
+ }, undefined, true, undefined, this),
756
+ /* @__PURE__ */ jsxDEV3("div", {
757
+ children: [
758
+ /* @__PURE__ */ jsxDEV3("label", {
759
+ htmlFor: "system-prompt",
760
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
761
+ children: "System Prompt"
762
+ }, undefined, false, undefined, this),
763
+ /* @__PURE__ */ jsxDEV3("textarea", {
764
+ id: "system-prompt",
765
+ value: systemPrompt,
766
+ onChange: (e) => setSystemPrompt(e.target.value),
767
+ placeholder: "You are a helpful assistant that...",
768
+ rows: 4,
769
+ disabled: isLoading,
770
+ className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 font-mono text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
771
+ }, undefined, false, undefined, this),
772
+ /* @__PURE__ */ jsxDEV3("p", {
773
+ className: "text-muted-foreground mt-1 text-xs",
774
+ children: "Instructions that define the agent's behavior"
775
+ }, undefined, false, undefined, this)
776
+ ]
777
+ }, undefined, true, undefined, this),
778
+ error && /* @__PURE__ */ jsxDEV3("div", {
779
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
780
+ children: error
781
+ }, undefined, false, undefined, this),
782
+ /* @__PURE__ */ jsxDEV3("div", {
783
+ className: "flex justify-end gap-3 pt-2",
784
+ children: [
785
+ /* @__PURE__ */ jsxDEV3(Button2, {
786
+ type: "button",
787
+ variant: "ghost",
788
+ onPress: onClose,
789
+ disabled: isLoading,
790
+ children: "Cancel"
791
+ }, undefined, false, undefined, this),
792
+ /* @__PURE__ */ jsxDEV3(Button2, {
793
+ type: "submit",
794
+ disabled: isLoading,
795
+ children: isLoading ? "Creating..." : "Create Agent"
796
+ }, undefined, false, undefined, this)
797
+ ]
798
+ }, undefined, true, undefined, this)
799
+ ]
800
+ }, undefined, true, undefined, this)
801
+ ]
802
+ }, undefined, true, undefined, this)
803
+ ]
804
+ }, undefined, true, undefined, this);
805
+ }
806
+
807
+ // src/ui/modals/AgentActionsModal.tsx
808
+ import { useState as useState6 } from "react";
809
+ import { Button as Button3 } from "@contractspec/lib.design-system";
810
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
811
+ "use client";
812
+ function getStatusColor(status) {
813
+ switch (status) {
814
+ case "ACTIVE":
815
+ return "text-green-600 bg-green-100 dark:text-green-400 dark:bg-green-900/30";
816
+ case "DRAFT":
817
+ return "text-blue-600 bg-blue-100 dark:text-blue-400 dark:bg-blue-900/30";
818
+ case "PAUSED":
819
+ return "text-yellow-600 bg-yellow-100 dark:text-yellow-400 dark:bg-yellow-900/30";
820
+ case "ARCHIVED":
821
+ return "text-gray-600 bg-gray-100 dark:text-gray-400 dark:bg-gray-700";
822
+ default:
823
+ return "text-gray-600 bg-gray-100";
824
+ }
825
+ }
826
+ function AgentActionsModal({
827
+ isOpen,
828
+ agent,
829
+ onClose,
830
+ onActivate,
831
+ onPause,
832
+ onArchive,
833
+ onExecute,
834
+ isLoading = false
835
+ }) {
836
+ const [mode, setMode] = useState6("menu");
837
+ const [message, setMessage] = useState6("");
838
+ const [confirmAction, setConfirmAction] = useState6(null);
839
+ const [error, setError] = useState6(null);
840
+ const resetForm = () => {
841
+ setMode("menu");
842
+ setMessage("");
843
+ setConfirmAction(null);
844
+ setError(null);
845
+ };
846
+ const handleClose = () => {
847
+ resetForm();
848
+ onClose();
849
+ };
850
+ const handleExecute = async () => {
851
+ if (!agent)
852
+ return;
853
+ setError(null);
854
+ if (!message.trim()) {
855
+ setError("Please enter a message");
856
+ return;
857
+ }
858
+ try {
859
+ await onExecute(agent.id, message.trim());
860
+ handleClose();
861
+ } catch (err) {
862
+ setError(err instanceof Error ? err.message : "Failed to execute agent");
863
+ }
864
+ };
865
+ const handleStatusChange = async (action) => {
866
+ if (!agent)
867
+ return;
868
+ setError(null);
869
+ try {
870
+ switch (action) {
871
+ case "activate":
872
+ await onActivate(agent.id);
873
+ break;
874
+ case "pause":
875
+ await onPause(agent.id);
876
+ break;
877
+ case "archive":
878
+ await onArchive(agent.id);
879
+ break;
880
+ }
881
+ handleClose();
882
+ } catch (err) {
883
+ setError(err instanceof Error ? err.message : `Failed to ${action} agent`);
884
+ }
885
+ };
886
+ if (!isOpen || !agent)
887
+ return null;
888
+ return /* @__PURE__ */ jsxDEV4("div", {
889
+ className: "fixed inset-0 z-50 flex items-center justify-center",
890
+ children: [
891
+ /* @__PURE__ */ jsxDEV4("div", {
892
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
893
+ onClick: handleClose,
894
+ role: "button",
895
+ tabIndex: 0,
896
+ onKeyDown: (e) => {
897
+ if (e.key === "Enter" || e.key === " ")
898
+ handleClose();
899
+ },
900
+ "aria-label": "Close modal"
901
+ }, undefined, false, undefined, this),
902
+ /* @__PURE__ */ jsxDEV4("div", {
903
+ className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
904
+ children: [
905
+ /* @__PURE__ */ jsxDEV4("div", {
906
+ className: "border-border mb-4 border-b pb-4",
907
+ children: [
908
+ /* @__PURE__ */ jsxDEV4("h2", {
909
+ className: "text-xl font-semibold",
910
+ children: agent.name
911
+ }, undefined, false, undefined, this),
912
+ /* @__PURE__ */ jsxDEV4("div", {
913
+ className: "mt-1 flex items-center gap-2",
914
+ children: [
915
+ /* @__PURE__ */ jsxDEV4("span", {
916
+ className: "text-muted-foreground text-sm",
917
+ children: [
918
+ agent.modelProvider,
919
+ " / ",
920
+ agent.modelName
921
+ ]
922
+ }, undefined, true, undefined, this),
923
+ /* @__PURE__ */ jsxDEV4("span", {
924
+ className: `rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(agent.status)}`,
925
+ children: agent.status
926
+ }, undefined, false, undefined, this)
927
+ ]
928
+ }, undefined, true, undefined, this),
929
+ agent.description && /* @__PURE__ */ jsxDEV4("p", {
930
+ className: "text-muted-foreground mt-2 text-sm",
931
+ children: agent.description
932
+ }, undefined, false, undefined, this)
933
+ ]
934
+ }, undefined, true, undefined, this),
935
+ mode === "menu" && /* @__PURE__ */ jsxDEV4("div", {
936
+ className: "space-y-3",
937
+ children: [
938
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV4(Button3, {
939
+ className: "w-full justify-start",
940
+ variant: "ghost",
941
+ onPress: () => setMode("execute"),
942
+ children: [
943
+ /* @__PURE__ */ jsxDEV4("span", {
944
+ className: "mr-2",
945
+ children: "▶️"
946
+ }, undefined, false, undefined, this),
947
+ " Execute Agent"
948
+ ]
949
+ }, undefined, true, undefined, this),
950
+ (agent.status === "DRAFT" || agent.status === "PAUSED") && /* @__PURE__ */ jsxDEV4(Button3, {
951
+ className: "w-full justify-start",
952
+ variant: "ghost",
953
+ onPress: () => handleStatusChange("activate"),
954
+ disabled: isLoading,
955
+ children: [
956
+ /* @__PURE__ */ jsxDEV4("span", {
957
+ className: "mr-2",
958
+ children: "\uD83D\uDFE2"
959
+ }, undefined, false, undefined, this),
960
+ " Activate Agent"
961
+ ]
962
+ }, undefined, true, undefined, this),
963
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV4(Button3, {
964
+ className: "w-full justify-start",
965
+ variant: "ghost",
966
+ onPress: () => handleStatusChange("pause"),
967
+ disabled: isLoading,
968
+ children: [
969
+ /* @__PURE__ */ jsxDEV4("span", {
970
+ className: "mr-2",
971
+ children: "⏸️"
972
+ }, undefined, false, undefined, this),
973
+ " Pause Agent"
974
+ ]
975
+ }, undefined, true, undefined, this),
976
+ agent.status !== "ARCHIVED" && /* @__PURE__ */ jsxDEV4(Button3, {
977
+ className: "w-full justify-start text-yellow-600 hover:text-yellow-700",
978
+ variant: "ghost",
979
+ onPress: () => {
980
+ setConfirmAction("archive");
981
+ setMode("confirm");
982
+ },
983
+ children: [
984
+ /* @__PURE__ */ jsxDEV4("span", {
985
+ className: "mr-2",
986
+ children: "\uD83D\uDCE6"
987
+ }, undefined, false, undefined, this),
988
+ " Archive Agent"
989
+ ]
990
+ }, undefined, true, undefined, this),
991
+ agent.status === "ARCHIVED" && /* @__PURE__ */ jsxDEV4(Button3, {
992
+ className: "w-full justify-start",
993
+ variant: "ghost",
994
+ onPress: () => handleStatusChange("activate"),
995
+ disabled: isLoading,
996
+ children: [
997
+ /* @__PURE__ */ jsxDEV4("span", {
998
+ className: "mr-2",
999
+ children: "\uD83D\uDD04"
1000
+ }, undefined, false, undefined, this),
1001
+ " Restore Agent"
1002
+ ]
1003
+ }, undefined, true, undefined, this),
1004
+ error && /* @__PURE__ */ jsxDEV4("div", {
1005
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1006
+ children: error
1007
+ }, undefined, false, undefined, this),
1008
+ /* @__PURE__ */ jsxDEV4("div", {
1009
+ className: "border-border border-t pt-3",
1010
+ children: /* @__PURE__ */ jsxDEV4(Button3, {
1011
+ className: "w-full",
1012
+ variant: "outline",
1013
+ onPress: handleClose,
1014
+ children: "Close"
1015
+ }, undefined, false, undefined, this)
1016
+ }, undefined, false, undefined, this)
1017
+ ]
1018
+ }, undefined, true, undefined, this),
1019
+ mode === "execute" && /* @__PURE__ */ jsxDEV4("div", {
1020
+ className: "space-y-4",
1021
+ children: [
1022
+ /* @__PURE__ */ jsxDEV4("div", {
1023
+ children: [
1024
+ /* @__PURE__ */ jsxDEV4("label", {
1025
+ htmlFor: "execute-message",
1026
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
1027
+ children: "Message *"
1028
+ }, undefined, false, undefined, this),
1029
+ /* @__PURE__ */ jsxDEV4("textarea", {
1030
+ id: "execute-message",
1031
+ value: message,
1032
+ onChange: (e) => setMessage(e.target.value),
1033
+ placeholder: "Enter your message to the agent...",
1034
+ rows: 4,
1035
+ disabled: isLoading,
1036
+ className: "border-input bg-background focus:ring-ring w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-none disabled:opacity-50"
1037
+ }, undefined, false, undefined, this)
1038
+ ]
1039
+ }, undefined, true, undefined, this),
1040
+ error && /* @__PURE__ */ jsxDEV4("div", {
1041
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1042
+ children: error
1043
+ }, undefined, false, undefined, this),
1044
+ /* @__PURE__ */ jsxDEV4("div", {
1045
+ className: "flex justify-end gap-3 pt-2",
1046
+ children: [
1047
+ /* @__PURE__ */ jsxDEV4(Button3, {
1048
+ variant: "ghost",
1049
+ onPress: () => setMode("menu"),
1050
+ disabled: isLoading,
1051
+ children: "Back"
1052
+ }, undefined, false, undefined, this),
1053
+ /* @__PURE__ */ jsxDEV4(Button3, {
1054
+ onPress: handleExecute,
1055
+ disabled: isLoading,
1056
+ children: isLoading ? "Executing..." : "▶️ Execute"
1057
+ }, undefined, false, undefined, this)
1058
+ ]
1059
+ }, undefined, true, undefined, this)
1060
+ ]
1061
+ }, undefined, true, undefined, this),
1062
+ mode === "confirm" && confirmAction === "archive" && /* @__PURE__ */ jsxDEV4("div", {
1063
+ className: "space-y-4",
1064
+ children: [
1065
+ /* @__PURE__ */ jsxDEV4("p", {
1066
+ className: "text-muted-foreground",
1067
+ children: [
1068
+ "Are you sure you want to archive",
1069
+ " ",
1070
+ /* @__PURE__ */ jsxDEV4("span", {
1071
+ className: "text-foreground font-medium",
1072
+ children: agent.name
1073
+ }, undefined, false, undefined, this),
1074
+ "?"
1075
+ ]
1076
+ }, undefined, true, undefined, this),
1077
+ /* @__PURE__ */ jsxDEV4("p", {
1078
+ className: "text-muted-foreground text-sm",
1079
+ children: "Archived agents cannot be executed but can be restored later."
1080
+ }, undefined, false, undefined, this),
1081
+ error && /* @__PURE__ */ jsxDEV4("div", {
1082
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1083
+ children: error
1084
+ }, undefined, false, undefined, this),
1085
+ /* @__PURE__ */ jsxDEV4("div", {
1086
+ className: "flex justify-end gap-3 pt-2",
1087
+ children: [
1088
+ /* @__PURE__ */ jsxDEV4(Button3, {
1089
+ variant: "ghost",
1090
+ onPress: () => setMode("menu"),
1091
+ disabled: isLoading,
1092
+ children: "Cancel"
1093
+ }, undefined, false, undefined, this),
1094
+ /* @__PURE__ */ jsxDEV4(Button3, {
1095
+ onPress: () => handleStatusChange("archive"),
1096
+ disabled: isLoading,
1097
+ children: isLoading ? "Archiving..." : "\uD83D\uDCE6 Archive"
1098
+ }, undefined, false, undefined, this)
1099
+ ]
1100
+ }, undefined, true, undefined, this)
1101
+ ]
1102
+ }, undefined, true, undefined, this)
1103
+ ]
1104
+ }, undefined, true, undefined, this)
1105
+ ]
1106
+ }, undefined, true, undefined, this);
1107
+ }
1108
+
1109
+ // src/ui/AgentDashboard.tsx
1110
+ import { useState as useState7, useMemo as useMemo3, useCallback as useCallback5 } from "react";
1111
+ import {
1112
+ StatCard as StatCard3,
1113
+ StatCardGroup as StatCardGroup3,
1114
+ Button as Button4
1115
+ } from "@contractspec/lib.design-system";
1116
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
1117
+ "use client";
1118
+ function AgentDashboard() {
1119
+ const [activeTab, setActiveTab] = useState7("runs");
1120
+ const [isCreateModalOpen, setIsCreateModalOpen] = useState7(false);
1121
+ const [selectedAgent, setSelectedAgent] = useState7(null);
1122
+ const [isAgentActionsOpen, setIsAgentActionsOpen] = useState7(false);
1123
+ const { metrics, refetch: refetchRuns } = useRunList();
1124
+ const { refetch: refetchAgents } = useAgentList();
1125
+ const mutations = useAgentMutations({
1126
+ onSuccess: () => {
1127
+ refetchAgents();
1128
+ refetchRuns();
1129
+ }
1130
+ });
1131
+ const handleAgentClick = useCallback5((agent) => {
1132
+ setSelectedAgent(agent);
1133
+ setIsAgentActionsOpen(true);
1134
+ }, []);
1135
+ const tabs = [
1136
+ { id: "runs", label: "Runs", icon: "▶" },
1137
+ { id: "agents", label: "Agents", icon: "\uD83E\uDD16" },
1138
+ { id: "tools", label: "Tools", icon: "\uD83D\uDD27" },
1139
+ { id: "metrics", label: "Metrics", icon: "\uD83D\uDCCA" }
1140
+ ];
1141
+ const summaryStats = useMemo3(() => {
1142
+ if (!metrics) {
1143
+ return [
1144
+ { label: "Total Runs", value: "-", hint: "Loading..." },
1145
+ { label: "Success Rate", value: "-", hint: "" },
1146
+ { label: "Total Tokens", value: "-", hint: "" },
1147
+ { label: "Total Cost", value: "-", hint: "" }
1148
+ ];
1149
+ }
1150
+ return [
1151
+ {
1152
+ label: "Total Runs",
1153
+ value: metrics.totalRuns.toLocaleString(),
1154
+ hint: `${(metrics.successRate * 100).toFixed(0)}% success`
1155
+ },
1156
+ {
1157
+ label: "Success Rate",
1158
+ value: `${(metrics.successRate * 100).toFixed(0)}%`,
1159
+ hint: "of all runs"
1160
+ },
1161
+ {
1162
+ label: "Total Tokens",
1163
+ value: metrics.totalTokens >= 1e6 ? `${(metrics.totalTokens / 1e6).toFixed(1)}M` : `${(metrics.totalTokens / 1000).toFixed(0)}K`,
1164
+ hint: "This period"
1165
+ },
1166
+ {
1167
+ label: "Total Cost",
1168
+ value: `$${metrics.totalCostUsd.toFixed(2)}`,
1169
+ hint: "This period"
1170
+ }
1171
+ ];
1172
+ }, [metrics]);
1173
+ return /* @__PURE__ */ jsxDEV5("div", {
1174
+ className: "space-y-6",
1175
+ children: [
1176
+ /* @__PURE__ */ jsxDEV5("div", {
1177
+ className: "flex items-center justify-between",
1178
+ children: [
1179
+ /* @__PURE__ */ jsxDEV5("h2", {
1180
+ className: "text-2xl font-bold",
1181
+ children: "AI Agent Console"
1182
+ }, undefined, false, undefined, this),
1183
+ /* @__PURE__ */ jsxDEV5(Button4, {
1184
+ onPress: () => setIsCreateModalOpen(true),
1185
+ children: [
1186
+ /* @__PURE__ */ jsxDEV5("span", {
1187
+ className: "mr-2",
1188
+ children: "+"
1189
+ }, undefined, false, undefined, this),
1190
+ " New Agent"
1191
+ ]
1192
+ }, undefined, true, undefined, this)
1193
+ ]
1194
+ }, undefined, true, undefined, this),
1195
+ /* @__PURE__ */ jsxDEV5(StatCardGroup3, {
1196
+ children: summaryStats.map((stat, i) => /* @__PURE__ */ jsxDEV5(StatCard3, {
1197
+ label: stat.label,
1198
+ value: stat.value,
1199
+ hint: stat.hint
1200
+ }, i, false, undefined, this))
1201
+ }, undefined, false, undefined, this),
1202
+ /* @__PURE__ */ jsxDEV5("nav", {
1203
+ className: "bg-muted flex gap-1 rounded-lg p-1",
1204
+ role: "tablist",
1205
+ children: tabs.map((tab) => /* @__PURE__ */ jsxDEV5("button", {
1206
+ type: "button",
1207
+ role: "tab",
1208
+ "aria-selected": activeTab === tab.id,
1209
+ onClick: () => setActiveTab(tab.id),
1210
+ className: `flex flex-1 items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors ${activeTab === tab.id ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
1211
+ children: [
1212
+ /* @__PURE__ */ jsxDEV5("span", {
1213
+ children: tab.icon
1214
+ }, undefined, false, undefined, this),
1215
+ tab.label
1216
+ ]
1217
+ }, tab.id, true, undefined, this))
1218
+ }, undefined, false, undefined, this),
1219
+ /* @__PURE__ */ jsxDEV5("div", {
1220
+ className: "min-h-[400px]",
1221
+ role: "tabpanel",
1222
+ children: [
1223
+ activeTab === "runs" && /* @__PURE__ */ jsxDEV5(RunListView, {}, undefined, false, undefined, this),
1224
+ activeTab === "agents" && /* @__PURE__ */ jsxDEV5(AgentListViewWithActions, {
1225
+ onAgentClick: handleAgentClick
1226
+ }, undefined, false, undefined, this),
1227
+ activeTab === "tools" && /* @__PURE__ */ jsxDEV5(ToolRegistryView, {}, undefined, false, undefined, this),
1228
+ activeTab === "metrics" && /* @__PURE__ */ jsxDEV5(MetricsView, {
1229
+ metrics
1230
+ }, undefined, false, undefined, this)
1231
+ ]
1232
+ }, undefined, true, undefined, this),
1233
+ /* @__PURE__ */ jsxDEV5(CreateAgentModal, {
1234
+ isOpen: isCreateModalOpen,
1235
+ onClose: () => setIsCreateModalOpen(false),
1236
+ onSubmit: async (input) => {
1237
+ await mutations.createAgent(input);
1238
+ },
1239
+ isLoading: mutations.createState.loading
1240
+ }, undefined, false, undefined, this),
1241
+ /* @__PURE__ */ jsxDEV5(AgentActionsModal, {
1242
+ isOpen: isAgentActionsOpen,
1243
+ agent: selectedAgent,
1244
+ onClose: () => {
1245
+ setIsAgentActionsOpen(false);
1246
+ setSelectedAgent(null);
1247
+ },
1248
+ onActivate: async (agentId) => {
1249
+ await mutations.activateAgent(agentId);
1250
+ },
1251
+ onPause: async (agentId) => {
1252
+ await mutations.pauseAgent(agentId);
1253
+ },
1254
+ onArchive: async (agentId) => {
1255
+ await mutations.archiveAgent(agentId);
1256
+ },
1257
+ onExecute: async (agentId, message) => {
1258
+ await mutations.executeAgent({ agentId, message });
1259
+ },
1260
+ isLoading: mutations.isLoading
1261
+ }, undefined, false, undefined, this)
1262
+ ]
1263
+ }, undefined, true, undefined, this);
1264
+ }
1265
+ function AgentListViewWithActions({
1266
+ onAgentClick
1267
+ }) {
1268
+ const { data, loading, error, stats, refetch } = useAgentList();
1269
+ if (loading && !data) {
1270
+ return /* @__PURE__ */ jsxDEV5("div", {
1271
+ className: "text-muted-foreground flex h-64 items-center justify-center",
1272
+ children: "Loading agents..."
1273
+ }, undefined, false, undefined, this);
1274
+ }
1275
+ if (error) {
1276
+ return /* @__PURE__ */ jsxDEV5("div", {
1277
+ className: "text-destructive flex h-64 flex-col items-center justify-center",
1278
+ children: [
1279
+ /* @__PURE__ */ jsxDEV5("p", {
1280
+ children: [
1281
+ "Failed to load agents: ",
1282
+ error.message
1283
+ ]
1284
+ }, undefined, true, undefined, this),
1285
+ /* @__PURE__ */ jsxDEV5(Button4, {
1286
+ variant: "outline",
1287
+ onPress: refetch,
1288
+ className: "mt-2",
1289
+ children: "Retry"
1290
+ }, undefined, false, undefined, this)
1291
+ ]
1292
+ }, undefined, true, undefined, this);
1293
+ }
1294
+ if (!data?.items.length) {
1295
+ return /* @__PURE__ */ jsxDEV5("div", {
1296
+ className: "text-muted-foreground flex h-64 flex-col items-center justify-center",
1297
+ children: [
1298
+ /* @__PURE__ */ jsxDEV5("p", {
1299
+ className: "text-lg font-medium",
1300
+ children: "No agents yet"
1301
+ }, undefined, false, undefined, this),
1302
+ /* @__PURE__ */ jsxDEV5("p", {
1303
+ className: "text-sm",
1304
+ children: "Create your first AI agent to get started."
1305
+ }, undefined, false, undefined, this)
1306
+ ]
1307
+ }, undefined, true, undefined, this);
1308
+ }
1309
+ return /* @__PURE__ */ jsxDEV5("div", {
1310
+ className: "space-y-4",
1311
+ children: [
1312
+ stats && /* @__PURE__ */ jsxDEV5("div", {
1313
+ className: "flex gap-4 text-sm",
1314
+ children: [
1315
+ /* @__PURE__ */ jsxDEV5("span", {
1316
+ children: [
1317
+ "Total: ",
1318
+ stats.total
1319
+ ]
1320
+ }, undefined, true, undefined, this),
1321
+ /* @__PURE__ */ jsxDEV5("span", {
1322
+ className: "text-green-600",
1323
+ children: [
1324
+ "Active: ",
1325
+ stats.active
1326
+ ]
1327
+ }, undefined, true, undefined, this),
1328
+ /* @__PURE__ */ jsxDEV5("span", {
1329
+ className: "text-yellow-600",
1330
+ children: [
1331
+ "Paused: ",
1332
+ stats.paused
1333
+ ]
1334
+ }, undefined, true, undefined, this),
1335
+ /* @__PURE__ */ jsxDEV5("span", {
1336
+ className: "text-blue-600",
1337
+ children: [
1338
+ "Draft: ",
1339
+ stats.draft
1340
+ ]
1341
+ }, undefined, true, undefined, this)
1342
+ ]
1343
+ }, undefined, true, undefined, this),
1344
+ /* @__PURE__ */ jsxDEV5("div", {
1345
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
1346
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV5(AgentCard, {
1347
+ agent,
1348
+ onClick: () => onAgentClick(agent)
1349
+ }, agent.id, false, undefined, this))
1350
+ }, undefined, false, undefined, this)
1351
+ ]
1352
+ }, undefined, true, undefined, this);
1353
+ }
1354
+ function AgentCard({ agent, onClick }) {
1355
+ const statusColors = {
1356
+ ACTIVE: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",
1357
+ DRAFT: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
1358
+ PAUSED: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",
1359
+ ARCHIVED: "bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400"
1360
+ };
1361
+ return /* @__PURE__ */ jsxDEV5("div", {
1362
+ onClick,
1363
+ className: "border-border bg-card cursor-pointer rounded-xl border p-4 transition-all hover:shadow-md",
1364
+ role: "button",
1365
+ tabIndex: 0,
1366
+ onKeyDown: (e) => {
1367
+ if (e.key === "Enter" || e.key === " ")
1368
+ onClick();
1369
+ },
1370
+ children: [
1371
+ /* @__PURE__ */ jsxDEV5("div", {
1372
+ className: "flex items-start justify-between",
1373
+ children: [
1374
+ /* @__PURE__ */ jsxDEV5("div", {
1375
+ className: "min-w-0 flex-1",
1376
+ children: [
1377
+ /* @__PURE__ */ jsxDEV5("h3", {
1378
+ className: "truncate font-semibold",
1379
+ children: agent.name
1380
+ }, undefined, false, undefined, this),
1381
+ /* @__PURE__ */ jsxDEV5("p", {
1382
+ className: "text-muted-foreground text-sm",
1383
+ children: [
1384
+ agent.modelProvider,
1385
+ " / ",
1386
+ agent.modelName
1387
+ ]
1388
+ }, undefined, true, undefined, this)
1389
+ ]
1390
+ }, undefined, true, undefined, this),
1391
+ /* @__PURE__ */ jsxDEV5("span", {
1392
+ className: `rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[agent.status]}`,
1393
+ children: agent.status
1394
+ }, undefined, false, undefined, this)
1395
+ ]
1396
+ }, undefined, true, undefined, this),
1397
+ agent.description && /* @__PURE__ */ jsxDEV5("p", {
1398
+ className: "text-muted-foreground mt-2 line-clamp-2 text-sm",
1399
+ children: agent.description
1400
+ }, undefined, false, undefined, this),
1401
+ /* @__PURE__ */ jsxDEV5("div", {
1402
+ className: "mt-3 flex items-center justify-between",
1403
+ children: [
1404
+ /* @__PURE__ */ jsxDEV5("span", {
1405
+ className: "text-muted-foreground text-xs",
1406
+ children: agent.modelName
1407
+ }, undefined, false, undefined, this),
1408
+ /* @__PURE__ */ jsxDEV5(Button4, {
1409
+ variant: "ghost",
1410
+ size: "sm",
1411
+ onPress: onClick,
1412
+ children: "Actions"
1413
+ }, undefined, false, undefined, this)
1414
+ ]
1415
+ }, undefined, true, undefined, this)
1416
+ ]
1417
+ }, undefined, true, undefined, this);
1418
+ }
1419
+ function MetricsView({ metrics }) {
1420
+ if (!metrics) {
1421
+ return /* @__PURE__ */ jsxDEV5("div", {
1422
+ className: "text-muted-foreground flex h-64 items-center justify-center",
1423
+ children: "Loading metrics..."
1424
+ }, undefined, false, undefined, this);
1425
+ }
1426
+ const completedRuns = Math.round(metrics.totalRuns * metrics.successRate);
1427
+ const failedRuns = metrics.totalRuns - completedRuns;
1428
+ return /* @__PURE__ */ jsxDEV5("div", {
1429
+ className: "space-y-6",
1430
+ children: [
1431
+ /* @__PURE__ */ jsxDEV5("h3", {
1432
+ className: "text-lg font-semibold",
1433
+ children: "Usage Analytics"
1434
+ }, undefined, false, undefined, this),
1435
+ /* @__PURE__ */ jsxDEV5("div", {
1436
+ className: "grid gap-6 md:grid-cols-2",
1437
+ children: [
1438
+ /* @__PURE__ */ jsxDEV5("div", {
1439
+ className: "border-border bg-card rounded-xl border p-4",
1440
+ children: [
1441
+ /* @__PURE__ */ jsxDEV5("h4", {
1442
+ className: "font-medium",
1443
+ children: "Run Outcomes"
1444
+ }, undefined, false, undefined, this),
1445
+ /* @__PURE__ */ jsxDEV5("div", {
1446
+ className: "mt-4 space-y-3",
1447
+ children: [
1448
+ /* @__PURE__ */ jsxDEV5(ProgressBar, {
1449
+ label: "Completed",
1450
+ value: completedRuns,
1451
+ total: metrics.totalRuns,
1452
+ color: "bg-green-500"
1453
+ }, undefined, false, undefined, this),
1454
+ /* @__PURE__ */ jsxDEV5(ProgressBar, {
1455
+ label: "Failed",
1456
+ value: failedRuns,
1457
+ total: metrics.totalRuns,
1458
+ color: "bg-red-500"
1459
+ }, undefined, false, undefined, this)
1460
+ ]
1461
+ }, undefined, true, undefined, this)
1462
+ ]
1463
+ }, undefined, true, undefined, this),
1464
+ /* @__PURE__ */ jsxDEV5("div", {
1465
+ className: "border-border bg-card rounded-xl border p-4",
1466
+ children: [
1467
+ /* @__PURE__ */ jsxDEV5("h4", {
1468
+ className: "font-medium",
1469
+ children: "Performance"
1470
+ }, undefined, false, undefined, this),
1471
+ /* @__PURE__ */ jsxDEV5("dl", {
1472
+ className: "mt-4 grid grid-cols-2 gap-4",
1473
+ children: [
1474
+ /* @__PURE__ */ jsxDEV5("div", {
1475
+ children: [
1476
+ /* @__PURE__ */ jsxDEV5("dt", {
1477
+ className: "text-muted-foreground text-sm",
1478
+ children: "Avg Duration"
1479
+ }, undefined, false, undefined, this),
1480
+ /* @__PURE__ */ jsxDEV5("dd", {
1481
+ className: "text-xl font-semibold",
1482
+ children: [
1483
+ (metrics.averageDurationMs / 1000).toFixed(1),
1484
+ "s"
1485
+ ]
1486
+ }, undefined, true, undefined, this)
1487
+ ]
1488
+ }, undefined, true, undefined, this),
1489
+ /* @__PURE__ */ jsxDEV5("div", {
1490
+ children: [
1491
+ /* @__PURE__ */ jsxDEV5("dt", {
1492
+ className: "text-muted-foreground text-sm",
1493
+ children: "Success Rate"
1494
+ }, undefined, false, undefined, this),
1495
+ /* @__PURE__ */ jsxDEV5("dd", {
1496
+ className: "text-xl font-semibold",
1497
+ children: [
1498
+ (metrics.successRate * 100).toFixed(0),
1499
+ "%"
1500
+ ]
1501
+ }, undefined, true, undefined, this)
1502
+ ]
1503
+ }, undefined, true, undefined, this)
1504
+ ]
1505
+ }, undefined, true, undefined, this)
1506
+ ]
1507
+ }, undefined, true, undefined, this)
1508
+ ]
1509
+ }, undefined, true, undefined, this),
1510
+ /* @__PURE__ */ jsxDEV5("div", {
1511
+ className: "border-border bg-card rounded-xl border p-4",
1512
+ children: [
1513
+ /* @__PURE__ */ jsxDEV5("h4", {
1514
+ className: "font-medium",
1515
+ children: "Key Metrics"
1516
+ }, undefined, false, undefined, this),
1517
+ /* @__PURE__ */ jsxDEV5("dl", {
1518
+ className: "mt-4 grid gap-4 sm:grid-cols-3",
1519
+ children: [
1520
+ /* @__PURE__ */ jsxDEV5("div", {
1521
+ children: [
1522
+ /* @__PURE__ */ jsxDEV5("dt", {
1523
+ className: "text-muted-foreground text-sm",
1524
+ children: "Total Runs"
1525
+ }, undefined, false, undefined, this),
1526
+ /* @__PURE__ */ jsxDEV5("dd", {
1527
+ className: "text-2xl font-semibold",
1528
+ children: metrics.totalRuns.toLocaleString()
1529
+ }, undefined, false, undefined, this)
1530
+ ]
1531
+ }, undefined, true, undefined, this),
1532
+ /* @__PURE__ */ jsxDEV5("div", {
1533
+ children: [
1534
+ /* @__PURE__ */ jsxDEV5("dt", {
1535
+ className: "text-muted-foreground text-sm",
1536
+ children: "Total Tokens"
1537
+ }, undefined, false, undefined, this),
1538
+ /* @__PURE__ */ jsxDEV5("dd", {
1539
+ className: "text-2xl font-semibold",
1540
+ children: [
1541
+ (metrics.totalTokens / 1000).toFixed(0),
1542
+ "K"
1543
+ ]
1544
+ }, undefined, true, undefined, this)
1545
+ ]
1546
+ }, undefined, true, undefined, this),
1547
+ /* @__PURE__ */ jsxDEV5("div", {
1548
+ children: [
1549
+ /* @__PURE__ */ jsxDEV5("dt", {
1550
+ className: "text-muted-foreground text-sm",
1551
+ children: "Cost per Run"
1552
+ }, undefined, false, undefined, this),
1553
+ /* @__PURE__ */ jsxDEV5("dd", {
1554
+ className: "text-2xl font-semibold",
1555
+ children: [
1556
+ "$",
1557
+ metrics.totalRuns > 0 ? (metrics.totalCostUsd / metrics.totalRuns).toFixed(4) : "0"
1558
+ ]
1559
+ }, undefined, true, undefined, this)
1560
+ ]
1561
+ }, undefined, true, undefined, this)
1562
+ ]
1563
+ }, undefined, true, undefined, this)
1564
+ ]
1565
+ }, undefined, true, undefined, this)
1566
+ ]
1567
+ }, undefined, true, undefined, this);
1568
+ }
1569
+ function ProgressBar({
1570
+ label,
1571
+ value,
1572
+ total,
1573
+ color
1574
+ }) {
1575
+ const pct = total > 0 ? value / total * 100 : 0;
1576
+ return /* @__PURE__ */ jsxDEV5("div", {
1577
+ children: [
1578
+ /* @__PURE__ */ jsxDEV5("div", {
1579
+ className: "flex justify-between text-sm",
1580
+ children: [
1581
+ /* @__PURE__ */ jsxDEV5("span", {
1582
+ children: label
1583
+ }, undefined, false, undefined, this),
1584
+ /* @__PURE__ */ jsxDEV5("span", {
1585
+ className: "text-muted-foreground",
1586
+ children: [
1587
+ value,
1588
+ " (",
1589
+ pct.toFixed(0),
1590
+ "%)"
1591
+ ]
1592
+ }, undefined, true, undefined, this)
1593
+ ]
1594
+ }, undefined, true, undefined, this),
1595
+ /* @__PURE__ */ jsxDEV5("div", {
1596
+ className: "bg-muted mt-1 h-2 overflow-hidden rounded-full",
1597
+ children: /* @__PURE__ */ jsxDEV5("div", {
1598
+ className: `h-full ${color}`,
1599
+ style: { width: `${pct}%` }
1600
+ }, undefined, false, undefined, this)
1601
+ }, undefined, false, undefined, this)
1602
+ ]
1603
+ }, undefined, true, undefined, this);
1604
+ }
1605
+ export {
1606
+ AgentDashboard
1607
+ };