@nagellabs/libi 0.1.7 → 0.1.9
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +5 -5
- package/.next/diagnostics/route-bundle-stats.json +16 -16
- package/.next/externals-manifest.json +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/(app)/editor/page/build-manifest.json +2 -2
- package/.next/server/app/(app)/instructions/page/build-manifest.json +2 -2
- package/.next/server/app/(app)/mcps-skills/page/build-manifest.json +2 -2
- package/.next/server/app/(app)/mcps-skills/skills/[name]/page/build-manifest.json +2 -2
- package/.next/server/app/(app)/mcps-skills/skills/new/page/build-manifest.json +2 -2
- package/.next/server/app/(app)/settings/page/build-manifest.json +2 -2
- package/.next/server/app/_global-error/page/build-manifest.json +2 -2
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +2 -2
- package/.next/server/app/api/agent/cancel/route.js +8 -8
- package/.next/server/app/api/agent/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/detect/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/dispatch/route.js +5 -5
- package/.next/server/app/api/agent/dispatch/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/events/route.js +11 -11
- package/.next/server/app/api/agent/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/messages/route.js +7 -7
- package/.next/server/app/api/agent/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/providers/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/send/route.js +7 -7
- package/.next/server/app/api/agent/send/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/start/route.js +7 -7
- package/.next/server/app/api/agent/start/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/stop/route.js +8 -8
- package/.next/server/app/api/agent/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/[agentId]/install/route.js +4 -4
- package/.next/server/app/api/agents/[agentId]/install/route.js.nft.json +1 -1
- package/.next/server/app/api/codex/connect/route.js.nft.json +1 -1
- package/.next/server/app/api/db/resolve/route.js +9 -9
- package/.next/server/app/api/db/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/export/chromium/route.js +5 -5
- package/.next/server/app/api/export/chromium/route.js.nft.json +1 -1
- package/.next/server/app/api/export/route.js +4 -4
- package/.next/server/app/api/export/route.js.nft.json +1 -1
- package/.next/server/app/api/files/by-id/[fileId]/filmstrip-status/route.js +4 -4
- package/.next/server/app/api/files/by-id/[fileId]/filmstrip-status/route.js.nft.json +1 -1
- package/.next/server/app/api/files/by-id/[fileId]/rename/route.js +7 -7
- package/.next/server/app/api/files/by-id/[fileId]/rename/route.js.nft.json +1 -1
- package/.next/server/app/api/folders/[folderId]/duplicate/route.js +6 -6
- package/.next/server/app/api/folders/[folderId]/duplicate/route.js.nft.json +1 -1
- package/.next/server/app/api/install-from-url/route.js +10 -10
- package/.next/server/app/api/install-from-url/route.js.nft.json +1 -1
- package/.next/server/app/api/instructions/override/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/[id]/events/route.js +8 -8
- package/.next/server/app/api/jobs/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/[id]/retry/route.js +4 -4
- package/.next/server/app/api/jobs/[id]/retry/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/[id]/route.js +4 -4
- package/.next/server/app/api/jobs/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/[id]/status/route.js +3 -3
- package/.next/server/app/api/jobs/[id]/status/route.js.nft.json +1 -1
- package/.next/server/app/api/jobs/route.js +9 -9
- package/.next/server/app/api/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/notify/route.js.nft.json +1 -1
- package/.next/server/app/api/pieces/[pieceId]/duplicate/route.js +4 -4
- package/.next/server/app/api/pieces/[pieceId]/duplicate/route.js.nft.json +1 -1
- package/.next/server/app/api/pieces/[pieceId]/tracks/[trackId]/manual-anchors/apply-deletes/route.js +9 -9
- package/.next/server/app/api/pieces/[pieceId]/tracks/[trackId]/manual-anchors/apply-deletes/route.js.nft.json +1 -1
- package/.next/server/app/api/pieces/[pieceId]/tracks/[trackId]/manual-anchors/route.js +9 -9
- package/.next/server/app/api/pieces/[pieceId]/tracks/[trackId]/manual-anchors/route.js.nft.json +1 -1
- package/.next/server/app/api/render/frames/route.js +7 -7
- package/.next/server/app/api/render/frames/route.js.nft.json +1 -1
- package/.next/server/app/api/runtime/update/route.js +5 -5
- package/.next/server/app/api/runtime/update/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[sessionId]/activate/route.js +8 -8
- package/.next/server/app/api/sessions/[sessionId]/activate/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[sessionId]/context/route.js +8 -8
- package/.next/server/app/api/sessions/[sessionId]/context/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[sessionId]/deactivate/route.js +8 -8
- package/.next/server/app/api/sessions/[sessionId]/deactivate/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[sessionId]/model/route.js +7 -7
- package/.next/server/app/api/sessions/[sessionId]/model/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[sessionId]/permission/route.js +7 -7
- package/.next/server/app/api/sessions/[sessionId]/permission/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/permission-modes/route.js +7 -7
- package/.next/server/app/api/sessions/permission-modes/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +7 -7
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/[id]/dependencies/route.js +7 -7
- package/.next/server/app/api/settings/mcp-servers/[id]/dependencies/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/[id]/install-plan/route.js +5 -5
- package/.next/server/app/api/settings/mcp-servers/[id]/install-plan/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/[id]/retry/route.js +7 -7
- package/.next/server/app/api/settings/mcp-servers/[id]/retry/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/[id]/retry-dep/route.js +7 -7
- package/.next/server/app/api/settings/mcp-servers/[id]/retry-dep/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/mcp-servers/resync/route.js +7 -7
- package/.next/server/app/api/settings/mcp-servers/resync/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/memories/route.js.nft.json +1 -1
- package/.next/server/app/api/skill-eval/configure/route.js +8 -8
- package/.next/server/app/api/skill-eval/configure/route.js.nft.json +1 -1
- package/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/.next/server/app/api/terminal/ws-info/route.js.nft.json +1 -1
- package/.next/server/app/api/tracking/run/route.js +4 -4
- package/.next/server/app/api/tracking/run/route.js.nft.json +1 -1
- package/.next/server/app/page/build-manifest.json +2 -2
- package/.next/server/chunks/[root-of-the-server]__04thdbt._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__04thdbt._.js.map +2 -2
- package/.next/server/chunks/[root-of-the-server]__05bfu4m._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__05bfu4m._.js.map +2 -2
- package/.next/server/chunks/[root-of-the-server]__09qyvq1._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__09qyvq1._.js.map +2 -2
- package/.next/server/chunks/[root-of-the-server]__0gnut6f._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__0gnut6f._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0l_-iy7._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__0l_-iy7._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0s0b6ty._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__0s0b6ty._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0sj68ta._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__0sj68ta._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__10oxitf._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__10oxitf._.js.map +2 -2
- package/.next/server/chunks/[root-of-the-server]__11.cp_g._.js +3 -3
- package/.next/server/chunks/[root-of-the-server]__11.cp_g._.js.map +2 -2
- package/.next/server/chunks/_04i643i._.js +3 -3
- package/.next/server/chunks/_0_t4b-f._.js +4 -4
- package/.next/server/chunks/_0gc3hkv._.js +3 -3
- package/.next/server/chunks/_0hainf0._.js +4 -4
- package/.next/server/chunks/_0jrwb4i._.js +3 -3
- package/.next/server/chunks/_0ms~zo_._.js +3 -3
- package/.next/server/chunks/_0ou5g0c._.js +4 -4
- package/.next/server/chunks/_0ovzm6d._.js +4 -4
- package/.next/server/chunks/_0pwx1vo._.js +3 -3
- package/.next/server/chunks/_0snzqta._.js +4 -4
- package/.next/server/chunks/lib_08x49mw._.js +3 -3
- package/.next/server/chunks/lib_runtime_runtime-prune_ts_0eaw~-q._.js +3 -3
- package/.next/server/chunks/node_modules_003ody_._.js +3 -3
- package/.next/server/chunks/ssr/_0675jux._.js +3 -3
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{0tfripjpjgh0x.js → 0rgnvt2t.fexk.js} +3 -3
- package/.next/static/chunks/{turbopack-0nj3aucu1vtlz.js → turbopack-06tait4frhc5a.js} +3 -3
- package/.next/trace-build +1 -1
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/dist-cli/BUILD_INFO.json +6 -6
- package/dist-cli/lib/analytics/config.js +1 -1
- package/dist-cli/lib/install/next-externals.js +6 -1
- package/dist-cli/lib/onboarding/piece/v1/index.js +5 -1
- package/dist-cli/lib/server/next-server.js +12 -2
- package/lib/analytics/config.ts +15 -2
- package/lib/install/next-externals.ts +36 -1
- package/lib/onboarding/piece/v1/index.ts +5 -1
- package/lib/server/next-server.ts +29 -4
- package/package.json +1 -1
- /package/.next/static/{AKrgjfjGvLuWkXofXFBpx → 05vWgPQtQKJ6EuLHg8nZ3}/_buildManifest.js +0 -0
- /package/.next/static/{AKrgjfjGvLuWkXofXFBpx → 05vWgPQtQKJ6EuLHg8nZ3}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{AKrgjfjGvLuWkXofXFBpx → 05vWgPQtQKJ6EuLHg8nZ3}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": [],
|
|
4
|
-
"debugId": "
|
|
4
|
+
"debugId": "1555da0b-3187-6e5d-fc5c-08adc73eefc0",
|
|
5
5
|
"sections": [
|
|
6
|
-
{"offset": {"line": 1, "column": 0}, "map": {"version":3,"sources":["../../../lib/db/settings.ts","../../../lib/analytics/settings-logic.ts","../../../lib/export/folder.ts","../../../lib/analytics/config.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../app/api/analytics/identity/route.ts"],"sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { getDb } from \"./client\";\nimport { settings } from \"./schema\";\nimport { serverLogger } from \"@/lib/logger\";\nimport {\n type AnalyticsSettings,\n parseAnalyticsSettings,\n mergeAnalyticsSettings,\n markMilestone,\n} from \"@/lib/analytics/settings-logic\";\nimport { crashReportChoiceAllowsReporting } from \"@/lib/sentry/enabled\";\n\nexport type { AnalyticsSettings };\n\nexport interface AppSettings {\n preferredAgent: string | null;\n panelChatSize: number;\n panelEditorSize: number;\n panelResourcesSize: number;\n panelChatVisible: boolean;\n panelResourcesVisible: boolean;\n agentApprovalModes: string | null;\n agentModelPreferences: string | null;\n onboardingPersona: string | null;\n personaSelectedAt: Date | null;\n agentEverConnected: boolean;\n /** Set once, server-side, the first time an agent connects. Null = the\n * first-run demo chip has never been armed. See lib/sessions/session-manager.ts#markAgentConnected. */\n onboardingDemoOfferedAt: Date | null;\n /** Set once the user dismisses OR takes the demo offer — final, and kept\n * independent of onboardingDemoOfferedAt so a dismissal is never confused\n * with \"never offered\". */\n onboardingDemoDismissedAt: Date | null;\n}\n\nconst DEFAULTS: AppSettings = {\n preferredAgent: null,\n panelChatSize: 40,\n panelEditorSize: 40,\n panelResourcesSize: 20,\n panelChatVisible: true,\n panelResourcesVisible: false,\n agentApprovalModes: null,\n agentModelPreferences: null,\n onboardingPersona: null,\n personaSelectedAt: null,\n agentEverConnected: false,\n onboardingDemoOfferedAt: null,\n onboardingDemoDismissedAt: null,\n};\n\n/**\n * Read the app settings (single row, id=1).\n * Auto-creates the row with defaults if it doesn't exist.\n */\nexport function getSettings(): AppSettings {\n const db = getDb();\n\n const [row] = db.select().from(settings).where(eq(settings.id, 1)).limit(1).all();\n\n if (!row) {\n db.insert(settings).values({ id: 1 }).run();\n return { ...DEFAULTS };\n }\n\n return {\n preferredAgent: row.preferredAgent ?? null,\n panelChatSize: row.panelChatSize,\n panelEditorSize: row.panelEditorSize,\n panelResourcesSize: row.panelResourcesSize,\n panelChatVisible: row.panelChatVisible,\n panelResourcesVisible: row.panelResourcesVisible,\n agentApprovalModes: row.agentApprovalModes ?? null,\n agentModelPreferences: row.agentModelPreferences ?? null,\n onboardingPersona: row.onboardingPersona ?? null,\n personaSelectedAt: row.personaSelectedAt ?? null,\n agentEverConnected: row.agentEverConnected,\n onboardingDemoOfferedAt: row.onboardingDemoOfferedAt ?? null,\n onboardingDemoDismissedAt: row.onboardingDemoDismissedAt ?? null,\n };\n}\n\n/**\n * Update specific settings fields. Only provided fields are updated.\n */\nexport function updateSettings(partial: Partial<AppSettings>): void {\n const db = getDb();\n\n // Build the SET clause from provided fields\n const set: Record<string, unknown> = { updatedAt: new Date() };\n\n if (partial.preferredAgent !== undefined) set.preferredAgent = partial.preferredAgent;\n if (partial.panelChatSize !== undefined) set.panelChatSize = partial.panelChatSize;\n if (partial.panelEditorSize !== undefined) set.panelEditorSize = partial.panelEditorSize;\n if (partial.panelResourcesSize !== undefined) set.panelResourcesSize = partial.panelResourcesSize;\n if (partial.panelChatVisible !== undefined) set.panelChatVisible = partial.panelChatVisible;\n if (partial.panelResourcesVisible !== undefined) set.panelResourcesVisible = partial.panelResourcesVisible;\n if (partial.agentApprovalModes !== undefined) set.agentApprovalModes = partial.agentApprovalModes;\n if (partial.agentModelPreferences !== undefined) set.agentModelPreferences = partial.agentModelPreferences;\n if (partial.onboardingPersona !== undefined) set.onboardingPersona = partial.onboardingPersona;\n if (partial.personaSelectedAt !== undefined) set.personaSelectedAt = partial.personaSelectedAt;\n if (partial.agentEverConnected !== undefined) set.agentEverConnected = partial.agentEverConnected;\n if (partial.onboardingDemoOfferedAt !== undefined) set.onboardingDemoOfferedAt = partial.onboardingDemoOfferedAt;\n if (partial.onboardingDemoDismissedAt !== undefined) set.onboardingDemoDismissedAt = partial.onboardingDemoDismissedAt;\n\n // Upsert: insert defaults if row doesn't exist, update if it does\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Notifications setting (typed helpers over the settings.notifications JSON column)\n// ---------------------------------------------------------------------------\n\nexport type NotificationsSetting = {\n /** Push a system notification when a background job completes while the window is backgrounded. */\n backgroundJobComplete: boolean;\n};\n\nconst NOTIFICATIONS_DEFAULTS: NotificationsSetting = {\n backgroundJobComplete: true,\n};\n\n/**\n * Read the notifications setting. Returns defaults if the row is missing,\n * the column is null/empty, or the stored JSON is malformed / wrong-shape.\n */\nexport function getNotificationsSetting(): NotificationsSetting {\n const db = getDb();\n const [row] = db\n .select({ notifications: settings.notifications })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.notifications;\n if (!raw) return { ...NOTIFICATIONS_DEFAULTS };\n\n try {\n const parsed = JSON.parse(raw) as Partial<NotificationsSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...NOTIFICATIONS_DEFAULTS };\n if (typeof parsed.backgroundJobComplete !== \"boolean\") {\n return { ...NOTIFICATIONS_DEFAULTS };\n }\n return { backgroundJobComplete: parsed.backgroundJobComplete };\n } catch {\n return { ...NOTIFICATIONS_DEFAULTS };\n }\n}\n\n/**\n * Persist the notifications setting as a JSON string in the settings table.\n * Upserts the single-row settings record if it doesn't already exist.\n */\nexport function setNotificationsSetting(s: NotificationsSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { notifications: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Codex connect setting (typed helpers over the settings.codex JSON column)\n// ---------------------------------------------------------------------------\n\nexport type CodexConnectSetting = {\n /** Whether the user opted in to keep their global ~/.codex MCP entries in sync with libi. */\n connected: boolean;\n /** Outcome of the last sync attempt. */\n lastSyncStatus: \"ok\" | \"error\" | \"idle\";\n};\n\nconst CODEX_CONNECT_DEFAULTS: CodexConnectSetting = {\n connected: false,\n lastSyncStatus: \"idle\",\n};\n\n/**\n * Read the codex connect setting. Returns defaults if the row is missing,\n * the column is null/empty, the stored JSON is malformed / wrong-shape, or\n * the DB read itself fails (e.g. a pending migration) — this is a defensive\n * read that must never throw.\n */\nexport function getCodexConnectSetting(): CodexConnectSetting {\n try {\n const db = getDb();\n const [row] = db\n .select({ codex: settings.codex })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.codex;\n if (!raw) return { ...CODEX_CONNECT_DEFAULTS };\n\n const parsed = JSON.parse(raw) as Partial<CodexConnectSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...CODEX_CONNECT_DEFAULTS };\n if (typeof parsed.connected !== \"boolean\") return { ...CODEX_CONNECT_DEFAULTS };\n const status = parsed.lastSyncStatus;\n if (status !== \"ok\" && status !== \"error\" && status !== \"idle\") {\n return { ...CODEX_CONNECT_DEFAULTS };\n }\n return { connected: parsed.connected, lastSyncStatus: status };\n } catch (err) {\n serverLogger.warn(\n { err, tag: \"codex-connect\", op: \"read_degraded\" },\n \"getCodexConnectSetting: read failed, returning defaults\",\n );\n return { ...CODEX_CONNECT_DEFAULTS };\n }\n}\n\n/**\n * Persist the codex connect setting as a JSON string in the settings table.\n * Upserts the single-row settings record if it doesn't already exist.\n */\nexport function setCodexConnectSetting(s: CodexConnectSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { codex: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Export defaults setting (folder + default format + default quality)\n// ---------------------------------------------------------------------------\n\nimport { defaultExportFolder } from \"@/lib/export/folder\";\n\nexport type ExportDefaultsSetting = {\n /** Absolute path. Null = use OS-aware default (~/Movies/libi on darwin, ~/Videos/libi elsewhere). */\n folder: string | null;\n format: \"mp4\" | \"webm\";\n quality: \"source\" | \"1080p\" | \"1440p\" | \"4k\";\n};\n\nconst EXPORT_DEFAULTS_FALLBACK: ExportDefaultsSetting = {\n folder: null,\n format: \"mp4\",\n quality: \"source\",\n};\n\n/** Read the export defaults. Falls back to OS-aware folder + MP4/Source if\n * the row is missing, the column is empty, or the JSON is malformed. */\nexport function getExportDefaults(): ExportDefaultsSetting {\n const db = getDb();\n const [row] = db\n .select({ exportDefaults: settings.exportDefaults })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.exportDefaults;\n if (!raw) return { ...EXPORT_DEFAULTS_FALLBACK };\n\n try {\n const parsed = JSON.parse(raw) as Partial<ExportDefaultsSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...EXPORT_DEFAULTS_FALLBACK };\n return {\n folder: typeof parsed.folder === \"string\" && parsed.folder ? parsed.folder : null,\n format: parsed.format === \"webm\" ? \"webm\" : \"mp4\",\n quality:\n parsed.quality === \"1080p\" || parsed.quality === \"1440p\" || parsed.quality === \"4k\"\n ? parsed.quality\n : \"source\",\n };\n } catch {\n return { ...EXPORT_DEFAULTS_FALLBACK };\n }\n}\n\n/** Resolve the effective export folder — settings if set, otherwise OS default. */\nexport function resolveExportFolder(): string {\n const defaults = getExportDefaults();\n return defaults.folder ?? defaultExportFolder();\n}\n\n/** Persist the export defaults as JSON in the settings table. */\nexport function setExportDefaults(s: ExportDefaultsSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { exportDefaults: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Bundled-skill digest cache (per-app-version, see mcp/skills/digest.ts)\n// ---------------------------------------------------------------------------\n\nimport type { SkillDigestCache } from \"@/mcp/skills/digest\";\n\n/** Read the cached bundled-skill digests. Null when missing, malformed,\n * or wrong-shape — callers treat null as \"recompute\". */\nexport function getSkillDigestCacheSetting(): SkillDigestCache | null {\n const db = getDb();\n const [row] = db\n .select({ skillDigestCache: settings.skillDigestCache })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.skillDigestCache;\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<SkillDigestCache> | null;\n if (!parsed || typeof parsed !== \"object\") return null;\n if (typeof parsed.version !== \"string\" || !parsed.version) return null;\n if (!parsed.digests || typeof parsed.digests !== \"object\") return null;\n return { version: parsed.version, digests: parsed.digests as Record<string, string> };\n } catch {\n return null;\n }\n}\n\n/** Persist the bundled-skill digest cache as JSON in the settings table. */\nexport function setSkillDigestCacheSetting(c: SkillDigestCache): void {\n const db = getDb();\n const set = { skillDigestCache: JSON.stringify(c), updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Analytics settings (typed helpers over the settings.analytics JSON column)\n// ---------------------------------------------------------------------------\n\nexport function getAnalyticsSettings(): AnalyticsSettings {\n const db = getDb();\n const [row] = db\n .select({ analytics: settings.analytics })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n return parseAnalyticsSettings(row?.analytics ?? null);\n}\n\nexport function setAnalyticsSettings(partial: Partial<AnalyticsSettings>): AnalyticsSettings {\n const db = getDb();\n const next = mergeAnalyticsSettings(getAnalyticsSettings(), partial);\n const set = { analytics: JSON.stringify(next), updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n return next;\n}\n\n/** Return the per-install analytics UUID, generating + persisting it on first call. */\nexport function getOrCreateAnalyticsUserId(): string {\n const cur = getAnalyticsSettings();\n if (cur.userId) return cur.userId;\n const userId = crypto.randomUUID();\n setAnalyticsSettings({ userId });\n return userId;\n}\n\n/** Mark an activation milestone; returns true only the first time. */\nexport function markAnalyticsMilestoneOnce(name: string): boolean {\n const { settings: next, added } = markMilestone(getAnalyticsSettings(), name);\n if (added) setAnalyticsSettings({ milestones: next.milestones });\n return added;\n}\n\n// ---------------------------------------------------------------------------\n// Crash report settings (typed helpers over the settings.crashReports JSON column)\n// ---------------------------------------------------------------------------\n\nexport type CrashReportChoice = \"unset\" | \"on\" | \"off\";\n\nexport interface CrashReportSettings {\n choice: CrashReportChoice;\n /** ms epoch when the user last made an explicit choice; null while \"unset\". */\n decidedAt: number | null;\n}\n\nconst CRASH_REPORT_DEFAULTS: CrashReportSettings = {\n choice: \"unset\",\n decidedAt: null,\n};\n\n/**\n * Parse the persisted crash-report settings. Tolerant of null, malformed\n * JSON, and unknown `choice` values — any of those return the default.\n */\nexport function parseCrashReportSettings(raw: string | null): CrashReportSettings {\n if (!raw) return { ...CRASH_REPORT_DEFAULTS };\n try {\n const parsed = JSON.parse(raw) as Partial<CrashReportSettings> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...CRASH_REPORT_DEFAULTS };\n const choice = parsed.choice;\n if (choice !== \"unset\" && choice !== \"on\" && choice !== \"off\") {\n return { ...CRASH_REPORT_DEFAULTS };\n }\n const decidedAt = typeof parsed.decidedAt === \"number\" ? parsed.decidedAt : null;\n return { choice, decidedAt };\n } catch {\n return { ...CRASH_REPORT_DEFAULTS };\n }\n}\n\n/** Read the crash-report settings. Returns defaults if the row is missing,\n * the column is null/empty, or the stored JSON is malformed / wrong-shape. */\nexport function getCrashReportSettings(): CrashReportSettings {\n const db = getDb();\n const [row] = db\n .select({ crashReports: settings.crashReports })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n return parseCrashReportSettings(row?.crashReports ?? null);\n}\n\n/** Persist the crash-report settings as JSON in the settings table. */\nexport function setCrashReportSettings(next: CrashReportSettings): CrashReportSettings {\n const db = getDb();\n const value = JSON.stringify(next);\n const set = { crashReports: value, updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n return next;\n}\n\n/** \"unset\" means we have not asked yet, and libi currently reports by default,\n * so it resolves to true. Only an explicit \"off\" disables. Delegates to\n * lib/sentry/enabled.ts#crashReportChoiceAllowsReporting so this predicate\n * can't drift from the one the Sentry hooks actually gate on. */\nexport function crashReportsAllowed(s: CrashReportSettings): boolean {\n return crashReportChoiceAllowsReporting(s.choice);\n}\n","// lib/analytics/settings-logic.ts\n// Pure, dependency-free transforms over the analytics settings object. The DB\n// wrappers in lib/db/settings.ts call these; keeping them pure makes them\n// trivially unit-testable without a database.\n\nexport interface AnalyticsSettings {\n /** Master opt-out toggle. Default true (analytics on by default). */\n enabled: boolean;\n /** Per-install UUID used as GA4 client_id + user_id. Generated server-side. */\n userId: string | null;\n /** Epoch ms when the user last opted out (null if never). */\n optOutAt: number | null;\n /** Whether the one-time first-run privacy notice has been shown. */\n firstRunNoticeShown: boolean;\n /** Activation milestones already fired (e.g. \"launch\", \"piece\", \"export\"). */\n milestones: string[];\n}\n\nexport const DEFAULT_ANALYTICS_SETTINGS: AnalyticsSettings = {\n enabled: true,\n userId: null,\n optOutAt: null,\n firstRunNoticeShown: false,\n milestones: [],\n};\n\nexport function parseAnalyticsSettings(raw: string | null | undefined): AnalyticsSettings {\n if (!raw) return { ...DEFAULT_ANALYTICS_SETTINGS };\n try {\n const p = JSON.parse(raw) as Partial<AnalyticsSettings> | null;\n if (!p || typeof p !== \"object\") return { ...DEFAULT_ANALYTICS_SETTINGS };\n return {\n enabled: typeof p.enabled === \"boolean\" ? p.enabled : true,\n userId: typeof p.userId === \"string\" ? p.userId : null,\n optOutAt: typeof p.optOutAt === \"number\" ? p.optOutAt : null,\n firstRunNoticeShown: p.firstRunNoticeShown === true,\n milestones: Array.isArray(p.milestones)\n ? p.milestones.filter((m): m is string => typeof m === \"string\")\n : [],\n };\n } catch {\n return { ...DEFAULT_ANALYTICS_SETTINGS };\n }\n}\n\nexport function mergeAnalyticsSettings(\n cur: AnalyticsSettings,\n partial: Partial<AnalyticsSettings>,\n): AnalyticsSettings {\n return { ...cur, ...partial };\n}\n\nexport function markMilestone(\n cur: AnalyticsSettings,\n name: string,\n): { settings: AnalyticsSettings; added: boolean } {\n if (cur.milestones.includes(name)) return { settings: cur, added: false };\n return { settings: { ...cur, milestones: [...cur.milestones, name] }, added: true };\n}\n\nexport function applyOptOut(cur: AnalyticsSettings, nowMs: number): AnalyticsSettings {\n return { ...cur, enabled: false, optOutAt: nowMs };\n}\n\nexport function applyOptIn(cur: AnalyticsSettings): AnalyticsSettings {\n return { ...cur, enabled: true, optOutAt: null };\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\n\n/** Default per-OS root for exported videos. Picked to match user\n * expectations: macOS ships a Movies folder; Windows + Linux ship Videos. */\nexport function defaultExportFolder(): string {\n const home = os.homedir();\n switch (process.platform) {\n case \"darwin\":\n return path.join(home, \"Movies\", \"libi\");\n case \"win32\":\n return path.join(home, \"Videos\", \"libi\");\n default:\n return path.join(home, \"Videos\", \"libi\");\n }\n}\n\n/** Ensure a folder exists. Throws on permission errors so the export\n * surfaces a clear error to the user rather than silently writing nowhere. */\nexport function ensureFolderExists(absPath: string): void {\n fs.mkdirSync(absPath, { recursive: true });\n}\n\n/** Returns true iff the folder exists and is writable by the current user.\n * Used by the export modal to pre-flight before submitting. */\nexport function isFolderWritable(absPath: string): boolean {\n try {\n fs.accessSync(absPath, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n","// lib/analytics/config.ts\n// GA4 analytics config — committed constants + enablement, mirroring\n// lib/sentry/config.ts. The packaged Electron build and `npx libi` CLI have no\n// .env at runtime, so the measurement ID is HARDCODED here.\n//\n// SECURITY: a hardcoded measurement ID is fine to commit — GA4 web streams\n// (`/g/collect`, see lib/analytics/collect-url.ts) accept events with NO\n// secret at all, the same way every public gtag site on the internet works.\n// Both transports (browser and server) send through that one web-stream path\n// now, so there is no server/client asymmetry left to guard and no secret to\n// lose. This file used to also hold a Measurement Protocol api_secret, whose\n// absence silently disabled every server-side event in every install; it is\n// gone along with the path that needed it.\n\n/** GA4 web data stream measurement ID (public). Env override for staging/self-host. */\nexport const MEASUREMENT_ID =\n process.env.NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID || \"G-7XJTYHWMFN\";\n\n/** Loose env shape — accepts process.env and plain object literals (for tests). */\ntype EnvLike = Record<string, string | undefined>;\n\n/** Pure enablement resolver (testable). Default OFF; opt-in flag set by launchers\n * for real installs; hard kill-switch wins. */\nexport function resolveAnalyticsEnabled(env: EnvLike): boolean {\n return env.LIBI_ANALYTICS_DISABLED !== \"1\" && env.NEXT_PUBLIC_LIBI_ANALYTICS === \"1\";\n}\n\n/** debug_mode → GA4 DebugView; true only in `next dev` (sandbox), never packaged. */\nexport function resolveAnalyticsDebug(env: EnvLike): boolean {\n return env.NODE_ENV !== \"production\";\n}\n\n/** Process-resolved values for runtime use. */\nexport const ANALYTICS_ENABLED = resolveAnalyticsEnabled(process.env);\nexport const ANALYTICS_DEBUG = resolveAnalyticsDebug(process.env);\n\n/** The user's hard kill-switch. Deliberately separate from ANALYTICS_ENABLED,\n * which also folds in the build-time opt-in: the build flag decides whether\n * we SEND, this decides whether we may RECORD ANYTHING AT ALL. */\nexport const ANALYTICS_KILL_SWITCH = process.env.LIBI_ANALYTICS_DISABLED === \"1\";\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/analytics/identity/route\",\n pathname: \"/api/analytics/identity\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/analytics/identity/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/analytics/identity/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { NextResponse } from \"next/server\";\nimport { getAnalyticsSettings, getOrCreateAnalyticsUserId } from \"@/lib/db/settings\";\nimport { ANALYTICS_ENABLED } from \"@/lib/analytics/config\";\n\nexport async function GET(): Promise<Response> {\n const userId = getOrCreateAnalyticsUserId();\n const enabled = ANALYTICS_ENABLED && getAnalyticsSettings().enabled;\n return NextResponse.json({ userId, enabled });\n}\n"],"names":["DEFAULT_ANALYTICS_SETTINGS","enabled","userId","optOutAt","firstRunNoticeShown","milestones","parseAnalyticsSettings","raw","p","JSON","parse","Array","isArray","filter","m","mergeAnalyticsSettings","cur","partial","markMilestone","name","includes","settings","added","applyOptOut","nowMs","applyOptIn","MEASUREMENT_ID","process","env","NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID","resolveAnalyticsEnabled","LIBI_ANALYTICS_DISABLED","NEXT_PUBLIC_LIBI_ANALYTICS","resolveAnalyticsDebug","NODE_ENV","ANALYTICS_ENABLED","ANALYTICS_DEBUG","ANALYTICS_KILL_SWITCH","GET","json"],"mappings":"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","ignoreList":[4]}}]
|
|
6
|
+
{"offset": {"line": 1, "column": 0}, "map": {"version":3,"sources":["../../../lib/db/settings.ts","../../../lib/analytics/settings-logic.ts","../../../lib/export/folder.ts","../../../lib/analytics/config.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../app/api/analytics/identity/route.ts"],"sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { getDb } from \"./client\";\nimport { settings } from \"./schema\";\nimport { serverLogger } from \"@/lib/logger\";\nimport {\n type AnalyticsSettings,\n parseAnalyticsSettings,\n mergeAnalyticsSettings,\n markMilestone,\n} from \"@/lib/analytics/settings-logic\";\nimport { crashReportChoiceAllowsReporting } from \"@/lib/sentry/enabled\";\n\nexport type { AnalyticsSettings };\n\nexport interface AppSettings {\n preferredAgent: string | null;\n panelChatSize: number;\n panelEditorSize: number;\n panelResourcesSize: number;\n panelChatVisible: boolean;\n panelResourcesVisible: boolean;\n agentApprovalModes: string | null;\n agentModelPreferences: string | null;\n onboardingPersona: string | null;\n personaSelectedAt: Date | null;\n agentEverConnected: boolean;\n /** Set once, server-side, the first time an agent connects. Null = the\n * first-run demo chip has never been armed. See lib/sessions/session-manager.ts#markAgentConnected. */\n onboardingDemoOfferedAt: Date | null;\n /** Set once the user dismisses OR takes the demo offer — final, and kept\n * independent of onboardingDemoOfferedAt so a dismissal is never confused\n * with \"never offered\". */\n onboardingDemoDismissedAt: Date | null;\n}\n\nconst DEFAULTS: AppSettings = {\n preferredAgent: null,\n panelChatSize: 40,\n panelEditorSize: 40,\n panelResourcesSize: 20,\n panelChatVisible: true,\n panelResourcesVisible: false,\n agentApprovalModes: null,\n agentModelPreferences: null,\n onboardingPersona: null,\n personaSelectedAt: null,\n agentEverConnected: false,\n onboardingDemoOfferedAt: null,\n onboardingDemoDismissedAt: null,\n};\n\n/**\n * Read the app settings (single row, id=1).\n * Auto-creates the row with defaults if it doesn't exist.\n */\nexport function getSettings(): AppSettings {\n const db = getDb();\n\n const [row] = db.select().from(settings).where(eq(settings.id, 1)).limit(1).all();\n\n if (!row) {\n db.insert(settings).values({ id: 1 }).run();\n return { ...DEFAULTS };\n }\n\n return {\n preferredAgent: row.preferredAgent ?? null,\n panelChatSize: row.panelChatSize,\n panelEditorSize: row.panelEditorSize,\n panelResourcesSize: row.panelResourcesSize,\n panelChatVisible: row.panelChatVisible,\n panelResourcesVisible: row.panelResourcesVisible,\n agentApprovalModes: row.agentApprovalModes ?? null,\n agentModelPreferences: row.agentModelPreferences ?? null,\n onboardingPersona: row.onboardingPersona ?? null,\n personaSelectedAt: row.personaSelectedAt ?? null,\n agentEverConnected: row.agentEverConnected,\n onboardingDemoOfferedAt: row.onboardingDemoOfferedAt ?? null,\n onboardingDemoDismissedAt: row.onboardingDemoDismissedAt ?? null,\n };\n}\n\n/**\n * Update specific settings fields. Only provided fields are updated.\n */\nexport function updateSettings(partial: Partial<AppSettings>): void {\n const db = getDb();\n\n // Build the SET clause from provided fields\n const set: Record<string, unknown> = { updatedAt: new Date() };\n\n if (partial.preferredAgent !== undefined) set.preferredAgent = partial.preferredAgent;\n if (partial.panelChatSize !== undefined) set.panelChatSize = partial.panelChatSize;\n if (partial.panelEditorSize !== undefined) set.panelEditorSize = partial.panelEditorSize;\n if (partial.panelResourcesSize !== undefined) set.panelResourcesSize = partial.panelResourcesSize;\n if (partial.panelChatVisible !== undefined) set.panelChatVisible = partial.panelChatVisible;\n if (partial.panelResourcesVisible !== undefined) set.panelResourcesVisible = partial.panelResourcesVisible;\n if (partial.agentApprovalModes !== undefined) set.agentApprovalModes = partial.agentApprovalModes;\n if (partial.agentModelPreferences !== undefined) set.agentModelPreferences = partial.agentModelPreferences;\n if (partial.onboardingPersona !== undefined) set.onboardingPersona = partial.onboardingPersona;\n if (partial.personaSelectedAt !== undefined) set.personaSelectedAt = partial.personaSelectedAt;\n if (partial.agentEverConnected !== undefined) set.agentEverConnected = partial.agentEverConnected;\n if (partial.onboardingDemoOfferedAt !== undefined) set.onboardingDemoOfferedAt = partial.onboardingDemoOfferedAt;\n if (partial.onboardingDemoDismissedAt !== undefined) set.onboardingDemoDismissedAt = partial.onboardingDemoDismissedAt;\n\n // Upsert: insert defaults if row doesn't exist, update if it does\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Notifications setting (typed helpers over the settings.notifications JSON column)\n// ---------------------------------------------------------------------------\n\nexport type NotificationsSetting = {\n /** Push a system notification when a background job completes while the window is backgrounded. */\n backgroundJobComplete: boolean;\n};\n\nconst NOTIFICATIONS_DEFAULTS: NotificationsSetting = {\n backgroundJobComplete: true,\n};\n\n/**\n * Read the notifications setting. Returns defaults if the row is missing,\n * the column is null/empty, or the stored JSON is malformed / wrong-shape.\n */\nexport function getNotificationsSetting(): NotificationsSetting {\n const db = getDb();\n const [row] = db\n .select({ notifications: settings.notifications })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.notifications;\n if (!raw) return { ...NOTIFICATIONS_DEFAULTS };\n\n try {\n const parsed = JSON.parse(raw) as Partial<NotificationsSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...NOTIFICATIONS_DEFAULTS };\n if (typeof parsed.backgroundJobComplete !== \"boolean\") {\n return { ...NOTIFICATIONS_DEFAULTS };\n }\n return { backgroundJobComplete: parsed.backgroundJobComplete };\n } catch {\n return { ...NOTIFICATIONS_DEFAULTS };\n }\n}\n\n/**\n * Persist the notifications setting as a JSON string in the settings table.\n * Upserts the single-row settings record if it doesn't already exist.\n */\nexport function setNotificationsSetting(s: NotificationsSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { notifications: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Codex connect setting (typed helpers over the settings.codex JSON column)\n// ---------------------------------------------------------------------------\n\nexport type CodexConnectSetting = {\n /** Whether the user opted in to keep their global ~/.codex MCP entries in sync with libi. */\n connected: boolean;\n /** Outcome of the last sync attempt. */\n lastSyncStatus: \"ok\" | \"error\" | \"idle\";\n};\n\nconst CODEX_CONNECT_DEFAULTS: CodexConnectSetting = {\n connected: false,\n lastSyncStatus: \"idle\",\n};\n\n/**\n * Read the codex connect setting. Returns defaults if the row is missing,\n * the column is null/empty, the stored JSON is malformed / wrong-shape, or\n * the DB read itself fails (e.g. a pending migration) — this is a defensive\n * read that must never throw.\n */\nexport function getCodexConnectSetting(): CodexConnectSetting {\n try {\n const db = getDb();\n const [row] = db\n .select({ codex: settings.codex })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.codex;\n if (!raw) return { ...CODEX_CONNECT_DEFAULTS };\n\n const parsed = JSON.parse(raw) as Partial<CodexConnectSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...CODEX_CONNECT_DEFAULTS };\n if (typeof parsed.connected !== \"boolean\") return { ...CODEX_CONNECT_DEFAULTS };\n const status = parsed.lastSyncStatus;\n if (status !== \"ok\" && status !== \"error\" && status !== \"idle\") {\n return { ...CODEX_CONNECT_DEFAULTS };\n }\n return { connected: parsed.connected, lastSyncStatus: status };\n } catch (err) {\n serverLogger.warn(\n { err, tag: \"codex-connect\", op: \"read_degraded\" },\n \"getCodexConnectSetting: read failed, returning defaults\",\n );\n return { ...CODEX_CONNECT_DEFAULTS };\n }\n}\n\n/**\n * Persist the codex connect setting as a JSON string in the settings table.\n * Upserts the single-row settings record if it doesn't already exist.\n */\nexport function setCodexConnectSetting(s: CodexConnectSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { codex: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Export defaults setting (folder + default format + default quality)\n// ---------------------------------------------------------------------------\n\nimport { defaultExportFolder } from \"@/lib/export/folder\";\n\nexport type ExportDefaultsSetting = {\n /** Absolute path. Null = use OS-aware default (~/Movies/libi on darwin, ~/Videos/libi elsewhere). */\n folder: string | null;\n format: \"mp4\" | \"webm\";\n quality: \"source\" | \"1080p\" | \"1440p\" | \"4k\";\n};\n\nconst EXPORT_DEFAULTS_FALLBACK: ExportDefaultsSetting = {\n folder: null,\n format: \"mp4\",\n quality: \"source\",\n};\n\n/** Read the export defaults. Falls back to OS-aware folder + MP4/Source if\n * the row is missing, the column is empty, or the JSON is malformed. */\nexport function getExportDefaults(): ExportDefaultsSetting {\n const db = getDb();\n const [row] = db\n .select({ exportDefaults: settings.exportDefaults })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.exportDefaults;\n if (!raw) return { ...EXPORT_DEFAULTS_FALLBACK };\n\n try {\n const parsed = JSON.parse(raw) as Partial<ExportDefaultsSetting> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...EXPORT_DEFAULTS_FALLBACK };\n return {\n folder: typeof parsed.folder === \"string\" && parsed.folder ? parsed.folder : null,\n format: parsed.format === \"webm\" ? \"webm\" : \"mp4\",\n quality:\n parsed.quality === \"1080p\" || parsed.quality === \"1440p\" || parsed.quality === \"4k\"\n ? parsed.quality\n : \"source\",\n };\n } catch {\n return { ...EXPORT_DEFAULTS_FALLBACK };\n }\n}\n\n/** Resolve the effective export folder — settings if set, otherwise OS default. */\nexport function resolveExportFolder(): string {\n const defaults = getExportDefaults();\n return defaults.folder ?? defaultExportFolder();\n}\n\n/** Persist the export defaults as JSON in the settings table. */\nexport function setExportDefaults(s: ExportDefaultsSetting): void {\n const db = getDb();\n const value = JSON.stringify(s);\n const set = { exportDefaults: value, updatedAt: new Date() };\n\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Bundled-skill digest cache (per-app-version, see mcp/skills/digest.ts)\n// ---------------------------------------------------------------------------\n\nimport type { SkillDigestCache } from \"@/mcp/skills/digest\";\n\n/** Read the cached bundled-skill digests. Null when missing, malformed,\n * or wrong-shape — callers treat null as \"recompute\". */\nexport function getSkillDigestCacheSetting(): SkillDigestCache | null {\n const db = getDb();\n const [row] = db\n .select({ skillDigestCache: settings.skillDigestCache })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n\n const raw = row?.skillDigestCache;\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<SkillDigestCache> | null;\n if (!parsed || typeof parsed !== \"object\") return null;\n if (typeof parsed.version !== \"string\" || !parsed.version) return null;\n if (!parsed.digests || typeof parsed.digests !== \"object\") return null;\n return { version: parsed.version, digests: parsed.digests as Record<string, string> };\n } catch {\n return null;\n }\n}\n\n/** Persist the bundled-skill digest cache as JSON in the settings table. */\nexport function setSkillDigestCacheSetting(c: SkillDigestCache): void {\n const db = getDb();\n const set = { skillDigestCache: JSON.stringify(c), updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n}\n\n// ---------------------------------------------------------------------------\n// Analytics settings (typed helpers over the settings.analytics JSON column)\n// ---------------------------------------------------------------------------\n\nexport function getAnalyticsSettings(): AnalyticsSettings {\n const db = getDb();\n const [row] = db\n .select({ analytics: settings.analytics })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n return parseAnalyticsSettings(row?.analytics ?? null);\n}\n\nexport function setAnalyticsSettings(partial: Partial<AnalyticsSettings>): AnalyticsSettings {\n const db = getDb();\n const next = mergeAnalyticsSettings(getAnalyticsSettings(), partial);\n const set = { analytics: JSON.stringify(next), updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n return next;\n}\n\n/** Return the per-install analytics UUID, generating + persisting it on first call. */\nexport function getOrCreateAnalyticsUserId(): string {\n const cur = getAnalyticsSettings();\n if (cur.userId) return cur.userId;\n const userId = crypto.randomUUID();\n setAnalyticsSettings({ userId });\n return userId;\n}\n\n/** Mark an activation milestone; returns true only the first time. */\nexport function markAnalyticsMilestoneOnce(name: string): boolean {\n const { settings: next, added } = markMilestone(getAnalyticsSettings(), name);\n if (added) setAnalyticsSettings({ milestones: next.milestones });\n return added;\n}\n\n// ---------------------------------------------------------------------------\n// Crash report settings (typed helpers over the settings.crashReports JSON column)\n// ---------------------------------------------------------------------------\n\nexport type CrashReportChoice = \"unset\" | \"on\" | \"off\";\n\nexport interface CrashReportSettings {\n choice: CrashReportChoice;\n /** ms epoch when the user last made an explicit choice; null while \"unset\". */\n decidedAt: number | null;\n}\n\nconst CRASH_REPORT_DEFAULTS: CrashReportSettings = {\n choice: \"unset\",\n decidedAt: null,\n};\n\n/**\n * Parse the persisted crash-report settings. Tolerant of null, malformed\n * JSON, and unknown `choice` values — any of those return the default.\n */\nexport function parseCrashReportSettings(raw: string | null): CrashReportSettings {\n if (!raw) return { ...CRASH_REPORT_DEFAULTS };\n try {\n const parsed = JSON.parse(raw) as Partial<CrashReportSettings> | null;\n if (!parsed || typeof parsed !== \"object\") return { ...CRASH_REPORT_DEFAULTS };\n const choice = parsed.choice;\n if (choice !== \"unset\" && choice !== \"on\" && choice !== \"off\") {\n return { ...CRASH_REPORT_DEFAULTS };\n }\n const decidedAt = typeof parsed.decidedAt === \"number\" ? parsed.decidedAt : null;\n return { choice, decidedAt };\n } catch {\n return { ...CRASH_REPORT_DEFAULTS };\n }\n}\n\n/** Read the crash-report settings. Returns defaults if the row is missing,\n * the column is null/empty, or the stored JSON is malformed / wrong-shape. */\nexport function getCrashReportSettings(): CrashReportSettings {\n const db = getDb();\n const [row] = db\n .select({ crashReports: settings.crashReports })\n .from(settings)\n .where(eq(settings.id, 1))\n .limit(1)\n .all();\n return parseCrashReportSettings(row?.crashReports ?? null);\n}\n\n/** Persist the crash-report settings as JSON in the settings table. */\nexport function setCrashReportSettings(next: CrashReportSettings): CrashReportSettings {\n const db = getDb();\n const value = JSON.stringify(next);\n const set = { crashReports: value, updatedAt: new Date() };\n db.insert(settings)\n .values({ id: 1, ...set })\n .onConflictDoUpdate({ target: settings.id, set })\n .run();\n return next;\n}\n\n/** \"unset\" means we have not asked yet, and libi currently reports by default,\n * so it resolves to true. Only an explicit \"off\" disables. Delegates to\n * lib/sentry/enabled.ts#crashReportChoiceAllowsReporting so this predicate\n * can't drift from the one the Sentry hooks actually gate on. */\nexport function crashReportsAllowed(s: CrashReportSettings): boolean {\n return crashReportChoiceAllowsReporting(s.choice);\n}\n","// lib/analytics/settings-logic.ts\n// Pure, dependency-free transforms over the analytics settings object. The DB\n// wrappers in lib/db/settings.ts call these; keeping them pure makes them\n// trivially unit-testable without a database.\n\nexport interface AnalyticsSettings {\n /** Master opt-out toggle. Default true (analytics on by default). */\n enabled: boolean;\n /** Per-install UUID used as GA4 client_id + user_id. Generated server-side. */\n userId: string | null;\n /** Epoch ms when the user last opted out (null if never). */\n optOutAt: number | null;\n /** Whether the one-time first-run privacy notice has been shown. */\n firstRunNoticeShown: boolean;\n /** Activation milestones already fired (e.g. \"launch\", \"piece\", \"export\"). */\n milestones: string[];\n}\n\nexport const DEFAULT_ANALYTICS_SETTINGS: AnalyticsSettings = {\n enabled: true,\n userId: null,\n optOutAt: null,\n firstRunNoticeShown: false,\n milestones: [],\n};\n\nexport function parseAnalyticsSettings(raw: string | null | undefined): AnalyticsSettings {\n if (!raw) return { ...DEFAULT_ANALYTICS_SETTINGS };\n try {\n const p = JSON.parse(raw) as Partial<AnalyticsSettings> | null;\n if (!p || typeof p !== \"object\") return { ...DEFAULT_ANALYTICS_SETTINGS };\n return {\n enabled: typeof p.enabled === \"boolean\" ? p.enabled : true,\n userId: typeof p.userId === \"string\" ? p.userId : null,\n optOutAt: typeof p.optOutAt === \"number\" ? p.optOutAt : null,\n firstRunNoticeShown: p.firstRunNoticeShown === true,\n milestones: Array.isArray(p.milestones)\n ? p.milestones.filter((m): m is string => typeof m === \"string\")\n : [],\n };\n } catch {\n return { ...DEFAULT_ANALYTICS_SETTINGS };\n }\n}\n\nexport function mergeAnalyticsSettings(\n cur: AnalyticsSettings,\n partial: Partial<AnalyticsSettings>,\n): AnalyticsSettings {\n return { ...cur, ...partial };\n}\n\nexport function markMilestone(\n cur: AnalyticsSettings,\n name: string,\n): { settings: AnalyticsSettings; added: boolean } {\n if (cur.milestones.includes(name)) return { settings: cur, added: false };\n return { settings: { ...cur, milestones: [...cur.milestones, name] }, added: true };\n}\n\nexport function applyOptOut(cur: AnalyticsSettings, nowMs: number): AnalyticsSettings {\n return { ...cur, enabled: false, optOutAt: nowMs };\n}\n\nexport function applyOptIn(cur: AnalyticsSettings): AnalyticsSettings {\n return { ...cur, enabled: true, optOutAt: null };\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\n\n/** Default per-OS root for exported videos. Picked to match user\n * expectations: macOS ships a Movies folder; Windows + Linux ship Videos. */\nexport function defaultExportFolder(): string {\n const home = os.homedir();\n switch (process.platform) {\n case \"darwin\":\n return path.join(home, \"Movies\", \"libi\");\n case \"win32\":\n return path.join(home, \"Videos\", \"libi\");\n default:\n return path.join(home, \"Videos\", \"libi\");\n }\n}\n\n/** Ensure a folder exists. Throws on permission errors so the export\n * surfaces a clear error to the user rather than silently writing nowhere. */\nexport function ensureFolderExists(absPath: string): void {\n fs.mkdirSync(absPath, { recursive: true });\n}\n\n/** Returns true iff the folder exists and is writable by the current user.\n * Used by the export modal to pre-flight before submitting. */\nexport function isFolderWritable(absPath: string): boolean {\n try {\n fs.accessSync(absPath, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n","// lib/analytics/config.ts\n// GA4 analytics config — committed constants + enablement, mirroring\n// lib/sentry/config.ts. The packaged Electron build and `npx libi` CLI have no\n// .env at runtime, so the measurement ID is HARDCODED here.\n//\n// SECURITY: a hardcoded measurement ID is fine to commit — GA4 web streams\n// (`/g/collect`, see lib/analytics/collect-url.ts) accept events with NO\n// secret at all, the same way every public gtag site on the internet works.\n// Both transports (browser and server) send through that one web-stream path\n// now, so there is no server/client asymmetry left to guard and no secret to\n// lose. This file used to also hold a Measurement Protocol api_secret, whose\n// absence silently disabled every server-side event in every install; it is\n// gone along with the path that needed it.\n\n/** GA4 web data stream measurement ID (public). Env override for staging/self-host. */\nexport const MEASUREMENT_ID =\n process.env.NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID || \"G-7XJTYHWMFN\";\n\n/** Loose env shape — accepts process.env and plain object literals (for tests). */\ntype EnvLike = Record<string, string | undefined>;\n\n/** Pure enablement resolver (testable). Default OFF; opt-in flag set by launchers\n * for real installs; hard kill-switch wins. */\nexport function resolveAnalyticsEnabled(env: EnvLike): boolean {\n return env.LIBI_ANALYTICS_DISABLED !== \"1\" && env.NEXT_PUBLIC_LIBI_ANALYTICS === \"1\";\n}\n\n/** debug_mode → GA4 DebugView.\n *\n * On by default outside production, so a dev clone's events land in DebugView\n * instead of the real reports. `LIBI_ANALYTICS_DEBUG=1` turns it on explicitly,\n * and that opt-in is the ONLY way to inspect a RELEASED build: every artifact we\n * publish is built with NODE_ENV=production, so without it a shipped install can\n * never appear in DebugView — which is where a hit's full parameter payload is\n * visible, and therefore the only place \"the funnel sends the right enums\" can\n * actually be checked. Realtime shows that events arrived; it does not show what\n * they carried. Release-day QA sets this on the QA instance and nowhere else.\n *\n * The cost of leaving it on is real, which is why it stays opt-in: GA4 excludes\n * debug_mode hits from standard reports, so a user who set it would go\n * uncounted. */\nexport function resolveAnalyticsDebug(env: EnvLike): boolean {\n return env.LIBI_ANALYTICS_DEBUG === \"1\" || env.NODE_ENV !== \"production\";\n}\n\n/** Process-resolved values for runtime use. */\nexport const ANALYTICS_ENABLED = resolveAnalyticsEnabled(process.env);\nexport const ANALYTICS_DEBUG = resolveAnalyticsDebug(process.env);\n\n/** The user's hard kill-switch. Deliberately separate from ANALYTICS_ENABLED,\n * which also folds in the build-time opt-in: the build flag decides whether\n * we SEND, this decides whether we may RECORD ANYTHING AT ALL. */\nexport const ANALYTICS_KILL_SWITCH = process.env.LIBI_ANALYTICS_DISABLED === \"1\";\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/analytics/identity/route\",\n pathname: \"/api/analytics/identity\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/analytics/identity/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/analytics/identity/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { NextResponse } from \"next/server\";\nimport { getAnalyticsSettings, getOrCreateAnalyticsUserId } from \"@/lib/db/settings\";\nimport { ANALYTICS_ENABLED } from \"@/lib/analytics/config\";\n\nexport async function GET(): Promise<Response> {\n const userId = getOrCreateAnalyticsUserId();\n const enabled = ANALYTICS_ENABLED && getAnalyticsSettings().enabled;\n return NextResponse.json({ userId, enabled });\n}\n"],"names":["DEFAULT_ANALYTICS_SETTINGS","enabled","userId","optOutAt","firstRunNoticeShown","milestones","parseAnalyticsSettings","raw","p","JSON","parse","Array","isArray","filter","m","mergeAnalyticsSettings","cur","partial","markMilestone","name","includes","settings","added","applyOptOut","nowMs","applyOptIn","MEASUREMENT_ID","process","env","NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID","resolveAnalyticsEnabled","LIBI_ANALYTICS_DISABLED","NEXT_PUBLIC_LIBI_ANALYTICS","resolveAnalyticsDebug","LIBI_ANALYTICS_DEBUG","NODE_ENV","ANALYTICS_ENABLED","ANALYTICS_DEBUG","ANALYTICS_KILL_SWITCH","GET","json"],"mappings":"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","ignoreList":[4]}}]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
;!function(){try { var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&((e._debugIds|| (e._debugIds={}))[n]="
|
|
2
|
-
module.exports=[324725,(e,t,n)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},883978,824099,239829,e=>{"use strict";var t=e.i(875225),n=e.i(190793);e.i(945122);var i=e.i(478181),r=e.i(640911);let s={enabled:!0,userId:null,optOutAt:null,firstRunNoticeShown:!1,milestones:[]};function o(e){if(!e)return{...s};try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return{...s};return{enabled:"boolean"!=typeof t.enabled||t.enabled,userId:"string"==typeof t.userId?t.userId:null,optOutAt:"number"==typeof t.optOutAt?t.optOutAt:null,firstRunNoticeShown:!0===t.firstRunNoticeShown,milestones:Array.isArray(t.milestones)?t.milestones.filter(e=>"string"==typeof e):[]}}catch{return{...s}}}function a(e,t){return{...e,...t}}function l(e,t){return e.milestones.includes(t)?{settings:e,added:!1}:{settings:{...e,milestones:[...e.milestones,t]},added:!0}}e.s(["applyOptIn",0,function(e){return{...e,enabled:!0,optOutAt:null}},"applyOptOut",0,function(e,t){return{...e,enabled:!1,optOutAt:t}},"markMilestone",0,l,"mergeAnalyticsSettings",0,a,"parseAnalyticsSettings",0,o],824099);var d=e.i(660526),u=e.i(750227),c=e.i(902157);function g(){let e=d.default.homedir();return"darwin"===process.platform?u.default.join(e,"Movies","libi"):u.default.join(e,"Videos","libi")}e.s(["defaultExportFolder",0,g,"ensureFolderExists",0,function(e){c.default.mkdirSync(e,{recursive:!0})},"isFolderWritable",0,function(e){try{return c.default.accessSync(e,c.default.constants.W_OK),!0}catch{return!1}}],239829);let p={preferredAgent:null,panelChatSize:40,panelEditorSize:40,panelResourcesSize:20,panelChatVisible:!0,panelResourcesVisible:!1,agentApprovalModes:null,agentModelPreferences:null,onboardingPersona:null,personaSelectedAt:null,agentEverConnected:!1,onboardingDemoOfferedAt:null,onboardingDemoDismissedAt:null},f={backgroundJobComplete:!0},m={connected:!1,lastSyncStatus:"idle"},_={folder:null,format:"mp4",quality:"source"};function b(){let[e]=(0,n.getDb)().select({exportDefaults:i.settings.exportDefaults}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.exportDefaults;if(!r)return{..._};try{let e=JSON.parse(r);if(!e||"object"!=typeof e)return{..._};return{folder:"string"==typeof e.folder&&e.folder?e.folder:null,format:"webm"===e.format?"webm":"mp4",quality:"1080p"===e.quality||"1440p"===e.quality||"4k"===e.quality?e.quality:"source"}}catch{return{..._}}}function S(){let[e]=(0,n.getDb)().select({analytics:i.settings.analytics}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return o(e?.analytics??null)}function y(e){let t=(0,n.getDb)(),r=a(S(),e),s={analytics:JSON.stringify(r),updatedAt:new Date};return t.insert(i.settings).values({id:1,...s}).onConflictDoUpdate({target:i.settings.id,set:s}).run(),r}let A={choice:"unset",decidedAt:null};e.s(["getAnalyticsSettings",0,S,"getCodexConnectSetting",0,function(){try{let[e]=(0,n.getDb)().select({codex:i.settings.codex}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.codex;if(!r)return{...m};let s=JSON.parse(r);if(!s||"object"!=typeof s||"boolean"!=typeof s.connected)return{...m};let o=s.lastSyncStatus;if("ok"!==o&&"error"!==o&&"idle"!==o)return{...m};return{connected:s.connected,lastSyncStatus:o}}catch(e){return r.serverLogger.warn({err:e,tag:"codex-connect",op:"read_degraded"},"getCodexConnectSetting: read failed, returning defaults"),{...m}}},"getCrashReportSettings",0,function(){let[e]=(0,n.getDb)().select({crashReports:i.settings.crashReports}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return function(e){if(!e)return{...A};try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return{...A};let n=t.choice;if("unset"!==n&&"on"!==n&&"off"!==n)return{...A};let i="number"==typeof t.decidedAt?t.decidedAt:null;return{choice:n,decidedAt:i}}catch{return{...A}}}(e?.crashReports??null)},"getExportDefaults",0,b,"getNotificationsSetting",0,function(){let[e]=(0,n.getDb)().select({notifications:i.settings.notifications}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.notifications;if(!r)return{...f};try{let e=JSON.parse(r);if(!e||"object"!=typeof e||"boolean"!=typeof e.backgroundJobComplete)return{...f};return{backgroundJobComplete:e.backgroundJobComplete}}catch{return{...f}}},"getOrCreateAnalyticsUserId",0,function(){let e=S();if(e.userId)return e.userId;let t=crypto.randomUUID();return y({userId:t}),t},"getSettings",0,function(){let e=(0,n.getDb)(),[r]=e.select().from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return r?{preferredAgent:r.preferredAgent??null,panelChatSize:r.panelChatSize,panelEditorSize:r.panelEditorSize,panelResourcesSize:r.panelResourcesSize,panelChatVisible:r.panelChatVisible,panelResourcesVisible:r.panelResourcesVisible,agentApprovalModes:r.agentApprovalModes??null,agentModelPreferences:r.agentModelPreferences??null,onboardingPersona:r.onboardingPersona??null,personaSelectedAt:r.personaSelectedAt??null,agentEverConnected:r.agentEverConnected,onboardingDemoOfferedAt:r.onboardingDemoOfferedAt??null,onboardingDemoDismissedAt:r.onboardingDemoDismissedAt??null}:(e.insert(i.settings).values({id:1}).run(),{...p})},"getSkillDigestCacheSetting",0,function(){let[e]=(0,n.getDb)().select({skillDigestCache:i.settings.skillDigestCache}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.skillDigestCache;if(!r)return null;try{let e=JSON.parse(r);if(!e||"object"!=typeof e||"string"!=typeof e.version||!e.version||!e.digests||"object"!=typeof e.digests)return null;return{version:e.version,digests:e.digests}}catch{return null}},"markAnalyticsMilestoneOnce",0,function(e){let{settings:t,added:n}=l(S(),e);return n&&y({milestones:t.milestones}),n},"resolveExportFolder",0,function(){return b().folder??g()},"setAnalyticsSettings",0,y,"setCodexConnectSetting",0,function(e){let t=(0,n.getDb)(),r={codex:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setCrashReportSettings",0,function(e){let t=(0,n.getDb)(),r={crashReports:JSON.stringify(e),updatedAt:new Date};return t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run(),e},"setExportDefaults",0,function(e){let t=(0,n.getDb)(),r={exportDefaults:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setNotificationsSetting",0,function(e){let t=(0,n.getDb)(),r={notifications:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setSkillDigestCacheSetting",0,function(e){let t=(0,n.getDb)(),r={skillDigestCache:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"updateSettings",0,function(e){let t=(0,n.getDb)(),r={updatedAt:new Date};void 0!==e.preferredAgent&&(r.preferredAgent=e.preferredAgent),void 0!==e.panelChatSize&&(r.panelChatSize=e.panelChatSize),void 0!==e.panelEditorSize&&(r.panelEditorSize=e.panelEditorSize),void 0!==e.panelResourcesSize&&(r.panelResourcesSize=e.panelResourcesSize),void 0!==e.panelChatVisible&&(r.panelChatVisible=e.panelChatVisible),void 0!==e.panelResourcesVisible&&(r.panelResourcesVisible=e.panelResourcesVisible),void 0!==e.agentApprovalModes&&(r.agentApprovalModes=e.agentApprovalModes),void 0!==e.agentModelPreferences&&(r.agentModelPreferences=e.agentModelPreferences),void 0!==e.onboardingPersona&&(r.onboardingPersona=e.onboardingPersona),void 0!==e.personaSelectedAt&&(r.personaSelectedAt=e.personaSelectedAt),void 0!==e.agentEverConnected&&(r.agentEverConnected=e.agentEverConnected),void 0!==e.onboardingDemoOfferedAt&&(r.onboardingDemoOfferedAt=e.onboardingDemoOfferedAt),void 0!==e.onboardingDemoDismissedAt&&(r.onboardingDemoDismissedAt=e.onboardingDemoDismissedAt),t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()}],883978)},692855,e=>{"use strict";e.s(["isTestMode",0,function(){let e=process.env.LIBI_TEST_MODE;return"1"===e||"true"===e}])},38657,e=>{"use strict";var t;process.env.NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID;let n="1"!==(t=process.env).LIBI_ANALYTICS_DISABLED&&"1"===t.NEXT_PUBLIC_LIBI_ANALYTICS;process.env.NODE_ENV;let i="1"===process.env.LIBI_ANALYTICS_DISABLED;e.s(["ANALYTICS_ENABLED",0,n,"ANALYTICS_KILL_SWITCH",0,i])},260338,e=>{"use strict";e.i(156325),e.i(844988);var t=e.i(518899);e.s(["count",0,function(e){return t.sql`count(${e||t.sql.raw("*")})`.mapWith(Number)}])},884724,e=>{"use strict";let t=new Set(["first_launch","first_export","persona_selected","agent_connected","onboarding_piece_built","persona_prompt_shown","agent_connect_shown","agent_setup_started","agent_setup_command_copied","agent_install_completed","agent_install_failed","agent_sign_in_opened","first_message_sent","piece_created","export_started","export_completed","agent_message_sent","file_uploaded","terminal_session_started","mcp_server_added","codex_connect_toggled","runtime_update_installed","version_restore","overlay_added","overlay_edited","preset_applied","effect_applied","effect_previewed","text_3d_used","overlay_3d_used","chat_slash_command","context_meter_opened","page_view","page_engagement","tool_used","pro_waitlist_joined","announcement_shown","analytics_opt_out","analytics_opt_in"]);e.s(["isEventName",0,function(e){return t.has(e)},"sanitizeParams",0,function(e){if(!e)return{};let t={};for(let[n,i]of Object.entries(e))null!=i&&("string"==typeof i?t[n]=i.slice(0,100):"number"==typeof i||"boolean"==typeof i?t[n]=i:t[n]=String(i).slice(0,100));return t},"toAgentEventId",0,function(e){return"claude-code"===e||"codex"===e?e:void 0}])},991858,e=>{"use strict";var t=e.i(349129),n=e.i(260338),i=e.i(875225),r=e.i(190793),s=e.i(478181),o=e.i(884724),a=e.i(883978),l=e.i(38657),d=e.i(692855);e.i(640911),e.s(["trackServerEvent",0,function(e,u){try{!function(e,u){try{if((0,d.isTestMode)()||l.ANALYTICS_KILL_SWITCH||!(0,a.getAnalyticsSettings)().enabled)return;let c=(0,o.sanitizeParams)(u),g=(0,r.getDb)();g.insert(s.analyticsQueue).values({id:crypto.randomUUID(),name:e,paramsJson:JSON.stringify(c),nextAttemptAt:new Date(0)}).run();let[{n:p}]=g.select({n:(0,n.count)()}).from(s.analyticsQueue).all();if(p>500){let e=g.select({id:s.analyticsQueue.id}).from(s.analyticsQueue).orderBy((0,t.asc)(s.analyticsQueue.createdAt)).limit(p-500).all().map(e=>e.id);g.delete(s.analyticsQueue).where((0,i.inArray)(s.analyticsQueue.id,e)).run()}}catch{}}(e,u)}catch{}}],991858)}];
|
|
1
|
+
;!function(){try { var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&((e._debugIds|| (e._debugIds={}))[n]="96ca584e-6e31-dcad-1d35-a2fbc20221f1")}catch(e){}}();
|
|
2
|
+
module.exports=[324725,(e,t,n)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},883978,824099,239829,e=>{"use strict";var t=e.i(875225),n=e.i(190793);e.i(945122);var i=e.i(478181),r=e.i(640911);let s={enabled:!0,userId:null,optOutAt:null,firstRunNoticeShown:!1,milestones:[]};function o(e){if(!e)return{...s};try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return{...s};return{enabled:"boolean"!=typeof t.enabled||t.enabled,userId:"string"==typeof t.userId?t.userId:null,optOutAt:"number"==typeof t.optOutAt?t.optOutAt:null,firstRunNoticeShown:!0===t.firstRunNoticeShown,milestones:Array.isArray(t.milestones)?t.milestones.filter(e=>"string"==typeof e):[]}}catch{return{...s}}}function a(e,t){return{...e,...t}}function l(e,t){return e.milestones.includes(t)?{settings:e,added:!1}:{settings:{...e,milestones:[...e.milestones,t]},added:!0}}e.s(["applyOptIn",0,function(e){return{...e,enabled:!0,optOutAt:null}},"applyOptOut",0,function(e,t){return{...e,enabled:!1,optOutAt:t}},"markMilestone",0,l,"mergeAnalyticsSettings",0,a,"parseAnalyticsSettings",0,o],824099);var d=e.i(660526),u=e.i(750227),c=e.i(902157);function g(){let e=d.default.homedir();return"darwin"===process.platform?u.default.join(e,"Movies","libi"):u.default.join(e,"Videos","libi")}e.s(["defaultExportFolder",0,g,"ensureFolderExists",0,function(e){c.default.mkdirSync(e,{recursive:!0})},"isFolderWritable",0,function(e){try{return c.default.accessSync(e,c.default.constants.W_OK),!0}catch{return!1}}],239829);let p={preferredAgent:null,panelChatSize:40,panelEditorSize:40,panelResourcesSize:20,panelChatVisible:!0,panelResourcesVisible:!1,agentApprovalModes:null,agentModelPreferences:null,onboardingPersona:null,personaSelectedAt:null,agentEverConnected:!1,onboardingDemoOfferedAt:null,onboardingDemoDismissedAt:null},f={backgroundJobComplete:!0},m={connected:!1,lastSyncStatus:"idle"},_={folder:null,format:"mp4",quality:"source"};function b(){let[e]=(0,n.getDb)().select({exportDefaults:i.settings.exportDefaults}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.exportDefaults;if(!r)return{..._};try{let e=JSON.parse(r);if(!e||"object"!=typeof e)return{..._};return{folder:"string"==typeof e.folder&&e.folder?e.folder:null,format:"webm"===e.format?"webm":"mp4",quality:"1080p"===e.quality||"1440p"===e.quality||"4k"===e.quality?e.quality:"source"}}catch{return{..._}}}function S(){let[e]=(0,n.getDb)().select({analytics:i.settings.analytics}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return o(e?.analytics??null)}function y(e){let t=(0,n.getDb)(),r=a(S(),e),s={analytics:JSON.stringify(r),updatedAt:new Date};return t.insert(i.settings).values({id:1,...s}).onConflictDoUpdate({target:i.settings.id,set:s}).run(),r}let A={choice:"unset",decidedAt:null};e.s(["getAnalyticsSettings",0,S,"getCodexConnectSetting",0,function(){try{let[e]=(0,n.getDb)().select({codex:i.settings.codex}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.codex;if(!r)return{...m};let s=JSON.parse(r);if(!s||"object"!=typeof s||"boolean"!=typeof s.connected)return{...m};let o=s.lastSyncStatus;if("ok"!==o&&"error"!==o&&"idle"!==o)return{...m};return{connected:s.connected,lastSyncStatus:o}}catch(e){return r.serverLogger.warn({err:e,tag:"codex-connect",op:"read_degraded"},"getCodexConnectSetting: read failed, returning defaults"),{...m}}},"getCrashReportSettings",0,function(){let[e]=(0,n.getDb)().select({crashReports:i.settings.crashReports}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return function(e){if(!e)return{...A};try{let t=JSON.parse(e);if(!t||"object"!=typeof t)return{...A};let n=t.choice;if("unset"!==n&&"on"!==n&&"off"!==n)return{...A};let i="number"==typeof t.decidedAt?t.decidedAt:null;return{choice:n,decidedAt:i}}catch{return{...A}}}(e?.crashReports??null)},"getExportDefaults",0,b,"getNotificationsSetting",0,function(){let[e]=(0,n.getDb)().select({notifications:i.settings.notifications}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.notifications;if(!r)return{...f};try{let e=JSON.parse(r);if(!e||"object"!=typeof e||"boolean"!=typeof e.backgroundJobComplete)return{...f};return{backgroundJobComplete:e.backgroundJobComplete}}catch{return{...f}}},"getOrCreateAnalyticsUserId",0,function(){let e=S();if(e.userId)return e.userId;let t=crypto.randomUUID();return y({userId:t}),t},"getSettings",0,function(){let e=(0,n.getDb)(),[r]=e.select().from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all();return r?{preferredAgent:r.preferredAgent??null,panelChatSize:r.panelChatSize,panelEditorSize:r.panelEditorSize,panelResourcesSize:r.panelResourcesSize,panelChatVisible:r.panelChatVisible,panelResourcesVisible:r.panelResourcesVisible,agentApprovalModes:r.agentApprovalModes??null,agentModelPreferences:r.agentModelPreferences??null,onboardingPersona:r.onboardingPersona??null,personaSelectedAt:r.personaSelectedAt??null,agentEverConnected:r.agentEverConnected,onboardingDemoOfferedAt:r.onboardingDemoOfferedAt??null,onboardingDemoDismissedAt:r.onboardingDemoDismissedAt??null}:(e.insert(i.settings).values({id:1}).run(),{...p})},"getSkillDigestCacheSetting",0,function(){let[e]=(0,n.getDb)().select({skillDigestCache:i.settings.skillDigestCache}).from(i.settings).where((0,t.eq)(i.settings.id,1)).limit(1).all(),r=e?.skillDigestCache;if(!r)return null;try{let e=JSON.parse(r);if(!e||"object"!=typeof e||"string"!=typeof e.version||!e.version||!e.digests||"object"!=typeof e.digests)return null;return{version:e.version,digests:e.digests}}catch{return null}},"markAnalyticsMilestoneOnce",0,function(e){let{settings:t,added:n}=l(S(),e);return n&&y({milestones:t.milestones}),n},"resolveExportFolder",0,function(){return b().folder??g()},"setAnalyticsSettings",0,y,"setCodexConnectSetting",0,function(e){let t=(0,n.getDb)(),r={codex:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setCrashReportSettings",0,function(e){let t=(0,n.getDb)(),r={crashReports:JSON.stringify(e),updatedAt:new Date};return t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run(),e},"setExportDefaults",0,function(e){let t=(0,n.getDb)(),r={exportDefaults:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setNotificationsSetting",0,function(e){let t=(0,n.getDb)(),r={notifications:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"setSkillDigestCacheSetting",0,function(e){let t=(0,n.getDb)(),r={skillDigestCache:JSON.stringify(e),updatedAt:new Date};t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()},"updateSettings",0,function(e){let t=(0,n.getDb)(),r={updatedAt:new Date};void 0!==e.preferredAgent&&(r.preferredAgent=e.preferredAgent),void 0!==e.panelChatSize&&(r.panelChatSize=e.panelChatSize),void 0!==e.panelEditorSize&&(r.panelEditorSize=e.panelEditorSize),void 0!==e.panelResourcesSize&&(r.panelResourcesSize=e.panelResourcesSize),void 0!==e.panelChatVisible&&(r.panelChatVisible=e.panelChatVisible),void 0!==e.panelResourcesVisible&&(r.panelResourcesVisible=e.panelResourcesVisible),void 0!==e.agentApprovalModes&&(r.agentApprovalModes=e.agentApprovalModes),void 0!==e.agentModelPreferences&&(r.agentModelPreferences=e.agentModelPreferences),void 0!==e.onboardingPersona&&(r.onboardingPersona=e.onboardingPersona),void 0!==e.personaSelectedAt&&(r.personaSelectedAt=e.personaSelectedAt),void 0!==e.agentEverConnected&&(r.agentEverConnected=e.agentEverConnected),void 0!==e.onboardingDemoOfferedAt&&(r.onboardingDemoOfferedAt=e.onboardingDemoOfferedAt),void 0!==e.onboardingDemoDismissedAt&&(r.onboardingDemoDismissedAt=e.onboardingDemoDismissedAt),t.insert(i.settings).values({id:1,...r}).onConflictDoUpdate({target:i.settings.id,set:r}).run()}],883978)},692855,e=>{"use strict";e.s(["isTestMode",0,function(){let e=process.env.LIBI_TEST_MODE;return"1"===e||"true"===e}])},38657,e=>{"use strict";var t,n;process.env.NEXT_PUBLIC_LIBI_GA4_MEASUREMENT_ID;let i="1"!==(t=process.env).LIBI_ANALYTICS_DISABLED&&"1"===t.NEXT_PUBLIC_LIBI_ANALYTICS;"1"===(n=process.env).LIBI_ANALYTICS_DEBUG||n.NODE_ENV;let r="1"===process.env.LIBI_ANALYTICS_DISABLED;e.s(["ANALYTICS_ENABLED",0,i,"ANALYTICS_KILL_SWITCH",0,r])},260338,e=>{"use strict";e.i(156325),e.i(844988);var t=e.i(518899);e.s(["count",0,function(e){return t.sql`count(${e||t.sql.raw("*")})`.mapWith(Number)}])},884724,e=>{"use strict";let t=new Set(["first_launch","first_export","persona_selected","agent_connected","onboarding_piece_built","persona_prompt_shown","agent_connect_shown","agent_setup_started","agent_setup_command_copied","agent_install_completed","agent_install_failed","agent_sign_in_opened","first_message_sent","piece_created","export_started","export_completed","agent_message_sent","file_uploaded","terminal_session_started","mcp_server_added","codex_connect_toggled","runtime_update_installed","version_restore","overlay_added","overlay_edited","preset_applied","effect_applied","effect_previewed","text_3d_used","overlay_3d_used","chat_slash_command","context_meter_opened","page_view","page_engagement","tool_used","pro_waitlist_joined","announcement_shown","analytics_opt_out","analytics_opt_in"]);e.s(["isEventName",0,function(e){return t.has(e)},"sanitizeParams",0,function(e){if(!e)return{};let t={};for(let[n,i]of Object.entries(e))null!=i&&("string"==typeof i?t[n]=i.slice(0,100):"number"==typeof i||"boolean"==typeof i?t[n]=i:t[n]=String(i).slice(0,100));return t},"toAgentEventId",0,function(e){return"claude-code"===e||"codex"===e?e:void 0}])},991858,e=>{"use strict";var t=e.i(349129),n=e.i(260338),i=e.i(875225),r=e.i(190793),s=e.i(478181),o=e.i(884724),a=e.i(883978),l=e.i(38657),d=e.i(692855);e.i(640911),e.s(["trackServerEvent",0,function(e,u){try{!function(e,u){try{if((0,d.isTestMode)()||l.ANALYTICS_KILL_SWITCH||!(0,a.getAnalyticsSettings)().enabled)return;let c=(0,o.sanitizeParams)(u),g=(0,r.getDb)();g.insert(s.analyticsQueue).values({id:crypto.randomUUID(),name:e,paramsJson:JSON.stringify(c),nextAttemptAt:new Date(0)}).run();let[{n:p}]=g.select({n:(0,n.count)()}).from(s.analyticsQueue).all();if(p>500){let e=g.select({id:s.analyticsQueue.id}).from(s.analyticsQueue).orderBy((0,t.asc)(s.analyticsQueue.createdAt)).limit(p-500).all().map(e=>e.id);g.delete(s.analyticsQueue).where((0,i.inArray)(s.analyticsQueue.id,e)).run()}}catch{}}(e,u)}catch{}}],991858)}];
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=96ca584e-6e31-dcad-1d35-a2fbc20221f1
|
|
5
5
|
//# sourceMappingURL=%5Broot-of-the-server%5D__11.cp_g._.js.map
|