@alepha/devtools 0.16.0 → 0.19.1

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 (236) hide show
  1. package/README.md +1 -5
  2. package/dist/index.browser.js +224 -0
  3. package/dist/index.browser.js.map +1 -0
  4. package/dist/index.d.ts +349 -321
  5. package/dist/index.js +293 -186
  6. package/dist/index.js.map +1 -1
  7. package/package.json +30 -23
  8. package/src/assets.ts +6 -0
  9. package/src/{api/entities → entities}/logs.ts +2 -2
  10. package/src/index.browser.ts +11 -0
  11. package/src/index.shared.ts +15 -0
  12. package/src/index.ts +11 -37
  13. package/src/{api/providers → providers}/DevToolsMetadataProvider.ts +84 -47
  14. package/src/providers/DevToolsProvider.ts +280 -0
  15. package/src/{api/schemas → schemas}/DevActionMetadata.ts +8 -0
  16. package/src/{api/schemas → schemas}/DevEntityMetadata.ts +3 -0
  17. package/src/{api/schemas → schemas}/DevMetadata.ts +13 -2
  18. package/src/{api/schemas → schemas}/DevPageMetadata.ts +3 -0
  19. package/src/{api/schemas → schemas}/DevTopicMetadata.ts +1 -0
  20. package/src/ui/AppRouter.tsx +55 -59
  21. package/src/ui/components/DevLayout.tsx +104 -84
  22. package/src/ui/components/configuration/ConfigAtoms.page.tsx +5 -0
  23. package/src/ui/components/configuration/ConfigAtoms.tsx +511 -0
  24. package/src/ui/components/configuration/ConfigEnv.page.tsx +5 -0
  25. package/src/ui/components/configuration/ConfigEnv.tsx +230 -0
  26. package/src/ui/components/configuration/DevConfiguration.tsx +36 -0
  27. package/src/ui/components/configuration/index.ts +3 -0
  28. package/src/ui/components/dashboard/DevDashboard.tsx +482 -0
  29. package/src/ui/components/database/DatabaseEditor.page.tsx +23 -0
  30. package/src/ui/components/database/DatabaseEditor.tsx +399 -0
  31. package/src/ui/components/database/DatabaseErd.page.tsx +28 -0
  32. package/src/ui/components/database/DatabaseErd.tsx +107 -0
  33. package/src/ui/components/database/DevDatabase.tsx +36 -0
  34. package/src/ui/components/database/EntityNode.tsx +83 -0
  35. package/src/ui/components/explorer/DevExplorer.tsx +351 -0
  36. package/src/ui/components/explorer/ExplorerTree.tsx +178 -0
  37. package/src/ui/components/explorer/panels/DevPanelAction.tsx +499 -0
  38. package/src/ui/components/explorer/panels/DevPanelCache.tsx +73 -0
  39. package/src/ui/components/explorer/panels/DevPanelPage.tsx +96 -0
  40. package/src/ui/components/explorer/panels/DevPanelQueue.tsx +51 -0
  41. package/src/ui/components/explorer/panels/DevPanelTopic.tsx +56 -0
  42. package/src/ui/components/explorer/panels/index.ts +5 -0
  43. package/src/ui/components/graph/DevDependencyGraph.tsx +35 -60
  44. package/src/ui/components/graph/GraphControls.tsx +10 -11
  45. package/src/ui/components/graph/NodeDetails.tsx +22 -29
  46. package/src/ui/components/graph/ProviderNode.tsx +4 -4
  47. package/src/ui/components/graph/helpers.ts +1 -1
  48. package/src/ui/components/logs/DevLogs.tsx +661 -0
  49. package/src/ui/components/logs/index.ts +1 -0
  50. package/src/ui/components/shared/TreeView.tsx +189 -0
  51. package/src/ui/main.css +17 -0
  52. package/src/ui/main.ts +2 -6
  53. package/LICENSE +0 -21
  54. package/assets/devtools/actions.html +0 -21
  55. package/assets/devtools/actions.html.br +0 -0
  56. package/assets/devtools/actions.html.gz +0 -0
  57. package/assets/devtools/asset.BJSLFcNT.css +0 -1
  58. package/assets/devtools/asset.BJSLFcNT.css.br +0 -0
  59. package/assets/devtools/asset.BJSLFcNT.css.gz +0 -0
  60. package/assets/devtools/asset.BZV40eAE.css +0 -1
  61. package/assets/devtools/asset.BZV40eAE.css.br +0 -0
  62. package/assets/devtools/asset.BZV40eAE.css.gz +0 -0
  63. package/assets/devtools/atoms.html +0 -21
  64. package/assets/devtools/atoms.html.br +0 -0
  65. package/assets/devtools/atoms.html.gz +0 -0
  66. package/assets/devtools/caches.html +0 -21
  67. package/assets/devtools/caches.html.br +0 -0
  68. package/assets/devtools/caches.html.gz +0 -0
  69. package/assets/devtools/chunk.1h5GuATm.js +0 -1
  70. package/assets/devtools/chunk.1h5GuATm.js.br +0 -0
  71. package/assets/devtools/chunk.1h5GuATm.js.gz +0 -0
  72. package/assets/devtools/chunk.3PgxxOdM.js +0 -1
  73. package/assets/devtools/chunk.3PgxxOdM.js.br +0 -0
  74. package/assets/devtools/chunk.3PgxxOdM.js.gz +0 -0
  75. package/assets/devtools/chunk.A_W3H6Aa.js +0 -1
  76. package/assets/devtools/chunk.A_W3H6Aa.js.br +0 -0
  77. package/assets/devtools/chunk.A_W3H6Aa.js.gz +0 -0
  78. package/assets/devtools/chunk.B5tL0VjH.js +0 -1
  79. package/assets/devtools/chunk.B5tL0VjH.js.br +0 -0
  80. package/assets/devtools/chunk.B5tL0VjH.js.gz +0 -0
  81. package/assets/devtools/chunk.B8p_Szro.js +0 -1
  82. package/assets/devtools/chunk.B8p_Szro.js.br +0 -0
  83. package/assets/devtools/chunk.B8p_Szro.js.gz +0 -0
  84. package/assets/devtools/chunk.BANy8c2v.js +0 -1
  85. package/assets/devtools/chunk.BANy8c2v.js.br +0 -0
  86. package/assets/devtools/chunk.BANy8c2v.js.gz +0 -0
  87. package/assets/devtools/chunk.BKph0hv1.js +0 -1
  88. package/assets/devtools/chunk.BKph0hv1.js.br +0 -0
  89. package/assets/devtools/chunk.BKph0hv1.js.gz +0 -0
  90. package/assets/devtools/chunk.BUs1kuwE.js +0 -1
  91. package/assets/devtools/chunk.BUs1kuwE.js.br +0 -0
  92. package/assets/devtools/chunk.BUs1kuwE.js.gz +0 -0
  93. package/assets/devtools/chunk.BVIEr21R.js +0 -1
  94. package/assets/devtools/chunk.BVIEr21R.js.br +0 -0
  95. package/assets/devtools/chunk.BVIEr21R.js.gz +0 -0
  96. package/assets/devtools/chunk.Bb3re2d8.js +0 -1
  97. package/assets/devtools/chunk.Bb3re2d8.js.br +0 -2
  98. package/assets/devtools/chunk.Bb3re2d8.js.gz +0 -0
  99. package/assets/devtools/chunk.BjFrJKj1.js +0 -1
  100. package/assets/devtools/chunk.BjFrJKj1.js.br +0 -2
  101. package/assets/devtools/chunk.BjFrJKj1.js.gz +0 -0
  102. package/assets/devtools/chunk.BkXzz14p.js +0 -1
  103. package/assets/devtools/chunk.BkXzz14p.js.br +0 -0
  104. package/assets/devtools/chunk.BkXzz14p.js.gz +0 -0
  105. package/assets/devtools/chunk.BlqFPyLh.js +0 -1
  106. package/assets/devtools/chunk.BlqFPyLh.js.br +0 -0
  107. package/assets/devtools/chunk.BlqFPyLh.js.gz +0 -0
  108. package/assets/devtools/chunk.BymZ9jU5.js +0 -1
  109. package/assets/devtools/chunk.BymZ9jU5.js.br +0 -0
  110. package/assets/devtools/chunk.BymZ9jU5.js.gz +0 -0
  111. package/assets/devtools/chunk.C0BD3Ujz.js +0 -1
  112. package/assets/devtools/chunk.C0BD3Ujz.js.br +0 -0
  113. package/assets/devtools/chunk.C0BD3Ujz.js.gz +0 -0
  114. package/assets/devtools/chunk.C63rzhbT.js +0 -1
  115. package/assets/devtools/chunk.C63rzhbT.js.br +0 -0
  116. package/assets/devtools/chunk.C63rzhbT.js.gz +0 -0
  117. package/assets/devtools/chunk.CJrYVzjN.js +0 -9
  118. package/assets/devtools/chunk.CJrYVzjN.js.br +0 -0
  119. package/assets/devtools/chunk.CJrYVzjN.js.gz +0 -0
  120. package/assets/devtools/chunk.CPGX3Xpx.js +0 -1
  121. package/assets/devtools/chunk.CPGX3Xpx.js.br +0 -1
  122. package/assets/devtools/chunk.CPGX3Xpx.js.gz +0 -0
  123. package/assets/devtools/chunk.Cf-3skUw.js +0 -1
  124. package/assets/devtools/chunk.Cf-3skUw.js.br +0 -0
  125. package/assets/devtools/chunk.Cf-3skUw.js.gz +0 -0
  126. package/assets/devtools/chunk.D7JLxcoJ.js +0 -7
  127. package/assets/devtools/chunk.D7JLxcoJ.js.br +0 -0
  128. package/assets/devtools/chunk.D7JLxcoJ.js.gz +0 -0
  129. package/assets/devtools/chunk.D7e5mBY4.js +0 -1
  130. package/assets/devtools/chunk.D7e5mBY4.js.br +0 -0
  131. package/assets/devtools/chunk.D7e5mBY4.js.gz +0 -0
  132. package/assets/devtools/chunk.DClU9Z1_.js +0 -1
  133. package/assets/devtools/chunk.DClU9Z1_.js.br +0 -0
  134. package/assets/devtools/chunk.DClU9Z1_.js.gz +0 -0
  135. package/assets/devtools/chunk.DE_M8b3Z.js +0 -1
  136. package/assets/devtools/chunk.DE_M8b3Z.js.br +0 -0
  137. package/assets/devtools/chunk.DE_M8b3Z.js.gz +0 -0
  138. package/assets/devtools/chunk.DWASJDBE.js +0 -1
  139. package/assets/devtools/chunk.DWASJDBE.js.br +0 -0
  140. package/assets/devtools/chunk.DWASJDBE.js.gz +0 -0
  141. package/assets/devtools/chunk.DfzRLqwW.js +0 -1
  142. package/assets/devtools/chunk.DfzRLqwW.js.br +0 -0
  143. package/assets/devtools/chunk.DfzRLqwW.js.gz +0 -0
  144. package/assets/devtools/chunk.Dww1YQtc.js +0 -1
  145. package/assets/devtools/chunk.Dww1YQtc.js.br +0 -0
  146. package/assets/devtools/chunk.Dww1YQtc.js.gz +0 -0
  147. package/assets/devtools/chunk.HFLdduaf.js +0 -1
  148. package/assets/devtools/chunk.HFLdduaf.js.br +0 -0
  149. package/assets/devtools/chunk.HFLdduaf.js.gz +0 -0
  150. package/assets/devtools/chunk.J-htqECs.js +0 -1
  151. package/assets/devtools/chunk.J-htqECs.js.br +0 -2
  152. package/assets/devtools/chunk.J-htqECs.js.gz +0 -0
  153. package/assets/devtools/chunk.JjTGVewZ.js +0 -2
  154. package/assets/devtools/chunk.JjTGVewZ.js.br +0 -0
  155. package/assets/devtools/chunk.JjTGVewZ.js.gz +0 -0
  156. package/assets/devtools/chunk.OV_89czZ.js +0 -1
  157. package/assets/devtools/chunk.OV_89czZ.js.br +0 -0
  158. package/assets/devtools/chunk.OV_89czZ.js.gz +0 -0
  159. package/assets/devtools/chunk.YFkMUqFM.js +0 -1
  160. package/assets/devtools/chunk.YFkMUqFM.js.br +0 -0
  161. package/assets/devtools/chunk.YFkMUqFM.js.gz +0 -0
  162. package/assets/devtools/chunk._KdUFIrt.js +0 -1
  163. package/assets/devtools/chunk._KdUFIrt.js.br +0 -0
  164. package/assets/devtools/chunk._KdUFIrt.js.gz +0 -0
  165. package/assets/devtools/chunk.pjP6xqG8.js +0 -1
  166. package/assets/devtools/chunk.pjP6xqG8.js.br +0 -0
  167. package/assets/devtools/chunk.pjP6xqG8.js.gz +0 -0
  168. package/assets/devtools/chunk.uTFtY0ae.js +0 -2
  169. package/assets/devtools/chunk.uTFtY0ae.js.br +0 -0
  170. package/assets/devtools/chunk.uTFtY0ae.js.gz +0 -0
  171. package/assets/devtools/chunk.uyVen0u2.js +0 -1
  172. package/assets/devtools/chunk.uyVen0u2.js.br +0 -0
  173. package/assets/devtools/chunk.uyVen0u2.js.gz +0 -0
  174. package/assets/devtools/chunk.vHjNjQS8.js +0 -1
  175. package/assets/devtools/chunk.vHjNjQS8.js.br +0 -0
  176. package/assets/devtools/chunk.vHjNjQS8.js.gz +0 -0
  177. package/assets/devtools/db.html +0 -21
  178. package/assets/devtools/db.html.br +0 -0
  179. package/assets/devtools/db.html.gz +0 -0
  180. package/assets/devtools/entry.DhzNl8q_.js +0 -79
  181. package/assets/devtools/entry.DhzNl8q_.js.br +0 -0
  182. package/assets/devtools/entry.DhzNl8q_.js.gz +0 -0
  183. package/assets/devtools/env.html +0 -21
  184. package/assets/devtools/env.html.br +0 -0
  185. package/assets/devtools/env.html.gz +0 -0
  186. package/assets/devtools/graph.html +0 -22
  187. package/assets/devtools/graph.html.br +0 -0
  188. package/assets/devtools/graph.html.gz +0 -0
  189. package/assets/devtools/index.html +0 -21
  190. package/assets/devtools/index.html.br +0 -0
  191. package/assets/devtools/index.html.gz +0 -0
  192. package/assets/devtools/logs.html +0 -21
  193. package/assets/devtools/logs.html.br +0 -0
  194. package/assets/devtools/logs.html.gz +0 -0
  195. package/assets/devtools/queues.html +0 -21
  196. package/assets/devtools/queues.html.br +0 -0
  197. package/assets/devtools/queues.html.gz +0 -0
  198. package/assets/devtools/topics.html +0 -21
  199. package/assets/devtools/topics.html.br +0 -0
  200. package/assets/devtools/topics.html.gz +0 -0
  201. package/src/api/DevToolsProvider.ts +0 -157
  202. package/src/api/providers/DevToolsDatabaseProvider.ts +0 -27
  203. package/src/api/repositories/LogRepository.ts +0 -8
  204. package/src/api/schemas/DevCommandMetadata.ts +0 -9
  205. package/src/ui/components/DevAtomsViewer.tsx +0 -637
  206. package/src/ui/components/DevCacheInspector.tsx +0 -423
  207. package/src/ui/components/DevDashboard.tsx +0 -38
  208. package/src/ui/components/DevEnvExplorer.tsx +0 -462
  209. package/src/ui/components/DevLogViewer.tsx +0 -252
  210. package/src/ui/components/DevQueueMonitor.tsx +0 -51
  211. package/src/ui/components/DevTopicsViewer.tsx +0 -686
  212. package/src/ui/components/actions/ActionGroup.tsx +0 -37
  213. package/src/ui/components/actions/ActionItem.tsx +0 -138
  214. package/src/ui/components/actions/DevActionsExplorer.tsx +0 -132
  215. package/src/ui/components/actions/MethodBadge.tsx +0 -18
  216. package/src/ui/components/actions/SchemaViewer.tsx +0 -21
  217. package/src/ui/components/actions/TryItPanel.tsx +0 -140
  218. package/src/ui/components/actions/constants.ts +0 -7
  219. package/src/ui/components/actions/helpers.ts +0 -18
  220. package/src/ui/components/actions/index.ts +0 -8
  221. package/src/ui/components/db/ColumnBadge.tsx +0 -55
  222. package/src/ui/components/db/DevDbStudio.tsx +0 -485
  223. package/src/ui/components/db/constants.ts +0 -11
  224. package/src/ui/components/db/index.ts +0 -4
  225. package/src/ui/components/db/types.ts +0 -7
  226. package/src/ui/styles.css +0 -1
  227. /package/src/{api/schemas → schemas}/DevAtomMetadata.ts +0 -0
  228. /package/src/{api/schemas → schemas}/DevBucketMetadata.ts +0 -0
  229. /package/src/{api/schemas → schemas}/DevCacheMetadata.ts +0 -0
  230. /package/src/{api/schemas → schemas}/DevEnvMetadata.ts +0 -0
  231. /package/src/{api/schemas → schemas}/DevModuleMetadata.ts +0 -0
  232. /package/src/{api/schemas → schemas}/DevProviderMetadata.ts +0 -0
  233. /package/src/{api/schemas → schemas}/DevQueueMetadata.ts +0 -0
  234. /package/src/{api/schemas → schemas}/DevRealmMetadata.ts +0 -0
  235. /package/src/{api/schemas → schemas}/DevRouteMetadata.ts +0 -0
  236. /package/src/{api/schemas → schemas}/DevSchedulerMetadata.ts +0 -0
