@usebitl/cli 0.1.14 → 0.1.16

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.
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ // Claude Code interrupt watcher. bitl-hook.mjs spawns it separately on each UserPromptSubmit (Claude Code doesn't wait).
3
+ //
4
+ // node bitl-cc-watch.mjs <session id> <transcript path> <cwd>
5
+ //
6
+ // Claude Code sends no hook when the user interrupts a turn, so the card would stay "running". Follow the transcript
7
+ // until the turn ends; if it was interrupted, send bitl:Interrupted (ends the turn on the board). Only the event goes
8
+ // out — no transcript content. Exits quietly on a normal end, after 2 hours, or on any error. Always exit 0.
9
+
10
+ import { sendRecord } from './send.mjs';
11
+
12
+ async function main() {
13
+ const [sessionId, transcriptPath, cwd] = process.argv.slice(2);
14
+ if (!sessionId || !transcriptPath) return;
15
+ const { watchClaudeTurn } = await import('./dist/core.mjs');
16
+ const mark = await watchClaudeTurn(transcriptPath);
17
+ if (mark?.mark !== 'interrupted') return;
18
+ await sendRecord({
19
+ source: 'claude-code',
20
+ receivedAt: mark.at ?? new Date().toISOString(),
21
+ payload: { hook_event_name: 'bitl:Interrupted', session_id: sessionId, transcript_path: transcriptPath, ...(cwd ? { cwd } : {}) },
22
+ });
23
+ }
24
+
25
+ main()
26
+ .catch(() => {})
27
+ .finally(() => process.exit(0));
@@ -56,6 +56,22 @@ function watchAgyPermission(payload) {
56
56
  }
57
57
  }
58
58
 
