@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.
- package/.turbo/turbo-build$colon$bundle.log +280 -0
- package/.turbo/turbo-build.log +281 -0
- package/CHANGELOG.md +368 -0
- package/LICENSE +21 -0
- package/README.md +86 -0
- package/dist/agent/agent.entity.d.ts +55 -0
- package/dist/agent/agent.entity.d.ts.map +1 -0
- package/dist/agent/agent.entity.js +136 -0
- package/dist/agent/agent.entity.js.map +1 -0
- package/dist/agent/agent.enum.d.ts +18 -0
- package/dist/agent/agent.enum.d.ts.map +1 -0
- package/dist/agent/agent.enum.js +34 -0
- package/dist/agent/agent.enum.js.map +1 -0
- package/dist/agent/agent.event.d.ts +128 -0
- package/dist/agent/agent.event.d.ts.map +1 -0
- package/dist/agent/agent.event.js +210 -0
- package/dist/agent/agent.event.js.map +1 -0
- package/dist/agent/agent.handler.d.ts +100 -0
- package/dist/agent/agent.handler.d.ts.map +1 -0
- package/dist/agent/agent.handler.js +84 -0
- package/dist/agent/agent.handler.js.map +1 -0
- package/dist/agent/agent.operation.d.ts +471 -0
- package/dist/agent/agent.operation.d.ts.map +1 -0
- package/dist/agent/agent.operation.js +486 -0
- package/dist/agent/agent.operation.js.map +1 -0
- package/dist/agent/agent.presentation.d.ts +18 -0
- package/dist/agent/agent.presentation.d.ts.map +1 -0
- package/dist/agent/agent.presentation.js +89 -0
- package/dist/agent/agent.presentation.js.map +1 -0
- package/dist/agent/agent.schema.d.ts +401 -0
- package/dist/agent/agent.schema.d.ts.map +1 -0
- package/dist/agent/agent.schema.js +406 -0
- package/dist/agent/agent.schema.js.map +1 -0
- package/dist/agent/agent.test-spec.d.ts +8 -0
- package/dist/agent/agent.test-spec.d.ts.map +1 -0
- package/dist/agent/agent.test-spec.js +65 -0
- package/dist/agent/agent.test-spec.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.js +9 -0
- package/dist/agent.capability.d.ts +7 -0
- package/dist/agent.capability.d.ts.map +1 -0
- package/dist/agent.capability.js +20 -0
- package/dist/agent.capability.js.map +1 -0
- package/dist/agent.feature.d.ts +12 -0
- package/dist/agent.feature.d.ts.map +1 -0
- package/dist/agent.feature.js +305 -0
- package/dist/agent.feature.js.map +1 -0
- package/dist/docs/agent-console.docblock.d.ts +1 -0
- package/dist/docs/agent-console.docblock.js +113 -0
- package/dist/docs/agent-console.docblock.js.map +1 -0
- package/dist/docs/index.d.ts +1 -0
- package/dist/docs/index.js +1 -0
- package/dist/example.d.ts +7 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +58 -0
- package/dist/example.js.map +1 -0
- package/dist/handlers/agent.handlers.d.ts +135 -0
- package/dist/handlers/agent.handlers.d.ts.map +1 -0
- package/dist/handlers/agent.handlers.js +263 -0
- package/dist/handlers/agent.handlers.js.map +1 -0
- package/dist/handlers/index.d.ts +5 -0
- package/dist/handlers/index.js +6 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +50 -0
- package/dist/presentations/index.d.ts +4 -0
- package/dist/presentations/index.js +5 -0
- package/dist/run/index.d.ts +8 -0
- package/dist/run/index.js +9 -0
- package/dist/run/run.entity.d.ts +82 -0
- package/dist/run/run.entity.d.ts.map +1 -0
- package/dist/run/run.entity.js +205 -0
- package/dist/run/run.entity.js.map +1 -0
- package/dist/run/run.enum.d.ts +22 -0
- package/dist/run/run.enum.d.ts.map +1 -0
- package/dist/run/run.enum.js +45 -0
- package/dist/run/run.enum.js.map +1 -0
- package/dist/run/run.event.d.ts +290 -0
- package/dist/run/run.event.d.ts.map +1 -0
- package/dist/run/run.event.js +434 -0
- package/dist/run/run.event.js.map +1 -0
- package/dist/run/run.handler.d.ts +203 -0
- package/dist/run/run.handler.d.ts.map +1 -0
- package/dist/run/run.handler.js +83 -0
- package/dist/run/run.handler.js.map +1 -0
- package/dist/run/run.operation.d.ts +720 -0
- package/dist/run/run.operation.d.ts.map +1 -0
- package/dist/run/run.operation.js +626 -0
- package/dist/run/run.operation.js.map +1 -0
- package/dist/run/run.presentation.d.ts +14 -0
- package/dist/run/run.presentation.d.ts.map +1 -0
- package/dist/run/run.presentation.js +65 -0
- package/dist/run/run.presentation.js.map +1 -0
- package/dist/run/run.schema.d.ts +416 -0
- package/dist/run/run.schema.d.ts.map +1 -0
- package/dist/run/run.schema.js +338 -0
- package/dist/run/run.schema.js.map +1 -0
- package/dist/run/run.test-spec.d.ts +8 -0
- package/dist/run/run.test-spec.d.ts.map +1 -0
- package/dist/run/run.test-spec.js +65 -0
- package/dist/run/run.test-spec.js.map +1 -0
- package/dist/seeders/index.d.ts +10 -0
- package/dist/seeders/index.d.ts.map +1 -0
- package/dist/seeders/index.js +20 -0
- package/dist/seeders/index.js.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +5 -0
- package/dist/shared/mock-agents.d.ts +88 -0
- package/dist/shared/mock-agents.d.ts.map +1 -0
- package/dist/shared/mock-agents.js +94 -0
- package/dist/shared/mock-agents.js.map +1 -0
- package/dist/shared/mock-runs.d.ts +120 -0
- package/dist/shared/mock-runs.d.ts.map +1 -0
- package/dist/shared/mock-runs.js +118 -0
- package/dist/shared/mock-runs.js.map +1 -0
- package/dist/shared/mock-tools.d.ts +244 -0
- package/dist/shared/mock-tools.d.ts.map +1 -0
- package/dist/shared/mock-tools.js +181 -0
- package/dist/shared/mock-tools.js.map +1 -0
- package/dist/shared/overlay-types.d.ts +34 -0
- package/dist/shared/overlay-types.d.ts.map +1 -0
- package/dist/shared/overlay-types.js +0 -0
- package/dist/tool/index.d.ts +8 -0
- package/dist/tool/index.js +9 -0
- package/dist/tool/tool.entity.d.ts +42 -0
- package/dist/tool/tool.entity.d.ts.map +1 -0
- package/dist/tool/tool.entity.js +105 -0
- package/dist/tool/tool.entity.js.map +1 -0
- package/dist/tool/tool.enum.d.ts +18 -0
- package/dist/tool/tool.enum.d.ts.map +1 -0
- package/dist/tool/tool.enum.js +35 -0
- package/dist/tool/tool.enum.js.map +1 -0
- package/dist/tool/tool.event.d.ts +103 -0
- package/dist/tool/tool.event.d.ts.map +1 -0
- package/dist/tool/tool.event.js +159 -0
- package/dist/tool/tool.event.js.map +1 -0
- package/dist/tool/tool.handler.d.ts +315 -0
- package/dist/tool/tool.handler.d.ts.map +1 -0
- package/dist/tool/tool.handler.js +87 -0
- package/dist/tool/tool.handler.js.map +1 -0
- package/dist/tool/tool.operation.d.ts +411 -0
- package/dist/tool/tool.operation.d.ts.map +1 -0
- package/dist/tool/tool.operation.js +406 -0
- package/dist/tool/tool.operation.js.map +1 -0
- package/dist/tool/tool.presentation.d.ts +14 -0
- package/dist/tool/tool.presentation.d.ts.map +1 -0
- package/dist/tool/tool.presentation.js +65 -0
- package/dist/tool/tool.presentation.js.map +1 -0
- package/dist/tool/tool.schema.d.ts +218 -0
- package/dist/tool/tool.schema.d.ts.map +1 -0
- package/dist/tool/tool.schema.js +236 -0
- package/dist/tool/tool.schema.js.map +1 -0
- package/dist/tool/tool.test-spec.d.ts +8 -0
- package/dist/tool/tool.test-spec.d.ts.map +1 -0
- package/dist/tool/tool.test-spec.js +65 -0
- package/dist/tool/tool.test-spec.js.map +1 -0
- package/dist/ui/AgentDashboard.d.ts +7 -0
- package/dist/ui/AgentDashboard.d.ts.map +1 -0
- package/dist/ui/AgentDashboard.js +420 -0
- package/dist/ui/AgentDashboard.js.map +1 -0
- package/dist/ui/AgentRunList.d.ts +2 -0
- package/dist/ui/AgentRunList.js +5 -0
- package/dist/ui/AgentToolRegistry.d.ts +2 -0
- package/dist/ui/AgentToolRegistry.js +5 -0
- package/dist/ui/hooks/index.d.ts +6 -0
- package/dist/ui/hooks/index.js +8 -0
- package/dist/ui/hooks/useAgentList.d.ts +28 -0
- package/dist/ui/hooks/useAgentList.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentList.js +66 -0
- package/dist/ui/hooks/useAgentList.js.map +1 -0
- package/dist/ui/hooks/useAgentMutations.d.ts +29 -0
- package/dist/ui/hooks/useAgentMutations.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentMutations.js +124 -0
- package/dist/ui/hooks/useAgentMutations.js.map +1 -0
- package/dist/ui/hooks/useRunList.d.ts +24 -0
- package/dist/ui/hooks/useRunList.d.ts.map +1 -0
- package/dist/ui/hooks/useRunList.js +66 -0
- package/dist/ui/hooks/useRunList.js.map +1 -0
- package/dist/ui/hooks/useToolList.d.ts +40 -0
- package/dist/ui/hooks/useToolList.d.ts.map +1 -0
- package/dist/ui/hooks/useToolList.js +96 -0
- package/dist/ui/hooks/useToolList.js.map +1 -0
- package/dist/ui/index.d.ts +24 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/modals/AgentActionsModal.d.ts +27 -0
- package/dist/ui/modals/AgentActionsModal.d.ts.map +1 -0
- package/dist/ui/modals/AgentActionsModal.js +262 -0
- package/dist/ui/modals/AgentActionsModal.js.map +1 -0
- package/dist/ui/modals/CreateAgentModal.d.ts +25 -0
- package/dist/ui/modals/CreateAgentModal.d.ts.map +1 -0
- package/dist/ui/modals/CreateAgentModal.js +214 -0
- package/dist/ui/modals/CreateAgentModal.js.map +1 -0
- package/dist/ui/modals/index.d.ts +3 -0
- package/dist/ui/modals/index.js +4 -0
- package/dist/ui/overlays/demo-overlays.d.ts +19 -0
- package/dist/ui/overlays/demo-overlays.d.ts.map +1 -0
- package/dist/ui/overlays/demo-overlays.js +73 -0
- package/dist/ui/overlays/demo-overlays.js.map +1 -0
- package/dist/ui/overlays/index.d.ts +2 -0
- package/dist/ui/overlays/index.js +3 -0
- package/dist/ui/renderers/agent-list.markdown.d.ts +15 -0
- package/dist/ui/renderers/agent-list.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/agent-list.markdown.js +51 -0
- package/dist/ui/renderers/agent-list.markdown.js.map +1 -0
- package/dist/ui/renderers/agent-list.renderer.d.ts +11 -0
- package/dist/ui/renderers/agent-list.renderer.d.ts.map +1 -0
- package/dist/ui/renderers/agent-list.renderer.js +19 -0
- package/dist/ui/renderers/agent-list.renderer.js.map +1 -0
- package/dist/ui/renderers/dashboard.markdown.d.ts +15 -0
- package/dist/ui/renderers/dashboard.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/dashboard.markdown.js +100 -0
- package/dist/ui/renderers/dashboard.markdown.js.map +1 -0
- package/dist/ui/renderers/index.d.ts +6 -0
- package/dist/ui/renderers/index.js +7 -0
- package/dist/ui/renderers/run-list.markdown.d.ts +15 -0
- package/dist/ui/renderers/run-list.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/run-list.markdown.js +44 -0
- package/dist/ui/renderers/run-list.markdown.js.map +1 -0
- package/dist/ui/renderers/tool-registry.markdown.d.ts +15 -0
- package/dist/ui/renderers/tool-registry.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/tool-registry.markdown.js +55 -0
- package/dist/ui/renderers/tool-registry.markdown.js.map +1 -0
- package/dist/ui/views/AgentListView.d.ts +7 -0
- package/dist/ui/views/AgentListView.d.ts.map +1 -0
- package/dist/ui/views/AgentListView.js +93 -0
- package/dist/ui/views/AgentListView.js.map +1 -0
- package/dist/ui/views/RunListView.d.ts +14 -0
- package/dist/ui/views/RunListView.d.ts.map +1 -0
- package/dist/ui/views/RunListView.js +165 -0
- package/dist/ui/views/RunListView.js.map +1 -0
- package/dist/ui/views/ToolRegistryView.d.ts +14 -0
- package/dist/ui/views/ToolRegistryView.d.ts.map +1 -0
- package/dist/ui/views/ToolRegistryView.js +97 -0
- package/dist/ui/views/ToolRegistryView.js.map +1 -0
- package/dist/ui/views/index.d.ts +4 -0
- package/dist/ui/views/index.js +5 -0
- package/example.ts +1 -0
- package/package.json +155 -0
- package/src/agent/agent.entity.ts +137 -0
- package/src/agent/agent.enum.ts +31 -0
- package/src/agent/agent.event.ts +142 -0
- package/src/agent/agent.handler.ts +178 -0
- package/src/agent/agent.operation.ts +444 -0
- package/src/agent/agent.presentation.ts +80 -0
- package/src/agent/agent.schema.ts +214 -0
- package/src/agent/agent.test-spec.ts +55 -0
- package/src/agent/index.ts +67 -0
- package/src/agent.capability.ts +13 -0
- package/src/agent.feature.ts +147 -0
- package/src/docs/agent-console.docblock.ts +97 -0
- package/src/docs/index.ts +1 -0
- package/src/example.ts +41 -0
- package/src/handlers/agent.handlers.ts +572 -0
- package/src/handlers/index.ts +30 -0
- package/src/index.ts +32 -0
- package/src/presentations/index.ts +26 -0
- package/src/run/index.ts +68 -0
- package/src/run/run.entity.ts +175 -0
- package/src/run/run.enum.ts +43 -0
- package/src/run/run.event.ts +264 -0
- package/src/run/run.handler.ts +138 -0
- package/src/run/run.operation.ts +524 -0
- package/src/run/run.presentation.ts +54 -0
- package/src/run/run.schema.ts +169 -0
- package/src/run/run.test-spec.ts +55 -0
- package/src/seeders/index.ts +29 -0
- package/src/shared/index.ts +6 -0
- package/src/shared/mock-agents.ts +81 -0
- package/src/shared/mock-runs.ts +107 -0
- package/src/shared/mock-tools.ts +145 -0
- package/src/shared/overlay-types.ts +39 -0
- package/src/tool/index.ts +60 -0
- package/src/tool/tool.entity.ts +99 -0
- package/src/tool/tool.enum.ts +32 -0
- package/src/tool/tool.event.ts +119 -0
- package/src/tool/tool.handler.ts +154 -0
- package/src/tool/tool.operation.ts +366 -0
- package/src/tool/tool.presentation.ts +55 -0
- package/src/tool/tool.schema.ts +133 -0
- package/src/tool/tool.test-spec.ts +55 -0
- package/src/ui/AgentDashboard.tsx +416 -0
- package/src/ui/AgentRunList.tsx +8 -0
- package/src/ui/AgentToolRegistry.tsx +8 -0
- package/src/ui/hooks/index.ts +14 -0
- package/src/ui/hooks/useAgentList.ts +80 -0
- package/src/ui/hooks/useAgentMutations.ts +156 -0
- package/src/ui/hooks/useRunList.ts +81 -0
- package/src/ui/hooks/useToolList.ts +122 -0
- package/src/ui/index.ts +21 -0
- package/src/ui/modals/AgentActionsModal.tsx +306 -0
- package/src/ui/modals/CreateAgentModal.tsx +257 -0
- package/src/ui/modals/index.ts +2 -0
- package/src/ui/overlays/demo-overlays.ts +77 -0
- package/src/ui/overlays/index.ts +1 -0
- package/src/ui/renderers/agent-list.markdown.ts +84 -0
- package/src/ui/renderers/agent-list.renderer.tsx +27 -0
- package/src/ui/renderers/dashboard.markdown.ts +169 -0
- package/src/ui/renderers/index.ts +12 -0
- package/src/ui/renderers/run-list.markdown.ts +75 -0
- package/src/ui/renderers/tool-registry.markdown.ts +91 -0
- package/src/ui/views/AgentListView.tsx +113 -0
- package/src/ui/views/RunListView.tsx +173 -0
- package/src/ui/views/ToolRegistryView.tsx +140 -0
- package/src/ui/views/index.ts +6 -0
- package/tsconfig.json +10 -0
- package/tsconfig.tsbuildinfo +1 -0
- 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":";;;;;;;;;;AAoBA,SAAS,cACP,QAC8C;AAC9C,SAAQ,QAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK;EACL,KAAK,YACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,eAAe,IAAqB;AAC3C,KAAI,CAAC,GAAI,QAAO;AAChB,KAAI,KAAK,IAAM,QAAO,GAAG,GAAG;AAC5B,KAAI,KAAK,IAAO,QAAO,IAAI,KAAK,KAAM,QAAQ,EAAE,CAAC;AACjD,QAAO,IAAI,KAAK,KAAO,QAAQ,EAAE,CAAC;;AAGpC,SAAS,aAAa,QAAwB;AAC5C,KAAI,SAAS,IAAM,QAAO,OAAO,UAAU;AAC3C,KAAI,SAAS,IAAS,QAAO,IAAI,SAAS,KAAM,QAAQ,EAAE,CAAC;AAC3D,QAAO,IAAI,SAAS,KAAS,QAAQ,EAAE,CAAC;;AAG1C,SAAS,WAAW,MAAuB;AACzC,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,IAAI,KAAK,QAAQ,EAAE;;AAG5B,SAAgB,YAAY,EAAE,SAAS,cAAgC;CACrE,MAAM,EAAE,MAAM,SAAS,SAAS,OAAO,YAAY,WAAW,EAAE,SAAS,CAAC;AAE1E,KAAI,WAAW,CAAC,KACd,QAAO,oBAAC,eAAY,OAAM,oBAAoB;AAGhD,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;GACZ;AAIN,QACE,qBAAC;EAAI,WAAU;;GAEZ,WACC,qBAAC;IACC,oBAAC;KAAS,OAAM;KAAa,OAAO,QAAQ;MAAa;IACzD,oBAAC;KACC,OAAM;KACN,OAAO,IAAI,QAAQ,cAAc,KAAK,QAAQ,EAAE,CAAC;MACjD;IACF,oBAAC;KACC,OAAM;KACN,OAAO,aAAa,QAAQ,YAAY;MACxC;IACF,oBAAC;KACC,OAAM;KACN,OAAO,IAAI,QAAQ,aAAa,QAAQ,EAAE;MAC1C;OACY;GAIlB,oBAAC;IAAI,WAAU;cACb,qBAAC;KAAM,WAAU;gBACf,oBAAC;MAAM,WAAU;gBACf,qBAAC;OACC,oBAAC;QAAG,WAAU;kBAAgE;SAEzE;OACL,oBAAC;QAAG,WAAU;kBAAgE;SAEzE;OACL,oBAAC;QAAG,WAAU;kBAAgE;SAEzE;OACL,oBAAC;QAAG,WAAU;kBAAiE;SAE1E;OACL,oBAAC;QAAG,WAAU;kBAAiE;SAE1E;OACL,oBAAC;QAAG,WAAU;kBAAiE;SAE1E;UACF;OACC,EACR,oBAAC;MAAM,WAAU;gBACd,KAAK,MAAM,KAAK,QACf,qBAAC;OAEC,WAAU;OACV,eAAe,aAAa,IAAI,GAAG;;QAEnC,qBAAC;SAAG,WAAU;oBACZ,oBAAC;UAAI,WAAU;oBAAqB,IAAI,GAAG,MAAM,GAAG;WAAO,EAC3D,oBAAC;UAAI,WAAU;oBACZ,IAAI,SAAS,gBAAgB;WAC1B;UACH;QACL,oBAAC;SAAG,WAAU;mBACZ,oBAAC;UAAK,WAAU;oBAAe,IAAI;WAAiB;UACjD;QACL,oBAAC;SAAG,WAAU;mBACZ,oBAAC;UACC,MAAM,cAAc,IAAI,OAAO;UAC/B,OAAO,IAAI;WACX;UACC;QACL,oBAAC;SAAG,WAAU;mBACX,aAAa,IAAI,YAAY;UAC3B;QACL,oBAAC;SAAG,WAAU;mBACX,eAAe,IAAI,WAAW;UAC5B;QACL,oBAAC;SAAG,WAAU;mBACX,WAAW,IAAI,iBAAiB;UAC9B;;SA3BA,IAAI,GA4BN,CACL;OACI;MACF;KACJ;GAGN,qBAAC;IAAI,WAAU;;KAA4C;KAChD,KAAK,MAAM;KAAO;KAAK,KAAK;KAAM;;KACvC;;GACF"}
|
|
@@ -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"}
|
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
|
+
]);
|