@contractspec/example.agent-console 0.0.0-canary-20260113170453

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 (306) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +280 -0
  2. package/.turbo/turbo-build.log +281 -0
  3. package/CHANGELOG.md +368 -0
  4. package/LICENSE +21 -0
  5. package/README.md +86 -0
  6. package/dist/agent/agent.entity.d.ts +55 -0
  7. package/dist/agent/agent.entity.d.ts.map +1 -0
  8. package/dist/agent/agent.entity.js +136 -0
  9. package/dist/agent/agent.entity.js.map +1 -0
  10. package/dist/agent/agent.enum.d.ts +18 -0
  11. package/dist/agent/agent.enum.d.ts.map +1 -0
  12. package/dist/agent/agent.enum.js +34 -0
  13. package/dist/agent/agent.enum.js.map +1 -0
  14. package/dist/agent/agent.event.d.ts +128 -0
  15. package/dist/agent/agent.event.d.ts.map +1 -0
  16. package/dist/agent/agent.event.js +210 -0
  17. package/dist/agent/agent.event.js.map +1 -0
  18. package/dist/agent/agent.handler.d.ts +100 -0
  19. package/dist/agent/agent.handler.d.ts.map +1 -0
  20. package/dist/agent/agent.handler.js +84 -0
  21. package/dist/agent/agent.handler.js.map +1 -0
  22. package/dist/agent/agent.operation.d.ts +471 -0
  23. package/dist/agent/agent.operation.d.ts.map +1 -0
  24. package/dist/agent/agent.operation.js +486 -0
  25. package/dist/agent/agent.operation.js.map +1 -0
  26. package/dist/agent/agent.presentation.d.ts +18 -0
  27. package/dist/agent/agent.presentation.d.ts.map +1 -0
  28. package/dist/agent/agent.presentation.js +89 -0
  29. package/dist/agent/agent.presentation.js.map +1 -0
  30. package/dist/agent/agent.schema.d.ts +401 -0
  31. package/dist/agent/agent.schema.d.ts.map +1 -0
  32. package/dist/agent/agent.schema.js +406 -0
  33. package/dist/agent/agent.schema.js.map +1 -0
  34. package/dist/agent/agent.test-spec.d.ts +8 -0
  35. package/dist/agent/agent.test-spec.d.ts.map +1 -0
  36. package/dist/agent/agent.test-spec.js +65 -0
  37. package/dist/agent/agent.test-spec.js.map +1 -0
  38. package/dist/agent/index.d.ts +8 -0
  39. package/dist/agent/index.js +9 -0
  40. package/dist/agent.capability.d.ts +7 -0
  41. package/dist/agent.capability.d.ts.map +1 -0
  42. package/dist/agent.capability.js +20 -0
  43. package/dist/agent.capability.js.map +1 -0
  44. package/dist/agent.feature.d.ts +12 -0
  45. package/dist/agent.feature.d.ts.map +1 -0
  46. package/dist/agent.feature.js +305 -0
  47. package/dist/agent.feature.js.map +1 -0
  48. package/dist/docs/agent-console.docblock.d.ts +1 -0
  49. package/dist/docs/agent-console.docblock.js +113 -0
  50. package/dist/docs/agent-console.docblock.js.map +1 -0
  51. package/dist/docs/index.d.ts +1 -0
  52. package/dist/docs/index.js +1 -0
  53. package/dist/example.d.ts +7 -0
  54. package/dist/example.d.ts.map +1 -0
  55. package/dist/example.js +58 -0
  56. package/dist/example.js.map +1 -0
  57. package/dist/handlers/agent.handlers.d.ts +135 -0
  58. package/dist/handlers/agent.handlers.d.ts.map +1 -0
  59. package/dist/handlers/agent.handlers.js +263 -0
  60. package/dist/handlers/agent.handlers.js.map +1 -0
  61. package/dist/handlers/index.d.ts +5 -0
  62. package/dist/handlers/index.js +6 -0
  63. package/dist/index.d.ts +48 -0
  64. package/dist/index.js +50 -0
  65. package/dist/presentations/index.d.ts +4 -0
  66. package/dist/presentations/index.js +5 -0
  67. package/dist/run/index.d.ts +8 -0
  68. package/dist/run/index.js +9 -0
  69. package/dist/run/run.entity.d.ts +82 -0
  70. package/dist/run/run.entity.d.ts.map +1 -0
  71. package/dist/run/run.entity.js +205 -0
  72. package/dist/run/run.entity.js.map +1 -0
  73. package/dist/run/run.enum.d.ts +22 -0
  74. package/dist/run/run.enum.d.ts.map +1 -0
  75. package/dist/run/run.enum.js +45 -0
  76. package/dist/run/run.enum.js.map +1 -0
  77. package/dist/run/run.event.d.ts +290 -0
  78. package/dist/run/run.event.d.ts.map +1 -0
  79. package/dist/run/run.event.js +434 -0
  80. package/dist/run/run.event.js.map +1 -0
  81. package/dist/run/run.handler.d.ts +203 -0
  82. package/dist/run/run.handler.d.ts.map +1 -0
  83. package/dist/run/run.handler.js +83 -0
  84. package/dist/run/run.handler.js.map +1 -0
  85. package/dist/run/run.operation.d.ts +720 -0
  86. package/dist/run/run.operation.d.ts.map +1 -0
  87. package/dist/run/run.operation.js +626 -0
  88. package/dist/run/run.operation.js.map +1 -0
  89. package/dist/run/run.presentation.d.ts +14 -0
  90. package/dist/run/run.presentation.d.ts.map +1 -0
  91. package/dist/run/run.presentation.js +65 -0
  92. package/dist/run/run.presentation.js.map +1 -0
  93. package/dist/run/run.schema.d.ts +416 -0
  94. package/dist/run/run.schema.d.ts.map +1 -0
  95. package/dist/run/run.schema.js +338 -0
  96. package/dist/run/run.schema.js.map +1 -0
  97. package/dist/run/run.test-spec.d.ts +8 -0
  98. package/dist/run/run.test-spec.d.ts.map +1 -0
  99. package/dist/run/run.test-spec.js +65 -0
  100. package/dist/run/run.test-spec.js.map +1 -0
  101. package/dist/seeders/index.d.ts +10 -0
  102. package/dist/seeders/index.d.ts.map +1 -0
  103. package/dist/seeders/index.js +20 -0
  104. package/dist/seeders/index.js.map +1 -0
  105. package/dist/shared/index.d.ts +4 -0
  106. package/dist/shared/index.js +5 -0
  107. package/dist/shared/mock-agents.d.ts +88 -0
  108. package/dist/shared/mock-agents.d.ts.map +1 -0
  109. package/dist/shared/mock-agents.js +94 -0
  110. package/dist/shared/mock-agents.js.map +1 -0
  111. package/dist/shared/mock-runs.d.ts +120 -0
  112. package/dist/shared/mock-runs.d.ts.map +1 -0
  113. package/dist/shared/mock-runs.js +118 -0
  114. package/dist/shared/mock-runs.js.map +1 -0
  115. package/dist/shared/mock-tools.d.ts +244 -0
  116. package/dist/shared/mock-tools.d.ts.map +1 -0
  117. package/dist/shared/mock-tools.js +181 -0
  118. package/dist/shared/mock-tools.js.map +1 -0
  119. package/dist/shared/overlay-types.d.ts +34 -0
  120. package/dist/shared/overlay-types.d.ts.map +1 -0
  121. package/dist/shared/overlay-types.js +0 -0
  122. package/dist/tool/index.d.ts +8 -0
  123. package/dist/tool/index.js +9 -0
  124. package/dist/tool/tool.entity.d.ts +42 -0
  125. package/dist/tool/tool.entity.d.ts.map +1 -0
  126. package/dist/tool/tool.entity.js +105 -0
  127. package/dist/tool/tool.entity.js.map +1 -0
  128. package/dist/tool/tool.enum.d.ts +18 -0
  129. package/dist/tool/tool.enum.d.ts.map +1 -0
  130. package/dist/tool/tool.enum.js +35 -0
  131. package/dist/tool/tool.enum.js.map +1 -0
  132. package/dist/tool/tool.event.d.ts +103 -0
  133. package/dist/tool/tool.event.d.ts.map +1 -0
  134. package/dist/tool/tool.event.js +159 -0
  135. package/dist/tool/tool.event.js.map +1 -0
  136. package/dist/tool/tool.handler.d.ts +315 -0
  137. package/dist/tool/tool.handler.d.ts.map +1 -0
  138. package/dist/tool/tool.handler.js +87 -0
  139. package/dist/tool/tool.handler.js.map +1 -0
  140. package/dist/tool/tool.operation.d.ts +411 -0
  141. package/dist/tool/tool.operation.d.ts.map +1 -0
  142. package/dist/tool/tool.operation.js +406 -0
  143. package/dist/tool/tool.operation.js.map +1 -0
  144. package/dist/tool/tool.presentation.d.ts +14 -0
  145. package/dist/tool/tool.presentation.d.ts.map +1 -0
  146. package/dist/tool/tool.presentation.js +65 -0
  147. package/dist/tool/tool.presentation.js.map +1 -0
  148. package/dist/tool/tool.schema.d.ts +218 -0
  149. package/dist/tool/tool.schema.d.ts.map +1 -0
  150. package/dist/tool/tool.schema.js +236 -0
  151. package/dist/tool/tool.schema.js.map +1 -0
  152. package/dist/tool/tool.test-spec.d.ts +8 -0
  153. package/dist/tool/tool.test-spec.d.ts.map +1 -0
  154. package/dist/tool/tool.test-spec.js +65 -0
  155. package/dist/tool/tool.test-spec.js.map +1 -0
  156. package/dist/ui/AgentDashboard.d.ts +7 -0
  157. package/dist/ui/AgentDashboard.d.ts.map +1 -0
  158. package/dist/ui/AgentDashboard.js +420 -0
  159. package/dist/ui/AgentDashboard.js.map +1 -0
  160. package/dist/ui/AgentRunList.d.ts +2 -0
  161. package/dist/ui/AgentRunList.js +5 -0
  162. package/dist/ui/AgentToolRegistry.d.ts +2 -0
  163. package/dist/ui/AgentToolRegistry.js +5 -0
  164. package/dist/ui/hooks/index.d.ts +6 -0
  165. package/dist/ui/hooks/index.js +8 -0
  166. package/dist/ui/hooks/useAgentList.d.ts +28 -0
  167. package/dist/ui/hooks/useAgentList.d.ts.map +1 -0
  168. package/dist/ui/hooks/useAgentList.js +66 -0
  169. package/dist/ui/hooks/useAgentList.js.map +1 -0
  170. package/dist/ui/hooks/useAgentMutations.d.ts +29 -0
  171. package/dist/ui/hooks/useAgentMutations.d.ts.map +1 -0
  172. package/dist/ui/hooks/useAgentMutations.js +124 -0
  173. package/dist/ui/hooks/useAgentMutations.js.map +1 -0
  174. package/dist/ui/hooks/useRunList.d.ts +24 -0
  175. package/dist/ui/hooks/useRunList.d.ts.map +1 -0
  176. package/dist/ui/hooks/useRunList.js +66 -0
  177. package/dist/ui/hooks/useRunList.js.map +1 -0
  178. package/dist/ui/hooks/useToolList.d.ts +40 -0
  179. package/dist/ui/hooks/useToolList.d.ts.map +1 -0
  180. package/dist/ui/hooks/useToolList.js +96 -0
  181. package/dist/ui/hooks/useToolList.js.map +1 -0
  182. package/dist/ui/index.d.ts +24 -0
  183. package/dist/ui/index.js +24 -0
  184. package/dist/ui/modals/AgentActionsModal.d.ts +27 -0
  185. package/dist/ui/modals/AgentActionsModal.d.ts.map +1 -0
  186. package/dist/ui/modals/AgentActionsModal.js +262 -0
  187. package/dist/ui/modals/AgentActionsModal.js.map +1 -0
  188. package/dist/ui/modals/CreateAgentModal.d.ts +25 -0
  189. package/dist/ui/modals/CreateAgentModal.d.ts.map +1 -0
  190. package/dist/ui/modals/CreateAgentModal.js +214 -0
  191. package/dist/ui/modals/CreateAgentModal.js.map +1 -0
  192. package/dist/ui/modals/index.d.ts +3 -0
  193. package/dist/ui/modals/index.js +4 -0
  194. package/dist/ui/overlays/demo-overlays.d.ts +19 -0
  195. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -0
  196. package/dist/ui/overlays/demo-overlays.js +73 -0
  197. package/dist/ui/overlays/demo-overlays.js.map +1 -0
  198. package/dist/ui/overlays/index.d.ts +2 -0
  199. package/dist/ui/overlays/index.js +3 -0
  200. package/dist/ui/renderers/agent-list.markdown.d.ts +15 -0
  201. package/dist/ui/renderers/agent-list.markdown.d.ts.map +1 -0
  202. package/dist/ui/renderers/agent-list.markdown.js +51 -0
  203. package/dist/ui/renderers/agent-list.markdown.js.map +1 -0
  204. package/dist/ui/renderers/agent-list.renderer.d.ts +11 -0
  205. package/dist/ui/renderers/agent-list.renderer.d.ts.map +1 -0
  206. package/dist/ui/renderers/agent-list.renderer.js +19 -0
  207. package/dist/ui/renderers/agent-list.renderer.js.map +1 -0
  208. package/dist/ui/renderers/dashboard.markdown.d.ts +15 -0
  209. package/dist/ui/renderers/dashboard.markdown.d.ts.map +1 -0
  210. package/dist/ui/renderers/dashboard.markdown.js +100 -0
  211. package/dist/ui/renderers/dashboard.markdown.js.map +1 -0
  212. package/dist/ui/renderers/index.d.ts +6 -0
  213. package/dist/ui/renderers/index.js +7 -0
  214. package/dist/ui/renderers/run-list.markdown.d.ts +15 -0
  215. package/dist/ui/renderers/run-list.markdown.d.ts.map +1 -0
  216. package/dist/ui/renderers/run-list.markdown.js +44 -0
  217. package/dist/ui/renderers/run-list.markdown.js.map +1 -0
  218. package/dist/ui/renderers/tool-registry.markdown.d.ts +15 -0
  219. package/dist/ui/renderers/tool-registry.markdown.d.ts.map +1 -0
  220. package/dist/ui/renderers/tool-registry.markdown.js +55 -0
  221. package/dist/ui/renderers/tool-registry.markdown.js.map +1 -0
  222. package/dist/ui/views/AgentListView.d.ts +7 -0
  223. package/dist/ui/views/AgentListView.d.ts.map +1 -0
  224. package/dist/ui/views/AgentListView.js +93 -0
  225. package/dist/ui/views/AgentListView.js.map +1 -0
  226. package/dist/ui/views/RunListView.d.ts +14 -0
  227. package/dist/ui/views/RunListView.d.ts.map +1 -0
  228. package/dist/ui/views/RunListView.js +165 -0
  229. package/dist/ui/views/RunListView.js.map +1 -0
  230. package/dist/ui/views/ToolRegistryView.d.ts +14 -0
  231. package/dist/ui/views/ToolRegistryView.d.ts.map +1 -0
  232. package/dist/ui/views/ToolRegistryView.js +97 -0
  233. package/dist/ui/views/ToolRegistryView.js.map +1 -0
  234. package/dist/ui/views/index.d.ts +4 -0
  235. package/dist/ui/views/index.js +5 -0
  236. package/example.ts +1 -0
  237. package/package.json +155 -0
  238. package/src/agent/agent.entity.ts +137 -0
  239. package/src/agent/agent.enum.ts +31 -0
  240. package/src/agent/agent.event.ts +142 -0
  241. package/src/agent/agent.handler.ts +178 -0
  242. package/src/agent/agent.operation.ts +444 -0
  243. package/src/agent/agent.presentation.ts +80 -0
  244. package/src/agent/agent.schema.ts +214 -0
  245. package/src/agent/agent.test-spec.ts +55 -0
  246. package/src/agent/index.ts +67 -0
  247. package/src/agent.capability.ts +13 -0
  248. package/src/agent.feature.ts +147 -0
  249. package/src/docs/agent-console.docblock.ts +97 -0
  250. package/src/docs/index.ts +1 -0
  251. package/src/example.ts +41 -0
  252. package/src/handlers/agent.handlers.ts +572 -0
  253. package/src/handlers/index.ts +30 -0
  254. package/src/index.ts +32 -0
  255. package/src/presentations/index.ts +26 -0
  256. package/src/run/index.ts +68 -0
  257. package/src/run/run.entity.ts +175 -0
  258. package/src/run/run.enum.ts +43 -0
  259. package/src/run/run.event.ts +264 -0
  260. package/src/run/run.handler.ts +138 -0
  261. package/src/run/run.operation.ts +524 -0
  262. package/src/run/run.presentation.ts +54 -0
  263. package/src/run/run.schema.ts +169 -0
  264. package/src/run/run.test-spec.ts +55 -0
  265. package/src/seeders/index.ts +29 -0
  266. package/src/shared/index.ts +6 -0
  267. package/src/shared/mock-agents.ts +81 -0
  268. package/src/shared/mock-runs.ts +107 -0
  269. package/src/shared/mock-tools.ts +145 -0
  270. package/src/shared/overlay-types.ts +39 -0
  271. package/src/tool/index.ts +60 -0
  272. package/src/tool/tool.entity.ts +99 -0
  273. package/src/tool/tool.enum.ts +32 -0
  274. package/src/tool/tool.event.ts +119 -0
  275. package/src/tool/tool.handler.ts +154 -0
  276. package/src/tool/tool.operation.ts +366 -0
  277. package/src/tool/tool.presentation.ts +55 -0
  278. package/src/tool/tool.schema.ts +133 -0
  279. package/src/tool/tool.test-spec.ts +55 -0
  280. package/src/ui/AgentDashboard.tsx +416 -0
  281. package/src/ui/AgentRunList.tsx +8 -0
  282. package/src/ui/AgentToolRegistry.tsx +8 -0
  283. package/src/ui/hooks/index.ts +14 -0
  284. package/src/ui/hooks/useAgentList.ts +80 -0
  285. package/src/ui/hooks/useAgentMutations.ts +156 -0
  286. package/src/ui/hooks/useRunList.ts +81 -0
  287. package/src/ui/hooks/useToolList.ts +122 -0
  288. package/src/ui/index.ts +21 -0
  289. package/src/ui/modals/AgentActionsModal.tsx +306 -0
  290. package/src/ui/modals/CreateAgentModal.tsx +257 -0
  291. package/src/ui/modals/index.ts +2 -0
  292. package/src/ui/overlays/demo-overlays.ts +77 -0
  293. package/src/ui/overlays/index.ts +1 -0
  294. package/src/ui/renderers/agent-list.markdown.ts +84 -0
  295. package/src/ui/renderers/agent-list.renderer.tsx +27 -0
  296. package/src/ui/renderers/dashboard.markdown.ts +169 -0
  297. package/src/ui/renderers/index.ts +12 -0
  298. package/src/ui/renderers/run-list.markdown.ts +75 -0
  299. package/src/ui/renderers/tool-registry.markdown.ts +91 -0
  300. package/src/ui/views/AgentListView.tsx +113 -0
  301. package/src/ui/views/RunListView.tsx +173 -0
  302. package/src/ui/views/ToolRegistryView.tsx +140 -0
  303. package/src/ui/views/index.ts +6 -0
  304. package/tsconfig.json +10 -0
  305. package/tsconfig.tsbuildinfo +1 -0
  306. package/tsdown.config.js +7 -0
