@useorgx/openclaw-plugin 0.3.1 → 0.4.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 (62) hide show
  1. package/dashboard/dist/assets/MissionControlView-DVNfDWKZ.js +1 -0
  2. package/dashboard/dist/assets/SessionInspector-BaqnAys4.js +1 -0
  3. package/dashboard/dist/assets/index-B4Yix84X.js +212 -0
  4. package/dashboard/dist/assets/index-BWSvw1HR.css +1 -0
  5. package/dashboard/dist/assets/motion-x9c01cgK.js +9 -0
  6. package/dashboard/dist/assets/orgx-logo-Fm0FhtnV.png +0 -0
  7. package/dashboard/dist/assets/react-vendor-C2t2w4r2.js +32 -0
  8. package/dashboard/dist/assets/tanstack-C-KIc3Wc.js +1 -0
  9. package/dashboard/dist/assets/vendor-C-AHK0Ly.js +9 -0
  10. package/dashboard/dist/index.html +6 -2
  11. package/dist/agent-context-store.d.ts.map +1 -1
  12. package/dist/agent-context-store.js +21 -20
  13. package/dist/agent-context-store.js.map +1 -1
  14. package/dist/agent-run-store.d.ts.map +1 -1
  15. package/dist/agent-run-store.js +21 -20
  16. package/dist/agent-run-store.js.map +1 -1
  17. package/dist/auth-store.d.ts.map +1 -1
  18. package/dist/auth-store.js +39 -44
  19. package/dist/auth-store.js.map +1 -1
  20. package/dist/byok-store.d.ts.map +1 -1
  21. package/dist/byok-store.js +24 -20
  22. package/dist/byok-store.js.map +1 -1
  23. package/dist/contracts/types.d.ts +33 -0
  24. package/dist/contracts/types.d.ts.map +1 -1
  25. package/dist/fs-utils.d.ts +7 -0
  26. package/dist/fs-utils.d.ts.map +1 -0
  27. package/dist/fs-utils.js +63 -0
  28. package/dist/fs-utils.js.map +1 -0
  29. package/dist/http-handler.d.ts +17 -0
  30. package/dist/http-handler.d.ts.map +1 -1
  31. package/dist/http-handler.js +1586 -119
  32. package/dist/http-handler.js.map +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp-apps/orgx-live.html +690 -0
  37. package/dist/outbox.d.ts.map +1 -1
  38. package/dist/outbox.js +74 -29
  39. package/dist/outbox.js.map +1 -1
  40. package/dist/paths.d.ts +23 -0
  41. package/dist/paths.d.ts.map +1 -0
  42. package/dist/paths.js +50 -0
  43. package/dist/paths.js.map +1 -0
  44. package/dist/reporting/outbox-replay.d.ts +2 -0
  45. package/dist/reporting/outbox-replay.d.ts.map +1 -0
  46. package/dist/reporting/outbox-replay.js +17 -0
  47. package/dist/reporting/outbox-replay.js.map +1 -0
  48. package/dist/reporting/rollups.d.ts +21 -0
  49. package/dist/reporting/rollups.d.ts.map +1 -0
  50. package/dist/reporting/rollups.js +85 -0
  51. package/dist/reporting/rollups.js.map +1 -0
  52. package/dist/runtime-instance-store.d.ts +63 -0
  53. package/dist/runtime-instance-store.d.ts.map +1 -0
  54. package/dist/runtime-instance-store.js +363 -0
  55. package/dist/runtime-instance-store.js.map +1 -0
  56. package/dist/snapshot-store.d.ts.map +1 -1
  57. package/dist/snapshot-store.js +24 -20
  58. package/dist/snapshot-store.js.map +1 -1
  59. package/package.json +2 -2
  60. package/dashboard/dist/assets/index-BjqNjHpY.css +0 -1
  61. package/dashboard/dist/assets/index-DCLkU4AM.js +0 -57
  62. package/dashboard/dist/assets/orgx-logo-QSE5QWy4.png +0 -0
