@contractspec/example.agent-console 3.7.7 → 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 (186) hide show
  1. package/.turbo/turbo-build.log +126 -105
  2. package/AGENTS.md +3 -1
  3. package/CHANGELOG.md +29 -0
  4. package/README.md +46 -9
  5. package/dist/agent/agent.handler.d.ts +3 -0
  6. package/dist/agent/agent.handler.js +730 -1
  7. package/dist/agent/index.js +73 -72
  8. package/dist/agent.feature.js +179 -0
  9. package/dist/browser/agent/agent.handler.js +730 -1
  10. package/dist/browser/agent/index.js +73 -72
  11. package/dist/browser/agent.feature.js +179 -0
  12. package/dist/browser/docs/agent-console.docblock.js +11 -8
  13. package/dist/browser/docs/index.js +11 -8
  14. package/dist/browser/example.js +2 -3
  15. package/dist/browser/handlers/agent.handlers.js +1883 -2
  16. package/dist/browser/handlers/index.js +2142 -8
  17. package/dist/browser/index.js +3347 -2433
  18. package/dist/browser/presentations/index.js +49 -49
  19. package/dist/browser/run/index.js +818 -812
  20. package/dist/browser/run/run.handler.js +666 -1
  21. package/dist/browser/shared/index.js +293 -1
  22. package/dist/browser/shared/mock-runs.js +5 -0
  23. package/dist/browser/tool/index.js +331 -331
  24. package/dist/browser/tool/tool.handler.js +479 -3
  25. package/dist/browser/ui/AgentDashboard.js +1204 -319
  26. package/dist/browser/ui/AgentDashboard.visualizations.js +217 -0
  27. package/dist/browser/ui/AgentRunList.js +359 -127
  28. package/dist/browser/ui/hooks/index.js +468 -18
  29. package/dist/browser/ui/hooks/useAgentMutations.js +443 -8
  30. package/dist/browser/ui/hooks/useRunList.js +25 -10
  31. package/dist/browser/ui/index.js +1293 -390
  32. package/dist/browser/ui/renderers/agent-list.markdown.js +14 -5
  33. package/dist/browser/ui/renderers/dashboard.markdown.js +207 -36
  34. package/dist/browser/ui/renderers/index.js +245 -49
  35. package/dist/browser/ui/renderers/run-list.markdown.js +9 -4
  36. package/dist/browser/ui/renderers/tool-registry.markdown.js +15 -4
  37. package/dist/browser/ui/views/RunDataTable.js +326 -0
  38. package/dist/browser/ui/views/RunListView.js +359 -127
  39. package/dist/browser/ui/views/index.js +406 -174
  40. package/dist/browser/ui/views/run-data-table.columns.js +271 -0
  41. package/dist/browser/ui/views/run-list.shared.js +177 -0
  42. package/dist/browser/visualizations/catalog.js +134 -0
  43. package/dist/browser/visualizations/index.js +187 -0
  44. package/dist/browser/visualizations/selectors.js +181 -0
  45. package/dist/docs/agent-console.docblock.js +11 -8
  46. package/dist/docs/index.js +11 -8
  47. package/dist/example.js +2 -3
  48. package/dist/example.test.d.ts +1 -0
  49. package/dist/handlers/agent.handlers.d.ts +2 -0
  50. package/dist/handlers/agent.handlers.js +1883 -2
  51. package/dist/handlers/index.d.ts +1 -3
  52. package/dist/handlers/index.js +2142 -8
  53. package/dist/handlers/mock-handlers.test.d.ts +1 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.js +3347 -2433
  56. package/dist/node/agent/agent.handler.js +730 -1
  57. package/dist/node/agent/index.js +73 -72
  58. package/dist/node/agent.feature.js +179 -0
  59. package/dist/node/docs/agent-console.docblock.js +11 -8
  60. package/dist/node/docs/index.js +11 -8
  61. package/dist/node/example.js +2 -3
  62. package/dist/node/handlers/agent.handlers.js +1883 -2
  63. package/dist/node/handlers/index.js +2142 -8
  64. package/dist/node/index.js +3347 -2433
  65. package/dist/node/presentations/index.js +49 -49
  66. package/dist/node/run/index.js +818 -812
  67. package/dist/node/run/run.handler.js +666 -1
  68. package/dist/node/shared/index.js +293 -1
  69. package/dist/node/shared/mock-runs.js +5 -0
  70. package/dist/node/tool/index.js +331 -331
  71. package/dist/node/tool/tool.handler.js +479 -3
  72. package/dist/node/ui/AgentDashboard.js +1204 -319
  73. package/dist/node/ui/AgentDashboard.visualizations.js +217 -0
  74. package/dist/node/ui/AgentRunList.js +359 -127
  75. package/dist/node/ui/hooks/index.js +468 -18
  76. package/dist/node/ui/hooks/useAgentMutations.js +443 -8
  77. package/dist/node/ui/hooks/useRunList.js +25 -10
  78. package/dist/node/ui/index.js +1293 -390
  79. package/dist/node/ui/renderers/agent-list.markdown.js +14 -5
  80. package/dist/node/ui/renderers/dashboard.markdown.js +207 -36
  81. package/dist/node/ui/renderers/index.js +245 -49
  82. package/dist/node/ui/renderers/run-list.markdown.js +9 -4
  83. package/dist/node/ui/renderers/tool-registry.markdown.js +15 -4
  84. package/dist/node/ui/views/RunDataTable.js +326 -0
  85. package/dist/node/ui/views/RunListView.js +359 -127
  86. package/dist/node/ui/views/index.js +406 -174
  87. package/dist/node/ui/views/run-data-table.columns.js +271 -0
  88. package/dist/node/ui/views/run-list.shared.js +177 -0
  89. package/dist/node/visualizations/catalog.js +134 -0
  90. package/dist/node/visualizations/index.js +187 -0
  91. package/dist/node/visualizations/selectors.js +181 -0
  92. package/dist/presentations/index.js +49 -49
  93. package/dist/proof/index.d.ts +2 -0
  94. package/dist/proof/meetup-proof.d.ts +10 -0
  95. package/dist/proof/meetup-proof.runtime.d.ts +22 -0
  96. package/dist/proof/meetup-proof.scenario.d.ts +2 -0
  97. package/dist/proof/meetup-proof.suite.d.ts +1 -0
  98. package/dist/proof/meetup-proof.test.d.ts +1 -0
  99. package/dist/run/index.js +818 -812
  100. package/dist/run/run.handler.d.ts +4 -0
  101. package/dist/run/run.handler.js +666 -1
  102. package/dist/shared/demo-dashboard-data.d.ts +16 -0
  103. package/dist/shared/demo-runtime-seed.d.ts +17 -0
  104. package/dist/shared/demo-runtime.d.ts +8 -0
  105. package/dist/shared/demo-runtime.test.d.ts +1 -0
  106. package/dist/shared/index.d.ts +3 -0
  107. package/dist/shared/index.js +293 -1
  108. package/dist/shared/mock-runs.d.ts +4 -0
  109. package/dist/shared/mock-runs.js +5 -0
  110. package/dist/tool/index.js +331 -331
  111. package/dist/tool/tool.handler.d.ts +4 -1
  112. package/dist/tool/tool.handler.js +479 -3
  113. package/dist/ui/AgentDashboard.js +1204 -319
  114. package/dist/ui/AgentDashboard.sandbox.test.d.ts +1 -0
  115. package/dist/ui/AgentDashboard.visualizations.d.ts +4 -0
  116. package/dist/ui/AgentDashboard.visualizations.js +218 -0
  117. package/dist/ui/AgentRunList.js +359 -127
  118. package/dist/ui/hooks/index.js +468 -18
  119. package/dist/ui/hooks/useAgentMutations.js +443 -8
  120. package/dist/ui/hooks/useRunList.d.ts +8 -2
  121. package/dist/ui/hooks/useRunList.js +25 -10
  122. package/dist/ui/index.js +1293 -390
  123. package/dist/ui/renderers/agent-list.markdown.js +14 -5
  124. package/dist/ui/renderers/dashboard.markdown.js +207 -36
  125. package/dist/ui/renderers/index.js +245 -49
  126. package/dist/ui/renderers/run-list.markdown.js +9 -4
  127. package/dist/ui/renderers/tool-registry.markdown.d.ts +1 -1
  128. package/dist/ui/renderers/tool-registry.markdown.js +15 -4
  129. package/dist/ui/views/RunDataTable.d.ts +18 -0
  130. package/dist/ui/views/RunDataTable.js +327 -0
  131. package/dist/ui/views/RunListView.js +359 -127
  132. package/dist/ui/views/index.js +406 -174
  133. package/dist/ui/views/run-data-table.columns.d.ts +3 -0
  134. package/dist/ui/views/run-data-table.columns.js +272 -0
  135. package/dist/ui/views/run-list.shared.d.ts +14 -0
  136. package/dist/ui/views/run-list.shared.js +178 -0
  137. package/dist/visualizations/catalog.d.ts +10 -0
  138. package/dist/visualizations/catalog.js +135 -0
  139. package/dist/visualizations/index.d.ts +2 -0
  140. package/dist/visualizations/index.js +188 -0
  141. package/dist/visualizations/selectors.d.ts +3 -0
  142. package/dist/visualizations/selectors.js +182 -0
  143. package/dist/visualizations/selectors.test.d.ts +1 -0
  144. package/package.json +112 -10
  145. package/proofs/agent-console-meetup.replay.json +220 -0
  146. package/src/agent/agent.handler.ts +18 -1
  147. package/src/agent.feature.ts +3 -0
  148. package/src/docs/agent-console.docblock.ts +11 -8
  149. package/src/example.test.ts +75 -0
  150. package/src/example.ts +2 -3
  151. package/src/handlers/agent.handlers.ts +55 -2
  152. package/src/handlers/index.ts +18 -2
  153. package/src/handlers/mock-handlers.test.ts +77 -0
  154. package/src/index.ts +2 -0
  155. package/src/proof/index.ts +2 -0
  156. package/src/proof/meetup-proof.runtime.ts +196 -0
  157. package/src/proof/meetup-proof.scenario.ts +99 -0
  158. package/src/proof/meetup-proof.suite.ts +29 -0
  159. package/src/proof/meetup-proof.test.ts +28 -0
  160. package/src/proof/meetup-proof.ts +130 -0
  161. package/src/run/run.handler.ts +17 -1
  162. package/src/shared/demo-dashboard-data.ts +58 -0
  163. package/src/shared/demo-runtime-seed.ts +139 -0
  164. package/src/shared/demo-runtime.test.ts +169 -0
  165. package/src/shared/demo-runtime.ts +260 -0
  166. package/src/shared/index.ts +11 -0
  167. package/src/shared/mock-runs.ts +5 -0
  168. package/src/tool/tool.handler.ts +21 -4
  169. package/src/ui/AgentDashboard.sandbox.test.tsx +312 -0
  170. package/src/ui/AgentDashboard.tsx +4 -1
  171. package/src/ui/AgentDashboard.visualizations.tsx +35 -0
  172. package/src/ui/hooks/useAgentMutations.ts +19 -11
  173. package/src/ui/hooks/useRunList.ts +41 -9
  174. package/src/ui/renderers/agent-list.markdown.ts +31 -12
  175. package/src/ui/renderers/dashboard.markdown.ts +37 -42
  176. package/src/ui/renderers/run-list.markdown.ts +16 -8
  177. package/src/ui/renderers/tool-registry.markdown.ts +21 -9
  178. package/src/ui/views/RunDataTable.tsx +74 -0
  179. package/src/ui/views/RunListView.tsx +37 -111
  180. package/src/ui/views/run-data-table.columns.tsx +102 -0
  181. package/src/ui/views/run-list.shared.tsx +139 -0
  182. package/src/visualizations/catalog.ts +132 -0
  183. package/src/visualizations/index.ts +2 -0
  184. package/src/visualizations/selectors.test.ts +12 -0
  185. package/src/visualizations/selectors.ts +70 -0
  186. package/tsdown.config.js +17 -0
