@contractspec/example.agent-console 3.7.6 → 3.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/.turbo/turbo-build.log +126 -105
  2. package/AGENTS.md +52 -31
  3. package/CHANGELOG.md +29 -0
  4. package/README.md +112 -83
  5. package/dist/agent/agent.event.js +1 -1
  6. package/dist/agent/agent.handler.d.ts +3 -0
  7. package/dist/agent/agent.handler.js +730 -1
  8. package/dist/agent/agent.operation.js +1 -1
  9. package/dist/agent/index.d.ts +5 -5
  10. package/dist/agent/index.js +74 -73
  11. package/dist/agent.feature.js +179 -0
  12. package/dist/browser/agent/agent.event.js +1 -1
  13. package/dist/browser/agent/agent.handler.js +730 -1
  14. package/dist/browser/agent/agent.operation.js +1 -1
  15. package/dist/browser/agent/index.js +74 -73
  16. package/dist/browser/agent.feature.js +179 -0
  17. package/dist/browser/docs/agent-console.docblock.js +11 -8
  18. package/dist/browser/docs/index.js +11 -8
  19. package/dist/browser/example.js +2 -3
  20. package/dist/browser/handlers/agent.handlers.js +1883 -2
  21. package/dist/browser/handlers/index.js +2142 -8
  22. package/dist/browser/index.js +4075 -3161
  23. package/dist/browser/presentations/index.js +51 -51
  24. package/dist/browser/run/index.js +380 -374
  25. package/dist/browser/run/run.event.js +2 -2
  26. package/dist/browser/run/run.handler.js +666 -1
  27. package/dist/browser/run/run.presentation.js +2 -2
  28. package/dist/browser/shared/index.js +293 -1
  29. package/dist/browser/shared/mock-runs.js +5 -0
  30. package/dist/browser/tool/index.js +161 -161
  31. package/dist/browser/tool/tool.event.js +1 -1
  32. package/dist/browser/tool/tool.handler.js +479 -3
  33. package/dist/browser/tool/tool.presentation.js +2 -2
  34. package/dist/browser/ui/AgentDashboard.js +1816 -931
  35. package/dist/browser/ui/AgentDashboard.visualizations.js +217 -0
  36. package/dist/browser/ui/AgentRunList.js +360 -128
  37. package/dist/browser/ui/AgentToolRegistry.js +9 -9
  38. package/dist/browser/ui/hooks/index.js +611 -161
  39. package/dist/browser/ui/hooks/useAgentList.js +1 -1
  40. package/dist/browser/ui/hooks/useAgentMutations.js +444 -9
  41. package/dist/browser/ui/hooks/useRunList.js +26 -11
  42. package/dist/browser/ui/hooks/useToolList.js +1 -1
  43. package/dist/browser/ui/index.js +2161 -1258
  44. package/dist/browser/ui/modals/AgentActionsModal.js +13 -13
  45. package/dist/browser/ui/modals/CreateAgentModal.js +15 -15
  46. package/dist/browser/ui/modals/index.js +297 -297
  47. package/dist/browser/ui/renderers/agent-list.markdown.js +14 -5
  48. package/dist/browser/ui/renderers/agent-list.renderer.js +7 -7
  49. package/dist/browser/ui/renderers/dashboard.markdown.js +207 -36
  50. package/dist/browser/ui/renderers/index.js +359 -163
  51. package/dist/browser/ui/renderers/run-list.markdown.js +9 -4
  52. package/dist/browser/ui/renderers/tool-registry.markdown.js +15 -4
  53. package/dist/browser/ui/views/AgentListView.js +7 -7
  54. package/dist/browser/ui/views/RunDataTable.js +326 -0
  55. package/dist/browser/ui/views/RunListView.js +360 -128
  56. package/dist/browser/ui/views/ToolRegistryView.js +9 -9
  57. package/dist/browser/ui/views/index.js +478 -246
  58. package/dist/browser/ui/views/run-data-table.columns.js +271 -0
  59. package/dist/browser/ui/views/run-list.shared.js +177 -0
  60. package/dist/browser/visualizations/catalog.js +134 -0
  61. package/dist/browser/visualizations/index.js +187 -0
  62. package/dist/browser/visualizations/selectors.js +181 -0
  63. package/dist/docs/agent-console.docblock.js +11 -8
  64. package/dist/docs/index.js +11 -8
  65. package/dist/example.js +2 -3
  66. package/dist/example.test.d.ts +1 -0
  67. package/dist/handlers/agent.handlers.d.ts +2 -0
  68. package/dist/handlers/agent.handlers.js +1883 -2
  69. package/dist/handlers/index.d.ts +2 -4
  70. package/dist/handlers/index.js +2142 -8
  71. package/dist/handlers/mock-handlers.test.d.ts +1 -0
  72. package/dist/index.d.ts +6 -4
  73. package/dist/index.js +4075 -3161
  74. package/dist/node/agent/agent.event.js +1 -1
  75. package/dist/node/agent/agent.handler.js +730 -1
  76. package/dist/node/agent/agent.operation.js +1 -1
  77. package/dist/node/agent/index.js +74 -73
  78. package/dist/node/agent.feature.js +179 -0
  79. package/dist/node/docs/agent-console.docblock.js +11 -8
  80. package/dist/node/docs/index.js +11 -8
  81. package/dist/node/example.js +2 -3
  82. package/dist/node/handlers/agent.handlers.js +1883 -2
  83. package/dist/node/handlers/index.js +2142 -8
  84. package/dist/node/index.js +4075 -3161
  85. package/dist/node/presentations/index.js +51 -51
  86. package/dist/node/run/index.js +380 -374
  87. package/dist/node/run/run.event.js +2 -2
  88. package/dist/node/run/run.handler.js +666 -1
  89. package/dist/node/run/run.presentation.js +2 -2
  90. package/dist/node/shared/index.js +293 -1
  91. package/dist/node/shared/mock-runs.js +5 -0
  92. package/dist/node/tool/index.js +161 -161
  93. package/dist/node/tool/tool.event.js +1 -1
  94. package/dist/node/tool/tool.handler.js +479 -3
  95. package/dist/node/tool/tool.presentation.js +2 -2
  96. package/dist/node/ui/AgentDashboard.js +1816 -931
  97. package/dist/node/ui/AgentDashboard.visualizations.js +217 -0
  98. package/dist/node/ui/AgentRunList.js +360 -128
  99. package/dist/node/ui/AgentToolRegistry.js +9 -9
  100. package/dist/node/ui/hooks/index.js +611 -161
  101. package/dist/node/ui/hooks/useAgentList.js +1 -1
  102. package/dist/node/ui/hooks/useAgentMutations.js +444 -9
  103. package/dist/node/ui/hooks/useRunList.js +26 -11
  104. package/dist/node/ui/hooks/useToolList.js +1 -1
  105. package/dist/node/ui/index.js +2161 -1258
  106. package/dist/node/ui/modals/AgentActionsModal.js +13 -13
  107. package/dist/node/ui/modals/CreateAgentModal.js +15 -15
  108. package/dist/node/ui/modals/index.js +297 -297
  109. package/dist/node/ui/renderers/agent-list.markdown.js +14 -5
  110. package/dist/node/ui/renderers/agent-list.renderer.js +7 -7
  111. package/dist/node/ui/renderers/dashboard.markdown.js +207 -36
  112. package/dist/node/ui/renderers/index.js +359 -163
  113. package/dist/node/ui/renderers/run-list.markdown.js +9 -4
  114. package/dist/node/ui/renderers/tool-registry.markdown.js +15 -4
  115. package/dist/node/ui/views/AgentListView.js +7 -7
  116. package/dist/node/ui/views/RunDataTable.js +326 -0
  117. package/dist/node/ui/views/RunListView.js +360 -128
  118. package/dist/node/ui/views/ToolRegistryView.js +9 -9
  119. package/dist/node/ui/views/index.js +478 -246
  120. package/dist/node/ui/views/run-data-table.columns.js +271 -0
  121. package/dist/node/ui/views/run-list.shared.js +177 -0
  122. package/dist/node/visualizations/catalog.js +134 -0
  123. package/dist/node/visualizations/index.js +187 -0
  124. package/dist/node/visualizations/selectors.js +181 -0
  125. package/dist/presentations/index.d.ts +3 -5
  126. package/dist/presentations/index.js +51 -51
  127. package/dist/proof/index.d.ts +2 -0
  128. package/dist/proof/meetup-proof.d.ts +10 -0
  129. package/dist/proof/meetup-proof.runtime.d.ts +22 -0
  130. package/dist/proof/meetup-proof.scenario.d.ts +2 -0
  131. package/dist/proof/meetup-proof.suite.d.ts +1 -0
  132. package/dist/proof/meetup-proof.test.d.ts +1 -0
  133. package/dist/run/index.d.ts +7 -7
  134. package/dist/run/index.js +380 -374
  135. package/dist/run/run.event.js +2 -2
  136. package/dist/run/run.handler.d.ts +7 -0
  137. package/dist/run/run.handler.js +666 -1
  138. package/dist/run/run.presentation.js +2 -2
  139. package/dist/shared/demo-dashboard-data.d.ts +16 -0
  140. package/dist/shared/demo-runtime-seed.d.ts +17 -0
  141. package/dist/shared/demo-runtime.d.ts +8 -0
  142. package/dist/shared/demo-runtime.test.d.ts +1 -0
  143. package/dist/shared/index.d.ts +4 -1
  144. package/dist/shared/index.js +293 -1
  145. package/dist/shared/mock-runs.d.ts +4 -0
  146. package/dist/shared/mock-runs.js +5 -0
  147. package/dist/tool/index.d.ts +7 -7
  148. package/dist/tool/index.js +161 -161
  149. package/dist/tool/tool.event.js +1 -1
  150. package/dist/tool/tool.handler.d.ts +3 -0
  151. package/dist/tool/tool.handler.js +479 -3
  152. package/dist/tool/tool.presentation.js +2 -2
  153. package/dist/ui/AgentDashboard.js +1816 -931
  154. package/dist/ui/AgentDashboard.sandbox.test.d.ts +1 -0
  155. package/dist/ui/AgentDashboard.visualizations.d.ts +4 -0
  156. package/dist/ui/AgentDashboard.visualizations.js +218 -0
  157. package/dist/ui/AgentRunList.js +360 -128
  158. package/dist/ui/AgentToolRegistry.js +9 -9
  159. package/dist/ui/hooks/index.d.ts +4 -4
  160. package/dist/ui/hooks/index.js +611 -161
  161. package/dist/ui/hooks/useAgentList.d.ts +5 -0
  162. package/dist/ui/hooks/useAgentList.js +1 -1
  163. package/dist/ui/hooks/useAgentMutations.d.ts +9 -2
  164. package/dist/ui/hooks/useAgentMutations.js +444 -9
  165. package/dist/ui/hooks/useRunList.d.ts +13 -2
  166. package/dist/ui/hooks/useRunList.js +26 -11
  167. package/dist/ui/hooks/useToolList.d.ts +5 -0
  168. package/dist/ui/hooks/useToolList.js +1 -1
  169. package/dist/ui/index.d.ts +3 -3
  170. package/dist/ui/index.js +2161 -1258
  171. package/dist/ui/modals/AgentActionsModal.js +13 -13
  172. package/dist/ui/modals/CreateAgentModal.js +15 -15
  173. package/dist/ui/modals/index.d.ts +1 -1
  174. package/dist/ui/modals/index.js +297 -297
  175. package/dist/ui/renderers/agent-list.markdown.d.ts +5 -0
  176. package/dist/ui/renderers/agent-list.markdown.js +14 -5
  177. package/dist/ui/renderers/agent-list.renderer.js +7 -7
  178. package/dist/ui/renderers/dashboard.markdown.d.ts +5 -0
  179. package/dist/ui/renderers/dashboard.markdown.js +207 -36
  180. package/dist/ui/renderers/index.d.ts +2 -2
  181. package/dist/ui/renderers/index.js +359 -163
  182. package/dist/ui/renderers/run-list.markdown.d.ts +5 -0
  183. package/dist/ui/renderers/run-list.markdown.js +9 -4
  184. package/dist/ui/renderers/tool-registry.markdown.d.ts +6 -1
  185. package/dist/ui/renderers/tool-registry.markdown.js +15 -4
  186. package/dist/ui/views/AgentListView.js +7 -7
  187. package/dist/ui/views/RunDataTable.d.ts +18 -0
  188. package/dist/ui/views/RunDataTable.js +327 -0
  189. package/dist/ui/views/RunListView.js +360 -128
  190. package/dist/ui/views/ToolRegistryView.js +9 -9
  191. package/dist/ui/views/index.js +478 -246
  192. package/dist/ui/views/run-data-table.columns.d.ts +3 -0
  193. package/dist/ui/views/run-data-table.columns.js +272 -0
  194. package/dist/ui/views/run-list.shared.d.ts +14 -0
  195. package/dist/ui/views/run-list.shared.js +178 -0
  196. package/dist/visualizations/catalog.d.ts +10 -0
  197. package/dist/visualizations/catalog.js +135 -0
  198. package/dist/visualizations/index.d.ts +2 -0
  199. package/dist/visualizations/index.js +188 -0
  200. package/dist/visualizations/selectors.d.ts +3 -0
  201. package/dist/visualizations/selectors.js +182 -0
  202. package/dist/visualizations/selectors.test.d.ts +1 -0
  203. package/package.json +114 -12
  204. package/proofs/agent-console-meetup.replay.json +220 -0
  205. package/src/agent/agent.entity.ts +111 -111
  206. package/src/agent/agent.enum.ts +12 -12
  207. package/src/agent/agent.event.ts +91 -91
  208. package/src/agent/agent.handler.ts +144 -127
  209. package/src/agent/agent.operation.ts +400 -400
  210. package/src/agent/agent.presentation.ts +62 -62
  211. package/src/agent/agent.schema.ts +175 -175
  212. package/src/agent/agent.test-spec.ts +48 -48
  213. package/src/agent/index.ts +46 -51
  214. package/src/agent.capability.ts +11 -11
  215. package/src/agent.feature.ts +134 -131
  216. package/src/docs/agent-console.docblock.ts +52 -49
  217. package/src/example.test.ts +75 -0
  218. package/src/example.ts +34 -35
  219. package/src/handlers/agent.handlers.ts +576 -522
  220. package/src/handlers/index.ts +30 -14
  221. package/src/handlers/mock-handlers.test.ts +77 -0
  222. package/src/index.ts +10 -9
  223. package/src/presentations/index.ts +11 -13
  224. package/src/proof/index.ts +2 -0
  225. package/src/proof/meetup-proof.runtime.ts +196 -0
  226. package/src/proof/meetup-proof.scenario.ts +99 -0
  227. package/src/proof/meetup-proof.suite.ts +29 -0
  228. package/src/proof/meetup-proof.test.ts +28 -0
  229. package/src/proof/meetup-proof.ts +130 -0
  230. package/src/run/index.ts +49 -54
  231. package/src/run/run.entity.ts +137 -137
  232. package/src/run/run.enum.ts +18 -18
  233. package/src/run/run.event.ts +174 -174
  234. package/src/run/run.handler.ts +113 -96
  235. package/src/run/run.operation.ts +474 -474
  236. package/src/run/run.presentation.ts +42 -42
  237. package/src/run/run.schema.ts +126 -126
  238. package/src/run/run.test-spec.ts +48 -48
  239. package/src/seeders/index.ts +21 -21
  240. package/src/shared/demo-dashboard-data.ts +58 -0
  241. package/src/shared/demo-runtime-seed.ts +139 -0
  242. package/src/shared/demo-runtime.test.ts +169 -0
  243. package/src/shared/demo-runtime.ts +260 -0
  244. package/src/shared/index.ts +12 -1
  245. package/src/shared/mock-agents.ts +76 -76
  246. package/src/shared/mock-runs.ts +107 -102
  247. package/src/shared/mock-tools.ts +140 -140
  248. package/src/shared/overlay-types.ts +23 -23
  249. package/src/tool/index.ts +39 -44
  250. package/src/tool/tool.entity.ts +73 -73
  251. package/src/tool/tool.enum.ts +13 -13
  252. package/src/tool/tool.event.ts +80 -80
  253. package/src/tool/tool.handler.ts +124 -107
  254. package/src/tool/tool.operation.ts +328 -328
  255. package/src/tool/tool.presentation.ts +43 -43
  256. package/src/tool/tool.schema.ts +106 -106
  257. package/src/tool/tool.test-spec.ts +48 -48
  258. package/src/ui/AgentDashboard.sandbox.test.tsx +312 -0
  259. package/src/ui/AgentDashboard.tsx +351 -348
  260. package/src/ui/AgentDashboard.visualizations.tsx +35 -0
  261. package/src/ui/hooks/index.ts +7 -7
  262. package/src/ui/hooks/useAgentList.ts +57 -56
  263. package/src/ui/hooks/useAgentMutations.ts +168 -159
  264. package/src/ui/hooks/useRunList.ts +90 -57
  265. package/src/ui/hooks/useToolList.ts +102 -101
  266. package/src/ui/index.ts +6 -9
  267. package/src/ui/modals/AgentActionsModal.tsx +262 -262
  268. package/src/ui/modals/CreateAgentModal.tsx +232 -232
  269. package/src/ui/modals/index.ts +1 -1
  270. package/src/ui/overlays/demo-overlays.ts +52 -52
  271. package/src/ui/renderers/agent-list.markdown.ts +81 -61
  272. package/src/ui/renderers/agent-list.renderer.tsx +14 -14
  273. package/src/ui/renderers/dashboard.markdown.ts +135 -139
  274. package/src/ui/renderers/index.ts +3 -4
  275. package/src/ui/renderers/run-list.markdown.ts +56 -47
  276. package/src/ui/renderers/tool-registry.markdown.ts +79 -66
  277. package/src/ui/views/AgentListView.tsx +90 -90
  278. package/src/ui/views/RunDataTable.tsx +74 -0
  279. package/src/ui/views/RunListView.tsx +84 -158
  280. package/src/ui/views/ToolRegistryView.tsx +113 -113
  281. package/src/ui/views/run-data-table.columns.tsx +102 -0
  282. package/src/ui/views/run-list.shared.tsx +139 -0
  283. package/src/visualizations/catalog.ts +132 -0
  284. package/src/visualizations/index.ts +2 -0
  285. package/src/visualizations/selectors.test.ts +12 -0
  286. package/src/visualizations/selectors.ts +70 -0
  287. package/tsconfig.json +7 -8
  288. package/tsdown.config.js +24 -3
