@castlemilk/omega 0.6.12 → 0.6.14

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 (164) hide show
  1. package/dist/cli.js +241 -1228
  2. package/dist/server/dist/app.d.ts.map +1 -1
  3. package/dist/server/dist/app.js +2 -0
  4. package/dist/server/dist/app.js.map +1 -1
  5. package/dist/server/dist/lib/run-task.js +2 -2
  6. package/dist/server/dist/lib/run-task.js.map +1 -1
  7. package/dist/server/dist/routes/metrics.d.ts.map +1 -1
  8. package/dist/server/dist/routes/metrics.js +2 -76
  9. package/dist/server/dist/routes/metrics.js.map +1 -1
  10. package/dist/server/dist/routes/reports.d.ts +3 -0
  11. package/dist/server/dist/routes/reports.d.ts.map +1 -0
  12. package/dist/server/dist/routes/reports.js +44 -0
  13. package/dist/server/dist/routes/reports.js.map +1 -0
  14. package/dist/server/dist/routes/tasks.js.map +1 -1
  15. package/dist/server/node_modules/.package-lock.json +3 -3
  16. package/dist/server/node_modules/@grpc/proto-loader/build/bin/proto-loader-gen-types.js +0 -0
  17. package/dist/server/node_modules/@omega/agent/dist/executor.d.ts.map +1 -1
  18. package/dist/server/node_modules/@omega/agent/dist/executor.js +5 -40
  19. package/dist/server/node_modules/@omega/agent/dist/executor.js.map +1 -1
  20. package/dist/server/node_modules/@omega/agent/dist/index.d.ts +1 -1
  21. package/dist/server/node_modules/@omega/agent/dist/index.d.ts.map +1 -1
  22. package/dist/server/node_modules/@omega/agent/dist/index.js +1 -1
  23. package/dist/server/node_modules/@omega/agent/dist/index.js.map +1 -1
  24. package/dist/server/node_modules/@omega/agent/dist/planner.d.ts +0 -5
  25. package/dist/server/node_modules/@omega/agent/dist/planner.d.ts.map +1 -1
  26. package/dist/server/node_modules/@omega/agent/dist/planner.js +3 -21
  27. package/dist/server/node_modules/@omega/agent/dist/planner.js.map +1 -1
  28. package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.d.ts.map +1 -1
  29. package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.js +2 -2
  30. package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.js.map +1 -1
  31. package/dist/server/node_modules/@omega/agent/dist/prompts.d.ts.map +1 -1
  32. package/dist/server/node_modules/@omega/agent/dist/prompts.js +31 -6
  33. package/dist/server/node_modules/@omega/agent/dist/prompts.js.map +1 -1
  34. package/dist/server/node_modules/@omega/agent/package.json +0 -4
  35. package/dist/server/node_modules/@omega/core/dist/provider.d.ts +2 -12
  36. package/dist/server/node_modules/@omega/core/dist/provider.d.ts.map +1 -1
  37. package/dist/server/node_modules/@omega/db/generated/client/edge.js +3 -6
  38. package/dist/server/node_modules/@omega/db/generated/client/index-browser.js +0 -3
  39. package/dist/server/node_modules/@omega/db/generated/client/index.d.ts +0 -223
  40. package/dist/server/node_modules/@omega/db/generated/client/index.js +3 -6
  41. package/dist/server/node_modules/@omega/db/generated/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  42. package/dist/server/node_modules/@omega/db/generated/client/package.json +1 -1
  43. package/dist/server/node_modules/@omega/db/generated/client/schema.prisma +0 -3
  44. package/dist/server/node_modules/@omega/db/generated/client/wasm.js +3 -6
  45. package/dist/server/node_modules/@omega/providers/dist/anthropic.d.ts +2 -2
  46. package/dist/server/node_modules/@omega/providers/dist/anthropic.d.ts.map +1 -1
  47. package/dist/server/node_modules/@omega/providers/dist/anthropic.js +1 -16
  48. package/dist/server/node_modules/@omega/providers/dist/anthropic.js.map +1 -1
  49. package/dist/server/node_modules/@omega/providers/dist/gemini.d.ts +2 -2
  50. package/dist/server/node_modules/@omega/providers/dist/gemini.d.ts.map +1 -1
  51. package/dist/server/node_modules/@omega/providers/dist/gemini.js +1 -14
  52. package/dist/server/node_modules/@omega/providers/dist/gemini.js.map +1 -1
  53. package/dist/server/node_modules/@omega/providers/dist/kimi.d.ts +3 -3
  54. package/dist/server/node_modules/@omega/providers/dist/kimi.d.ts.map +1 -1
  55. package/dist/server/node_modules/@omega/providers/dist/ollama.d.ts +2 -2
  56. package/dist/server/node_modules/@omega/providers/dist/ollama.d.ts.map +1 -1
  57. package/dist/server/node_modules/@omega/providers/dist/ollama.js +1 -13
  58. package/dist/server/node_modules/@omega/providers/dist/ollama.js.map +1 -1
  59. package/dist/server/node_modules/@omega/providers/dist/openai.d.ts +3 -3
  60. package/dist/server/node_modules/@omega/providers/dist/openai.d.ts.map +1 -1
  61. package/dist/server/node_modules/@omega/providers/dist/openai.js +3 -24
  62. package/dist/server/node_modules/@omega/providers/dist/openai.js.map +1 -1
  63. package/dist/server/node_modules/@omega/providers/dist/providers.test.js +9 -13
  64. package/dist/server/node_modules/@omega/providers/dist/providers.test.js.map +1 -1
  65. package/dist/server/node_modules/mime/cli.js +0 -0
  66. package/dist/server/node_modules/mime/src/build.js +0 -0
  67. package/dist/server/node_modules/protobufjs/dist/light/protobuf.js +2 -2
  68. package/dist/server/node_modules/protobufjs/dist/light/protobuf.min.js +2 -2
  69. package/dist/server/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
  70. package/dist/server/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
  71. package/dist/server/node_modules/protobufjs/dist/protobuf.js +5 -2
  72. package/dist/server/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  73. package/dist/server/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  74. package/dist/server/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  75. package/dist/server/node_modules/protobufjs/package.json +1 -1
  76. package/dist/server/node_modules/protobufjs/src/parse.js +3 -0
  77. package/dist/server/node_modules/wrap-ansi/index.js +0 -0
  78. package/dist/server/pglite-data/base/5/1247 +0 -0
  79. package/dist/server/pglite-data/base/5/1249 +0 -0
  80. package/dist/server/pglite-data/base/5/1249_fsm +0 -0
  81. package/dist/server/pglite-data/base/5/1259 +0 -0
  82. package/dist/server/pglite-data/base/5/1259_fsm +0 -0
  83. package/dist/server/pglite-data/base/5/16384 +0 -0
  84. package/dist/server/pglite-data/base/5/16392 +0 -0
  85. package/dist/server/pglite-data/base/5/16394 +0 -0
  86. package/dist/server/pglite-data/base/5/16404 +0 -0
  87. package/dist/server/pglite-data/base/5/16406 +0 -0
  88. package/dist/server/pglite-data/base/5/16421 +0 -0
  89. package/dist/server/pglite-data/base/5/16423 +0 -0
  90. package/dist/server/pglite-data/base/5/16437 +0 -0
  91. package/dist/server/pglite-data/base/5/16439 +0 -0
  92. package/dist/server/pglite-data/base/5/16449 +0 -0
  93. package/dist/server/pglite-data/base/5/16451 +0 -0
  94. package/dist/server/pglite-data/base/5/16462 +0 -0
  95. package/dist/server/pglite-data/base/5/16464 +0 -0
  96. package/dist/server/pglite-data/base/5/16478 +0 -0
  97. package/dist/server/pglite-data/base/5/16480 +0 -0
  98. package/dist/server/pglite-data/base/5/16494 +0 -0
  99. package/dist/server/pglite-data/base/5/16510 +0 -0
  100. package/dist/server/pglite-data/base/5/16511 +0 -0
  101. package/dist/server/pglite-data/base/5/16512 +0 -0
  102. package/dist/server/pglite-data/base/5/16513 +0 -0
  103. package/dist/server/pglite-data/base/5/16514 +0 -0
  104. package/dist/server/pglite-data/base/5/16515 +0 -0
  105. package/dist/server/pglite-data/base/5/{24588 → 16554} +0 -0
  106. package/dist/server/pglite-data/base/5/{32780 → 16555} +0 -0
  107. package/dist/server/pglite-data/base/5/{32781 → 16557} +0 -0
  108. package/dist/server/pglite-data/base/5/{32783 → 16558} +0 -0
  109. package/dist/server/pglite-data/base/5/16575 +0 -0
  110. package/dist/server/pglite-data/base/5/16576 +0 -0
  111. package/dist/server/pglite-data/base/5/16577 +0 -0
  112. package/dist/server/pglite-data/base/5/16579 +0 -0
  113. package/dist/server/pglite-data/base/5/2579 +0 -0
  114. package/dist/server/pglite-data/base/5/2604 +0 -0
  115. package/dist/server/pglite-data/base/5/2606 +0 -0
  116. package/dist/server/pglite-data/base/5/2608 +0 -0
  117. package/dist/server/pglite-data/base/5/2608_fsm +0 -0
  118. package/dist/server/pglite-data/base/5/2610 +0 -0
  119. package/dist/server/pglite-data/base/5/2620 +0 -0
  120. package/dist/server/pglite-data/base/5/2656 +0 -0
  121. package/dist/server/pglite-data/base/5/2657 +0 -0
  122. package/dist/server/pglite-data/base/5/2658 +0 -0
  123. package/dist/server/pglite-data/base/5/2659 +0 -0
  124. package/dist/server/pglite-data/base/5/2662 +0 -0
  125. package/dist/server/pglite-data/base/5/2663 +0 -0
  126. package/dist/server/pglite-data/base/5/2664 +0 -0
  127. package/dist/server/pglite-data/base/5/2665 +0 -0
  128. package/dist/server/pglite-data/base/5/2666 +0 -0
  129. package/dist/server/pglite-data/base/5/2667 +0 -0
  130. package/dist/server/pglite-data/base/5/2673 +0 -0
  131. package/dist/server/pglite-data/base/5/2674 +0 -0
  132. package/dist/server/pglite-data/base/5/2678 +0 -0
  133. package/dist/server/pglite-data/base/5/2679 +0 -0
  134. package/dist/server/pglite-data/base/5/2699 +0 -0
  135. package/dist/server/pglite-data/base/5/2701 +0 -0
  136. package/dist/server/pglite-data/base/5/2702 +0 -0
  137. package/dist/server/pglite-data/base/5/2703 +0 -0
  138. package/dist/server/pglite-data/base/5/2704 +0 -0
  139. package/dist/server/pglite-data/base/5/3455 +0 -0
  140. package/dist/server/pglite-data/base/5/pg_internal.init +0 -0
  141. package/dist/server/pglite-data/global/pg_control +0 -0
  142. package/dist/server/pglite-data/global/pg_internal.init +0 -0
  143. package/dist/server/pglite-data/pg_wal/000000010000000000000001 +0 -0
  144. package/dist/server/pglite-data/pg_xact/0000 +0 -0
  145. package/dist/server/pglite-data/postmaster.pid +2 -2
  146. package/dist/server/src/app.ts +2 -0
  147. package/dist/server/src/lib/run-task.ts +2 -2
  148. package/dist/server/src/routes/metrics.ts +2 -81
  149. package/dist/server/src/routes/reports.ts +54 -0
  150. package/dist/server/src/routes/tasks.ts +2 -2
  151. package/dist/web/dist/assets/index-Ce9D9lg5.css +1 -0
  152. package/dist/web/dist/assets/index-D-wO1mM7.js +40 -0
  153. package/dist/web/dist/index.html +2 -2
  154. package/package.json +13 -14
  155. package/dist/server/pglite-data/base/5/16406_fsm +0 -0
  156. package/dist/server/pglite-data/base/5/16439_fsm +0 -0
  157. package/dist/server/pglite-data/base/5/24576 +0 -0
  158. package/dist/server/pglite-data/base/5/24576_fsm +0 -0
  159. package/dist/server/pglite-data/base/5/24589 +0 -0
  160. package/dist/server/pglite-data/base/5/24591 +0 -0
  161. package/dist/server/pglite-data/base/5/24592 +0 -0
  162. /package/dist/server/pglite-data/base/5/{24587 → 16542} +0 -0
  163. /package/dist/server/pglite-data/base/5/{32768 → 16553} +0 -0
  164. /package/dist/server/pglite-data/base/5/{32779 → 16564} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "protobufjs",