@@ -62,7 +62,10 @@ function useRunList(options = {}) {
62
62
  const [metrics, setMetrics] = useState2(null);
63
63
  const [loading, setLoading] = useState2(true);
64
64
  const [error, setError] = useState2(null);
65
- const [page, setPage] = useState2(1);
65
+ const [internalPageIndex, setInternalPageIndex] = useState2(0);
66
+ const pageSize = options.pageSize ?? options.limit ?? 20;
67
+ const pageIndex = options.pageIndex ?? internalPageIndex;
68
+ const [sort] = options.sorting ?? [];
66
69
  const fetchData = useCallback2(async () => {
67
70
  setLoading(true);
68
71
  setError(null);
@@ -72,14 +75,14 @@ function useRunList(options = {}) {
72
75
  projectId,
73
76
  agentId: options.agentId,
74
77
  status: options.status === "all" ? undefined : options.status,
75
- limit: options.limit ?? 20,
76
- offset: (page - 1) * (options.limit ?? 20)
78
+ sortBy: sort?.id,
79
+ sortDirection: sort ? sort.desc ? "desc" : "asc" : undefined,
80
+ limit: pageSize,
81
+ offset: pageIndex * pageSize
77
82
  }),
78
83
  agent.getRunMetrics({
79
84
  projectId,
80
- agentId: options.agentId,
81
- startDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
82
- endDate: new Date
85
+ agentId: options.agentId
83
86
  })
84
87
  ]);
