@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.
- package/dashboard/dist/assets/MissionControlView-DVNfDWKZ.js +1 -0
- package/dashboard/dist/assets/SessionInspector-BaqnAys4.js +1 -0
- package/dashboard/dist/assets/index-B4Yix84X.js +212 -0
- package/dashboard/dist/assets/index-BWSvw1HR.css +1 -0
- package/dashboard/dist/assets/motion-x9c01cgK.js +9 -0
- package/dashboard/dist/assets/orgx-logo-Fm0FhtnV.png +0 -0
- package/dashboard/dist/assets/react-vendor-C2t2w4r2.js +32 -0
- package/dashboard/dist/assets/tanstack-C-KIc3Wc.js +1 -0
- package/dashboard/dist/assets/vendor-C-AHK0Ly.js +9 -0
- package/dashboard/dist/index.html +6 -2
- package/dist/agent-context-store.d.ts.map +1 -1
- package/dist/agent-context-store.js +21 -20
- package/dist/agent-context-store.js.map +1 -1
- package/dist/agent-run-store.d.ts.map +1 -1
- package/dist/agent-run-store.js +21 -20
- package/dist/agent-run-store.js.map +1 -1
- package/dist/auth-store.d.ts.map +1 -1
- package/dist/auth-store.js +39 -44
- package/dist/auth-store.js.map +1 -1
- package/dist/byok-store.d.ts.map +1 -1
- package/dist/byok-store.js +24 -20
- package/dist/byok-store.js.map +1 -1
- package/dist/contracts/types.d.ts +33 -0
- package/dist/contracts/types.d.ts.map +1 -1
- package/dist/fs-utils.d.ts +7 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +63 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/http-handler.d.ts +17 -0
- package/dist/http-handler.d.ts.map +1 -1
- package/dist/http-handler.js +1586 -119
- package/dist/http-handler.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-apps/orgx-live.html +690 -0
- package/dist/outbox.d.ts.map +1 -1
- package/dist/outbox.js +74 -29
- package/dist/outbox.js.map +1 -1
- package/dist/paths.d.ts +23 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +50 -0
- package/dist/paths.js.map +1 -0
- package/dist/reporting/outbox-replay.d.ts +2 -0
- package/dist/reporting/outbox-replay.d.ts.map +1 -0
- package/dist/reporting/outbox-replay.js +17 -0
- package/dist/reporting/outbox-replay.js.map +1 -0
- package/dist/reporting/rollups.d.ts +21 -0
- package/dist/reporting/rollups.d.ts.map +1 -0
- package/dist/reporting/rollups.js +85 -0
- package/dist/reporting/rollups.js.map +1 -0
- package/dist/runtime-instance-store.d.ts +63 -0
- package/dist/runtime-instance-store.d.ts.map +1 -0
- package/dist/runtime-instance-store.js +363 -0
- package/dist/runtime-instance-store.js.map +1 -0
- package/dist/snapshot-store.d.ts.map +1 -1
- package/dist/snapshot-store.js +24 -20
- package/dist/snapshot-store.js.map +1 -1
- package/package.json +2 -2
- package/dashboard/dist/assets/index-BjqNjHpY.css +0 -1
- package/dashboard/dist/assets/index-DCLkU4AM.js +0 -57
- 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":"
|
|
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"}
|
package/dist/snapshot-store.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import { mkdirSync, readFileSync,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
11
|
+
const dir = snapshotDir();
|
|
12
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
8
13
|
try {
|
|
9
|
-
chmodSync(
|
|
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(
|
|
31
|
+
if (!existsSync(file))
|
|
26
32
|
return null;
|
|
27
|
-
const
|
|
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
|
-
|
|
45
|
-
|
|
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(
|
|
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,
|
|
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
|
+
"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%}}
|