@contractspec/example.agent-console 1.56.1 → 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 +211 -277
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +36 -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 -7
  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 +40 -55
  112. package/dist/handlers/agent.handlers.d.ts +121 -121
  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 -9
  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 -9
  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 -7
  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 -9
  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 -9
  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 -9
  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 +657 -119
  335. package/tsdown.config.js +1 -2
  336. package/.turbo/turbo-build$colon$bundle.log +0 -280
  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
package/dist/ui/index.js CHANGED
@@ -1,24 +1,2081 @@
1
- import { useRunList } from "./hooks/useRunList.js";
2
- import { RunListView } from "./views/RunListView.js";
3
- import { useToolList } from "./hooks/useToolList.js";
4
- import { ToolRegistryView } from "./views/ToolRegistryView.js";
5
- import { useAgentList } from "./hooks/useAgentList.js";
6
- import { useAgentMutations } from "./hooks/useAgentMutations.js";
7
- import { CreateAgentModal } from "./modals/CreateAgentModal.js";
8
- import { AgentActionsModal } from "./modals/AgentActionsModal.js";
9
- import { AgentDashboard } from "./AgentDashboard.js";
10
- import "./AgentRunList.js";
11
- import "./AgentToolRegistry.js";
12
- import { AgentListView } from "./views/AgentListView.js";
13
- import "./views/index.js";
14
- import "./modals/index.js";
15
- import "./hooks/index.js";
16
- import { agentListReactRenderer } from "./renderers/agent-list.renderer.js";
17
- import { agentListMarkdownRenderer } from "./renderers/agent-list.markdown.js";
18
- import { runListMarkdownRenderer } from "./renderers/run-list.markdown.js";
19
- import { toolRegistryMarkdownRenderer } from "./renderers/tool-registry.markdown.js";
20
- import { agentDashboardMarkdownRenderer } from "./renderers/dashboard.markdown.js";
21
- import "./renderers/index.js";
22
- import { agentConsoleDemoOverlay, agentConsoleOverlays, agentConsoleReadOnlyOverlay } from "./overlays/demo-overlays.js";
23
-
24
- export { AgentActionsModal, AgentDashboard, AgentListView, RunListView as AgentRunList, ToolRegistryView as AgentToolRegistry, CreateAgentModal, RunListView, ToolRegistryView, agentConsoleDemoOverlay, agentConsoleOverlays, agentConsoleReadOnlyOverlay, agentDashboardMarkdownRenderer, agentListMarkdownRenderer, agentListReactRenderer, runListMarkdownRenderer, toolRegistryMarkdownRenderer, useAgentList, useAgentMutations, useRunList, useToolList };
1
+ // @bun
2
+ // src/ui/hooks/useRunList.ts
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
5
+ function useRunList(options = {}) {
6
+ const { handlers, projectId } = useTemplateRuntime();
7
+ const { agent } = handlers;
8
+ const [data, setData] = useState(null);
9
+ const [metrics, setMetrics] = useState(null);
10
+ const [loading, setLoading] = useState(true);
11
+ const [error, setError] = useState(null);
12
+ const [page, setPage] = useState(1);
13
+ const fetchData = useCallback(async () => {
14
+ setLoading(true);
15
+ setError(null);
16
+ try {
17
+ const [runsResult, metricsResult] = await Promise.all([
18
+ agent.listRuns({
19
+ projectId,
20
+ agentId: options.agentId,
21
+ status: options.status === "all" ? undefined : options.status,
22
+ limit: options.limit ?? 20,
23
+ offset: (page - 1) * (options.limit ?? 20)
24
+ }),
25
+ agent.getRunMetrics({
26
+ projectId,
27
+ agentId: options.agentId,
28
+ startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
29
+ endDate: new Date
30
+ })
31
+ ]);
32
+ setData(runsResult);
33
+ setMetrics(metricsResult);
34
+ } catch (err) {
35
+ setError(err instanceof Error ? err : new Error("Unknown error"));
36
+ } finally {
37
+ setLoading(false);
38
+ }
39
+ }, [agent, projectId, options.agentId, options.status, options.limit, page]);
40
+ useEffect(() => {
41
+ fetchData();
42
+ }, [fetchData]);
43
+ return {
44
+ data,
45
+ metrics,
46
+ loading,
47
+ error,
48
+ page,
49
+ refetch: fetchData,
50
+ nextPage: () => setPage((p) => p + 1),
51
+ prevPage: () => page > 1 && setPage((p) => p - 1)
52
+ };
53
+ }
54
+
55
+ // src/ui/views/RunListView.tsx
56
+ import {
57
+ StatCard,
58
+ StatCardGroup,
59
+ StatusChip,
60
+ EmptyState,
61
+ LoaderBlock,
62
+ ErrorState
63
+ } from "@contractspec/lib.design-system";
64
+ import { jsxDEV } from "react/jsx-dev-runtime";
65
+ "use client";
66
+ function getStatusTone(status) {
67
+ switch (status) {
68
+ case "COMPLETED":
69
+ return "success";
70
+ case "RUNNING":
71
+ return "warning";
72
+ case "QUEUED":
73
+ return "neutral";
74
+ case "FAILED":
75
+ case "CANCELLED":
76
+ return "danger";
77
+ default:
78
+ return "neutral";
79
+ }
80
+ }
81
+ function formatDuration(ms) {
82
+ if (!ms)
83
+ return "-";
84
+ if (ms < 1000)
85
+ return `${ms}ms`;
86
+ if (ms < 60000)
87
+ return `${(ms / 1000).toFixed(1)}s`;
88
+ return `${(ms / 60000).toFixed(1)}m`;
89
+ }
90
+ function formatTokens(tokens) {
91
+ if (tokens < 1000)
92
+ return tokens.toString();
93
+ if (tokens < 1e6)
94
+ return `${(tokens / 1000).toFixed(1)}K`;
95
+ return `${(tokens / 1e6).toFixed(2)}M`;
96
+ }
97
+ function formatCost(cost) {
98
+ if (!cost)
99
+ return "-";
100
+ return `$${cost.toFixed(4)}`;
101
+ }
102
+ function RunListView({ agentId, onRunClick }) {
103
+ const { data, metrics, loading, error, refetch } = useRunList({ agentId });
104
+ if (loading && !data) {
105
+ return /* @__PURE__ */ jsxDEV(LoaderBlock, {
106
+ label: "Loading runs..."
107
+ }, undefined, false, undefined, this);
108
+ }
109
+ if (error) {
110
+ return /* @__PURE__ */ jsxDEV(ErrorState, {
111
+ title: "Failed to load runs",
112
+ description: error.message,
113
+ onRetry: refetch,
114
+ retryLabel: "Retry"
115
+ }, undefined, false, undefined, this);
116
+ }
117
+ if (!data?.items.length) {
118
+ return /* @__PURE__ */ jsxDEV(EmptyState, {
119
+ title: "No runs yet",
120
+ description: "Execute an agent to see run history here."
121
+ }, undefined, false, undefined, this);
122
+ }
123
+ return /* @__PURE__ */ jsxDEV("div", {
124
+ className: "space-y-6",
125
+ children: [
126
+ metrics && /* @__PURE__ */ jsxDEV(StatCardGroup, {
127
+ children: [
128
+ /* @__PURE__ */ jsxDEV(StatCard, {
129
+ label: "Total Runs",
130
+ value: metrics.totalRuns
131
+ }, undefined, false, undefined, this),
132
+ /* @__PURE__ */ jsxDEV(StatCard, {
133
+ label: "Success Rate",
134
+ value: `${(metrics.successRate * 100).toFixed(1)}%`
135
+ }, undefined, false, undefined, this),
136
+ /* @__PURE__ */ jsxDEV(StatCard, {
137
+ label: "Total Tokens",
138
+ value: formatTokens(metrics.totalTokens)
139
+ }, undefined, false, undefined, this),
140
+ /* @__PURE__ */ jsxDEV(StatCard, {
141
+ label: "Total Cost",
142
+ value: `$${metrics.totalCostUsd.toFixed(2)}`
143
+ }, undefined, false, undefined, this)
144
+ ]
145
+ }, undefined, true, undefined, this),
146
+ /* @__PURE__ */ jsxDEV("div", {
147
+ className: "border-border rounded-lg border",
148
+ children: /* @__PURE__ */ jsxDEV("table", {
149
+ className: "w-full",
150
+ children: [
151
+ /* @__PURE__ */ jsxDEV("thead", {
152
+ className: "border-border bg-muted/30 border-b",
153
+ children: /* @__PURE__ */ jsxDEV("tr", {
154
+ children: [
155
+ /* @__PURE__ */ jsxDEV("th", {
156
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
157
+ children: "Run"
158
+ }, undefined, false, undefined, this),
159
+ /* @__PURE__ */ jsxDEV("th", {
160
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
161
+ children: "Agent"
162
+ }, undefined, false, undefined, this),
163
+ /* @__PURE__ */ jsxDEV("th", {
164
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
165
+ children: "Status"
166
+ }, undefined, false, undefined, this),
167
+ /* @__PURE__ */ jsxDEV("th", {
168
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
169
+ children: "Tokens"
170
+ }, undefined, false, undefined, this),
171
+ /* @__PURE__ */ jsxDEV("th", {
172
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
173
+ children: "Duration"
174
+ }, undefined, false, undefined, this),
175
+ /* @__PURE__ */ jsxDEV("th", {
176
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
177
+ children: "Cost"
178
+ }, undefined, false, undefined, this)
179
+ ]
180
+ }, undefined, true, undefined, this)
181
+ }, undefined, false, undefined, this),
182
+ /* @__PURE__ */ jsxDEV("tbody", {
183
+ className: "divide-border divide-y",
184
+ children: data.items.map((run) => /* @__PURE__ */ jsxDEV("tr", {
185
+ className: "hover:bg-muted/50 cursor-pointer transition-colors",
186
+ onClick: () => onRunClick?.(run.id),
187
+ children: [
188
+ /* @__PURE__ */ jsxDEV("td", {
189
+ className: "px-4 py-3",
190
+ children: [
191
+ /* @__PURE__ */ jsxDEV("div", {
192
+ className: "font-mono text-sm",
193
+ children: run.id.slice(-8)
194
+ }, undefined, false, undefined, this),
195
+ /* @__PURE__ */ jsxDEV("div", {
196
+ className: "text-muted-foreground text-xs",
197
+ children: run.queuedAt.toLocaleString()
198
+ }, undefined, false, undefined, this)
199
+ ]
200
+ }, undefined, true, undefined, this),
201
+ /* @__PURE__ */ jsxDEV("td", {
202
+ className: "px-4 py-3",
203
+ children: /* @__PURE__ */ jsxDEV("span", {
204
+ className: "font-medium",
205
+ children: run.agentName
206
+ }, undefined, false, undefined, this)
207
+ }, undefined, false, undefined, this),
208
+ /* @__PURE__ */ jsxDEV("td", {
209
+ className: "px-4 py-3",
210
+ children: /* @__PURE__ */ jsxDEV(StatusChip, {
211
+ tone: getStatusTone(run.status),
212
+ label: run.status
213
+ }, undefined, false, undefined, this)
214
+ }, undefined, false, undefined, this),
215
+ /* @__PURE__ */ jsxDEV("td", {
216
+ className: "px-4 py-3 text-right font-mono text-sm",
217
+ children: formatTokens(run.totalTokens)
218
+ }, undefined, false, undefined, this),
219
+ /* @__PURE__ */ jsxDEV("td", {
220
+ className: "px-4 py-3 text-right font-mono text-sm",
221
+ children: formatDuration(run.durationMs)
222
+ }, undefined, false, undefined, this),
223
+ /* @__PURE__ */ jsxDEV("td", {
224
+ className: "px-4 py-3 text-right font-mono text-sm",
225
+ children: formatCost(run.estimatedCostUsd)
226
+ }, undefined, false, undefined, this)
227
+ ]
228
+ }, run.id, true, undefined, this))
229
+ }, undefined, false, undefined, this)
230
+ ]
231
+ }, undefined, true, undefined, this)
232
+ }, undefined, false, undefined, this),
233
+ /* @__PURE__ */ jsxDEV("div", {
234
+ className: "text-muted-foreground text-center text-sm",
235
+ children: [
236
+ "Showing ",
237
+ data.items.length,
238
+ " of ",
239
+ data.total,
240
+ " runs"
241
+ ]
242
+ }, undefined, true, undefined, this)
243
+ ]
244
+ }, undefined, true, undefined, this);
245
+ }
246
+
247
+ // src/ui/hooks/useToolList.ts
248
+ import { useCallback as useCallback2, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
249
+ import { useTemplateRuntime as useTemplateRuntime2 } from "@contractspec/lib.example-shared-ui";
250
+ function useToolList(options = {}) {
251
+ const { handlers, projectId } = useTemplateRuntime2();
252
+ const { agent } = handlers;
253
+ const [data, setData] = useState2(null);
254
+ const [loading, setLoading] = useState2(true);
255
+ const [error, setError] = useState2(null);
256
+ const [page, setPage] = useState2(1);
257
+ const fetchData = useCallback2(async () => {
258
+ setLoading(true);
259
+ setError(null);
260
+ try {
261
+ const result = await agent.listTools({
262
+ projectId,
263
+ search: options.search,
264
+ category: options.category,
265
+ status: options.status === "all" ? undefined : options.status,
266
+ limit: options.limit ?? 50,
267
+ offset: (page - 1) * (options.limit ?? 50)
268
+ });
269
+ setData(result);
270
+ } catch (err) {
271
+ setError(err instanceof Error ? err : new Error("Unknown error"));
272
+ } finally {
273
+ setLoading(false);
274
+ }
275
+ }, [
276
+ agent,
277
+ projectId,
278
+ options.search,
279
+ options.category,
280
+ options.status,
281
+ options.limit,
282
+ page
283
+ ]);
284
+ useEffect2(() => {
285
+ fetchData();
286
+ }, [fetchData]);
287
+ const { stats, groupedByCategory, categoryStats } = useMemo(() => {
288
+ if (!data)
289
+ return { stats: null, groupedByCategory: {}, categoryStats: [] };
290
+ const items = data.items;
291
+ const active = items.filter((t) => t.status === "ACTIVE").length;
292
+ const deprecated = items.filter((t) => t.status === "DEPRECATED").length;
293
+ const disabled = items.filter((t) => t.status === "DISABLED").length;
294
+ const grouped = {};
295
+ const byCategory = {};
296
+ items.forEach((t) => {
297
+ const cat = t.category;
298
+ if (!grouped[cat])
299
+ grouped[cat] = [];
300
+ grouped[cat].push(t);
301
+ byCategory[cat] = (byCategory[cat] || 0) + 1;
302
+ });
303
+ const catStats = Object.entries(byCategory).map(([category, count]) => ({ category, count })).sort((a, b) => b.count - a.count);
304
+ return {
305
+ stats: {
306
+ total: data.total,
307
+ active,
308
+ deprecated,
309
+ disabled,
310
+ topCategories: catStats.slice(0, 5)
311
+ },
312
+ groupedByCategory: grouped,
313
+ categoryStats: catStats
314
+ };
315
+ }, [data]);
316
+ return {
317
+ data,
318
+ loading,
319
+ error,
320
+ stats,
321
+ groupedByCategory,
322
+ categoryStats,
323
+ page,
324
+ refetch: fetchData,
325
+ nextPage: () => setPage((p) => p + 1),
326
+ prevPage: () => page > 1 && setPage((p) => p - 1)
327
+ };
328
+ }
329
+
330
+ // src/ui/views/ToolRegistryView.tsx
331
+ import {
332
+ StatCard as StatCard2,
333
+ StatCardGroup as StatCardGroup2,
334
+ StatusChip as StatusChip2,
335
+ EntityCard,
336
+ EmptyState as EmptyState2,
337
+ LoaderBlock as LoaderBlock2,
338
+ ErrorState as ErrorState2,
339
+ Button
340
+ } from "@contractspec/lib.design-system";
341
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
342
+ "use client";
343
+ var categoryIcons = {
344
+ RETRIEVAL: "\uD83D\uDD0D",
345
+ COMPUTATION: "\uD83E\uDDEE",
346
+ COMMUNICATION: "\uD83D\uDCE7",
347
+ INTEGRATION: "\uD83D\uDD17",
348
+ UTILITY: "\uD83D\uDEE0\uFE0F",
349
+ CUSTOM: "\u2699\uFE0F"
350
+ };
351
+ function getStatusTone2(status) {
352
+ switch (status) {
353
+ case "ACTIVE":
354
+ return "success";
355
+ case "DRAFT":
356
+ return "neutral";
357
+ case "DEPRECATED":
358
+ return "warning";
359
+ case "DISABLED":
360
+ return "danger";
361
+ default:
362
+ return "neutral";
363
+ }
364
+ }
365
+ function ToolRegistryView({
366
+ onToolClick,
367
+ onCreateTool
368
+ }) {
369
+ const { data, loading, error, groupedByCategory, categoryStats, refetch } = useToolList();
370
+ if (loading && !data) {
371
+ return /* @__PURE__ */ jsxDEV2(LoaderBlock2, {
372
+ label: "Loading tools..."
373
+ }, undefined, false, undefined, this);
374
+ }
375
+ if (error) {
376
+ return /* @__PURE__ */ jsxDEV2(ErrorState2, {
377
+ title: "Failed to load tools",
378
+ description: error.message,
379
+ onRetry: refetch,
380
+ retryLabel: "Retry"
381
+ }, undefined, false, undefined, this);
382
+ }
383
+ if (!data?.items.length) {
384
+ return /* @__PURE__ */ jsxDEV2(EmptyState2, {
385
+ title: "No tools registered",
386
+ description: "Create your first tool to extend agent capabilities.",
387
+ primaryAction: onCreateTool ? /* @__PURE__ */ jsxDEV2(Button, {
388
+ onPress: onCreateTool,
389
+ children: "Create Tool"
390
+ }, undefined, false, undefined, this) : undefined
391
+ }, undefined, false, undefined, this);
392
+ }
393
+ return /* @__PURE__ */ jsxDEV2("div", {
394
+ className: "space-y-8",
395
+ children: [
396
+ /* @__PURE__ */ jsxDEV2(StatCardGroup2, {
397
+ children: [
398
+ /* @__PURE__ */ jsxDEV2(StatCard2, {
399
+ label: "Total Tools",
400
+ value: data.total
401
+ }, undefined, false, undefined, this),
402
+ categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsxDEV2(StatCard2, {
403
+ label: `${categoryIcons[category] ?? ""} ${category}`,
404
+ value: count
405
+ }, category, false, undefined, this))
406
+ ]
407
+ }, undefined, true, undefined, this),
408
+ Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV2("section", {
409
+ className: "space-y-4",
410
+ children: [
411
+ /* @__PURE__ */ jsxDEV2("div", {
412
+ className: "flex items-center gap-2",
413
+ children: [
414
+ /* @__PURE__ */ jsxDEV2("span", {
415
+ className: "text-2xl",
416
+ children: categoryIcons[category]
417
+ }, undefined, false, undefined, this),
418
+ /* @__PURE__ */ jsxDEV2("h3", {
419
+ className: "text-lg font-semibold",
420
+ children: category
421
+ }, undefined, false, undefined, this),
422
+ /* @__PURE__ */ jsxDEV2("span", {
423
+ className: "bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs",
424
+ children: tools.length
425
+ }, undefined, false, undefined, this)
426
+ ]
427
+ }, undefined, true, undefined, this),
428
+ /* @__PURE__ */ jsxDEV2("div", {
429
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
430
+ children: tools.map((tool) => /* @__PURE__ */ jsxDEV2(EntityCard, {
431
+ cardTitle: tool.name,
432
+ cardSubtitle: `v${tool.version}`,
433
+ meta: /* @__PURE__ */ jsxDEV2("p", {
434
+ className: "text-muted-foreground text-sm",
435
+ children: tool.description
436
+ }, undefined, false, undefined, this),
437
+ chips: /* @__PURE__ */ jsxDEV2(StatusChip2, {
438
+ tone: getStatusTone2(tool.status),
439
+ label: tool.status
440
+ }, undefined, false, undefined, this),
441
+ footer: /* @__PURE__ */ jsxDEV2("code", {
442
+ className: "text-muted-foreground text-xs",
443
+ children: tool.name
444
+ }, undefined, false, undefined, this),
445
+ onClick: onToolClick ? () => onToolClick(tool.id) : undefined
446
+ }, tool.id, false, undefined, this))
447
+ }, undefined, false, undefined, this)
448
+ ]
449
+ }, category, true, undefined, this))
450
+ ]
451
+ }, undefined, true, undefined, this);
452
+ }
453
+
454
+ // src/ui/hooks/useAgentList.ts
455
+ import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
456
+ import { useTemplateRuntime as useTemplateRuntime3 } from "@contractspec/lib.example-shared-ui";
457
+ function useAgentList(options = {}) {
458
+ const { handlers, projectId } = useTemplateRuntime3();
459
+ const { agent } = handlers;
460
+ const [data, setData] = useState3(null);
461
+ const [loading, setLoading] = useState3(true);
462
+ const [error, setError] = useState3(null);
463
+ const [page, setPage] = useState3(1);
464
+ const fetchData = useCallback3(async () => {
465
+ setLoading(true);
466
+ setError(null);
467
+ try {
468
+ const result = await agent.listAgents({
469
+ projectId,
470
+ search: options.search,
471
+ status: options.status === "all" ? undefined : options.status,
472
+ limit: options.limit ?? 20,
473
+ offset: (page - 1) * (options.limit ?? 20)
474
+ });
475
+ setData(result);
476
+ } catch (err) {
477
+ setError(err instanceof Error ? err : new Error("Unknown error"));
478
+ } finally {
479
+ setLoading(false);
480
+ }
481
+ }, [agent, projectId, options.search, options.status, options.limit, page]);
482
+ useEffect3(() => {
483
+ fetchData();
484
+ }, [fetchData]);
485
+ const stats = useMemo2(() => {
486
+ if (!data)
487
+ return null;
488
+ return {
489
+ total: data.total,
490
+ active: data.items.filter((a) => a.status === "ACTIVE").length,
491
+ paused: data.items.filter((a) => a.status === "PAUSED").length,
492
+ draft: data.items.filter((a) => a.status === "DRAFT").length
493
+ };
494
+ }, [data]);
495
+ return {
496
+ data,
497
+ loading,
498
+ error,
499
+ stats,
500
+ page,
501
+ refetch: fetchData,
502
+ nextPage: () => setPage((p) => p + 1),
503
+ prevPage: () => page > 1 && setPage((p) => p - 1)
504
+ };
505
+ }
506
+
507
+ // src/ui/hooks/useAgentMutations.ts
508
+ import { useCallback as useCallback4, useState as useState4 } from "react";
509
+ import { useTemplateRuntime as useTemplateRuntime4 } from "@contractspec/lib.example-shared-ui";
510
+ function useAgentMutations(options = {}) {
511
+ const { handlers, projectId } = useTemplateRuntime4();
512
+ const { agent } = handlers;
513
+ const [createState, setCreateState] = useState4({
514
+ loading: false,
515
+ error: null,
516
+ data: null
517
+ });
518
+ const [updateState, setUpdateState] = useState4({
519
+ loading: false,
520
+ error: null,
521
+ data: null
522
+ });
523
+ const createAgent = useCallback4(async (input) => {
524
+ setCreateState({ loading: true, error: null, data: null });
525
+ try {
526
+ const result = await agent.createAgent(input, {
527
+ projectId,
528
+ organizationId: "demo-org"
529
+ });
530
+ setCreateState({ loading: false, error: null, data: result });
531
+ options.onSuccess?.();
532
+ return result;
533
+ } catch (err) {
534
+ const error = err instanceof Error ? err : new Error("Failed to create agent");
535
+ setCreateState({ loading: false, error, data: null });
536
+ options.onError?.(error);
537
+ return null;
538
+ }
539
+ }, [agent, projectId, options]);
540
+ const updateAgent = useCallback4(async (input) => {
541
+ setUpdateState({ loading: true, error: null, data: null });
542
+ try {
543
+ const result = await agent.updateAgent(input);
544
+ setUpdateState({ loading: false, error: null, data: result });
545
+ options.onSuccess?.();
546
+ return result;
547
+ } catch (err) {
548
+ const error = err instanceof Error ? err : new Error("Failed to update agent");
549
+ setUpdateState({ loading: false, error, data: null });
550
+ options.onError?.(error);
551
+ return null;
552
+ }
553
+ }, [agent, options]);
554
+ const activateAgent = useCallback4(async (agentId) => {
555
+ return updateAgent({ id: agentId, status: "ACTIVE" });
556
+ }, [updateAgent]);
557
+ const pauseAgent = useCallback4(async (agentId) => {
558
+ return updateAgent({ id: agentId, status: "PAUSED" });
559
+ }, [updateAgent]);
560
+ const archiveAgent = useCallback4(async (agentId) => {
561
+ return updateAgent({ id: agentId, status: "ARCHIVED" });
562
+ }, [updateAgent]);
563
+ const executeAgent = useCallback4(async (input) => {
564
+ console.log("Execute agent:", input);
565
+ options.onSuccess?.();
566
+ return null;
567
+ }, [options]);
568
+ return {
569
+ createAgent,
570
+ updateAgent,
571
+ activateAgent,
572
+ pauseAgent,
573
+ archiveAgent,
574
+ executeAgent,
575
+ createState,
576
+ updateState,
577
+ isLoading: createState.loading || updateState.loading
578
+ };
579
+ }
580
+
581
+ // src/ui/modals/CreateAgentModal.tsx
582
+ import { useState as useState5 } from "react";
583
+ import { Button as Button2, Input } from "@contractspec/lib.design-system";
584
+ import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
585
+ "use client";
586
+ var MODEL_PROVIDERS = [
587
+ {
588
+ value: "openai",
589
+ label: "OpenAI",
590
+ models: ["gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"]
591
+ },
592
+ {
593
+ value: "anthropic",
594
+ label: "Anthropic",
595
+ models: ["claude-3-opus", "claude-3-sonnet", "claude-3-haiku"]
596
+ },
597
+ { value: "google", label: "Google", models: ["gemini-pro", "gemini-ultra"] },
598
+ {
599
+ value: "mistral",
600
+ label: "Mistral",
601
+ models: ["mistral-large", "mistral-medium", "mistral-small"]
602
+ }
603
+ ];
604
+ function CreateAgentModal({
605
+ isOpen,
606
+ onClose,
607
+ onSubmit,
608
+ isLoading = false
609
+ }) {
610
+ const [name, setName] = useState5("");
611
+ const [description, setDescription] = useState5("");
612
+ const [modelProvider, setModelProvider] = useState5("openai");
613
+ const [modelName, setModelName] = useState5("gpt-4o");
614
+ const [systemPrompt, setSystemPrompt] = useState5("");
615
+ const [error, setError] = useState5(null);
616
+ const selectedProvider = MODEL_PROVIDERS.find((p) => p.value === modelProvider);
617
+ const handleSubmit = async (e) => {
618
+ e.preventDefault();
619
+ setError(null);
620
+ if (!name.trim()) {
621
+ setError("Agent name is required");
622
+ return;
623
+ }
624
+ try {
625
+ await onSubmit({
626
+ name: name.trim(),
627
+ description: description.trim() || undefined,
628
+ modelProvider,
629
+ modelName,
630
+ systemPrompt: systemPrompt.trim() || undefined
631
+ });
632
+ setName("");
633
+ setDescription("");
634
+ setModelProvider("openai");
635
+ setModelName("gpt-4o");
636
+ setSystemPrompt("");
637
+ onClose();
638
+ } catch (err) {
639
+ setError(err instanceof Error ? err.message : "Failed to create agent");
640
+ }
641
+ };
642
+ const handleProviderChange = (provider) => {
643
+ setModelProvider(provider);
644
+ const providerConfig = MODEL_PROVIDERS.find((p) => p.value === provider);
645
+ if (providerConfig) {
646
+ setModelName(providerConfig.models[0]);
647
+ }
648
+ };
649
+ if (!isOpen)
650
+ return null;
651
+ return /* @__PURE__ */ jsxDEV3("div", {
652
+ className: "fixed inset-0 z-50 flex items-center justify-center",
653
+ children: [
654
+ /* @__PURE__ */ jsxDEV3("div", {
655
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
656
+ onClick: onClose,
657
+ role: "button",
658
+ tabIndex: 0,
659
+ onKeyDown: (e) => {
660
+ if (e.key === "Enter" || e.key === " ")
661
+ onClose();
662
+ },
663
+ "aria-label": "Close modal"
664
+ }, undefined, false, undefined, this),
665
+ /* @__PURE__ */ jsxDEV3("div", {
666
+ 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",
667
+ children: [
668
+ /* @__PURE__ */ jsxDEV3("h2", {
669
+ className: "mb-4 text-xl font-semibold",
670
+ children: "Create New Agent"
671
+ }, undefined, false, undefined, this),
672
+ /* @__PURE__ */ jsxDEV3("form", {
673
+ onSubmit: handleSubmit,
674
+ className: "space-y-4",
675
+ children: [
676
+ /* @__PURE__ */ jsxDEV3("div", {
677
+ children: [
678
+ /* @__PURE__ */ jsxDEV3("label", {
679
+ htmlFor: "agent-name",
680
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
681
+ children: "Agent Name *"
682
+ }, undefined, false, undefined, this),
683
+ /* @__PURE__ */ jsxDEV3(Input, {
684
+ id: "agent-name",
685
+ value: name,
686
+ onChange: (e) => setName(e.target.value),
687
+ placeholder: "e.g., Customer Support Bot",
688
+ disabled: isLoading
689
+ }, undefined, false, undefined, this)
690
+ ]
691
+ }, undefined, true, undefined, this),
692
+ /* @__PURE__ */ jsxDEV3("div", {
693
+ children: [
694
+ /* @__PURE__ */ jsxDEV3("label", {
695
+ htmlFor: "agent-description",
696
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
697
+ children: "Description"
698
+ }, undefined, false, undefined, this),
699
+ /* @__PURE__ */ jsxDEV3("textarea", {
700
+ id: "agent-description",
701
+ value: description,
702
+ onChange: (e) => setDescription(e.target.value),
703
+ placeholder: "Describe what this agent does...",
704
+ rows: 2,
705
+ disabled: isLoading,
706
+ 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"
707
+ }, undefined, false, undefined, this)
708
+ ]
709
+ }, undefined, true, undefined, this),
710
+ /* @__PURE__ */ jsxDEV3("div", {
711
+ className: "flex gap-3",
712
+ children: [
713
+ /* @__PURE__ */ jsxDEV3("div", {
714
+ className: "flex-1",
715
+ children: [
716
+ /* @__PURE__ */ jsxDEV3("label", {
717
+ htmlFor: "model-provider",
718
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
719
+ children: "Provider *"
720
+ }, undefined, false, undefined, this),
721
+ /* @__PURE__ */ jsxDEV3("select", {
722
+ id: "model-provider",
723
+ value: modelProvider,
724
+ onChange: (e) => handleProviderChange(e.target.value),
725
+ disabled: isLoading,
726
+ 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",
727
+ children: MODEL_PROVIDERS.map((p) => /* @__PURE__ */ jsxDEV3("option", {
728
+ value: p.value,
729
+ children: p.label
730
+ }, p.value, false, undefined, this))
731
+ }, undefined, false, undefined, this)
732
+ ]
733
+ }, undefined, true, undefined, this),
734
+ /* @__PURE__ */ jsxDEV3("div", {
735
+ className: "flex-1",
736
+ children: [
737
+ /* @__PURE__ */ jsxDEV3("label", {
738
+ htmlFor: "model-name",
739
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
740
+ children: "Model *"
741
+ }, undefined, false, undefined, this),
742
+ /* @__PURE__ */ jsxDEV3("select", {
743
+ id: "model-name",
744
+ value: modelName,
745
+ onChange: (e) => setModelName(e.target.value),
746
+ disabled: isLoading,
747
+ 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",
748
+ children: selectedProvider?.models.map((m) => /* @__PURE__ */ jsxDEV3("option", {
749
+ value: m,
750
+ children: m
751
+ }, m, false, undefined, this))
752
+ }, undefined, false, undefined, this)
753
+ ]
754
+ }, undefined, true, undefined, this)
755
+ ]
756
+ }, undefined, true, undefined, this),
757
+ /* @__PURE__ */ jsxDEV3("div", {
758
+ children: [
759
+ /* @__PURE__ */ jsxDEV3("label", {
760
+ htmlFor: "system-prompt",
761
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
762
+ children: "System Prompt"
763
+ }, undefined, false, undefined, this),
764
+ /* @__PURE__ */ jsxDEV3("textarea", {
765
+ id: "system-prompt",
766
+ value: systemPrompt,
767
+ onChange: (e) => setSystemPrompt(e.target.value),
768
+ placeholder: "You are a helpful assistant that...",
769
+ rows: 4,
770
+ disabled: isLoading,
771
+ 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"
772
+ }, undefined, false, undefined, this),
773
+ /* @__PURE__ */ jsxDEV3("p", {
774
+ className: "text-muted-foreground mt-1 text-xs",
775
+ children: "Instructions that define the agent's behavior"
776
+ }, undefined, false, undefined, this)
777
+ ]
778
+ }, undefined, true, undefined, this),
779
+ error && /* @__PURE__ */ jsxDEV3("div", {
780
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
781
+ children: error
782
+ }, undefined, false, undefined, this),
783
+ /* @__PURE__ */ jsxDEV3("div", {
784
+ className: "flex justify-end gap-3 pt-2",
785
+ children: [
786
+ /* @__PURE__ */ jsxDEV3(Button2, {
787
+ type: "button",
788
+ variant: "ghost",
789
+ onPress: onClose,
790
+ disabled: isLoading,
791
+ children: "Cancel"
792
+ }, undefined, false, undefined, this),
793
+ /* @__PURE__ */ jsxDEV3(Button2, {
794
+ type: "submit",
795
+ disabled: isLoading,
796
+ children: isLoading ? "Creating..." : "Create Agent"
797
+ }, undefined, false, undefined, this)
798
+ ]
799
+ }, undefined, true, undefined, this)
800
+ ]
801
+ }, undefined, true, undefined, this)
802
+ ]
803
+ }, undefined, true, undefined, this)
804
+ ]
805
+ }, undefined, true, undefined, this);
806
+ }
807
+
808
+ // src/ui/modals/AgentActionsModal.tsx
809
+ import { useState as useState6 } from "react";
810
+ import { Button as Button3 } from "@contractspec/lib.design-system";
811
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
812
+ "use client";
813
+ function getStatusColor(status) {
814
+ switch (status) {
815
+ case "ACTIVE":
816
+ return "text-green-600 bg-green-100 dark:text-green-400 dark:bg-green-900/30";
817
+ case "DRAFT":
818
+ return "text-blue-600 bg-blue-100 dark:text-blue-400 dark:bg-blue-900/30";
819
+ case "PAUSED":
820
+ return "text-yellow-600 bg-yellow-100 dark:text-yellow-400 dark:bg-yellow-900/30";
821
+ case "ARCHIVED":
822
+ return "text-gray-600 bg-gray-100 dark:text-gray-400 dark:bg-gray-700";
823
+ default:
824
+ return "text-gray-600 bg-gray-100";
825
+ }
826
+ }
827
+ function AgentActionsModal({
828
+ isOpen,
829
+ agent,
830
+ onClose,
831
+ onActivate,
832
+ onPause,
833
+ onArchive,
834
+ onExecute,
835
+ isLoading = false
836
+ }) {
837
+ const [mode, setMode] = useState6("menu");
838
+ const [message, setMessage] = useState6("");
839
+ const [confirmAction, setConfirmAction] = useState6(null);
840
+ const [error, setError] = useState6(null);
841
+ const resetForm = () => {
842
+ setMode("menu");
843
+ setMessage("");
844
+ setConfirmAction(null);
845
+ setError(null);
846
+ };
847
+ const handleClose = () => {
848
+ resetForm();
849
+ onClose();
850
+ };
851
+ const handleExecute = async () => {
852
+ if (!agent)
853
+ return;
854
+ setError(null);
855
+ if (!message.trim()) {
856
+ setError("Please enter a message");
857
+ return;
858
+ }
859
+ try {
860
+ await onExecute(agent.id, message.trim());
861
+ handleClose();
862
+ } catch (err) {
863
+ setError(err instanceof Error ? err.message : "Failed to execute agent");
864
+ }
865
+ };
866
+ const handleStatusChange = async (action) => {
867
+ if (!agent)
868
+ return;
869
+ setError(null);
870
+ try {
871
+ switch (action) {
872
+ case "activate":
873
+ await onActivate(agent.id);
874
+ break;
875
+ case "pause":
876
+ await onPause(agent.id);
877
+ break;
878
+ case "archive":
879
+ await onArchive(agent.id);
880
+ break;
881
+ }
882
+ handleClose();
883
+ } catch (err) {
884
+ setError(err instanceof Error ? err.message : `Failed to ${action} agent`);
885
+ }
886
+ };
887
+ if (!isOpen || !agent)
888
+ return null;
889
+ return /* @__PURE__ */ jsxDEV4("div", {
890
+ className: "fixed inset-0 z-50 flex items-center justify-center",
891
+ children: [
892
+ /* @__PURE__ */ jsxDEV4("div", {
893
+ className: "bg-background/80 absolute inset-0 backdrop-blur-sm",
894
+ onClick: handleClose,
895
+ role: "button",
896
+ tabIndex: 0,
897
+ onKeyDown: (e) => {
898
+ if (e.key === "Enter" || e.key === " ")
899
+ handleClose();
900
+ },
901
+ "aria-label": "Close modal"
902
+ }, undefined, false, undefined, this),
903
+ /* @__PURE__ */ jsxDEV4("div", {
904
+ className: "bg-card border-border relative z-10 w-full max-w-md rounded-xl border p-6 shadow-xl",
905
+ children: [
906
+ /* @__PURE__ */ jsxDEV4("div", {
907
+ className: "border-border mb-4 border-b pb-4",
908
+ children: [
909
+ /* @__PURE__ */ jsxDEV4("h2", {
910
+ className: "text-xl font-semibold",
911
+ children: agent.name
912
+ }, undefined, false, undefined, this),
913
+ /* @__PURE__ */ jsxDEV4("div", {
914
+ className: "mt-1 flex items-center gap-2",
915
+ children: [
916
+ /* @__PURE__ */ jsxDEV4("span", {
917
+ className: "text-muted-foreground text-sm",
918
+ children: [
919
+ agent.modelProvider,
920
+ " / ",
921
+ agent.modelName
922
+ ]
923
+ }, undefined, true, undefined, this),
924
+ /* @__PURE__ */ jsxDEV4("span", {
925
+ className: `rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(agent.status)}`,
926
+ children: agent.status
927
+ }, undefined, false, undefined, this)
928
+ ]
929
+ }, undefined, true, undefined, this),
930
+ agent.description && /* @__PURE__ */ jsxDEV4("p", {
931
+ className: "text-muted-foreground mt-2 text-sm",
932
+ children: agent.description
933
+ }, undefined, false, undefined, this)
934
+ ]
935
+ }, undefined, true, undefined, this),
936
+ mode === "menu" && /* @__PURE__ */ jsxDEV4("div", {
937
+ className: "space-y-3",
938
+ children: [
939
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV4(Button3, {
940
+ className: "w-full justify-start",
941
+ variant: "ghost",
942
+ onPress: () => setMode("execute"),
943
+ children: [
944
+ /* @__PURE__ */ jsxDEV4("span", {
945
+ className: "mr-2",
946
+ children: "\u25B6\uFE0F"
947
+ }, undefined, false, undefined, this),
948
+ " Execute Agent"
949
+ ]
950
+ }, undefined, true, undefined, this),
951
+ (agent.status === "DRAFT" || agent.status === "PAUSED") && /* @__PURE__ */ jsxDEV4(Button3, {
952
+ className: "w-full justify-start",
953
+ variant: "ghost",
954
+ onPress: () => handleStatusChange("activate"),
955
+ disabled: isLoading,
956
+ children: [
957
+ /* @__PURE__ */ jsxDEV4("span", {
958
+ className: "mr-2",
959
+ children: "\uD83D\uDFE2"
960
+ }, undefined, false, undefined, this),
961
+ " Activate Agent"
962
+ ]
963
+ }, undefined, true, undefined, this),
964
+ agent.status === "ACTIVE" && /* @__PURE__ */ jsxDEV4(Button3, {
965
+ className: "w-full justify-start",
966
+ variant: "ghost",
967
+ onPress: () => handleStatusChange("pause"),
968
+ disabled: isLoading,
969
+ children: [
970
+ /* @__PURE__ */ jsxDEV4("span", {
971
+ className: "mr-2",
972
+ children: "\u23F8\uFE0F"
973
+ }, undefined, false, undefined, this),
974
+ " Pause Agent"
975
+ ]
976
+ }, undefined, true, undefined, this),
977
+ agent.status !== "ARCHIVED" && /* @__PURE__ */ jsxDEV4(Button3, {
978
+ className: "w-full justify-start text-yellow-600 hover:text-yellow-700",
979
+ variant: "ghost",
980
+ onPress: () => {
981
+ setConfirmAction("archive");
982
+ setMode("confirm");
983
+ },
984
+ children: [
985
+ /* @__PURE__ */ jsxDEV4("span", {
986
+ className: "mr-2",
987
+ children: "\uD83D\uDCE6"
988
+ }, undefined, false, undefined, this),
989
+ " Archive Agent"
990
+ ]
991
+ }, undefined, true, undefined, this),
992
+ agent.status === "ARCHIVED" && /* @__PURE__ */ jsxDEV4(Button3, {
993
+ className: "w-full justify-start",
994
+ variant: "ghost",
995
+ onPress: () => handleStatusChange("activate"),
996
+ disabled: isLoading,
997
+ children: [
998
+ /* @__PURE__ */ jsxDEV4("span", {
999
+ className: "mr-2",
1000
+ children: "\uD83D\uDD04"
1001
+ }, undefined, false, undefined, this),
1002
+ " Restore Agent"
1003
+ ]
1004
+ }, undefined, true, undefined, this),
1005
+ error && /* @__PURE__ */ jsxDEV4("div", {
1006
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1007
+ children: error
1008
+ }, undefined, false, undefined, this),
1009
+ /* @__PURE__ */ jsxDEV4("div", {
1010
+ className: "border-border border-t pt-3",
1011
+ children: /* @__PURE__ */ jsxDEV4(Button3, {
1012
+ className: "w-full",
1013
+ variant: "outline",
1014
+ onPress: handleClose,
1015
+ children: "Close"
1016
+ }, undefined, false, undefined, this)
1017
+ }, undefined, false, undefined, this)
1018
+ ]
1019
+ }, undefined, true, undefined, this),
1020
+ mode === "execute" && /* @__PURE__ */ jsxDEV4("div", {
1021
+ className: "space-y-4",
1022
+ children: [
1023
+ /* @__PURE__ */ jsxDEV4("div", {
1024
+ children: [
1025
+ /* @__PURE__ */ jsxDEV4("label", {
1026
+ htmlFor: "execute-message",
1027
+ className: "text-muted-foreground mb-1 block text-sm font-medium",
1028
+ children: "Message *"
1029
+ }, undefined, false, undefined, this),
1030
+ /* @__PURE__ */ jsxDEV4("textarea", {
1031
+ id: "execute-message",
1032
+ value: message,
1033
+ onChange: (e) => setMessage(e.target.value),
1034
+ placeholder: "Enter your message to the agent...",
1035
+ rows: 4,
1036
+ disabled: isLoading,
1037
+ 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"
1038
+ }, undefined, false, undefined, this)
1039
+ ]
1040
+ }, undefined, true, undefined, this),
1041
+ error && /* @__PURE__ */ jsxDEV4("div", {
1042
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1043
+ children: error
1044
+ }, undefined, false, undefined, this),
1045
+ /* @__PURE__ */ jsxDEV4("div", {
1046
+ className: "flex justify-end gap-3 pt-2",
1047
+ children: [
1048
+ /* @__PURE__ */ jsxDEV4(Button3, {
1049
+ variant: "ghost",
1050
+ onPress: () => setMode("menu"),
1051
+ disabled: isLoading,
1052
+ children: "Back"
1053
+ }, undefined, false, undefined, this),
1054
+ /* @__PURE__ */ jsxDEV4(Button3, {
1055
+ onPress: handleExecute,
1056
+ disabled: isLoading,
1057
+ children: isLoading ? "Executing..." : "\u25B6\uFE0F Execute"
1058
+ }, undefined, false, undefined, this)
1059
+ ]
1060
+ }, undefined, true, undefined, this)
1061
+ ]
1062
+ }, undefined, true, undefined, this),
1063
+ mode === "confirm" && confirmAction === "archive" && /* @__PURE__ */ jsxDEV4("div", {
1064
+ className: "space-y-4",
1065
+ children: [
1066
+ /* @__PURE__ */ jsxDEV4("p", {
1067
+ className: "text-muted-foreground",
1068
+ children: [
1069
+ "Are you sure you want to archive",
1070
+ " ",
1071
+ /* @__PURE__ */ jsxDEV4("span", {
1072
+ className: "text-foreground font-medium",
1073
+ children: agent.name
1074
+ }, undefined, false, undefined, this),
1075
+ "?"
1076
+ ]
1077
+ }, undefined, true, undefined, this),
1078
+ /* @__PURE__ */ jsxDEV4("p", {
1079
+ className: "text-muted-foreground text-sm",
1080
+ children: "Archived agents cannot be executed but can be restored later."
1081
+ }, undefined, false, undefined, this),
1082
+ error && /* @__PURE__ */ jsxDEV4("div", {
1083
+ className: "bg-destructive/10 text-destructive rounded-md p-3 text-sm",
1084
+ children: error
1085
+ }, undefined, false, undefined, this),
1086
+ /* @__PURE__ */ jsxDEV4("div", {
1087
+ className: "flex justify-end gap-3 pt-2",
1088
+ children: [
1089
+ /* @__PURE__ */ jsxDEV4(Button3, {
1090
+ variant: "ghost",
1091
+ onPress: () => setMode("menu"),
1092
+ disabled: isLoading,
1093
+ children: "Cancel"
1094
+ }, undefined, false, undefined, this),
1095
+ /* @__PURE__ */ jsxDEV4(Button3, {
1096
+ onPress: () => handleStatusChange("archive"),
1097
+ disabled: isLoading,
1098
+ children: isLoading ? "Archiving..." : "\uD83D\uDCE6 Archive"
1099
+ }, undefined, false, undefined, this)
1100
+ ]
1101
+ }, undefined, true, undefined, this)
1102
+ ]
1103
+ }, undefined, true, undefined, this)
1104
+ ]
1105
+ }, undefined, true, undefined, this)
1106
+ ]
1107
+ }, undefined, true, undefined, this);
1108
+ }
1109
+
1110
+ // src/ui/AgentDashboard.tsx
1111
+ import { useState as useState7, useMemo as useMemo3, useCallback as useCallback5 } from "react";
1112
+ import {
1113
+ StatCard as StatCard3,
1114
+ StatCardGroup as StatCardGroup3,
1115
+ Button as Button4
1116
+ } from "@contractspec/lib.design-system";
1117
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
1118
+ "use client";
1119
+ function AgentDashboard() {
1120
+ const [activeTab, setActiveTab] = useState7("runs");
1121
+ const [isCreateModalOpen, setIsCreateModalOpen] = useState7(false);
1122
+ const [selectedAgent, setSelectedAgent] = useState7(null);
1123
+ const [isAgentActionsOpen, setIsAgentActionsOpen] = useState7(false);
1124
+ const { metrics, refetch: refetchRuns } = useRunList();
1125
+ const { refetch: refetchAgents } = useAgentList();
1126
+ const mutations = useAgentMutations({
1127
+ onSuccess: () => {
1128
+ refetchAgents();
1129
+ refetchRuns();
1130
+ }
1131
+ });
1132
+ const handleAgentClick = useCallback5((agent) => {
1133
+ setSelectedAgent(agent);
1134
+ setIsAgentActionsOpen(true);
1135
+ }, []);
1136
+ const tabs = [
1137
+ { id: "runs", label: "Runs", icon: "\u25B6" },
1138
+ { id: "agents", label: "Agents", icon: "\uD83E\uDD16" },
1139
+ { id: "tools", label: "Tools", icon: "\uD83D\uDD27" },
1140
+ { id: "metrics", label: "Metrics", icon: "\uD83D\uDCCA" }
1141
+ ];
1142
+ const summaryStats = useMemo3(() => {
1143
+ if (!metrics) {
1144
+ return [
1145
+ { label: "Total Runs", value: "-", hint: "Loading..." },
1146
+ { label: "Success Rate", value: "-", hint: "" },
1147
+ { label: "Total Tokens", value: "-", hint: "" },
1148
+ { label: "Total Cost", value: "-", hint: "" }
1149
+ ];
1150
+ }
1151
+ return [
1152
+ {
1153
+ label: "Total Runs",
1154
+ value: metrics.totalRuns.toLocaleString(),
1155
+ hint: `${(metrics.successRate * 100).toFixed(0)}% success`
1156
+ },
1157
+ {
1158
+ label: "Success Rate",
1159
+ value: `${(metrics.successRate * 100).toFixed(0)}%`,
1160
+ hint: "of all runs"
1161
+ },
1162
+ {
1163
+ label: "Total Tokens",
1164
+ value: metrics.totalTokens >= 1e6 ? `${(metrics.totalTokens / 1e6).toFixed(1)}M` : `${(metrics.totalTokens / 1000).toFixed(0)}K`,
1165
+ hint: "This period"
1166
+ },
1167
+ {
1168
+ label: "Total Cost",
1169
+ value: `$${metrics.totalCostUsd.toFixed(2)}`,
1170
+ hint: "This period"
1171
+ }
1172
+ ];
1173
+ }, [metrics]);
1174
+ return /* @__PURE__ */ jsxDEV5("div", {
1175
+ className: "space-y-6",
1176
+ children: [
1177
+ /* @__PURE__ */ jsxDEV5("div", {
1178
+ className: "flex items-center justify-between",
1179
+ children: [
1180
+ /* @__PURE__ */ jsxDEV5("h2", {
1181
+ className: "text-2xl font-bold",
1182
+ children: "AI Agent Console"
1183
+ }, undefined, false, undefined, this),
1184
+ /* @__PURE__ */ jsxDEV5(Button4, {
1185
+ onPress: () => setIsCreateModalOpen(true),
1186
+ children: [
1187
+ /* @__PURE__ */ jsxDEV5("span", {
1188
+ className: "mr-2",
1189
+ children: "+"
1190
+ }, undefined, false, undefined, this),
1191
+ " New Agent"
1192
+ ]
1193
+ }, undefined, true, undefined, this)
1194
+ ]
1195
+ }, undefined, true, undefined, this),
1196
+ /* @__PURE__ */ jsxDEV5(StatCardGroup3, {
1197
+ children: summaryStats.map((stat, i) => /* @__PURE__ */ jsxDEV5(StatCard3, {
1198
+ label: stat.label,
1199
+ value: stat.value,
1200
+ hint: stat.hint
1201
+ }, i, false, undefined, this))
1202
+ }, undefined, false, undefined, this),
1203
+ /* @__PURE__ */ jsxDEV5("nav", {
1204
+ className: "bg-muted flex gap-1 rounded-lg p-1",
1205
+ role: "tablist",
1206
+ children: tabs.map((tab) => /* @__PURE__ */ jsxDEV5("button", {
1207
+ type: "button",
1208
+ role: "tab",
1209
+ "aria-selected": activeTab === tab.id,
1210
+ onClick: () => setActiveTab(tab.id),
1211
+ 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"}`,
1212
+ children: [
1213
+ /* @__PURE__ */ jsxDEV5("span", {
1214
+ children: tab.icon
1215
+ }, undefined, false, undefined, this),
1216
+ tab.label
1217
+ ]
1218
+ }, tab.id, true, undefined, this))
1219
+ }, undefined, false, undefined, this),
1220
+ /* @__PURE__ */ jsxDEV5("div", {
1221
+ className: "min-h-[400px]",
1222
+ role: "tabpanel",
1223
+ children: [
1224
+ activeTab === "runs" && /* @__PURE__ */ jsxDEV5(RunListView, {}, undefined, false, undefined, this),
1225
+ activeTab === "agents" && /* @__PURE__ */ jsxDEV5(AgentListViewWithActions, {
1226
+ onAgentClick: handleAgentClick
1227
+ }, undefined, false, undefined, this),
1228
+ activeTab === "tools" && /* @__PURE__ */ jsxDEV5(ToolRegistryView, {}, undefined, false, undefined, this),
1229
+ activeTab === "metrics" && /* @__PURE__ */ jsxDEV5(MetricsView, {
1230
+ metrics
1231
+ }, undefined, false, undefined, this)
1232
+ ]
1233
+ }, undefined, true, undefined, this),
1234
+ /* @__PURE__ */ jsxDEV5(CreateAgentModal, {
1235
+ isOpen: isCreateModalOpen,
1236
+ onClose: () => setIsCreateModalOpen(false),
1237
+ onSubmit: async (input) => {
1238
+ await mutations.createAgent(input);
1239
+ },
1240
+ isLoading: mutations.createState.loading
1241
+ }, undefined, false, undefined, this),
1242
+ /* @__PURE__ */ jsxDEV5(AgentActionsModal, {
1243
+ isOpen: isAgentActionsOpen,
1244
+ agent: selectedAgent,
1245
+ onClose: () => {
1246
+ setIsAgentActionsOpen(false);
1247
+ setSelectedAgent(null);
1248
+ },
1249
+ onActivate: async (agentId) => {
1250
+ await mutations.activateAgent(agentId);
1251
+ },
1252
+ onPause: async (agentId) => {
1253
+ await mutations.pauseAgent(agentId);
1254
+ },
1255
+ onArchive: async (agentId) => {
1256
+ await mutations.archiveAgent(agentId);
1257
+ },
1258
+ onExecute: async (agentId, message) => {
1259
+ await mutations.executeAgent({ agentId, message });
1260
+ },
1261
+ isLoading: mutations.isLoading
1262
+ }, undefined, false, undefined, this)
1263
+ ]
1264
+ }, undefined, true, undefined, this);
1265
+ }
1266
+ function AgentListViewWithActions({
1267
+ onAgentClick
1268
+ }) {
1269
+ const { data, loading, error, stats, refetch } = useAgentList();
1270
+ if (loading && !data) {
1271
+ return /* @__PURE__ */ jsxDEV5("div", {
1272
+ className: "text-muted-foreground flex h-64 items-center justify-center",
1273
+ children: "Loading agents..."
1274
+ }, undefined, false, undefined, this);
1275
+ }
1276
+ if (error) {
1277
+ return /* @__PURE__ */ jsxDEV5("div", {
1278
+ className: "text-destructive flex h-64 flex-col items-center justify-center",
1279
+ children: [
1280
+ /* @__PURE__ */ jsxDEV5("p", {
1281
+ children: [
1282
+ "Failed to load agents: ",
1283
+ error.message
1284
+ ]
1285
+ }, undefined, true, undefined, this),
1286
+ /* @__PURE__ */ jsxDEV5(Button4, {
1287
+ variant: "outline",
1288
+ onPress: refetch,
1289
+ className: "mt-2",
1290
+ children: "Retry"
1291
+ }, undefined, false, undefined, this)
1292
+ ]
1293
+ }, undefined, true, undefined, this);
1294
+ }
1295
+ if (!data?.items.length) {
1296
+ return /* @__PURE__ */ jsxDEV5("div", {
1297
+ className: "text-muted-foreground flex h-64 flex-col items-center justify-center",
1298
+ children: [
1299
+ /* @__PURE__ */ jsxDEV5("p", {
1300
+ className: "text-lg font-medium",
1301
+ children: "No agents yet"
1302
+ }, undefined, false, undefined, this),
1303
+ /* @__PURE__ */ jsxDEV5("p", {
1304
+ className: "text-sm",
1305
+ children: "Create your first AI agent to get started."
1306
+ }, undefined, false, undefined, this)
1307
+ ]
1308
+ }, undefined, true, undefined, this);
1309
+ }
1310
+ return /* @__PURE__ */ jsxDEV5("div", {
1311
+ className: "space-y-4",
1312
+ children: [
1313
+ stats && /* @__PURE__ */ jsxDEV5("div", {
1314
+ className: "flex gap-4 text-sm",
1315
+ children: [
1316
+ /* @__PURE__ */ jsxDEV5("span", {
1317
+ children: [
1318
+ "Total: ",
1319
+ stats.total
1320
+ ]
1321
+ }, undefined, true, undefined, this),
1322
+ /* @__PURE__ */ jsxDEV5("span", {
1323
+ className: "text-green-600",
1324
+ children: [
1325
+ "Active: ",
1326
+ stats.active
1327
+ ]
1328
+ }, undefined, true, undefined, this),
1329
+ /* @__PURE__ */ jsxDEV5("span", {
1330
+ className: "text-yellow-600",
1331
+ children: [
1332
+ "Paused: ",
1333
+ stats.paused
1334
+ ]
1335
+ }, undefined, true, undefined, this),
1336
+ /* @__PURE__ */ jsxDEV5("span", {
1337
+ className: "text-blue-600",
1338
+ children: [
1339
+ "Draft: ",
1340
+ stats.draft
1341
+ ]
1342
+ }, undefined, true, undefined, this)
1343
+ ]
1344
+ }, undefined, true, undefined, this),
1345
+ /* @__PURE__ */ jsxDEV5("div", {
1346
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
1347
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV5(AgentCard, {
1348
+ agent,
1349
+ onClick: () => onAgentClick(agent)
1350
+ }, agent.id, false, undefined, this))
1351
+ }, undefined, false, undefined, this)
1352
+ ]
1353
+ }, undefined, true, undefined, this);
1354
+ }
1355
+ function AgentCard({ agent, onClick }) {
1356
+ const statusColors = {
1357
+ ACTIVE: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",
1358
+ DRAFT: "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400",
1359
+ PAUSED: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",
1360
+ ARCHIVED: "bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-400"
1361
+ };
1362
+ return /* @__PURE__ */ jsxDEV5("div", {
1363
+ onClick,
1364
+ className: "border-border bg-card cursor-pointer rounded-xl border p-4 transition-all hover:shadow-md",
1365
+ role: "button",
1366
+ tabIndex: 0,
1367
+ onKeyDown: (e) => {
1368
+ if (e.key === "Enter" || e.key === " ")
1369
+ onClick();
1370
+ },
1371
+ children: [
1372
+ /* @__PURE__ */ jsxDEV5("div", {
1373
+ className: "flex items-start justify-between",
1374
+ children: [
1375
+ /* @__PURE__ */ jsxDEV5("div", {
1376
+ className: "min-w-0 flex-1",
1377
+ children: [
1378
+ /* @__PURE__ */ jsxDEV5("h3", {
1379
+ className: "truncate font-semibold",
1380
+ children: agent.name
1381
+ }, undefined, false, undefined, this),
1382
+ /* @__PURE__ */ jsxDEV5("p", {
1383
+ className: "text-muted-foreground text-sm",
1384
+ children: [
1385
+ agent.modelProvider,
1386
+ " / ",
1387
+ agent.modelName
1388
+ ]
1389
+ }, undefined, true, undefined, this)
1390
+ ]
1391
+ }, undefined, true, undefined, this),
1392
+ /* @__PURE__ */ jsxDEV5("span", {
1393
+ className: `rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[agent.status]}`,
1394
+ children: agent.status
1395
+ }, undefined, false, undefined, this)
1396
+ ]
1397
+ }, undefined, true, undefined, this),
1398
+ agent.description && /* @__PURE__ */ jsxDEV5("p", {
1399
+ className: "text-muted-foreground mt-2 line-clamp-2 text-sm",
1400
+ children: agent.description
1401
+ }, undefined, false, undefined, this),
1402
+ /* @__PURE__ */ jsxDEV5("div", {
1403
+ className: "mt-3 flex items-center justify-between",
1404
+ children: [
1405
+ /* @__PURE__ */ jsxDEV5("span", {
1406
+ className: "text-muted-foreground text-xs",
1407
+ children: agent.modelName
1408
+ }, undefined, false, undefined, this),
1409
+ /* @__PURE__ */ jsxDEV5(Button4, {
1410
+ variant: "ghost",
1411
+ size: "sm",
1412
+ onPress: onClick,
1413
+ children: "Actions"
1414
+ }, undefined, false, undefined, this)
1415
+ ]
1416
+ }, undefined, true, undefined, this)
1417
+ ]
1418
+ }, undefined, true, undefined, this);
1419
+ }
1420
+ function MetricsView({ metrics }) {
1421
+ if (!metrics) {
1422
+ return /* @__PURE__ */ jsxDEV5("div", {
1423
+ className: "text-muted-foreground flex h-64 items-center justify-center",
1424
+ children: "Loading metrics..."
1425
+ }, undefined, false, undefined, this);
1426
+ }
1427
+ const completedRuns = Math.round(metrics.totalRuns * metrics.successRate);
1428
+ const failedRuns = metrics.totalRuns - completedRuns;
1429
+ return /* @__PURE__ */ jsxDEV5("div", {
1430
+ className: "space-y-6",
1431
+ children: [
1432
+ /* @__PURE__ */ jsxDEV5("h3", {
1433
+ className: "text-lg font-semibold",
1434
+ children: "Usage Analytics"
1435
+ }, undefined, false, undefined, this),
1436
+ /* @__PURE__ */ jsxDEV5("div", {
1437
+ className: "grid gap-6 md:grid-cols-2",
1438
+ children: [
1439
+ /* @__PURE__ */ jsxDEV5("div", {
1440
+ className: "border-border bg-card rounded-xl border p-4",
1441
+ children: [
1442
+ /* @__PURE__ */ jsxDEV5("h4", {
1443
+ className: "font-medium",
1444
+ children: "Run Outcomes"
1445
+ }, undefined, false, undefined, this),
1446
+ /* @__PURE__ */ jsxDEV5("div", {
1447
+ className: "mt-4 space-y-3",
1448
+ children: [
1449
+ /* @__PURE__ */ jsxDEV5(ProgressBar, {
1450
+ label: "Completed",
1451
+ value: completedRuns,
1452
+ total: metrics.totalRuns,
1453
+ color: "bg-green-500"
1454
+ }, undefined, false, undefined, this),
1455
+ /* @__PURE__ */ jsxDEV5(ProgressBar, {
1456
+ label: "Failed",
1457
+ value: failedRuns,
1458
+ total: metrics.totalRuns,
1459
+ color: "bg-red-500"
1460
+ }, undefined, false, undefined, this)
1461
+ ]
1462
+ }, undefined, true, undefined, this)
1463
+ ]
1464
+ }, undefined, true, undefined, this),
1465
+ /* @__PURE__ */ jsxDEV5("div", {
1466
+ className: "border-border bg-card rounded-xl border p-4",
1467
+ children: [
1468
+ /* @__PURE__ */ jsxDEV5("h4", {
1469
+ className: "font-medium",
1470
+ children: "Performance"
1471
+ }, undefined, false, undefined, this),
1472
+ /* @__PURE__ */ jsxDEV5("dl", {
1473
+ className: "mt-4 grid grid-cols-2 gap-4",
1474
+ children: [
1475
+ /* @__PURE__ */ jsxDEV5("div", {
1476
+ children: [
1477
+ /* @__PURE__ */ jsxDEV5("dt", {
1478
+ className: "text-muted-foreground text-sm",
1479
+ children: "Avg Duration"
1480
+ }, undefined, false, undefined, this),
1481
+ /* @__PURE__ */ jsxDEV5("dd", {
1482
+ className: "text-xl font-semibold",
1483
+ children: [
1484
+ (metrics.averageDurationMs / 1000).toFixed(1),
1485
+ "s"
1486
+ ]
1487
+ }, undefined, true, undefined, this)
1488
+ ]
1489
+ }, undefined, true, undefined, this),
1490
+ /* @__PURE__ */ jsxDEV5("div", {
1491
+ children: [
1492
+ /* @__PURE__ */ jsxDEV5("dt", {
1493
+ className: "text-muted-foreground text-sm",
1494
+ children: "Success Rate"
1495
+ }, undefined, false, undefined, this),
1496
+ /* @__PURE__ */ jsxDEV5("dd", {
1497
+ className: "text-xl font-semibold",
1498
+ children: [
1499
+ (metrics.successRate * 100).toFixed(0),
1500
+ "%"
1501
+ ]
1502
+ }, undefined, true, undefined, this)
1503
+ ]
1504
+ }, undefined, true, undefined, this)
1505
+ ]
1506
+ }, undefined, true, undefined, this)
1507
+ ]
1508
+ }, undefined, true, undefined, this)
1509
+ ]
1510
+ }, undefined, true, undefined, this),
1511
+ /* @__PURE__ */ jsxDEV5("div", {
1512
+ className: "border-border bg-card rounded-xl border p-4",
1513
+ children: [
1514
+ /* @__PURE__ */ jsxDEV5("h4", {
1515
+ className: "font-medium",
1516
+ children: "Key Metrics"
1517
+ }, undefined, false, undefined, this),
1518
+ /* @__PURE__ */ jsxDEV5("dl", {
1519
+ className: "mt-4 grid gap-4 sm:grid-cols-3",
1520
+ children: [
1521
+ /* @__PURE__ */ jsxDEV5("div", {
1522
+ children: [
1523
+ /* @__PURE__ */ jsxDEV5("dt", {
1524
+ className: "text-muted-foreground text-sm",
1525
+ children: "Total Runs"
1526
+ }, undefined, false, undefined, this),
1527
+ /* @__PURE__ */ jsxDEV5("dd", {
1528
+ className: "text-2xl font-semibold",
1529
+ children: metrics.totalRuns.toLocaleString()
1530
+ }, undefined, false, undefined, this)
1531
+ ]
1532
+ }, undefined, true, undefined, this),
1533
+ /* @__PURE__ */ jsxDEV5("div", {
1534
+ children: [
1535
+ /* @__PURE__ */ jsxDEV5("dt", {
1536
+ className: "text-muted-foreground text-sm",
1537
+ children: "Total Tokens"
1538
+ }, undefined, false, undefined, this),
1539
+ /* @__PURE__ */ jsxDEV5("dd", {
1540
+ className: "text-2xl font-semibold",
1541
+ children: [
1542
+ (metrics.totalTokens / 1000).toFixed(0),
1543
+ "K"
1544
+ ]
1545
+ }, undefined, true, undefined, this)
1546
+ ]
1547
+ }, undefined, true, undefined, this),
1548
+ /* @__PURE__ */ jsxDEV5("div", {
1549
+ children: [
1550
+ /* @__PURE__ */ jsxDEV5("dt", {
1551
+ className: "text-muted-foreground text-sm",
1552
+ children: "Cost per Run"
1553
+ }, undefined, false, undefined, this),
1554
+ /* @__PURE__ */ jsxDEV5("dd", {
1555
+ className: "text-2xl font-semibold",
1556
+ children: [
1557
+ "$",
1558
+ metrics.totalRuns > 0 ? (metrics.totalCostUsd / metrics.totalRuns).toFixed(4) : "0"
1559
+ ]
1560
+ }, undefined, true, undefined, this)
1561
+ ]
1562
+ }, undefined, true, undefined, this)
1563
+ ]
1564
+ }, undefined, true, undefined, this)
1565
+ ]
1566
+ }, undefined, true, undefined, this)
1567
+ ]
1568
+ }, undefined, true, undefined, this);
1569
+ }
1570
+ function ProgressBar({
1571
+ label,
1572
+ value,
1573
+ total,
1574
+ color
1575
+ }) {
1576
+ const pct = total > 0 ? value / total * 100 : 0;
1577
+ return /* @__PURE__ */ jsxDEV5("div", {
1578
+ children: [
1579
+ /* @__PURE__ */ jsxDEV5("div", {
1580
+ className: "flex justify-between text-sm",
1581
+ children: [
1582
+ /* @__PURE__ */ jsxDEV5("span", {
1583
+ children: label
1584
+ }, undefined, false, undefined, this),
1585
+ /* @__PURE__ */ jsxDEV5("span", {
1586
+ className: "text-muted-foreground",
1587
+ children: [
1588
+ value,
1589
+ " (",
1590
+ pct.toFixed(0),
1591
+ "%)"
1592
+ ]
1593
+ }, undefined, true, undefined, this)
1594
+ ]
1595
+ }, undefined, true, undefined, this),
1596
+ /* @__PURE__ */ jsxDEV5("div", {
1597
+ className: "bg-muted mt-1 h-2 overflow-hidden rounded-full",
1598
+ children: /* @__PURE__ */ jsxDEV5("div", {
1599
+ className: `h-full ${color}`,
1600
+ style: { width: `${pct}%` }
1601
+ }, undefined, false, undefined, this)
1602
+ }, undefined, false, undefined, this)
1603
+ ]
1604
+ }, undefined, true, undefined, this);
1605
+ }
1606
+
1607
+ // src/ui/AgentRunList.tsx
1608
+ "use client";
1609
+
1610
+ // src/ui/AgentToolRegistry.tsx
1611
+ "use client";
1612
+
1613
+ // src/ui/views/AgentListView.tsx
1614
+ import {
1615
+ Button as Button5,
1616
+ StatCard as StatCard4,
1617
+ StatCardGroup as StatCardGroup4,
1618
+ EntityCard as EntityCard2,
1619
+ StatusChip as StatusChip3,
1620
+ LoaderBlock as LoaderBlock3,
1621
+ ErrorState as ErrorState3,
1622
+ EmptyState as EmptyState3
1623
+ } from "@contractspec/lib.design-system";
1624
+ import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
1625
+ "use client";
1626
+ function getStatusTone3(status) {
1627
+ switch (status) {
1628
+ case "ACTIVE":
1629
+ return "success";
1630
+ case "PAUSED":
1631
+ case "DRAFT":
1632
+ return "warning";
1633
+ case "ARCHIVED":
1634
+ return "neutral";
1635
+ default:
1636
+ return "neutral";
1637
+ }
1638
+ }
1639
+ function AgentListView() {
1640
+ const { data, loading, error, stats, refetch } = useAgentList();
1641
+ if (loading && !data) {
1642
+ return /* @__PURE__ */ jsxDEV6(LoaderBlock3, {
1643
+ label: "Loading agents..."
1644
+ }, undefined, false, undefined, this);
1645
+ }
1646
+ if (error) {
1647
+ return /* @__PURE__ */ jsxDEV6(ErrorState3, {
1648
+ title: "Failed to load agents",
1649
+ description: error.message,
1650
+ onRetry: refetch,
1651
+ retryLabel: "Retry"
1652
+ }, undefined, false, undefined, this);
1653
+ }
1654
+ if (!data?.items.length) {
1655
+ return /* @__PURE__ */ jsxDEV6(EmptyState3, {
1656
+ title: "No agents yet",
1657
+ description: "Create your first AI agent to get started."
1658
+ }, undefined, false, undefined, this);
1659
+ }
1660
+ return /* @__PURE__ */ jsxDEV6("div", {
1661
+ className: "space-y-6",
1662
+ children: [
1663
+ stats && /* @__PURE__ */ jsxDEV6(StatCardGroup4, {
1664
+ children: [
1665
+ /* @__PURE__ */ jsxDEV6(StatCard4, {
1666
+ label: "Total Agents",
1667
+ value: stats.total
1668
+ }, undefined, false, undefined, this),
1669
+ /* @__PURE__ */ jsxDEV6(StatCard4, {
1670
+ label: "Active",
1671
+ value: stats.active
1672
+ }, undefined, false, undefined, this),
1673
+ /* @__PURE__ */ jsxDEV6(StatCard4, {
1674
+ label: "Paused",
1675
+ value: stats.paused
1676
+ }, undefined, false, undefined, this),
1677
+ /* @__PURE__ */ jsxDEV6(StatCard4, {
1678
+ label: "Draft",
1679
+ value: stats.draft
1680
+ }, undefined, false, undefined, this)
1681
+ ]
1682
+ }, undefined, true, undefined, this),
1683
+ /* @__PURE__ */ jsxDEV6("div", {
1684
+ className: "flex items-center justify-between",
1685
+ children: [
1686
+ /* @__PURE__ */ jsxDEV6("h3", {
1687
+ className: "text-lg font-semibold",
1688
+ children: "Agents"
1689
+ }, undefined, false, undefined, this),
1690
+ /* @__PURE__ */ jsxDEV6(Button5, {
1691
+ onPress: () => alert("Create Agent clicked!"),
1692
+ children: "Create Agent"
1693
+ }, undefined, false, undefined, this)
1694
+ ]
1695
+ }, undefined, true, undefined, this),
1696
+ /* @__PURE__ */ jsxDEV6("div", {
1697
+ className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
1698
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV6(EntityCard2, {
1699
+ cardTitle: agent.name,
1700
+ cardSubtitle: agent.modelName,
1701
+ meta: /* @__PURE__ */ jsxDEV6("p", {
1702
+ className: "text-muted-foreground text-sm",
1703
+ children: agent.description
1704
+ }, undefined, false, undefined, this),
1705
+ chips: /* @__PURE__ */ jsxDEV6(StatusChip3, {
1706
+ tone: getStatusTone3(agent.status),
1707
+ label: agent.status
1708
+ }, undefined, false, undefined, this),
1709
+ footer: /* @__PURE__ */ jsxDEV6("span", {
1710
+ className: "text-muted-foreground text-xs",
1711
+ children: [
1712
+ "Created ",
1713
+ agent.createdAt.toLocaleDateString()
1714
+ ]
1715
+ }, undefined, true, undefined, this),
1716
+ onClick: () => alert(`View agent: ${agent.name}`)
1717
+ }, agent.id, false, undefined, this))
1718
+ }, undefined, false, undefined, this)
1719
+ ]
1720
+ }, undefined, true, undefined, this);
1721
+ }
1722
+ // src/ui/hooks/index.ts
1723
+ "use client";
1724
+
1725
+ // src/ui/renderers/agent-list.renderer.tsx
1726
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
1727
+ var agentListReactRenderer = {
1728
+ target: "react",
1729
+ render: async (desc) => {
1730
+ if (desc.source.type !== "component") {
1731
+ throw new Error("AgentListRenderer: expected component source");
1732
+ }
1733
+ if (desc.source.componentKey !== "AgentListView") {
1734
+ throw new Error(`AgentListRenderer: unknown component ${desc.source.componentKey}`);
1735
+ }
1736
+ return /* @__PURE__ */ jsxDEV7(AgentListView, {}, undefined, false, undefined, this);
1737
+ }
1738
+ };
1739
+
1740
+ // src/ui/renderers/agent-list.markdown.ts
1741
+ import {
1742
+ mockListAgentsHandler
1743
+ } from "@contractspec/example.agent-console/handlers";
1744
+ var agentListMarkdownRenderer = {
1745
+ target: "markdown",
1746
+ render: async (desc) => {
1747
+ if (desc.source.type !== "component" || desc.source.componentKey !== "AgentListView") {
1748
+ throw new Error("agentListMarkdownRenderer: not AgentListView");
1749
+ }
1750
+ const data = await mockListAgentsHandler({
1751
+ organizationId: "demo-org",
1752
+ limit: 50,
1753
+ offset: 0
1754
+ });
1755
+ const lines = [
1756
+ `# ${desc.meta.description ?? "Agent List"}`,
1757
+ "",
1758
+ `> ${desc.meta.key} v${desc.meta.version}`,
1759
+ "",
1760
+ `**Total Agents:** ${data.total}`,
1761
+ "",
1762
+ "## Agents",
1763
+ ""
1764
+ ];
1765
+ const byStatus = {};
1766
+ for (const agent of data.items) {
1767
+ const status = agent.status;
1768
+ if (byStatus[status]) {
1769
+ byStatus[status].push(agent);
1770
+ } else {
1771
+ byStatus[status] = [agent];
1772
+ }
1773
+ }
1774
+ for (const [status, agents] of Object.entries(byStatus)) {
1775
+ lines.push(`### ${status} (${agents.length})`);
1776
+ lines.push("");
1777
+ for (const agent of agents) {
1778
+ lines.push(`- **${agent.name}** (${agent.modelProvider}/${agent.modelName})`);
1779
+ if (agent.description) {
1780
+ lines.push(` > ${agent.description}`);
1781
+ }
1782
+ }
1783
+ lines.push("");
1784
+ }
1785
+ return {
1786
+ mimeType: "text/markdown",
1787
+ body: lines.join(`
1788
+ `)
1789
+ };
1790
+ }
1791
+ };
1792
+
1793
+ // src/ui/renderers/run-list.markdown.ts
1794
+ import { mockListRunsHandler } from "@contractspec/example.agent-console/handlers";
1795
+ function formatDuration2(ms) {
1796
+ if (ms < 1000)
1797
+ return `${ms}ms`;
1798
+ if (ms < 60000)
1799
+ return `${(ms / 1000).toFixed(1)}s`;
1800
+ return `${(ms / 60000).toFixed(1)}m`;
1801
+ }
1802
+ var runListMarkdownRenderer = {
1803
+ target: "markdown",
1804
+ render: async (desc) => {
1805
+ if (desc.source.type !== "component" || desc.source.componentKey !== "RunListView") {
1806
+ throw new Error("runListMarkdownRenderer: not RunListView");
1807
+ }
1808
+ const data = await mockListRunsHandler({
1809
+ organizationId: "demo-org",
1810
+ limit: 20,
1811
+ offset: 0
1812
+ });
1813
+ const lines = [
1814
+ `# ${desc.meta.description ?? "Agent Runs"}`,
1815
+ "",
1816
+ `> ${desc.meta.key} v${desc.meta.version}`,
1817
+ "",
1818
+ `**Total Runs:** ${data.total}`,
1819
+ "",
1820
+ "## Recent Runs",
1821
+ "",
1822
+ "| ID | Agent | Status | Duration | Tokens | Cost |",
1823
+ "| --- | --- | --- | --- | --- | --- |"
1824
+ ];
1825
+ for (const run of data.items.slice(0, 10)) {
1826
+ lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration2(run.durationMs) : "-"} | ${run.totalTokens} | $${run.estimatedCostUsd?.toFixed(4) ?? "-"} |`);
1827
+ }
1828
+ return {
1829
+ mimeType: "text/markdown",
1830
+ body: lines.join(`
1831
+ `)
1832
+ };
1833
+ }
1834
+ };
1835
+
1836
+ // src/ui/renderers/tool-registry.markdown.ts
1837
+ import { mockListToolsHandler } from "@contractspec/example.agent-console/handlers";
1838
+ var toolRegistryMarkdownRenderer = {
1839
+ target: "markdown",
1840
+ render: async (desc) => {
1841
+ if (desc.source.type !== "component" || desc.source.componentKey !== "ToolRegistryView") {
1842
+ throw new Error("toolRegistryMarkdownRenderer: not ToolRegistryView");
1843
+ }
1844
+ const data = await mockListToolsHandler({
1845
+ organizationId: "demo-org",
1846
+ limit: 50,
1847
+ offset: 0
1848
+ });
1849
+ const lines = [
1850
+ `# ${desc.meta.description ?? "Tool Registry"}`,
1851
+ "",
1852
+ `> ${desc.meta.key} v${desc.meta.version}`,
1853
+ "",
1854
+ `**Total Tools:** ${data.total}`,
1855
+ ""
1856
+ ];
1857
+ const byCategory = {};
1858
+ for (const tool of data.items) {
1859
+ const cat = tool.category;
1860
+ if (!byCategory[cat])
1861
+ byCategory[cat] = [];
1862
+ byCategory[cat].push(tool);
1863
+ }
1864
+ for (const [category, tools] of Object.entries(byCategory).sort()) {
1865
+ lines.push(`## ${category} (${tools.length})`);
1866
+ lines.push("");
1867
+ for (const tool of tools) {
1868
+ const statusIcon = tool.status === "ACTIVE" ? "\u2705" : tool.status === "DEPRECATED" ? "\u26A0\uFE0F" : "\u274C";
1869
+ lines.push(`### ${statusIcon} ${tool.name} v${tool.version}`);
1870
+ lines.push("");
1871
+ lines.push(`> \`${tool.id}\``);
1872
+ lines.push("");
1873
+ if (tool.description) {
1874
+ lines.push(tool.description);
1875
+ lines.push("");
1876
+ }
1877
+ }
1878
+ }
1879
+ return {
1880
+ mimeType: "text/markdown",
1881
+ body: lines.join(`
1882
+ `)
1883
+ };
1884
+ }
1885
+ };
1886
+
1887
+ // src/ui/renderers/dashboard.markdown.ts
1888
+ import {
1889
+ mockListAgentsHandler as mockListAgentsHandler2,
1890
+ mockListRunsHandler as mockListRunsHandler2,
1891
+ mockListToolsHandler as mockListToolsHandler2
1892
+ } from "@contractspec/example.agent-console/handlers";
1893
+ function formatDuration3(ms) {
1894
+ if (ms < 1000)
1895
+ return `${ms}ms`;
1896
+ if (ms < 60000)
1897
+ return `${(ms / 1000).toFixed(1)}s`;
1898
+ return `${(ms / 60000).toFixed(1)}m`;
1899
+ }
1900
+ var agentDashboardMarkdownRenderer = {
1901
+ target: "markdown",
1902
+ render: async (desc) => {
1903
+ if (desc.source.type !== "component" || desc.source.componentKey !== "AgentConsoleDashboard") {
1904
+ throw new Error("agentDashboardMarkdownRenderer: not AgentConsoleDashboard");
1905
+ }
1906
+ const [agentsData, runsData, toolsData] = await Promise.all([
1907
+ mockListAgentsHandler2({
1908
+ organizationId: "demo-org",
1909
+ limit: 100
1910
+ }),
1911
+ mockListRunsHandler2({
1912
+ limit: 100
1913
+ }),
1914
+ mockListToolsHandler2({
1915
+ organizationId: "demo-org",
1916
+ limit: 100
1917
+ })
1918
+ ]);
1919
+ const activeAgents = agentsData.items.filter((a) => a.status === "ACTIVE").length;
1920
+ const completedRuns = runsData.items.filter((r) => r.status === "COMPLETED").length;
1921
+ const failedRuns = runsData.items.filter((r) => r.status === "FAILED").length;
1922
+ const totalTokens = runsData.items.reduce((sum, r) => sum + (r.totalTokens ?? 0), 0);
1923
+ const totalCost = runsData.items.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0);
1924
+ const activeTools = toolsData.items.filter((t) => t.status === "ACTIVE").length;
1925
+ const lines = [
1926
+ "# Agent Console Dashboard",
1927
+ "",
1928
+ "> AI agent operations overview",
1929
+ "",
1930
+ "## Summary",
1931
+ "",
1932
+ "| Metric | Value |",
1933
+ "|--------|-------|",
1934
+ `| Total Agents | ${agentsData.total} |`,
1935
+ `| Active Agents | ${activeAgents} |`,
1936
+ `| Total Runs | ${runsData.total} |`,
1937
+ `| Completed Runs | ${completedRuns} |`,
1938
+ `| Failed Runs | ${failedRuns} |`,
1939
+ `| Total Tokens | ${totalTokens.toLocaleString()} |`,
1940
+ `| Total Cost | $${totalCost.toFixed(4)} |`,
1941
+ `| Total Tools | ${toolsData.total} |`,
1942
+ `| Active Tools | ${activeTools} |`,
1943
+ "",
1944
+ "## Agents",
1945
+ ""
1946
+ ];
1947
+ if (agentsData.items.length === 0) {
1948
+ lines.push("_No agents configured._");
1949
+ } else {
1950
+ lines.push("| Agent | Model | Status | Description |");
1951
+ lines.push("|-------|-------|--------|-------------|");
1952
+ for (const agent of agentsData.items.slice(0, 5)) {
1953
+ lines.push(`| ${agent.name} | ${agent.modelProvider}/${agent.modelName} | ${agent.status} | ${agent.description ?? "-"} |`);
1954
+ }
1955
+ if (agentsData.items.length > 5) {
1956
+ lines.push(`| ... | ... | ... | _${agentsData.total - 5} more_ |`);
1957
+ }
1958
+ }
1959
+ lines.push("");
1960
+ lines.push("## Recent Runs");
1961
+ lines.push("");
1962
+ if (runsData.items.length === 0) {
1963
+ lines.push("_No runs yet._");
1964
+ } else {
1965
+ lines.push("| Run ID | Agent | Status | Duration | Tokens | Cost |");
1966
+ lines.push("|--------|-------|--------|----------|--------|------|");
1967
+ for (const run of runsData.items.slice(0, 5)) {
1968
+ lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration3(run.durationMs) : "-"} | ${run.totalTokens ?? 0} | $${(run.estimatedCostUsd ?? 0).toFixed(4)} |`);
1969
+ }
1970
+ if (runsData.items.length > 5) {
1971
+ lines.push(`| ... | ... | ... | ... | ... | _${runsData.total - 5} more_ |`);
1972
+ }
1973
+ }
1974
+ lines.push("");
1975
+ lines.push("## Tools");
1976
+ lines.push("");
1977
+ const toolsByCategory = {};
1978
+ for (const tool of toolsData.items) {
1979
+ const cat = tool.category;
1980
+ if (!toolsByCategory[cat])
1981
+ toolsByCategory[cat] = [];
1982
+ toolsByCategory[cat].push(tool);
1983
+ }
1984
+ if (Object.keys(toolsByCategory).length === 0) {
1985
+ lines.push("_No tools registered._");
1986
+ } else {
1987
+ lines.push("| Category | Tools | Active |");
1988
+ lines.push("|----------|-------|--------|");
1989
+ for (const [category, tools] of Object.entries(toolsByCategory).sort()) {
1990
+ const active = tools.filter((t) => t.status === "ACTIVE").length;
1991
+ lines.push(`| ${category} | ${tools.length} | ${active} |`);
1992
+ }
1993
+ }
1994
+ return {
1995
+ mimeType: "text/markdown",
1996
+ body: lines.join(`
1997
+ `)
1998
+ };
1999
+ }
2000
+ };
2001
+ // src/ui/overlays/demo-overlays.ts
2002
+ var agentConsoleDemoOverlay = {
2003
+ overlayId: "agent-console.demo-user",
2004
+ version: "1.0.0",
2005
+ description: "Simplifies agent console for demo users",
2006
+ appliesTo: {
2007
+ feature: "agent-console",
2008
+ role: "demo"
2009
+ },
2010
+ modifications: [
2011
+ {
2012
+ type: "hideField",
2013
+ field: "modelConfig",
2014
+ reason: "Advanced config not relevant for demo"
2015
+ },
2016
+ {
2017
+ type: "hideField",
2018
+ field: "webhookConfig",
2019
+ reason: "Integration not available in demo"
2020
+ },
2021
+ {
2022
+ type: "renameLabel",
2023
+ field: "systemPrompt",
2024
+ newLabel: "Agent Instructions"
2025
+ },
2026
+ {
2027
+ type: "addBadge",
2028
+ position: "header",
2029
+ label: "Demo Mode",
2030
+ variant: "warning"
2031
+ }
2032
+ ]
2033
+ };
2034
+ var agentConsoleReadOnlyOverlay = {
2035
+ overlayId: "agent-console.read-only",
2036
+ version: "1.0.0",
2037
+ description: "Read-only view for non-admin users",
2038
+ appliesTo: {
2039
+ feature: "agent-console",
2040
+ role: "viewer"
2041
+ },
2042
+ modifications: [
2043
+ {
2044
+ type: "hideField",
2045
+ field: "deleteButton",
2046
+ reason: "No delete permission"
2047
+ },
2048
+ { type: "hideField", field: "editButton", reason: "No edit permission" },
2049
+ {
2050
+ type: "hideField",
2051
+ field: "createButton",
2052
+ reason: "No create permission"
2053
+ }
2054
+ ]
2055
+ };
2056
+ var agentConsoleOverlays = [
2057
+ agentConsoleDemoOverlay,
2058
+ agentConsoleReadOnlyOverlay
2059
+ ];
2060
+ export {
2061
+ useToolList,
2062
+ useRunList,
2063
+ useAgentMutations,
2064
+ useAgentList,
2065
+ toolRegistryMarkdownRenderer,
2066
+ runListMarkdownRenderer,
2067
+ agentListReactRenderer,
2068
+ agentListMarkdownRenderer,
2069
+ agentDashboardMarkdownRenderer,
2070
+ agentConsoleReadOnlyOverlay,
2071
+ agentConsoleOverlays,
2072
+ agentConsoleDemoOverlay,
2073
+ ToolRegistryView,
2074
+ RunListView,
2075
+ CreateAgentModal,
2076
+ ToolRegistryView as AgentToolRegistry,
2077
+ RunListView as AgentRunList,
2078
+ AgentListView,
2079
+ AgentDashboard,
2080
+ AgentActionsModal
2081
+ };