@@ -1,6 +1,184 @@
1
+ // src/visualizations/catalog.ts
2
+ import {
3
+ defineVisualization,
4
+ VisualizationRegistry
5
+ } from "@contractspec/lib.contracts-spec/visualizations";
6
+ var RUN_LIST_REF = { key: "agent.run.list", version: "1.0.0" };
7
+ var META = {
8
+ version: "1.0.0",
9
+ domain: "ai-ops",
10
+ stability: "experimental",
11
+ owners: ["@example.agent-console"],
12
+ tags: ["agent-console", "visualization", "operations"]
13
+ };
14
+ var AgentRunStatusVisualization = defineVisualization({
15
+ meta: {
16
+ ...META,
17
+ key: "agent-console.visualization.run-status",
18
+ title: "Run Status Breakdown",
19
+ description: "Distribution of run outcomes across the current sample.",
20
+ goal: "Make operational success and failure mix visible at a glance.",
21
+ context: "Agent operations overview."
22
+ },
23
+ source: { primary: RUN_LIST_REF, resultPath: "data" },
24
+ visualization: {
25
+ kind: "pie",
26
+ nameDimension: "status",
27
+ valueMeasure: "runs",
28
+ dimensions: [
29
+ { key: "status", label: "Status", dataPath: "status", type: "category" }
30
+ ],
31
+ measures: [
32
+ { key: "runs", label: "Runs", dataPath: "runs", format: "number" }
33
+ ],
34
+ table: { caption: "Run counts by status." }
35
+ }
36
+ });
37
+ var AgentRunActivityVisualization = defineVisualization({
38
+ meta: {
39
+ ...META,
40
+ key: "agent-console.visualization.run-activity",
41
+ title: "Recent Run Activity",
42
+ description: "Daily run volume across the current sample.",
43
+ goal: "Show whether agent activity is rising or slowing down.",
44
+ context: "Operations trend monitoring."
45
+ },
46
+ source: { primary: RUN_LIST_REF, resultPath: "data" },
47
+ visualization: {
48
+ kind: "cartesian",
49
+ variant: "line",
50
+ xDimension: "day",
51
+ yMeasures: ["runs"],
52
+ dimensions: [{ key: "day", label: "Day", dataPath: "day", type: "time" }],
53
+ measures: [
54
+ {
55
+ key: "runs",
56
+ label: "Runs",
57
+ dataPath: "runs",
58
+ format: "number",
59
+ color: "#0f766e"
60
+ }
61
+ ],
62
+ table: { caption: "Daily run counts." }
63
+ }
64
+ });
65
+ var AgentRunEfficiencyVisualization = defineVisualization({
66
+ meta: {
67
+ ...META,
68
+ key: "agent-console.visualization.run-efficiency",
69
+ title: "Duration vs Tokens",
70
+ description: "Scatter chart comparing token consumption and runtime.",
71
+ goal: "Reveal outlier runs that are slow relative to their token usage.",
72
+ context: "Operational performance diagnostics."
73
+ },
74
+ source: { primary: RUN_LIST_REF, resultPath: "data" },
75
+ visualization: {
76
+ kind: "cartesian",
77
+ variant: "scatter",
78
+ xDimension: "totalTokens",
79
+ yMeasures: ["durationMs"],
80
+ dimensions: [
81
+ {
82
+ key: "totalTokens",
83
+ label: "Total Tokens",
84
+ dataPath: "totalTokens",
85
+ type: "number"
86
+ }
87
+ ],
88
+ measures: [
89
+ {
90
+ key: "durationMs",
91
+ label: "Duration",
92
+ dataPath: "durationMs",
93
+ format: "duration",
94
+ color: "#7c3aed"
95
+ },
96
+ {
97
+ key: "estimatedCostUsd",
98
+ label: "Cost",
99
+ dataPath: "estimatedCostUsd",
100
+ format: "currency"
101
+ }
102
+ ],
103
+ series: [
104
+ {
105
+ key: "runs",
106
+ label: "Runs",
107
+ measure: "durationMs",
108
+ type: "scatter",
109
+ color: "#7c3aed"
110
+ }
111
+ ],
112
+ table: { caption: "Run duration versus token usage." }
113
+ }
114
+ });
115
+ var AgentVisualizationSpecs = [
116
+ AgentRunStatusVisualization,
117
+ AgentRunActivityVisualization,
118
+ AgentRunEfficiencyVisualization
119
+ ];
120
+ var AgentVisualizationRegistry = new VisualizationRegistry([
121
+ ...AgentVisualizationSpecs
122
+ ]);
123
+ var AgentVisualizationRefs = AgentVisualizationSpecs.map((spec) => ({
124
+ key: spec.meta.key,
125
+ version: spec.meta.version
126
+ }));
127
+
128
+ // src/visualizations/selectors.ts
129
+ function dayKey(value) {
130
+ if (!value)
131
+ return "unknown";
132
+ return value.toISOString().slice(0, 10);
133
+ }
134
+ function createAgentVisualizationItems(runs) {
135
+ const statusCounts = new Map;
136
+ const activityCounts = new Map;
137
+ for (const run of runs) {
138
+ statusCounts.set(run.status, (statusCounts.get(run.status) ?? 0) + 1);
139
+ activityCounts.set(dayKey(run.startedAt ?? run.queuedAt), (activityCounts.get(dayKey(run.startedAt ?? run.queuedAt)) ?? 0) + 1);
140
+ }
141
+ return [
142
+ {
143
+ key: "run-status",
144
+ spec: AgentRunStatusVisualization,
145
+ data: {
146
+ data: Array.from(statusCounts.entries()).map(([status, count]) => ({
147
+ status,
148
+ runs: count
149
+ }))
150
+ },
151
+ title: "Run Status Breakdown",
152
+ description: "Completed, failed, running, and cancelled runs in the sample.",
153
+ height: 260
154
+ },
155
+ {
156
+ key: "run-activity",
157
+ spec: AgentRunActivityVisualization,
158
+ data: {
159
+ data: Array.from(activityCounts.entries()).sort(([left], [right]) => left.localeCompare(right)).map(([day, count]) => ({ day, runs: count }))
160
+ },
161
+ title: "Recent Run Activity",
162
+ description: "Daily run volume derived from run start times."
163
+ },
164
+ {
165
+ key: "run-efficiency",
166
+ spec: AgentRunEfficiencyVisualization,
167
+ data: {
168
+ data: runs.filter((run) => typeof run.durationMs === "number").map((run) => ({
169
+ totalTokens: run.totalTokens,
170
+ durationMs: run.durationMs ?? 0,
171
+ estimatedCostUsd: run.estimatedCostUsd
172
+ }))
173
+ },
174
+ title: "Duration vs Tokens",
175
+ description: "Operational scatter plot for spotting inefficient runs."
176
+ }
177
+ ];
178
+ }
1
179
  // src/ui/hooks/useAgentList.ts