85
88
  setData(runsResult);
@@ -89,31 +92,38 @@ function useRunList(options = {}) {
89
92
  } finally {
90
93
  setLoading(false);
91
94
  }
92
- }, [agent, projectId, options.agentId, options.status, options.limit, page]);
95
+ }, [
96
+ agent,
97
+ pageIndex,
98
+ pageSize,
99
+ projectId,
100
+ options.agentId,
101
+ options.status,
102
+ sort?.desc,
103
+ sort?.id
104
+ ]);
93
105
  useEffect2(() => {
94
106
  fetchData();
95
107
  }, [fetchData]);
108
+ const hasControlledPagination = options.pageIndex !== undefined;
96
109
  return {
97
110
  data,
98
111
  metrics,
99
112
  loading,
100
113
  error,
101
- page,
114
+ page: pageIndex + 1,
115
+ pageIndex,
116
+ pageSize,
102
117
  refetch: fetchData,
103
- nextPage: () => setPage((p) => p + 1),
104
- prevPage: () => page > 1 && setPage((p) => p - 1)
118
+ nextPage: hasControlledPagination ? undefined : () => setInternalPageIndex((current) => current + 1),
119
+ prevPage: hasControlledPagination ? undefined : () => setInternalPageIndex((current) => Math.max(0, current - 1))
105
120
  };
106
121
  }
107
122
 
108
- // src/ui/views/RunListView.tsx
109
- import {
110
- EmptyState,
111
- ErrorState,
112
- LoaderBlock,
113
- StatCard,
114
- StatCardGroup,
115
- StatusChip
116
- } from "@contractspec/lib.design-system";
123
+ // src/ui/views/run-list.shared.tsx
124
+ import { Button, StatusChip } from "@contractspec/lib.design-system";
125
+ import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
126
+ import { Text } from "@contractspec/lib.ui-kit-web/ui/text";
117
127
  import { jsxDEV } from "react/jsx-dev-runtime";
118
128
  "use client";