59
+ /**
60
+ * Claude Code sends no hook when the user interrupts a turn → on each prompt, spawn a watcher that reads the transcript
61
+ * until the turn ends and reports an interrupt (bitl-cc-watch.mjs). Only ids and the path are passed, never the prompt
62
+ */
63
+ function watchClaudeTurn(payload) {
64
+ try {
65
+ const { session_id: sessionId, transcript_path: transcriptPath, cwd } = payload;
66
+ if (typeof sessionId !== 'string' || typeof transcriptPath !== 'string') return;
67
+ const script = join(import.meta.dirname, 'bitl-cc-watch.mjs');
68
+ const args = [script, sessionId, transcriptPath, typeof cwd === 'string' ? cwd : ''];
69
+ spawn(process.execPath, args, { detached: true, stdio: 'ignore', windowsHide: true }).unref();
70
+ } catch {
71
+ // the hook carries on even if the watcher can't start
72
+ }
73
+ }
74
+
59
75
  /**
60
76
  * Claude Code agent view (`claude agents`): the daemon keeps pre-warmed sessions parked as spares (CLAUDE_BG_SOURCE=spare).
61
77
  * A parked spare fires SessionStart but gets no prompt until a task is dispatched to it, and is retired after an hour idle
@@ -84,6 +100,7 @@ async function main() {
84
100
  const event = argValue('--event');
85
101
  if (event && payload && typeof payload === 'object' && payload.hook_event_name === undefined) payload.hook_event_name = event;
86
102
  if (source === 'antigravity' && event === 'PreToolUse') watchAgyPermission(payload);
103
+ if (source === 'claude-code' && payload?.hook_event_name === 'UserPromptSubmit') watchClaudeTurn(payload);
87
104
  if (isParkedSpareStart(source, payload)) return;
88
105
  await sendRecord({ source, receivedAt, payload });
89
106
  }
@@ -153,6 +153,8 @@ function normalizeHook(source, raw, receivedAt) {
153
153
  }
154
154
  case "Stop":
155
155
  case "Interrupt":
156
+ // Codex: the in-progress turn was interrupted
157
+ case "bitl:Interrupted":
156
158
  type = "turn_end";
157
159
  text = str(raw.last_assistant_message);
158
160
  break;
@@ -469,7 +471,7 @@ function readCloudConfig(home = bitlHome()) {
469
471
  }
470
472
  }
471
473
  function clientVersionHeader() {
472
- const v = "0.1.14";
474
+ const v = "0.1.16";
473
475
  return v ? { "x-bitl-client": v } : {};
474
476
  }
475
477
  function resolveTarget(home = bitlHome()) {
@@ -815,6 +817,65 @@ async function requestRemoteApproval(payload, opts = {}) {
815
817
  return null;
816
818
  }
817
819
 
820
+ // ../../shared/src/node/claude-watch.ts
821
+ import { open as open2, stat as stat4 } from "node:fs/promises";
822
+ var INTERRUPTED = "[Request interrupted by user";
823
+ function claudeTurnMark(line) {
824
+ if (!line.includes(INTERRUPTED) && !line.includes('"turn_duration"')) return null;
825
+ let rec;
826
+ try {
827
+ rec = JSON.parse(line);
828
+ } catch {
829
+ return null;
830
+ }
831
+ if (rec.isSidechain) return null;
832
+ const at = typeof rec.timestamp === "string" ? rec.timestamp : void 0;
833
+ if (rec.type === "system" && rec.subtype === "turn_duration") return { mark: "ended", at };
834
+ if (rec.type !== "user" || rec.isMeta) return null;
835
+ const c = rec.message?.content;
836
+ const text = typeof c === "string" ? c : Array.isArray(c) && c[0]?.type === "text" ? String(c[0].text ?? "") : "";
837
+ return text.startsWith(INTERRUPTED) ? { mark: "interrupted", at } : null;
838
+ }
839
+ var sleep2 = (ms) => new Promise((r) => setTimeout(r, ms));
840
+ async function watchClaudeTurn(path, opts = {}) {
841
+ const pollMs = opts.pollMs ?? 1500;
842
+ const until = Date.now() + (opts.maxMs ?? 2 * 60 * 6e4);
843
+ let offset;
844
+ try {
845
+ offset = (await stat4(path)).size;
846
+ } catch {
847
+ return null;
848
+ }
849
+ let rest = "";
850
+ while (Date.now() < until) {
851
+ await sleep2(pollMs);
852
+ let size;
853
+ try {
854
+ size = (await stat4(path)).size;
855
+ } catch {
856
+ return null;
857
+ }
858
+ if (size < offset) return null;
859
+ if (size === offset) continue;
860
+ const file = await open2(path, "r");
861
+ try {
862
+ const buf = Buffer.alloc(size - offset);
863
+ await file.read(buf, 0, buf.length, offset);
864
+ offset = size;
865
+ const lines = (rest + buf.toString("utf8")).split("\n");
866
+ rest = lines.pop() ?? "";
867
+ for (const line of lines) {
868
+ const mark = claudeTurnMark(line);
869
+ if (mark?.mark === "interrupted") return mark;
870
+ if (mark?.mark === "ended") return null;
871
+ }
872
+ } finally {
873
+ await file.close();
874
+ }
875
+ }
876
+ return null;
877
+ }
878
+
818
879
  // ../../shared/src/node/index.ts
819
880
  async function prepareRaw(rec, opts = {}) {
820
881
  const filled = rec.source === "antigravity" && opts.enrich !== false ? { ...rec, payload: await fillAntigravityText(rec.payload) } : rec;
@@ -834,5 +895,6 @@ export {
834
895
  agyWatchStep,
835
896
  prepareForTarget,
836
897
  prepareRaw,
837
- requestRemoteApproval
898
+ requestRemoteApproval,
899
+ watchClaudeTurn
838
900
  };
@@ -20062,7 +20062,7 @@ function removeCloudLogin(home = bitlHome()) {
20062
20062
  rmSync(cloudKeyPath(home), { force: true });
20063
20063
  }
20064
20064
  function clientVersionHeader() {
20065
- const v = "0.1.14";
20065
+ const v = "0.1.16";
20066
20066
  return v ? { "x-bitl-client": v } : {};
20067
20067
  }
20068
20068
  function resolveTarget(home = bitlHome()) {
@@ -20119,7 +20119,7 @@ async function latestVersion(home, now) {
20119
20119
  return latest;
20120
20120
  }
20121
20121
  var updateCommand = (install = process.env.BITL_INSTALL) => install === "npx" ? "npx @usebitl/cli@latest start" : "npm i -g @usebitl/cli";
20122
- async function checkCliUpdate(current = "0.1.14", opts = {}) {
20122
+ async function checkCliUpdate(current = "0.1.16", opts = {}) {
20123
20123
  if (!current || process.env.BITL_NO_UPDATE_CHECK === "1") return void 0;
20124
20124
  const latest = await latestVersion(opts.home ?? bitlHome(), opts.now ?? Date.now());
20125
20125
  if (!latest || compareVersions(latest, current) <= 0) return void 0;
@@ -11,7 +11,7 @@ import {
11
11
  isEmptySession,
12
12
  parseWireRecord,
13
13
  sessionKey
14
- } from "./chunk-RIX6JB6S.mjs";
14
+ } from "./chunk-M5R3CYUS.mjs";
15
15
 
16
16
  // ../../../node_modules/.pnpm/bn.js@4.12.5/node_modules/bn.js/lib/bn.js
17
17
  var require_bn = __commonJS({
@@ -8842,6 +8842,102 @@ var ApprovalStore = class {
8842
8842
  }
8843
8843
  };
8844
8844
 
8845
+ // ../../server/src/store/entry-store.ts
8846
+ var ENTRY_SCHEMA = `
8847
+ CREATE TABLE IF NOT EXISTS entries (
8848
+ id TEXT NOT NULL,
8849
+ account_id TEXT NOT NULL,
8850
+ session_key TEXT,
8851
+ data TEXT NOT NULL,
8852
+ created_at TEXT NOT NULL,
8853
+ updated_at TEXT NOT NULL,
8854
+ PRIMARY KEY (account_id, id)
8855
+ );
8856
+ CREATE INDEX IF NOT EXISTS entries_time ON entries(account_id, created_at);
8857
+ CREATE INDEX IF NOT EXISTS entries_session ON entries(account_id, session_key, created_at);
8858
+ `;
8859
+ var MAX_ENTRIES = 5e4;
8860
+ var toEntry = (r) => ({
8861
+ id: r.id,
8862
+ sessionKey: r.session_key ?? void 0,
8863
+ data: r.data,
8864
+ createdAt: r.created_at,
8865
+ updatedAt: r.updated_at
8866
+ });
8867
+ var EntryStore = class {
8868
+ constructor(db) {
8869
+ this.db = db;
8870
+ }
8871
+ db;
8872
+ listeners = /* @__PURE__ */ new Set();
8873
+ subscribe(fn) {
8874
+ this.listeners.add(fn);
8875
+ return () => this.listeners.delete(fn);
8876
+ }
8877
+ emit(c) {
8878
+ for (const l of this.listeners) l(c);
8879
+ }
8880
+ /**
8881
+ * Newest first. session: only that card's entries. since/before: written at or after / strictly before (paging back).
8882
+ */
8883
+ async list(accountId, opts = {}) {
8884
+ const where = ["account_id = ?"];
8885
+ const params = [accountId];
8886
+ if (opts.session !== void 0) {
8887
+ where.push("session_key = ?");
8888
+ params.push(opts.session);
8889
+ }
8890
+ if (opts.since) {
8891
+ where.push("created_at >= ?");
8892
+ params.push(opts.since);
8893
+ }
8894
+ if (opts.before) {
8895
+ where.push("created_at < ?");
8896
+ params.push(opts.before);
8897
+ }
8898
+ params.push(Math.min(Math.max(opts.limit ?? 200, 1), 1e3));
8899
+ const { rows } = await this.db.query(`SELECT * FROM entries WHERE ${where.join(" AND ")} ORDER BY created_at DESC, id DESC LIMIT ?`, params);
8900
+ return rows.map(toEntry);
8901
+ }
8902
+ /** The browser picks the id (it is part of the seal's AAD). undefined if it exists or the limit is reached */
8903
+ async create(accountId, id, data, sessionKey2, at = (/* @__PURE__ */ new Date()).toISOString()) {
8904
+ const created = await this.db.transaction(async (q) => {
8905
+ const { rows } = await q("SELECT COUNT(*) AS n, SUM(CASE WHEN id = ? THEN 1 ELSE 0 END) AS dup FROM entries WHERE account_id = ?", [id, accountId]);
8906
+ if (Number(rows[0]?.n ?? 0) >= MAX_ENTRIES || Number(rows[0]?.dup ?? 0) > 0) return false;
8907
+ await q("INSERT INTO entries (id, account_id, session_key, data, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)", [
8908
+ id,
8909
+ accountId,
8910
+ sessionKey2 ?? null,
8911
+ data,
8912
+ at,
8913
+ at
8914
+ ]);
8915
+ return true;
8916
+ });
8917
+ if (!created) return void 0;
8918
+ const entry = { id, ...sessionKey2 ? { sessionKey: sessionKey2 } : {}, data, createdAt: at, updatedAt: at };
8919
+ this.emit({ accountId, type: "entry", entry });
8920
+ return entry;
8921
+ }
8922
+ /** Rewrites the sealed content. The time it was written never changes */
8923
+ async update(accountId, id, data) {
8924
+ const at = (/* @__PURE__ */ new Date()).toISOString();
8925
+ const entry = await this.db.transaction(async (q) => {
8926
+ const { changes } = await q("UPDATE entries SET data = ?, updated_at = ? WHERE account_id = ? AND id = ?", [data, at, accountId, id]);
8927
+ if (!changes) return void 0;
8928
+ const { rows } = await q("SELECT * FROM entries WHERE account_id = ? AND id = ?", [accountId, id]);
8929
+ return rows[0] ? toEntry(rows[0]) : void 0;
8930
+ });
8931
+ if (entry) this.emit({ accountId, type: "entry", entry });
8932
+ return entry;
8933
+ }
8934
+ async delete(accountId, id) {
8935
+ const ok = await this.db.transaction(async (q) => (await q("DELETE FROM entries WHERE account_id = ? AND id = ?", [accountId, id])).changes > 0);
8936
+ if (ok) this.emit({ accountId, type: "entry-removed", id });
8937
+ return ok;
8938
+ }
8939
+ };
8940
+
8845
8941
  // ../../server/src/store/goal-store.ts