2
- import { useCallback, useEffect, useMemo, useState } from "react";
3
180
  import { useTemplateRuntime } from "@contractspec/lib.example-shared-ui";
181
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
182
  function useAgentList(options = {}) {
5
183
  const { handlers, projectId } = useTemplateRuntime();
6
184
  const { agent } = handlers;
@@ -51,16 +229,78 @@ function useAgentList(options = {}) {
51
229
  };
52
230
  }
53
231
 
232
+ // src/ui/renderers/agent-list.markdown.ts
233
+ import {
234
+ AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
235
+ AGENT_CONSOLE_DEMO_PROJECT_ID,
236
+ createAgentConsoleDemoHandlers
237
+ } from "@contractspec/example.agent-console/shared";
238
+ var agentListMarkdownRenderer = {
239
+ target: "markdown",
240
+ render: async (desc, ctx) => {
241
+ if (desc.source.type !== "component" || desc.source.componentKey !== "AgentListView") {
242
+ throw new Error("agentListMarkdownRenderer: not AgentListView");
243
+ }
244
+ const data = Array.isArray(ctx?.data) ? {
245
+ items: ctx.data,
246
+ total: ctx.data.length,
247
+ hasMore: false
248
+ } : await createAgentConsoleDemoHandlers({
249
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID
250
+ }).listAgents({
251
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID,
252
+ organizationId: AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
253
+ limit: 50,
254
+ offset: 0
255
+ });
256
+ const lines = [
257
+ `# ${desc.meta.description ?? "Agent List"}`,
258
+ "",
259
+ `> ${desc.meta.key} v${desc.meta.version}`,
260
+ "",
261
+ `**Total Agents:** ${data.total}`,
262
+ "",
263
+ "## Agents",
264
+ ""
265
+ ];
266
+ const byStatus = {};
267
+ for (const agent of data.items) {
268
+ const status = agent.status;
269
+ if (byStatus[status]) {
270
+ byStatus[status].push(agent);
271
+ } else {
272
+ byStatus[status] = [agent];
273
+ }
274
+ }
275
+ for (const [status, agents] of Object.entries(byStatus)) {
276
+ lines.push(`### ${status} (${agents.length})`);
277
+ lines.push("");
278
+ for (const agent of agents) {
279
+ lines.push(`- **${agent.name}** (${agent.modelProvider}/${agent.modelName})`);
280
+ if (agent.description) {
281
+ lines.push(` > ${agent.description}`);
282
+ }
283
+ }
284
+ lines.push("");
285
+ }
286
+ return {
287
+ mimeType: "text/markdown",
288
+ body: lines.join(`
289
+ `)
290
+ };
291
+ }
292
+ };
293
+
54
294
  // src/ui/views/AgentListView.tsx