3
- "version": "7.6.4",
3
+ "version": "7.6.5",
4
4
  "versionScheme": "~",
5
5
  "description": "Protocol Buffers for JavaScript (& TypeScript).",
6
6
  "author": "Daniel Wirtz <dcode+protobufjs@dcode.io>",
@@ -678,6 +678,9 @@ function parse(source, root, options) {
678
678
  }
679
679
 
680
680
  while (token !== "=") {
681
+ if (token === null) {
682
+ throw illegal(token, "end of input");
683
+ }
681
684
  if (token === "(") {
682
685
  var parensValue = next();
683
686
  skip(")");
File without changes
Binary file
Binary file
Binary file
File without changes
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,7 +1,7 @@
1
1
  -42
2
2
  /pglite/data
3
- 1783076477
3
+ 1783134189
4
4
  5432
5
5
 
6
6
 
7
- 695229449 1
7
+ 699617753 1
@@ -7,6 +7,7 @@ import { providerRoutes } from './routes/providers.js';
7
7
  import { routerRoutes } from './routes/router.js';
8
8
  import { metricsRoutes } from './routes/metrics.js';
9
9
  import { promptVersionRoutes } from './routes/prompt-versions.js';
10
+ import { reportRoutes } from './routes/reports.js';
10
11
 
11
12
  export const app: express.Express = express();
12
13
 
@@ -19,6 +20,7 @@ app.use('/providers', providerRoutes(prisma));
19
20
  app.use('/router', routerRoutes(prisma));
20
21
  app.use('/metrics', metricsRoutes(prisma));
21
22
  app.use('/prompt-versions', promptVersionRoutes(prisma));
23
+ app.use('/reports', reportRoutes());
22
24
 
23
25
  app.use((err: unknown, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
24
26
  console.error(err);
@@ -80,12 +80,12 @@ export async function runTask(prisma: PrismaClient, taskId: string) {
80
80
  const prompt = [task.title, task.description].filter(Boolean).join('\n\n');
81
81
 
82
82
  try {
83
- const response = await provider.send(prompt, { model: modelName });
83
+ const result = await provider.send(prompt, { model: modelName });
84
84
  const updated = await prisma.task.update({
85
85
  where: { id: taskId },
86
86
  data: {
87
87
  status: 'done',
88
- result: response.content,
88
+ result,
89
89
  provider: providerName,
90
90
  model: modelName,
91
91
  error: null,
@@ -9,27 +9,6 @@ const __filename = fileURLToPath(import.meta.url);
9
9
  const root = path.resolve(__filename, '..', '..', '..', '..');
10
10
  const reportsDir = path.join(root, '.omega', 'reports');
11
11
 
12
- async function listReports(pattern: RegExp): Promise<{ file: string; modifiedAt: string }[]> {
13
- try {
14
- const files = await fs.readdir(reportsDir);
15
- const matches = files.filter((f) => pattern.test(f)).sort().reverse();
16
- const results: { file: string; modifiedAt: string }[] = [];
17
- for (const file of matches) {
18
- const stat = await fs.stat(path.join(reportsDir, file));
19
- results.push({ file, modifiedAt: stat.mtime.toISOString() });
20
- }
21
- return results;
22
- } catch {
23
- return [];
24
- }
25
- }
26
-
27
- async function readReport(file: string): Promise<unknown> {
28
- const raw = await fs.readFile(path.join(reportsDir, file), 'utf-8');
29
- if (file.endsWith('.json')) return JSON.parse(raw) as unknown;
30
- return raw;
31
- }
32
-
33
12
  async function latestReport(pattern: RegExp): Promise<{ file: string; data: unknown } | undefined> {
34
13
  try {
35
14
  const files = await fs.readdir(reportsDir);
@@ -39,7 +18,8 @@ async function latestReport(pattern: RegExp): Promise<{ file: string; data: unkn
39
18
  .reverse();
40
19
  const latest = matches[0];
41
20
  if (!latest) return undefined;
42
- const data = await readReport(latest);
21
+ const raw = await fs.readFile(path.join(reportsDir, latest), 'utf-8');
22
+ const data = latest.endsWith('.json') ? (JSON.parse(raw) as unknown) : raw;
43
23
  return { file: latest, data };
44
24
  } catch {
45
25
  return undefined;
@@ -98,8 +78,6 @@ export function metricsRoutes(prisma: PrismaClient): Router {
98
78
  )
99
79
  : 0;
100
80
 
101
- const totalTokens = agentRuns.reduce((sum, r) => sum + (r.totalTokens ?? 0), 0);
102
-
103
81
  const recentRuns = agentRuns.map((r) => ({
104
82
  id: r.id,
105
83
  taskId: r.taskId,
@@ -110,15 +88,11 @@ export function metricsRoutes(prisma: PrismaClient): Router {
110
88
  validationSummary: r.validationSummary,
111
89
  publishedVersion: r.publishedVersion,
112
90
  durationMs: durationMs(r.createdAt, r.updatedAt),
113
- promptTokens: r.promptTokens,
114
- completionTokens: r.completionTokens,
115
- totalTokens: r.totalTokens,
116
91
  createdAt: r.createdAt,
117
92
  }));
118
93
 
119
94
  const e2eReport = await latestReport(/^e2e-raw-/);
120
95
  const benchmarkReport = await latestReport(/^benchmark-/);
121
- const abReport = await latestReport(/^ab-/);
122
96
 
123
97
  res.json({
124
98
  taskCounts,
@@ -126,66 +100,13 @@ export function metricsRoutes(prisma: PrismaClient): Router {
126
100
  providerUsage,
127
101
  modelUsage,
128
102
  avgDurationMs,
129
- totalTokens,
130
103
  recentRuns,
131
104
  latestReports: {
132
105
  e2e: e2eReport,
133
106
  benchmark: benchmarkReport,
134
- ab: abReport,
135
107
  },
136
108
  });
137
109
  }));
138
110
 
139
- r.get('/reports', asyncHandler(async (_req, res) => {
140
- const e2e = await listReports(/^e2e-raw-/);
141
- const benchmark = await listReports(/^benchmark-/);
142
- res.json({ e2e, benchmark });
143
- }));
144
-
145
- r.get('/reports/benchmark', asyncHandler(async (_req, res) => {
146
- const reports = await listReports(/^benchmark-/);
147
- res.json(reports);
148
- }));
149
-
150
- r.get('/reports/benchmark/:file', asyncHandler(async (req, res) => {
151
- const file = path.basename(req.params.file);
152
- if (!file.startsWith('benchmark-')) {
153
- res.status(400).json({ error: 'Invalid benchmark report filename' });
154
- return;
155
- }
156
- try {
157
- const data = await readReport(file);
158
- res.json(data);
159
- } catch {
160
- res.status(404).json({ error: 'Report not found' });
161
- }
162
- }));
163
-
164
- r.get('/reports/ab', asyncHandler(async (_req, res) => {
165
- const reports = await listReports(/^ab-/);
166
- res.json(reports);
167
- }));
168
-
169
- r.get('/reports/ab/:file', asyncHandler(async (req, res) => {
170
- const file = path.basename(req.params.file);
171
- if (!file.startsWith('ab-')) {
172
- res.status(400).json({ error: 'Invalid A/B report filename' });
173
- return;
174
- }
175
- try {
176
- const data = await readReport(file);
177
- res.json(data);
178
- } catch {
179
- res.status(404).json({ error: 'Report not found' });
180
- }
181
- }));
182
-
183
- r.get('/reports/latest', asyncHandler(async (_req, res) => {
184
- const e2eReport = await latestReport(/^e2e-raw-/);
185
- const benchmarkReport = await latestReport(/^benchmark-/);
186
- const abReport = await latestReport(/^ab-/);
187
- res.json({ e2e: e2eReport, benchmark: benchmarkReport, ab: abReport });
188
- }));
189
-
190
111
  return r;
191
112
  }
@@ -0,0 +1,54 @@
1
+ import { Router } from 'express';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { asyncHandler } from '../lib/async-handler.js';
5
+
6
+ const REPORTS_DIR = path.resolve('.omega/reports');
7
+
8
+ interface ReportRef {
9
+ file: string;
10
+ type: 'benchmark' | 'ab';
11
+ createdAt: string;
12
+ }
13
+
14
+ async function listReports(): Promise<ReportRef[]> {
15
+ const entries = await fs.readdir(REPORTS_DIR).catch(() => []);
16
+ const files = entries.filter((f) => f.endsWith('.json'));
17
+ const refs: ReportRef[] = [];
18
+ for (const file of files) {
19
+ const type = file.startsWith('ab-') ? 'ab' : file.startsWith('benchmark-') ? 'benchmark' : undefined;
20
+ if (!type) continue;
21
+ const stat = await fs.stat(path.join(REPORTS_DIR, file)).catch(() => undefined);
22
+ refs.push({ file, type, createdAt: stat?.mtime.toISOString() ?? new Date().toISOString() });
23
+ }
24
+ return refs.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
25
+ }
26
+
27
+ export function reportRoutes(): Router {
28
+ const r = Router();
29
+
30
+ r.get('/', asyncHandler(async (_req, res) => {
31
+ const refs = await listReports();
32
+ res.json({
33
+ benchmark: refs.filter((r) => r.type === 'benchmark'),
34
+ ab: refs.filter((r) => r.type === 'ab'),
35
+ });
36
+ }));
37
+
38
+ r.get('/:file', asyncHandler(async (req, res) => {
39
+ const file = path.basename(req.params.file);
40
+ const filePath = path.join(REPORTS_DIR, file);
41
+ if (!filePath.startsWith(REPORTS_DIR)) {
42
+ res.status(400).json({ error: 'Invalid report file' });
43
+ return;
44
+ }
45
+ const raw = await fs.readFile(filePath, 'utf-8').catch(() => null);
46
+ if (!raw) {
47
+ res.status(404).json({ error: 'Report not found' });
48
+ return;
49
+ }
50
+ res.json(JSON.parse(raw));
51
+ }));
52
+
53
+ return r;
54
+ }
@@ -135,8 +135,8 @@ export function taskRoutes(prisma: PrismaClient): Router {
135
135
  const children = byParent[key] ?? [];
136
136
  return children.map((s) => ({
137
137
  ...s,
138
- attributes: s.attributes ? (JSON.parse(s.attributes) as Record<string, unknown>) : undefined,
139
- events: s.events ? (JSON.parse(s.events) as unknown[]) : undefined,
138
+ attributes: s.attributes ? JSON.parse(s.attributes) : undefined,
139
+ events: s.events ? JSON.parse(s.events) : undefined,
140
140
  children: buildTree(s.spanId),
141
141
  }));
142
142
  }
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.invisible{visibility:hidden}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.flex{display:flex}.grid{display:grid}.h-full{height:100%}.h-screen{height:100vh}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-32{max-height:8rem}.max-h-64{max-height:16rem}.w-32{width:8rem}.w-4{width:1rem}.w-72{width:18rem}.w-80{width:20rem}.w-full{width:100%}.w-screen{width:100vw}.min-w-\[200px\]{min-width:200px}.min-w-\[800px\]{min-width:800px}.max-w-\[180px\]{max-width:180px}.flex-1{flex:1 1 0%}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-red-100{--tw-border-opacity: 1;border-color:rgb(254 226 226 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.tracking-wide{letter-spacing:.025em}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}body{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-700:hover{--tw-bg-opacity: 1;background-color:rgb(126 34 206 / var(--tw-bg-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}