@@ -0,0 +1,363 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
2
+ import { randomUUID } from "node:crypto";
3
+ import { getOrgxPluginConfigDir, getOrgxPluginConfigPath } from "./paths.js";
4
+ import { backupCorruptFileSync, writeJsonFileAtomicSync } from "./fs-utils.js";
5
+ const MAX_INSTANCES = 600;
6
+ export const DEFAULT_RUNTIME_HEARTBEAT_TIMEOUT_MS = 90_000;
7
+ function runtimeDir() {
8
+ return getOrgxPluginConfigDir();
9
+ }
10
+ function runtimeFile() {
11
+ return getOrgxPluginConfigPath("runtime-instances.json");
12
+ }
13
+ function hookTokenFile() {
14
+ return getOrgxPluginConfigPath("runtime-hook-token.txt");
15
+ }
16
+ function ensureRuntimeDir() {
17
+ const dir = runtimeDir();
18
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
19
+ try {
20
+ chmodSync(dir, 0o700);
21
+ }
22
+ catch {
23
+ // best effort
24
+ }
25
+ }
26
+ function writeHookTokenFile(token) {
27
+ ensureRuntimeDir();
28
+ const file = hookTokenFile();
29
+ writeFileSync(file, `${token}\n`, { encoding: "utf8", mode: 0o600 });
30
+ try {
31
+ chmodSync(file, 0o600);
32
+ }
33
+ catch {
34
+ // best effort
35
+ }
36
+ }
37
+ function parseJson(value) {
38
+ try {
39
+ return JSON.parse(value);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function normalizeNullableString(value) {
46
+ if (typeof value !== "string")
47
+ return null;
48
+ const trimmed = value.trim();
49
+ return trimmed.length > 0 ? trimmed : null;
50
+ }
51
+ function normalizeObject(value) {
52
+ if (!value || typeof value !== "object" || Array.isArray(value))
53
+ return null;
54
+ return value;
55
+ }
56
+ function normalizeSourceClient(value) {
57
+ const normalized = normalizeNullableString(value)?.toLowerCase();
58
+ if (!normalized)
59
+ return "unknown";
60
+ if (normalized === "openclaw")
61
+ return "openclaw";
62
+ if (normalized === "codex")
63
+ return "codex";
64
+ if (normalized === "claude-code")
65
+ return "claude-code";
66
+ if (normalized === "api")
67
+ return "api";
68
+ return "unknown";
69
+ }
70
+ function normalizeHookEvent(value) {
71
+ const normalized = normalizeNullableString(value)?.toLowerCase();
72
+ if (normalized === "session_start")
73
+ return "session_start";
74
+ if (normalized === "heartbeat")
75
+ return "heartbeat";
76
+ if (normalized === "progress")
77
+ return "progress";
78
+ if (normalized === "task_update")
79
+ return "task_update";
80
+ if (normalized === "session_stop")
81
+ return "session_stop";
82
+ if (normalized === "error")
83
+ return "error";
84
+ return "heartbeat";
85
+ }
86
+ function toProviderLogo(sourceClient) {
87
+ if (sourceClient === "codex")
88
+ return "openai";
89
+ if (sourceClient === "claude-code")
90
+ return "anthropic";
91
+ if (sourceClient === "openclaw")
92
+ return "openclaw";
93
+ if (sourceClient === "api")
94
+ return "orgx";
95
+ return "unknown";
96
+ }
97
+ function toDisplayName(sourceClient) {
98
+ if (sourceClient === "codex")
99
+ return "Codex";
100
+ if (sourceClient === "claude-code")
101
+ return "Claude Code";
102
+ if (sourceClient === "openclaw")
103
+ return "OpenClaw";
104
+ if (sourceClient === "api")
105
+ return "OrgX API";
106
+ return "Runtime";
107
+ }
108
+ function normalizeState(value) {
109
+ const normalized = normalizeNullableString(value)?.toLowerCase();
110
+ if (normalized === "active")
111
+ return "active";
112
+ if (normalized === "stale")
113
+ return "stale";
114
+ if (normalized === "stopped")
115
+ return "stopped";
116
+ if (normalized === "error")
117
+ return "error";
118
+ return "active";
119
+ }
120
+ function normalizeIsoTimestamp(value, fallbackIso) {
121
+ const text = normalizeNullableString(value);
122
+ if (!text)
123
+ return fallbackIso;
124
+ const parsed = Date.parse(text);
125
+ if (!Number.isFinite(parsed))
126
+ return fallbackIso;
127
+ return new Date(parsed).toISOString();
128
+ }
129
+ function sanitizeIdPart(value) {
130
+ return value.toLowerCase().replace(/[^a-z0-9:_-]+/g, "-");
131
+ }
132
+ function deriveInstanceId(input) {
133
+ const source = sanitizeIdPart(input.sourceClient);
134
+ const runId = normalizeNullableString(input.runId);
135
+ if (runId)
136
+ return `runtime:${source}:run:${sanitizeIdPart(runId)}`;
137
+ const correlationId = normalizeNullableString(input.correlationId);
138
+ if (correlationId)
139
+ return `runtime:${source}:corr:${sanitizeIdPart(correlationId)}`;
140
+ const agentId = normalizeNullableString(input.agentId);
141
+ const initiativeId = normalizeNullableString(input.initiativeId);
142
+ if (agentId && initiativeId) {
143
+ return `runtime:${source}:agent:${sanitizeIdPart(agentId)}:initiative:${sanitizeIdPart(initiativeId)}`;
144
+ }
145
+ if (agentId)
146
+ return `runtime:${source}:agent:${sanitizeIdPart(agentId)}`;
147
+ return `runtime:${source}:default`;
148
+ }
149
+ function normalizeProgress(value) {
150
+ if (typeof value !== "number" || !Number.isFinite(value))
151
+ return null;
152
+ return Math.max(0, Math.min(100, Math.round(value)));
153
+ }
154
+ function normalizeRecord(input) {
155
+ return {
156
+ id: normalizeNullableString(input.id) ?? input.id,
157
+ sourceClient: normalizeSourceClient(input.sourceClient),
158
+ displayName: normalizeNullableString(input.displayName) ?? "Runtime",
159
+ providerLogo: input.providerLogo,
160
+ state: normalizeState(input.state),
161
+ event: normalizeHookEvent(input.event),
162
+ runId: normalizeNullableString(input.runId),
163
+ correlationId: normalizeNullableString(input.correlationId),
164
+ initiativeId: normalizeNullableString(input.initiativeId),
165
+ workstreamId: normalizeNullableString(input.workstreamId),
166
+ taskId: normalizeNullableString(input.taskId),
167
+ agentId: normalizeNullableString(input.agentId),
168
+ agentName: normalizeNullableString(input.agentName),
169
+ phase: normalizeNullableString(input.phase),
170
+ progressPct: normalizeProgress(input.progressPct),
171
+ currentTask: normalizeNullableString(input.currentTask),
172
+ lastHeartbeatAt: normalizeNullableString(input.lastHeartbeatAt),
173
+ lastEventAt: input.lastEventAt,
174
+ lastMessage: normalizeNullableString(input.lastMessage),
175
+ metadata: normalizeObject(input.metadata),
176
+ createdAt: input.createdAt,
177
+ updatedAt: input.updatedAt,
178
+ };
179
+ }
180
+ export function readRuntimeInstances() {
181
+ const file = runtimeFile();
182
+ try {
183
+ if (!existsSync(file)) {
184
+ return { updatedAt: new Date().toISOString(), instances: {} };
185
+ }
186
+ const raw = readFileSync(file, "utf8");
187
+ const parsed = parseJson(raw);
188
+ if (!parsed || typeof parsed !== "object") {
189
+ backupCorruptFileSync(file);
190
+ return { updatedAt: new Date().toISOString(), instances: {} };
191
+ }
192
+ const instances = parsed.instances && typeof parsed.instances === "object"
193
+ ? parsed.instances
194
+ : {};
195
+ return {
196
+ updatedAt: typeof parsed.updatedAt === "string"
197
+ ? parsed.updatedAt
198
+ : new Date().toISOString(),
199
+ instances: instances,
200
+ };
201
+ }
202
+ catch {
203
+ return { updatedAt: new Date().toISOString(), instances: {} };
204
+ }
205
+ }
206
+ function pruneStore(store) {
207
+ const values = Object.values(store.instances);
208
+ if (values.length <= MAX_INSTANCES)
209
+ return;
210
+ values.sort((a, b) => Date.parse(b.lastEventAt) - Date.parse(a.lastEventAt));
211
+ const keep = new Set(values.slice(0, MAX_INSTANCES).map((record) => record.id));
212
+ for (const key of Object.keys(store.instances)) {
213
+ if (!keep.has(key)) {
214
+ delete store.instances[key];
215
+ }
216
+ }
217
+ }
218
+ function writeRuntimeInstances(next) {
219
+ ensureRuntimeDir();
220
+ const file = runtimeFile();
221
+ writeJsonFileAtomicSync(file, next, 0o600);
222
+ }
223
+ export function upsertRuntimeInstanceFromHook(payload) {
224
+ const sourceClient = normalizeSourceClient(payload.source_client);
225
+ const event = normalizeHookEvent(payload.event);
226
+ const nowIso = new Date().toISOString();
227
+ const eventAt = normalizeIsoTimestamp(payload.timestamp, nowIso);
228
+ const runId = normalizeNullableString(payload.run_id);
229
+ const correlationId = normalizeNullableString(payload.correlation_id);
230
+ const initiativeId = normalizeNullableString(payload.initiative_id);
231
+ const workstreamId = normalizeNullableString(payload.workstream_id);
232
+ const taskId = normalizeNullableString(payload.task_id);
233
+ const agentId = normalizeNullableString(payload.agent_id);
234
+ const agentName = normalizeNullableString(payload.agent_name);
235
+ const phase = normalizeNullableString(payload.phase);
236
+ const progressPct = normalizeProgress(payload.progress_pct);
237
+ const message = normalizeNullableString(payload.message);
238
+ const metadata = normalizeObject(payload.metadata);
239
+ const id = deriveInstanceId({
240
+ sourceClient,
241
+ runId,
242
+ correlationId,
243
+ agentId,
244
+ initiativeId,
245
+ });
246
+ const store = readRuntimeInstances();
247
+ const existing = store.instances[id] ? normalizeRecord(store.instances[id]) : null;
248
+ let state = existing?.state ?? "active";
249
+ if (event === "session_stop")
250
+ state = "stopped";
251
+ else if (event === "error")
252
+ state = "error";
253
+ else
254
+ state = "active";
255
+ const shouldRefreshHeartbeat = event === "session_start" ||
256
+ event === "heartbeat" ||
257
+ event === "progress" ||
258
+ event === "task_update";
259
+ const record = {
260
+ id,
261
+ sourceClient,
262
+ displayName: toDisplayName(sourceClient),
263
+ providerLogo: toProviderLogo(sourceClient),
264
+ state,
265
+ event,
266
+ runId: runId ?? existing?.runId ?? null,
267
+ correlationId: correlationId ?? existing?.correlationId ?? null,
268
+ initiativeId: initiativeId ?? existing?.initiativeId ?? null,
269
+ workstreamId: workstreamId ?? existing?.workstreamId ?? null,
270
+ taskId: taskId ?? existing?.taskId ?? null,
271
+ agentId: agentId ?? existing?.agentId ?? null,
272
+ agentName: agentName ?? existing?.agentName ?? null,
273
+ phase: phase ?? existing?.phase ?? null,
274
+ progressPct: progressPct ?? existing?.progressPct ?? null,
275
+ currentTask: taskId ?? existing?.currentTask ?? null,
276
+ lastHeartbeatAt: shouldRefreshHeartbeat
277
+ ? eventAt
278
+ : existing?.lastHeartbeatAt ?? null,
279
+ lastEventAt: eventAt,
280
+ lastMessage: message ?? existing?.lastMessage ?? null,
281
+ metadata: metadata ?? existing?.metadata ?? null,
282
+ createdAt: existing?.createdAt ?? eventAt,
283
+ updatedAt: nowIso,
284
+ };
285
+ store.instances[id] = record;
286
+ store.updatedAt = nowIso;
287
+ pruneStore(store);
288
+ writeRuntimeInstances(store);
289
+ return record;
290
+ }
291
+ export function applyRuntimeInstanceStaleness(options) {
292
+ const timeoutMs = Math.max(10_000, options?.timeoutMs ?? DEFAULT_RUNTIME_HEARTBEAT_TIMEOUT_MS);
293
+ const nowMs = options?.nowMs ?? Date.now();
294
+ const store = readRuntimeInstances();
295
+ let changed = false;
296
+ for (const [id, rawRecord] of Object.entries(store.instances)) {
297
+ const record = normalizeRecord(rawRecord);
298
+ if (record.state !== "active") {
299
+ if (rawRecord !== record) {
300
+ store.instances[id] = record;
301
+ changed = true;
302
+ }
303
+ continue;
304
+ }
305
+ const heartbeatAt = record.lastHeartbeatAt ?? record.lastEventAt;
306
+ const heartbeatEpoch = Date.parse(heartbeatAt);
307
+ if (!Number.isFinite(heartbeatEpoch))
308
+ continue;
309
+ if (nowMs - heartbeatEpoch <= timeoutMs)
310
+ continue;
311
+ store.instances[id] = {
312
+ ...record,
313
+ state: "stale",
314
+ updatedAt: new Date(nowMs).toISOString(),
315
+ };
316
+ changed = true;
317
+ }
318
+ if (changed) {
319
+ store.updatedAt = new Date(nowMs).toISOString();
320
+ writeRuntimeInstances(store);
321
+ }
322
+ return store;
323
+ }
324
+ export function listRuntimeInstances(options) {
325
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_RUNTIME_HEARTBEAT_TIMEOUT_MS;
326
+ const nowMs = options?.nowMs ?? Date.now();
327
+ const store = applyRuntimeInstanceStaleness({ timeoutMs, nowMs });
328
+ const limit = Math.max(1, options?.limit ?? MAX_INSTANCES);
329
+ return Object.values(store.instances)
330
+ .map((record) => normalizeRecord(record))
331
+ .sort((a, b) => Date.parse(b.lastEventAt) - Date.parse(a.lastEventAt))
332
+ .slice(0, limit);
333
+ }
334
+ export function clearRuntimeInstances() {
335
+ const file = runtimeFile();
336
+ try {
337
+ rmSync(file, { force: true });
338
+ }
339
+ catch {
340
+ // best effort
341
+ }
342
+ }
343
+ export function resolveRuntimeHookToken() {
344
+ const envToken = normalizeNullableString(process.env.ORGX_HOOK_TOKEN);
345
+ if (envToken)
346
+ return envToken;
347
+ const file = hookTokenFile();
348
+ try {
349
+ if (existsSync(file)) {
350
+ const raw = readFileSync(file, "utf8");
351
+ const token = normalizeNullableString(raw);
352
+ if (token)
353
+ return token;
354
+ }
355
+ }
356
+ catch {
357
+ // fallback to generated token
358
+ }
359
+ const generated = `orgx_hook_${randomUUID().replace(/-/g, "")}`;
360
+ writeHookTokenFile(generated);
361
+ return generated;
362
+ }
363
+ //# sourceMappingURL=runtime-instance-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-instance-store.js","sourceRoot":"","sources":["../src/runtime-instance-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAUhE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,iBAAiB,CAkB/E;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}
1
+ {"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAa9C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAgBhE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,iBAAiB,CAW/E;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAO7C"}
@@ -1,12 +1,17 @@
1
- import { mkdirSync, readFileSync, writeFileSync, chmodSync, existsSync, rmSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { homedir } from 'node:os';
4
- const SNAPSHOT_DIR = join(homedir(), '.config', 'useorgx', 'openclaw-plugin');
5
- const SNAPSHOT_FILE = join(SNAPSHOT_DIR, 'snapshot.json');
1
+ import { mkdirSync, readFileSync, chmodSync, existsSync, rmSync } from 'node:fs';
2
+ import { getOrgxPluginConfigDir, getOrgxPluginConfigPath } from './paths.js';
3
+ import { backupCorruptFileSync, writeJsonFileAtomicSync } from './fs-utils.js';
4
+ function snapshotDir() {
5
+ return getOrgxPluginConfigDir();
6
+ }
7
+ function snapshotFile() {
8
+ return getOrgxPluginConfigPath('snapshot.json');
9
+ }
6
10
  function ensureSnapshotDir() {
7
- mkdirSync(SNAPSHOT_DIR, { recursive: true, mode: 0o700 });
11
+ const dir = snapshotDir();
12
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
8
13
  try {
9
- chmodSync(SNAPSHOT_DIR, 0o700);
14
+ chmodSync(dir, 0o700);
10
15
  }
11
16
  catch {
12
17
  // best effort
@@ -21,10 +26,16 @@ function parseJson(value) {
21
26
  }
22
27
  }
23
28
  export function readPersistedSnapshot() {
29
+ const file = snapshotFile();
24
30
  try {
25
- if (!existsSync(SNAPSHOT_FILE))
31
+ if (!existsSync(file))
26
32
  return null;
27
- const parsed = parseJson(readFileSync(SNAPSHOT_FILE, 'utf8'));
33
+ const raw = readFileSync(file, 'utf8');
34
+ const parsed = parseJson(raw);
35
+ if (!parsed) {
36
+ backupCorruptFileSync(file);
37
+ return null;
38
+ }
28
39
  if (!parsed || typeof parsed.updatedAt !== 'string')
29
40
  return null;
30
41
  if (!parsed.snapshot || typeof parsed.snapshot !== 'object')
@@ -41,21 +52,14 @@ export function writePersistedSnapshot(snapshot) {
41
52
  snapshot,
42
53
  updatedAt: new Date().toISOString(),
43
54
  };
44
- writeFileSync(SNAPSHOT_FILE, JSON.stringify(record, null, 2), {
45
- mode: 0o600,
46
- encoding: 'utf8',
47
- });
48
- try {
49
- chmodSync(SNAPSHOT_FILE, 0o600);
50
- }
51
- catch {
52
- // best effort
53
- }
55
+ const file = snapshotFile();
56
+ writeJsonFileAtomicSync(file, record, 0o600);
54
57
  return record;
55
58
  }
56
59
  export function clearPersistedSnapshot() {
60
+ const file = snapshotFile();
57
61
  try {
58
- rmSync(SNAPSHOT_FILE, { force: true });
62
+ rmSync(file, { force: true });
59
63
  }
60
64
  catch {
61
65
  // best effort
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAO1D,SAAS,iBAAiB;IACxB,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAI,KAAa;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAoB,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IAC1D,iBAAiB,EAAE,CAAC;IACpB,MAAM,MAAM,GAAsB;QAChC,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC5D,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIjF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE/E,SAAS,WAAW;IAClB,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,uBAAuB,CAAC,eAAe,CAAC,CAAC;AAClD,CAAC;AAOD,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAI,KAAa;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,CAAoB,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IAC1D,iBAAiB,EAAE,CAAC;IACpB,MAAM,MAAM,GAAsB;QAChC,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useorgx/openclaw-plugin",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "OrgX plugin for OpenClaw — agent orchestration, quality gates, model routing, and live dashboard",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,7 +33,7 @@
33
33
  ],
34
34
  "scripts": {
35
35
  "typecheck": "tsc --noEmit",
36
- "test:hooks": "npm run build:core && node --test tests/**/*.test.mjs",
36
+ "test:hooks": "npm run build:core && node --test --test-concurrency=1 tests/*.test.mjs tests/**/*.test.mjs",
37
37
  "job:dispatch": "npm run build:core && node ./scripts/run-codex-dispatch-job.mjs",
38
38
  "verify:clean-install": "node ./scripts/verify-clean-install.mjs",
39
39
  "verify:billing": "npm run build:core && node ./scripts/verify-billing-scenarios.mjs",
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,: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:Geist,system-ui,-apple-system,sans-serif;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:JetBrains Mono,ui-monospace,SFMono-Regular,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}body{font-family:Geist,system-ui,-apple-system,sans-serif;background:radial-gradient(1200px 700px at 12% -20%,rgba(191,255,0,.14),transparent 58%),radial-gradient(1000px 700px at 90% -20%,rgba(20,184,166,.14),transparent 64%),radial-gradient(900px 600px at 50% 120%,rgba(124,124,255,.1),transparent 62%),var(--orgx-bg);color:var(--orgx-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent}h1,h2,h3,h4,.font-display{font-family:Geist,system-ui,-apple-system,sans-serif;letter-spacing:-.015em}code,.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}button:focus-visible,a:focus-visible,input:focus-visible{outline:none;box-shadow:0 0 0 2px #bfff0073}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.glass-panel{-webkit-backdrop-filter:blur(14px) saturate(140%);backdrop-filter:blur(14px) saturate(140%);background:linear-gradient(145deg,#ffffff08,#ffffff04),var(--orgx-surface);border:1px solid var(--orgx-border)}.soft-shadow{box-shadow:0 16px 48px #00000073,0 2px 8px #0003,inset 0 1px #ffffff0a}.hover-lift{transition:transform .22s cubic-bezier(.16,1,.3,1),box-shadow .22s ease,border-color .22s ease}.hover-lift:hover{transform:translateY(-2px);box-shadow:0 18px 42px #0006,0 0 0 1px #bfff0014}.fade-in-up{animation:fadeInUp .36s cubic-bezier(.16,1,.3,1) both}.pulse-soft{animation:pulseSoft 3.6s ease-in-out infinite}.chip{border:1px solid var(--orgx-border);background:#ffffff0a;color:#f2f7ffcc;border-radius:999px;padding:3px 10px;font-size:11px;line-height:1;font-weight:500}.shimmer-skeleton{background:linear-gradient(90deg,#ffffff0a 25%,#ffffff14,#ffffff0a 75%);background-size:200% 100%;animation:shimmer 1.8s ease-in-out infinite;border-radius:12px}.card-enter{animation:cardEnter .35s cubic-bezier(.16,1,.3,1) both}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-x-3{left:.75rem;right:.75rem}.inset-y-0{top:0;bottom:0}.-bottom-0\.5{bottom:-.125rem}.-right-0\.5{right:-.125rem}.-right-1{right:-.25rem}.-right-2{right:-.5rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2\.5{right:.625rem}.top-0{top:0}.top-1\/2{top:50%}.top-12{top:3rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[calc\(100\%\+8px\)\]{top:calc(100% + 8px)}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-\[120\]{z-index:120}.z-\[180\]{z-index:180}.z-\[320\]{z-index:320}.col-span-2{grid-column:span 2 / span 2}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[100dvh\]{height:100dvh}.h-\[15px\]{height:15px}.h-\[2px\]{height:2px}.h-\[72px\]{height:72px}.h-\[env\(safe-area-inset-bottom\)\]{height:env(safe-area-inset-bottom)}.h-full{height:100%}.h-px{height:1px}.max-h-0{max-height:0px}.max-h-44{max-height:11rem}.max-h-\[100dvh\]{max-height:100dvh}.max-h-\[110px\]{max-height:110px}.max-h-\[360px\]{max-height:360px}.max-h-\[38vh\]{max-height:38vh}.max-h-\[52vh\]{max-height:52vh}.max-h-\[58vh\]{max-height:58vh}.min-h-0{min-height:0px}.min-h-\[16px\]{min-height:16px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[15px\]{width:15px}.w-\[160px\]{width:160px}.w-\[170px\]{width:170px}.w-\[180px\]{width:180px}.w-\[220px\]{width:220px}.w-\[260px\]{width:260px}.w-\[300px\]{width:300px}.w-\[340px\]{width:340px}.w-\[66px\]{width:66px}.w-\[72px\]{width:72px}.w-\[82px\]{width:82px}.w-\[88px\]{width:88px}.w-\[min\(92vw\,380px\)\]{width:min(92vw,380px)}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[1250px\]{min-width:1250px}.min-w-\[14px\]{min-width:14px}.min-w-\[16px\]{min-width:16px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[250px\]{max-width:250px}.max-w-\[320px\]{max-width:320px}.max-w-\[340px\]{max-width:340px}.max-w-\[92vw\]{max-width:92vw}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-y-1{--tw-border-spacing-y: .25rem;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,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}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(-.375rem * var(--tw-space-x-reverse));margin-left:calc(-.375rem * calc(1 - var(--tw-space-x-reverse)))}.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-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * 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-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * 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-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * 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}.overflow-x-hidden{overflow-x:hidden}.overscroll-contain{overscroll-behavior:contain}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-r-0{border-right-width:0px}.border-t{border-top-width:1px}.border-\[\#14B8A6\]\/20{border-color:#14b8a633}.border-\[\#14B8A6\]\/35{border-color:#14b8a659}.border-\[\#7C7CFF\]\/25{border-color:#7c7cff40}.border-\[\#7C7CFF\]\/30{border-color:#7c7cff4d}.border-\[\#BFFF00\]\/20{border-color:#bfff0033}.border-\[\#BFFF00\]\/25{border-color:#bfff0040}.border-\[\#BFFF00\]\/30{border-color:#bfff004d}.border-\[\#BFFF00\]\/35{border-color:#bfff0059}.border-\[\#BFFF00\]\/40{border-color:#bfff0066}.border-\[\#F5B700\]\/20{border-color:#f5b70033}.border-\[\#FF6B88\]\/20{border-color:#ff6b8833}.border-amber-200\/20{border-color:#fde68a33}.border-amber-200\/25{border-color:#fde68a40}.border-amber-300\/20{border-color:#fcd34d33}.border-amber-300\/45{border-color:#fcd34d73}.border-amber-300\/70{border-color:#fcd34db3}.border-amber-400\/25{border-color:#fbbf2440}.border-amber-400\/30{border-color:#fbbf244d}.border-amber-400\/35{border-color:#fbbf2459}.border-emerald-300\/25{border-color:#6ee7b740}.border-emerald-400\/35{border-color:#34d39959}.border-fuchsia-400\/30{border-color:#e879f94d}.border-lime\/25{border-color:#bfff0040}.border-lime\/45{border-color:#bfff0073}.border-lime\/60{border-color:#bfff0099}.border-lime\/80{border-color:#bfff00cc}.border-red-400\/25{border-color:#f8717140}.border-red-400\/30{border-color:#f871714d}.border-red-500\/15{border-color:#ef444426}.border-red-500\/30{border-color:#ef44444d}.border-rose-300\/20{border-color:#fda4af33}.border-rose-300\/25{border-color:#fda4af40}.border-rose-400\/35{border-color:#fb718559}.border-sky-400\/30{border-color:#38bdf84d}.border-teal\/45{border-color:#14b8a673}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/20{border-color:#fff3}.border-white\/\[0\.04\]{border-color:#ffffff0a}.border-white\/\[0\.05\]{border-color:#ffffff0d}.border-white\/\[0\.06\]{border-color:#ffffff0f}.border-white\/\[0\.07\]{border-color:#ffffff12}.border-white\/\[0\.08\]{border-color:#ffffff14}.border-white\/\[0\.10\]{border-color:#ffffff1a}.border-white\/\[0\.12\]{border-color:#ffffff1f}.border-white\/\[0\.14\]{border-color:#ffffff24}.border-white\/\[0\.16\]{border-color:#ffffff29}.border-white\/\[0\.1\]{border-color:#ffffff1a}.border-l-\[\#BFFF00\]\/60{border-left-color:#bfff0099}.border-l-transparent{border-left-color:transparent}.bg-\[\#02040A\]\/75{background-color:#02040abf}.bg-\[\#070a11\]\/95{background-color:#070a11f2}.bg-\[\#070b12\]\/85{background-color:#070b12d9}.bg-\[\#080808\]{--tw-bg-opacity: 1;background-color:rgb(8 8 8 / var(--tw-bg-opacity, 1))}.bg-\[\#090d14\]\/95{background-color:#090d14f2}.bg-\[\#0A0D14\]{--tw-bg-opacity: 1;background-color:rgb(10 13 20 / var(--tw-bg-opacity, 1))}.bg-\[\#0a0a0f\]\/95{background-color:#0a0a0ff2}.bg-\[\#14B8A6\]\/10{background-color:#14b8a61a}.bg-\[\#14B8A6\]\/\[0\.06\]{background-color:#14b8a60f}.bg-\[\#7C7CFF\]\/10{background-color:#7c7cff1a}.bg-\[\#BFFF00\]{--tw-bg-opacity: 1;background-color:rgb(191 255 0 / var(--tw-bg-opacity, 1))}.bg-\[\#BFFF00\]\/10{background-color:#bfff001a}.bg-\[\#BFFF00\]\/15{background-color:#bfff0026}.bg-\[\#BFFF00\]\/80{background-color:#bfff00cc}.bg-\[\#BFFF00\]\/\[0\.05\]{background-color:#bfff000d}.bg-\[\#BFFF00\]\/\[0\.06\]{background-color:#bfff000f}.bg-\[\#F5B700\]\/10{background-color:#f5b7001a}.bg-\[\#FF6B88\]\/10{background-color:#ff6b881a}.bg-amber-200\/10{background-color:#fde68a1a}.bg-amber-200\/80{background-color:#fde68acc}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-amber-300\/10{background-color:#fcd34d1a}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black\/20{background-color:#0003}.bg-black\/25{background-color:#00000040}.bg-black\/30{background-color:#0000004d}.bg-black\/35{background-color:#00000059}.bg-black\/40{background-color:#0006}.bg-black\/60{background-color:#0009}.bg-black\/80{background-color:#000c}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/10{background-color:#34d3991a}.bg-emerald-500\/10{background-color:#10b9811a}.bg-fuchsia-400\/10{background-color:#e879f91a}.bg-lime{--tw-bg-opacity: 1;background-color:rgb(191 255 0 / var(--tw-bg-opacity, 1))}.bg-lime\/10{background-color:#bfff001a}.bg-lime\/15{background-color:#bfff0026}.bg-lime\/30{background-color:#bfff004d}.bg-lime\/\[0\.12\]{background-color:#bfff001f}.bg-lime\/\[0\.14\]{background-color:#bfff0024}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/10{background-color:#f871711a}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-500\/\[0\.04\]{background-color:#ef44440a}.bg-rose-400\/10{background-color:#fb71851a}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-sky-400\/10{background-color:#38bdf81a}.bg-teal\/10{background-color:#14b8a61a}.bg-transparent{background-color:transparent}.bg-white\/35{background-color:#ffffff59}.bg-white\/40{background-color:#fff6}.bg-white\/5{background-color:#ffffff0d}.bg-white\/\[0\.025\]{background-color:#ffffff06}.bg-white\/\[0\.02\]{background-color:#ffffff05}.bg-white\/\[0\.03\]{background-color:#ffffff08}.bg-white\/\[0\.04\]{background-color:#ffffff0a}.bg-white\/\[0\.05\]{background-color:#ffffff0d}.bg-white\/\[0\.06\]{background-color:#ffffff0f}.bg-white\/\[0\.08\]{background-color:#ffffff14}.bg-white\/\[0\.09\]{background-color:#ffffff17}.bg-white\/\[0\.12\]{background-color:#ffffff1f}.bg-white\/\[0\.1\]{background-color:#ffffff1a}.bg-\[linear-gradient\(150deg\,rgba\(20\,184\,166\,0\.15\)\,rgba\(2\,4\,10\,0\.7\)_42\%\,rgba\(2\,4\,10\,0\.95\)\)\]{background-image:linear-gradient(150deg,#14b8a626,#02040ab3 42%,#02040af2)}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-\[\#02040A\]{--tw-gradient-from: #02040A var(--tw-gradient-from-position);--tw-gradient-to: rgb(2 4 10 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-lime\/10{--tw-gradient-from: rgb(191 255 0 / .1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(191 255 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-cyan\/5{--tw-gradient-to: rgb(10 212 196 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(10 212 196 / .05) var(--tw-gradient-via-position), var(--tw-gradient-to)}.via-white\/50{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / .5) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.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-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-10{padding-left:2.5rem}.pl-4{padding-left:1rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Geist,system-ui,-apple-system,sans-serif}.text-\[0\.93em\]{font-size:.93em}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.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}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[1\.2\]{line-height:1.2}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.11em\]{letter-spacing:.11em}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#14B8A6\]{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-\[\#7EEDE1\]{--tw-text-opacity: 1;color:rgb(126 237 225 / var(--tw-text-opacity, 1))}.text-\[\#BFFF00\]{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.text-\[\#CFCBFF\]{--tw-text-opacity: 1;color:rgb(207 203 255 / var(--tw-text-opacity, 1))}.text-\[\#CFF8F3\]{--tw-text-opacity: 1;color:rgb(207 248 243 / var(--tw-text-opacity, 1))}.text-\[\#D8FFA1\]{--tw-text-opacity: 1;color:rgb(216 255 161 / var(--tw-text-opacity, 1))}.text-\[\#E6E4FF\]{--tw-text-opacity: 1;color:rgb(230 228 255 / var(--tw-text-opacity, 1))}.text-\[\#F5B700\]{--tw-text-opacity: 1;color:rgb(245 183 0 / var(--tw-text-opacity, 1))}.text-\[\#FF6B88\]{--tw-text-opacity: 1;color:rgb(255 107 136 / var(--tw-text-opacity, 1))}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-100\/85{color:#fef3c7d9}.text-amber-100\/90{color:#fef3c7e6}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-200\/75{color:#fde68abf}.text-amber-200\/90{color:#fde68ae6}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-emerald-100{--tw-text-opacity: 1;color:rgb(209 250 229 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-fuchsia-300{--tw-text-opacity: 1;color:rgb(240 171 252 / var(--tw-text-opacity, 1))}.text-lime{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.text-red-100{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.text-red-100\/90{color:#fee2e2e6}.text-red-200\/70{color:#fecacab3}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-300\/70{color:#fca5a5b3}.text-red-300\/80{color:#fca5a5cc}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/70{color:#f87171b3}.text-rose-100{--tw-text-opacity: 1;color:rgb(255 228 230 / var(--tw-text-opacity, 1))}.text-rose-100\/80{color:#ffe4e6cc}.text-rose-100\/90{color:#ffe4e6e6}.text-rose-200{--tw-text-opacity: 1;color:rgb(254 205 211 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-teal{--tw-text-opacity: 1;color:rgb(20 184 166 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/20{color:#fff3}.text-white\/25{color:#ffffff40}.text-white\/30{color:#ffffff4d}.text-white\/35{color:#ffffff59}.text-white\/40{color:#fff6}.text-white\/45{color:#ffffff73}.text-white\/50{color:#ffffff80}.text-white\/55{color:#ffffff8c}.text-white\/60{color:#fff9}.text-white\/65{color:#ffffffa6}.text-white\/70{color:#ffffffb3}.text-white\/75{color:#ffffffbf}.text-white\/80{color:#fffc}.text-white\/85{color:#ffffffd9}.text-white\/90{color:#ffffffe6}.text-white\/95{color:#fffffff2}.underline{text-decoration-line:underline}.decoration-white\/20{text-decoration-color:#fff3}.decoration-white\/35{text-decoration-color:#ffffff59}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder-white\/30::placeholder{color:#ffffff4d}.accent-\[\#BFFF00\]{accent-color:#BFFF00}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-\[0_0_16px_rgba\(191\,255\,0\,0\.08\)\]{--tw-shadow: 0 0 16px rgba(191,255,0,.08);--tw-shadow-colored: 0 0 16px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_24px_rgba\(191\,255\,0\,0\.12\)\]{--tw-shadow: 0 0 24px rgba(191,255,0,.12);--tw-shadow-colored: 0 0 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_10px_30px_rgba\(0\,0\,0\,0\.35\)\]{--tw-shadow: 0 10px 30px rgba(0,0,0,.35);--tw-shadow-colored: 0 10px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_16px_40px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 16px 40px rgba(0,0,0,.45);--tw-shadow-colored: 0 16px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_20px_40px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 20px 40px rgba(0,0,0,.45);--tw-shadow-colored: 0 20px 40px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_20px_50px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow: 0 20px 50px rgba(0,0,0,.45);--tw-shadow-colored: 0 20px 50px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-lg{--tw-backdrop-blur: blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}:root{color-scheme:dark;--orgx-bg: #02040a;--orgx-surface: #08090d;--orgx-surface-elevated: #0c0e14;--orgx-border: rgba(255, 255, 255, .08);--orgx-border-strong: rgba(255, 255, 255, .12);--orgx-text: #f2f7ff;--orgx-text-muted: #8f9ab7;--orgx-lime: #bfff00;--orgx-teal: #14b8a6;--orgx-cyan: #0ad4c4}*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.16) transparent}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff29;border-radius:999px}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes pulseSoft{0%,to{opacity:.5}50%{opacity:1}}@keyframes floatSlow{0%{transform:translateZ(0)}50%{transform:translate3d(0,-12px,0)}to{transform:translateZ(0)}}.ambient-orb{position:absolute;border-radius:999px;filter:blur(52px);opacity:.45;animation:floatSlow 12s ease-in-out infinite}.ambient-orb.orb-lime{background:radial-gradient(circle,rgba(191,255,0,.3),transparent 62%)}.ambient-orb.orb-teal{background:radial-gradient(circle,rgba(20,184,166,.26),transparent 62%)}.ambient-orb.orb-iris{background:radial-gradient(circle,rgba(124,124,255,.22),transparent 62%)}.grain-overlay{pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");mix-blend-mode:soft-light;opacity:.1}@keyframes shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}@keyframes drawIn{0%{stroke-dashoffset:1}to{stroke-dashoffset:0}}@keyframes stepEntrance{0%{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes cardEnter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes breathe{0%,to{opacity:.7}50%{opacity:1}}.status-breathe{animation:breathe 3s ease-in-out infinite}.section-divider{height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.06) 20%,rgba(255,255,255,.06) 80%,transparent)}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.placeholder\:text-white\/15::-moz-placeholder{color:#ffffff26}.placeholder\:text-white\/15::placeholder{color:#ffffff26}.placeholder\:text-white\/20::-moz-placeholder{color:#fff3}.placeholder\:text-white\/20::placeholder{color:#fff3}.placeholder\:text-white\/25::-moz-placeholder{color:#ffffff40}.placeholder\:text-white\/25::placeholder{color:#ffffff40}.placeholder\:text-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder\:text-white\/30::placeholder{color:#ffffff4d}.placeholder\:text-white\/35::-moz-placeholder{color:#ffffff59}.placeholder\:text-white\/35::placeholder{color:#ffffff59}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:border-\[\#BFFF00\]\/40:focus-within{border-color:#bfff0066}.hover\:border-white\/\[0\.14\]:hover{border-color:#ffffff24}.hover\:border-white\/\[0\.16\]:hover{border-color:#ffffff29}.hover\:border-white\/\[0\.18\]:hover{border-color:#ffffff2e}.hover\:border-white\/\[0\.2\]:hover{border-color:#fff3}.hover\:bg-\[\#BFFF00\]\/20:hover{background-color:#bfff0033}.hover\:bg-\[\#BFFF00\]\/\[0\.1\]:hover{background-color:#bfff001a}.hover\:bg-\[\#d3ff42\]:hover{--tw-bg-opacity: 1;background-color:rgb(211 255 66 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-200\/15:hover{background-color:#fde68a26}.hover\:bg-amber-400\/20:hover{background-color:#fbbf2433}.hover\:bg-fuchsia-400\/20:hover{background-color:#e879f933}.hover\:bg-lime\/20:hover{background-color:#bfff0033}.hover\:bg-red-400\/20:hover{background-color:#f8717133}.hover\:bg-rose-400\/15:hover{background-color:#fb718526}.hover\:bg-rose-400\/20:hover{background-color:#fb718533}.hover\:bg-sky-400\/20:hover{background-color:#38bdf833}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}.hover\:bg-white\/\[0\.05\]:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}.hover\:bg-white\/\[0\.07\]:hover{background-color:#ffffff12}.hover\:bg-white\/\[0\.08\]:hover{background-color:#ffffff14}.hover\:bg-white\/\[0\.1\]:hover{background-color:#ffffff1a}.hover\:bg-\[linear-gradient\(150deg\,rgba\(20\,184\,166\,0\.22\)\,rgba\(2\,4\,10\,0\.72\)_42\%\,rgba\(2\,4\,10\,0\.95\)\)\]:hover{background-image:linear-gradient(150deg,#14b8a638,#02040ab8 42%,#02040af2)}.hover\:text-\[\#BFFF00\]:hover{--tw-text-opacity: 1;color:rgb(191 255 0 / var(--tw-text-opacity, 1))}.hover\:text-\[\#ECFFC6\]:hover{--tw-text-opacity: 1;color:rgb(236 255 198 / var(--tw-text-opacity, 1))}.hover\:text-emerald-400:hover{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.hover\:text-red-200:hover{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-white\/55:hover{color:#ffffff8c}.hover\:text-white\/60:hover{color:#fff9}.hover\:text-white\/70:hover{color:#ffffffb3}.hover\:text-white\/80:hover{color:#fffc}.hover\:text-white\/85:hover{color:#ffffffd9}.hover\:text-white\/90:hover{color:#ffffffe6}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-\[0_0_32px_rgba\(191\,255\,0\,0\.22\)\]:hover{--tw-shadow: 0 0 32px rgba(191,255,0,.22);--tw-shadow-colored: 0 0 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-\[\#BFFF00\]\/30:focus{border-color:#bfff004d}.focus\:border-\[\#BFFF00\]\/40:focus{border-color:#bfff0066}.focus\:border-white\/25:focus{border-color:#ffffff40}.focus\:bg-white\/\[0\.05\]:focus{background-color:#ffffff0d}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#BFFF00\]\/30:focus{--tw-ring-color: rgb(191 255 0 / .3)}.focus\:ring-\[\#BFFF00\]\/40:focus{--tw-ring-color: rgb(191 255 0 / .4)}.focus\:ring-lime\/40:focus{--tw-ring-color: rgb(191 255 0 / .4)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-\[\#BFFF00\]\/35:focus-visible{--tw-ring-color: rgb(191 255 0 / .35)}.focus-visible\:ring-\[\#BFFF00\]\/45:focus-visible{--tw-ring-color: rgb(191 255 0 / .45)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-\[\#02040A\]:focus-visible{--tw-ring-offset-color: #02040A}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-white\/10:disabled{border-color:#ffffff1a}.disabled\:bg-white\/\[0\.08\]:disabled{background-color:#ffffff14}.disabled\:text-white\/45:disabled{color:#ffffff73}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-35:disabled{opacity:.35}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-white\/\[0\.06\]{background-color:#ffffff0f}.group:hover .group-hover\:text-white\/50{color:#ffffff80}.group:hover .group-hover\:text-white\/80{color:#fffc}.group\/row:hover .group-hover\/row\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:h-\[86vh\]{height:86vh}.sm\:h-\[88vh\]{height:88vh}.sm\:max-h-\[86vh\]{max-height:86vh}.sm\:max-h-\[88vh\]{max-height:88vh}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:rounded-2xl{border-radius:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pt-8{padding-top:2rem}.sm\:text-\[30px\]{font-size:30px}}@media(min-width:768px){.md\:inline-flex{display:inline-flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:col-span-6{grid-column:span 6 / span 6}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-screen{height:100vh}.lg\:min-h-0{min-height:0px}.lg\:flex-1{flex:1 1 0%}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr}.lg\:flex-col{flex-direction:column}.lg\:gap-2{gap:.5rem}.lg\:overflow-hidden{overflow:hidden}.lg\:pb-5{padding-bottom:1.25rem}}@media(min-width:1280px){.xl\:inline{display:inline}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:\[\&\>section\]\:h-full>section{height:100%}}