55
295
  import {
56
296
  Button,
57
- StatCard,
58
- StatCardGroup,
297
+ EmptyState,
59
298
  EntityCard,
60
- StatusChip,
61
- LoaderBlock,
62
299
  ErrorState,
63
- EmptyState
300
+ LoaderBlock,
301
+ StatCard,
302
+ StatCardGroup,
303
+ StatusChip
64
304
  } from "@contractspec/lib.design-system";
65
305
  import { jsxDEV } from "react/jsx-dev-runtime";
66
306
  "use client";
@@ -125,7 +365,7 @@ function AgentListView() {
125
365
  className: "flex items-center justify-between",
126
366
  children: [
127
367
  /* @__PURE__ */ jsxDEV("h3", {
128
- className: "text-lg font-semibold",
368
+ className: "font-semibold text-lg",
129
369
  children: "Agents"
130
370
  }, undefined, false, undefined, this),
131
371
  /* @__PURE__ */ jsxDEV(Button, {
@@ -176,50 +416,105 @@ var agentListReactRenderer = {
176
416
  }
177
417
  };
178
418
 
179
- // src/ui/renderers/agent-list.markdown.ts
419
+ // src/ui/renderers/dashboard.markdown.ts
180
420
  import {
181
- mockListAgentsHandler
182
- } from "@contractspec/example.agent-console/handlers";
183
- var agentListMarkdownRenderer = {
421
+ getFallbackAgentConsoleDashboardData
422
+ } from "@contractspec/example.agent-console/shared";
423
+ function formatDuration(ms) {
424
+ if (ms < 1000)
425
+ return `${ms}ms`;
426
+ if (ms < 60000)
427
+ return `${(ms / 1000).toFixed(1)}s`;
428
+ return `${(ms / 60000).toFixed(1)}m`;
429
+ }
430
+ var agentDashboardMarkdownRenderer = {
184
431
  target: "markdown",
185
- render: async (desc) => {
186
- if (desc.source.type !== "component" || desc.source.componentKey !== "AgentListView") {
187
- throw new Error("agentListMarkdownRenderer: not AgentListView");
432
+ render: async (desc, ctx) => {
433
+ if (desc.source.type !== "component" || desc.source.componentKey !== "AgentConsoleDashboard") {
434
+ throw new Error("agentDashboardMarkdownRenderer: not AgentConsoleDashboard");
188
435
  }
189
- const data = await mockListAgentsHandler({
190
- organizationId: "demo-org",
191
- limit: 50,
192
- offset: 0
193
- });
436
+ const data = ctx?.data ?? await getFallbackAgentConsoleDashboardData();
437
+ const activeAgents = data.agents.filter((a) => a.status === "ACTIVE").length;
438
+ const completedRuns = data.runs.filter((r) => r.status === "COMPLETED").length;
439
+ const failedRuns = data.runs.filter((r) => r.status === "FAILED").length;
440
+ const totalTokens = data.runs.reduce((sum, r) => sum + (r.totalTokens ?? 0), 0);
441
+ const totalCost = data.runs.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0);
442
+ const activeTools = data.tools.filter((t) => t.status === "ACTIVE").length;
443
+ const visualizationItems = createAgentVisualizationItems(data.runs);
194
444
  const lines = [
195
- `# ${desc.meta.description ?? "Agent List"}`,
445
+ "# Agent Console Dashboard",
196
446
  "",
197
- `> ${desc.meta.key} v${desc.meta.version}`,
447
+ "> AI agent operations overview",
198
448
  "",
199
- `**Total Agents:** ${data.total}`,
449
+ "## Summary",
450
+ "",
451
+ "| Metric | Value |",
452
+ "|--------|-------|",
453
+ `| Total Agents | ${data.summary.totalAgents} |`,
454
+ `| Active Agents | ${activeAgents} |`,
455
+ `| Total Runs | ${data.summary.totalRuns} |`,
456
+ `| Completed Runs | ${completedRuns} |`,
457
+ `| Failed Runs | ${failedRuns} |`,
458
+ `| Total Tokens | ${totalTokens.toLocaleString()} |`,
459
+ `| Total Cost | $${totalCost.toFixed(4)} |`,
460
+ `| Total Tools | ${data.summary.totalTools} |`,
461
+ `| Active Tools | ${activeTools} |`,
200
462
  "",
201
463
  "## Agents",
202
464
  ""
203
465
  ];
204
- const byStatus = {};
205
- for (const agent of data.items) {
206
- const status = agent.status;
207
- if (byStatus[status]) {
208
- byStatus[status].push(agent);
209
- } else {
210
- byStatus[status] = [agent];
466
+ if (data.agents.length === 0) {
467
+ lines.push("_No agents configured._");
468
+ } else {
469
+ lines.push("| Agent | Model | Status | Description |");
470
+ lines.push("|-------|-------|--------|-------------|");
471
+ for (const agent of data.agents.slice(0, 5)) {
472
+ lines.push(`| ${agent.name} | ${agent.modelProvider}/${agent.modelName} | ${agent.status} | ${agent.description ?? "-"} |`);
473
+ }
474
+ if (data.agents.length > 5) {
475
+ lines.push(`| ... | ... | ... | _${data.summary.totalAgents - 5} more_ |`);
211
476
  }
212
477
  }
213
- for (const [status, agents] of Object.entries(byStatus)) {
214
- lines.push(`### ${status} (${agents.length})`);
215
- lines.push("");
216
- for (const agent of agents) {
217
- lines.push(`- **${agent.name}** (${agent.modelProvider}/${agent.modelName})`);
218
- if (agent.description) {
219
- lines.push(` > ${agent.description}`);
220
- }
478
+ lines.push("");
479
+ lines.push("## Recent Runs");
480
+ lines.push("");
481
+ if (data.runs.length === 0) {
482
+ lines.push("_No runs yet._");
483
+ } else {
484
+ lines.push("| Run ID | Agent | Status | Duration | Tokens | Cost |");
485
+ lines.push("|--------|-------|--------|----------|--------|------|");
486
+ for (const run of data.runs.slice(0, 5)) {
487
+ lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration(run.durationMs) : "-"} | ${run.totalTokens ?? 0} | $${(run.estimatedCostUsd ?? 0).toFixed(4)} |`);
488
+ }
489
+ if (data.runs.length > 5) {
490
+ lines.push(`| ... | ... | ... | ... | ... | _${data.summary.totalRuns - 5} more_ |`);
491
+ }
492
+ }
493
+ lines.push("");
494
+ lines.push("## Visualization Overview");
495
+ lines.push("");
496
+ for (const item of visualizationItems) {
497
+ lines.push(`- **${item.title}** via \`${item.spec.meta.key}\``);
498
+ }
499
+ lines.push("");
500
+ lines.push("## Tools");
501
+ lines.push("");
502
+ const toolsByCategory = {};
503
+ for (const tool of data.tools) {
504
+ const cat = tool.category;
505
+ if (!toolsByCategory[cat])
506
+ toolsByCategory[cat] = [];
507
+ toolsByCategory[cat].push(tool);
508
+ }
509
+ if (Object.keys(toolsByCategory).length === 0) {
510
+ lines.push("_No tools registered._");
511
+ } else {
512
+ lines.push("| Category | Tools | Active |");
513
+ lines.push("|----------|-------|--------|");
514
+ for (const [category, tools] of Object.entries(toolsByCategory).sort()) {
515
+ const active = tools.filter((t) => t.status === "ACTIVE").length;
516
+ lines.push(`| ${category} | ${tools.length} | ${active} |`);
221
517
  }
222
- lines.push("");
223
518
  }
224
519
  return {
225
520
  mimeType: "text/markdown",
@@ -230,8 +525,11 @@ var agentListMarkdownRenderer = {
230
525
  };
231
526
 
232
527
  // src/ui/renderers/run-list.markdown.ts
233
- import { mockListRunsHandler } from "@contractspec/example.agent-console/handlers";
234
- function formatDuration(ms) {
528
+ import {
529
+ AGENT_CONSOLE_DEMO_PROJECT_ID as AGENT_CONSOLE_DEMO_PROJECT_ID2,
530
+ createAgentConsoleDemoHandlers as createAgentConsoleDemoHandlers2
531
+ } from "@contractspec/example.agent-console/shared";
532
+ function formatDuration2(ms) {
235
533
  if (ms < 1000)
236
534
  return `${ms}ms`;
237
535
  if (ms < 60000)
@@ -240,12 +538,14 @@ function formatDuration(ms) {
240
538
  }
241
539
  var runListMarkdownRenderer = {
242
540
  target: "markdown",
243
- render: async (desc) => {
541
+ render: async (desc, ctx) => {
244
542
  if (desc.source.type !== "component" || desc.source.componentKey !== "RunListView") {
245
543
  throw new Error("runListMarkdownRenderer: not RunListView");
246
544
  }
247
- const data = await mockListRunsHandler({
248
- organizationId: "demo-org",
545
+ const data = Array.isArray(ctx?.data) ? { items: ctx.data, total: ctx.data.length, hasMore: false } : await createAgentConsoleDemoHandlers2({
546
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID2
547
+ }).listRuns({
548
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID2,
249
549
  limit: 20,
250
550
  offset: 0
251
551
  });
@@ -262,7 +562,7 @@ var runListMarkdownRenderer = {
262
562
  "| --- | --- | --- | --- | --- | --- |"
263
563
  ];
264
564
  for (const run of data.items.slice(0, 10)) {
265
- lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration(run.durationMs) : "-"} | ${run.totalTokens} | $${run.estimatedCostUsd?.toFixed(4) ?? "-"} |`);
565
+ lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration2(run.durationMs) : "-"} | ${run.totalTokens} | $${run.estimatedCostUsd?.toFixed(4) ?? "-"} |`);
266
566
  }
267
567
  return {
268
568
  mimeType: "text/markdown",
@@ -273,15 +573,26 @@ var runListMarkdownRenderer = {
273
573
  };
274
574
 
275
575
  // src/ui/renderers/tool-registry.markdown.ts
276
- import { mockListToolsHandler } from "@contractspec/example.agent-console/handlers";
576
+ import {
577
+ AGENT_CONSOLE_DEMO_ORGANIZATION_ID as AGENT_CONSOLE_DEMO_ORGANIZATION_ID2,
578
+ AGENT_CONSOLE_DEMO_PROJECT_ID as AGENT_CONSOLE_DEMO_PROJECT_ID3,
579
+ createAgentConsoleDemoHandlers as createAgentConsoleDemoHandlers3
580
+ } from "@contractspec/example.agent-console/shared";
277
581
  var toolRegistryMarkdownRenderer = {
278
582
  target: "markdown",
279
- render: async (desc) => {
583
+ render: async (desc, ctx) => {
280
584
  if (desc.source.type !== "component" || desc.source.componentKey !== "ToolRegistryView") {
281
585
  throw new Error("toolRegistryMarkdownRenderer: not ToolRegistryView");
282
586
  }
283
- const data = await mockListToolsHandler({
284
- organizationId: "demo-org",
587
+ const data = Array.isArray(ctx?.data) ? {
588
+ items: ctx.data,
589
+ total: ctx.data.length,
590
+ hasMore: false
591
+ } : await createAgentConsoleDemoHandlers3({
592
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID3
593
+ }).listTools({
594
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID3,
595
+ organizationId: AGENT_CONSOLE_DEMO_ORGANIZATION_ID2,
285
596
  limit: 50,
286
597
  offset: 0
287
598
  });
@@ -322,121 +633,6 @@ var toolRegistryMarkdownRenderer = {
322
633
  };
323
634
  }
324
635
  };
325
-
326
- // src/ui/renderers/dashboard.markdown.ts
327
- import {
328
- mockListAgentsHandler as mockListAgentsHandler2,
329
- mockListRunsHandler as mockListRunsHandler2,
330
- mockListToolsHandler as mockListToolsHandler2
331
- } from "@contractspec/example.agent-console/handlers";
332
- function formatDuration2(ms) {
333
- if (ms < 1000)
334
- return `${ms}ms`;
335
- if (ms < 60000)
336
- return `${(ms / 1000).toFixed(1)}s`;
337
- return `${(ms / 60000).toFixed(1)}m`;
338
- }
339
- var agentDashboardMarkdownRenderer = {
340
- target: "markdown",
341
- render: async (desc) => {
342
- if (desc.source.type !== "component" || desc.source.componentKey !== "AgentConsoleDashboard") {
343
- throw new Error("agentDashboardMarkdownRenderer: not AgentConsoleDashboard");
344
- }
345
- const [agentsData, runsData, toolsData] = await Promise.all([
346
- mockListAgentsHandler2({
347
- organizationId: "demo-org",
348
- limit: 100
349
- }),
350
- mockListRunsHandler2({
351
- limit: 100
352
- }),
353
- mockListToolsHandler2({
354
- organizationId: "demo-org",
355
- limit: 100
356
- })
357
- ]);
358
- const activeAgents = agentsData.items.filter((a) => a.status === "ACTIVE").length;
359
- const completedRuns = runsData.items.filter((r) => r.status === "COMPLETED").length;
360
- const failedRuns = runsData.items.filter((r) => r.status === "FAILED").length;
361
- const totalTokens = runsData.items.reduce((sum, r) => sum + (r.totalTokens ?? 0), 0);
362
- const totalCost = runsData.items.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0);
363
- const activeTools = toolsData.items.filter((t) => t.status === "ACTIVE").length;
364
- const lines = [
365
- "# Agent Console Dashboard",
366
- "",
367
- "> AI agent operations overview",
368
- "",
369
- "## Summary",
370
- "",
371
- "| Metric | Value |",
372
- "|--------|-------|",
373
- `| Total Agents | ${agentsData.total} |`,
374
- `| Active Agents | ${activeAgents} |`,
375
- `| Total Runs | ${runsData.total} |`,
376
- `| Completed Runs | ${completedRuns} |`,
377
- `| Failed Runs | ${failedRuns} |`,
378
- `| Total Tokens | ${totalTokens.toLocaleString()} |`,
379
- `| Total Cost | $${totalCost.toFixed(4)} |`,
380
- `| Total Tools | ${toolsData.total} |`,
381
- `| Active Tools | ${activeTools} |`,
382
- "",
383
- "## Agents",
384
- ""
385
- ];
386
- if (agentsData.items.length === 0) {
387
- lines.push("_No agents configured._");
388
- } else {
389
- lines.push("| Agent | Model | Status | Description |");
390
- lines.push("|-------|-------|--------|-------------|");
391
- for (const agent of agentsData.items.slice(0, 5)) {
392
- lines.push(`| ${agent.name} | ${agent.modelProvider}/${agent.modelName} | ${agent.status} | ${agent.description ?? "-"} |`);
393
- }
394
- if (agentsData.items.length > 5) {
395
- lines.push(`| ... | ... | ... | _${agentsData.total - 5} more_ |`);
396
- }
397
- }
398
- lines.push("");
399
- lines.push("## Recent Runs");
400
- lines.push("");
401
- if (runsData.items.length === 0) {
402
- lines.push("_No runs yet._");
403
- } else {
404
- lines.push("| Run ID | Agent | Status | Duration | Tokens | Cost |");
405
- lines.push("|--------|-------|--------|----------|--------|------|");
406
- for (const run of runsData.items.slice(0, 5)) {
407
- lines.push(`| ${run.id.slice(-8)} | ${run.agentName} | ${run.status} | ${run.durationMs ? formatDuration2(run.durationMs) : "-"} | ${run.totalTokens ?? 0} | $${(run.estimatedCostUsd ?? 0).toFixed(4)} |`);
408
- }
409
- if (runsData.items.length > 5) {
410
- lines.push(`| ... | ... | ... | ... | ... | _${runsData.total - 5} more_ |`);
411
- }
412
- }
413
- lines.push("");
414
- lines.push("## Tools");
415
- lines.push("");
416
- const toolsByCategory = {};
417
- for (const tool of toolsData.items) {
418
- const cat = tool.category;
419
- if (!toolsByCategory[cat])
420
- toolsByCategory[cat] = [];
421
- toolsByCategory[cat].push(tool);
422
- }
423
- if (Object.keys(toolsByCategory).length === 0) {
424
- lines.push("_No tools registered._");
425
- } else {
426
- lines.push("| Category | Tools | Active |");
427
- lines.push("|----------|-------|--------|");
428
- for (const [category, tools] of Object.entries(toolsByCategory).sort()) {
429
- const active = tools.filter((t) => t.status === "ACTIVE").length;
430
- lines.push(`| ${category} | ${tools.length} | ${active} |`);
431
- }
432
- }
433
- return {
434
- mimeType: "text/markdown",
435
- body: lines.join(`
436
- `)
437
- };
438
- }
439
- };
440
636
  export {
441
637
  toolRegistryMarkdownRenderer,
442
638
  runListMarkdownRenderer,
@@ -1,5 +1,8 @@
1
1
  // src/ui/renderers/run-list.markdown.ts
2
- import { mockListRunsHandler } from "@contractspec/example.agent-console/handlers";
2
+ import {
3
+ AGENT_CONSOLE_DEMO_PROJECT_ID,
4
+ createAgentConsoleDemoHandlers
5
+ } from "@contractspec/example.agent-console/shared";
3
6
  function formatDuration(ms) {
4
7
  if (ms < 1000)
5
8
  return `${ms}ms`;
@@ -9,12 +12,14 @@ function formatDuration(ms) {
9
12
  }
10
13
  var runListMarkdownRenderer = {
11
14
  target: "markdown",
12
- render: async (desc) => {
15
+ render: async (desc, ctx) => {
13
16
  if (desc.source.type !== "component" || desc.source.componentKey !== "RunListView") {
14
17
  throw new Error("runListMarkdownRenderer: not RunListView");
15
18
  }
16
- const data = await mockListRunsHandler({
17
- organizationId: "demo-org",
19
+ const data = Array.isArray(ctx?.data) ? { items: ctx.data, total: ctx.data.length, hasMore: false } : await createAgentConsoleDemoHandlers({
20
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID
21
+ }).listRuns({
22
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID,
18
23
  limit: 20,
19
24
  offset: 0
20
25
  });
@@ -1,13 +1,24 @@
1
1
  // src/ui/renderers/tool-registry.markdown.ts
2
- import { mockListToolsHandler } from "@contractspec/example.agent-console/handlers";
2
+ import {
3
+ AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
4
+ AGENT_CONSOLE_DEMO_PROJECT_ID,
5
+ createAgentConsoleDemoHandlers
6
+ } from "@contractspec/example.agent-console/shared";
3
7
  var toolRegistryMarkdownRenderer = {
4
8
  target: "markdown",
5
- render: async (desc) => {
9
+ render: async (desc, ctx) => {
6
10
  if (desc.source.type !== "component" || desc.source.componentKey !== "ToolRegistryView") {
7
11
  throw new Error("toolRegistryMarkdownRenderer: not ToolRegistryView");
8
12
  }
9
- const data = await mockListToolsHandler({
10
- organizationId: "demo-org",
13
+ const data = Array.isArray(ctx?.data) ? {
14
+ items: ctx.data,
15
+ total: ctx.data.length,
16
+ hasMore: false
17
+ } : await createAgentConsoleDemoHandlers({
18
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID
19
+ }).listTools({
20
+ projectId: AGENT_CONSOLE_DEMO_PROJECT_ID,
21
+ organizationId: AGENT_CONSOLE_DEMO_ORGANIZATION_ID,
11
22
  limit: 50,
12
23
  offset: 0
13
24
  });