8846
8942
  var GOAL_SCHEMA = `
8847
8943
  CREATE TABLE IF NOT EXISTS goals (
@@ -9385,7 +9481,7 @@ import { DatabaseSync } from "node:sqlite";
9385
9481
  var LOCAL_ACCOUNT = "local";
9386
9482
 
9387
9483
  // ../../server/src/store/sqlite.ts
9388
- var SCHEMA_VERSION = 10;
9484
+ var SCHEMA_VERSION = 11;
9389
9485
  var SCHEMA = `
9390
9486
  CREATE TABLE IF NOT EXISTS sessions (
9391
9487
  account_id TEXT NOT NULL,
@@ -9427,7 +9523,8 @@ CREATE INDEX IF NOT EXISTS events_session ON events(account_id, session_key, at)
9427
9523
  CREATE INDEX IF NOT EXISTS events_at ON events(at);
9428
9524
  ${PUSH_SCHEMA}
9429
9525
  ${APPROVAL_SCHEMA}
9430
- ${GOAL_SCHEMA}`;
9526
+ ${GOAL_SCHEMA}
9527
+ ${ENTRY_SCHEMA}`;
9431
9528
  var MIGRATE_2_TO_3 = `
9432
9529
  ALTER TABLE sessions RENAME TO sessions_v2;
9433
9530
  ALTER TABLE turns RENAME TO turns_v2;
@@ -12108,10 +12205,49 @@ var streamSSE = (c, cb, onError) => {
12108
12205
  return c.newResponse(stream2.responseReadable);
12109
12206
  };
12110
12207
 
12208
+ // ../../server/src/entries-api.ts
12209
+ var ENTRY_ID = /^[A-Za-z0-9_-]{8,32}$/;
12210
+ var MAX_DATA = 8e3;
12211
+ var MAX_KEY = 300;
12212
+ var validData = (v) => typeof v === "string" && v.length <= MAX_DATA && SEALED_PATTERN.test(v);
12213
+ var validTime = (v) => typeof v === "string" && !Number.isNaN(Date.parse(v));
12214
+ function mountEntries(app, entries, access = allowAll) {
12215
+ const notFound = { error: "not found" };
12216
+ const readonly = { error: "subscription_required" };
12217
+ app.get("/api/entries", async (c) => {
12218
+ const q = (k) => c.req.query(k) || void 0;
12219
+ const since = q("since");
12220
+ const before = q("before");
12221
+ if (since && !validTime(since) || before && !validTime(before)) return c.json({ error: "invalid time" }, 400);
12222
+ const limit = Number(q("limit") ?? 200);
12223
+ return c.json(await entries.list(c.var.accountId, { session: q("session"), since, before, limit: Number.isFinite(limit) ? limit : 200 }));
12224
+ });
12225
+ app.post("/api/entries", async (c) => {
12226
+ if (!await access.canWrite(c.var.accountId)) return c.json(readonly, 402);
12227
+ const body = await c.req.json().catch(() => null);
12228
+ if (typeof body?.id !== "string" || !ENTRY_ID.test(body.id) || !validData(body.data)) return c.json({ error: "invalid body" }, 400);
12229
+ if (body.sessionKey !== void 0 && (typeof body.sessionKey !== "string" || !body.sessionKey || body.sessionKey.length > MAX_KEY))
12230
+ return c.json({ error: "invalid sessionKey" }, 400);
12231
+ const entry = await entries.create(c.var.accountId, body.id, body.data, body.sessionKey);
12232
+ return entry ? c.json(entry, 201) : c.json({ error: "entry exists or too many entries" }, 409);
12233
+ });
12234
+ app.put("/api/entries/:id", async (c) => {
12235
+ if (!await access.canWrite(c.var.accountId)) return c.json(readonly, 402);
12236
+ const body = await c.req.json().catch(() => null);
12237
+ if (!validData(body?.data)) return c.json({ error: "invalid body" }, 400);
12238
+ const entry = await entries.update(c.var.accountId, c.req.param("id"), body.data);
12239
+ return entry ? c.json(entry) : c.json(notFound, 404);
12240
+ });
12241
+ app.delete(
12242
+ "/api/entries/:id",
12243
+ async (c) => await entries.delete(c.var.accountId, c.req.param("id")) ? c.json({ ok: true }) : c.json(notFound, 404)
12244
+ );
12245
+ }
12246
+
12111
12247
  // ../../server/src/goals-api.ts
12112
12248
  var GOAL_ID = /^[A-Za-z0-9_-]{8,32}$/;
12113
- var MAX_DATA = 64e3;
12114
- var validData = (v) => typeof v === "string" && v.length <= MAX_DATA && SEALED_PATTERN.test(v);
12249
+ var MAX_DATA2 = 64e3;
12250
+ var validData2 = (v) => typeof v === "string" && v.length <= MAX_DATA2 && SEALED_PATTERN.test(v);
12115
12251
  function mountGoals(app, goals, access = allowAll) {
12116
12252
  const notFound = { error: "not found" };
12117
12253
  const readonly = { error: "subscription_required" };
@@ -12119,7 +12255,7 @@ function mountGoals(app, goals, access = allowAll) {
12119
12255
  app.post("/api/goals", async (c) => {
12120
12256
  if (!await access.canWrite(c.var.accountId)) return c.json(readonly, 402);
12121
12257
  const body = await c.req.json().catch(() => null);
12122
- if (typeof body?.id !== "string" || !GOAL_ID.test(body.id) || !validData(body.data)) return c.json({ error: "invalid body" }, 400);
12258
+ if (typeof body?.id !== "string" || !GOAL_ID.test(body.id) || !validData2(body.data)) return c.json({ error: "invalid body" }, 400);
12123
12259
  const goal = await goals.create(c.var.accountId, body.id, body.data);
12124
12260
  return goal ? c.json(goal, 201) : c.json({ error: "goal exists or too many goals" }, 409);
12125
12261
  });
@@ -12127,7 +12263,7 @@ function mountGoals(app, goals, access = allowAll) {
12127
12263
  if (!await access.canWrite(c.var.accountId)) return c.json(readonly, 402);
12128
12264
  const body = await c.req.json().catch(() => null);
12129
12265
  if (!body || !Number.isInteger(body.version)) return c.json({ error: "invalid body" }, 400);
12130
- if (body.data !== void 0 && !validData(body.data)) return c.json({ error: "invalid data" }, 400);
12266
+ if (body.data !== void 0 && !validData2(body.data)) return c.json({ error: "invalid data" }, 400);
12131
12267
  if (body.closed !== void 0 && typeof body.closed !== "boolean") return c.json({ error: "invalid closed" }, 400);
12132
12268
  const r = await goals.update(c.var.accountId, c.req.param("id"), body.version, {
12133
12269
  data: body.data,
@@ -12147,7 +12283,7 @@ async function ingestRecord(store, accountId, body) {
12147
12283
  const rec = parseWireRecord(body);
12148
12284
  return rec ? store.ingest(accountId, rec) : null;
12149
12285
  }
12150
- function createApp({ store, webDist, account, push, approvals, goals, access = allowAll, extension, build }) {
12286
+ function createApp({ store, webDist, account, push, approvals, goals, entries, access = allowAll, extension, build }) {
12151
12287
  const app = new Hono2();
12152
12288
  const resolve2 = account ?? (() => LOCAL_ACCOUNT);
12153
12289
  app.get("/api/health", (c) => c.json(build ? { ok: true, build } : { ok: true }));
@@ -12171,6 +12307,7 @@ function createApp({ store, webDist, account, push, approvals, goals, access = a
12171
12307
  if (push) mountPush(app, push.store);
12172
12308
  if (approvals) mountApprovals(app, approvals, access);
12173
12309
  if (goals) mountGoals(app, goals, access);
12310
+ if (entries) mountEntries(app, entries, access);
12174
12311
  app.post("/api/events", async (c) => {
12175
12312
  let body;
12176
12313
  try {
@@ -12264,10 +12401,16 @@ function createApp({ store, webDist, account, push, approvals, goals, access = a
12264
12401
  queue.push(change);
12265
12402
  wake?.();
12266
12403
  });
12404
+ const offEntries = entries?.subscribe((change) => {
12405
+ if (change.accountId !== accountId) return;
12406
+ queue.push(change);
12407
+ wake?.();
12408
+ });
12267
12409
  const unsubscribe = () => {
12268
12410
  offSessions();
12269
12411
  offApprovals?.();
12270
12412
  offGoals?.();
12413
+ offEntries?.();
12271
12414
  };
12272
12415
  stream2.onAbort(() => {
12273
12416
  unsubscribe();
@@ -12288,7 +12431,7 @@ function createApp({ store, webDist, account, push, approvals, goals, access = a
12288
12431
  }
12289
12432
  const change = queue.shift();
12290
12433
  await stream2.writeSSE(
12291
- change.type === "session" ? { event: "session", data: JSON.stringify(change.session) } : change.type === "approval" ? { event: "approval", data: JSON.stringify(change.approval) } : change.type === "goal" ? { event: "goal", data: JSON.stringify(change.goal) } : change.type === "goal-removed" ? { event: "goal-removed", data: JSON.stringify({ id: change.id }) } : { event: "removed", data: JSON.stringify({ key: change.key }) }
12434
+ change.type === "session" ? { event: "session", data: JSON.stringify(change.session) } : change.type === "approval" ? { event: "approval", data: JSON.stringify(change.approval) } : change.type === "goal" ? { event: "goal", data: JSON.stringify(change.goal) } : change.type === "goal-removed" ? { event: "goal-removed", data: JSON.stringify({ id: change.id }) } : change.type === "entry" ? { event: "entry", data: JSON.stringify(change.entry) } : change.type === "entry-removed" ? { event: "entry-removed", data: JSON.stringify({ id: change.id }) } : { event: "removed", data: JSON.stringify({ key: change.key }) }
12292
12435
  );
12293
12436
  }
12294
12437
  unsubscribe();
@@ -12466,6 +12609,7 @@ function coreServices(store, access = allowAll) {
12466
12609
  const pushStore = vapidPublic && vapidPrivate ? new PushStore(store.db) : void 0;
12467
12610
  const approvals = new ApprovalStore(store.db);
12468
12611
  const goals = new GoalStore(store.db);
12612
+ const entries = new EntryStore(store.db);
12469
12613
  const offApprovalCleanup = closeApprovalsOnResume(store, approvals, logError("approval request cleanup"));
12470
12614
  const notifier = pushStore ? startPushNotifier({
12471
12615
  store,
@@ -12477,7 +12621,7 @@ function coreServices(store, access = allowAll) {
12477
12621
  }) : void 0;
12478
12622
  return {
12479
12623
  /** Passed to createApp */
12480
- app: { push: pushStore && { store: pushStore, publicKey: vapidPublic }, approvals, goals, access },
12624
+ app: { push: pushStore && { store: pushStore, publicKey: vapidPublic }, approvals, goals, entries, access },
12481
12625
  approvals,
12482
12626
  pushing: Boolean(notifier),
12483
12627
  stop() {
package/dist/cli.mjs CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  unwrapMasterKey,
22
22
  verifyPublicKey,
23
23
  wrapMasterKey
24
- } from "./chunks/chunk-RIX6JB6S.mjs";
24
+ } from "./chunks/chunk-M5R3CYUS.mjs";
25
25
 
26
26
  // ../src/index.ts
27
27
  import { homedir as homedir2 } from "node:os";
@@ -453,7 +453,7 @@ async function logout() {
453
453
  }
454
454
 
455
455
  // ../src/update.ts
456
- async function updateNotice(current = "0.1.14") {
456
+ async function updateNotice(current = "0.1.16") {
457
457
  const u = await checkCliUpdate(current);
458
458
  return u && `${t("update.available", { ...u })}
459
459
  ${t("update.changelog")}`;
@@ -609,7 +609,7 @@ async function main(argv) {
609
609
  if (String(typeof warning === "string" ? warning : warning.message).startsWith("SQLite is an experimental feature")) return;
610
610
  emitWarning(warning, ...rest2);
611
611
  });
612
- const { startServer } = await import("./chunks/src-WI4MJOSQ.mjs");
612
+ const { startServer } = await import("./chunks/src-TMKK2ZVL.mjs");
613
613
  await startServer();
614
614
  console.log(t("start.pair", { url: localPairUrl() }));
615
615
  return;
@@ -631,7 +631,7 @@ async function main(argv) {
631
631
  case "--version":
632
632
  case "-v":
633
633
  case "version":
634
- console.log("0.1.14");
634
+ console.log("0.1.16");
635
635
  return;
636
636
  case "remote":
637
637
  case "away":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usebitl/cli",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "BITL — see which of your AI coding agents (Claude Code, Codex, Antigravity) are waiting for you. Local board or usebitl.com",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:"Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Malgun Gothic", "Segoe UI", sans-serif;--font-mono:ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-800:oklch(47% .157 37.304);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-blue-600:oklch(54.6% .245 262.881);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-800:oklch(43.2% .232 292.759);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-300:oklch(81% .117 11.638);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-800:oklch(45.5% .188 13.697);--color-zinc-50:oklch(98.5% 0 none);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-\[18\%\]{inset:18%}.inset-x-0{inset-inline:0}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-y-0{inset-block:0}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-2{top:calc(var(--spacing) * 2)}.top-9{top:calc(var(--spacing) * 9)}.top-24{top:calc(var(--spacing) * 24)}.top-full{top:100%}.right-0{right:0}.right-0\.5{right:calc(var(--spacing) * .5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-8{right:calc(var(--spacing) * 8)}.bottom-0{bottom:0}.bottom-\[max\(0\.5rem\,env\(safe-area-inset-bottom\)\)\]{bottom:max(.5rem, env(safe-area-inset-bottom))}.bottom-\[max\(1\.5rem\,env\(safe-area-inset-bottom\)\)\]{bottom:max(1.5rem, env(safe-area-inset-bottom))}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-\[1\.375rem\]{left:1.375rem}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-8{margin-block:calc(var(--spacing) * 8)}.-mt-3{margin-top:calc(var(--spacing) * -3)}.-mt-10{margin-top:calc(var(--spacing) * -10)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mr-1{margin-right:var(--spacing)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-\[12\]{-webkit-line-clamp:12;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-\[9\/18\.5\]{aspect-ratio:9/18.5}.aspect-square{aspect-ratio:1}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-\[18px\]{width:18px;height:18px}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.min-h-0{min-height:0}.min-h-dvh{min-height:100dvh}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-44{width:calc(var(--spacing) * 44)}.w-52{width:calc(var(--spacing) * 52)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-\[38\%\]{width:38%}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-\[900px\]{max-width:900px}.max-w-\[1080px\]{max-width:1080px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[1600px\]{max-width:1600px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-\[640px\]{min-width:640px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[1\.75rem_1fr\]{grid-template-columns:1.75rem 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[repeat\(auto-fill\,minmax\(230px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-zinc-100>:not(:last-child)){border-color:var(--color-zinc-100)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[10px\]{border-radius:10px}.rounded-\[30px\]{border-radius:30px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[7px\]{border-style:var(--tw-border-style);border-width:7px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#1b1f29\]{border-color:#1b1f29}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-500\/35{border-color:#f99c0059}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/35{border-color:color-mix(in oklab, var(--color-amber-500) 35%, transparent)}}.border-amber-500\/45{border-color:#f99c0073}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/45{border-color:color-mix(in oklab, var(--color-amber-500) 45%, transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.border-emerald-300{border-color:var(--color-emerald-300)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/50{border-color:#00bb7f80}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/50{border-color:color-mix(in oklab, var(--color-emerald-500) 50%, transparent)}}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\/40{border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.border-red-500\/45{border-color:#fb2c3673}@supports (color:color-mix(in lab, red, red)){.border-red-500\/45{border-color:color-mix(in oklab, var(--color-red-500) 45%, transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.border-red-500\/50{border-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.border-rose-500{border-color:var(--color-rose-500)}.border-sky-300{border-color:var(--color-sky-300)}.border-sky-500{border-color:var(--color-sky-500)}.border-transparent{border-color:#0000}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-600{border-color:var(--color-zinc-600)}.border-zinc-900{border-color:var(--color-zinc-900)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/\[0\.08\]{background-color:#f99c0014}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/\[0\.08\]{background-color:color-mix(in oklab, var(--color-amber-500) 8%, transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/45{background-color:#00000073}@supports (color:color-mix(in lab, red, red)){.bg-black\/45{background-color:color-mix(in oklab, var(--color-black) 45%, transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab, red, red)){.bg-black\/90{background-color:color-mix(in oklab, var(--color-black) 90%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/60{background-color:#fef2f299}@supports (color:color-mix(in lab, red, red)){.bg-red-50\/60{background-color:color-mix(in oklab, var(--color-red-50) 60%, transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-white{background-color:var(--color-white)}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-50\/90{background-color:#fafafae6}@supports (color:color-mix(in lab, red, red)){.bg-zinc-50\/90{background-color:color-mix(in oklab, var(--color-zinc-50) 90%, transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-400\/50{background-color:#9f9fa980}@supports (color:color-mix(in lab, red, red)){.bg-zinc-400\/50{background-color:color-mix(in oklab, var(--color-zinc-400) 50%, transparent)}}.bg-zinc-900{background-color:var(--color-zinc-900)}.fill-red-500{fill:var(--color-red-500)}.stroke-none{stroke:none}.stroke-red-500{stroke:var(--color-red-500)}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-\[max\(0\.75rem\,env\(safe-area-inset-top\)\)\]{padding-top:max(.75rem, env(safe-area-inset-top))}.pt-\[max\(1rem\,env\(safe-area-inset-top\)\)\]{padding-top:max(1rem, env(safe-area-inset-top))}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-72{padding-bottom:calc(var(--spacing) * 72)}.pb-\[max\(0\.75rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(.75rem, env(safe-area-inset-bottom))}.pb-\[max\(1rem\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(1rem, env(safe-area-inset-bottom))}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-\[26px\]{padding-left:26px}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.6rem\]{font-size:.6rem}.text-\[0\.7rem\]{font-size:.7rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[0\.54rem\]{font-size:.54rem}.text-\[0\.56rem\]{font-size:.56rem}.text-\[0\.58rem\]{font-size:.58rem}.text-\[0\.64rem\]{font-size:.64rem}.text-\[0\.65rem\]{font-size:.65rem}.text-\[0\.68rem\]{font-size:.68rem}.text-\[0\.72rem\]{font-size:.72rem}.text-\[0\.78rem\]{font-size:.78rem}.text-\[0\.82rem\]{font-size:.82rem}.text-\[0\.85em\]{font-size:.85em}.text-\[0\.92rem\]{font-size:.92rem}.text-\[0\.95rem\]{font-size:.95rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[0\.9375rem\]{font-size:.9375rem}.text-\[1\.0625rem\]{font-size:1.0625rem}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-700\/70{color:#b75000b3}@supports (color:color-mix(in lab, red, red)){.text-amber-700\/70{color:color-mix(in oklab, var(--color-amber-700) 70%, transparent)}}.text-amber-800{color:var(--color-amber-800)}.text-blue-600{color:var(--color-blue-600)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-orange-800{color:var(--color-orange-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-600\/70{color:#e40014b3}@supports (color:color-mix(in lab, red, red)){.text-red-600\/70{color:color-mix(in oklab, var(--color-red-600) 70%, transparent)}}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-rose-800{color:var(--color-rose-800)}.text-sky-600{color:var(--color-sky-600)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-800{color:var(--color-violet-800)}.text-white{color:var(--color-white)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}.not-italic{font-style:normal}.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,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-red-600{accent-color:var(--color-red-600)}.accent-sky-600{accent-color:var(--color-sky-600)}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-45{opacity:.45}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-zinc-900\/5{--tw-shadow-color:#18181b0d}@supports (color:color-mix(in lab, red, red)){.shadow-zinc-900\/5{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-zinc-900) 5%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-sky-500{--tw-ring-color:var(--color-sky-500)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-zinc-50{--tw-ring-offset-color:var(--color-zinc-50)}.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-\[2px\]{--tw-backdrop-blur:blur(2px);-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,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:text-zinc-700:is(:where(.group):hover *){color:var(--color-zinc-700)}.hover\:border-red-400:hover{border-color:var(--color-red-400)}.hover\:border-sky-300:hover{border-color:var(--color-sky-300)}.hover\:border-zinc-300:hover{border-color:var(--color-zinc-300)}.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}.hover\:bg-emerald-500:hover{background-color:var(--color-emerald-500)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\:text-amber-900:hover{color:var(--color-amber-900)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-zinc-700:hover{color:var(--color-zinc-700)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-sky-500:focus{border-color:var(--color-sky-500)}.focus\:border-zinc-500:focus{border-color:var(--color-zinc-500)}.focus\:opacity-100:focus{opacity:1}.active\:bg-zinc-100:active{background-color:var(--color-zinc-100)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:absolute{position:absolute}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:mt-0{margin-top:0}.sm\:ml-2{margin-left:calc(var(--spacing) * 2)}.sm\:block{display:block}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:h-\[88vh\]{height:88vh}.sm\:w-\[34rem\]{width:34rem}.sm\:w-auto{width:auto}.sm\:max-w-6xl{max-width:var(--container-6xl)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[8rem_minmax\(0\,1fr\)\]{grid-template-columns:8rem minmax(0,1fr)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:rounded-2xl{border-radius:var(--radius-2xl)}.sm\:border{border-style:var(--tw-border-style);border-width:1px}.sm\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.sm\:border-zinc-200{border-color:var(--color-zinc-200)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-1{padding-block:var(--spacing)}.sm\:pr-16{padding-right:calc(var(--spacing) * 16)}.sm\:pr-\[35\.5rem\]{padding-right:35.5rem}.sm\:pb-12{padding-bottom:calc(var(--spacing) * 12)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:opacity-0{opacity:0}@media (hover:hover){.sm\:group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}}@media (width>=48rem){.md\:inline{display:inline}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-\[0\.9fr_1\.1fr\]{grid-template-columns:.9fr 1.1fr}.md\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}@media (width>=64rem){.lg\:static{position:static}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:grid-cols-\[minmax\(0\,1fr\)_18rem\]{grid-template-columns:minmax(0,1fr) 18rem}.lg\:border-0{border-style:var(--tw-border-style);border-width:0}.lg\:bg-transparent{background-color:#0000}.lg\:p-0{padding:0}.lg\:pb-8{padding-bottom:calc(var(--spacing) * 8)}}@container (width>=42rem){.\@2xl\:order-5{order:5}.\@2xl\:w-64{width:calc(var(--spacing) * 64)}.\@2xl\:w-72{width:calc(var(--spacing) * 72)}.\@2xl\:basis-auto{flex-basis:auto}.\@2xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width>=64rem){.\@5xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}:where(.dark\:divide-zinc-800:where(.dark,.dark *)>:not(:last-child)){border-color:var(--color-zinc-800)}.dark\:border-amber-500\/40:where(.dark,.dark *){border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-500\/40:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.dark\:border-emerald-500\/40:where(.dark,.dark *){border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-500\/40:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.dark\:border-red-500\/30:where(.dark,.dark *){border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/30:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.dark\:border-red-500\/40:where(.dark,.dark *){border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/40:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.dark\:border-red-500\/50:where(.dark,.dark *){border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.dark\:border-sky-500\/40:where(.dark,.dark *){border-color:#00a5ef66}@supports (color:color-mix(in lab, red, red)){.dark\:border-sky-500\/40:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-sky-500) 40%, transparent)}}.dark\:border-zinc-100:where(.dark,.dark *){border-color:var(--color-zinc-100)}.dark\:border-zinc-700:where(.dark,.dark *){border-color:var(--color-zinc-700)}.dark\:border-zinc-800:where(.dark,.dark *){border-color:var(--color-zinc-800)}.dark\:bg-\[\#0b0d12\]:where(.dark,.dark *){background-color:#0b0d12}.dark\:bg-\[\#0b0d12\]\/90:where(.dark,.dark *){background-color:oklab(15.9279% -.000392795 -.0111319/.9)}.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.dark\:bg-amber-500\/15:where(.dark,.dark *){background-color:#f99c0026}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-500) 15%, transparent)}}.dark\:bg-amber-500\/20:where(.dark,.dark *){background-color:#f99c0033}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-amber-500) 20%, transparent)}}.dark\:bg-black\/30:where(.dark,.dark *){background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-black\/30:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.dark\:bg-emerald-500\/10:where(.dark,.dark *){background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.dark\:bg-emerald-500\/15:where(.dark,.dark *){background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.dark\:bg-orange-500\/15:where(.dark,.dark *){background-color:#fe6e0026}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-orange-500) 15%, transparent)}}.dark\:bg-red-500\/10:where(.dark,.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.dark\:bg-rose-500\/15:where(.dark,.dark *){background-color:#ff235726}@supports (color:color-mix(in lab, red, red)){.dark\:bg-rose-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-rose-500) 15%, transparent)}}.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:#00a5ef1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-500\/10:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-sky-500) 10%, transparent)}}.dark\:bg-sky-500\/15:where(.dark,.dark *){background-color:#00a5ef26}@supports (color:color-mix(in lab, red, red)){.dark\:bg-sky-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-sky-500) 15%, transparent)}}.dark\:bg-violet-500\/15:where(.dark,.dark *){background-color:#8d54ff26}@supports (color:color-mix(in lab, red, red)){.dark\:bg-violet-500\/15:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-violet-500) 15%, transparent)}}.dark\:bg-white:where(.dark,.dark *){background-color:var(--color-white)}.dark\:bg-zinc-100:where(.dark,.dark *){background-color:var(--color-zinc-100)}.dark\:bg-zinc-600:where(.dark,.dark *){background-color:var(--color-zinc-600)}.dark\:bg-zinc-700:where(.dark,.dark *){background-color:var(--color-zinc-700)}.dark\:bg-zinc-700\/50:where(.dark,.dark *){background-color:#3f3f4680}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-700) 50%, transparent)}}.dark\:bg-zinc-700\/60:where(.dark,.dark *){background-color:#3f3f4699}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-700\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-700) 60%, transparent)}}.dark\:bg-zinc-800:where(.dark,.dark *){background-color:var(--color-zinc-800)}.dark\:bg-zinc-800\/60:where(.dark,.dark *){background-color:#27272a99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-800) 60%, transparent)}}.dark\:bg-zinc-900:where(.dark,.dark *){background-color:var(--color-zinc-900)}.dark\:bg-zinc-900\/60:where(.dark,.dark *){background-color:#18181b99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 60%, transparent)}}.dark\:bg-zinc-900\/70:where(.dark,.dark *){background-color:#18181bb3}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/70:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 70%, transparent)}}.dark\:bg-zinc-900\/95:where(.dark,.dark *){background-color:#18181bf2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-zinc-900\/95:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-zinc-900) 95%, transparent)}}.dark\:bg-zinc-950:where(.dark,.dark *){background-color:var(--color-zinc-950)}.dark\:text-amber-200:where(.dark,.dark *){color:var(--color-amber-200)}.dark\:text-amber-300:where(.dark,.dark *){color:var(--color-amber-300)}.dark\:text-amber-300\/70:where(.dark,.dark *){color:#ffd236b3}@supports (color:color-mix(in lab, red, red)){.dark\:text-amber-300\/70:where(.dark,.dark *){color:color-mix(in oklab, var(--color-amber-300) 70%, transparent)}}.dark\:text-amber-400:where(.dark,.dark *){color:var(--color-amber-400)}.dark\:text-emerald-300:where(.dark,.dark *){color:var(--color-emerald-300)}.dark\:text-emerald-400:where(.dark,.dark *){color:var(--color-emerald-400)}.dark\:text-orange-300:where(.dark,.dark *){color:var(--color-orange-300)}.dark\:text-red-200:where(.dark,.dark *){color:var(--color-red-200)}.dark\:text-red-300:where(.dark,.dark *){color:var(--color-red-300)}.dark\:text-red-300\/70:where(.dark,.dark *){color:#ffa3a3b3}@supports (color:color-mix(in lab, red, red)){.dark\:text-red-300\/70:where(.dark,.dark *){color:color-mix(in oklab, var(--color-red-300) 70%, transparent)}}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-rose-300:where(.dark,.dark *){color:var(--color-rose-300)}.dark\:text-sky-300:where(.dark,.dark *){color:var(--color-sky-300)}.dark\:text-sky-400:where(.dark,.dark *){color:var(--color-sky-400)}.dark\:text-violet-300:where(.dark,.dark *){color:var(--color-violet-300)}.dark\:text-violet-400:where(.dark,.dark *){color:var(--color-violet-400)}.dark\:text-zinc-100:where(.dark,.dark *){color:var(--color-zinc-100)}.dark\:text-zinc-200:where(.dark,.dark *){color:var(--color-zinc-200)}.dark\:text-zinc-300:where(.dark,.dark *){color:var(--color-zinc-300)}.dark\:text-zinc-400:where(.dark,.dark *){color:var(--color-zinc-400)}.dark\:text-zinc-500:where(.dark,.dark *){color:var(--color-zinc-500)}.dark\:text-zinc-900:where(.dark,.dark *){color:var(--color-zinc-900)}.dark\:ring-offset-\[\#0b0d12\]:where(.dark,.dark *){--tw-ring-offset-color:#0b0d12}@media (hover:hover){.dark\:group-hover\:text-zinc-200:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-zinc-200)}.dark\:hover\:border-sky-700:where(.dark,.dark *):hover{border-color:var(--color-sky-700)}.dark\:hover\:border-zinc-500:where(.dark,.dark *):hover{border-color:var(--color-zinc-500)}.dark\:hover\:border-zinc-600:where(.dark,.dark *):hover{border-color:var(--color-zinc-600)}.dark\:hover\:bg-red-500\/10:where(.dark,.dark *):hover{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-red-500\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.dark\:hover\:bg-white:where(.dark,.dark *):hover{background-color:var(--color-white)}.dark\:hover\:bg-zinc-800:where(.dark,.dark *):hover{background-color:var(--color-zinc-800)}.dark\:hover\:bg-zinc-900:where(.dark,.dark *):hover{background-color:var(--color-zinc-900)}.dark\:hover\:text-amber-100:where(.dark,.dark *):hover{color:var(--color-amber-100)}.dark\:hover\:text-zinc-100:where(.dark,.dark *):hover{color:var(--color-zinc-100)}.dark\:hover\:text-zinc-200:where(.dark,.dark *):hover{color:var(--color-zinc-200)}}.dark\:active\:bg-zinc-800:where(.dark,.dark *):active{background-color:var(--color-zinc-800)}@media (width>=40rem){.sm\:dark\:border-zinc-800:where(.dark,.dark *){border-color:var(--color-zinc-800)}}@media (width>=64rem){.lg\:dark\:bg-transparent:where(.dark,.dark *){background-color:#0000}}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:lang(ko){word-break:keep-all;overflow-wrap:anywhere}html,body{background-color:var(--color-zinc-50);color:var(--color-zinc-900)}:is(html,body):where(.dark,.dark *){color:var(--color-zinc-100);background-color:#0b0d12}body{padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}@keyframes pulse-ring{0%{box-shadow:0 0 #f8717173}70%{box-shadow:0 0 0 8px #f8717100}to{box-shadow:0 0 #f8717100}}.pulse-ring{animation:2s infinite pulse-ring}@keyframes bitl-spin{to{transform:rotate(360deg)}}.bitl-spin{transform-origin:32px 32px;animation:1.5s linear infinite bitl-spin}@media (prefers-reduced-motion:reduce){.bitl-spin{animation:none}}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}