@@ -0,0 +1,165 @@
1
+ 'use client';
2
+
3
+ import { useRunList } from "../hooks/useRunList.js";
4
+ import { EmptyState, ErrorState, LoaderBlock, StatCard, StatCardGroup, StatusChip } from "@contractspec/lib.design-system";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region src/ui/views/RunListView.tsx
8
+ /**
9
+ * Run List View - Shows agent execution runs with stats
10
+ */
11
+ function getStatusTone(status) {
12
+ switch (status) {
13
+ case "COMPLETED": return "success";
14
+ case "RUNNING": return "warning";
15
+ case "QUEUED": return "neutral";
16
+ case "FAILED":
17
+ case "CANCELLED": return "danger";
18
+ default: return "neutral";
19
+ }
20
+ }
21
+ function formatDuration(ms) {
22
+ if (!ms) return "-";
23
+ if (ms < 1e3) return `${ms}ms`;
24
+ if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
25
+ return `${(ms / 6e4).toFixed(1)}m`;
26
+ }
27
+ function formatTokens(tokens) {
28
+ if (tokens < 1e3) return tokens.toString();
29
+ if (tokens < 1e6) return `${(tokens / 1e3).toFixed(1)}K`;
30
+ return `${(tokens / 1e6).toFixed(2)}M`;
31
+ }
32
+ function formatCost(cost) {
33
+ if (!cost) return "-";
34
+ return `$${cost.toFixed(4)}`;
35
+ }
36
+ function RunListView({ agentId, onRunClick }) {
37
+ const { data, metrics, loading, error, refetch } = useRunList({ agentId });
38
+ if (loading && !data) return /* @__PURE__ */ jsx(LoaderBlock, { label: "Loading runs..." });
39
+ if (error) return /* @__PURE__ */ jsx(ErrorState, {
40
+ title: "Failed to load runs",
41
+ description: error.message,
42
+ onRetry: refetch,
43
+ retryLabel: "Retry"
44
+ });
45
+ if (!data?.items.length) return /* @__PURE__ */ jsx(EmptyState, {
46
+ title: "No runs yet",
47
+ description: "Execute an agent to see run history here."
48
+ });
49
+ return /* @__PURE__ */ jsxs("div", {
50
+ className: "space-y-6",
51
+ children: [
52
+ metrics && /* @__PURE__ */ jsxs(StatCardGroup, { children: [
53
+ /* @__PURE__ */ jsx(StatCard, {
54
+ label: "Total Runs",
55
+ value: metrics.totalRuns
56
+ }),
57
+ /* @__PURE__ */ jsx(StatCard, {
58
+ label: "Success Rate",
59
+ value: `${(metrics.successRate * 100).toFixed(1)}%`
60
+ }),
61
+ /* @__PURE__ */ jsx(StatCard, {
62
+ label: "Total Tokens",
63
+ value: formatTokens(metrics.totalTokens)
64
+ }),
65
+ /* @__PURE__ */ jsx(StatCard, {
66
+ label: "Total Cost",
67
+ value: `$${metrics.totalCostUsd.toFixed(2)}`
68
+ })
69
+ ] }),
70
+ /* @__PURE__ */ jsx("div", {
71
+ className: "border-border rounded-lg border",
72
+ children: /* @__PURE__ */ jsxs("table", {
73
+ className: "w-full",
74
+ children: [/* @__PURE__ */ jsx("thead", {
75
+ className: "border-border bg-muted/30 border-b",
76
+ children: /* @__PURE__ */ jsxs("tr", { children: [
77
+ /* @__PURE__ */ jsx("th", {
78
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
79
+ children: "Run"
80
+ }),
81
+ /* @__PURE__ */ jsx("th", {
82
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
83
+ children: "Agent"
84
+ }),
85
+ /* @__PURE__ */ jsx("th", {
86
+ className: "text-muted-foreground px-4 py-3 text-left text-sm font-medium",
87
+ children: "Status"
88
+ }),
89
+ /* @__PURE__ */ jsx("th", {
90
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
91
+ children: "Tokens"
92
+ }),
93
+ /* @__PURE__ */ jsx("th", {
94
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
95
+ children: "Duration"
96
+ }),
97
+ /* @__PURE__ */ jsx("th", {
98
+ className: "text-muted-foreground px-4 py-3 text-right text-sm font-medium",
99
+ children: "Cost"
100
+ })
101
+ ] })
102
+ }), /* @__PURE__ */ jsx("tbody", {
103
+ className: "divide-border divide-y",
104
+ children: data.items.map((run) => /* @__PURE__ */ jsxs("tr", {
105
+ className: "hover:bg-muted/50 cursor-pointer transition-colors",
106
+ onClick: () => onRunClick?.(run.id),
107
+ children: [
108
+ /* @__PURE__ */ jsxs("td", {
109
+ className: "px-4 py-3",
110
+ children: [/* @__PURE__ */ jsx("div", {
111
+ className: "font-mono text-sm",
112
+ children: run.id.slice(-8)
113
+ }), /* @__PURE__ */ jsx("div", {
114
+ className: "text-muted-foreground text-xs",
115
+ children: run.queuedAt.toLocaleString()
116
+ })]
117
+ }),
118
+ /* @__PURE__ */ jsx("td", {
119
+ className: "px-4 py-3",
120
+ children: /* @__PURE__ */ jsx("span", {
121
+ className: "font-medium",
122
+ children: run.agentName
123
+ })
124
+ }),
125
+ /* @__PURE__ */ jsx("td", {
126
+ className: "px-4 py-3",
127
+ children: /* @__PURE__ */ jsx(StatusChip, {
128
+ tone: getStatusTone(run.status),
129
+ label: run.status
130
+ })
131
+ }),
132
+ /* @__PURE__ */ jsx("td", {
133
+ className: "px-4 py-3 text-right font-mono text-sm",
134
+ children: formatTokens(run.totalTokens)
135
+ }),
136
+ /* @__PURE__ */ jsx("td", {
137
+ className: "px-4 py-3 text-right font-mono text-sm",
138
+ children: formatDuration(run.durationMs)
139
+ }),
140
+ /* @__PURE__ */ jsx("td", {
141
+ className: "px-4 py-3 text-right font-mono text-sm",
142
+ children: formatCost(run.estimatedCostUsd)
143
+ })
144
+ ]
145
+ }, run.id))
146
+ })]
147
+ })
148
+ }),
149
+ /* @__PURE__ */ jsxs("div", {
150
+ className: "text-muted-foreground text-center text-sm",
151
+ children: [
152
+ "Showing ",
153
+ data.items.length,
154
+ " of ",
155
+ data.total,
156
+ " runs"
157
+ ]
158
+ })
159
+ ]
160
+ });
161
+ }
162
+
163
+ //#endregion
164
+ export { RunListView };
165
+ //# sourceMappingURL=RunListView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunListView.js","names":[],"sources":["../../../src/ui/views/RunListView.tsx"],"sourcesContent":["'use client';\n\n/**\n * Run List View - Shows agent execution runs with stats\n */\nimport {\n StatCard,\n StatCardGroup,\n StatusChip,\n EmptyState,\n LoaderBlock,\n ErrorState,\n} from '@contractspec/lib.design-system';\nimport { useRunList, type Run } from '../hooks/useRunList';\n\ninterface RunListViewProps {\n agentId?: string;\n onRunClick?: (runId: string) => void;\n}\n\nfunction getStatusTone(\n status: Run['status']\n): 'success' | 'warning' | 'neutral' | 'danger' {\n switch (status) {\n case 'COMPLETED':\n return 'success';\n case 'RUNNING':\n return 'warning';\n case 'QUEUED':\n return 'neutral';\n case 'FAILED':\n case 'CANCELLED':\n return 'danger';\n default:\n return 'neutral';\n }\n}\n\nfunction formatDuration(ms?: number): string {\n if (!ms) return '-';\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens < 1000) return tokens.toString();\n if (tokens < 1000000) return `${(tokens / 1000).toFixed(1)}K`;\n return `${(tokens / 1000000).toFixed(2)}M`;\n}\n\nfunction formatCost(cost?: number): string {\n if (!cost) return '-';\n return `$${cost.toFixed(4)}`;\n}\n\nexport function RunListView({ agentId, onRunClick }: RunListViewProps) {\n const { data, metrics, loading, error, refetch } = useRunList({ agentId });\n\n if (loading && !data) {\n return <LoaderBlock label=\"Loading runs...\" />;\n }\n\n if (error) {\n return (\n <ErrorState\n title=\"Failed to load runs\"\n description={error.message}\n onRetry={refetch}\n retryLabel=\"Retry\"\n />\n );\n }\n\n if (!data?.items.length) {\n return (\n <EmptyState\n title=\"No runs yet\"\n description=\"Execute an agent to see run history here.\"\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Metrics Stats */}\n {metrics && (\n <StatCardGroup>\n <StatCard label=\"Total Runs\" value={metrics.totalRuns} />\n <StatCard\n label=\"Success Rate\"\n value={`${(metrics.successRate * 100).toFixed(1)}%`}\n />\n <StatCard\n label=\"Total Tokens\"\n value={formatTokens(metrics.totalTokens)}\n />\n <StatCard\n label=\"Total Cost\"\n value={`$${metrics.totalCostUsd.toFixed(2)}`}\n />\n </StatCardGroup>\n )}\n\n {/* Run List */}\n <div className=\"border-border rounded-lg border\">\n <table className=\"w-full\">\n <thead className=\"border-border bg-muted/30 border-b\">\n <tr>\n <th className=\"text-muted-foreground px-4 py-3 text-left text-sm font-medium\">\n Run\n </th>\n <th className=\"text-muted-foreground px-4 py-3 text-left text-sm font-medium\">\n Agent\n </th>\n <th className=\"text-muted-foreground px-4 py-3 text-left text-sm font-medium\">\n Status\n </th>\n <th className=\"text-muted-foreground px-4 py-3 text-right text-sm font-medium\">\n Tokens\n </th>\n <th className=\"text-muted-foreground px-4 py-3 text-right text-sm font-medium\">\n Duration\n </th>\n <th className=\"text-muted-foreground px-4 py-3 text-right text-sm font-medium\">\n Cost\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {data.items.map((run: Run) => (\n <tr\n key={run.id}\n className=\"hover:bg-muted/50 cursor-pointer transition-colors\"\n onClick={() => onRunClick?.(run.id)}\n >\n <td className=\"px-4 py-3\">\n <div className=\"font-mono text-sm\">{run.id.slice(-8)}</div>\n <div className=\"text-muted-foreground text-xs\">\n {run.queuedAt.toLocaleString()}\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <span className=\"font-medium\">{run.agentName}</span>\n </td>\n <td className=\"px-4 py-3\">\n <StatusChip\n tone={getStatusTone(run.status)}\n label={run.status}\n />\n </td>\n <td className=\"px-4 py-3 text-right font-mono text-sm\">\n {formatTokens(run.totalTokens)}\n </td>\n <td className=\"px-4 py-3 text-right font-mono text-sm\">\n {formatDuration(run.durationMs)}\n </td>\n <td className=\"px-4 py-3 text-right font-mono text-sm\">\n {formatCost(run.estimatedCostUsd)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n <div className=\"text-muted-foreground text-center text-sm\">\n Showing {data.items.length} of {data.total} runs\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime4 from "react/jsx-runtime";
2
+
3
+ //#region src/ui/views/ToolRegistryView.d.ts
4
+ interface ToolRegistryViewProps {
5
+ onToolClick?: (toolId: string) => void;
6
+ onCreateTool?: () => void;
7
+ }
8
+ declare function ToolRegistryView({
9
+ onToolClick,
10
+ onCreateTool
11
+ }: ToolRegistryViewProps): react_jsx_runtime4.JSX.Element;
12
+ //#endregion
13
+ export { ToolRegistryView };
14
+ //# sourceMappingURL=ToolRegistryView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolRegistryView.d.ts","names":[],"sources":["../../../src/ui/views/ToolRegistryView.tsx"],"sourcesContent":[],"mappings":";;;UAiBU,qBAAA;;;AAkCc;AAHR,iBAAA,gBAAA,CAAgB;EAAA,WAAA;EAAA;AAAA,CAAA,EAG7B,qBAH6B,CAAA,EAGR,kBAAA,CAAA,GAAA,CAAA,OAHQ"}
@@ -0,0 +1,97 @@
1
+ 'use client';
2
+
3
+ import { useToolList } from "../hooks/useToolList.js";
4
+ import { Button, EmptyState, EntityCard, ErrorState, LoaderBlock, StatCard, StatCardGroup, StatusChip } from "@contractspec/lib.design-system";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+
7
+ //#region src/ui/views/ToolRegistryView.tsx
8
+ /**
9
+ * Tool Registry View - Shows available tools organized by category
10
+ */
11
+ const categoryIcons = {
12
+ RETRIEVAL: "🔍",
13
+ COMPUTATION: "🧮",
14
+ COMMUNICATION: "📧",
15
+ INTEGRATION: "🔗",
16
+ UTILITY: "🛠️",
17
+ CUSTOM: "⚙️"
18
+ };
19
+ function getStatusTone(status) {
20
+ switch (status) {
21
+ case "ACTIVE": return "success";
22
+ case "DRAFT": return "neutral";
23
+ case "DEPRECATED": return "warning";
24
+ case "DISABLED": return "danger";
25
+ default: return "neutral";
26
+ }
27
+ }
28
+ function ToolRegistryView({ onToolClick, onCreateTool }) {
29
+ const { data, loading, error, groupedByCategory, categoryStats, refetch } = useToolList();
30
+ if (loading && !data) return /* @__PURE__ */ jsx(LoaderBlock, { label: "Loading tools..." });
31
+ if (error) return /* @__PURE__ */ jsx(ErrorState, {
32
+ title: "Failed to load tools",
33
+ description: error.message,
34
+ onRetry: refetch,
35
+ retryLabel: "Retry"
36
+ });
37
+ if (!data?.items.length) return /* @__PURE__ */ jsx(EmptyState, {
38
+ title: "No tools registered",
39
+ description: "Create your first tool to extend agent capabilities.",
40
+ primaryAction: onCreateTool ? /* @__PURE__ */ jsx(Button, {
41
+ onPress: onCreateTool,
42
+ children: "Create Tool"
43
+ }) : void 0
44
+ });
45
+ return /* @__PURE__ */ jsxs("div", {
46
+ className: "space-y-8",
47
+ children: [/* @__PURE__ */ jsxs(StatCardGroup, { children: [/* @__PURE__ */ jsx(StatCard, {
48
+ label: "Total Tools",
49
+ value: data.total
50
+ }), categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsx(StatCard, {
51
+ label: `${categoryIcons[category] ?? ""} ${category}`,
52
+ value: count
53
+ }, category))] }), Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxs("section", {
54
+ className: "space-y-4",
55
+ children: [/* @__PURE__ */ jsxs("div", {
56
+ className: "flex items-center gap-2",
57
+ children: [
58
+ /* @__PURE__ */ jsx("span", {
59
+ className: "text-2xl",
60
+ children: categoryIcons[category]
61
+ }),
62
+ /* @__PURE__ */ jsx("h3", {
63
+ className: "text-lg font-semibold",
64
+ children: category
65
+ }),
66
+ /* @__PURE__ */ jsx("span", {
67
+ className: "bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs",
68
+ children: tools.length
69
+ })
70
+ ]
71
+ }), /* @__PURE__ */ jsx("div", {
72
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
73
+ children: tools.map((tool) => /* @__PURE__ */ jsx(EntityCard, {
74
+ cardTitle: tool.name,
75
+ cardSubtitle: `v${tool.version}`,
76
+ meta: /* @__PURE__ */ jsx("p", {
77
+ className: "text-muted-foreground text-sm",
78
+ children: tool.description
79
+ }),
80
+ chips: /* @__PURE__ */ jsx(StatusChip, {
81
+ tone: getStatusTone(tool.status),
82
+ label: tool.status
83
+ }),
84
+ footer: /* @__PURE__ */ jsx("code", {
85
+ className: "text-muted-foreground text-xs",
86
+ children: tool.name
87
+ }),
88
+ onClick: onToolClick ? () => onToolClick(tool.id) : void 0
89
+ }, tool.id))
90
+ })]
91
+ }, category))]
92
+ });
93
+ }
94
+
95
+ //#endregion
96
+ export { ToolRegistryView };
97
+ //# sourceMappingURL=ToolRegistryView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolRegistryView.js","names":[],"sources":["../../../src/ui/views/ToolRegistryView.tsx"],"sourcesContent":["'use client';\n\n/**\n * Tool Registry View - Shows available tools organized by category\n */\nimport {\n StatCard,\n StatCardGroup,\n StatusChip,\n EntityCard,\n EmptyState,\n LoaderBlock,\n ErrorState,\n Button,\n} from '@contractspec/lib.design-system';\nimport { useToolList, type Tool } from '../hooks/useToolList';\n\ninterface ToolRegistryViewProps {\n onToolClick?: (toolId: string) => void;\n onCreateTool?: () => void;\n}\n\nconst categoryIcons: Record<string, string> = {\n RETRIEVAL: '🔍',\n COMPUTATION: '🧮',\n COMMUNICATION: '📧',\n INTEGRATION: '🔗',\n UTILITY: '🛠️',\n CUSTOM: '⚙️',\n};\n\nfunction getStatusTone(\n status: Tool['status']\n): 'success' | 'warning' | 'neutral' | 'danger' {\n switch (status) {\n case 'ACTIVE':\n return 'success';\n case 'DRAFT':\n return 'neutral';\n case 'DEPRECATED':\n return 'warning';\n case 'DISABLED':\n return 'danger';\n default:\n return 'neutral';\n }\n}\n\nexport function ToolRegistryView({\n onToolClick,\n onCreateTool,\n}: ToolRegistryViewProps) {\n const { data, loading, error, groupedByCategory, categoryStats, refetch } =\n useToolList();\n\n if (loading && !data) {\n return <LoaderBlock label=\"Loading tools...\" />;\n }\n\n if (error) {\n return (\n <ErrorState\n title=\"Failed to load tools\"\n description={error.message}\n onRetry={refetch}\n retryLabel=\"Retry\"\n />\n );\n }\n\n if (!data?.items.length) {\n return (\n <EmptyState\n title=\"No tools registered\"\n description=\"Create your first tool to extend agent capabilities.\"\n primaryAction={\n onCreateTool ? (\n <Button onPress={onCreateTool}>Create Tool</Button>\n ) : undefined\n }\n />\n );\n }\n\n return (\n <div className=\"space-y-8\">\n {/* Category Stats */}\n <StatCardGroup>\n <StatCard label=\"Total Tools\" value={data.total} />\n {categoryStats.slice(0, 3).map(({ category, count }) => (\n <StatCard\n key={category}\n label={`${categoryIcons[category] ?? ''} ${category}`}\n value={count}\n />\n ))}\n </StatCardGroup>\n\n {/* Tools by Category */}\n {Object.entries(groupedByCategory).map(([category, tools]) => (\n <section key={category} className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl\">{categoryIcons[category]}</span>\n <h3 className=\"text-lg font-semibold\">{category}</h3>\n <span className=\"bg-muted text-muted-foreground rounded-full px-2 py-0.5 text-xs\">\n {(tools as Tool[]).length}\n </span>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {(tools as Tool[]).map((tool) => (\n <EntityCard\n key={tool.id}\n cardTitle={tool.name}\n cardSubtitle={`v${tool.version}`}\n meta={\n <p className=\"text-muted-foreground text-sm\">\n {tool.description}\n </p>\n }\n chips={\n <StatusChip\n tone={getStatusTone(tool.status)}\n label={tool.status}\n />\n }\n footer={\n <code className=\"text-muted-foreground text-xs\">\n {tool.name}\n </code>\n }\n onClick={onToolClick ? () => onToolClick(tool.id) : undefined}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAsBA,MAAM,gBAAwC;CAC5C,WAAW;CACX,aAAa;CACb,eAAe;CACf,aAAa;CACb,SAAS;CACT,QAAQ;CACT;AAED,SAAS,cACP,QAC8C;AAC9C,SAAQ,QAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,aACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAgB,iBAAiB,EAC/B,aACA,gBACwB;CACxB,MAAM,EAAE,MAAM,SAAS,OAAO,mBAAmB,eAAe,YAC9D,aAAa;AAEf,KAAI,WAAW,CAAC,KACd,QAAO,oBAAC,eAAY,OAAM,qBAAqB;AAGjD,KAAI,MACF,QACE,oBAAC;EACC,OAAM;EACN,aAAa,MAAM;EACnB,SAAS;EACT,YAAW;GACX;AAIN,KAAI,CAAC,MAAM,MAAM,OACf,QACE,oBAAC;EACC,OAAM;EACN,aAAY;EACZ,eACE,eACE,oBAAC;GAAO,SAAS;aAAc;IAAoB,GACjD;GAEN;AAIN,QACE,qBAAC;EAAI,WAAU;aAEb,qBAAC,4BACC,oBAAC;GAAS,OAAM;GAAc,OAAO,KAAK;IAAS,EAClD,cAAc,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,YAC1C,oBAAC;GAEC,OAAO,GAAG,cAAc,aAAa,GAAG,GAAG;GAC3C,OAAO;KAFF,SAGL,CACF,IACY,EAGf,OAAO,QAAQ,kBAAkB,CAAC,KAAK,CAAC,UAAU,WACjD,qBAAC;GAAuB,WAAU;cAChC,qBAAC;IAAI,WAAU;;KACb,oBAAC;MAAK,WAAU;gBAAY,cAAc;OAAiB;KAC3D,oBAAC;MAAG,WAAU;gBAAyB;OAAc;KACrD,oBAAC;MAAK,WAAU;gBACZ,MAAiB;OACd;;KACH,EAEN,oBAAC;IAAI,WAAU;cACX,MAAiB,KAAK,SACtB,oBAAC;KAEC,WAAW,KAAK;KAChB,cAAc,IAAI,KAAK;KACvB,MACE,oBAAC;MAAE,WAAU;gBACV,KAAK;OACJ;KAEN,OACE,oBAAC;MACC,MAAM,cAAc,KAAK,OAAO;MAChC,OAAO,KAAK;OACZ;KAEJ,QACE,oBAAC;MAAK,WAAU;gBACb,KAAK;OACD;KAET,SAAS,oBAAoB,YAAY,KAAK,GAAG,GAAG;OAnB/C,KAAK,GAoBV,CACF;KACE;KAlCM,SAmCJ,CACV;GACE"}
@@ -0,0 +1,4 @@
1
+ import { RunListView } from "./RunListView.js";
2
+ import { ToolRegistryView } from "./ToolRegistryView.js";
3
+ import { AgentListView } from "./AgentListView.js";
4
+ export { AgentListView, RunListView, ToolRegistryView };
@@ -0,0 +1,5 @@
1
+ import { RunListView } from "./RunListView.js";
2
+ import { ToolRegistryView } from "./ToolRegistryView.js";
3
+ import { AgentListView } from "./AgentListView.js";
4
+
5
+ export { AgentListView, RunListView, ToolRegistryView };
package/example.ts ADDED
@@ -0,0 +1 @@
1
+ export { default } from './src/example';
package/package.json ADDED
@@ -0,0 +1,155 @@
1
+ {
2
+ "name": "@contractspec/example.agent-console",
3
+ "version": "0.0.0-canary-20260113170453",
4
+ "description": "Agent Console example - AI agent orchestration with tools, runs, and logs",
5
+ "type": "module",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./agent": "./dist/agent/index.js",
10
+ "./agent.capability": "./dist/agent.capability.js",
11
+ "./agent.feature": "./dist/agent.feature.js",
12
+ "./agent/agent.entity": "./dist/agent/agent.entity.js",
13
+ "./agent/agent.enum": "./dist/agent/agent.enum.js",
14
+ "./agent/agent.event": "./dist/agent/agent.event.js",
15
+ "./agent/agent.handler": "./dist/agent/agent.handler.js",
16
+ "./agent/agent.operation": "./dist/agent/agent.operation.js",
17
+ "./agent/agent.presentation": "./dist/agent/agent.presentation.js",
18
+ "./agent/agent.schema": "./dist/agent/agent.schema.js",
19
+ "./agent/agent.test-spec": "./dist/agent/agent.test-spec.js",
20
+ "./docs": "./dist/docs/index.js",
21
+ "./docs/agent-console.docblock": "./dist/docs/agent-console.docblock.js",
22
+ "./example": "./dist/example.js",
23
+ "./handlers": "./dist/handlers/index.js",
24
+ "./handlers/agent.handlers": "./dist/handlers/agent.handlers.js",
25
+ "./presentations": "./dist/presentations/index.js",
26
+ "./run": "./dist/run/index.js",
27
+ "./run/run.entity": "./dist/run/run.entity.js",
28
+ "./run/run.enum": "./dist/run/run.enum.js",
29
+ "./run/run.event": "./dist/run/run.event.js",
30
+ "./run/run.handler": "./dist/run/run.handler.js",
31
+ "./run/run.operation": "./dist/run/run.operation.js",
32
+ "./run/run.presentation": "./dist/run/run.presentation.js",
33
+ "./run/run.schema": "./dist/run/run.schema.js",
34
+ "./run/run.test-spec": "./dist/run/run.test-spec.js",
35
+ "./seeders": "./dist/seeders/index.js",
36
+ "./shared": "./dist/shared/index.js",
37
+ "./shared/mock-agents": "./dist/shared/mock-agents.js",
38
+ "./shared/mock-runs": "./dist/shared/mock-runs.js",
39
+ "./shared/mock-tools": "./dist/shared/mock-tools.js",
40
+ "./shared/overlay-types": "./dist/shared/overlay-types.js",
41
+ "./tool": "./dist/tool/index.js",
42
+ "./tool/tool.entity": "./dist/tool/tool.entity.js",
43
+ "./tool/tool.enum": "./dist/tool/tool.enum.js",
44
+ "./tool/tool.event": "./dist/tool/tool.event.js",
45
+ "./tool/tool.handler": "./dist/tool/tool.handler.js",
46
+ "./tool/tool.operation": "./dist/tool/tool.operation.js",
47
+ "./tool/tool.presentation": "./dist/tool/tool.presentation.js",
48
+ "./tool/tool.schema": "./dist/tool/tool.schema.js",
49
+ "./tool/tool.test-spec": "./dist/tool/tool.test-spec.js",
50
+ "./ui": "./dist/ui/index.js",
51
+ "./ui/AgentDashboard": "./dist/ui/AgentDashboard.js",
52
+ "./ui/AgentRunList": "./dist/ui/AgentRunList.js",
53
+ "./ui/AgentToolRegistry": "./dist/ui/AgentToolRegistry.js",
54
+ "./ui/hooks": "./dist/ui/hooks/index.js",
55
+ "./ui/hooks/useAgentList": "./dist/ui/hooks/useAgentList.js",
56
+ "./ui/hooks/useAgentMutations": "./dist/ui/hooks/useAgentMutations.js",
57
+ "./ui/hooks/useRunList": "./dist/ui/hooks/useRunList.js",
58
+ "./ui/hooks/useToolList": "./dist/ui/hooks/useToolList.js",
59
+ "./ui/modals": "./dist/ui/modals/index.js",
60
+ "./ui/modals/AgentActionsModal": "./dist/ui/modals/AgentActionsModal.js",
61
+ "./ui/modals/CreateAgentModal": "./dist/ui/modals/CreateAgentModal.js",
62
+ "./ui/overlays": "./dist/ui/overlays/index.js",
63
+ "./ui/overlays/demo-overlays": "./dist/ui/overlays/demo-overlays.js",
64
+ "./ui/renderers": "./dist/ui/renderers/index.js",
65
+ "./ui/renderers/agent-list.markdown": "./dist/ui/renderers/agent-list.markdown.js",
66
+ "./ui/renderers/agent-list.renderer": "./dist/ui/renderers/agent-list.renderer.js",
67
+ "./ui/renderers/dashboard.markdown": "./dist/ui/renderers/dashboard.markdown.js",
68
+ "./ui/renderers/run-list.markdown": "./dist/ui/renderers/run-list.markdown.js",
69
+ "./ui/renderers/tool-registry.markdown": "./dist/ui/renderers/tool-registry.markdown.js",
70
+ "./ui/views": "./dist/ui/views/index.js",
71
+ "./ui/views/AgentListView": "./dist/ui/views/AgentListView.js",
72
+ "./ui/views/RunListView": "./dist/ui/views/RunListView.js",
73
+ "./ui/views/ToolRegistryView": "./dist/ui/views/ToolRegistryView.js",
74
+ "./*": "./*"
75
+ },
76
+ "scripts": {
77
+ "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
78
+ "publish:pkg:canary": "bun publish:pkg --tag canary",
79
+ "build": "bun build:types && bun build:bundle",
80
+ "build:bundle": "tsdown",
81
+ "build:types": "tsc --noEmit",
82
+ "dev": "bun build:bundle --watch",
83
+ "clean": "rimraf dist .turbo",
84
+ "lint": "bun lint:fix",
85
+ "lint:fix": "eslint src --fix",
86
+ "lint:check": "eslint src",
87
+ "test": "bun test"
88
+ },
89
+ "dependencies": {
90
+ "@contractspec/lib.schema": "0.0.0-canary-20260113170453",
91
+ "@contractspec/lib.contracts": "0.0.0-canary-20260113170453",
92
+ "@contractspec/lib.example-shared-ui": "0.0.0-canary-20260113170453",
93
+ "@contractspec/lib.design-system": "0.0.0-canary-20260113170453",
94
+ "@contractspec/lib.runtime-sandbox": "0.0.0-canary-20260113170453",
95
+ "react": "19.2.3",
96
+ "react-dom": "19.2.3"
97
+ },
98
+ "devDependencies": {
99
+ "@contractspec/tool.tsdown": "0.0.0-canary-20260113170453",
100
+ "@contractspec/tool.typescript": "0.0.0-canary-20260113170453",
101
+ "tsdown": "^0.19.0",
102
+ "typescript": "^5.9.3",
103
+ "@types/react": "^19.2.8",
104
+ "@types/react-dom": "^19.2.2"
105
+ },
106
+ "publishConfig": {
107
+ "exports": {
108
+ ".": "./dist/index.js",
109
+ "./agent": "./dist/agent/index.js",
110
+ "./agent.feature": "./dist/agent.feature.js",
111
+ "./agent/agent.contracts": "./dist/agent/agent.operations.js",
112
+ "./agent/agent.entity": "./dist/agent/agent.entity.js",
113
+ "./agent/agent.enum": "./dist/agent/agent.enum.js",
114
+ "./agent/agent.event": "./dist/agent/agent.event.js",
115
+ "./agent/agent.handler": "./dist/agent/agent.handler.js",
116
+ "./agent/agent.presentation": "./dist/agent/agent.presentation.js",
117
+ "./agent/agent.schema": "./dist/agent/agent.schema.js",
118
+ "./docs": "./dist/docs/index.js",
119
+ "./docs/agent-console.docblock": "./dist/docs/agent-console.docblock.js",
120
+ "./example": "./dist/example.js",
121
+ "./handlers": "./dist/handlers/index.js",
122
+ "./presentations": "./dist/presentations/index.js",
123
+ "./run": "./dist/run/index.js",
124
+ "./run/run.contracts": "./dist/run/run.operations.js",
125
+ "./run/run.entity": "./dist/run/run.entity.js",
126
+ "./run/run.enum": "./dist/run/run.enum.js",
127
+ "./run/run.event": "./dist/run/run.event.js",
128
+ "./run/run.handler": "./dist/run/run.handler.js",
129
+ "./run/run.presentation": "./dist/run/run.presentation.js",
130
+ "./run/run.schema": "./dist/run/run.schema.js",
131
+ "./shared": "./dist/shared/index.js",
132
+ "./shared/mock-agents": "./dist/shared/mock-agents.js",
133
+ "./shared/mock-runs": "./dist/shared/mock-runs.js",
134
+ "./shared/mock-tools": "./dist/shared/mock-tools.js",
135
+ "./tool": "./dist/tool/index.js",
136
+ "./tool/tool.contracts": "./dist/tool/tool.operations.js",
137
+ "./tool/tool.entity": "./dist/tool/tool.entity.js",
138
+ "./tool/tool.enum": "./dist/tool/tool.enum.js",
139
+ "./tool/tool.event": "./dist/tool/tool.event.js",
140
+ "./tool/tool.handler": "./dist/tool/tool.handler.js",
141
+ "./tool/tool.presentation": "./dist/tool/tool.presentation.js",
142
+ "./tool/tool.schema": "./dist/tool/tool.schema.js",
143
+ "./*": "./*"
144
+ },
145
+ "registry": "https://registry.npmjs.org/",
146
+ "access": "public"
147
+ },
148
+ "license": "MIT",
149
+ "repository": {
150
+ "type": "git",
151
+ "url": "https://github.com/lssm-tech/contractspec.git",
152
+ "directory": "packages/examples/agent-console"
153
+ },
154
+ "homepage": "https://contractspec.io"
155
+ }
@@ -0,0 +1,137 @@
1
+ import {
2
+ defineEntity,
3
+ defineEntityEnum,
4
+ field,
5
+ index,
6
+ } from '@contractspec/lib.schema';
7
+
8
+ /**
9
+ * Agent status for lifecycle management.
10
+ */
11
+ export const AgentStatusEntityEnum = defineEntityEnum({
12
+ name: 'AgentStatus',
13
+ values: ['DRAFT', 'ACTIVE', 'PAUSED', 'ARCHIVED'],
14
+ description: 'Lifecycle status of the agent',
15
+ });
16
+
17
+ /**
18
+ * Agent model provider.
19
+ */
20
+ export const ModelProviderEntityEnum = defineEntityEnum({
21
+ name: 'ModelProvider',
22
+ values: ['OPENAI', 'ANTHROPIC', 'GOOGLE', 'MISTRAL', 'CUSTOM'],
23
+ description: 'AI model provider',
24
+ });
25
+
26
+ /**
27
+ * Agent entity - Represents an AI agent configuration.
28
+ */
29
+ export const AgentEntity = defineEntity({
30
+ name: 'Agent',
31
+ schema: 'agent_console',
32
+ description:
33
+ 'Represents an AI agent configuration with assigned tools and parameters.',
34
+ fields: {
35
+ id: field.id(),
36
+ organizationId: field.string({
37
+ description: 'Organization that owns this agent',
38
+ }),
39
+ name: field.string({ description: 'Agent name (1-100 chars)' }),
40
+ slug: field.string({
41
+ description: 'URL-safe identifier (lowercase, numbers, hyphens)',
42
+ }),
43
+ description: field.string({
44
+ isOptional: true,
45
+ description: 'Agent description (max 1000 chars)',
46
+ }),
47
+ status: field.enum('AgentStatus', { default: 'DRAFT' }),
48
+ modelProvider: field.enum('ModelProvider', { default: 'OPENAI' }),
49
+ modelName: field.string({
50
+ description: "Model identifier: 'gpt-4', 'claude-3-opus', etc.",
51
+ }),
52
+ modelConfig: field.json({
53
+ isOptional: true,
54
+ description: 'Model parameters: temperature, max_tokens, etc.',
55
+ }),
56
+ systemPrompt: field.string({ description: 'System prompt for the agent' }),
57
+ userPromptTemplate: field.string({
58
+ isOptional: true,
59
+ description: 'Template for user prompts',
60
+ }),
61
+ toolIds: field.string({
62
+ isArray: true,
63
+ isOptional: true,
64
+ description: 'IDs of assigned tools',
65
+ }),
66
+ toolChoice: field.string({
67
+ default: 'auto',
68
+ description: "Tool selection mode: 'auto', 'required', 'none'",
69
+ }),
70
+ maxIterations: field.int({
71
+ default: 10,
72
+ description: 'Maximum iterations per run',
73
+ }),
74
+ maxTokensPerRun: field.int({
75
+ isOptional: true,
76
+ description: 'Maximum tokens per run',
77
+ }),
78
+ timeoutMs: field.int({
79
+ default: 120000,
80
+ description: 'Execution timeout in milliseconds',
81
+ }),
82
+ version: field.string({ default: '1.0.0', description: 'Agent version' }),
83
+ tags: field.string({
84
+ isArray: true,
85
+ isOptional: true,
86
+ description: 'Tags for categorization',
87
+ }),
88
+ createdAt: field.createdAt(),
89
+ updatedAt: field.updatedAt(),
90
+ createdById: field.string({
91
+ isOptional: true,
92
+ description: 'User who created this agent',
93
+ }),
94
+ tools: field.hasMany('Tool', {
95
+ description: 'Tools assigned to this agent',
96
+ }),
97
+ },
98
+ indexes: [
99
+ index.unique(['organizationId', 'slug']),
100
+ index.on(['organizationId', 'status']),
101
+ index.on(['modelProvider', 'modelName']),
102
+ ],
103
+ enums: [AgentStatusEntityEnum, ModelProviderEntityEnum],
104
+ });
105
+
106
+ /**
107
+ * AgentTool join entity - Links agents to their assigned tools.
108
+ */
109
+ export const AgentToolEntity = defineEntity({
110
+ name: 'AgentTool',
111
+ schema: 'agent_console',
112
+ description: 'Links an agent to its assigned tools with configuration.',
113
+ fields: {
114
+ id: field.id(),
115
+ agentId: field.foreignKey({ description: 'Agent ID' }),
116
+ toolId: field.foreignKey({ description: 'Tool ID' }),
117
+ config: field.json({
118
+ isOptional: true,
119
+ description: 'Tool-specific configuration for this agent',
120
+ }),
121
+ order: field.int({
122
+ default: 0,
123
+ description: 'Order of tool in agent tool list',
124
+ }),
125
+ isEnabled: field.boolean({
126
+ default: true,
127
+ description: 'Whether tool is enabled for this agent',
128
+ }),
129
+ createdAt: field.createdAt(),
130
+ agent: field.belongsTo('Agent', ['agentId'], ['id']),
131
+ tool: field.belongsTo('Tool', ['toolId'], ['id']),
132
+ },
133
+ indexes: [
134
+ index.unique(['agentId', 'toolId']),
135
+ index.on(['agentId', 'order']),
136
+ ],
137
+ });
@@ -0,0 +1,31 @@
1
+ import { defineEnum } from '@contractspec/lib.schema';
2
+
3
+ /**
4
+ * Agent status enum.
5
+ */
6
+ export const AgentStatusEnum = defineEnum('AgentStatus', [
7
+ 'DRAFT',
8
+ 'ACTIVE',
9
+ 'PAUSED',
10
+ 'ARCHIVED',
11
+ ]);
12
+
13
+ /**
14
+ * Model provider enum.
15
+ */
16
+ export const ModelProviderEnum = defineEnum('ModelProvider', [
17
+ 'OPENAI',
18
+ 'ANTHROPIC',
19
+ 'GOOGLE',
20
+ 'MISTRAL',
21
+ 'CUSTOM',
22
+ ]);
23
+
24
+ /**
25
+ * Tool choice mode enum.
26
+ */
27
+ export const ToolChoiceEnum = defineEnum('ToolChoice', [
28
+ 'auto',
29
+ 'required',
30
+ 'none',
31
+ ]);