119
129
  function getStatusTone(status) {
@@ -152,15 +162,320 @@ function formatCost(cost) {
152
162
  return "-";
153
163
  return `$${cost.toFixed(4)}`;
154
164
  }
165
+ function formatJson(value) {
166
+ return JSON.stringify(value ?? null, null, 2);
167
+ }
168
+ function RunExpandedContent({ run }) {
169
+ return /* @__PURE__ */ jsxDEV(VStack, {
170
+ gap: "sm",
171
+ className: "py-2",
172
+ children: [
173
+ /* @__PURE__ */ jsxDEV(HStack, {
174
+ justify: "between",
175
+ className: "flex-wrap",
176
+ children: [
177
+ /* @__PURE__ */ jsxDEV(StatusChip, {
178
+ tone: getStatusTone(run.status),
179
+ label: run.status
180
+ }, undefined, false, undefined, this),
181
+ /* @__PURE__ */ jsxDEV(Text, {
182
+ className: "text-muted-foreground text-sm",
183
+ children: [
184
+ "Queued ",
185
+ run.queuedAt.toLocaleString()
186
+ ]
187
+ }, undefined, true, undefined, this)
188
+ ]
189
+ }, undefined, true, undefined, this),
190
+ /* @__PURE__ */ jsxDEV(HStack, {
191
+ gap: "lg",
192
+ className: "flex-wrap",
193
+ children: [
194
+ /* @__PURE__ */ jsxDEV(Text, {
195
+ className: "text-muted-foreground text-sm",
196
+ children: [
197
+ "Prompt ",
198
+ formatTokens(run.promptTokens)
199
+ ]
200
+ }, undefined, true, undefined, this),
201
+ /* @__PURE__ */ jsxDEV(Text, {
202
+ className: "text-muted-foreground text-sm",
203
+ children: [
204
+ "Completion ",
205
+ formatTokens(run.completionTokens)
206
+ ]
207
+ }, undefined, true, undefined, this),
208
+ /* @__PURE__ */ jsxDEV(Text, {
209
+ className: "text-muted-foreground text-sm",
210
+ children: [
211
+ "Duration ",
212
+ formatDuration(run.durationMs)
213
+ ]
214
+ }, undefined, true, undefined, this)
215
+ ]
216
+ }, undefined, true, undefined, this),
217
+ /* @__PURE__ */ jsxDEV(VStack, {
218
+ gap: "xs",
219
+ children: [
220
+ /* @__PURE__ */ jsxDEV(Text, {
221
+ className: "font-medium text-sm",
222
+ children: "Input"
223
+ }, undefined, false, undefined, this),
224
+ /* @__PURE__ */ jsxDEV("pre", {
225
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
226
+ children: formatJson(run.input)
227
+ }, undefined, false, undefined, this)
228
+ ]
229
+ }, undefined, true, undefined, this),
230
+ /* @__PURE__ */ jsxDEV(VStack, {
231
+ gap: "xs",
232
+ children: [
233
+ /* @__PURE__ */ jsxDEV(Text, {
234
+ className: "font-medium text-sm",
235
+ children: "Output"
236
+ }, undefined, false, undefined, this),
237
+ /* @__PURE__ */ jsxDEV("pre", {
238
+ className: "overflow-auto rounded-md bg-muted/40 p-3 text-xs",
239
+ children: formatJson(run.output ?? run.errorMessage ?? "Pending")
240
+ }, undefined, false, undefined, this)
241
+ ]
242
+ }, undefined, true, undefined, this)
243
+ ]
244
+ }, undefined, true, undefined, this);
245
+ }
246
+ function RunTableToolbar({
247
+ controller,
248
+ totalRuns
249
+ }) {
250
+ const firstRow = controller.rows[0];
251
+ const queuedColumn = controller.columns.find((column) => column.id === "queuedAt");
252
+ const durationColumn = controller.columns.find((column) => column.id === "durationMs");
253
+ const costColumn = controller.columns.find((column) => column.id === "estimatedCostUsd");
254
+ return /* @__PURE__ */ jsxDEV(HStack, {
255
+ gap: "sm",
256
+ className: "flex-wrap",
257
+ children: [
258
+ /* @__PURE__ */ jsxDEV(Text, {
259
+ className: "text-muted-foreground text-sm",
260
+ children: [
261
+ totalRuns,
262
+ " runs"
263
+ ]
264
+ }, undefined, true, undefined, this),
265
+ /* @__PURE__ */ jsxDEV(Button, {
266
+ variant: "outline",
267
+ size: "sm",
268
+ onPress: () => firstRow?.toggleExpanded?.(!firstRow?.isExpanded),
269
+ children: "Expand Latest Run"
270
+ }, undefined, false, undefined, this),
271
+ /* @__PURE__ */ jsxDEV(Button, {
272
+ variant: "outline",
273
+ size: "sm",
274
+ onPress: () => queuedColumn?.toggleVisibility?.(!queuedColumn?.visible),
275
+ children: queuedColumn?.visible ? "Hide Time" : "Show Time"
276
+ }, undefined, false, undefined, this),
277
+ /* @__PURE__ */ jsxDEV(Button, {
278
+ variant: "outline",
279
+ size: "sm",
280
+ onPress: () => durationColumn?.toggleVisibility?.(!durationColumn?.visible),
281
+ children: durationColumn?.visible ? "Hide Duration" : "Show Duration"
282
+ }, undefined, false, undefined, this),
283
+ /* @__PURE__ */ jsxDEV(Button, {
284
+ variant: "outline",
285
+ size: "sm",
286
+ onPress: () => costColumn?.toggleVisibility?.(!costColumn?.visible),
287
+ children: costColumn?.visible ? "Hide Cost" : "Show Cost"
288
+ }, undefined, false, undefined, this)
289
+ ]
290
+ }, undefined, true, undefined, this);
291
+ }
292
+
293
+ // src/ui/views/run-data-table.columns.tsx
294
+ import { StatusChip as StatusChip2 } from "@contractspec/lib.design-system";
295
+ import { VStack as VStack2 } from "@contractspec/lib.ui-kit-web/ui/stack";
296
+ import { Text as Text2 } from "@contractspec/lib.ui-kit-web/ui/text";
297
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
298
+ "use client";
299
+ function createRunTableColumns() {
300
+ return [
301
+ {
302
+ id: "queuedAt",
303
+ header: "Run",
304
+ label: "Run",
305
+ accessor: (run) => run.queuedAt.getTime(),
306
+ cell: ({ item }) => /* @__PURE__ */ jsxDEV2(VStack2, {
307
+ gap: "xs",
308
+ children: [
309
+ /* @__PURE__ */ jsxDEV2(Text2, {
310
+ className: "font-mono text-sm",
311
+ children: item.id.slice(-8)
312
+ }, undefined, false, undefined, this),
313
+ /* @__PURE__ */ jsxDEV2(Text2, {
314
+ className: "text-muted-foreground text-xs",
315
+ children: item.queuedAt.toLocaleString()
316
+ }, undefined, false, undefined, this)
317
+ ]
318
+ }, undefined, true, undefined, this),
319
+ size: 220,
320
+ minSize: 180,
321
+ canSort: true,
322
+ canHide: true,
323
+ canResize: true
324
+ },
325
+ {
326
+ id: "agentName",
327
+ header: "Agent",
328
+ label: "Agent",
329
+ accessor: (run) => run.agentName ?? "Unknown Agent",
330
+ cell: ({ value }) => /* @__PURE__ */ jsxDEV2(Text2, {
331
+ className: "font-medium",
332
+ children: typeof value === "string" ? value : "Unknown Agent"
333
+ }, undefined, false, undefined, this),
334
+ size: 220,
335
+ canSort: true,
336
+ canResize: true
337
+ },
338
+ {
339
+ id: "status",
340
+ header: "Status",
341
+ label: "Status",
342
+ accessorKey: "status",
343
+ cell: ({ value }) => {
344
+ const status = typeof value === "string" ? value : "QUEUED";
345
+ return /* @__PURE__ */ jsxDEV2(StatusChip2, {
346
+ tone: getStatusTone(status),
347
+ label: status
348
+ }, undefined, false, undefined, this);
349
+ },
350
+ size: 150,
351
+ canSort: true,
352
+ canResize: true
353
+ },
354
+ {
355
+ id: "totalTokens",
356
+ header: "Tokens",
357
+ label: "Tokens",
358
+ accessorKey: "totalTokens",
359
+ cell: ({ value }) => formatTokens(Number(value ?? 0)),
360
+ align: "right",
361
+ size: 140,
362
+ canSort: true,
363
+ canResize: true
364
+ },
365
+ {
366
+ id: "durationMs",
367
+ header: "Duration",
368
+ label: "Duration",
369
+ accessorKey: "durationMs",
370
+ cell: ({ value }) => formatDuration(typeof value === "number" ? value : undefined),
371
+ align: "right",
372
+ size: 140,
373
+ canSort: true,
374
+ canHide: true,
375
+ canResize: true
376
+ },
377
+ {
378
+ id: "estimatedCostUsd",
379
+ header: "Cost",
380
+ label: "Cost",
381
+ accessorKey: "estimatedCostUsd",
382
+ cell: ({ value }) => formatCost(typeof value === "number" ? value : undefined),
383
+ align: "right",
384
+ size: 140,
385
+ canSort: true,
386
+ canHide: true,
387
+ canResize: true
388
+ }
389
+ ];
390
+ }
391
+
392
+ // src/ui/views/RunDataTable.tsx
393
+ import { DataTable } from "@contractspec/lib.design-system";
394
+ import { useContractTable } from "@contractspec/lib.presentation-runtime-react";
395
+ import * as React from "react";
396
+ import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
397
+ "use client";
398
+ function RunDataTable({
399
+ runs,
400
+ totalItems,
401
+ pageIndex,
402
+ pageSize,
403
+ sorting,
404
+ loading,
405
+ onSortingChange,
406
+ onPaginationChange,
407
+ onRunClick
408
+ }) {
409
+ const columns = React.useMemo(() => createRunTableColumns(), []);
410
+ const controller = useContractTable({
411
+ data: runs,
412
+ columns,
413
+ executionMode: "server",
414
+ totalItems,
415
+ state: {
416
+ sorting,
417
+ pagination: { pageIndex, pageSize }
418
+ },
419
+ onSortingChange,
420
+ onPaginationChange,
421
+ initialState: {
422
+ columnVisibility: { estimatedCostUsd: false }
423
+ },
424
+ getRowId: (run) => run.id,
425
+ renderExpandedContent: (run) => /* @__PURE__ */ jsxDEV3(RunExpandedContent, {
426
+ run
427
+ }, undefined, false, undefined, this),
428
+ getCanExpand: () => true
429
+ });
430
+ return /* @__PURE__ */ jsxDEV3(DataTable, {
431
+ controller,
432
+ title: "Run History",
433
+ description: "Server-mode ContractSpec table with shared pagination, sorting, visibility, and expansion.",
434
+ loading,
435
+ onRowPress: (row) => onRunClick?.(row.id),
436
+ toolbar: /* @__PURE__ */ jsxDEV3(RunTableToolbar, {
437
+ controller,
438
+ totalRuns: totalItems
439
+ }, undefined, false, undefined, this),
440
+ emptyState: /* @__PURE__ */ jsxDEV3("div", {
441
+ className: "rounded-md border border-dashed p-8 text-center text-muted-foreground text-sm",
442
+ children: "No runs yet"
443
+ }, undefined, false, undefined, this)
444
+ }, undefined, false, undefined, this);
445
+ }
446
+
447
+ // src/ui/views/RunListView.tsx
448
+ import {
449
+ EmptyState,
450
+ ErrorState,
451
+ LoaderBlock,
452
+ StatCard,
453
+ StatCardGroup
454
+ } from "@contractspec/lib.design-system";
455
+ import { useState as useState3 } from "react";
456
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
457
+ "use client";
155
458
  function RunListView({ agentId, onRunClick }) {
156
- const { data, metrics, loading, error, refetch } = useRunList({ agentId });
459
+ const [sorting, setSorting] = useState3([
460
+ { id: "queuedAt", desc: true }
461
+ ]);
462
+ const [pagination, setPagination] = useState3({
463
+ pageIndex: 0,
464
+ pageSize: 3
465
+ });
466
+ const { data, metrics, loading, error, refetch } = useRunList({
467
+ agentId,
468
+ pageIndex: pagination.pageIndex,
469
+ pageSize: pagination.pageSize,
470
+ sorting
471
+ });
157
472
  if (loading && !data) {
158
- return /* @__PURE__ */ jsxDEV(LoaderBlock, {
473
+ return /* @__PURE__ */ jsxDEV4(LoaderBlock, {
159
474
  label: "Loading runs..."
160
475
  }, undefined, false, undefined, this);
161
476
  }
162
477
  if (error) {
163
- return /* @__PURE__ */ jsxDEV(ErrorState, {
478
+ return /* @__PURE__ */ jsxDEV4(ErrorState, {
164
479
  title: "Failed to load runs",
165
480
  description: error.message,
166
481
  onRetry: refetch,
@@ -168,145 +483,62 @@ function RunListView({ agentId, onRunClick }) {
168
483
  }, undefined, false, undefined, this);
169
484
  }
170
485
  if (!data?.items.length) {
171
- return /* @__PURE__ */ jsxDEV(EmptyState, {
486
+ return /* @__PURE__ */ jsxDEV4(EmptyState, {
172
487
  title: "No runs yet",
173
488
  description: "Execute an agent to see run history here."
174
489
  }, undefined, false, undefined, this);
175
490
  }
176
- return /* @__PURE__ */ jsxDEV("div", {
491
+ return /* @__PURE__ */ jsxDEV4("div", {
177
492
  className: "space-y-6",
178
493
  children: [
179
- metrics && /* @__PURE__ */ jsxDEV(StatCardGroup, {
494
+ metrics ? /* @__PURE__ */ jsxDEV4(StatCardGroup, {
180
495
  children: [
181
- /* @__PURE__ */ jsxDEV(StatCard, {
496
+ /* @__PURE__ */ jsxDEV4(StatCard, {
182
497
  label: "Total Runs",
183
498
  value: metrics.totalRuns
184
499
  }, undefined, false, undefined, this),
185
- /* @__PURE__ */ jsxDEV(StatCard, {
500
+ /* @__PURE__ */ jsxDEV4(StatCard, {
186
501
  label: "Success Rate",
187
502
  value: `${(metrics.successRate * 100).toFixed(1)}%`
188
503
  }, undefined, false, undefined, this),
189
- /* @__PURE__ */ jsxDEV(StatCard, {
504
+ /* @__PURE__ */ jsxDEV4(StatCard, {
190
505
  label: "Total Tokens",
191
506
  value: formatTokens(metrics.totalTokens)
192
507
  }, undefined, false, undefined, this),
193
- /* @__PURE__ */ jsxDEV(StatCard, {
508
+ /* @__PURE__ */ jsxDEV4(StatCard, {
194
509
  label: "Total Cost",
195
510
  value: `$${metrics.totalCostUsd.toFixed(2)}`
196
511
  }, undefined, false, undefined, this)
197
512
  ]
198
- }, undefined, true, undefined, this),
199
- /* @__PURE__ */ jsxDEV("div", {
200
- className: "rounded-lg border border-border",
201
- children: /* @__PURE__ */ jsxDEV("table", {
202
- className: "w-full",
203
- children: [
204
- /* @__PURE__ */ jsxDEV("thead", {
205
- className: "border-border border-b bg-muted/30",
206
- children: /* @__PURE__ */ jsxDEV("tr", {
207
- children: [
208
- /* @__PURE__ */ jsxDEV("th", {
209
- className: "px-4 py-3 text-left font-medium text-muted-foreground text-sm",
210
- children: "Run"
211
- }, undefined, false, undefined, this),
212
- /* @__PURE__ */ jsxDEV("th", {
213
- className: "px-4 py-3 text-left font-medium text-muted-foreground text-sm",
214
- children: "Agent"
215
- }, undefined, false, undefined, this),
216
- /* @__PURE__ */ jsxDEV("th", {
217
- className: "px-4 py-3 text-left font-medium text-muted-foreground text-sm",
218
- children: "Status"
219
- }, undefined, false, undefined, this),
220
- /* @__PURE__ */ jsxDEV("th", {
221
- className: "px-4 py-3 text-right font-medium text-muted-foreground text-sm",
222
- children: "Tokens"
223
- }, undefined, false, undefined, this),
224
- /* @__PURE__ */ jsxDEV("th", {
225
- className: "px-4 py-3 text-right font-medium text-muted-foreground text-sm",
226
- children: "Duration"
227
- }, undefined, false, undefined, this),
228
- /* @__PURE__ */ jsxDEV("th", {
229
- className: "px-4 py-3 text-right font-medium text-muted-foreground text-sm",
230
- children: "Cost"
231
- }, undefined, false, undefined, this)
232
- ]
233
- }, undefined, true, undefined, this)
234
- }, undefined, false, undefined, this),
235
- /* @__PURE__ */ jsxDEV("tbody", {
236
- className: "divide-y divide-border",
237
- children: data.items.map((run) => /* @__PURE__ */ jsxDEV("tr", {
238
- className: "cursor-pointer transition-colors hover:bg-muted/50",
239
- onClick: () => onRunClick?.(run.id),
240
- children: [
241
- /* @__PURE__ */ jsxDEV("td", {
242
- className: "px-4 py-3",
243
- children: [
244
- /* @__PURE__ */ jsxDEV("div", {
245
- className: "font-mono text-sm",
246
- children: run.id.slice(-8)
247
- }, undefined, false, undefined, this),
248
- /* @__PURE__ */ jsxDEV("div", {
249
- className: "text-muted-foreground text-xs",
250
- children: run.queuedAt.toLocaleString()
251
- }, undefined, false, undefined, this)
252
- ]
253
- }, undefined, true, undefined, this),
254
- /* @__PURE__ */ jsxDEV("td", {
255
- className: "px-4 py-3",
256
- children: /* @__PURE__ */ jsxDEV("span", {
257
- className: "font-medium",
258
- children: run.agentName
259
- }, undefined, false, undefined, this)
260
- }, undefined, false, undefined, this),
261
- /* @__PURE__ */ jsxDEV("td", {
262
- className: "px-4 py-3",
263
- children: /* @__PURE__ */ jsxDEV(StatusChip, {
264
- tone: getStatusTone(run.status),
265
- label: run.status
266
- }, undefined, false, undefined, this)
267
- }, undefined, false, undefined, this),
268
- /* @__PURE__ */ jsxDEV("td", {
269
- className: "px-4 py-3 text-right font-mono text-sm",
270
- children: formatTokens(run.totalTokens)
271
- }, undefined, false, undefined, this),
272
- /* @__PURE__ */ jsxDEV("td", {
273
- className: "px-4 py-3 text-right font-mono text-sm",
274
- children: formatDuration(run.durationMs)
275
- }, undefined, false, undefined, this),
276
- /* @__PURE__ */ jsxDEV("td", {
277
- className: "px-4 py-3 text-right font-mono text-sm",
278
- children: formatCost(run.estimatedCostUsd)
279
- }, undefined, false, undefined, this)
280
- ]
281
- }, run.id, true, undefined, this))
282
- }, undefined, false, undefined, this)
283
- ]
284
- }, undefined, true, undefined, this)
285
- }, undefined, false, undefined, this),
286
- /* @__PURE__ */ jsxDEV("div", {
287
- className: "text-center text-muted-foreground text-sm",
288
- children: [
289
- "Showing ",
290
- data.items.length,
291
- " of ",
292
- data.total,
293
- " runs"
294
- ]
295
- }, undefined, true, undefined, this)
513
+ }, undefined, true, undefined, this) : null,
514
+ /* @__PURE__ */ jsxDEV4(RunDataTable, {
515
+ runs: data.items,
516
+ totalItems: data.total,
517
+ pageIndex: pagination.pageIndex,
518
+ pageSize: pagination.pageSize,
519
+ sorting,
520
+ loading,
521
+ onSortingChange: (nextSorting) => {
522
+ setSorting(nextSorting);
523
+ setPagination((current) => ({ ...current, pageIndex: 0 }));
524
+ },
525
+ onPaginationChange: setPagination,
526
+ onRunClick
527
+ }, undefined, false, undefined, this)
296
528
  ]
297
529
  }, undefined, true, undefined, this);
298
530
  }
299
531
 
300
532
  // src/ui/hooks/useToolList.ts
301
533
  import { useTemplateRuntime as useTemplateRuntime3 } from "@contractspec/lib.example-shared-ui";
302
- import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
534
+ import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useState as useState4 } from "react";
303
535
  function useToolList(options = {}) {
304
536
  const { handlers, projectId } = useTemplateRuntime3();
305
537
  const { agent } = handlers;
306
- const [data, setData] = useState3(null);
307
- const [loading, setLoading] = useState3(true);
308
- const [error, setError] = useState3(null);
309
- const [page, setPage] = useState3(1);
538
+ const [data, setData] = useState4(null);
539
+ const [loading, setLoading] = useState4(true);
540
+ const [error, setError] = useState4(null);
541
+ const [page, setPage] = useState4(1);
310
542
  const fetchData = useCallback3(async () => {
311
543
  setLoading(true);
312
544
  setError(null);
@@ -337,7 +569,7 @@ function useToolList(options = {}) {
337
569
  useEffect3(() => {
338
570
  fetchData();
339
571
  }, [fetchData]);
340
- const { stats, groupedByCategory, categoryStats } = useMemo2(() => {
572
+ const { stats, groupedByCategory, categoryStats } = useMemo3(() => {
341
573
  if (!data)
342
574
  return { stats: null, groupedByCategory: {}, categoryStats: [] };
343
575
  const items = data.items;
@@ -382,16 +614,16 @@ function useToolList(options = {}) {
382
614
 
383
615
  // src/ui/views/ToolRegistryView.tsx
384
616
  import {
385
- Button,
617
+ Button as Button2,
386
618
  EmptyState as EmptyState2,
387
619
  EntityCard,
388
620
  ErrorState as ErrorState2,
389
621
  LoaderBlock as LoaderBlock2,
390
622
  StatCard as StatCard2,
391
623
  StatCardGroup as StatCardGroup2,
392
- StatusChip as StatusChip2
624
+ StatusChip as StatusChip3
393
625
  } from "@contractspec/lib.design-system";
394
- import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
626
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
395
627
  "use client";
396
628
  var categoryIcons = {
397
629
  RETRIEVAL: "\uD83D\uDD0D",
@@ -421,12 +653,12 @@ function ToolRegistryView({
421
653
  }) {
422
654
  const { data, loading, error, groupedByCategory, categoryStats, refetch } = useToolList();
423
655
  if (loading && !data) {
424
- return /* @__PURE__ */ jsxDEV2(LoaderBlock2, {
656
+ return /* @__PURE__ */ jsxDEV5(LoaderBlock2, {
425
657
  label: "Loading tools..."
426
658
  }, undefined, false, undefined, this);
427
659
  }
428
660
  if (error) {
429
- return /* @__PURE__ */ jsxDEV2(ErrorState2, {
661
+ return /* @__PURE__ */ jsxDEV5(ErrorState2, {
430
662
  title: "Failed to load tools",
431
663
  description: error.message,
432
664
  onRetry: refetch,
@@ -434,64 +666,64 @@ function ToolRegistryView({
434
666
  }, undefined, false, undefined, this);
435
667
  }
436
668
  if (!data?.items.length) {
437
- return /* @__PURE__ */ jsxDEV2(EmptyState2, {
669
+ return /* @__PURE__ */ jsxDEV5(EmptyState2, {
438
670
  title: "No tools registered",
439
671
  description: "Create your first tool to extend agent capabilities.",
440
- primaryAction: onCreateTool ? /* @__PURE__ */ jsxDEV2(Button, {
672
+ primaryAction: onCreateTool ? /* @__PURE__ */ jsxDEV5(Button2, {
441
673
  onPress: onCreateTool,
442
674
  children: "Create Tool"
443
675
  }, undefined, false, undefined, this) : undefined
444
676
  }, undefined, false, undefined, this);
445
677
  }
446
- return /* @__PURE__ */ jsxDEV2("div", {
678
+ return /* @__PURE__ */ jsxDEV5("div", {
447
679
  className: "space-y-8",
448
680
  children: [
449
- /* @__PURE__ */ jsxDEV2(StatCardGroup2, {
681
+ /* @__PURE__ */ jsxDEV5(StatCardGroup2, {
450
682
  children: [
451
- /* @__PURE__ */ jsxDEV2(StatCard2, {
683
+ /* @__PURE__ */ jsxDEV5(StatCard2, {
452
684
  label: "Total Tools",
453
685
  value: data.total
454
686
  }, undefined, false, undefined, this),
455
- categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsxDEV2(StatCard2, {
687
+ categoryStats.slice(0, 3).map(({ category, count }) => /* @__PURE__ */ jsxDEV5(StatCard2, {
456
688
  label: `${categoryIcons[category] ?? ""} ${category}`,
457
689
  value: count
458
690
  }, category, false, undefined, this))
459
691
  ]
460
692
  }, undefined, true, undefined, this),
461
- Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV2("section", {
693
+ Object.entries(groupedByCategory).map(([category, tools]) => /* @__PURE__ */ jsxDEV5("section", {
462
694
  className: "space-y-4",
463
695
  children: [
464
- /* @__PURE__ */ jsxDEV2("div", {
696
+ /* @__PURE__ */ jsxDEV5("div", {
465
697
  className: "flex items-center gap-2",
466
698
  children: [
467
- /* @__PURE__ */ jsxDEV2("span", {
699
+ /* @__PURE__ */ jsxDEV5("span", {
468
700
  className: "text-2xl",
469
701
  children: categoryIcons[category]
470
702
  }, undefined, false, undefined, this),
471
- /* @__PURE__ */ jsxDEV2("h3", {
703
+ /* @__PURE__ */ jsxDEV5("h3", {
472
704
  className: "font-semibold text-lg",
473
705
  children: category
474
706
  }, undefined, false, undefined, this),
475
- /* @__PURE__ */ jsxDEV2("span", {
707
+ /* @__PURE__ */ jsxDEV5("span", {
476
708
  className: "rounded-full bg-muted px-2 py-0.5 text-muted-foreground text-xs",
477
709
  children: tools.length
478
710
  }, undefined, false, undefined, this)
479
711
  ]
480
712
  }, undefined, true, undefined, this),
481
- /* @__PURE__ */ jsxDEV2("div", {
713
+ /* @__PURE__ */ jsxDEV5("div", {
482
714
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
483
- children: tools.map((tool) => /* @__PURE__ */ jsxDEV2(EntityCard, {
715
+ children: tools.map((tool) => /* @__PURE__ */ jsxDEV5(EntityCard, {
484
716
  cardTitle: tool.name,
485
717
  cardSubtitle: `v${tool.version}`,
486
- meta: /* @__PURE__ */ jsxDEV2("p", {
718
+ meta: /* @__PURE__ */ jsxDEV5("p", {
487
719
  className: "text-muted-foreground text-sm",
488
720
  children: tool.description
489
721
  }, undefined, false, undefined, this),
490
- chips: /* @__PURE__ */ jsxDEV2(StatusChip2, {
722
+ chips: /* @__PURE__ */ jsxDEV5(StatusChip3, {
491
723
  tone: getStatusTone2(tool.status),
492
724
  label: tool.status
493
725
  }, undefined, false, undefined, this),
494
- footer: /* @__PURE__ */ jsxDEV2("code", {
726
+ footer: /* @__PURE__ */ jsxDEV5("code", {
495
727
  className: "text-muted-foreground text-xs",
496
728
  children: tool.name
497
729
  }, undefined, false, undefined, this),
@@ -506,16 +738,16 @@ function ToolRegistryView({
506
738
 
507
739
  // src/ui/views/AgentListView.tsx
508
740
  import {
509
- Button as Button2,
741
+ Button as Button3,
510
742
  EmptyState as EmptyState3,
511
743
  EntityCard as EntityCard2,
512
744
  ErrorState as ErrorState3,
513
745
  LoaderBlock as LoaderBlock3,
514
746
  StatCard as StatCard3,
515
747
  StatCardGroup as StatCardGroup3,
516
- StatusChip as StatusChip3
748
+ StatusChip as StatusChip4
517
749
  } from "@contractspec/lib.design-system";
518
- import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
750
+ import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
519
751
  "use client";
520
752
  function getStatusTone3(status) {
521
753
  switch (status) {
@@ -533,12 +765,12 @@ function getStatusTone3(status) {
533
765
  function AgentListView() {
534
766
  const { data, loading, error, stats, refetch } = useAgentList();
535
767
  if (loading && !data) {
536
- return /* @__PURE__ */ jsxDEV3(LoaderBlock3, {
768
+ return /* @__PURE__ */ jsxDEV6(LoaderBlock3, {
537
769
  label: "Loading agents..."
538
770
  }, undefined, false, undefined, this);
539
771
  }
540
772
  if (error) {
541
- return /* @__PURE__ */ jsxDEV3(ErrorState3, {
773
+ return /* @__PURE__ */ jsxDEV6(ErrorState3, {
542
774
  title: "Failed to load agents",
543
775
  description: error.message,
544
776
  onRetry: refetch,
@@ -546,61 +778,61 @@ function AgentListView() {
546
778
  }, undefined, false, undefined, this);
547
779
  }
548
780
  if (!data?.items.length) {
549
- return /* @__PURE__ */ jsxDEV3(EmptyState3, {
781
+ return /* @__PURE__ */ jsxDEV6(EmptyState3, {
550
782
  title: "No agents yet",
551
783
  description: "Create your first AI agent to get started."
552
784
  }, undefined, false, undefined, this);
553
785
  }
554
- return /* @__PURE__ */ jsxDEV3("div", {
786
+ return /* @__PURE__ */ jsxDEV6("div", {
555
787
  className: "space-y-6",
556
788
  children: [
557
- stats && /* @__PURE__ */ jsxDEV3(StatCardGroup3, {
789
+ stats && /* @__PURE__ */ jsxDEV6(StatCardGroup3, {
558
790
  children: [
559
- /* @__PURE__ */ jsxDEV3(StatCard3, {
791
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
560
792
  label: "Total Agents",
561
793
  value: stats.total
562
794
  }, undefined, false, undefined, this),
563
- /* @__PURE__ */ jsxDEV3(StatCard3, {
795
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
564
796
  label: "Active",
565
797
  value: stats.active
566
798
  }, undefined, false, undefined, this),
567
- /* @__PURE__ */ jsxDEV3(StatCard3, {
799
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
568
800
  label: "Paused",
569
801
  value: stats.paused
570
802
  }, undefined, false, undefined, this),
571
- /* @__PURE__ */ jsxDEV3(StatCard3, {
803
+ /* @__PURE__ */ jsxDEV6(StatCard3, {
572
804
  label: "Draft",
573
805
  value: stats.draft
574
806
  }, undefined, false, undefined, this)
575
807
  ]
576
808
  }, undefined, true, undefined, this),
577
- /* @__PURE__ */ jsxDEV3("div", {
809
+ /* @__PURE__ */ jsxDEV6("div", {
578
810
  className: "flex items-center justify-between",
579
811
  children: [
580
- /* @__PURE__ */ jsxDEV3("h3", {
812
+ /* @__PURE__ */ jsxDEV6("h3", {
581
813
  className: "font-semibold text-lg",
582
814
  children: "Agents"
583
815
  }, undefined, false, undefined, this),
584
- /* @__PURE__ */ jsxDEV3(Button2, {
816
+ /* @__PURE__ */ jsxDEV6(Button3, {
585
817
  onPress: () => alert("Create Agent clicked!"),
586
818
  children: "Create Agent"
587
819
  }, undefined, false, undefined, this)
588
820
  ]
589
821
  }, undefined, true, undefined, this),
590
- /* @__PURE__ */ jsxDEV3("div", {
822
+ /* @__PURE__ */ jsxDEV6("div", {
591
823
  className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
592
- children: data.items.map((agent) => /* @__PURE__ */ jsxDEV3(EntityCard2, {
824
+ children: data.items.map((agent) => /* @__PURE__ */ jsxDEV6(EntityCard2, {
593
825
  cardTitle: agent.name,
594
826
  cardSubtitle: agent.modelName,
595
- meta: /* @__PURE__ */ jsxDEV3("p", {
827
+ meta: /* @__PURE__ */ jsxDEV6("p", {
596
828
  className: "text-muted-foreground text-sm",
597
829
  children: agent.description
598
830
  }, undefined, false, undefined, this),
599
- chips: /* @__PURE__ */ jsxDEV3(StatusChip3, {
831
+ chips: /* @__PURE__ */ jsxDEV6(StatusChip4, {
600
832
  tone: getStatusTone3(agent.status),
601
833
  label: agent.status
602
834
  }, undefined, false, undefined, this),
603
- footer: /* @__PURE__ */ jsxDEV3("span", {
835
+ footer: /* @__PURE__ */ jsxDEV6("span", {
604
836
  className: "text-muted-foreground text-xs",
605
837
  children: [
606
838
  "Created ",