@kopai/ui 0.0.4 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/index.cjs +5069 -3
- package/dist/index.d.cts +301 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +302 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +5010 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +30 -12
- package/src/components/KeyboardShortcuts/KeyboardShortcutsProvider.tsx +113 -0
- package/src/components/KeyboardShortcuts/ShortcutsHelpDialog.tsx +82 -0
- package/src/components/KeyboardShortcuts/context.ts +23 -0
- package/src/components/KeyboardShortcuts/index.ts +8 -0
- package/src/components/KeyboardShortcuts/types.ts +11 -0
- package/src/components/dashboard/Badge/Badge.stories.tsx +29 -0
- package/src/components/dashboard/Badge/index.tsx +32 -0
- package/src/components/dashboard/Button/Button.stories.tsx +107 -0
- package/src/components/dashboard/Button/index.tsx +63 -0
- package/src/components/dashboard/Card/Card.stories.tsx +81 -0
- package/src/components/dashboard/Card/index.tsx +58 -0
- package/src/components/dashboard/Chart/Chart.stories.tsx +48 -0
- package/src/components/dashboard/Chart/index.tsx +74 -0
- package/src/components/dashboard/DatePicker/DatePicker.stories.tsx +33 -0
- package/src/components/dashboard/DatePicker/index.tsx +41 -0
- package/src/components/dashboard/Divider/Divider.stories.tsx +17 -0
- package/src/components/dashboard/Divider/index.tsx +49 -0
- package/src/components/dashboard/Empty/Empty.stories.tsx +48 -0
- package/src/components/dashboard/Empty/index.tsx +46 -0
- package/src/components/dashboard/Grid/Grid.stories.tsx +52 -0
- package/src/components/dashboard/Grid/index.tsx +26 -0
- package/src/components/dashboard/Heading/Heading.stories.tsx +25 -0
- package/src/components/dashboard/Heading/index.tsx +27 -0
- package/src/components/dashboard/List/List.stories.tsx +37 -0
- package/src/components/dashboard/List/index.tsx +24 -0
- package/src/components/dashboard/Metric/Metric.stories.tsx +65 -0
- package/src/components/dashboard/Metric/index.tsx +36 -0
- package/src/components/dashboard/Stack/Stack.stories.tsx +61 -0
- package/src/components/dashboard/Stack/index.tsx +33 -0
- package/src/components/dashboard/Table/Table.stories.tsx +38 -0
- package/src/components/dashboard/Table/index.tsx +104 -0
- package/src/components/dashboard/Text/Text.stories.tsx +53 -0
- package/src/components/dashboard/Text/index.tsx +18 -0
- package/src/components/dashboard/index.ts +46 -0
- package/src/components/index.ts +17 -0
- package/src/components/observability/LogTimeline/LogDetailPane/AttributesTab.tsx +56 -0
- package/src/components/observability/LogTimeline/LogDetailPane/JsonTreeView.tsx +139 -0
- package/src/components/observability/LogTimeline/LogDetailPane/index.tsx +271 -0
- package/src/components/observability/LogTimeline/LogFilter.stories.tsx +66 -0
- package/src/components/observability/LogTimeline/LogFilter.test.tsx +696 -0
- package/src/components/observability/LogTimeline/LogFilter.tsx +674 -0
- package/src/components/observability/LogTimeline/LogRow.tsx +174 -0
- package/src/components/observability/LogTimeline/LogTimeline.stories.tsx +154 -0
- package/src/components/observability/LogTimeline/index.tsx +542 -0
- package/src/components/observability/LogTimeline/shortcuts.ts +18 -0
- package/src/components/observability/MetricHistogram/MetricHistogram.stories.tsx +20 -0
- package/src/components/observability/MetricHistogram/index.tsx +303 -0
- package/src/components/observability/MetricStat/MetricStat.stories.tsx +30 -0
- package/src/components/observability/MetricStat/index.tsx +281 -0
- package/src/components/observability/MetricTable/MetricTable.stories.tsx +20 -0
- package/src/components/observability/MetricTable/index.tsx +194 -0
- package/src/components/observability/MetricTimeSeries/MetricTimeSeries.stories.tsx +28 -0
- package/src/components/observability/MetricTimeSeries/index.tsx +462 -0
- package/src/components/observability/RawDataTable/RawDataTable.stories.tsx +27 -0
- package/src/components/observability/RawDataTable/index.tsx +131 -0
- package/src/components/observability/ServiceList/ServiceList.stories.tsx +20 -0
- package/src/components/observability/ServiceList/index.tsx +60 -0
- package/src/components/observability/ServiceList/shortcuts.ts +6 -0
- package/src/components/observability/TabBar/TabBar.stories.tsx +34 -0
- package/src/components/observability/TabBar/index.tsx +46 -0
- package/src/components/observability/TraceDetail/TraceDetail.stories.tsx +51 -0
- package/src/components/observability/TraceDetail/index.tsx +53 -0
- package/src/components/observability/TraceSearch/TraceSearch.stories.tsx +49 -0
- package/src/components/observability/TraceSearch/index.tsx +292 -0
- package/src/components/observability/TraceTimeline/DetailPane/AttributesTab.tsx +152 -0
- package/src/components/observability/TraceTimeline/DetailPane/EventsTab.tsx +128 -0
- package/src/components/observability/TraceTimeline/DetailPane/LinksTab.tsx +210 -0
- package/src/components/observability/TraceTimeline/DetailPane/index.tsx +174 -0
- package/src/components/observability/TraceTimeline/SpanRow.tsx +173 -0
- package/src/components/observability/TraceTimeline/TimelineBar.tsx +41 -0
- package/src/components/observability/TraceTimeline/Tooltip.tsx +42 -0
- package/src/components/observability/TraceTimeline/TraceHeader.tsx +88 -0
- package/src/components/observability/TraceTimeline/TraceTimeline.stories.tsx +25 -0
- package/src/components/observability/TraceTimeline/index.tsx +478 -0
- package/src/components/observability/TraceTimeline/shortcuts.ts +16 -0
- package/src/components/observability/__fixtures__/logs.ts +476 -0
- package/src/components/observability/__fixtures__/metrics.ts +216 -0
- package/src/components/observability/__fixtures__/raw-table.ts +204 -0
- package/src/components/observability/__fixtures__/services.ts +8 -0
- package/src/components/observability/__fixtures__/trace-summaries.ts +81 -0
- package/src/components/observability/__fixtures__/traces.ts +396 -0
- package/src/components/observability/index.ts +66 -0
- package/src/components/observability/renderers/OtelMetricDiscovery.tsx +77 -0
- package/src/components/observability/renderers/OtelMetricHistogram.tsx +29 -0
- package/src/components/observability/renderers/OtelMetricStat.tsx +44 -0
- package/src/components/observability/renderers/OtelMetricTable.tsx +29 -0
- package/src/components/observability/renderers/OtelMetricTimeSeries.tsx +30 -0
- package/src/components/observability/renderers/index.ts +5 -0
- package/src/components/observability/shared/LoadingSkeleton.tsx +43 -0
- package/src/components/observability/types.ts +113 -0
- package/src/components/observability/utils/attributes.ts +17 -0
- package/src/components/observability/utils/colors.ts +29 -0
- package/src/components/observability/utils/flatten-tree.ts +53 -0
- package/src/components/observability/utils/lttb.ts +121 -0
- package/src/components/observability/utils/time.ts +46 -0
- package/src/hooks/use-kopai-data.test.ts +296 -0
- package/src/hooks/use-kopai-data.ts +64 -0
- package/src/hooks/use-live-logs.test.ts +193 -0
- package/src/hooks/use-live-logs.ts +113 -0
- package/src/index.ts +15 -0
- package/src/lib/__snapshots__/generate-prompt-instructions.test.ts.snap +33 -0
- package/src/lib/catalog.ts +165 -0
- package/src/lib/component-catalog.test.ts +357 -0
- package/src/lib/component-catalog.ts +171 -0
- package/src/lib/dashboard-datasource.ts +76 -0
- package/src/lib/generate-prompt-instructions.test.ts +27 -0
- package/src/lib/generate-prompt-instructions.ts +185 -0
- package/src/lib/log-buffer.test.ts +88 -0
- package/src/lib/log-buffer.ts +62 -0
- package/src/lib/observability-catalog.ts +143 -0
- package/src/lib/renderer.test.tsx +693 -0
- package/src/lib/renderer.tsx +276 -0
- package/src/pages/observability.tsx +828 -0
- package/src/providers/kopai-provider.tsx +51 -0
- package/src/styles/globals.css +46 -0
- package/src/vite-env.d.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# @kopai/ui
|
|
2
|
+
|
|
3
|
+
React component library for rendering LLM-generated UI trees. Define typed component catalogs, create renderers, and generate prompt instructions for AI models.
|
|
4
|
+
|
|
5
|
+
## Exports
|
|
6
|
+
|
|
7
|
+
| Export | Type | Description |
|
|
8
|
+
| ---------------------------- | --------- | ------------------------------------------------------- |
|
|
9
|
+
| `createCatalog` | function | Creates typed component catalog with validation schema |
|
|
10
|
+
| `createRendererFromCatalog` | function | Creates renderer bound to catalog |
|
|
11
|
+
| `generatePromptInstructions` | function | Generates LLM prompt from catalog |
|
|
12
|
+
| `Renderer` | component | Low-level renderer (prefer `createRendererFromCatalog`) |
|
|
13
|
+
| `RendererComponentProps` | type | Props type for component implementations |
|
|
14
|
+
| `uiPlugin` | function | Fastify plugin for serving UI |
|
|
15
|
+
| `KopaiSDKProvider` | component | React context provider for SDK |
|
|
16
|
+
| `useKopaiSDK` | hook | Access SDK client in components |
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import {
|
|
23
|
+
createCatalog,
|
|
24
|
+
createRendererFromCatalog,
|
|
25
|
+
generatePromptInstructions,
|
|
26
|
+
type RendererComponentProps,
|
|
27
|
+
} from "@kopai/ui";
|
|
28
|
+
|
|
29
|
+
// 1. Create catalog with typed components
|
|
30
|
+
const catalog = createCatalog({
|
|
31
|
+
name: "my-catalog",
|
|
32
|
+
components: {
|
|
33
|
+
Card: {
|
|
34
|
+
hasChildren: true,
|
|
35
|
+
description: "Container card",
|
|
36
|
+
props: z.object({
|
|
37
|
+
title: z.string().nullable(),
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
Text: {
|
|
41
|
+
hasChildren: false,
|
|
42
|
+
description: "Text content",
|
|
43
|
+
props: z.object({
|
|
44
|
+
content: z.string(),
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// 2. Define components using RendererComponentProps
|
|
51
|
+
function Card({
|
|
52
|
+
element,
|
|
53
|
+
children,
|
|
54
|
+
}: RendererComponentProps<typeof catalog.components.Card>) {
|
|
55
|
+
return (
|
|
56
|
+
<div className="card">
|
|
57
|
+
{element.props.title && <h2>{element.props.title}</h2>}
|
|
58
|
+
{children}
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function Text({
|
|
64
|
+
element,
|
|
65
|
+
}: RendererComponentProps<typeof catalog.components.Text>) {
|
|
66
|
+
return <p>{element.props.content}</p>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 3. Create renderer
|
|
70
|
+
const MyRenderer = createRendererFromCatalog(catalog, { Card, Text });
|
|
71
|
+
|
|
72
|
+
// 4. Generate prompt instructions for LLM
|
|
73
|
+
const instructions = generatePromptInstructions(catalog);
|
|
74
|
+
|
|
75
|
+
// 5. Render UITree from LLM
|
|
76
|
+
const tree = {
|
|
77
|
+
root: "card-1",
|
|
78
|
+
elements: {
|
|
79
|
+
"card-1": {
|
|
80
|
+
key: "card-1",
|
|
81
|
+
type: "Card",
|
|
82
|
+
props: { title: "Hello" },
|
|
83
|
+
children: ["text-1"],
|
|
84
|
+
parentKey: "",
|
|
85
|
+
},
|
|
86
|
+
"text-1": {
|
|
87
|
+
key: "text-1",
|
|
88
|
+
type: "Text",
|
|
89
|
+
props: { content: "World" },
|
|
90
|
+
children: [],
|
|
91
|
+
parentKey: "card-1",
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
function App() {
|
|
97
|
+
return <MyRenderer tree={tree} />;
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Data Fetching
|
|
102
|
+
|
|
103
|
+
Components can receive data via `dataSource`. The renderer uses `useKopaiData` hook internally:
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
function Table({
|
|
107
|
+
element,
|
|
108
|
+
hasData,
|
|
109
|
+
data,
|
|
110
|
+
loading,
|
|
111
|
+
error,
|
|
112
|
+
refetch,
|
|
113
|
+
}: RendererComponentProps<typeof catalog.components.Table>) {
|
|
114
|
+
if (!hasData) return null;
|
|
115
|
+
if (loading) return <div>Loading...</div>;
|
|
116
|
+
if (error) return <div>Error: {error.message}</div>;
|
|
117
|
+
|
|
118
|
+
return <table>{/* render data */}</table>;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Wrap your app with `KopaiSDKProvider` to enable data fetching:
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
import { KopaiSDKProvider } from "@kopai/ui";
|
|
126
|
+
import { createKopaiClient } from "@kopai/sdk";
|
|
127
|
+
|
|
128
|
+
const client = createKopaiClient({ baseUrl: "..." });
|
|
129
|
+
|
|
130
|
+
function App() {
|
|
131
|
+
return (
|
|
132
|
+
<KopaiSDKProvider client={client}>
|
|
133
|
+
<MyRenderer tree={tree} />
|
|
134
|
+
</KopaiSDKProvider>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
```
|