@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.
Files changed (125) hide show
  1. package/README.md +137 -0
  2. package/dist/index.cjs +5069 -3
  3. package/dist/index.d.cts +301 -3
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.mts +302 -3
  6. package/dist/index.d.mts.map +1 -1
  7. package/dist/index.mjs +5010 -3
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +30 -12
  10. package/src/components/KeyboardShortcuts/KeyboardShortcutsProvider.tsx +113 -0
  11. package/src/components/KeyboardShortcuts/ShortcutsHelpDialog.tsx +82 -0
  12. package/src/components/KeyboardShortcuts/context.ts +23 -0
  13. package/src/components/KeyboardShortcuts/index.ts +8 -0
  14. package/src/components/KeyboardShortcuts/types.ts +11 -0
  15. package/src/components/dashboard/Badge/Badge.stories.tsx +29 -0
  16. package/src/components/dashboard/Badge/index.tsx +32 -0
  17. package/src/components/dashboard/Button/Button.stories.tsx +107 -0
  18. package/src/components/dashboard/Button/index.tsx +63 -0
  19. package/src/components/dashboard/Card/Card.stories.tsx +81 -0
  20. package/src/components/dashboard/Card/index.tsx +58 -0
  21. package/src/components/dashboard/Chart/Chart.stories.tsx +48 -0
  22. package/src/components/dashboard/Chart/index.tsx +74 -0
  23. package/src/components/dashboard/DatePicker/DatePicker.stories.tsx +33 -0
  24. package/src/components/dashboard/DatePicker/index.tsx +41 -0
  25. package/src/components/dashboard/Divider/Divider.stories.tsx +17 -0
  26. package/src/components/dashboard/Divider/index.tsx +49 -0
  27. package/src/components/dashboard/Empty/Empty.stories.tsx +48 -0
  28. package/src/components/dashboard/Empty/index.tsx +46 -0
  29. package/src/components/dashboard/Grid/Grid.stories.tsx +52 -0
  30. package/src/components/dashboard/Grid/index.tsx +26 -0
  31. package/src/components/dashboard/Heading/Heading.stories.tsx +25 -0
  32. package/src/components/dashboard/Heading/index.tsx +27 -0
  33. package/src/components/dashboard/List/List.stories.tsx +37 -0
  34. package/src/components/dashboard/List/index.tsx +24 -0
  35. package/src/components/dashboard/Metric/Metric.stories.tsx +65 -0
  36. package/src/components/dashboard/Metric/index.tsx +36 -0
  37. package/src/components/dashboard/Stack/Stack.stories.tsx +61 -0
  38. package/src/components/dashboard/Stack/index.tsx +33 -0
  39. package/src/components/dashboard/Table/Table.stories.tsx +38 -0
  40. package/src/components/dashboard/Table/index.tsx +104 -0
  41. package/src/components/dashboard/Text/Text.stories.tsx +53 -0
  42. package/src/components/dashboard/Text/index.tsx +18 -0
  43. package/src/components/dashboard/index.ts +46 -0
  44. package/src/components/index.ts +17 -0
  45. package/src/components/observability/LogTimeline/LogDetailPane/AttributesTab.tsx +56 -0
  46. package/src/components/observability/LogTimeline/LogDetailPane/JsonTreeView.tsx +139 -0
  47. package/src/components/observability/LogTimeline/LogDetailPane/index.tsx +271 -0
  48. package/src/components/observability/LogTimeline/LogFilter.stories.tsx +66 -0
  49. package/src/components/observability/LogTimeline/LogFilter.test.tsx +696 -0
  50. package/src/components/observability/LogTimeline/LogFilter.tsx +674 -0
  51. package/src/components/observability/LogTimeline/LogRow.tsx +174 -0
  52. package/src/components/observability/LogTimeline/LogTimeline.stories.tsx +154 -0
  53. package/src/components/observability/LogTimeline/index.tsx +542 -0
  54. package/src/components/observability/LogTimeline/shortcuts.ts +18 -0
  55. package/src/components/observability/MetricHistogram/MetricHistogram.stories.tsx +20 -0
  56. package/src/components/observability/MetricHistogram/index.tsx +303 -0
  57. package/src/components/observability/MetricStat/MetricStat.stories.tsx +30 -0
  58. package/src/components/observability/MetricStat/index.tsx +281 -0
  59. package/src/components/observability/MetricTable/MetricTable.stories.tsx +20 -0
  60. package/src/components/observability/MetricTable/index.tsx +194 -0
  61. package/src/components/observability/MetricTimeSeries/MetricTimeSeries.stories.tsx +28 -0
  62. package/src/components/observability/MetricTimeSeries/index.tsx +462 -0
  63. package/src/components/observability/RawDataTable/RawDataTable.stories.tsx +27 -0
  64. package/src/components/observability/RawDataTable/index.tsx +131 -0
  65. package/src/components/observability/ServiceList/ServiceList.stories.tsx +20 -0
  66. package/src/components/observability/ServiceList/index.tsx +60 -0
  67. package/src/components/observability/ServiceList/shortcuts.ts +6 -0
  68. package/src/components/observability/TabBar/TabBar.stories.tsx +34 -0
  69. package/src/components/observability/TabBar/index.tsx +46 -0
  70. package/src/components/observability/TraceDetail/TraceDetail.stories.tsx +51 -0
  71. package/src/components/observability/TraceDetail/index.tsx +53 -0
  72. package/src/components/observability/TraceSearch/TraceSearch.stories.tsx +49 -0
  73. package/src/components/observability/TraceSearch/index.tsx +292 -0
  74. package/src/components/observability/TraceTimeline/DetailPane/AttributesTab.tsx +152 -0
  75. package/src/components/observability/TraceTimeline/DetailPane/EventsTab.tsx +128 -0
  76. package/src/components/observability/TraceTimeline/DetailPane/LinksTab.tsx +210 -0
  77. package/src/components/observability/TraceTimeline/DetailPane/index.tsx +174 -0
  78. package/src/components/observability/TraceTimeline/SpanRow.tsx +173 -0
  79. package/src/components/observability/TraceTimeline/TimelineBar.tsx +41 -0
  80. package/src/components/observability/TraceTimeline/Tooltip.tsx +42 -0
  81. package/src/components/observability/TraceTimeline/TraceHeader.tsx +88 -0
  82. package/src/components/observability/TraceTimeline/TraceTimeline.stories.tsx +25 -0
  83. package/src/components/observability/TraceTimeline/index.tsx +478 -0
  84. package/src/components/observability/TraceTimeline/shortcuts.ts +16 -0
  85. package/src/components/observability/__fixtures__/logs.ts +476 -0
  86. package/src/components/observability/__fixtures__/metrics.ts +216 -0
  87. package/src/components/observability/__fixtures__/raw-table.ts +204 -0
  88. package/src/components/observability/__fixtures__/services.ts +8 -0
  89. package/src/components/observability/__fixtures__/trace-summaries.ts +81 -0
  90. package/src/components/observability/__fixtures__/traces.ts +396 -0
  91. package/src/components/observability/index.ts +66 -0
  92. package/src/components/observability/renderers/OtelMetricDiscovery.tsx +77 -0
  93. package/src/components/observability/renderers/OtelMetricHistogram.tsx +29 -0
  94. package/src/components/observability/renderers/OtelMetricStat.tsx +44 -0
  95. package/src/components/observability/renderers/OtelMetricTable.tsx +29 -0
  96. package/src/components/observability/renderers/OtelMetricTimeSeries.tsx +30 -0
  97. package/src/components/observability/renderers/index.ts +5 -0
  98. package/src/components/observability/shared/LoadingSkeleton.tsx +43 -0
  99. package/src/components/observability/types.ts +113 -0
  100. package/src/components/observability/utils/attributes.ts +17 -0
  101. package/src/components/observability/utils/colors.ts +29 -0
  102. package/src/components/observability/utils/flatten-tree.ts +53 -0
  103. package/src/components/observability/utils/lttb.ts +121 -0
  104. package/src/components/observability/utils/time.ts +46 -0
  105. package/src/hooks/use-kopai-data.test.ts +296 -0
  106. package/src/hooks/use-kopai-data.ts +64 -0
  107. package/src/hooks/use-live-logs.test.ts +193 -0
  108. package/src/hooks/use-live-logs.ts +113 -0
  109. package/src/index.ts +15 -0
  110. package/src/lib/__snapshots__/generate-prompt-instructions.test.ts.snap +33 -0
  111. package/src/lib/catalog.ts +165 -0
  112. package/src/lib/component-catalog.test.ts +357 -0
  113. package/src/lib/component-catalog.ts +171 -0
  114. package/src/lib/dashboard-datasource.ts +76 -0
  115. package/src/lib/generate-prompt-instructions.test.ts +27 -0
  116. package/src/lib/generate-prompt-instructions.ts +185 -0
  117. package/src/lib/log-buffer.test.ts +88 -0
  118. package/src/lib/log-buffer.ts +62 -0
  119. package/src/lib/observability-catalog.ts +143 -0
  120. package/src/lib/renderer.test.tsx +693 -0
  121. package/src/lib/renderer.tsx +276 -0
  122. package/src/pages/observability.tsx +828 -0
  123. package/src/providers/kopai-provider.tsx +51 -0
  124. package/src/styles/globals.css +46 -0
  125. 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
+ ```