@@ -1,423 +0,0 @@
1
- import { ui } from "@alepha/ui";
2
- import {
3
- ActionIcon,
4
- Badge,
5
- Box,
6
- Button,
7
- Flex,
8
- ScrollArea,
9
- Stack,
10
- Table,
11
- Tabs,
12
- Text,
13
- TextInput,
14
- Tooltip,
15
- } from "@mantine/core";
16
- import {
17
- IconArchive,
18
- IconClock,
19
- IconKey,
20
- IconSearch,
21
- IconServer,
22
- IconTrash,
23
- } from "@tabler/icons-react";
24
- import { useInject } from "alepha/react";
25
- import { HttpClient } from "alepha/server";
26
- import { useEffect, useMemo, useState } from "react";
27
- import type { DevCacheMetadata } from "../../api/schemas/DevCacheMetadata.ts";
28
- import { devMetadataSchema } from "../../api/schemas/DevMetadata.ts";
29
-
30
- const PROVIDER_COLORS: Record<string, string> = {
31
- memory: "#69db7c",
32
- redis: "#ff6b6b",
33
- default: "#495057",
34
- };
35
-
36
- const getProviderColor = (provider: string): string => {
37
- return PROVIDER_COLORS[provider] ?? PROVIDER_COLORS.default;
38
- };
39
-
40
- const formatTtl = (ttl: any): string => {
41
- if (!ttl) return "No TTL";
42
- if (typeof ttl === "number") {
43
- if (ttl < 60) return `${ttl}s`;
44
- if (ttl < 3600) return `${Math.floor(ttl / 60)}m`;
45
- if (ttl < 86400) return `${Math.floor(ttl / 3600)}h`;
46
- return `${Math.floor(ttl / 86400)}d`;
47
- }
48
- return String(ttl);
49
- };
50
-
51
- const CacheSidebar = ({
52
- caches,
53
- selectedCache,
54
- onSelectCache,
55
- search,
56
- onSearchChange,
57
- }: {
58
- caches: DevCacheMetadata[];
59
- selectedCache: DevCacheMetadata | null;
60
- onSelectCache: (cache: DevCacheMetadata) => void;
61
- search: string;
62
- onSearchChange: (search: string) => void;
63
- }) => {
64
- // Group caches by provider
65
- const grouped = useMemo(() => {
66
- const groups: Record<string, DevCacheMetadata[]> = {};
67
- for (const cache of caches) {
68
- const provider = cache.provider || "default";
69
- if (!groups[provider]) groups[provider] = [];
70
- groups[provider].push(cache);
71
- }
72
- return groups;
73
- }, [caches]);
74
-
75
- const providers = Object.keys(grouped).sort();
76
-
77
- return (
78
- <Stack gap={0} h="100%">
79
- <Box p="sm" style={{ borderBottom: `1px solid ${ui.colors.border}` }}>
80
- <TextInput
81
- placeholder="Search caches..."
82
- leftSection={<IconSearch size={14} />}
83
- size="xs"
84
- value={search}
85
- onChange={(e) => onSearchChange(e.target.value)}
86
- />
87
- </Box>
88
- <ScrollArea style={{ flex: 1 }}>
89
- {providers.map((provider) => (
90
- <Box key={provider}>
91
- <Text
92
- size="xs"
93
- fw={600}
94
- c="dimmed"
95
- px="sm"
96
- py="xs"
97
- style={{
98
- backgroundColor: ui.colors.background,
99
- borderBottom: `1px solid ${ui.colors.border}`,
100
- textTransform: "uppercase",
101
- letterSpacing: "0.05em",
102
- }}
103
- >
104
- {provider}
105
- </Text>
106
- {grouped[provider].map((cache) => {
107
- const isSelected = selectedCache?.name === cache.name;
108
- const providerColor = getProviderColor(cache.provider);
109
- return (
110
- <Flex
111
- key={cache.name}
112
- align="center"
113
- gap="xs"
114
- px="sm"
115
- py={6}
116
- onClick={() => onSelectCache(cache)}
117
- style={{
118
- cursor: "pointer",
119
- backgroundColor: isSelected
120
- ? `${providerColor}15`
121
- : undefined,
122
- borderLeft: isSelected
123
- ? `2px solid ${providerColor}`
124
- : "2px solid transparent",
125
- borderBottom: `1px solid ${ui.colors.border}`,
126
- opacity: cache.disabled ? 0.5 : 1,
127
- }}
128
- >
129
- <IconArchive size={14} opacity={0.5} />
130
- <Text size="sm" style={{ flex: 1 }} truncate>
131
- {cache.name}
132
- </Text>
133
- {cache.disabled && (
134
- <Badge size="xs" variant="light" color="gray">
135
- off
136
- </Badge>
137
- )}
138
- </Flex>
139
- );
140
- })}
141
- </Box>
142
- ))}
143
- </ScrollArea>
144
- </Stack>
145
- );
146
- };
147
-
148
- const ConfigTab = ({ cache }: { cache: DevCacheMetadata }) => {
149
- return (
150
- <ScrollArea h="100%" p="md">
151
- <Stack gap="lg">
152
- <Box>
153
- <Text size="sm" fw={600} mb="xs">
154
- Configuration
155
- </Text>
156
- <Table striped highlightOnHover withTableBorder>
157
- <Table.Tbody>
158
- <Table.Tr>
159
- <Table.Td w={150}>
160
- <Text size="sm" c="dimmed">
161
- Name
162
- </Text>
163
- </Table.Td>
164
- <Table.Td>
165
- <Text size="sm" ff="monospace">
166
- {cache.name}
167
- </Text>
168
- </Table.Td>
169
- </Table.Tr>
170
- <Table.Tr>
171
- <Table.Td>
172
- <Text size="sm" c="dimmed">
173
- Provider
174
- </Text>
175
- </Table.Td>
176
- <Table.Td>
177
- <Badge
178
- size="xs"
179
- variant="light"
180
- color={cache.provider === "redis" ? "red" : "green"}
181
- >
182
- {cache.provider}
183
- </Badge>
184
- </Table.Td>
185
- </Table.Tr>
186
- <Table.Tr>
187
- <Table.Td>
188
- <Text size="sm" c="dimmed">
189
- TTL
190
- </Text>
191
- </Table.Td>
192
- <Table.Td>
193
- <Flex align="center" gap="xs">
194
- <IconClock size={14} opacity={0.5} />
195
- <Text size="sm" ff="monospace">
196
- {formatTtl(cache.ttl)}
197
- </Text>
198
- </Flex>
199
- </Table.Td>
200
- </Table.Tr>
201
- <Table.Tr>
202
- <Table.Td>
203
- <Text size="sm" c="dimmed">
204
- Status
205
- </Text>
206
- </Table.Td>
207
- <Table.Td>
208
- <Badge
209
- size="xs"
210
- variant="light"
211
- color={cache.disabled ? "gray" : "green"}
212
- >
213
- {cache.disabled ? "Disabled" : "Enabled"}
214
- </Badge>
215
- </Table.Td>
216
- </Table.Tr>
217
- </Table.Tbody>
218
- </Table>
219
- </Box>
220
-
221
- <Box>
222
- <Text size="sm" fw={600} mb="xs">
223
- Actions
224
- </Text>
225
- <Flex gap="sm">
226
- <Tooltip label="Clear all cached entries (coming soon)">
227
- <Button
228
- size="xs"
229
- variant="light"
230
- color="red"
231
- leftSection={<IconTrash size={14} />}
232
- disabled
233
- >
234
- Clear All
235
- </Button>
236
- </Tooltip>
237
- </Flex>
238
- </Box>
239
- </Stack>
240
- </ScrollArea>
241
- );
242
- };
243
-
244
- const KeysTab = ({ cache }: { cache: DevCacheMetadata }) => {
245
- const [pattern, setPattern] = useState("");
246
-
247
- return (
248
- <Flex direction="column" h="100%">
249
- <Box p="sm" style={{ borderBottom: `1px solid ${ui.colors.border}` }}>
250
- <Flex gap="sm" align="center">
251
- <TextInput
252
- placeholder="Filter by pattern..."
253
- leftSection={<IconSearch size={14} />}
254
- size="xs"
255
- value={pattern}
256
- onChange={(e) => setPattern(e.target.value)}
257
- style={{ flex: 1 }}
258
- />
259
- <Tooltip label="Invalidate matching keys (coming soon)">
260
- <ActionIcon size="sm" variant="light" color="orange" disabled>
261
- <IconTrash size={14} />
262
- </ActionIcon>
263
- </Tooltip>
264
- </Flex>
265
- </Box>
266
- <Flex align="center" justify="center" style={{ flex: 1 }} c="dimmed">
267
- <Stack align="center" gap="xs">
268
- <IconKey size={48} opacity={0.3} />
269
- <Text size="sm">Key browser coming soon</Text>
270
- <Text size="xs" c="dimmed">
271
- Browse and manage cached keys for {cache.name}
272
- </Text>
273
- </Stack>
274
- </Flex>
275
- </Flex>
276
- );
277
- };
278
-
279
- const CachePanel = ({ cache }: { cache: DevCacheMetadata }) => {
280
- const providerColor = getProviderColor(cache.provider);
281
-
282
- return (
283
- <Flex direction="column" h="100%">
284
- {/* Header */}
285
- <Box
286
- px="md"
287
- py="sm"
288
- style={{
289
- borderBottom: `1px solid ${ui.colors.border}`,
290
- backgroundColor: `${providerColor}08`,
291
- }}
292
- >
293
- <Flex align="center" gap="sm">
294
- <IconArchive size={18} opacity={0.7} />
295
- <Text size="md" fw={600}>
296
- {cache.name}
297
- </Text>
298
- <Badge
299
- size="xs"
300
- variant="light"
301
- color={cache.provider === "redis" ? "red" : "green"}
302
- >
303
- {cache.provider}
304
- </Badge>
305
- {cache.disabled && (
306
- <Badge size="xs" variant="light" color="gray">
307
- disabled
308
- </Badge>
309
- )}
310
- </Flex>
311
- </Box>
312
-
313
- {/* Tabs */}
314
- <Tabs
315
- defaultValue="config"
316
- style={{ flex: 1, display: "flex", flexDirection: "column" }}
317
- >
318
- <Tabs.List px="md">
319
- <Tabs.Tab value="config">Config</Tabs.Tab>
320
- <Tabs.Tab value="keys">Keys</Tabs.Tab>
321
- </Tabs.List>
322
-
323
- <Tabs.Panel value="config" style={{ flex: 1, overflow: "hidden" }}>
324
- <ConfigTab cache={cache} />
325
- </Tabs.Panel>
326
-
327
- <Tabs.Panel value="keys" style={{ flex: 1, overflow: "hidden" }}>
328
- <KeysTab cache={cache} />
329
- </Tabs.Panel>
330
- </Tabs>
331
- </Flex>
332
- );
333
- };
334
-
335
- const EmptyState = () => (
336
- <Flex align="center" justify="center" h="100%" c="dimmed">
337
- <Stack align="center" gap="xs">
338
- <IconArchive size={48} opacity={0.3} />
339
- <Text size="sm">Select a cache to view its configuration</Text>
340
- </Stack>
341
- </Flex>
342
- );
343
-
344
- const NoCachesState = () => (
345
- <Flex align="center" justify="center" h="100%" c="dimmed">
346
- <Stack align="center" gap="xs">
347
- <IconServer size={48} opacity={0.3} />
348
- <Text>No caches found</Text>
349
- <Text size="sm" c="dimmed">
350
- Add caches using $cache primitive to see them here
351
- </Text>
352
- </Stack>
353
- </Flex>
354
- );
355
-
356
- export const DevCacheInspector = () => {
357
- const http = useInject(HttpClient);
358
- const [caches, setCaches] = useState<DevCacheMetadata[]>([]);
359
- const [loading, setLoading] = useState(true);
360
- const [selectedCache, setSelectedCache] = useState<DevCacheMetadata | null>(
361
- null,
362
- );
363
- const [search, setSearch] = useState("");
364
-
365
- // Fetch caches
366
- useEffect(() => {
367
- http
368
- .fetch("/devtools/api/metadata", {
369
- schema: { response: devMetadataSchema },
370
- })
371
- .then((res) => {
372
- setCaches(res.data.caches);
373
- setLoading(false);
374
- });
375
- }, []);
376
-
377
- // Filter caches by search
378
- const filteredCaches = useMemo(() => {
379
- if (!search) return caches;
380
- const searchLower = search.toLowerCase();
381
- return caches.filter((c) => c.name.toLowerCase().includes(searchLower));
382
- }, [caches, search]);
383
-
384
- if (loading) {
385
- return (
386
- <Flex align="center" justify="center" h="100%">
387
- <Text c="dimmed">Loading...</Text>
388
- </Flex>
389
- );
390
- }
391
-
392
- if (caches.length === 0) {
393
- return <NoCachesState />;
394
- }
395
-
396
- return (
397
- <Flex h="100%" style={{ overflow: "hidden" }}>
398
- {/* Sidebar */}
399
- <Box
400
- w={240}
401
- style={{
402
- borderRight: `1px solid ${ui.colors.border}`,
403
- backgroundColor: ui.colors.surface,
404
- }}
405
- >
406
- <CacheSidebar
407
- caches={filteredCaches}
408
- selectedCache={selectedCache}
409
- onSelectCache={setSelectedCache}
410
- search={search}
411
- onSearchChange={setSearch}
412
- />
413
- </Box>
414
-
415
- {/* Main content */}
416
- <Box style={{ flex: 1, overflow: "hidden" }}>
417
- {selectedCache ? <CachePanel cache={selectedCache} /> : <EmptyState />}
418
- </Box>
419
- </Flex>
420
- );
421
- };
422
-
423
- export default DevCacheInspector;
@@ -1,38 +0,0 @@
1
- import { Alert, Flex, Text } from "@mantine/core";
2
- import { IconInfoCircle, IconTools } from "@tabler/icons-react";
3
-
4
- export const DevDashboard = () => {
5
- return (
6
- <Flex
7
- direction="column"
8
- align="center"
9
- justify="center"
10
- flex={1}
11
- w="100%"
12
- gap="xl"
13
- >
14
- <Flex direction="column" align="center" gap={4} mb="md">
15
- <Flex align="center" gap="sm">
16
- <IconTools size={40} stroke={1.5} opacity={0.8} />
17
- <Text size="2rem" fw={300} style={{ letterSpacing: "-0.02em" }}>
18
- Alepha DevTools
19
- </Text>
20
- </Flex>
21
- </Flex>
22
-
23
- <Alert
24
- icon={<IconInfoCircle />}
25
- title="Work In Progress"
26
- color="blue"
27
- variant="light"
28
- maw={500}
29
- >
30
- DevTools is still in active development. New features and improvements
31
- are being added regularly. Use the navigation to explore available
32
- tools.
33
- </Alert>
34
- </Flex>
35
- );
36
- };
37
-
38
- export default DevDashboard;