@fml-inc/fml 0.0.29 → 0.0.30

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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/log.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/urlToObj.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/prettyLogStyles.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/formatTemplate.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/formatNumberAddZeros.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/metaFormatting.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/stackTrace.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/errorUtils.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/jsonStringifyRecursive.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/util.inspect.polyfill.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/environment.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/BaseLogger.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/index.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/config.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/loop.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/post.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/api/client.ts","../src/commands/install.ts","../src/banner.ts","../src/sync/client.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/auth/oauth.ts","../src/auth/device-flow.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/org.ts","../src/commands/open.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/sync-token.ts","../src/commands/env.ts","../src/commands/data.ts","../src/commands/query.ts","../src/commands/automation.ts","../src/commands/memory.ts","../src/commands/analysis.ts","../src/commands/integrations.ts","../src/commands/slack.ts","../src/commands/messages.ts","../src/commands/skills.ts","../src/commands/config-snapshots.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nimport { ensureNativeModules } from \"./native-check.js\";\nensureNativeModules();\n\nimport { Command } from \"commander\";\nimport { initSentry, Sentry } from \"./sentry.js\";\n\nimport { handleDoctor } from \"./commands/doctor.js\";\nimport { handleInstall } from \"./commands/install.js\";\nimport { handleUninstall } from \"./commands/uninstall.js\";\nimport { handleUpdate } from \"./commands/update.js\";\nimport { handleLogin } from \"./commands/login.js\";\nimport { handleLogout } from \"./commands/logout.js\";\nimport { handleOrg } from \"./commands/org.js\";\nimport { handleOpen } from \"./commands/open.js\";\nimport { handleStatus } from \"./commands/status.js\";\nimport { handleStart, handleStop } from \"./commands/daemon.js\";\nimport {\n handleSyncAdd,\n handleSyncEdit,\n handleSyncList,\n handleSyncRemove,\n handleSyncReset,\n handleSyncSetup,\n handleSyncStatus,\n} from \"./commands/sync.js\";\nimport { handleSyncToken } from \"./commands/sync-token.js\";\nimport { handleEnvShow, handleEnvSwitch } from \"./commands/env.js\";\nimport {\n handleActivity,\n handleSearch,\n handleSessions,\n handleSpending,\n handleTimeline,\n} from \"./commands/data.js\";\nimport { handleQuery } from \"./commands/query.js\";\nimport {\n handleAutomationList,\n handleAutomationCreate,\n handleAutomationCreatePattern,\n handleAutomationUpdate,\n handleAutomationDelete,\n handleAutomationTest,\n} from \"./commands/automation.js\";\nimport {\n handleMemoryList,\n handleMemoryRead,\n handleMemoryWrite,\n handleMemoryDelete,\n} from \"./commands/memory.js\";\nimport {\n handleSearchAnalysis,\n handleRunAnalysis,\n} from \"./commands/analysis.js\";\nimport {\n handleIntegrations,\n handleEvents,\n handleResolveIdentity,\n} from \"./commands/integrations.js\";\nimport { handleSlackHistory, handleSlackMessage } from \"./commands/slack.js\";\nimport {\n handleMessagesList,\n handleMessagesContext,\n} from \"./commands/messages.js\";\nimport { handleSkillsList, handleSkillsLoad } from \"./commands/skills.js\";\nimport {\n handleConfigList,\n handleConfigDetail,\n} from \"./commands/config-snapshots.js\";\nimport { printBanner } from \"./banner.js\";\n\nawait initSentry();\n\n// Show the logo when running `fml` with no args or `fml --help`\nif (\n process.argv.length <= 2 ||\n process.argv.includes(\"--help\") ||\n process.argv.includes(\"-h\")\n) {\n printBanner();\n}\n\nconst program = new Command()\n .name(\"fml\")\n .description(\"FML agent tools for Claude Code\")\n .version(\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"dev\",\n );\n\nprogram\n .command(\"tools\", { hidden: true })\n .description(\"List all available CLI commands (including hidden agent tools)\")\n .action(() => {\n function formatCmd(cmd: typeof program, prefix = \"\") {\n const name = prefix ? `${prefix} ${cmd.name()}` : cmd.name();\n const args = cmd.registeredArguments\n .map((a) => (a.required ? `<${a.name()}>` : `[${a.name()}]`))\n .join(\" \");\n const opts = cmd.options\n .filter(\n (o) => !o.hidden && o.long !== \"--help\" && o.long !== \"--version\",\n )\n .map((o) => (o.mandatory ? o.flags : `[${o.flags}]`))\n .join(\" \");\n const usage = [name, args, opts].filter(Boolean).join(\" \");\n return `${usage}\\n ${cmd.description()}`;\n }\n\n const lines = program.commands\n .filter((c) => c.name() !== \"tools\" && c.name() !== \"help\")\n .flatMap((c) => {\n if (c.commands.length > 0) {\n return c.commands.map((s) => formatCmd(s, c.name()));\n }\n return [formatCmd(c)];\n });\n console.log(lines.join(\"\\n\\n\"));\n });\n\nprogram\n .command(\"install\")\n .description(\"Register plugin, hooks, and daemons\")\n .action(() => handleInstall());\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove fml plugin, hooks, and optionally all data\")\n .option(\n \"--target <target>\",\n \"Target CLI: claude, gemini, codex, claude-desktop, all\",\n )\n .option(\"--purge\", \"Also remove all data, logs, and auth tokens\")\n .action((opts) => handleUninstall(opts));\n\nprogram\n .command(\"update\")\n .description(\"Update fml to the latest version\")\n .action(() => handleUpdate());\n\nprogram\n .command(\"login\")\n .description(\"Sign in to your FML account\")\n .option(\"--device\", \"Use device authorization flow (no browser needed)\")\n .action((opts: { device?: boolean }) => handleLogin(opts));\n\nprogram\n .command(\"logout\")\n .description(\"Sign out and clear stored credentials\")\n .action(() => handleLogout());\n\nprogram\n .command(\"org\")\n .description(\"Show or select organization\")\n .argument(\"[slug]\", \"Org slug to select\")\n .action((slug) => handleOrg(slug));\n\nprogram\n .command(\"status\")\n .description(\"Show current auth and daemon status\")\n .action(() => handleStatus());\n\nprogram\n .command(\"doctor\")\n .description(\"Check FML and panopticon configuration and connectivity\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => handleDoctor(opts));\n\nprogram\n .command(\"open\")\n .description(\"Open FML dashboard in browser\")\n .option(\"--json\", \"Output URL as JSON instead of opening browser\")\n .action((opts) => handleOpen(opts));\n\nprogram\n .command(\"env\")\n .description(\"Show or switch environment (dev/prod)\")\n .argument(\"[target]\", 'Environment name (\"dev\", \"prod\") or custom Convex URL')\n .action((target?: string) => {\n if (target) handleEnvSwitch(target);\n else handleEnvShow();\n });\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server and sync\")\n .action(() => handleStart());\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server and sync\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"setup\")\n .description(\"Configure sync targets (convenience shortcut)\")\n .action(() => handleSyncSetup());\n\nsync\n .command(\"list\")\n .description(\"List all sync targets\")\n .action(() => handleSyncList());\n\nsync\n .command(\"add\")\n .description(\"Add a sync target\")\n .argument(\"<name>\", \"Unique target name\")\n .argument(\"<url>\", \"OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"Shell command that returns a bearer token\")\n .option(\"--token <token>\", \"Static bearer token\")\n .action(\n (name: string, url: string, opts: { tokenCmd?: string; token?: string }) =>\n handleSyncAdd(name, url, opts),\n );\n\nsync\n .command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name to remove\")\n .action((name: string) => handleSyncRemove(name));\n\nsync\n .command(\"edit\")\n .description(\"Edit a sync target\")\n .argument(\"<name>\", \"Target name to edit\")\n .option(\"--url <url>\", \"New OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"New shell command for bearer token\")\n .option(\"--token <token>\", \"New static bearer token\")\n .action(\n (name: string, opts: { url?: string; tokenCmd?: string; token?: string }) =>\n handleSyncEdit(name, opts),\n );\n\nsync\n .command(\"status\")\n .description(\"Show sync config and watermarks\")\n .action(() => handleSyncStatus());\n\nsync\n .command(\"reset\")\n .description(\"Reset sync watermarks\")\n .argument(\"[name]\", \"Target name (resets all if omitted)\")\n .action((name?: string) => handleSyncReset(name));\n\nprogram\n .command(\"sync-token\", { hidden: true })\n .description(\n \"Print a refreshed FML access token (for panopticon tokenCommand)\",\n )\n .action(() => handleSyncToken());\n\n// ── Data commands ───────────────────────────────────────────────────────────\n\nprogram\n .command(\"activity\")\n .description(\"Activity summary — sessions, prompts, tools, costs\")\n .option(\"--since <duration>\", 'Time window, e.g. \"24h\", \"7d\"')\n .action((opts) => handleActivity(opts));\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max sessions to return\")\n .action((opts) => handleSessions(opts));\n\nprogram\n .command(\"timeline\")\n .description(\"Get events for a session\")\n .argument(\"<session-id>\", \"Session ID\")\n .option(\"--limit <n>\", \"Max events to return\")\n .option(\"--offset <n>\", \"Events to skip\")\n .action((sessionId, opts) => handleTimeline(sessionId, opts));\n\nprogram\n .command(\"spending\")\n .description(\"AI token usage and cost breakdown\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action((opts) => handleSpending(opts));\n\nprogram\n .command(\"search\")\n .description(\"Search across all sessions\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearch(query, opts));\n\n// ── Query command (unified integration queries) ────────────────────────────\n\nprogram\n .command(\"query\", { hidden: true })\n .description(\"Query a connected integration\")\n .argument(\n \"<provider>\",\n \"Provider name (sentry, slack, github, linear, notion, freshdesk, posthog, amplitude, meta-ads)\",\n )\n .argument(\"<endpoint>\", \"API endpoint or subcommand\")\n .option(\"--method <method>\", \"HTTP method\", \"GET\")\n .option(\"--body <json>\", \"Request body as JSON string\")\n .option(\"--project-id <id>\", \"Project ID override\")\n .action((provider, endpoint, opts) => handleQuery(provider, endpoint, opts));\n\n// ── Automation subcommand ──────────────────────────────────────────────────\n\nconst automation = program\n .command(\"automation\", { hidden: true })\n .description(\"Manage automations\");\n\nautomation\n .command(\"list\")\n .description(\"List all automations\")\n .action(() => handleAutomationList());\n\nautomation\n .command(\"create-scheduled\")\n .description(\"Create a scheduled automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to run\")\n .requiredOption(\"--frequency <freq>\", \"hourly, daily, weekly, or monthly\")\n .requiredOption(\"--hour <hour>\", \"Hour (0-23)\")\n .requiredOption(\"--minute <minute>\", \"Minute (0-59)\")\n .requiredOption(\"--timezone <tz>\", \"IANA timezone, e.g. America/Chicago\")\n .option(\"--day-of-week <day>\", \"Day of week (0=Sun..6=Sat) for weekly\")\n .option(\"--day-of-month <day>\", \"Day of month (1-31) for monthly\")\n .option(\"--max-runs <n>\", \"Max runs (1 for one-time)\")\n .action((opts) => handleAutomationCreate(opts));\n\nautomation\n .command(\"create-pattern\")\n .description(\"Create an event-triggered automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to watch for and do\")\n .action((opts) => handleAutomationCreatePattern(opts));\n\nautomation\n .command(\"update\")\n .description(\"Update an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--prompt <prompt>\", \"New prompt\")\n .option(\"--enabled <bool>\", \"Enable or disable (true/false)\")\n .option(\"--frequency <freq>\", \"New frequency\")\n .option(\"--hour <hour>\", \"New hour\")\n .option(\"--minute <minute>\", \"New minute\")\n .option(\"--timezone <tz>\", \"New timezone\")\n .option(\"--day-of-week <day>\", \"New day of week\")\n .option(\"--day-of-month <day>\", \"New day of month\")\n .action((id, opts) => handleAutomationUpdate(id, opts));\n\nautomation\n .command(\"delete\")\n .description(\"Delete an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationDelete(id));\n\nautomation\n .command(\"test\")\n .description(\"Preview/test an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationTest(id));\n\n// ── Memory subcommand ──────────────────────────────────────────────────────\n\nconst memory = program\n .command(\"memory\", { hidden: true })\n .description(\"Manage memory files\");\n\nmemory\n .command(\"list\")\n .description(\"List memory files\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryList(opts));\n\nmemory\n .command(\"read\")\n .description(\"Read a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryRead(fileId));\n\nmemory\n .command(\"write\")\n .description(\"Create or update a memory file\")\n .requiredOption(\"--title <title>\", \"File title\")\n .requiredOption(\"--content <content>\", \"File content\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryWrite(opts));\n\nmemory\n .command(\"delete\")\n .description(\"Delete a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryDelete(fileId));\n\n// ── Analysis commands ──────────────────────────────────────────────────────\n\nprogram\n .command(\"search-analysis\", { hidden: true })\n .description(\"Search codebase analysis results\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearchAnalysis(query, opts));\n\nprogram\n .command(\"run-analysis\", { hidden: true })\n .description(\"Run deep codebase analysis workflows\")\n .option(\n \"--prompts <list>\",\n \"Comma-separated: security,architecture,code-quality,performance,ux,dependencies,cost,ai-architecture,ai-security\",\n )\n .action((opts) => handleRunAnalysis(opts));\n\n// ── Integration commands ───────────────────────────────────────────────────\n\nprogram\n .command(\"integrations\", { hidden: true })\n .description(\"List connected integrations\")\n .action(() => handleIntegrations());\n\nprogram\n .command(\"events\", { hidden: true })\n .description(\"Recent integration events (deploys, releases, errors)\")\n .option(\n \"--source <source>\",\n \"Filter: github, sentry, linear, amplitude, stripe\",\n )\n .option(\"--event-type <type>\", \"Filter by event type\")\n .option(\"--project-id <id>\", \"Filter by project\")\n .option(\"--since <duration>\", \"Time range: 1h, 6h, 24h, 7d, 30d\")\n .action((opts) => handleEvents(opts));\n\nprogram\n .command(\"resolve-identity\", { hidden: true })\n .description(\"Resolve external identity to FML user\")\n .argument(\"[username]\", \"External username (shorthand for --username)\")\n .option(\"--provider <p>\", \"Provider: github, linear, slack\")\n .option(\"--username <u>\", \"External username\")\n .option(\"--email <e>\", \"Email address\")\n .option(\"--external-id <id>\", \"External ID\")\n .option(\"--external-user-id <id>\", \"External user ID\")\n .action((username, opts) =>\n handleResolveIdentity(username ? { ...opts, username } : opts),\n );\n\n// ── Slack subcommand ───────────────────────────────────────────────────────\n\nconst slack = program\n .command(\"slack\", { hidden: true })\n .description(\"Slack shortcuts\");\n\nslack\n .command(\"history\")\n .description(\"Recent messages from a channel\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--limit <n>\", \"Max messages\")\n .action((opts) => handleSlackHistory(opts));\n\nslack\n .command(\"message\")\n .description(\"Fetch a specific message\")\n .option(\"--permalink <url>\", \"Message permalink\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--ts <timestamp>\", \"Message timestamp\")\n .option(\"--include-thread\", \"Include thread context\")\n .action((opts) => handleSlackMessage(opts));\n\n// ── Messages subcommand ────────────────────────────────────────────────────\n\nconst messages = program\n .command(\"messages\", { hidden: true })\n .description(\"Conversation messages\");\n\nmessages\n .command(\"list\")\n .description(\"List messages from a conversation\")\n .option(\"--start <timestamp>\", \"Start time (ms epoch)\")\n .option(\"--end <timestamp>\", \"End time (ms epoch)\")\n .option(\"--limit <n>\", \"Max messages\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action((opts) => handleMessagesList(opts));\n\nmessages\n .command(\"context\")\n .description(\"Get messages around a specific message\")\n .argument(\"<message-id>\", \"Message ID\")\n .option(\"--before <n>\", \"Messages before\")\n .option(\"--after <n>\", \"Messages after\")\n .action((messageId, opts) => handleMessagesContext(messageId, opts));\n\n// ── Skills subcommand ──────────────────────────────────────────────────────\n\nconst skills = program\n .command(\"skills\", { hidden: true })\n .description(\"Browse and load skills\");\n\nskills\n .command(\"list\")\n .description(\"List available skills\")\n .action(() => handleSkillsList());\n\nskills\n .command(\"load\")\n .description(\"Load a skill by ID\")\n .argument(\"<skill-id>\", \"Skill ID\")\n .action((skillId) => handleSkillsLoad(skillId));\n\n// ── Config subcommand ──────────────────────────────────────────────────────\n\nconst config = program\n .command(\"config\", { hidden: true })\n .description(\"View team config snapshots\");\n\nconfig\n .command(\"list\")\n .description(\"List config snapshots for an org\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--repo <full-name>\", \"Filter by repo (owner/name)\")\n .action((opts) => handleConfigList(opts));\n\nconfig\n .command(\"detail\")\n .description(\"Get config snapshot detail\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--user <username>\", \"GitHub username\")\n .option(\"--repo <full-name>\", \"Repository (owner/name)\")\n .action((opts) => handleConfigDetail(opts));\n\n// ────────────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((err) => {\n Sentry.captureException(err);\n console.error(err);\n process.exit(1);\n});\n","import ora from \"ora\";\nimport pc from \"picocolors\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { CONVEX_URL } from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { parsePanopticonRunning } from \"./daemon.js\";\nimport { loadSyncConfig } from \"@fml-inc/panopticon/sync\";\nimport { syncPending } from \"@fml-inc/panopticon/api\";\n\ninterface CheckResult {\n label: string;\n status: \"ok\" | \"warn\" | \"fail\";\n detail: string;\n}\n\nfunction reportResult(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n): void {\n const text = `${result.label} — ${result.detail}`;\n if (spinner) {\n switch (result.status) {\n case \"ok\":\n spinner.succeed(text);\n break;\n case \"warn\":\n spinner.warn(text);\n break;\n case \"fail\":\n spinner.fail(text);\n break;\n }\n } else {\n const icon =\n result.status === \"ok\"\n ? pc.green(\"✓\")\n : result.status === \"warn\"\n ? pc.yellow(\"!\")\n : pc.red(\"✗\");\n console.log(` ${icon} ${result.label} — ${result.detail}`);\n }\n}\n\nexport async function handleDoctor(opts: { json?: boolean }): Promise<void> {\n const isTTY = !opts.json && process.stdout.isTTY === true;\n const checks: CheckResult[] = [];\n\n function startSpinner(label: string): ReturnType<typeof ora> | null {\n if (!isTTY) return null;\n return ora({ text: `Checking ${label}...`, indent: 2 }).start();\n }\n\n function pushAndReport(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n ): void {\n checks.push(result);\n if (!opts.json) {\n reportResult(result, spinner);\n }\n }\n\n if (!opts.json && !isTTY) {\n console.log(\"\");\n }\n\n // 1. Auth check\n let token: string | null = null;\n {\n const spinner = startSpinner(\"auth\");\n token = await getValidToken();\n if (token) {\n const stored = readTokens();\n const detail = stored?.user?.email\n ? `Logged in as ${stored.user.email}`\n : \"Token present\";\n pushAndReport({ label: \"Auth\", status: \"ok\", detail }, spinner);\n } else {\n pushAndReport(\n {\n label: \"Auth\",\n status: \"fail\",\n detail: \"No token. Run `fml login`\",\n },\n spinner,\n );\n }\n }\n\n // 2. Panopticon checks (imported dynamically to avoid hard dep on published version)\n {\n const spinner = startSpinner(\"panopticon\");\n try {\n const { doctor } = await import(\"@fml-inc/panopticon/doctor\");\n const result = await doctor();\n // Close the spinner before reporting individual checks\n if (spinner) spinner.stop();\n for (const check of result.checks) {\n pushAndReport(check, null);\n }\n } catch {\n // Panopticon doctor not available — check via CLI\n const result = panopticonExec(\"status\");\n if (result.ok) {\n pushAndReport(\n { label: \"Panopticon\", status: \"ok\", detail: \"Available\" },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon\",\n status: \"fail\",\n detail: \"Not found. Run `fml install`\",\n },\n spinner,\n );\n }\n }\n }\n\n // 3. Sync status (only if authenticated)\n if (token) {\n const spinner = startSpinner(\"sync\");\n try {\n const syncConfig = loadSyncConfig();\n const targets = syncConfig.targets;\n if (targets.length === 0) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: \"No sync targets configured\",\n },\n spinner,\n );\n } else {\n // Close the spinner before reporting per-target\n if (spinner) spinner.stop();\n\n for (const target of targets) {\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"ok\",\n detail: \"Up to date\",\n },\n null,\n );\n } else {\n const parts = Object.entries(result.tables)\n .sort(([, a], [, b]) => b.pending - a.pending)\n .slice(0, 3)\n .map(([t, v]) => `${v.pending} ${t}`);\n const detail =\n parts.length < Object.keys(result.tables).length\n ? `${result.totalPending} pending (${parts.join(\", \")}, ...)`\n : `${result.totalPending} pending (${parts.join(\", \")})`;\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: result.totalPending > 1000 ? \"warn\" : \"ok\",\n detail,\n },\n null,\n );\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"warn\",\n detail: `Could not query watermarks (${msg})`,\n },\n null,\n );\n }\n }\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: err instanceof Error ? err.message : \"Check failed\",\n },\n spinner,\n );\n }\n }\n\n // 4. Daemon checks\n {\n const spinner = startSpinner(\"panopticon daemon\");\n const isRunning = parsePanopticonRunning();\n if (isRunning) {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"ok\",\n detail: \"running\",\n },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"warn\",\n detail: \"Not running. Run `fml start`\",\n },\n spinner,\n );\n }\n }\n\n // 5. API reachability\n {\n const spinner = startSpinner(\"API\");\n if (token) {\n try {\n const result = await createApiClient(token).callBackend(\"ping\", {});\n if (result.ok) {\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n } else {\n // Backend responded but tool failed — still reachable\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"API\",\n status: \"fail\",\n detail: err instanceof Error ? err.message : \"Unreachable\",\n },\n spinner,\n );\n }\n } else {\n pushAndReport(\n { label: \"API\", status: \"fail\", detail: \"Auth required\" },\n spinner,\n );\n }\n }\n\n // JSON output\n if (opts.json) {\n console.log(JSON.stringify(checks, null, 2));\n return;\n }\n\n // Summary\n console.log(\"\");\n const passed = checks.filter((c) => c.status === \"ok\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n const parts: string[] = [];\n if (passed > 0) parts.push(pc.green(`${passed} passed`));\n if (warned > 0)\n parts.push(pc.yellow(`${warned} warning${warned > 1 ? \"s\" : \"\"}`));\n if (failed > 0) parts.push(pc.red(`${failed} failed`));\n\n console.log(` ${parts.join(\", \")}`);\n console.log(\"\");\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { Logger } from \"tslog\";\n\nfunction getLogDir(): string {\n switch (process.platform) {\n case \"darwin\":\n return path.join(os.homedir(), \"Library\", \"Logs\", \"panopticon\");\n case \"win32\":\n return path.join(\n process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\"),\n \"panopticon\",\n \"logs\",\n );\n default:\n // Linux and other Unix-like\n return path.join(\n process.env.XDG_STATE_HOME ??\n path.join(os.homedir(), \".local\", \"state\"),\n \"panopticon\",\n \"logs\",\n );\n }\n}\n\nexport const LOG_DIR = getLogDir();\n\nexport const logPaths = {\n server: path.join(LOG_DIR, \"server.log\"),\n otlp: path.join(LOG_DIR, \"otlp-receiver.log\"),\n mcp: path.join(LOG_DIR, \"mcp-server.log\"),\n proxy: path.join(LOG_DIR, \"proxy.log\"),\n hook: path.join(LOG_DIR, \"hook-handler.log\"),\n} as const;\n\nexport type DaemonName = keyof typeof logPaths;\n\nexport const DAEMON_NAMES = Object.keys(logPaths) as DaemonName[];\n\n/**\n * Open a log file in append mode, returning the fd.\n * Pass the fd to spawn's stdio array: [\"ignore\", fd, fd]\n * Close the fd after spawn — the child inherits its own copy.\n */\nexport function openLogFd(daemon: DaemonName): number {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n return fs.openSync(logPaths[daemon], \"a\");\n}\n\nconst root = new Logger({\n name: \"panopticon\",\n type: \"pretty\",\n prettyLogTimeZone: \"UTC\",\n stylePrettyLogs: false,\n prettyLogTemplate: \"{{dateIsoStr}} [{{name}}] {{logLevelName}}\\t\",\n});\n\nexport const log = {\n server: root.getSubLogger({ name: \"server\" }),\n scanner: root.getSubLogger({ name: \"scanner\" }),\n sync: root.getSubLogger({ name: \"sync\" }),\n proxy: root.getSubLogger({ name: \"proxy\" }),\n llm: root.getSubLogger({ name: \"llm\" }),\n mcp: root.getSubLogger({ name: \"mcp\" }),\n otlp: root.getSubLogger({ name: \"otlp\" }),\n hooks: root.getSubLogger({ name: \"hooks\" }),\n};\n","export function urlToObject(url) {\n return {\n href: url.href,\n protocol: url.protocol,\n username: url.username,\n password: url.password,\n host: url.host,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n search: url.search,\n searchParams: [...url.searchParams].map(([key, value]) => ({ key, value })),\n hash: url.hash,\n origin: url.origin,\n };\n}\n","export const prettyLogStyles = {\n reset: [0, 0],\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n overline: [53, 55],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n blackBright: [90, 39],\n redBright: [91, 39],\n greenBright: [92, 39],\n yellowBright: [93, 39],\n blueBright: [94, 39],\n magentaBright: [95, 39],\n cyanBright: [96, 39],\n whiteBright: [97, 39],\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n bgBlackBright: [100, 49],\n bgRedBright: [101, 49],\n bgGreenBright: [102, 49],\n bgYellowBright: [103, 49],\n bgBlueBright: [104, 49],\n bgMagentaBright: [105, 49],\n bgCyanBright: [106, 49],\n bgWhiteBright: [107, 49],\n};\n","import { prettyLogStyles } from \"./prettyLogStyles.js\";\nexport function formatTemplate(settings, template, values, hideUnsetPlaceholder = false) {\n const templateString = String(template);\n const ansiColorWrap = (placeholderValue, code) => `\\u001b[${code[0]}m${placeholderValue}\\u001b[${code[1]}m`;\n const styleWrap = (value, style) => {\n if (style != null && typeof style === \"string\") {\n return ansiColorWrap(value, prettyLogStyles[style]);\n }\n else if (style != null && Array.isArray(style)) {\n return style.reduce((prevValue, thisStyle) => styleWrap(prevValue, thisStyle), value);\n }\n else {\n if (style != null && style[value.trim()] != null) {\n return styleWrap(value, style[value.trim()]);\n }\n else if (style != null && style[\"*\"] != null) {\n return styleWrap(value, style[\"*\"]);\n }\n else {\n return value;\n }\n }\n };\n const defaultStyle = null;\n return templateString.replace(/{{(.+?)}}/g, (_, placeholder) => {\n const value = values[placeholder] != null ? String(values[placeholder]) : hideUnsetPlaceholder ? \"\" : _;\n return settings.stylePrettyLogs\n ? styleWrap(value, settings?.prettyLogStyles?.[placeholder] ?? defaultStyle) + ansiColorWrap(\"\", prettyLogStyles.reset)\n : value;\n });\n}\n","export function formatNumberAddZeros(value, digits = 2, addNumber = 0) {\n if (value != null && isNaN(value)) {\n return \"\";\n }\n value = value != null ? value + addNumber : value;\n return digits === 2\n ? value == null\n ? \"--\"\n : value < 10\n ? \"0\" + value\n : value.toString()\n : value == null\n ? \"---\"\n : value < 10\n ? \"00\" + value\n : value < 100\n ? \"0\" + value\n : value.toString();\n}\n","import { formatTemplate } from \"../formatTemplate.js\";\nimport { formatNumberAddZeros } from \"../formatNumberAddZeros.js\";\nexport function buildPrettyMeta(settings, meta) {\n if (meta == null) {\n return {\n text: \"\",\n template: settings.prettyLogTemplate,\n placeholders: {},\n };\n }\n let template = settings.prettyLogTemplate;\n const placeholderValues = {};\n if (template.includes(\"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\")) {\n template = template.replace(\"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\", \"{{dateIsoStr}}\");\n }\n else {\n if (settings.prettyLogTimeZone === \"UTC\") {\n placeholderValues[\"yyyy\"] = meta.date?.getUTCFullYear() ?? \"----\";\n placeholderValues[\"mm\"] = formatNumberAddZeros(meta.date?.getUTCMonth(), 2, 1);\n placeholderValues[\"dd\"] = formatNumberAddZeros(meta.date?.getUTCDate(), 2);\n placeholderValues[\"hh\"] = formatNumberAddZeros(meta.date?.getUTCHours(), 2);\n placeholderValues[\"MM\"] = formatNumberAddZeros(meta.date?.getUTCMinutes(), 2);\n placeholderValues[\"ss\"] = formatNumberAddZeros(meta.date?.getUTCSeconds(), 2);\n placeholderValues[\"ms\"] = formatNumberAddZeros(meta.date?.getUTCMilliseconds(), 3);\n }\n else {\n placeholderValues[\"yyyy\"] = meta.date?.getFullYear() ?? \"----\";\n placeholderValues[\"mm\"] = formatNumberAddZeros(meta.date?.getMonth(), 2, 1);\n placeholderValues[\"dd\"] = formatNumberAddZeros(meta.date?.getDate(), 2);\n placeholderValues[\"hh\"] = formatNumberAddZeros(meta.date?.getHours(), 2);\n placeholderValues[\"MM\"] = formatNumberAddZeros(meta.date?.getMinutes(), 2);\n placeholderValues[\"ss\"] = formatNumberAddZeros(meta.date?.getSeconds(), 2);\n placeholderValues[\"ms\"] = formatNumberAddZeros(meta.date?.getMilliseconds(), 3);\n }\n }\n const dateInSettingsTimeZone = settings.prettyLogTimeZone === \"UTC\" ? meta.date : meta.date != null ? new Date(meta.date.getTime() - meta.date.getTimezoneOffset() * 60000) : undefined;\n placeholderValues[\"rawIsoStr\"] = dateInSettingsTimeZone?.toISOString() ?? \"\";\n placeholderValues[\"dateIsoStr\"] = dateInSettingsTimeZone?.toISOString().replace(\"T\", \" \").replace(\"Z\", \"\") ?? \"\";\n placeholderValues[\"logLevelName\"] = meta.logLevelName;\n placeholderValues[\"fileNameWithLine\"] = meta.path?.fileNameWithLine ?? \"\";\n placeholderValues[\"filePathWithLine\"] = meta.path?.filePathWithLine ?? \"\";\n placeholderValues[\"fullFilePath\"] = meta.path?.fullFilePath ?? \"\";\n let parentNamesString = settings.parentNames?.join(settings.prettyErrorParentNamesSeparator);\n parentNamesString = parentNamesString != null && meta.name != null ? parentNamesString + settings.prettyErrorParentNamesSeparator : undefined;\n const combinedName = meta.name != null || parentNamesString != null ? `${parentNamesString ?? \"\"}${meta.name ?? \"\"}` : \"\";\n placeholderValues[\"name\"] = combinedName;\n placeholderValues[\"nameWithDelimiterPrefix\"] = combinedName.length > 0 ? settings.prettyErrorLoggerNameDelimiter + combinedName : \"\";\n placeholderValues[\"nameWithDelimiterSuffix\"] = combinedName.length > 0 ? combinedName + settings.prettyErrorLoggerNameDelimiter : \"\";\n if (settings.overwrite?.addPlaceholders != null) {\n settings.overwrite.addPlaceholders(meta, placeholderValues);\n }\n return {\n text: formatTemplate(settings, template, placeholderValues),\n template,\n placeholders: placeholderValues,\n };\n}\n","const DEFAULT_IGNORE_PATTERNS = [\n /(?:^|[\\\\/])node_modules[\\\\/].*tslog/i,\n /(?:^|[\\\\/])deps[\\\\/].*tslog/i,\n /tslog[\\\\/]+src[\\\\/]+internal[\\\\/]/i,\n /tslog[\\\\/]+src[\\\\/]BaseLogger/i,\n /tslog[\\\\/]+src[\\\\/]index/i,\n];\nexport function splitStackLines(error) {\n const stack = typeof error?.stack === \"string\" ? error.stack : undefined;\n if (stack == null || stack.length === 0) {\n return [];\n }\n return stack.split(\"\\n\").map((line) => line.trimEnd());\n}\nexport function sanitizeStackLines(lines) {\n return lines.filter((line) => line.length > 0 && !/^\\s*Error\\b/.test(line));\n}\nexport function toStackFrames(lines, parseLine) {\n const frames = [];\n for (const line of lines) {\n const frame = parseLine(line);\n if (frame != null) {\n frames.push(frame);\n }\n }\n return frames;\n}\nexport function findFirstExternalFrameIndex(frames, ignorePatterns = DEFAULT_IGNORE_PATTERNS) {\n for (let index = 0; index < frames.length; index += 1) {\n const frame = frames[index];\n const filePathCandidate = frame.filePath ?? \"\";\n const fullPathCandidate = frame.fullFilePath ?? \"\";\n if (!ignorePatterns.some((pattern) => pattern.test(filePathCandidate) || pattern.test(fullPathCandidate))) {\n return index;\n }\n }\n return 0;\n}\nexport function getFrameAt(frames, index) {\n if (index < 0 || index >= frames.length) {\n return undefined;\n }\n return frames[index];\n}\nexport function getCleanStackLines(error) {\n return sanitizeStackLines(splitStackLines(error));\n}\nexport function buildStackTrace(error, parseLine) {\n return toStackFrames(getCleanStackLines(error), parseLine);\n}\nexport function isIgnorableFrame(frame, ignorePatterns) {\n const filePathCandidate = frame.filePath ?? \"\";\n const fullPathCandidate = frame.fullFilePath ?? \"\";\n return ignorePatterns.some((pattern) => pattern.test(filePathCandidate) || pattern.test(fullPathCandidate));\n}\nexport function clampIndex(index, maxExclusive) {\n if (index < 0) {\n return 0;\n }\n if (index >= maxExclusive) {\n return Math.max(0, maxExclusive - 1);\n }\n return index;\n}\nexport function pickCallerStackFrame(error, parseLine, options = {}) {\n const lines = getCleanStackLines(error);\n const frames = toStackFrames(lines, parseLine);\n if (frames.length === 0) {\n return undefined;\n }\n const ignorePatterns = options.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS;\n const autoIndex = findFirstExternalFrameIndex(frames, ignorePatterns);\n const resolvedIndex = options.stackDepthLevel != null ? options.stackDepthLevel : autoIndex;\n return getFrameAt(frames, clampIndex(resolvedIndex, frames.length));\n}\nexport function getDefaultIgnorePatterns() {\n return [...DEFAULT_IGNORE_PATTERNS];\n}\n","import { buildStackTrace } from \"./stackTrace.js\";\nconst DEFAULT_CAUSE_DEPTH = 5;\nexport function collectErrorCauses(error, options = {}) {\n const maxDepth = options.maxDepth ?? DEFAULT_CAUSE_DEPTH;\n const causes = [];\n const visited = new Set();\n let current = error;\n let depth = 0;\n while (current != null && depth < maxDepth) {\n const cause = current?.cause;\n if (cause == null || visited.has(cause)) {\n break;\n }\n visited.add(cause);\n causes.push(toError(cause));\n current = cause;\n depth += 1;\n }\n return causes;\n}\nexport function toError(value) {\n if (value instanceof Error) {\n return value;\n }\n const error = new Error(typeof value === \"string\" ? value : JSON.stringify(value));\n if (typeof value === \"object\" && value != null) {\n Object.assign(error, value);\n }\n return error;\n}\nexport function toErrorObject(error, parseLine) {\n return {\n nativeError: error,\n name: error.name ?? \"Error\",\n message: error.message ?? \"\",\n stack: buildStackTrace(error, parseLine),\n };\n}\n","export function jsonStringifyRecursive(obj) {\n const cache = new Set();\n return JSON.stringify(obj, (key, value) => {\n if (typeof value === \"object\" && value !== null) {\n if (cache.has(value)) {\n return \"[Circular]\";\n }\n cache.add(value);\n }\n if (typeof value === \"bigint\") {\n return `${value}`;\n }\n if (typeof value === \"undefined\") {\n return \"[undefined]\";\n }\n return value;\n });\n}\n","import { prettyLogStyles } from \"../prettyLogStyles.js\";\nimport { jsonStringifyRecursive } from \"./jsonStringifyRecursive.js\";\nexport function inspect(obj, opts) {\n const ctx = {\n seen: [],\n stylize: stylizeNoColor,\n };\n if (opts != null) {\n _extend(ctx, opts);\n }\n if (isUndefined(ctx.showHidden))\n ctx.showHidden = false;\n if (isUndefined(ctx.depth))\n ctx.depth = 2;\n if (isUndefined(ctx.colors))\n ctx.colors = true;\n if (isUndefined(ctx.customInspect))\n ctx.customInspect = true;\n if (ctx.colors)\n ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\ninspect.colors = prettyLogStyles;\ninspect.styles = {\n special: \"cyan\",\n number: \"yellow\",\n boolean: \"yellow\",\n undefined: \"grey\",\n null: \"bold\",\n string: \"green\",\n date: \"magenta\",\n regexp: \"red\",\n};\nfunction isBoolean(arg) {\n return typeof arg === \"boolean\";\n}\nfunction isUndefined(arg) {\n return arg === undefined;\n}\nfunction stylizeNoColor(str) {\n return str;\n}\nfunction stylizeWithColor(str, styleType) {\n const style = inspect.styles[styleType];\n if (style != null && inspect?.colors?.[style]?.[0] != null && inspect?.colors?.[style]?.[1] != null) {\n return \"\\u001b[\" + inspect.colors[style][0] + \"m\" + str + \"\\u001b[\" + inspect.colors[style][1] + \"m\";\n }\n else {\n return str;\n }\n}\nfunction isFunction(arg) {\n return typeof arg === \"function\";\n}\nfunction isString(arg) {\n return typeof arg === \"string\";\n}\nfunction isNumber(arg) {\n return typeof arg === \"number\";\n}\nfunction isNull(arg) {\n return arg === null;\n}\nfunction hasOwn(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === \"[object RegExp]\";\n}\nfunction isObject(arg) {\n return typeof arg === \"object\" && arg !== null;\n}\nfunction isError(e) {\n return isObject(e) && (objectToString(e) === \"[object Error]\" || e instanceof Error);\n}\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === \"[object Date]\";\n}\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\nfunction arrayToHash(array) {\n const hash = {};\n array.forEach((val) => {\n hash[val] = true;\n });\n return hash;\n}\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n const output = [];\n for (let i = 0, l = value.length; i < l; ++i) {\n if (hasOwn(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));\n }\n else {\n output.push(\"\");\n }\n }\n keys.forEach((key) => {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));\n }\n });\n return output;\n}\nfunction formatError(value) {\n return \"[\" + Error.prototype.toString.call(value) + \"]\";\n}\nexport function formatValue(ctx, value, recurseTimes = 0) {\n if (ctx.customInspect &&\n value != null &&\n isFunction(value) &&\n value?.inspect !== inspect &&\n !(value?.constructor && value?.constructor.prototype === value)) {\n if (typeof value.inspect !== \"function\" && value.toString != null) {\n return value.toString();\n }\n let ret = value?.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n const primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n let keys = Object.keys(value);\n const visibleKeys = arrayToHash(keys);\n try {\n if (ctx.showHidden && Object.getOwnPropertyNames) {\n keys = Object.getOwnPropertyNames(value);\n }\n }\n catch {\n }\n if (isError(value) && (keys.indexOf(\"message\") >= 0 || keys.indexOf(\"description\") >= 0)) {\n return formatError(value);\n }\n if (keys.length === 0) {\n if (isFunction(ctx.stylize)) {\n if (isFunction(value)) {\n const name = value.name ? \": \" + value.name : \"\";\n return ctx.stylize(\"[Function\" + name + \"]\", \"special\");\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), \"regexp\");\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toISOString.call(value), \"date\");\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n else {\n return value;\n }\n }\n let base = \"\";\n let array = false;\n let braces = [\"{\\n\", \"\\n}\"];\n if (Array.isArray(value)) {\n array = true;\n braces = [\"[\\n\", \"\\n]\"];\n }\n if (isFunction(value)) {\n const n = value.name ? \": \" + value.name : \"\";\n base = \" [Function\" + n + \"]\";\n }\n if (isRegExp(value)) {\n base = \" \" + RegExp.prototype.toString.call(value);\n }\n if (isDate(value)) {\n base = \" \" + Date.prototype.toUTCString.call(value);\n }\n if (isError(value)) {\n base = \" \" + formatError(value);\n }\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), \"regexp\");\n }\n else {\n return ctx.stylize(\"[Object]\", \"special\");\n }\n }\n ctx.seen.push(value);\n let output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n }\n else {\n output = keys.map((key) => {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n ctx.seen.pop();\n return reduceToSingleString(output, base, braces);\n}\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n let name, str;\n let desc = { value: void 0 };\n try {\n desc.value = value[key];\n }\n catch {\n }\n try {\n if (Object.getOwnPropertyDescriptor) {\n desc = Object.getOwnPropertyDescriptor(value, key) || desc;\n }\n }\n catch {\n }\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize(\"[Getter/Setter]\", \"special\");\n }\n else {\n str = ctx.stylize(\"[Getter]\", \"special\");\n }\n }\n else {\n if (desc.set) {\n str = ctx.stylize(\"[Setter]\", \"special\");\n }\n }\n if (!hasOwn(visibleKeys, key)) {\n name = \"[\" + key + \"]\";\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, undefined);\n }\n else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf(\"\\n\") > -1) {\n if (array) {\n str = str\n .split(\"\\n\")\n .map((line) => {\n return \" \" + line;\n })\n .join(\"\\n\")\n .substr(2);\n }\n else {\n str =\n \"\\n\" +\n str\n .split(\"\\n\")\n .map((line) => {\n return \" \" + line;\n })\n .join(\"\\n\");\n }\n }\n }\n else {\n str = ctx.stylize(\"[Circular]\", \"special\");\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify(\"\" + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, \"name\");\n }\n else {\n name = name\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, \"\\\\'\")\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, \"string\");\n }\n }\n return name + \": \" + str;\n}\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize(\"undefined\", \"undefined\");\n if (isString(value)) {\n const simple = \"'\" + JSON.stringify(value).replace(/^\"|\"$/g, \"\").replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, \"\\\\'\") + \"'\";\n return ctx.stylize(simple, \"string\");\n }\n if (isNumber(value))\n return ctx.stylize(\"\" + value, \"number\");\n if (isBoolean(value))\n return ctx.stylize(\"\" + value, \"boolean\");\n if (isNull(value))\n return ctx.stylize(\"null\", \"null\");\n}\nfunction reduceToSingleString(output, base, braces) {\n return braces[0] + (base === \"\" ? \"\" : base + \"\\n\") + \" \" + output.join(\",\\n \") + \" \" + braces[1];\n}\nfunction _extend(origin, add) {\n const typedOrigin = { ...origin };\n if (!add || !isObject(add))\n return origin;\n const clonedAdd = { ...add };\n const keys = Object.keys(add);\n let i = keys.length;\n while (i--) {\n typedOrigin[keys[i]] = clonedAdd[keys[i]];\n }\n return typedOrigin;\n}\nexport function formatWithOptions(inspectOptions, ...args) {\n const ctx = {\n seen: [],\n stylize: stylizeNoColor,\n };\n if (inspectOptions != null) {\n _extend(ctx, inspectOptions);\n }\n const first = args[0];\n let a = 0;\n let str = \"\";\n let join = \"\";\n if (typeof first === \"string\") {\n if (args.length === 1) {\n return first;\n }\n let tempStr;\n let lastPos = 0;\n for (let i = 0; i < first.length - 1; i++) {\n if (first.charCodeAt(i) === 37) {\n const nextChar = first.charCodeAt(++i);\n if (a + 1 !== args.length) {\n switch (nextChar) {\n case 115: {\n const tempArg = args[++a];\n if (typeof tempArg === \"number\") {\n tempStr = formatPrimitive(ctx, tempArg);\n }\n else if (typeof tempArg === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempArg);\n }\n else if (typeof tempArg !== \"object\" || tempArg === null) {\n tempStr = String(tempArg);\n }\n else {\n tempStr = inspect(tempArg, {\n ...inspectOptions,\n compact: 3,\n colors: false,\n depth: 0,\n });\n }\n break;\n }\n case 106:\n tempStr = jsonStringifyRecursive(args[++a]);\n break;\n case 100: {\n const tempNum = args[++a];\n if (typeof tempNum === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempNum);\n }\n else if (typeof tempNum === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, tempNum);\n }\n break;\n }\n case 79:\n tempStr = inspect(args[++a], inspectOptions);\n break;\n case 111:\n tempStr = inspect(args[++a], {\n ...inspectOptions,\n showHidden: true,\n showProxy: true,\n depth: 4,\n });\n break;\n case 105: {\n const tempInteger = args[++a];\n if (typeof tempInteger === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempInteger);\n }\n else if (typeof tempInteger === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, parseInt(tempStr));\n }\n break;\n }\n case 102: {\n const tempFloat = args[++a];\n if (typeof tempFloat === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, parseInt(tempFloat));\n }\n break;\n }\n case 99:\n a += 1;\n tempStr = \"\";\n break;\n case 37:\n str += first.slice(lastPos, i);\n lastPos = i + 1;\n continue;\n default:\n continue;\n }\n if (lastPos !== i - 1) {\n str += first.slice(lastPos, i - 1);\n }\n str += tempStr;\n lastPos = i + 1;\n }\n else if (nextChar === 37) {\n str += first.slice(lastPos, i);\n lastPos = i + 1;\n }\n }\n }\n if (lastPos !== 0) {\n a++;\n join = \" \";\n if (lastPos < first.length) {\n str += first.slice(lastPos);\n }\n }\n }\n while (a < args.length) {\n const value = args[a];\n str += join;\n str += typeof value !== \"string\" ? inspect(value, inspectOptions) : value;\n join = \" \";\n a++;\n }\n return str;\n}\n","export function safeGetCwd() {\n try {\n const nodeProcess = globalThis?.process;\n if (typeof nodeProcess?.cwd === \"function\") {\n return nodeProcess.cwd();\n }\n }\n catch {\n }\n try {\n const deno = globalThis?.[\"Deno\"];\n if (typeof deno?.cwd === \"function\") {\n return deno.cwd();\n }\n }\n catch {\n }\n return undefined;\n}\nexport function isBrowserEnvironment() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\nexport function consoleSupportsCssStyling() {\n if (!isBrowserEnvironment()) {\n return false;\n }\n const navigatorObj = globalThis?.navigator;\n const userAgent = navigatorObj?.userAgent ?? \"\";\n if (/firefox/i.test(userAgent)) {\n return true;\n }\n const windowObj = globalThis;\n if (windowObj?.CSS?.supports?.(\"color\", \"#000\")) {\n return true;\n }\n return /safari/i.test(userAgent) && !/chrome/i.test(userAgent);\n}\n","import { urlToObject } from \"./urlToObj.js\";\nimport { buildPrettyMeta } from \"./internal/metaFormatting.js\";\nimport { toError, collectErrorCauses } from \"./internal/errorUtils.js\";\nimport { formatTemplate } from \"./formatTemplate.js\";\nimport { formatWithOptions } from \"./internal/util.inspect.polyfill.js\";\nimport { buildStackTrace, findFirstExternalFrameIndex, clampIndex, getDefaultIgnorePatterns } from \"./internal/stackTrace.js\";\nimport { safeGetCwd, consoleSupportsCssStyling, isBrowserEnvironment } from \"./internal/environment.js\";\nimport { jsonStringifyRecursive } from \"./internal/jsonStringifyRecursive.js\";\nexport function createLoggerEnvironment() {\n const runtimeInfo = detectRuntimeInfo();\n const meta = createRuntimeMeta(runtimeInfo);\n const usesBrowserStack = runtimeInfo.name === \"browser\" || runtimeInfo.name === \"worker\";\n const callerIgnorePatterns = usesBrowserStack\n ? [...getDefaultIgnorePatterns(), /node_modules[\\\\/].*tslog/i]\n : [...getDefaultIgnorePatterns(), /node:(?:internal|vm)/i, /\\binternal[\\\\/]/i];\n let cachedCwd;\n const environment = {\n getMeta(logLevelId, logLevelName, stackDepthLevel, hideLogPositionForPerformance, name, parentNames) {\n return Object.assign({}, meta, {\n name,\n parentNames,\n date: new Date(),\n logLevelId,\n logLevelName,\n path: !hideLogPositionForPerformance ? environment.getCallerStackFrame(stackDepthLevel) : undefined,\n });\n },\n getCallerStackFrame(stackDepthLevel, error = new Error()) {\n const frames = buildStackTrace(error, (line) => parseStackLine(line));\n if (frames.length === 0) {\n return {};\n }\n const autoIndex = findFirstExternalFrameIndex(frames, callerIgnorePatterns);\n const useManualIndex = Number.isFinite(stackDepthLevel) && stackDepthLevel >= 0;\n const resolvedIndex = useManualIndex ? clampIndex(stackDepthLevel, frames.length) : clampIndex(autoIndex, frames.length);\n return frames[resolvedIndex] ?? {};\n },\n getErrorTrace(error) {\n return buildStackTrace(error, (line) => parseStackLine(line));\n },\n isError(value) {\n return isNativeError(value);\n },\n isBuffer(value) {\n return typeof Buffer !== \"undefined\" && typeof Buffer.isBuffer === \"function\" ? Buffer.isBuffer(value) : false;\n },\n prettyFormatLogObj(maskedArgs, settings) {\n return maskedArgs.reduce((result, arg) => {\n if (environment.isError(arg)) {\n result.errors.push(environment.prettyFormatErrorObj(arg, settings));\n }\n else {\n result.args.push(arg);\n }\n return result;\n }, { args: [], errors: [] });\n },\n prettyFormatErrorObj(error, settings) {\n const stackLines = formatStackFrames(environment.getErrorTrace(error), settings);\n const causeSections = collectErrorCauses(error).map((cause, index) => {\n const header = `Caused by (${index + 1}): ${cause.name ?? \"Error\"}${cause.message ? `: ${cause.message}` : \"\"}`;\n const frames = formatStackFrames(buildStackTrace(cause, (line) => parseStackLine(line)), settings);\n return [header, ...frames].join(\"\\n\");\n });\n const placeholderValuesError = {\n errorName: ` ${error.name} `,\n errorMessage: formatErrorMessage(error),\n errorStack: [...stackLines, ...causeSections].join(\"\\n\"),\n };\n return formatTemplate(settings, settings.prettyErrorTemplate, placeholderValuesError);\n },\n transportFormatted(logMetaMarkup, logArgs, logErrors, logMeta, settings) {\n const prettyLogs = settings.stylePrettyLogs !== false;\n const logErrorsStr = (logErrors.length > 0 && logArgs.length > 0 ? \"\\n\" : \"\") + logErrors.join(\"\\n\");\n const sanitizedMetaMarkup = stripAnsi(logMetaMarkup);\n const metaMarkupForText = prettyLogs ? logMetaMarkup : sanitizedMetaMarkup;\n if (shouldUseCss(prettyLogs)) {\n settings.prettyInspectOptions.colors = false;\n const formattedArgs = formatWithOptionsSafe(settings.prettyInspectOptions, logArgs);\n const cssMeta = logMeta != null ? buildCssMetaOutput(settings, logMeta) : { text: sanitizedMetaMarkup, styles: [] };\n const hasCssMeta = cssMeta.text.length > 0 && cssMeta.styles.length > 0;\n const metaOutput = hasCssMeta ? cssMeta.text : sanitizedMetaMarkup;\n const output = metaOutput + formattedArgs + logErrorsStr;\n if (hasCssMeta) {\n console.log(output, ...cssMeta.styles);\n }\n else {\n console.log(output);\n }\n return;\n }\n settings.prettyInspectOptions.colors = prettyLogs;\n const formattedArgs = formatWithOptionsSafe(settings.prettyInspectOptions, logArgs);\n console.log(metaMarkupForText + formattedArgs + logErrorsStr);\n },\n transportJSON(json) {\n console.log(jsonStringifyRecursive(json));\n },\n };\n if (getNodeEnv() === \"test\") {\n environment.__resetWorkingDirectoryCacheForTests = () => {\n cachedCwd = undefined;\n };\n }\n return environment;\n function parseStackLine(line) {\n return usesBrowserStack ? parseBrowserStackLine(line) : parseServerStackLine(line);\n }\n function parseServerStackLine(rawLine) {\n if (typeof rawLine !== \"string\" || rawLine.length === 0) {\n return undefined;\n }\n const trimmedLine = rawLine.trim();\n if (!trimmedLine.includes(\" at \") && !trimmedLine.startsWith(\"at \")) {\n return undefined;\n }\n const line = trimmedLine.replace(/^at\\s+/, \"\");\n let method;\n let location = line;\n const methodMatch = line.match(/^(.*?)\\s+\\((.*)\\)$/);\n if (methodMatch) {\n method = methodMatch[1];\n location = methodMatch[2];\n }\n const sanitizedLocation = location.replace(/^\\(/, \"\").replace(/\\)$/, \"\");\n const withoutQuery = sanitizedLocation.replace(/\\?.*$/, \"\");\n let fileLine;\n let fileColumn;\n let filePathCandidate = withoutQuery;\n const segments = withoutQuery.split(\":\");\n if (segments.length >= 3 && /^\\d+$/.test(segments[segments.length - 1] ?? \"\")) {\n fileColumn = segments.pop();\n fileLine = segments.pop();\n filePathCandidate = segments.join(\":\");\n }\n else if (segments.length >= 2 && /^\\d+$/.test(segments[segments.length - 1] ?? \"\")) {\n fileLine = segments.pop();\n filePathCandidate = segments.join(\":\");\n }\n let normalizedPath = filePathCandidate.replace(/^file:\\/\\//, \"\");\n const cwd = getWorkingDirectory();\n if (cwd != null && normalizedPath.startsWith(cwd)) {\n normalizedPath = normalizedPath.slice(cwd.length);\n normalizedPath = normalizedPath.replace(/^[\\\\/]/, \"\");\n }\n if (normalizedPath.length === 0) {\n normalizedPath = filePathCandidate;\n }\n const normalizedPathWithoutLine = normalizeFilePath(normalizedPath);\n const effectivePath = normalizedPathWithoutLine.length > 0 ? normalizedPathWithoutLine : normalizedPath;\n const pathSegments = effectivePath.split(/\\\\|\\//);\n const fileName = pathSegments[pathSegments.length - 1];\n const fileNameWithLine = fileName && fileLine ? `${fileName}:${fileLine}` : undefined;\n const filePathWithLine = effectivePath && fileLine ? `${effectivePath}:${fileLine}` : undefined;\n return {\n fullFilePath: sanitizedLocation,\n fileName,\n fileNameWithLine,\n fileColumn,\n fileLine,\n filePath: effectivePath,\n filePathWithLine,\n method,\n };\n }\n function parseBrowserStackLine(line) {\n const href = globalThis.location?.origin;\n if (line == null) {\n return undefined;\n }\n const match = line.match(BROWSER_PATH_REGEX);\n if (!match) {\n return undefined;\n }\n const filePath = match[1]?.replace(/\\?.*$/, \"\");\n if (filePath == null) {\n return undefined;\n }\n const pathParts = filePath.split(\"/\");\n const fileLine = match[2];\n const fileColumn = match[3];\n const fileName = pathParts[pathParts.length - 1];\n return {\n fullFilePath: href ? `${href}${filePath}` : filePath,\n fileName,\n fileNameWithLine: fileName && fileLine ? `${fileName}:${fileLine}` : undefined,\n fileColumn,\n fileLine,\n filePath,\n filePathWithLine: fileLine ? `${filePath}:${fileLine}` : undefined,\n method: undefined,\n };\n }\n function formatStackFrames(frames, settings) {\n return frames.map((stackFrame) => formatTemplate(settings, settings.prettyErrorStackTemplate, { ...stackFrame }, true));\n }\n function formatErrorMessage(error) {\n return Object.getOwnPropertyNames(error)\n .filter((key) => key !== \"stack\" && key !== \"cause\")\n .reduce((result, key) => {\n const value = error[key];\n if (typeof value === \"function\") {\n return result;\n }\n result.push(String(value));\n return result;\n }, [])\n .join(\", \");\n }\n function shouldUseCss(prettyLogs) {\n return prettyLogs && (runtimeInfo.name === \"browser\" || runtimeInfo.name === \"worker\") && consoleSupportsCssStyling();\n }\n function stripAnsi(value) {\n return value.replace(ANSI_REGEX, \"\");\n }\n function buildCssMetaOutput(settings, metaValue) {\n if (metaValue == null) {\n return { text: \"\", styles: [] };\n }\n const { template, placeholders } = buildPrettyMeta(settings, metaValue);\n const parts = [];\n const styles = [];\n let lastIndex = 0;\n const placeholderRegex = /{{(.+?)}}/g;\n let match;\n while ((match = placeholderRegex.exec(template)) != null) {\n if (match.index > lastIndex) {\n parts.push(template.slice(lastIndex, match.index));\n }\n const key = match[1];\n const rawValue = placeholders[key] != null ? String(placeholders[key]) : \"\";\n const tokens = collectStyleTokens(settings.prettyLogStyles?.[key], rawValue);\n const css = tokensToCss(tokens);\n if (css.length > 0) {\n parts.push(`%c${rawValue}%c`);\n styles.push(css, \"\");\n }\n else {\n parts.push(rawValue);\n }\n lastIndex = placeholderRegex.lastIndex;\n }\n if (lastIndex < template.length) {\n parts.push(template.slice(lastIndex));\n }\n return {\n text: parts.join(\"\"),\n styles,\n };\n }\n function collectStyleTokens(style, value) {\n if (style == null) {\n return [];\n }\n if (typeof style === \"string\") {\n return [style];\n }\n if (Array.isArray(style)) {\n return style.flatMap((token) => collectStyleTokens(token, value));\n }\n if (typeof style === \"object\") {\n const normalizedValue = value.trim();\n const nextStyle = style[normalizedValue] ?? style[\"*\"];\n if (nextStyle == null) {\n return [];\n }\n return collectStyleTokens(nextStyle, value);\n }\n return [];\n }\n function tokensToCss(tokens) {\n const seen = new Set();\n const cssParts = [];\n for (const token of tokens) {\n const css = styleTokenToCss(token);\n if (css != null && css.length > 0 && !seen.has(css)) {\n seen.add(css);\n cssParts.push(css);\n }\n }\n return cssParts.join(\"; \");\n }\n function styleTokenToCss(token) {\n const color = COLOR_TOKENS[token];\n if (color != null) {\n return `color: ${color}`;\n }\n const background = BACKGROUND_TOKENS[token];\n if (background != null) {\n return `background-color: ${background}`;\n }\n switch (token) {\n case \"bold\":\n return \"font-weight: bold\";\n case \"dim\":\n return \"opacity: 0.75\";\n case \"italic\":\n return \"font-style: italic\";\n case \"underline\":\n return \"text-decoration: underline\";\n case \"overline\":\n return \"text-decoration: overline\";\n case \"inverse\":\n return \"filter: invert(1)\";\n case \"hidden\":\n return \"visibility: hidden\";\n case \"strikethrough\":\n return \"text-decoration: line-through\";\n default:\n return undefined;\n }\n }\n function getWorkingDirectory() {\n if (cachedCwd === undefined) {\n cachedCwd = safeGetCwd() ?? null;\n }\n return cachedCwd ?? undefined;\n }\n function shouldCaptureHostname() {\n return runtimeInfo.name === \"node\" || runtimeInfo.name === \"deno\" || runtimeInfo.name === \"bun\";\n }\n function shouldCaptureRuntimeVersion() {\n return runtimeInfo.name === \"node\" || runtimeInfo.name === \"deno\" || runtimeInfo.name === \"bun\";\n }\n function createRuntimeMeta(info) {\n if (info.name === \"browser\" || info.name === \"worker\") {\n return {\n runtime: info.name,\n browser: info.userAgent,\n };\n }\n const metaStatic = {\n runtime: info.name,\n };\n if (shouldCaptureRuntimeVersion()) {\n metaStatic.runtimeVersion = info.version ?? \"unknown\";\n }\n if (shouldCaptureHostname()) {\n metaStatic.hostname = info.hostname ?? \"unknown\";\n }\n return metaStatic;\n }\n function formatWithOptionsSafe(options, args) {\n try {\n return formatWithOptions(options, ...args);\n }\n catch {\n return args.map(stringifyFallback).join(\" \");\n }\n }\n function stringifyFallback(value) {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n }\n catch {\n return String(value);\n }\n }\n function normalizeFilePath(value) {\n if (typeof value !== \"string\" || value.length === 0) {\n return value;\n }\n const replaced = value.replace(/\\\\+/g, \"\\\\\").replace(/\\\\/g, \"/\");\n const hasRootDoubleSlash = replaced.startsWith(\"//\");\n const hasLeadingSlash = replaced.startsWith(\"/\") && !hasRootDoubleSlash;\n const driveMatch = replaced.match(/^[A-Za-z]:/);\n const drivePrefix = driveMatch ? driveMatch[0] : \"\";\n const withoutDrive = drivePrefix ? replaced.slice(drivePrefix.length) : replaced;\n const segments = withoutDrive.split(\"/\");\n const normalizedSegments = [];\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (normalizedSegments.length > 0) {\n normalizedSegments.pop();\n }\n continue;\n }\n normalizedSegments.push(segment);\n }\n let normalized = normalizedSegments.join(\"/\");\n if (hasRootDoubleSlash) {\n normalized = `//${normalized}`;\n }\n else if (hasLeadingSlash) {\n normalized = `/${normalized}`;\n }\n else if (drivePrefix !== \"\") {\n normalized = `${drivePrefix}${normalized.length > 0 ? `/${normalized}` : \"\"}`;\n }\n if (normalized.length === 0) {\n return value;\n }\n return normalized;\n }\n function detectRuntimeInfo() {\n if (isBrowserEnvironment()) {\n const navigatorObj = globalThis.navigator;\n return {\n name: \"browser\",\n userAgent: navigatorObj?.userAgent,\n };\n }\n const globalScope = globalThis;\n if (typeof globalScope.importScripts === \"function\") {\n return {\n name: \"worker\",\n userAgent: globalScope.navigator?.userAgent,\n };\n }\n const globalAny = globalThis;\n if (globalAny.Bun != null) {\n const bunVersion = globalAny.Bun.version;\n return {\n name: \"bun\",\n version: bunVersion != null ? `bun/${bunVersion}` : undefined,\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.Deno != null) {\n const denoHostname = resolveDenoHostname(globalAny.Deno);\n const denoVersion = globalAny.Deno?.version?.deno;\n return {\n name: \"deno\",\n version: denoVersion != null ? `deno/${denoVersion}` : undefined,\n hostname: denoHostname ?? getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.process?.versions?.node != null || globalAny.process?.version != null) {\n return {\n name: \"node\",\n version: globalAny.process?.versions?.node ?? globalAny.process?.version,\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.process != null) {\n return {\n name: \"node\",\n version: \"unknown\",\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n return {\n name: \"unknown\",\n };\n }\n function getEnvironmentHostname(nodeProcess, deno, bun, location) {\n const processHostname = nodeProcess?.env?.HOSTNAME ?? nodeProcess?.env?.HOST ?? nodeProcess?.env?.COMPUTERNAME;\n if (processHostname != null && processHostname.length > 0) {\n return processHostname;\n }\n const bunHostname = bun?.env?.HOSTNAME ?? bun?.env?.HOST ?? bun?.env?.COMPUTERNAME;\n if (bunHostname != null && bunHostname.length > 0) {\n return bunHostname;\n }\n try {\n const denoEnvGet = deno?.env?.get;\n if (typeof denoEnvGet === \"function\") {\n const value = denoEnvGet(\"HOSTNAME\");\n if (value != null && value.length > 0) {\n return value;\n }\n }\n }\n catch {\n }\n if (location?.hostname != null && location.hostname.length > 0) {\n return location.hostname;\n }\n return undefined;\n }\n function resolveDenoHostname(deno) {\n try {\n if (typeof deno?.hostname === \"function\") {\n const value = deno.hostname();\n if (value != null && value.length > 0) {\n return value;\n }\n }\n }\n catch {\n }\n const locationHostname = globalThis.location?.hostname;\n if (locationHostname != null && locationHostname.length > 0) {\n return locationHostname;\n }\n return undefined;\n }\n function getNodeEnv() {\n const globalProcess = globalThis?.process;\n return globalProcess?.env?.NODE_ENV;\n }\n function isNativeError(value) {\n if (value instanceof Error) {\n return true;\n }\n if (value != null && typeof value === \"object\") {\n const objectTag = Object.prototype.toString.call(value);\n if (/\\[object .*Error\\]/.test(objectTag)) {\n return true;\n }\n const name = value.name;\n if (typeof name === \"string\" && name.endsWith(\"Error\")) {\n return true;\n }\n }\n return false;\n }\n}\nconst ANSI_REGEX = /\\u001b\\[[0-9;]*m/g;\nconst COLOR_TOKENS = {\n black: \"#000000\",\n red: \"#ef5350\",\n green: \"#66bb6a\",\n yellow: \"#fdd835\",\n blue: \"#42a5f5\",\n magenta: \"#ab47bc\",\n cyan: \"#26c6da\",\n white: \"#fafafa\",\n blackBright: \"#424242\",\n redBright: \"#ff7043\",\n greenBright: \"#81c784\",\n yellowBright: \"#ffe082\",\n blueBright: \"#64b5f6\",\n magentaBright: \"#ce93d8\",\n cyanBright: \"#4dd0e1\",\n whiteBright: \"#ffffff\",\n};\nconst BACKGROUND_TOKENS = {\n bgBlack: \"#000000\",\n bgRed: \"#ef5350\",\n bgGreen: \"#66bb6a\",\n bgYellow: \"#fdd835\",\n bgBlue: \"#42a5f5\",\n bgMagenta: \"#ab47bc\",\n bgCyan: \"#26c6da\",\n bgWhite: \"#fafafa\",\n bgBlackBright: \"#424242\",\n bgRedBright: \"#ff7043\",\n bgGreenBright: \"#81c784\",\n bgYellowBright: \"#ffe082\",\n bgBlueBright: \"#64b5f6\",\n bgMagentaBright: \"#ce93d8\",\n bgCyanBright: \"#4dd0e1\",\n bgWhiteBright: \"#ffffff\",\n};\nconst BROWSER_PATH_REGEX = /(?:(?:file|https?|global code|[^@]+)@)?(?:file:)?((?:\\/[^:/]+){2,})(?::(\\d+))?(?::(\\d+))?/;\nconst runtime = createLoggerEnvironment();\nexport const loggerEnvironment = runtime;\nexport * from \"./interfaces.js\";\nexport class BaseLogger {\n constructor(settings, logObj, stackDepthLevel = Number.NaN) {\n this.logObj = logObj;\n this.stackDepthLevel = stackDepthLevel;\n this.runtime = runtime;\n this.maxErrorCauseDepth = 5;\n this.settings = {\n type: settings?.type ?? \"pretty\",\n name: settings?.name,\n parentNames: settings?.parentNames,\n minLevel: settings?.minLevel ?? 0,\n argumentsArrayName: settings?.argumentsArrayName,\n hideLogPositionForProduction: settings?.hideLogPositionForProduction ?? false,\n prettyLogTemplate: settings?.prettyLogTemplate ??\n \"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\\t{{logLevelName}}\\t{{filePathWithLine}}{{nameWithDelimiterPrefix}}\\t\",\n prettyErrorTemplate: settings?.prettyErrorTemplate ?? \"\\n{{errorName}} {{errorMessage}}\\nerror stack:\\n{{errorStack}}\",\n prettyErrorStackTemplate: settings?.prettyErrorStackTemplate ?? \" • {{fileName}}\\t{{method}}\\n\\t{{filePathWithLine}}\",\n prettyErrorParentNamesSeparator: settings?.prettyErrorParentNamesSeparator ?? \":\",\n prettyErrorLoggerNameDelimiter: settings?.prettyErrorLoggerNameDelimiter ?? \"\\t\",\n stylePrettyLogs: settings?.stylePrettyLogs ?? true,\n prettyLogTimeZone: settings?.prettyLogTimeZone ?? \"UTC\",\n prettyLogStyles: settings?.prettyLogStyles ?? {\n logLevelName: {\n \"*\": [\"bold\", \"black\", \"bgWhiteBright\", \"dim\"],\n SILLY: [\"bold\", \"white\"],\n TRACE: [\"bold\", \"whiteBright\"],\n DEBUG: [\"bold\", \"green\"],\n INFO: [\"bold\", \"blue\"],\n WARN: [\"bold\", \"yellow\"],\n ERROR: [\"bold\", \"red\"],\n FATAL: [\"bold\", \"redBright\"],\n },\n dateIsoStr: \"white\",\n filePathWithLine: \"white\",\n name: [\"white\", \"bold\"],\n nameWithDelimiterPrefix: [\"white\", \"bold\"],\n nameWithDelimiterSuffix: [\"white\", \"bold\"],\n errorName: [\"bold\", \"bgRedBright\", \"whiteBright\"],\n fileName: [\"yellow\"],\n fileNameWithLine: \"white\",\n },\n prettyInspectOptions: settings?.prettyInspectOptions ?? {\n colors: true,\n compact: false,\n depth: Infinity,\n },\n metaProperty: settings?.metaProperty ?? \"_meta\",\n maskPlaceholder: settings?.maskPlaceholder ?? \"[***]\",\n maskValuesOfKeys: settings?.maskValuesOfKeys ?? [\"password\"],\n maskValuesOfKeysCaseInsensitive: settings?.maskValuesOfKeysCaseInsensitive ?? false,\n maskValuesRegEx: settings?.maskValuesRegEx,\n prefix: [...(settings?.prefix ?? [])],\n attachedTransports: [...(settings?.attachedTransports ?? [])],\n overwrite: {\n mask: settings?.overwrite?.mask,\n toLogObj: settings?.overwrite?.toLogObj,\n addMeta: settings?.overwrite?.addMeta,\n addPlaceholders: settings?.overwrite?.addPlaceholders,\n formatMeta: settings?.overwrite?.formatMeta,\n formatLogObj: settings?.overwrite?.formatLogObj,\n transportFormatted: settings?.overwrite?.transportFormatted,\n transportJSON: settings?.overwrite?.transportJSON,\n },\n };\n this.captureStackForMeta = this._shouldCaptureStack();\n }\n log(logLevelId, logLevelName, ...args) {\n if (logLevelId < this.settings.minLevel) {\n return;\n }\n const resolvedArgs = this._resolveLogArguments(args);\n const logArgs = [...this.settings.prefix, ...resolvedArgs];\n const maskedArgs = this.settings.overwrite?.mask != null\n ? this.settings.overwrite?.mask(logArgs)\n : this.settings.maskValuesOfKeys != null && this.settings.maskValuesOfKeys.length > 0\n ? this._mask(logArgs)\n : logArgs;\n const thisLogObj = this.logObj != null ? this._recursiveCloneAndExecuteFunctions(this.logObj) : undefined;\n const logObj = this.settings.overwrite?.toLogObj != null ? this.settings.overwrite?.toLogObj(maskedArgs, thisLogObj) : this._toLogObj(maskedArgs, thisLogObj);\n const logObjWithMeta = this.settings.overwrite?.addMeta != null\n ? this.settings.overwrite?.addMeta(logObj, logLevelId, logLevelName)\n : this._addMetaToLogObj(logObj, logLevelId, logLevelName);\n const logMeta = logObjWithMeta?.[this.settings.metaProperty];\n let logMetaMarkup;\n let logArgsAndErrorsMarkup = undefined;\n if (this.settings.overwrite?.formatMeta != null) {\n logMetaMarkup = this.settings.overwrite?.formatMeta(logObjWithMeta?.[this.settings.metaProperty]);\n }\n if (this.settings.overwrite?.formatLogObj != null) {\n logArgsAndErrorsMarkup = this.settings.overwrite?.formatLogObj(maskedArgs, this.settings);\n }\n if (this.settings.type === \"pretty\") {\n logMetaMarkup = logMetaMarkup ?? this._prettyFormatLogObjMeta(logObjWithMeta?.[this.settings.metaProperty]);\n logArgsAndErrorsMarkup = logArgsAndErrorsMarkup ?? runtime.prettyFormatLogObj(maskedArgs, this.settings);\n }\n if (logMetaMarkup != null && logArgsAndErrorsMarkup != null) {\n if (this.settings.overwrite?.transportFormatted != null) {\n const transport = this.settings.overwrite.transportFormatted;\n const declaredParams = transport.length;\n if (declaredParams < 4) {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors);\n }\n else if (declaredParams === 4) {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta);\n }\n else {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta, this.settings);\n }\n }\n else {\n runtime.transportFormatted(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta, this.settings);\n }\n }\n else {\n if (this.settings.overwrite?.transportJSON != null) {\n this.settings.overwrite.transportJSON(logObjWithMeta);\n }\n else if (this.settings.type !== \"hidden\") {\n runtime.transportJSON(logObjWithMeta);\n }\n }\n if (this.settings.attachedTransports != null && this.settings.attachedTransports.length > 0) {\n this.settings.attachedTransports.forEach((transportLogger) => {\n transportLogger(logObjWithMeta);\n });\n }\n return logObjWithMeta;\n }\n attachTransport(transportLogger) {\n this.settings.attachedTransports.push(transportLogger);\n }\n getSubLogger(settings, logObj) {\n const subLoggerSettings = {\n ...this.settings,\n ...settings,\n parentNames: this.settings?.parentNames != null && this.settings?.name != null\n ? [...this.settings.parentNames, this.settings.name]\n : this.settings?.name != null\n ? [this.settings.name]\n : undefined,\n prefix: [...this.settings.prefix, ...(settings?.prefix ?? [])],\n };\n const subLogger = new this.constructor(subLoggerSettings, logObj ?? this.logObj, this.stackDepthLevel);\n return subLogger;\n }\n _mask(args) {\n const maskKeys = this._getMaskKeys();\n return args?.map((arg) => {\n return this._recursiveCloneAndMaskValuesOfKeys(arg, maskKeys);\n });\n }\n _getMaskKeys() {\n const maskKeys = this.settings.maskValuesOfKeys ?? [];\n const signature = maskKeys.map(String).join(\"|\");\n if (this.settings.maskValuesOfKeysCaseInsensitive === true) {\n if (this.maskKeysCache?.source === maskKeys && this.maskKeysCache.caseInsensitive === true && this.maskKeysCache.signature === signature) {\n return this.maskKeysCache.normalized;\n }\n const normalized = maskKeys.map((key) => (typeof key === \"string\" ? key.toLowerCase() : String(key).toLowerCase()));\n this.maskKeysCache = {\n source: maskKeys,\n caseInsensitive: true,\n normalized,\n signature,\n };\n return normalized;\n }\n this.maskKeysCache = {\n source: maskKeys,\n caseInsensitive: false,\n normalized: maskKeys,\n signature,\n };\n return maskKeys;\n }\n _resolveLogArguments(args) {\n if (args.length === 1 && typeof args[0] === \"function\") {\n const candidate = args[0];\n if (candidate.length === 0) {\n const result = candidate();\n return Array.isArray(result) ? result : [result];\n }\n }\n return args;\n }\n _recursiveCloneAndMaskValuesOfKeys(source, keys, seen = []) {\n if (seen.includes(source)) {\n return { ...source };\n }\n if (typeof source === \"object\" && source !== null) {\n seen.push(source);\n }\n if (runtime.isError(source) || runtime.isBuffer(source)) {\n return source;\n }\n else if (source instanceof Map) {\n return new Map(source);\n }\n else if (source instanceof Set) {\n return new Set(source);\n }\n else if (Array.isArray(source)) {\n return source.map((item) => this._recursiveCloneAndMaskValuesOfKeys(item, keys, seen));\n }\n else if (source instanceof Date) {\n return new Date(source.getTime());\n }\n else if (source instanceof URL) {\n return urlToObject(source);\n }\n else if (source !== null && typeof source === \"object\") {\n const baseObject = runtime.isError(source) ? this._cloneError(source) : Object.create(Object.getPrototypeOf(source));\n return Object.getOwnPropertyNames(source).reduce((o, prop) => {\n const lookupKey = this.settings?.maskValuesOfKeysCaseInsensitive !== true\n ? prop\n : typeof prop === \"string\"\n ? prop.toLowerCase()\n : String(prop).toLowerCase();\n o[prop] = keys.includes(lookupKey)\n ? this.settings.maskPlaceholder\n : (() => {\n try {\n return this._recursiveCloneAndMaskValuesOfKeys(source[prop], keys, seen);\n }\n catch {\n return null;\n }\n })();\n return o;\n }, baseObject);\n }\n else {\n if (typeof source === \"string\") {\n let modifiedSource = source;\n for (const regEx of this.settings?.maskValuesRegEx || []) {\n modifiedSource = modifiedSource.replace(regEx, this.settings?.maskPlaceholder || \"\");\n }\n return modifiedSource;\n }\n return source;\n }\n }\n _recursiveCloneAndExecuteFunctions(source, seen = []) {\n if (this.isObjectOrArray(source) && seen.includes(source)) {\n return this.shallowCopy(source);\n }\n if (this.isObjectOrArray(source)) {\n seen.push(source);\n }\n if (Array.isArray(source)) {\n return source.map((item) => this._recursiveCloneAndExecuteFunctions(item, seen));\n }\n else if (source instanceof Date) {\n return new Date(source.getTime());\n }\n else if (this.isObject(source)) {\n return Object.getOwnPropertyNames(source).reduce((o, prop) => {\n const descriptor = Object.getOwnPropertyDescriptor(source, prop);\n if (descriptor) {\n Object.defineProperty(o, prop, descriptor);\n const value = source[prop];\n o[prop] = typeof value === \"function\" ? value() : this._recursiveCloneAndExecuteFunctions(value, seen);\n }\n return o;\n }, Object.create(Object.getPrototypeOf(source)));\n }\n else {\n return source;\n }\n }\n isObjectOrArray(value) {\n return typeof value === \"object\" && value !== null;\n }\n isObject(value) {\n return typeof value === \"object\" && !Array.isArray(value) && value !== null;\n }\n shallowCopy(source) {\n if (Array.isArray(source)) {\n return [...source];\n }\n else {\n return { ...source };\n }\n }\n _toLogObj(args, clonedLogObj = {}) {\n args = args?.map((arg) => (runtime.isError(arg) ? this._toErrorObject(arg) : arg));\n if (this.settings.argumentsArrayName == null) {\n if (args.length === 1 && !Array.isArray(args[0]) && runtime.isBuffer(args[0]) !== true && !(args[0] instanceof Date)) {\n clonedLogObj = typeof args[0] === \"object\" && args[0] != null ? { ...args[0], ...clonedLogObj } : { 0: args[0], ...clonedLogObj };\n }\n else {\n clonedLogObj = { ...clonedLogObj, ...args };\n }\n }\n else {\n clonedLogObj = {\n ...clonedLogObj,\n [this.settings.argumentsArrayName]: args,\n };\n }\n return clonedLogObj;\n }\n _cloneError(error) {\n const cloned = new error.constructor();\n Object.getOwnPropertyNames(error).forEach((key) => {\n cloned[key] = error[key];\n });\n return cloned;\n }\n _toErrorObject(error, depth = 0, seen = new Set()) {\n if (!seen.has(error)) {\n seen.add(error);\n }\n const errorObject = {\n nativeError: error,\n name: error.name ?? \"Error\",\n message: error.message,\n stack: runtime.getErrorTrace(error),\n };\n if (depth >= this.maxErrorCauseDepth) {\n return errorObject;\n }\n const causeValue = error.cause;\n if (causeValue != null) {\n const normalizedCause = toError(causeValue);\n if (!seen.has(normalizedCause)) {\n errorObject.cause = this._toErrorObject(normalizedCause, depth + 1, seen);\n }\n }\n return errorObject;\n }\n _addMetaToLogObj(logObj, logLevelId, logLevelName) {\n return {\n ...logObj,\n [this.settings.metaProperty]: runtime.getMeta(logLevelId, logLevelName, this.stackDepthLevel, !this.captureStackForMeta, this.settings.name, this.settings.parentNames),\n };\n }\n _shouldCaptureStack() {\n if (this.settings.hideLogPositionForProduction) {\n return false;\n }\n if (this.settings.type === \"json\") {\n return true;\n }\n const template = this.settings.prettyLogTemplate ?? \"\";\n const stackPlaceholders = /{{\\s*(file(Name|Path|Line|PathWithLine|NameWithLine)|fullFilePath)\\s*}}/;\n if (stackPlaceholders.test(template)) {\n return true;\n }\n return false;\n }\n _prettyFormatLogObjMeta(logObjMeta) {\n return buildPrettyMeta(this.settings, logObjMeta).text;\n }\n}\n","import { BaseLogger } from \"./BaseLogger.js\";\nexport * from \"./interfaces.js\";\nexport * from \"./BaseLogger.js\";\nexport class Logger extends BaseLogger {\n constructor(settings, logObj) {\n const isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n const normalizedSettings = { ...(settings ?? {}) };\n if (isBrowser) {\n normalizedSettings.stylePrettyLogs = settings?.stylePrettyLogs ?? true;\n }\n super(normalizedSettings, logObj, Number.NaN);\n }\n log(logLevelId, logLevelName, ...args) {\n return super.log(logLevelId, logLevelName, ...args);\n }\n silly(...args) {\n return super.log(0, \"SILLY\", ...args);\n }\n trace(...args) {\n return super.log(1, \"TRACE\", ...args);\n }\n debug(...args) {\n return super.log(2, \"DEBUG\", ...args);\n }\n info(...args) {\n return super.log(3, \"INFO\", ...args);\n }\n warn(...args) {\n return super.log(4, \"WARN\", ...args);\n }\n error(...args) {\n return super.log(5, \"ERROR\", ...args);\n }\n fatal(...args) {\n return super.log(6, \"FATAL\", ...args);\n }\n getSubLogger(settings, logObj) {\n return super.getSubLogger(settings, logObj);\n }\n}\n","import { loadUnifiedConfig, saveUnifiedConfig } from \"../unified-config.js\";\nimport type { SyncFilter, SyncTarget } from \"./types.js\";\n\nexport interface SyncConfig {\n targets: SyncTarget[];\n filter?: SyncFilter;\n}\n\nexport function loadSyncConfig(): SyncConfig {\n const cfg = loadUnifiedConfig();\n return { targets: cfg.sync.targets, filter: cfg.sync.filter };\n}\n\nexport function saveSyncConfig(syncCfg: SyncConfig): void {\n const cfg = loadUnifiedConfig();\n cfg.sync.targets = syncCfg.targets;\n cfg.sync.filter = syncCfg.filter;\n saveUnifiedConfig(cfg);\n}\n\nexport function addTarget(target: SyncTarget): void {\n const cfg = loadUnifiedConfig();\n const existing = cfg.sync.targets.findIndex((t) => t.name === target.name);\n if (existing >= 0) {\n cfg.sync.targets[existing] = target;\n } else {\n cfg.sync.targets.push(target);\n }\n saveUnifiedConfig(cfg);\n}\n\nexport function removeTarget(name: string): boolean {\n const cfg = loadUnifiedConfig();\n const before = cfg.sync.targets.length;\n cfg.sync.targets = cfg.sync.targets.filter((t) => t.name !== name);\n if (cfg.sync.targets.length === before) return false;\n saveUnifiedConfig(cfg);\n return true;\n}\n\nexport function listTargets(): SyncTarget[] {\n return loadUnifiedConfig().sync.targets;\n}\n","declare const __PANOPTICON_VERSION__: string;\n\nimport { execSync } from \"node:child_process\";\nimport { getDb } from \"../db/schema.js\";\nimport { log } from \"../log.js\";\nimport { captureException } from \"../sentry.js\";\nimport { postSync } from \"./post.js\";\nimport { readSessionsByIds, SESSION_READERS } from \"./reader.js\";\nimport { TABLE_SYNC_REGISTRY } from \"./registry.js\";\nimport type {\n SyncFilter,\n SyncHandle,\n SyncOptions,\n SyncTarget,\n} from \"./types.js\";\nimport { readWatermark, watermarkKey, writeWatermark } from \"./watermark.js\";\n\nconst DEFAULT_BATCH_SIZE = 2000;\nconst DEFAULT_POST_BATCH_SIZE = 100;\nconst DEFAULT_IDLE_MS = 30_000;\nconst DEFAULT_CATCHUP_MS = 100;\nconst MAX_SESSIONS_PER_TICK = 10;\n\n/** Maps SESSION_READERS table name → target_session_sync column name. */\nconst WM_COLUMNS = {\n messages: \"wm_messages\",\n tool_calls: \"wm_tool_calls\",\n scanner_turns: \"wm_scanner_turns\",\n scanner_events: \"wm_scanner_events\",\n hook_events: \"wm_hook_events\",\n otel_logs: \"wm_otel_logs\",\n otel_metrics: \"wm_otel_metrics\",\n otel_spans: \"wm_otel_spans\",\n} as const;\n\nfunction matchesGlob(value: string, pattern: string): boolean {\n if (pattern === \"*/*\") return true;\n if (pattern.endsWith(\"/*\")) {\n return value.startsWith(pattern.slice(0, -1));\n }\n return value === pattern;\n}\n\n/** Returns true if the repository passes the include/exclude filter. */\nfunction repoMatchesFilter(repository: string, filter?: SyncFilter): boolean {\n if (!filter) return true;\n if (filter.excludeRepos?.some((p) => matchesGlob(repository, p)))\n return false;\n if (filter.includeRepos?.length) {\n if (!filter.includeRepos.some((p) => matchesGlob(repository, p)))\n return false;\n }\n return true;\n}\n\n/** Set of session IDs that have repo attribution matching the filter. */\nfunction buildSyncableSessionIds(opts: SyncOptions): Set<string> | null {\n const requireRepo = opts.filter?.requireRepo ?? true;\n if (!requireRepo && !opts.filter?.includeRepos?.length) return null; // no filtering\n\n const db = getDb();\n const rows = db\n .prepare(\n \"SELECT DISTINCT sr.session_id, sr.repository FROM session_repositories sr\",\n )\n .all() as Array<{ session_id: string; repository: string }>;\n\n const sessionIds = new Set<string>();\n for (const row of rows) {\n if (!repoMatchesFilter(row.repository, opts.filter)) continue;\n sessionIds.add(row.session_id);\n }\n\n return sessionIds;\n}\n\nconst TOKEN_CACHE_TTL_MS = 5 * 60 * 1000;\nconst tokenCache = new Map<string, { token: string; expiresAt: number }>();\n\nfunction resolveToken(target: SyncTarget): string | undefined {\n if (target.token) return target.token;\n if (!target.tokenCommand) return undefined;\n\n const cached = tokenCache.get(target.name);\n if (cached && Date.now() < cached.expiresAt) return cached.token;\n\n try {\n const token = execSync(target.tokenCommand, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (token) {\n tokenCache.set(target.name, {\n token,\n expiresAt: Date.now() + TOKEN_CACHE_TTL_MS,\n });\n }\n return token || undefined;\n } catch (err) {\n log.sync.error(\n `tokenCommand failed for \"${target.name}\": ${err instanceof Error ? err.message : err}`,\n );\n return undefined;\n }\n}\n\nexport function createSyncLoop(opts: SyncOptions): SyncHandle {\n const batchSize = opts.batchSize ?? DEFAULT_BATCH_SIZE;\n const postBatchSize = opts.postBatchSize ?? DEFAULT_POST_BATCH_SIZE;\n const idleMs = opts.idleIntervalMs ?? DEFAULT_IDLE_MS;\n const catchUpMs = opts.catchUpIntervalMs ?? DEFAULT_CATCHUP_MS;\n\n const panopticonVersion =\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"dev\";\n\n function resolveHeaders(target: SyncTarget): Record<string, string> {\n const headers: Record<string, string> = { ...target.headers };\n headers[\"X-Panopticon-Version\"] = panopticonVersion;\n const token = resolveToken(target);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n }\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let syncing = false;\n let stopping = false;\n\n function scheduleNext(hadWork: boolean): void {\n if (stopping) return;\n const delay = hadWork ? catchUpMs : idleMs;\n timer = setTimeout(() => {\n tick().catch((err) => log.sync.error(`Tick error: ${err}`));\n }, delay);\n if (!opts.keepAlive && timer.unref) {\n timer.unref();\n }\n }\n\n // ── Phase 1: Sync sessions (compared against target_session_sync) ────────\n\n async function syncSessions(\n target: SyncTarget,\n syncableSessionIds: Set<string> | null,\n ): Promise<boolean> {\n const db = getDb();\n const requireRepo = opts.filter?.requireRepo ?? true;\n\n // SQL-level filter to skip sessions with no repository attribution.\n // Without this, a large backlog of no-repo sessions consumes every LIMIT\n // slot in the \"new sessions\" branch and starves the \"updated sessions\"\n // branch indefinitely (so per-session watermarks for confirmed sessions\n // can never advance).\n const repoExists = requireRepo\n ? \"AND EXISTS (SELECT 1 FROM session_repositories sr WHERE sr.session_id = s.session_id)\"\n : \"\";\n\n // Find sessions that need syncing: new (no tss entry) or updated\n // (sessions.sync_seq advanced past tss.sync_seq).\n //\n // These run as two independent queries with their own LIMITs (rather than\n // UNION ALL with one shared LIMIT) so neither branch can starve the other.\n const newRows = db\n .prepare(\n `SELECT s.session_id FROM sessions s\n LEFT JOIN target_session_sync tss\n ON s.session_id = tss.session_id AND tss.target = ?\n WHERE tss.session_id IS NULL ${repoExists}\n LIMIT ?`,\n )\n .all(target.name, batchSize) as Array<{ session_id: string }>;\n\n const updatedRows = db\n .prepare(\n `SELECT s.session_id FROM sessions s\n JOIN target_session_sync tss\n ON s.session_id = tss.session_id AND tss.target = ?\n WHERE tss.confirmed = 1 AND s.sync_seq > tss.sync_seq ${repoExists}\n LIMIT ?`,\n )\n .all(target.name, batchSize) as Array<{ session_id: string }>;\n\n if (newRows.length === 0 && updatedRows.length === 0) return false;\n\n // In-memory filter for includeRepos/excludeRepos globs (requireRepo is\n // already enforced in SQL above).\n let sessionIds = [\n ...newRows.map((r) => r.session_id),\n ...updatedRows.map((r) => r.session_id),\n ];\n if (syncableSessionIds) {\n sessionIds = sessionIds.filter((id) => syncableSessionIds.has(id));\n }\n\n const hasMore =\n newRows.length >= batchSize || updatedRows.length >= batchSize;\n\n if (sessionIds.length === 0) return hasMore;\n\n const rows = readSessionsByIds(sessionIds);\n if (rows.length > 0) {\n log.sync.info(`sessions: ${rows.length} sessions to sync`);\n\n for (let j = 0; j < rows.length; j += postBatchSize) {\n const batch = rows.slice(j, j + postBatchSize);\n const response = await postSync(\n `${target.url}/v1/sync`,\n { table: \"sessions\", rows: batch },\n resolveHeaders(target),\n );\n\n const accepted = response.accepted;\n if (Array.isArray(accepted)) {\n recordConfirmedSessions(accepted as string[], target.name);\n }\n }\n }\n\n return hasMore;\n }\n\n // ── Phase 2: Sync dependent data (per-session, gated by confirmed) ───────\n\n async function syncSessionData(target: SyncTarget): Promise<boolean> {\n const db = getDb();\n\n // Clean up orphaned entries (session deleted from local DB)\n db.prepare(\n `DELETE FROM target_session_sync\n WHERE session_id NOT IN (SELECT session_id FROM sessions)`,\n ).run();\n\n // Get confirmed sessions that have new data (sync_seq > synced_seq)\n const pending = db\n .prepare(\n `SELECT session_id, sync_seq,\n wm_messages, wm_tool_calls, wm_scanner_turns,\n wm_scanner_events, wm_hook_events, wm_otel_logs,\n wm_otel_metrics, wm_otel_spans\n FROM target_session_sync\n WHERE target = ? AND confirmed = 1\n AND sync_seq > synced_seq\n ORDER BY rowid\n LIMIT ?`,\n )\n .all(target.name, MAX_SESSIONS_PER_TICK) as Array<{\n session_id: string;\n sync_seq: number;\n wm_messages: number;\n wm_tool_calls: number;\n wm_scanner_turns: number;\n wm_scanner_events: number;\n wm_hook_events: number;\n wm_otel_logs: number;\n wm_otel_metrics: number;\n wm_otel_spans: number;\n }>;\n\n if (pending.length === 0) return false;\n\n const headers = resolveHeaders(target);\n const url = `${target.url}/v1/sync`;\n\n for (const entry of pending) {\n // Build watermarks from explicit columns\n const wmRow = entry as unknown as Record<string, number>;\n const watermarks: Record<string, number> = {};\n for (const [table, col] of Object.entries(WM_COLUMNS)) {\n watermarks[table] = wmRow[col] ?? 0;\n }\n let anyData = false;\n\n for (const [table, reader] of Object.entries(SESSION_READERS)) {\n // Read and POST in batches, draining until no more rows\n let afterId = watermarks[table] ?? 0;\n for (;;) {\n const { rows, maxId } = reader(entry.session_id, afterId, batchSize);\n if (rows.length === 0) break;\n\n anyData = true;\n\n for (let i = 0; i < rows.length; i += postBatchSize) {\n const batch = rows.slice(i, i + postBatchSize);\n await postSync(url, { table, rows: batch }, headers);\n }\n\n afterId = maxId;\n watermarks[table] = maxId;\n\n if (rows.length < batchSize) break;\n }\n }\n\n // Update watermarks and mark as synced up to cached sync_seq\n db.prepare(\n `UPDATE target_session_sync\n SET wm_messages = ?, wm_tool_calls = ?, wm_scanner_turns = ?,\n wm_scanner_events = ?, wm_hook_events = ?, wm_otel_logs = ?,\n wm_otel_metrics = ?, wm_otel_spans = ?, synced_seq = ?\n WHERE session_id = ? AND target = ?`,\n ).run(\n watermarks.messages,\n watermarks.tool_calls,\n watermarks.scanner_turns,\n watermarks.scanner_events,\n watermarks.hook_events,\n watermarks.otel_logs,\n watermarks.otel_metrics,\n watermarks.otel_spans,\n entry.sync_seq,\n entry.session_id,\n target.name,\n );\n\n if (anyData) {\n log.sync.info(\n `session-sync: synced data for ${entry.session_id} to ${target.name}`,\n );\n }\n }\n\n // Check if more confirmed sessions with new data remain\n const remaining = db\n .prepare(\n `SELECT COUNT(*) as cnt FROM target_session_sync\n WHERE target = ? AND confirmed = 1\n AND sync_seq > synced_seq`,\n )\n .get(target.name) as { cnt: number };\n\n return remaining.cnt > 0;\n }\n\n // ── Phase 3: Sync non-session tables (unchanged) ─────────────────────────\n\n async function syncNonSessionTables(target: SyncTarget): Promise<boolean> {\n let hasMore = false;\n\n for (const desc of TABLE_SYNC_REGISTRY) {\n if (desc.sessionLinked) continue; // handled by Phase 1 and 2\n\n const wmKey = watermarkKey(desc.table, target.name);\n const wm = readWatermark(wmKey);\n const { rows, maxId } = desc.read(wm, batchSize);\n if (rows.length === 0) continue;\n\n // Apply repo filter to repo_config_snapshots\n const filtered =\n desc.table === \"repo_config_snapshots\"\n ? rows.filter((r: unknown) => {\n const row = r as Record<string, unknown>;\n return repoMatchesFilter(row.repository as string, opts.filter);\n })\n : rows;\n\n if (filtered.length > 0) {\n log.sync.info(\n `${desc.table}: ${filtered.length} ${desc.logNoun} (watermark ${wm} → ${maxId})`,\n );\n\n for (let j = 0; j < filtered.length; j += postBatchSize) {\n const batch = filtered.slice(j, j + postBatchSize);\n await postSync(\n `${target.url}/v1/sync`,\n { table: desc.table, rows: batch },\n resolveHeaders(target),\n );\n }\n }\n\n writeWatermark(wmKey, maxId);\n if (rows.length === batchSize) hasMore = true;\n }\n\n return hasMore;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────────────\n\n function recordConfirmedSessions(\n sessionIds: string[],\n targetName: string,\n ): void {\n const db = getDb();\n const upsert = db.prepare(\n `INSERT INTO target_session_sync (session_id, target, confirmed, sync_seq)\n VALUES (?, ?, 1, (SELECT sync_seq FROM sessions WHERE session_id = ?))\n ON CONFLICT(session_id, target) DO UPDATE SET\n confirmed = 1,\n sync_seq = MAX(target_session_sync.sync_seq,\n (SELECT sync_seq FROM sessions WHERE session_id = excluded.session_id))`,\n );\n for (const sessionId of sessionIds) {\n upsert.run(sessionId, targetName, sessionId);\n }\n }\n\n // ── Main loop ────────────────────────────────────────────────────────────\n\n async function runOnce(): Promise<boolean> {\n let hasMore = false;\n\n const syncableSessionIds = buildSyncableSessionIds(opts);\n\n for (const target of opts.targets) {\n try {\n // Phase 1: Sync sessions (repo-filtered, backend confirms)\n if (await syncSessions(target, syncableSessionIds)) hasMore = true;\n\n // Phase 2: Sync dependent data for confirmed sessions\n if (await syncSessionData(target)) hasMore = true;\n\n // Phase 3: Sync non-session tables\n if (await syncNonSessionTables(target)) hasMore = true;\n } catch (err) {\n log.sync.error(\n `Error syncing to ${target.name}: ${err instanceof Error ? err.message : err}`,\n );\n captureException(err, {\n component: \"sync\",\n target: target.name,\n });\n }\n }\n\n return hasMore;\n }\n\n async function tick(): Promise<void> {\n if (syncing || stopping) return;\n syncing = true;\n let hasMore = false;\n try {\n getDb(); // ensure DB is accessible\n hasMore = await runOnce();\n } catch (err) {\n log.sync.error(\n `Cycle error: ${err instanceof Error ? (err.stack ?? err.message) : err}`,\n );\n captureException(err, { component: \"sync\" });\n } finally {\n syncing = false;\n }\n\n if (!stopping) {\n scheduleNext(hasMore);\n }\n }\n\n return {\n start() {\n if (timer || syncing) return;\n stopping = false;\n log.sync.info(\"Starting sync\");\n tick().catch((err) => log.sync.error(`Tick error: ${err}`));\n },\n stop() {\n stopping = true;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n log.sync.info(\"Stopped sync\");\n }\n },\n runOnce,\n };\n}\n","const MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 2000;\nconst REQUEST_TIMEOUT_MS = 30_000;\n\nexport async function postSync(\n url: string,\n body: { table: string; rows: unknown[] },\n headers: Record<string, string>,\n): Promise<Record<string, unknown>> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n REQUEST_TIMEOUT_MS,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const text = await response.text().catch(() => \"\");\n try {\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n }\n\n const status = response.status;\n\n // Don't retry client errors (except 429 rate limit)\n if (status >= 400 && status < 500 && status !== 429) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`HTTP ${status}: ${text}`);\n }\n\n lastError = new Error(`HTTP ${status}`);\n } catch (err) {\n if (\n err instanceof Error &&\n err.message.startsWith(\"HTTP 4\") &&\n !err.message.startsWith(\"HTTP 429\")\n ) {\n throw err;\n }\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n\n if (attempt < MAX_RETRIES) {\n const delay = BASE_DELAY_MS * 2 ** attempt;\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n throw lastError ?? new Error(\"postSync failed\");\n}\n","/**\n * HTTP client for the panopticon server API.\n *\n * Provides typed wrappers around POST /api/tool and POST /api/exec\n * so that CLI and MCP can query the server instead of opening the\n * database directly.\n */\nimport http from \"node:http\";\nimport { config } from \"../config.js\";\nimport type {\n ActivitySummaryResult,\n SearchResult,\n SessionListResult,\n SessionTimelineResult,\n SpendingResult,\n} from \"../types.js\";\n\n// ── Core transport ───────────────────────────────────────────────────────────\n\nfunction post(\n path: string,\n body: unknown,\n timeoutMs: number,\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const json = JSON.stringify(body);\n const req = http.request(\n {\n hostname: config.host,\n port: config.port,\n path,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(json),\n },\n timeout: timeoutMs,\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n reject(\n new Error(\n `Invalid JSON response from server: ${text.slice(0, 200)}`,\n ),\n );\n return;\n }\n if (\n res.statusCode &&\n res.statusCode >= 400 &&\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"error\" in parsed\n ) {\n reject(new Error((parsed as { error: string }).error));\n return;\n }\n resolve(parsed);\n });\n },\n );\n req.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"ECONNREFUSED\") {\n reject(\n new Error(\n \"Panopticon server is not running. Start with: panopticon start\",\n ),\n );\n return;\n }\n reject(err);\n });\n req.on(\"timeout\", () => {\n req.destroy();\n reject(new Error(\"Request to panopticon server timed out\"));\n });\n req.write(json);\n req.end();\n });\n}\n\n// ── Tool calls (read-only) ──────────────────────────────────────────────────\n\nconst TOOL_TIMEOUT = 30_000;\n\nexport function callTool(\n name: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n return post(\"/api/tool\", { name, params }, TOOL_TIMEOUT);\n}\n\nexport function listSessions(opts?: {\n limit?: number;\n since?: string;\n}): Promise<SessionListResult> {\n return callTool(\n \"sessions\",\n opts as Record<string, unknown>,\n ) as Promise<SessionListResult>;\n}\n\nexport function sessionTimeline(opts: {\n sessionId: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): Promise<SessionTimelineResult> {\n return callTool(\n \"timeline\",\n opts as Record<string, unknown>,\n ) as Promise<SessionTimelineResult>;\n}\n\nexport function costBreakdown(opts?: {\n since?: string;\n groupBy?: \"session\" | \"model\" | \"day\";\n}): Promise<SpendingResult> {\n return callTool(\n \"costs\",\n opts as Record<string, unknown>,\n ) as Promise<SpendingResult>;\n}\n\nexport function activitySummary(opts?: {\n since?: string;\n}): Promise<ActivitySummaryResult> {\n return callTool(\n \"summary\",\n opts as Record<string, unknown>,\n ) as Promise<ActivitySummaryResult>;\n}\n\nexport function listPlans(opts?: {\n session_id?: string;\n since?: string;\n limit?: number;\n}): Promise<unknown> {\n return callTool(\"plans\", opts as Record<string, unknown>);\n}\n\nexport function search(opts: {\n query: string;\n eventTypes?: string[];\n since?: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): Promise<SearchResult> {\n return callTool(\n \"search\",\n opts as Record<string, unknown>,\n ) as Promise<SearchResult>;\n}\n\nexport function print(opts: {\n source: \"hook\" | \"otel\" | \"message\";\n id: number;\n}): Promise<unknown> {\n return callTool(\"get\", opts as Record<string, unknown>);\n}\n\nexport function rawQuery(sql: string): Promise<unknown> {\n return callTool(\"query\", { sql });\n}\n\nexport function dbStats(): Promise<unknown> {\n return callTool(\"status\");\n}\n\n// ── Exec calls (write operations, CLI only) ─────────────────────────────────\n\nconst EXEC_TIMEOUT = 60_000;\n\nexport function callExec(\n command: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n return post(\"/api/exec\", { command, params }, EXEC_TIMEOUT);\n}\n\nexport function pruneEstimate(cutoffMs: number): Promise<unknown> {\n return callExec(\"prune\", { cutoffMs, dryRun: true });\n}\n\nexport function pruneExecute(\n cutoffMs: number,\n opts?: { vacuum?: boolean },\n): Promise<unknown> {\n return callExec(\"prune\", { cutoffMs, ...opts });\n}\n\nexport function refreshPricing(): Promise<unknown> {\n return callExec(\"refresh-pricing\");\n}\n\nexport interface ScanResult {\n filesScanned: number;\n newTurns: number;\n summariesUpdated: number;\n}\n\nexport function scan(opts?: { summaries?: boolean }): Promise<ScanResult> {\n return callExec(\"scan\", opts ?? {}) as Promise<ScanResult>;\n}\n\nexport function syncReset(target?: string): Promise<unknown> {\n return callExec(\"sync-reset\", target ? { target } : {});\n}\n\nexport function syncWatermarkGet(\n target: string,\n table?: string,\n): Promise<unknown> {\n return callExec(\"sync-watermark-get\", { target, table });\n}\n\nexport function syncWatermarkSet(\n target: string,\n table: string,\n value: number,\n): Promise<unknown> {\n return callExec(\"sync-watermark-set\", { target, table, value });\n}\n\nexport function syncPending(target: string): Promise<{\n target: string;\n totalPending: number;\n tables: Record<string, { total: number; synced: number; pending: number }>;\n}> {\n return callExec(\"sync-pending\", { target }) as Promise<{\n target: string;\n totalPending: number;\n tables: Record<string, { total: number; synced: number; pending: number }>;\n }>;\n}\n\nexport function syncTargetList(): Promise<unknown> {\n return callExec(\"sync-target-list\");\n}\n\nexport function syncTargetAdd(target: {\n name: string;\n url: string;\n token?: string;\n tokenCommand?: string;\n}): Promise<unknown> {\n return callExec(\"sync-target-add\", target as Record<string, unknown>);\n}\n\nexport function syncTargetRemove(name: string): Promise<unknown> {\n return callExec(\"sync-target-remove\", { name });\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { addTarget, listTargets } from \"@fml-inc/panopticon/sync\";\nimport { printBanner } from \"../banner.js\";\nimport {\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n writeEnvConfig,\n} from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n // At runtime we're in dist/ (tsup bundles into entry point), go up one level\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport async function handleInstall(): Promise<void> {\n const pluginRoot = getPluginRoot();\n console.log(\"Installing fml...\\n\");\n\n // 1. Ensure panopticon is installed globally and up to date\n console.log(\"[1/5] Setting up panopticon...\");\n const { resolvePanopticonBin } = await import(\"../daemon-utils.js\");\n let freshInstall = false;\n const bin = resolvePanopticonBin();\n let needsInstall = !bin;\n if (bin) {\n // Check version — upgrade if below the minimum required by this build\n const MIN_PANOPTICON = \"0.2.2\";\n const vResult = panopticonExec(\"--version\", { timeout: 5_000 });\n const installed = vResult.ok ? vResult.stdout.trim().split(\"+\")[0] : \"0.0.0\";\n if (installed < MIN_PANOPTICON) {\n console.log(` Found panopticon ${installed}, need >=${MIN_PANOPTICON}`);\n needsInstall = true;\n }\n }\n if (needsInstall) {\n console.log(\n bin\n ? \" Upgrading @fml-inc/panopticon...\"\n : \" Installing @fml-inc/panopticon globally...\",\n );\n try {\n execFileSync(\"npm\", [\"install\", \"-g\", \"@fml-inc/panopticon@latest\"], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: \"pipe\",\n });\n freshInstall = true;\n console.log(\" Installed @fml-inc/panopticon\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(` Failed to install panopticon: ${msg}`);\n console.error(\" Install manually: npm install -g @fml-inc/panopticon@latest\");\n }\n }\n // npm postinstall already ran panopticon install for fresh installs;\n // only re-run for existing installs to pick up config changes.\n if (!freshInstall) {\n const result = panopticonExec(\"install\", { timeout: 60_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon install failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n }\n console.log();\n\n // 2. Ensure fml-specific directories exist\n console.log(\"[2/5] Creating fml directories...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n fs.mkdirSync(dir, { recursive: true });\n }\n console.log(` ${FML_DATA_DIR}`);\n console.log(` ${FML_LOG_DIR}\\n`);\n\n // 3. Ensure plugin manifest has the current version\n console.log(\"[3/5] Writing plugin manifest...\");\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = (pkgJson?.version as string) ?? \"0.0.0-dev\";\n const pluginManifestDir = path.join(pluginRoot, \".claude-plugin\");\n fs.mkdirSync(pluginManifestDir, { recursive: true });\n writeJsonFile(path.join(pluginManifestDir, \"plugin.json\"), {\n name: \"fml\",\n version,\n description: \"FML agent tools for Claude Code\",\n mcpServers: {\n fml: {\n command: \"node\",\n args: [\"${CLAUDE_PLUGIN_ROOT}/bin/mcp-server\"],\n },\n },\n });\n console.log(` Version: ${version}\\n`);\n\n // 4. Register fml plugin in local marketplace + Claude Code settings\n console.log(\"[4/5] Setting up fml plugin...\");\n fs.mkdirSync(path.join(MARKETPLACE_DIR, \".claude-plugin\"), {\n recursive: true,\n });\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n if (!plugins.some((p) => p.name === \"fml\")) {\n plugins.push({\n name: \"fml\",\n source: \"./fml\",\n description: \"FML agent tools for Claude Code\",\n });\n manifest.plugins = plugins;\n }\n writeJsonFile(manifestPath, manifest);\n\n // Symlink plugin source into marketplace\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n fs.symlinkSync(pluginRoot, marketplaceLink, \"dir\");\n console.log(` Marketplace: ${MARKETPLACE_DIR}`);\n console.log(` Plugin: ${pluginRoot}`);\n\n // Layer fml-specific settings on top for Claude Code\n const settings = (readJsonFile(CLAUDE_SETTINGS_PATH) ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n settings.extraKnownMarketplaces = settings.extraKnownMarketplaces ?? {};\n settings.extraKnownMarketplaces[\"local-plugins\"] = {\n source: { source: \"directory\", path: MARKETPLACE_DIR },\n };\n settings.enabledPlugins = settings.enabledPlugins ?? {};\n settings.enabledPlugins[\"fml@local-plugins\"] = true;\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Claude settings: ${CLAUDE_SETTINGS_PATH}`);\n\n // Register plugin with Claude Code (install if new, update if existing)\n try {\n try {\n execFileSync(\"claude\", [\"plugin\", \"install\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n } catch {\n execFileSync(\"claude\", [\"plugin\", \"update\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n }\n console.log(\" Plugin registered via Claude Code CLI\");\n } catch {\n console.log(\" warn: claude CLI not found, run 'claude plugin install fml@local-plugins' manually\");\n }\n console.log();\n\n // 5. Auto-configure sync target (best-effort)\n console.log(\"[5/5] Configuring sync target...\");\n const existingTargets = listTargets();\n const existingProd = existingTargets.find((t) => t.url === DEFAULT_SYNC_URL);\n if (existingProd) {\n console.log(` Production target already configured`);\n } else {\n const tokenCommand = resolveSyncTokenCommand();\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n console.log(` Target \"${DEFAULT_TARGET_NAME}\": ${DEFAULT_SYNC_URL}`);\n if (tokenCommand) {\n console.log(` Auth: ${tokenCommand}`);\n } else {\n // No gh and no fml login yet — target is URL-only. `fml login` will\n // back-patch it to `fml sync-token` once the user signs in.\n console.log(\n \" Auth: not configured — run `fml login` to enable sync.\",\n );\n }\n }\n\n // Set active env to the default sync target\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n\n console.log(\"\");\n printBanner();\n console.log(\"Done! Start a new coding session to activate.\\n\");\n console.log(\"\\nNext steps:\");\n console.log(\" fml login Sign in to your FML account\");\n console.log(\" fml org Select organization\");\n console.log(\" fml sync status Check sync status\");\n console.log(\" fml status Verify setup\");\n}\n","import pc from \"picocolors\";\n\nconst LOGO_LINES = [\n \" ▄██▀ ██▄██▄██ ██\",\n \" ██ ██ ██ ██ ██\",\n \"█████ ██ ██ ██\",\n \" ██ ██ ██ ████\",\n \" ▀▀ ▀▀ ▀▀ ▀▀▀▀\",\n];\n\nexport function printBanner(): void {\n console.log(\"\");\n for (let i = 0; i < LOGO_LINES.length; i++) {\n const color = i < 3 ? pc.blue : pc.cyan;\n console.log(\" \" + color(LOGO_LINES[i]));\n }\n console.log(\"\");\n}\n","import { execSync } from \"node:child_process\";\nimport { readTokens } from \"../auth/token-store.js\";\n\nconst TOKEN_TTL_MS = 5 * 60 * 1000;\n\nlet cachedGitHubToken: { value: string; expiresAt: number } | null = null;\n\nexport function resolveGitHubToken(): string | null {\n if (cachedGitHubToken && Date.now() < cachedGitHubToken.expiresAt) {\n return cachedGitHubToken.value;\n }\n\n const envToken = process.env.PANOPTICON_GITHUB_TOKEN;\n if (envToken) {\n cachedGitHubToken = {\n value: envToken,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n return envToken;\n }\n\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (token) {\n cachedGitHubToken = {\n value: token,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n }\n return token || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Pick the best `tokenCommand` to write onto a sync target, given what's\n * currently available on this machine:\n *\n * 1. `gh auth token` — preferred on dev laptops. Keeps telemetry\n * attributed to the GitHub identity, which is how work is rolled up\n * for individual contributors.\n * 2. `fml sync-token` — fallback for sandboxes / CI / containers that\n * don't have `gh` but have (or will have) an `fml login` session.\n * The FML session token carries `actAsExternalId` so attribution\n * still lands on a specific user — via FML identity instead of GH.\n * 3. `undefined` — nothing usable yet. Install writes a URL-only target\n * and `fml login` will back-patch it to `fml sync-token` after the\n * user signs in.\n */\nexport function resolveSyncTokenCommand(): string | undefined {\n if (resolveGitHubToken()) return \"gh auth token\";\n if (readTokens()) return \"fml sync-token\";\n return undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\nconst PLUGIN_CACHE_DIR = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"cache\",\n \"local-plugins\",\n \"fml\",\n);\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport function handleUninstall(opts: {\n purge?: boolean;\n target?: string;\n}): void {\n const targetSpecific = opts.target && opts.target !== \"all\";\n\n console.log(\"Uninstalling fml...\\n\");\n\n // 1. Tell Claude Code to uninstall the plugin (kills MCP server, evicts cache)\n if (targetSpecific) {\n console.log(\"[1/5] Skipping plugin uninstall (target-specific uninstall)\");\n } else {\n console.log(\"[1/5] Uninstalling MCP plugin...\");\n // Uninstall from user scope via CLI\n try {\n execFileSync(\n \"claude\",\n [\"plugin\", \"uninstall\", \"fml@local-plugins\", \"--scope\", \"user\"],\n { stdio: \"pipe\", timeout: 10_000 },\n );\n console.log(\" Uninstalled (user scope)\");\n } catch {\n // Not installed at this scope, or claude CLI not found\n }\n\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n const installedPluginsPath = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"installed_plugins.json\",\n );\n const installedPlugins = readJsonFile(installedPluginsPath) as {\n version?: number;\n plugins?: Record<string, unknown[]>;\n } | null;\n const plugins = installedPlugins?.plugins;\n const fmlEntries = plugins?.[\"fml@local-plugins\"];\n if (plugins && fmlEntries) {\n // Clean project-level settings that reference fml\n for (const entry of fmlEntries) {\n const e = entry as { scope?: string; projectPath?: string };\n if (e.scope === \"project\" && e.projectPath) {\n const projSettings = path.join(e.projectPath, \".claude\", \"settings.json\");\n const proj = readJsonFile(projSettings) as Record<string, Record<string, unknown>> | null;\n if (proj?.enabledPlugins?.[\"fml@local-plugins\"] != null) {\n delete proj.enabledPlugins[\"fml@local-plugins\"];\n writeJsonFile(projSettings, proj);\n console.log(` Cleaned ${projSettings}`);\n }\n }\n }\n delete plugins[\"fml@local-plugins\"];\n writeJsonFile(installedPluginsPath, installedPlugins as Record<string, unknown>);\n console.log(\" Cleaned installed_plugins.json\");\n }\n }\n\n // 2. Remove fml plugin from Claude Code settings\n if (targetSpecific) {\n console.log(\"[2/5] Skipping plugin settings (target-specific uninstall)\");\n } else {\n console.log(\"[2/5] Removing plugin from Claude Code settings...\");\n const settings = readJsonFile(CLAUDE_SETTINGS_PATH) as Record<\n string,\n Record<string, unknown>\n > | null;\n if (settings) {\n if (settings.enabledPlugins) {\n delete settings.enabledPlugins[\"fml@local-plugins\"];\n }\n if (settings.extraKnownMarketplaces) {\n delete settings.extraKnownMarketplaces[\"local-plugins\"];\n }\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Updated ${CLAUDE_SETTINGS_PATH}`);\n } else {\n console.log(\" No settings file found, skipping\");\n }\n }\n\n // 3. Remove marketplace symlink and manifest entry\n if (targetSpecific) {\n console.log(\"[3/5] Skipping marketplace (target-specific uninstall)\");\n } else {\n console.log(\"[3/5] Removing marketplace registration...\");\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n console.log(` Removed ${marketplaceLink}`);\n } catch {\n console.log(\" No marketplace link found, skipping\");\n }\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath);\n if (manifest && Array.isArray(manifest.plugins)) {\n manifest.plugins = (\n manifest.plugins as Array<Record<string, unknown>>\n ).filter((p) => p.name !== \"fml\");\n writeJsonFile(manifestPath, manifest);\n console.log(` Updated ${manifestPath}`);\n }\n }\n\n // 4. Run panopticon uninstall\n console.log(\"[4/5] Running panopticon uninstall...\");\n const panoArgs = [\"uninstall\"];\n if (opts.target) panoArgs.push(\"--target\", opts.target);\n if (opts.purge) panoArgs.push(\"--purge\");\n const result = panopticonExec(...panoArgs, { timeout: 30_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon uninstall failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n\n // 5. Remove fml data, logs, and plugin cache\n if (targetSpecific) {\n console.log(\"[5/5] Skipping data removal (target-specific uninstall)\");\n } else {\n console.log(\"[5/5] Removing plugin cache...\");\n try {\n fs.rmSync(PLUGIN_CACHE_DIR, { recursive: true, force: true });\n console.log(` Removed ${PLUGIN_CACHE_DIR}`);\n } catch {\n console.log(\" No plugin cache found\");\n }\n }\n\n if (opts.purge) {\n console.log(\"Removing fml data and logs...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` Removed ${dir}`);\n } catch {\n console.log(` Could not remove ${dir}`);\n }\n }\n } else {\n console.log(\"Keeping fml data (use --purge to remove)\");\n }\n\n console.log(\"\\nDone! FML has been uninstalled.\");\n}\n","import { execSync } from \"node:child_process\";\nimport { Sentry } from \"../sentry.js\";\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nexport async function handleUpdate(): Promise<void> {\n const currentVersion =\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\"Updating via npm...\\n\");\n\n try {\n const env = { ...process.env };\n delete env.npm_config_registry;\n\n execSync(\"npm install -g @fml-inc/fml@latest\", {\n stdio: \"inherit\",\n timeout: 120_000,\n env,\n });\n\n console.log(\"\\nUpdated. Run `fml install --skip-build` to reconfigure.\");\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg =\n err instanceof Error\n ? ((err as Error & { stderr?: Buffer }).stderr?.toString() ??\n err.message)\n : String(err);\n console.error(\"Update failed:\", msg);\n process.exit(1);\n }\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { CONVEX_URL, WORKOS_API_URL, WORKOS_AUTH_URL } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\n/**\n * Fetch the WorkOS client ID from the active Convex deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n const ref =\n \"public_config:getAuthConfig\" as unknown as import(\"convex/server\").FunctionReference<\"query\">;\n const result = (await client.query(ref, {})) as {\n workosClientId: string;\n };\n return result.workosClientId;\n}\n\n/**\n * Detect if a browser can be opened on this machine.\n * Returns false for headless environments (containers, SSH, no display).\n */\nexport async function canOpenBrowser(): Promise<boolean> {\n // Explicit overrides\n if (process.env.FML_DEVICE_FLOW === \"1\") return false;\n if (process.env.FML_NO_BROWSER === \"1\") return false;\n\n // Linux without a display server\n if (\n process.platform === \"linux\" &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return false;\n }\n\n // Remote/container environments\n if (process.env.SSH_CONNECTION) return false;\n if (process.env.CODESPACES) return false;\n if (process.env.REMOTE_CONTAINERS) return false;\n\n // Container detection\n try {\n const fs = await import(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return false;\n } catch {\n // ignore\n }\n\n return true;\n}\n\n/**\n * Run the WorkOS PKCE OAuth flow:\n * 1. Generate code_verifier + code_challenge\n * 2. Start local HTTP server for callback\n * 3. Open browser to WorkOS authorization URL\n * 4. Receive callback with authorization code\n * 5. Exchange code for tokens\n * 6. Store tokens\n */\nexport async function login(): Promise<{\n email: string;\n name: string;\n}> {\n // Fetch the WorkOS client ID from the active Convex deployment\n const clientId = await fetchWorkosClientId();\n\n // Generate PKCE code verifier and challenge\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto\n .createHash(\"sha256\")\n .update(codeVerifier)\n .digest(\"base64url\");\n\n // Generate state for CSRF protection (defense-in-depth alongside PKCE)\n const state = crypto.randomBytes(16).toString(\"hex\");\n\n // Find a free port and start callback server (pass state for CSRF verification)\n const { port, waitForCode, close } = await startCallbackServer(state);\n\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = new URL(`${WORKOS_AUTH_URL}/user_management/authorize`);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"provider\", \"authkit\");\n authUrl.searchParams.set(\"state\", state);\n\n // Open browser\n const open = (await import(\"open\")).default;\n await open(authUrl.toString());\n\n console.log(\"\\nOpening browser for login...\");\n console.log(`If it doesn't open, visit: ${authUrl.toString()}\\n`);\n\n // Wait for the callback\n const code = await waitForCode();\n close();\n\n // Exchange code for tokens\n const tokenResponse = await fetch(\n `${WORKOS_API_URL}/user_management/authenticate`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const error = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n user: {\n id: string;\n email: string;\n first_name?: string;\n last_name?: string;\n };\n };\n\n const userName = [data.user.first_name, data.user.last_name]\n .filter(Boolean)\n .join(\" \");\n\n writeTokens({\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: Date.now() + (data.expires_in ?? 300) * 1000,\n user: {\n id: data.user.id,\n email: data.user.email,\n name: userName,\n },\n workosClientId: clientId,\n });\n\n return { email: data.user.email, name: userName };\n}\n\nfunction startCallbackServer(expectedState: string): Promise<{\n port: number;\n waitForCode: () => Promise<string>;\n close: () => void;\n}> {\n return new Promise((resolve, reject) => {\n let resolveCode: (code: string) => void;\n let rejectCode: (err: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n\n // Verify state parameter to prevent CSRF\n if (returnedState !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>Invalid state parameter. You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(\"OAuth state mismatch — possible CSRF attack\"));\n return;\n }\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n resolveCode(code);\n return;\n }\n\n res.writeHead(400);\n res.end(\"Missing code parameter\");\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Listen on a random available port\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n\n resolve({\n port: addr.port,\n waitForCode: () => codePromise,\n close: () => server.close(),\n });\n });\n\n server.on(\"error\", reject);\n\n // Timeout after 5 minutes\n setTimeout(\n () => {\n rejectCode(new Error(\"Login timed out (5 minutes)\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n","/**\n * Device Authorization Flow — Double Handshake\n *\n * 1. CLI gets a unique URL + deviceCode from backend\n * 2. User pastes URL in browser → page shows confirmation code\n * 3. User types confirmation code back into CLI\n * 4. CLI polls with deviceCode + confirmationCode → gets tokens\n */\n\nimport { createInterface } from \"node:readline\";\nimport { getSiteUrl } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr, // Use stderr so stdout stays clean for MCP\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n verificationUri: string;\n expiresAt: number;\n interval: number;\n}\n\ninterface PollResponse {\n status:\n | \"pending\"\n | \"authorized\"\n | \"expired\"\n | \"rate_limited\"\n | \"invalid_code\";\n refreshToken?: string;\n accessToken?: string;\n expiresAt?: number;\n user?: { id: string; email: string; name: string };\n orgSlug?: string;\n interval?: number;\n}\n\n/**\n * Run the double-handshake device authorization flow.\n */\nexport async function deviceLogin(): Promise<{\n email: string;\n name: string;\n}> {\n const siteUrl = getSiteUrl();\n\n // 1. Request device code + session URL\n const codeRes = await fetch(`${siteUrl}/api/auth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!codeRes.ok) {\n const body = await codeRes.text();\n throw new Error(`Failed to start device flow: ${body}`);\n }\n\n const codeData = (await codeRes.json()) as DeviceCodeResponse;\n\n // 2. Show URL for user to paste in browser\n console.log(\"\");\n console.log(\" Paste this URL in your browser to sign in:\");\n console.log(\"\");\n console.log(` ${codeData.verificationUri}`);\n console.log(\"\");\n\n // 3. Wait for user to enter the confirmation code from the browser\n const confirmationCode = await prompt(\" Enter the code from your browser: \");\n\n if (!confirmationCode) {\n throw new Error(\"No confirmation code entered.\");\n }\n\n // Normalize: uppercase, strip dashes/spaces\n const normalizedCode = confirmationCode\n .toUpperCase()\n .replace(/[\\s-]/g, \"\")\n .replace(/^(.{4})/, \"$1-\");\n\n console.log(\" Verifying...\");\n\n // 4. Poll with deviceCode + confirmationCode\n let pollInterval = codeData.interval * 1000;\n\n while (Date.now() < codeData.expiresAt) {\n const pollRes = await fetch(`${siteUrl}/api/auth/device/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n deviceCode: codeData.deviceCode,\n confirmationCode: normalizedCode,\n }),\n });\n\n if (pollRes.status === 429) {\n const data = (await pollRes.json()) as PollResponse;\n pollInterval = (data.interval ?? codeData.interval * 2) * 1000;\n await sleep(pollInterval);\n continue;\n }\n\n const data = (await pollRes.json()) as PollResponse;\n\n if (data.status === \"pending\") {\n // User hasn't clicked Authorize yet — wait and retry\n await sleep(pollInterval);\n continue;\n }\n\n if (data.status === \"authorized\") {\n writeTokens({\n accessToken: data.accessToken!,\n refreshToken: data.refreshToken!,\n expiresAt: data.expiresAt!,\n user: data.user!,\n orgSlug: data.orgSlug ?? undefined,\n tokenType: \"service\",\n });\n\n return { email: data.user!.email, name: data.user!.name };\n }\n\n if (data.status === \"invalid_code\") {\n throw new Error(\n \"Invalid confirmation code. Make sure you copied the code from the browser correctly.\",\n );\n }\n\n if (data.status === \"expired\") {\n throw new Error(\"Device authorization expired. Run `fml login` again.\");\n }\n\n throw new Error(`Device authorization failed: ${data.status}`);\n }\n\n throw new Error(\n \"Device authorization timed out (15 minutes). Run `fml login` again.\",\n );\n}\n","import type { FunctionReference } from \"convex/server\";\nimport {\n addTarget,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { login, canOpenBrowser } from \"../auth/oauth.js\";\nimport { deviceLogin } from \"../auth/device-flow.js\";\nimport { getValidToken, setSelectedOrg } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n CONVEX_URL,\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n getActiveEnv,\n} from \"../config.js\";\nimport { Sentry } from \"../sentry.js\";\n\n/**\n * After login, link the user's GitHub identity to their FML account\n * so that sync data (authenticated via GitHub token) can be attributed.\n */\nasync function linkGitHubIdentity(): Promise<void> {\n const token = resolveGitHubToken();\n if (!token) {\n console.warn(\"[fml] No GitHub token available — skipping identity link\");\n return;\n }\n\n try {\n const response = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n });\n if (!response.ok) {\n console.warn(\n `[fml] GitHub API returned ${response.status} — skipping identity link`,\n );\n return;\n }\n\n const user = (await response.json()) as {\n login: string;\n id: number;\n email: string | null;\n };\n\n const fmlToken = await getValidToken();\n if (!fmlToken) {\n console.warn(\"[fml] No FML token available — skipping identity link\");\n return;\n }\n\n // Service tokens (device flow) can't call JWT-authenticated Convex mutations.\n // Identity is already attributed server-side via actAsExternalId on the token.\n if (fmlToken.startsWith(\"fml_st_\")) {\n return;\n }\n\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n client.setAuth(fmlToken);\n\n const ref =\n \"user/panopticon:linkGitHubIdentity\" as unknown as FunctionReference<\"mutation\">;\n await client.mutation(ref, {\n githubUsername: user.login,\n githubId: user.id,\n githubEmail: user.email ?? undefined,\n });\n\n console.log(`Linked GitHub account: ${user.login}`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Failed to link GitHub identity: ${msg}`);\n }\n}\n\n// Config snapshots are now synced automatically via panopticon sync —\n// no manual upload needed after login.\n\n/**\n * After a successful login, upgrade the default sync target to use\n * `fml sync-token` if it doesn't already have a working `tokenCommand`.\n *\n * - Target missing entirely → add one pointing at prod with fml sync-token.\n * - Target exists with no tokenCommand (URL-only, written by `fml install`\n * on a sandbox) → attach fml sync-token.\n * - Target already has a tokenCommand (gh auth token on a dev laptop, or\n * a custom one) → leave it alone; we don't second-guess the user's\n * explicit choice and GH attribution is preferred when available.\n */\n// Exported for unit testing; called from within handleLogin otherwise.\nexport function upgradeSyncTargetAfterLogin(): void {\n try {\n const config = loadSyncConfig();\n const existing = config.targets.find((t) => t.name === DEFAULT_TARGET_NAME);\n if (!existing) {\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand: \"fml sync-token\",\n });\n console.log(\n `Sync target \"${DEFAULT_TARGET_NAME}\" configured with fml sync-token.`,\n );\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n return;\n }\n if (!existing.tokenCommand && !existing.token) {\n existing.tokenCommand = \"fml sync-token\";\n saveSyncConfig(config);\n console.log(`Sync target \"${existing.name}\" now using fml sync-token.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n }\n } catch (err: unknown) {\n // Non-fatal — login itself succeeded, worst case sync stays URL-only\n // and the user can run `fml sync setup` manually.\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Could not update sync target: ${msg}`);\n }\n}\n\n/**\n * After login, select and persist the user's org.\n * Single-org users get auto-selected; multi-org users get the first org\n * (can be changed later via `fml org`).\n */\nasync function selectOrg(): Promise<void> {\n try {\n const token = await getValidToken();\n if (!token) return;\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n const org = orgs[0];\n const slug = org.slug ?? org.name;\n setSelectedOrg(slug);\n console.log(`Selected org: ${org.name} (${slug})`);\n } catch {\n // Non-fatal — org selection can happen later via `fml org`\n }\n}\n\nexport async function handleLogin(opts?: { device?: boolean }): Promise<void> {\n const { name: envName } = getActiveEnv();\n\n // Skip OAuth if already authenticated — still run post-login tasks\n const existingToken = await getValidToken();\n if (existingToken) {\n const { readTokens } = await import(\"../auth/token-store.js\");\n const stored = readTokens();\n console.log(\n `Already logged in as ${stored?.user.name} (${stored?.user.email}) on ${envName}.`,\n );\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n }\n\n console.log(`Signing in to FML (${envName})...`);\n try {\n const useDeviceFlow = opts?.device || !(await canOpenBrowser());\n let result: { email: string; name: string };\n\n if (useDeviceFlow) {\n result = await deviceLogin();\n } else {\n result = await login();\n }\n\n console.log(`\\nLogged in as ${result.name} (${result.email})`);\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Login failed: ${msg}`);\n process.exit(1);\n }\n}\n","import fs from \"node:fs\";\nimport { AUTH_STORE_PATH } from \"../config.js\";\n\nexport function handleLogout(): void {\n try {\n fs.unlinkSync(AUTH_STORE_PATH);\n } catch {\n // File doesn't exist, that's fine\n }\n console.log(\"Logged out. Stored credentials cleared.\");\n}\n","import { createApiClient } from \"../convex-client.js\";\nimport {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\n\nexport async function handleOrg(slug?: string): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"Not logged in. Run `fml login` first.\");\n process.exit(1);\n }\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n\n const current = getSelectedOrg();\n\n // No slug provided — show current selection and available orgs\n if (!slug) {\n console.log(\"Organizations:\\n\");\n for (const org of orgs) {\n const orgSlug = org.slug ?? org.name;\n const marker = orgSlug === current ? \" (selected)\" : \"\";\n console.log(` ${orgSlug}${marker}`);\n }\n if (!current) {\n console.log(\"\\nNo org selected. Run `fml org <slug>` to select one.\");\n }\n return;\n }\n\n // Slug provided — select it\n const match = orgs.find(\n (o) => (o.slug ?? o.name) === slug || o.name === slug,\n );\n if (!match) {\n console.error(\n `Organization \"${slug}\" not found. Available: ${orgs.map((o) => o.slug ?? o.name).join(\", \")}`,\n );\n process.exit(1);\n }\n\n const matchSlug = match.slug ?? match.name;\n setSelectedOrg(matchSlug);\n console.log(`Selected org: ${match.name} (${matchSlug})`);\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst APP_BASE_URL = \"https://app.fml.app\";\n\nexport async function handleOpen(opts: { json?: boolean }): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` first.\");\n process.exit(1);\n }\n\n let slug: string;\n try {\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n slug = orgs[0].slug ?? orgs[0].name;\n } catch {\n console.error(\"Could not fetch organizations. Opening base URL.\");\n slug = \"\";\n }\n\n const url = slug ? `${APP_BASE_URL}/${slug}` : APP_BASE_URL;\n\n if (opts.json) {\n console.log(JSON.stringify({ url }));\n } else {\n const openBrowser = (await import(\"open\")).default;\n await openBrowser(url);\n }\n}\n","import { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv } from \"../config.js\";\n\nexport async function handleStatus(): Promise<void> {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex: ${convexUrl}\\n`);\n\n const tokens = readTokens();\n\n if (!tokens) {\n console.log(\"Not authenticated. Run `fml login` to sign in.\");\n return;\n }\n\n const tokenValid = await getValidToken();\n\n console.log(\"Authentication:\");\n console.log(` User: ${tokens.user.name} (${tokens.user.email})`);\n console.log(\n ` Token: ${tokenValid ? \"valid\" : \"expired (needs refresh/re-login)\"}`,\n );\n console.log(` Org: ${tokens.orgSlug ?? \"(none — run `fml org <slug>`)\"}`);\n}\n","import { DEFAULT_SYNC_URL, DEFAULT_TARGET_NAME } from \"../config.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\nimport {\n addTarget,\n removeTarget,\n listTargets,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { syncPending, syncReset } from \"@fml-inc/panopticon/api\";\n\n// ── Setup (convenience shortcut) ────────────────────────────────────────────\n\nexport async function handleSyncSetup(): Promise<void> {\n console.log(\"FML Sync Setup\\n\");\n\n const tokenCommand = resolveSyncTokenCommand();\n if (!tokenCommand) {\n console.error(\n \"No credential available. Run `fml login` first, or set PANOPTICON_GITHUB_TOKEN / install gh CLI.\",\n );\n process.exit(1);\n }\n\n // Replace any existing entry so re-running setup upgrades the target in\n // place (e.g. URL-only → fml sync-token after first login).\n removeTarget(DEFAULT_TARGET_NAME);\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n\n console.log(`Sync target \"${DEFAULT_TARGET_NAME}\" configured:`);\n console.log(` URL: ${DEFAULT_SYNC_URL}`);\n console.log(` Auth: ${tokenCommand}`);\n console.log(`\\nRestart panopticon to activate: fml stop && fml start`);\n}\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncList(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\n \"No sync targets configured. Run `fml sync setup` or `fml sync add`.\",\n );\n return;\n }\n\n console.log(\"Sync targets:\\n\");\n for (const t of targets) {\n const auth = t.token\n ? \"static token\"\n : t.tokenCommand\n ? `command: ${t.tokenCommand}`\n : \"none\";\n console.log(` ${t.name}`);\n console.log(` URL: ${t.url}`);\n console.log(` Auth: ${auth}`);\n }\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncAdd(\n name: string,\n url: string,\n opts: { tokenCmd?: string; token?: string },\n): Promise<void> {\n const existing = listTargets();\n if (existing.some((t) => t.name === name)) {\n console.error(\n `Target \"${name}\" already exists. Use \\`fml sync edit\\` to modify it.`,\n );\n process.exit(1);\n }\n\n addTarget({\n name,\n url,\n tokenCommand: opts.tokenCmd,\n token: opts.token,\n });\n\n console.log(`Sync target \"${name}\" added:`);\n console.log(` URL: ${url}`);\n if (opts.tokenCmd) console.log(` Auth: command: ${opts.tokenCmd}`);\n else if (opts.token) console.log(\" Auth: static token\");\n else console.log(\" Auth: none\");\n console.log(\"\\nRestart panopticon to activate: fml stop && fml start\");\n}\n\n// ── Remove ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncRemove(name: string): Promise<void> {\n const removed = removeTarget(name);\n if (removed) {\n console.log(`Sync target \"${name}\" removed.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } else {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n}\n\n// ── Edit ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncEdit(\n name: string,\n opts: { url?: string; tokenCmd?: string; token?: string },\n): Promise<void> {\n const config = loadSyncConfig();\n const target = config.targets.find((t) => t.name === name);\n if (!target) {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n\n if (opts.url) target.url = opts.url;\n if (opts.tokenCmd) {\n target.tokenCommand = opts.tokenCmd;\n delete target.token;\n }\n if (opts.token) {\n target.token = opts.token;\n delete target.tokenCommand;\n }\n\n saveSyncConfig(config);\n console.log(`Sync target \"${name}\" updated:`);\n console.log(` URL: ${target.url}`);\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(` Auth: ${auth}`);\n console.log(\"\\nRestart panopticon to apply: fml stop && fml start\");\n}\n\n// ── Status ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncStatus(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\"No sync targets configured. Run `fml sync setup` first.\");\n return;\n }\n\n for (const target of targets) {\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(`${target.name}:`);\n console.log(` URL: ${target.url}`);\n console.log(` Auth: ${auth}`);\n\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n console.log(\" Status: up to date\");\n } else {\n console.log(` Pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} pending (${info.synced} / ${info.total})`,\n );\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(` Status: unavailable (${msg})`);\n }\n console.log();\n }\n}\n\n// ── Reset ────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncReset(targetName?: string): Promise<void> {\n await syncReset(targetName ?? DEFAULT_TARGET_NAME);\n console.log(\n `Sync watermarks for \"${targetName ?? DEFAULT_TARGET_NAME}\" reset to 0.`,\n );\n}\n","import { once } from \"node:events\";\nimport { getValidToken } from \"../auth/token-store.js\";\n\n/**\n * Print the current FML access token to stdout.\n *\n * Wired into panopticon sync targets as `tokenCommand: \"fml sync-token\"`.\n * Resolves and refreshes the stored FML session token, the same credential\n * `fml login` produces. Used on sandboxes / CI / containers where there's\n * no `gh auth token` to attribute sync telemetry to a GitHub identity.\n *\n * Output: token on stdout, nothing else. Non-zero exit on any failure so\n * panopticon's token helper treats it as a missed refresh rather than\n * caching an empty string as the bearer.\n */\nexport async function handleSyncToken(): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"fml: not logged in. Run `fml login` to enable sync.\");\n process.exit(1);\n }\n // Wait for drain before exiting — small writes on a pipe are usually\n // synchronous up to PIPE_BUF, but on slow/full pipes (or non-Linux\n // platforms) `process.exit` can cut off the write mid-flight and\n // hand panopticon a truncated token.\n if (!process.stdout.write(token)) {\n await once(process.stdout, \"drain\");\n }\n process.exit(0);\n}\n","import { listTargets } from \"@fml-inc/panopticon/sync\";\nimport { getActiveEnv, writeEnvConfig } from \"../config.js\";\nimport { handleStop, handleStart } from \"./daemon.js\";\n\n/**\n * Show the active environment.\n */\nexport function handleEnvShow(): void {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex URL: ${convexUrl}`);\n}\n\n/**\n * Switch to a sync target as the active environment.\n * Automatically restarts daemons so the new URL takes effect.\n */\nexport async function handleEnvSwitch(target: string): Promise<void> {\n const targets = listTargets();\n const match = targets.find((t) => t.name === target);\n if (!match) {\n console.error(`Sync target \"${target}\" not found. Available targets:`);\n for (const t of targets) {\n console.error(` ${t.name} ${t.url}`);\n }\n console.error(\"\\nAdd a target with `fml sync add`.\");\n process.exit(1);\n }\n\n writeEnvConfig({ active: target });\n const convexUrl = match.url.replace(\".convex.site\", \".convex.cloud\");\n console.log(`Switched to ${target}: ${convexUrl}`);\n\n console.log(\"\\nRestarting daemons...\");\n handleStop();\n await handleStart();\n console.log(\n \"MCP server will pick up the change on next Claude Code session.\",\n );\n}\n","/**\n * CLI wrappers for remote FML backend data queries.\n * Each command queries the FML Convex backend via the authenticated API client.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nasync function queryBackend(\n toolName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` to sign in.\");\n process.exit(1);\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error ?? \"Unknown error\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleActivity(opts: { since?: string }): Promise<void> {\n await queryBackend(\"get-engineering-activity\", {\n timeRange: opts.since ?? \"24h\",\n });\n}\n\nexport async function handleSessions(opts: {\n since?: string;\n limit?: string;\n}): Promise<void> {\n await queryBackend(\"list-engineering-sessions\", {\n timeRange: opts.since ?? \"24h\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n\nexport async function handleTimeline(\n sessionId: string,\n opts: { limit?: string; offset?: string },\n): Promise<void> {\n await queryBackend(\"get-session-timeline\", {\n sessionId,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n}\n\nexport async function handleSpending(opts: {\n since?: string;\n groupBy?: string;\n}): Promise<void> {\n await queryBackend(\"get-ai-spending\", {\n timeRange: opts.since ?? \"7d\",\n groupBy: opts.groupBy,\n });\n}\n\nexport async function handleSearch(\n query: string,\n opts: { since?: string; limit?: string },\n): Promise<void> {\n await queryBackend(\"search-engineering-sessions\", {\n query,\n timeRange: opts.since ?? \"7d\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n","/**\n * Unified provider query command.\n * Routes requests to the appropriate backend tool based on provider and endpoint.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst GENERIC_PROVIDERS = [\n \"sentry\",\n \"slack\",\n \"github\",\n \"linear\",\n \"notion\",\n \"freshdesk\",\n];\n\nconst POSTHOG_ENDPOINTS: Record<string, string> = {\n insights: \"query-posthog-insights\",\n events: \"query-posthog-events\",\n recordings: \"query-posthog-recordings\",\n \"feature-flags\": \"query-posthog-feature-flags\",\n experiments: \"query-posthog-experiments\",\n surveys: \"query-posthog-surveys\",\n hogql: \"run-posthog-hogql\",\n cohorts: \"query-posthog-cohorts\",\n};\n\nconst AMPLITUDE_ENDPOINTS: Record<string, string> = {\n events: \"query-amplitude-events\",\n funnel: \"query-amplitude-funnel\",\n retention: \"query-amplitude-retention\",\n chart: \"get-amplitude-chart\",\n \"list-events\": \"list-amplitude-events\",\n};\n\nconst META_ADS_ENDPOINTS: Record<string, string> = {\n accounts: \"list-meta-ad-accounts\",\n campaigns: \"list-meta-campaigns\",\n insights: \"get-meta-ad-insights\",\n \"ad-sets\": \"list-meta-ad-sets\",\n};\n\nfunction parseBody(body?: string): Record<string, unknown> {\n if (!body) return {};\n try {\n return JSON.parse(body) as Record<string, unknown>;\n } catch {\n console.error(\"Invalid JSON in --body argument.\");\n process.exit(1);\n }\n}\n\nexport async function handleQuery(\n provider: string,\n endpoint: string,\n opts: { method?: string; body?: string; projectId?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n\n const parsedBody = parseBody(opts.body);\n let toolName: string;\n let args: Record<string, unknown>;\n\n if (GENERIC_PROVIDERS.includes(provider)) {\n toolName = `integration-${provider}`;\n args = {\n endpoint,\n method: opts.method || \"GET\",\n body: parsedBody,\n projectId: opts.projectId,\n };\n } else if (provider === \"posthog\") {\n toolName = POSTHOG_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown posthog endpoint: ${endpoint}. Valid: ${Object.keys(POSTHOG_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n args = { ...parsedBody };\n } else if (provider === \"amplitude\") {\n toolName = AMPLITUDE_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown amplitude endpoint: ${endpoint}. Valid: ${Object.keys(AMPLITUDE_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // list-events takes no args — --body is ignored for this endpoint\n args = endpoint === \"list-events\" ? {} : { ...parsedBody };\n } else if (provider === \"meta-ads\") {\n toolName = META_ADS_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown meta-ads endpoint: ${endpoint}. Valid: ${Object.keys(META_ADS_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // accounts takes no args — --body is ignored for this endpoint\n args = endpoint === \"accounts\" ? {} : { ...parsedBody };\n } else {\n console.error(\n `Unknown provider: ${provider}. Valid: ${[...GENERIC_PROVIDERS, \"posthog\", \"amplitude\", \"meta-ads\"].join(\", \")}`,\n );\n process.exit(1);\n }\n\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleAutomationList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-automations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreate(opts: {\n name: string;\n prompt: string;\n frequency: string;\n hour: string;\n minute: string;\n timezone: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n maxRuns?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n frequency: opts.frequency,\n hour: parseInt(opts.hour, 10),\n minute: parseInt(opts.minute, 10),\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n maxRuns: opts.maxRuns ? parseInt(opts.maxRuns, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreatePattern(opts: {\n name: string;\n prompt: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-pattern-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationUpdate(\n id: string,\n opts: {\n name?: string;\n prompt?: string;\n enabled?: string;\n frequency?: string;\n hour?: string;\n minute?: string;\n timezone?: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"update-automation\", {\n automationId: id,\n name: opts.name,\n prompt: opts.prompt,\n enabled:\n opts.enabled !== undefined\n ? (() => {\n if (opts.enabled !== \"true\" && opts.enabled !== \"false\") {\n console.error(\n `Invalid --enabled value: \"${opts.enabled}\". Use \"true\" or \"false\".`,\n );\n process.exit(1);\n }\n return opts.enabled === \"true\";\n })()\n : undefined,\n frequency: opts.frequency,\n hour: opts.hour ? parseInt(opts.hour, 10) : undefined,\n minute: opts.minute ? parseInt(opts.minute, 10) : undefined,\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationDelete(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationTest(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"test-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMemoryList(opts: {\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-memory-files\", {\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryRead(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"read-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryWrite(opts: {\n title: string;\n content: string;\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"write-memory-file\", {\n title: opts.title,\n content: opts.content,\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryDelete(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSearchAnalysis(\n query: string,\n opts: { status?: string; limit?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"search-analysis\", {\n query,\n status: opts.status,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunAnalysis(opts: {\n prompts?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-analysis-workflow\", {\n selectedPromptKeys: opts.prompts?.split(\",\"),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleIntegrations(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-integrations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleEvents(opts: {\n source?: string;\n eventType?: string;\n projectId?: string;\n since?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-integration-events\", {\n source: opts.source,\n eventType: opts.eventType,\n projectId: opts.projectId,\n timeRange: opts.since,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleResolveIdentity(opts: {\n provider?: string;\n username?: string;\n email?: string;\n externalId?: string;\n externalUserId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"resolve-identities\", {\n provider: opts.provider,\n externalUsername: opts.username,\n normalizedEmail: opts.email,\n externalId: opts.externalId,\n externalUserId: opts.externalUserId,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSlackHistory(opts: {\n channel?: string;\n limit?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-channel-history\", {\n channelId: opts.channel,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSlackMessage(opts: {\n permalink?: string;\n channel?: string;\n ts?: string;\n includeThread?: boolean;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-message\", {\n permalink: opts.permalink,\n channelId: opts.channel,\n messageTs: opts.ts,\n includeThreadContext: opts.includeThread,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMessagesList(opts: {\n start?: string;\n end?: string;\n limit?: string;\n cursor?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages\", {\n startTime: opts.start ? parseInt(opts.start, 10) : undefined,\n endTime: opts.end ? parseInt(opts.end, 10) : undefined,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n cursor: opts.cursor,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMessagesContext(\n messageId: string,\n opts: { before?: string; after?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages-with-context\", {\n messageId,\n before: opts.before ? parseInt(opts.before, 10) : undefined,\n after: opts.after ? parseInt(opts.after, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSkillsList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-skills\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSkillsLoad(skillId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"load-skill\", { skillId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleConfigList(opts: {\n org: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.listRepoConfigSnapshots(opts.org, opts.repo)\n : await api.listUserConfigSnapshots(opts.org);\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nexport async function handleConfigDetail(opts: {\n org: string;\n user?: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.getRepoConfigDetail(opts.org, opts.repo)\n : opts.user\n ? await api.getUserConfigDetail(opts.org, opts.user)\n : null;\n if (!result) {\n console.error(\"Provide --user or --repo\");\n process.exit(1);\n }\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["formattedArgs","path","parts","os","path","pc","path","os","execFileSync","fs","os","path","CLAUDE_DIR","path","os","CLAUDE_SETTINGS_PATH","MARKETPLACE_DIR","readJsonFile","fs","writeJsonFile","execFileSync","execSync","execSync","http","fs","http","data","config","readTokens","fs","fs","config","config"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/doctor.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/log.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/urlToObj.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/prettyLogStyles.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/formatTemplate.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/formatNumberAddZeros.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/metaFormatting.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/stackTrace.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/errorUtils.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/jsonStringifyRecursive.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/util.inspect.polyfill.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/internal/environment.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/BaseLogger.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/node_modules/.pnpm/tslog@4.10.2/node_modules/tslog/esm/index.js","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/config.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/loop.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/sync/post.ts","../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/src/api/client.ts","../src/commands/install.ts","../src/banner.ts","../src/sync/client.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/auth/oauth.ts","../src/auth/device-flow.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/org.ts","../src/commands/open.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/sync-token.ts","../src/commands/env.ts","../src/commands/data.ts","../src/commands/query.ts","../src/commands/automation.ts","../src/commands/memory.ts","../src/commands/analysis.ts","../src/commands/integrations.ts","../src/commands/slack.ts","../src/commands/messages.ts","../src/commands/skills.ts","../src/commands/config-snapshots.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nimport { ensureNativeModules } from \"./native-check.js\";\nensureNativeModules();\n\nimport { Command } from \"commander\";\nimport { initSentry, Sentry } from \"./sentry.js\";\n\nimport { handleDoctor } from \"./commands/doctor.js\";\nimport { handleInstall } from \"./commands/install.js\";\nimport { handleUninstall } from \"./commands/uninstall.js\";\nimport { handleUpdate } from \"./commands/update.js\";\nimport { handleLogin } from \"./commands/login.js\";\nimport { handleLogout } from \"./commands/logout.js\";\nimport { handleOrg } from \"./commands/org.js\";\nimport { handleOpen } from \"./commands/open.js\";\nimport { handleStatus } from \"./commands/status.js\";\nimport { handleStart, handleStop } from \"./commands/daemon.js\";\nimport {\n handleSyncAdd,\n handleSyncEdit,\n handleSyncList,\n handleSyncRemove,\n handleSyncReset,\n handleSyncSetup,\n handleSyncStatus,\n} from \"./commands/sync.js\";\nimport { handleSyncToken } from \"./commands/sync-token.js\";\nimport { handleEnvShow, handleEnvSwitch } from \"./commands/env.js\";\nimport {\n handleActivity,\n handleSearch,\n handleSessions,\n handleSpending,\n handleTimeline,\n} from \"./commands/data.js\";\nimport { handleQuery } from \"./commands/query.js\";\nimport {\n handleAutomationList,\n handleAutomationCreate,\n handleAutomationCreatePattern,\n handleAutomationUpdate,\n handleAutomationDelete,\n handleAutomationTest,\n} from \"./commands/automation.js\";\nimport {\n handleMemoryList,\n handleMemoryRead,\n handleMemoryWrite,\n handleMemoryDelete,\n} from \"./commands/memory.js\";\nimport {\n handleSearchAnalysis,\n handleRunAnalysis,\n} from \"./commands/analysis.js\";\nimport {\n handleIntegrations,\n handleEvents,\n handleResolveIdentity,\n} from \"./commands/integrations.js\";\nimport { handleSlackHistory, handleSlackMessage } from \"./commands/slack.js\";\nimport {\n handleMessagesList,\n handleMessagesContext,\n} from \"./commands/messages.js\";\nimport { handleSkillsList, handleSkillsLoad } from \"./commands/skills.js\";\nimport {\n handleConfigList,\n handleConfigDetail,\n} from \"./commands/config-snapshots.js\";\nimport { printBanner } from \"./banner.js\";\n\nawait initSentry();\n\n// Show the logo when running `fml` with no args or `fml --help`\nif (\n process.argv.length <= 2 ||\n process.argv.includes(\"--help\") ||\n process.argv.includes(\"-h\")\n) {\n printBanner();\n}\n\nconst program = new Command()\n .name(\"fml\")\n .description(\"FML agent tools for Claude Code\")\n .version(\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"dev\",\n );\n\nprogram\n .command(\"tools\", { hidden: true })\n .description(\"List all available CLI commands (including hidden agent tools)\")\n .action(() => {\n function formatCmd(cmd: typeof program, prefix = \"\") {\n const name = prefix ? `${prefix} ${cmd.name()}` : cmd.name();\n const args = cmd.registeredArguments\n .map((a) => (a.required ? `<${a.name()}>` : `[${a.name()}]`))\n .join(\" \");\n const opts = cmd.options\n .filter(\n (o) => !o.hidden && o.long !== \"--help\" && o.long !== \"--version\",\n )\n .map((o) => (o.mandatory ? o.flags : `[${o.flags}]`))\n .join(\" \");\n const usage = [name, args, opts].filter(Boolean).join(\" \");\n return `${usage}\\n ${cmd.description()}`;\n }\n\n const lines = program.commands\n .filter((c) => c.name() !== \"tools\" && c.name() !== \"help\")\n .flatMap((c) => {\n if (c.commands.length > 0) {\n return c.commands.map((s) => formatCmd(s, c.name()));\n }\n return [formatCmd(c)];\n });\n console.log(lines.join(\"\\n\\n\"));\n });\n\nprogram\n .command(\"install\")\n .description(\"Register plugin, hooks, and daemons\")\n .action(() => handleInstall());\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove fml plugin, hooks, and optionally all data\")\n .option(\n \"--target <target>\",\n \"Target CLI: claude, gemini, codex, claude-desktop, all\",\n )\n .option(\"--purge\", \"Also remove all data, logs, and auth tokens\")\n .action((opts) => handleUninstall(opts));\n\nprogram\n .command(\"update\")\n .description(\"Update fml to the latest version\")\n .action(() => handleUpdate());\n\nprogram\n .command(\"login\")\n .description(\"Sign in to your FML account\")\n .option(\"--device\", \"Use device authorization flow (no browser needed)\")\n .action((opts: { device?: boolean }) => handleLogin(opts));\n\nprogram\n .command(\"logout\")\n .description(\"Sign out and clear stored credentials\")\n .action(() => handleLogout());\n\nprogram\n .command(\"org\")\n .description(\"Show or select organization\")\n .argument(\"[slug]\", \"Org slug to select\")\n .action((slug) => handleOrg(slug));\n\nprogram\n .command(\"status\")\n .description(\"Show current auth and daemon status\")\n .action(() => handleStatus());\n\nprogram\n .command(\"doctor\")\n .description(\"Check FML and panopticon configuration and connectivity\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts) => handleDoctor(opts));\n\nprogram\n .command(\"open\")\n .description(\"Open FML dashboard in browser\")\n .option(\"--json\", \"Output URL as JSON instead of opening browser\")\n .action((opts) => handleOpen(opts));\n\nprogram\n .command(\"env\")\n .description(\"Show or switch environment (dev/prod)\")\n .argument(\"[target]\", 'Environment name (\"dev\", \"prod\") or custom Convex URL')\n .action((target?: string) => {\n if (target) handleEnvSwitch(target);\n else handleEnvShow();\n });\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server and sync\")\n .action(() => handleStart());\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server and sync\")\n .action(() => handleStop());\n\n// ── Sync subcommand ───────────────────────────────────────────────────────\n\nconst sync = program.command(\"sync\").description(\"Manage sync configuration\");\n\nsync\n .command(\"setup\")\n .description(\"Configure sync targets (convenience shortcut)\")\n .action(() => handleSyncSetup());\n\nsync\n .command(\"list\")\n .description(\"List all sync targets\")\n .action(() => handleSyncList());\n\nsync\n .command(\"add\")\n .description(\"Add a sync target\")\n .argument(\"<name>\", \"Unique target name\")\n .argument(\"<url>\", \"OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"Shell command that returns a bearer token\")\n .option(\"--token <token>\", \"Static bearer token\")\n .action(\n (name: string, url: string, opts: { tokenCmd?: string; token?: string }) =>\n handleSyncAdd(name, url, opts),\n );\n\nsync\n .command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name to remove\")\n .action((name: string) => handleSyncRemove(name));\n\nsync\n .command(\"edit\")\n .description(\"Edit a sync target\")\n .argument(\"<name>\", \"Target name to edit\")\n .option(\"--url <url>\", \"New OTLP HTTP endpoint URL\")\n .option(\"--token-cmd <cmd>\", \"New shell command for bearer token\")\n .option(\"--token <token>\", \"New static bearer token\")\n .action(\n (name: string, opts: { url?: string; tokenCmd?: string; token?: string }) =>\n handleSyncEdit(name, opts),\n );\n\nsync\n .command(\"status\")\n .description(\"Show sync config and watermarks\")\n .action(() => handleSyncStatus());\n\nsync\n .command(\"reset\")\n .description(\"Reset sync watermarks\")\n .argument(\"[name]\", \"Target name (resets all if omitted)\")\n .action((name?: string) => handleSyncReset(name));\n\nprogram\n .command(\"sync-token\", { hidden: true })\n .description(\n \"Print a refreshed FML access token (for panopticon tokenCommand)\",\n )\n .action(() => handleSyncToken());\n\n// ── Data commands ───────────────────────────────────────────────────────────\n\nprogram\n .command(\"activity\")\n .description(\"Activity summary — sessions, prompts, tools, costs\")\n .option(\"--since <duration>\", 'Time window, e.g. \"24h\", \"7d\"')\n .action((opts) => handleActivity(opts));\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max sessions to return\")\n .action((opts) => handleSessions(opts));\n\nprogram\n .command(\"timeline\")\n .description(\"Get events for a session\")\n .argument(\"<session-id>\", \"Session ID\")\n .option(\"--limit <n>\", \"Max events to return\")\n .option(\"--offset <n>\", \"Events to skip\")\n .action((sessionId, opts) => handleTimeline(sessionId, opts));\n\nprogram\n .command(\"spending\")\n .description(\"AI token usage and cost breakdown\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action((opts) => handleSpending(opts));\n\nprogram\n .command(\"search\")\n .description(\"Search across all sessions\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--since <duration>\", 'Time filter, e.g. \"24h\", \"7d\"')\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearch(query, opts));\n\n// ── Query command (unified integration queries) ────────────────────────────\n\nprogram\n .command(\"query\", { hidden: true })\n .description(\"Query a connected integration\")\n .argument(\n \"<provider>\",\n \"Provider name (sentry, slack, github, linear, notion, freshdesk, stripe, posthog, amplitude, meta-ads)\",\n )\n .argument(\"<endpoint>\", \"API endpoint or subcommand\")\n .option(\"--method <method>\", \"HTTP method\", \"GET\")\n .option(\"--body <json>\", \"Request body as JSON string\")\n .option(\"--project-id <id>\", \"Project ID override\")\n .action((provider, endpoint, opts) => handleQuery(provider, endpoint, opts));\n\n// ── Automation subcommand ──────────────────────────────────────────────────\n\nconst automation = program\n .command(\"automation\", { hidden: true })\n .description(\"Manage automations\");\n\nautomation\n .command(\"list\")\n .description(\"List all automations\")\n .action(() => handleAutomationList());\n\nautomation\n .command(\"create-scheduled\")\n .description(\"Create a scheduled automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to run\")\n .requiredOption(\"--frequency <freq>\", \"hourly, daily, weekly, or monthly\")\n .requiredOption(\"--hour <hour>\", \"Hour (0-23)\")\n .requiredOption(\"--minute <minute>\", \"Minute (0-59)\")\n .requiredOption(\"--timezone <tz>\", \"IANA timezone, e.g. America/Chicago\")\n .option(\"--day-of-week <day>\", \"Day of week (0=Sun..6=Sat) for weekly\")\n .option(\"--day-of-month <day>\", \"Day of month (1-31) for monthly\")\n .option(\"--max-runs <n>\", \"Max runs (1 for one-time)\")\n .action((opts) => handleAutomationCreate(opts));\n\nautomation\n .command(\"create-pattern\")\n .description(\"Create an event-triggered automation\")\n .requiredOption(\"--name <name>\", \"Automation name\")\n .requiredOption(\"--prompt <prompt>\", \"What to watch for and do\")\n .action((opts) => handleAutomationCreatePattern(opts));\n\nautomation\n .command(\"update\")\n .description(\"Update an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .option(\"--name <name>\", \"New name\")\n .option(\"--prompt <prompt>\", \"New prompt\")\n .option(\"--enabled <bool>\", \"Enable or disable (true/false)\")\n .option(\"--frequency <freq>\", \"New frequency\")\n .option(\"--hour <hour>\", \"New hour\")\n .option(\"--minute <minute>\", \"New minute\")\n .option(\"--timezone <tz>\", \"New timezone\")\n .option(\"--day-of-week <day>\", \"New day of week\")\n .option(\"--day-of-month <day>\", \"New day of month\")\n .action((id, opts) => handleAutomationUpdate(id, opts));\n\nautomation\n .command(\"delete\")\n .description(\"Delete an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationDelete(id));\n\nautomation\n .command(\"test\")\n .description(\"Preview/test an automation\")\n .argument(\"<id>\", \"Automation ID\")\n .action((id) => handleAutomationTest(id));\n\n// ── Memory subcommand ──────────────────────────────────────────────────────\n\nconst memory = program\n .command(\"memory\", { hidden: true })\n .description(\"Manage memory files\");\n\nmemory\n .command(\"list\")\n .description(\"List memory files\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryList(opts));\n\nmemory\n .command(\"read\")\n .description(\"Read a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryRead(fileId));\n\nmemory\n .command(\"write\")\n .description(\"Create or update a memory file\")\n .requiredOption(\"--title <title>\", \"File title\")\n .requiredOption(\"--content <content>\", \"File content\")\n .option(\"--scope <scope>\", \"Scope: project, org, or user\")\n .action((opts) => handleMemoryWrite(opts));\n\nmemory\n .command(\"delete\")\n .description(\"Delete a memory file\")\n .argument(\"<file-id>\", \"Memory file ID\")\n .action((fileId) => handleMemoryDelete(fileId));\n\n// ── Analysis commands ──────────────────────────────────────────────────────\n\nprogram\n .command(\"search-analysis\", { hidden: true })\n .description(\"Search codebase analysis results\")\n .argument(\"<query>\", \"Search query\")\n .option(\"--status <status>\", \"Filter by status\")\n .option(\"--limit <n>\", \"Max results\")\n .action((query, opts) => handleSearchAnalysis(query, opts));\n\nprogram\n .command(\"run-analysis\", { hidden: true })\n .description(\"Run deep codebase analysis workflows\")\n .option(\n \"--prompts <list>\",\n \"Comma-separated: security,architecture,code-quality,performance,ux,dependencies,cost,ai-architecture,ai-security\",\n )\n .action((opts) => handleRunAnalysis(opts));\n\n// ── Integration commands ───────────────────────────────────────────────────\n\nprogram\n .command(\"integrations\", { hidden: true })\n .description(\"List connected integrations\")\n .action(() => handleIntegrations());\n\nprogram\n .command(\"events\", { hidden: true })\n .description(\"Recent integration events (deploys, releases, errors)\")\n .option(\n \"--source <source>\",\n \"Filter: github, sentry, linear, amplitude, stripe\",\n )\n .option(\"--event-type <type>\", \"Filter by event type\")\n .option(\"--project-id <id>\", \"Filter by project\")\n .option(\"--since <duration>\", \"Time range: 1h, 6h, 24h, 7d, 30d\")\n .action((opts) => handleEvents(opts));\n\nprogram\n .command(\"resolve-identity\", { hidden: true })\n .description(\"Resolve external identity to FML user\")\n .argument(\"[username]\", \"External username (shorthand for --username)\")\n .option(\"--provider <p>\", \"Provider: github, linear, slack\")\n .option(\"--username <u>\", \"External username\")\n .option(\"--email <e>\", \"Email address\")\n .option(\"--external-id <id>\", \"External ID\")\n .option(\"--external-user-id <id>\", \"External user ID\")\n .action((username, opts) =>\n handleResolveIdentity(username ? { ...opts, username } : opts),\n );\n\n// ── Slack subcommand ───────────────────────────────────────────────────────\n\nconst slack = program\n .command(\"slack\", { hidden: true })\n .description(\"Slack shortcuts\");\n\nslack\n .command(\"history\")\n .description(\"Recent messages from a channel\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--limit <n>\", \"Max messages\")\n .action((opts) => handleSlackHistory(opts));\n\nslack\n .command(\"message\")\n .description(\"Fetch a specific message\")\n .option(\"--permalink <url>\", \"Message permalink\")\n .option(\"--channel <id>\", \"Channel ID\")\n .option(\"--ts <timestamp>\", \"Message timestamp\")\n .option(\"--include-thread\", \"Include thread context\")\n .action((opts) => handleSlackMessage(opts));\n\n// ── Messages subcommand ────────────────────────────────────────────────────\n\nconst messages = program\n .command(\"messages\", { hidden: true })\n .description(\"Conversation messages\");\n\nmessages\n .command(\"list\")\n .description(\"List messages from a conversation\")\n .option(\"--start <timestamp>\", \"Start time (ms epoch)\")\n .option(\"--end <timestamp>\", \"End time (ms epoch)\")\n .option(\"--limit <n>\", \"Max messages\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .action((opts) => handleMessagesList(opts));\n\nmessages\n .command(\"context\")\n .description(\"Get messages around a specific message\")\n .argument(\"<message-id>\", \"Message ID\")\n .option(\"--before <n>\", \"Messages before\")\n .option(\"--after <n>\", \"Messages after\")\n .action((messageId, opts) => handleMessagesContext(messageId, opts));\n\n// ── Skills subcommand ──────────────────────────────────────────────────────\n\nconst skills = program\n .command(\"skills\", { hidden: true })\n .description(\"Browse and load skills\");\n\nskills\n .command(\"list\")\n .description(\"List available skills\")\n .action(() => handleSkillsList());\n\nskills\n .command(\"load\")\n .description(\"Load a skill by ID\")\n .argument(\"<skill-id>\", \"Skill ID\")\n .action((skillId) => handleSkillsLoad(skillId));\n\n// ── Config subcommand ──────────────────────────────────────────────────────\n\nconst config = program\n .command(\"config\", { hidden: true })\n .description(\"View team config snapshots\");\n\nconfig\n .command(\"list\")\n .description(\"List config snapshots for an org\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--repo <full-name>\", \"Filter by repo (owner/name)\")\n .action((opts) => handleConfigList(opts));\n\nconfig\n .command(\"detail\")\n .description(\"Get config snapshot detail\")\n .requiredOption(\"--org <slug>\", \"Organization slug\")\n .option(\"--user <username>\", \"GitHub username\")\n .option(\"--repo <full-name>\", \"Repository (owner/name)\")\n .action((opts) => handleConfigDetail(opts));\n\n// ────────────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((err) => {\n Sentry.captureException(err);\n console.error(err);\n process.exit(1);\n});\n","import ora from \"ora\";\nimport pc from \"picocolors\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { CONVEX_URL } from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { parsePanopticonRunning } from \"./daemon.js\";\nimport { loadSyncConfig } from \"@fml-inc/panopticon/sync\";\nimport { syncPending } from \"@fml-inc/panopticon/api\";\n\ninterface CheckResult {\n label: string;\n status: \"ok\" | \"warn\" | \"fail\";\n detail: string;\n}\n\nfunction reportResult(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n): void {\n const text = `${result.label} — ${result.detail}`;\n if (spinner) {\n switch (result.status) {\n case \"ok\":\n spinner.succeed(text);\n break;\n case \"warn\":\n spinner.warn(text);\n break;\n case \"fail\":\n spinner.fail(text);\n break;\n }\n } else {\n const icon =\n result.status === \"ok\"\n ? pc.green(\"✓\")\n : result.status === \"warn\"\n ? pc.yellow(\"!\")\n : pc.red(\"✗\");\n console.log(` ${icon} ${result.label} — ${result.detail}`);\n }\n}\n\nexport async function handleDoctor(opts: { json?: boolean }): Promise<void> {\n const isTTY = !opts.json && process.stdout.isTTY === true;\n const checks: CheckResult[] = [];\n\n function startSpinner(label: string): ReturnType<typeof ora> | null {\n if (!isTTY) return null;\n return ora({ text: `Checking ${label}...`, indent: 2 }).start();\n }\n\n function pushAndReport(\n result: CheckResult,\n spinner: ReturnType<typeof ora> | null,\n ): void {\n checks.push(result);\n if (!opts.json) {\n reportResult(result, spinner);\n }\n }\n\n if (!opts.json && !isTTY) {\n console.log(\"\");\n }\n\n // 1. Auth check\n let token: string | null = null;\n {\n const spinner = startSpinner(\"auth\");\n token = await getValidToken();\n if (token) {\n const stored = readTokens();\n const detail = stored?.user?.email\n ? `Logged in as ${stored.user.email}`\n : \"Token present\";\n pushAndReport({ label: \"Auth\", status: \"ok\", detail }, spinner);\n } else {\n pushAndReport(\n {\n label: \"Auth\",\n status: \"fail\",\n detail: \"No token. Run `fml login`\",\n },\n spinner,\n );\n }\n }\n\n // 2. Panopticon checks (imported dynamically to avoid hard dep on published version)\n {\n const spinner = startSpinner(\"panopticon\");\n try {\n const { doctor } = await import(\"@fml-inc/panopticon/doctor\");\n const result = await doctor();\n // Close the spinner before reporting individual checks\n if (spinner) spinner.stop();\n for (const check of result.checks) {\n pushAndReport(check, null);\n }\n } catch {\n // Panopticon doctor not available — check via CLI\n const result = panopticonExec(\"status\");\n if (result.ok) {\n pushAndReport(\n { label: \"Panopticon\", status: \"ok\", detail: \"Available\" },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon\",\n status: \"fail\",\n detail: \"Not found. Run `fml install`\",\n },\n spinner,\n );\n }\n }\n }\n\n // 3. Sync status (only if authenticated)\n if (token) {\n const spinner = startSpinner(\"sync\");\n try {\n const syncConfig = loadSyncConfig();\n const targets = syncConfig.targets;\n if (targets.length === 0) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: \"No sync targets configured\",\n },\n spinner,\n );\n } else {\n // Close the spinner before reporting per-target\n if (spinner) spinner.stop();\n\n for (const target of targets) {\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"ok\",\n detail: \"Up to date\",\n },\n null,\n );\n } else {\n const parts = Object.entries(result.tables)\n .sort(([, a], [, b]) => b.pending - a.pending)\n .slice(0, 3)\n .map(([t, v]) => `${v.pending} ${t}`);\n const detail =\n parts.length < Object.keys(result.tables).length\n ? `${result.totalPending} pending (${parts.join(\", \")}, ...)`\n : `${result.totalPending} pending (${parts.join(\", \")})`;\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: result.totalPending > 1000 ? \"warn\" : \"ok\",\n detail,\n },\n null,\n );\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n pushAndReport(\n {\n label: `Sync → ${target.name}`,\n status: \"warn\",\n detail: `Could not query watermarks (${msg})`,\n },\n null,\n );\n }\n }\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"Sync\",\n status: \"warn\",\n detail: err instanceof Error ? err.message : \"Check failed\",\n },\n spinner,\n );\n }\n }\n\n // 4. Daemon checks\n {\n const spinner = startSpinner(\"panopticon daemon\");\n const isRunning = parsePanopticonRunning();\n if (isRunning) {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"ok\",\n detail: \"running\",\n },\n spinner,\n );\n } else {\n pushAndReport(\n {\n label: \"Panopticon daemon\",\n status: \"warn\",\n detail: \"Not running. Run `fml start`\",\n },\n spinner,\n );\n }\n }\n\n // 5. API reachability\n {\n const spinner = startSpinner(\"API\");\n if (token) {\n try {\n const result = await createApiClient(token).callBackend(\"ping\", {});\n if (result.ok) {\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n } else {\n // Backend responded but tool failed — still reachable\n pushAndReport(\n {\n label: \"API\",\n status: \"ok\",\n detail: `Reachable at ${CONVEX_URL}`,\n },\n spinner,\n );\n }\n } catch (err) {\n pushAndReport(\n {\n label: \"API\",\n status: \"fail\",\n detail: err instanceof Error ? err.message : \"Unreachable\",\n },\n spinner,\n );\n }\n } else {\n pushAndReport(\n { label: \"API\", status: \"fail\", detail: \"Auth required\" },\n spinner,\n );\n }\n }\n\n // JSON output\n if (opts.json) {\n console.log(JSON.stringify(checks, null, 2));\n return;\n }\n\n // Summary\n console.log(\"\");\n const passed = checks.filter((c) => c.status === \"ok\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n const parts: string[] = [];\n if (passed > 0) parts.push(pc.green(`${passed} passed`));\n if (warned > 0)\n parts.push(pc.yellow(`${warned} warning${warned > 1 ? \"s\" : \"\"}`));\n if (failed > 0) parts.push(pc.red(`${failed} failed`));\n\n console.log(` ${parts.join(\", \")}`);\n console.log(\"\");\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { Logger } from \"tslog\";\n\nfunction getLogDir(): string {\n switch (process.platform) {\n case \"darwin\":\n return path.join(os.homedir(), \"Library\", \"Logs\", \"panopticon\");\n case \"win32\":\n return path.join(\n process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\"),\n \"panopticon\",\n \"logs\",\n );\n default:\n // Linux and other Unix-like\n return path.join(\n process.env.XDG_STATE_HOME ??\n path.join(os.homedir(), \".local\", \"state\"),\n \"panopticon\",\n \"logs\",\n );\n }\n}\n\nexport const LOG_DIR = getLogDir();\n\nexport const logPaths = {\n server: path.join(LOG_DIR, \"server.log\"),\n otlp: path.join(LOG_DIR, \"otlp-receiver.log\"),\n mcp: path.join(LOG_DIR, \"mcp-server.log\"),\n proxy: path.join(LOG_DIR, \"proxy.log\"),\n hook: path.join(LOG_DIR, \"hook-handler.log\"),\n} as const;\n\nexport type DaemonName = keyof typeof logPaths;\n\nexport const DAEMON_NAMES = Object.keys(logPaths) as DaemonName[];\n\n/**\n * Open a log file in append mode, returning the fd.\n * Pass the fd to spawn's stdio array: [\"ignore\", fd, fd]\n * Close the fd after spawn — the child inherits its own copy.\n */\nexport function openLogFd(daemon: DaemonName): number {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n return fs.openSync(logPaths[daemon], \"a\");\n}\n\nconst root = new Logger({\n name: \"panopticon\",\n type: \"pretty\",\n prettyLogTimeZone: \"UTC\",\n stylePrettyLogs: false,\n prettyLogTemplate: \"{{dateIsoStr}} [{{name}}] {{logLevelName}}\\t\",\n});\n\nexport const log = {\n server: root.getSubLogger({ name: \"server\" }),\n scanner: root.getSubLogger({ name: \"scanner\" }),\n sync: root.getSubLogger({ name: \"sync\" }),\n proxy: root.getSubLogger({ name: \"proxy\" }),\n llm: root.getSubLogger({ name: \"llm\" }),\n mcp: root.getSubLogger({ name: \"mcp\" }),\n otlp: root.getSubLogger({ name: \"otlp\" }),\n hooks: root.getSubLogger({ name: \"hooks\" }),\n};\n","export function urlToObject(url) {\n return {\n href: url.href,\n protocol: url.protocol,\n username: url.username,\n password: url.password,\n host: url.host,\n hostname: url.hostname,\n port: url.port,\n pathname: url.pathname,\n search: url.search,\n searchParams: [...url.searchParams].map(([key, value]) => ({ key, value })),\n hash: url.hash,\n origin: url.origin,\n };\n}\n","export const prettyLogStyles = {\n reset: [0, 0],\n bold: [1, 22],\n dim: [2, 22],\n italic: [3, 23],\n underline: [4, 24],\n overline: [53, 55],\n inverse: [7, 27],\n hidden: [8, 28],\n strikethrough: [9, 29],\n black: [30, 39],\n red: [31, 39],\n green: [32, 39],\n yellow: [33, 39],\n blue: [34, 39],\n magenta: [35, 39],\n cyan: [36, 39],\n white: [37, 39],\n blackBright: [90, 39],\n redBright: [91, 39],\n greenBright: [92, 39],\n yellowBright: [93, 39],\n blueBright: [94, 39],\n magentaBright: [95, 39],\n cyanBright: [96, 39],\n whiteBright: [97, 39],\n bgBlack: [40, 49],\n bgRed: [41, 49],\n bgGreen: [42, 49],\n bgYellow: [43, 49],\n bgBlue: [44, 49],\n bgMagenta: [45, 49],\n bgCyan: [46, 49],\n bgWhite: [47, 49],\n bgBlackBright: [100, 49],\n bgRedBright: [101, 49],\n bgGreenBright: [102, 49],\n bgYellowBright: [103, 49],\n bgBlueBright: [104, 49],\n bgMagentaBright: [105, 49],\n bgCyanBright: [106, 49],\n bgWhiteBright: [107, 49],\n};\n","import { prettyLogStyles } from \"./prettyLogStyles.js\";\nexport function formatTemplate(settings, template, values, hideUnsetPlaceholder = false) {\n const templateString = String(template);\n const ansiColorWrap = (placeholderValue, code) => `\\u001b[${code[0]}m${placeholderValue}\\u001b[${code[1]}m`;\n const styleWrap = (value, style) => {\n if (style != null && typeof style === \"string\") {\n return ansiColorWrap(value, prettyLogStyles[style]);\n }\n else if (style != null && Array.isArray(style)) {\n return style.reduce((prevValue, thisStyle) => styleWrap(prevValue, thisStyle), value);\n }\n else {\n if (style != null && style[value.trim()] != null) {\n return styleWrap(value, style[value.trim()]);\n }\n else if (style != null && style[\"*\"] != null) {\n return styleWrap(value, style[\"*\"]);\n }\n else {\n return value;\n }\n }\n };\n const defaultStyle = null;\n return templateString.replace(/{{(.+?)}}/g, (_, placeholder) => {\n const value = values[placeholder] != null ? String(values[placeholder]) : hideUnsetPlaceholder ? \"\" : _;\n return settings.stylePrettyLogs\n ? styleWrap(value, settings?.prettyLogStyles?.[placeholder] ?? defaultStyle) + ansiColorWrap(\"\", prettyLogStyles.reset)\n : value;\n });\n}\n","export function formatNumberAddZeros(value, digits = 2, addNumber = 0) {\n if (value != null && isNaN(value)) {\n return \"\";\n }\n value = value != null ? value + addNumber : value;\n return digits === 2\n ? value == null\n ? \"--\"\n : value < 10\n ? \"0\" + value\n : value.toString()\n : value == null\n ? \"---\"\n : value < 10\n ? \"00\" + value\n : value < 100\n ? \"0\" + value\n : value.toString();\n}\n","import { formatTemplate } from \"../formatTemplate.js\";\nimport { formatNumberAddZeros } from \"../formatNumberAddZeros.js\";\nexport function buildPrettyMeta(settings, meta) {\n if (meta == null) {\n return {\n text: \"\",\n template: settings.prettyLogTemplate,\n placeholders: {},\n };\n }\n let template = settings.prettyLogTemplate;\n const placeholderValues = {};\n if (template.includes(\"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\")) {\n template = template.replace(\"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\", \"{{dateIsoStr}}\");\n }\n else {\n if (settings.prettyLogTimeZone === \"UTC\") {\n placeholderValues[\"yyyy\"] = meta.date?.getUTCFullYear() ?? \"----\";\n placeholderValues[\"mm\"] = formatNumberAddZeros(meta.date?.getUTCMonth(), 2, 1);\n placeholderValues[\"dd\"] = formatNumberAddZeros(meta.date?.getUTCDate(), 2);\n placeholderValues[\"hh\"] = formatNumberAddZeros(meta.date?.getUTCHours(), 2);\n placeholderValues[\"MM\"] = formatNumberAddZeros(meta.date?.getUTCMinutes(), 2);\n placeholderValues[\"ss\"] = formatNumberAddZeros(meta.date?.getUTCSeconds(), 2);\n placeholderValues[\"ms\"] = formatNumberAddZeros(meta.date?.getUTCMilliseconds(), 3);\n }\n else {\n placeholderValues[\"yyyy\"] = meta.date?.getFullYear() ?? \"----\";\n placeholderValues[\"mm\"] = formatNumberAddZeros(meta.date?.getMonth(), 2, 1);\n placeholderValues[\"dd\"] = formatNumberAddZeros(meta.date?.getDate(), 2);\n placeholderValues[\"hh\"] = formatNumberAddZeros(meta.date?.getHours(), 2);\n placeholderValues[\"MM\"] = formatNumberAddZeros(meta.date?.getMinutes(), 2);\n placeholderValues[\"ss\"] = formatNumberAddZeros(meta.date?.getSeconds(), 2);\n placeholderValues[\"ms\"] = formatNumberAddZeros(meta.date?.getMilliseconds(), 3);\n }\n }\n const dateInSettingsTimeZone = settings.prettyLogTimeZone === \"UTC\" ? meta.date : meta.date != null ? new Date(meta.date.getTime() - meta.date.getTimezoneOffset() * 60000) : undefined;\n placeholderValues[\"rawIsoStr\"] = dateInSettingsTimeZone?.toISOString() ?? \"\";\n placeholderValues[\"dateIsoStr\"] = dateInSettingsTimeZone?.toISOString().replace(\"T\", \" \").replace(\"Z\", \"\") ?? \"\";\n placeholderValues[\"logLevelName\"] = meta.logLevelName;\n placeholderValues[\"fileNameWithLine\"] = meta.path?.fileNameWithLine ?? \"\";\n placeholderValues[\"filePathWithLine\"] = meta.path?.filePathWithLine ?? \"\";\n placeholderValues[\"fullFilePath\"] = meta.path?.fullFilePath ?? \"\";\n let parentNamesString = settings.parentNames?.join(settings.prettyErrorParentNamesSeparator);\n parentNamesString = parentNamesString != null && meta.name != null ? parentNamesString + settings.prettyErrorParentNamesSeparator : undefined;\n const combinedName = meta.name != null || parentNamesString != null ? `${parentNamesString ?? \"\"}${meta.name ?? \"\"}` : \"\";\n placeholderValues[\"name\"] = combinedName;\n placeholderValues[\"nameWithDelimiterPrefix\"] = combinedName.length > 0 ? settings.prettyErrorLoggerNameDelimiter + combinedName : \"\";\n placeholderValues[\"nameWithDelimiterSuffix\"] = combinedName.length > 0 ? combinedName + settings.prettyErrorLoggerNameDelimiter : \"\";\n if (settings.overwrite?.addPlaceholders != null) {\n settings.overwrite.addPlaceholders(meta, placeholderValues);\n }\n return {\n text: formatTemplate(settings, template, placeholderValues),\n template,\n placeholders: placeholderValues,\n };\n}\n","const DEFAULT_IGNORE_PATTERNS = [\n /(?:^|[\\\\/])node_modules[\\\\/].*tslog/i,\n /(?:^|[\\\\/])deps[\\\\/].*tslog/i,\n /tslog[\\\\/]+src[\\\\/]+internal[\\\\/]/i,\n /tslog[\\\\/]+src[\\\\/]BaseLogger/i,\n /tslog[\\\\/]+src[\\\\/]index/i,\n];\nexport function splitStackLines(error) {\n const stack = typeof error?.stack === \"string\" ? error.stack : undefined;\n if (stack == null || stack.length === 0) {\n return [];\n }\n return stack.split(\"\\n\").map((line) => line.trimEnd());\n}\nexport function sanitizeStackLines(lines) {\n return lines.filter((line) => line.length > 0 && !/^\\s*Error\\b/.test(line));\n}\nexport function toStackFrames(lines, parseLine) {\n const frames = [];\n for (const line of lines) {\n const frame = parseLine(line);\n if (frame != null) {\n frames.push(frame);\n }\n }\n return frames;\n}\nexport function findFirstExternalFrameIndex(frames, ignorePatterns = DEFAULT_IGNORE_PATTERNS) {\n for (let index = 0; index < frames.length; index += 1) {\n const frame = frames[index];\n const filePathCandidate = frame.filePath ?? \"\";\n const fullPathCandidate = frame.fullFilePath ?? \"\";\n if (!ignorePatterns.some((pattern) => pattern.test(filePathCandidate) || pattern.test(fullPathCandidate))) {\n return index;\n }\n }\n return 0;\n}\nexport function getFrameAt(frames, index) {\n if (index < 0 || index >= frames.length) {\n return undefined;\n }\n return frames[index];\n}\nexport function getCleanStackLines(error) {\n return sanitizeStackLines(splitStackLines(error));\n}\nexport function buildStackTrace(error, parseLine) {\n return toStackFrames(getCleanStackLines(error), parseLine);\n}\nexport function isIgnorableFrame(frame, ignorePatterns) {\n const filePathCandidate = frame.filePath ?? \"\";\n const fullPathCandidate = frame.fullFilePath ?? \"\";\n return ignorePatterns.some((pattern) => pattern.test(filePathCandidate) || pattern.test(fullPathCandidate));\n}\nexport function clampIndex(index, maxExclusive) {\n if (index < 0) {\n return 0;\n }\n if (index >= maxExclusive) {\n return Math.max(0, maxExclusive - 1);\n }\n return index;\n}\nexport function pickCallerStackFrame(error, parseLine, options = {}) {\n const lines = getCleanStackLines(error);\n const frames = toStackFrames(lines, parseLine);\n if (frames.length === 0) {\n return undefined;\n }\n const ignorePatterns = options.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS;\n const autoIndex = findFirstExternalFrameIndex(frames, ignorePatterns);\n const resolvedIndex = options.stackDepthLevel != null ? options.stackDepthLevel : autoIndex;\n return getFrameAt(frames, clampIndex(resolvedIndex, frames.length));\n}\nexport function getDefaultIgnorePatterns() {\n return [...DEFAULT_IGNORE_PATTERNS];\n}\n","import { buildStackTrace } from \"./stackTrace.js\";\nconst DEFAULT_CAUSE_DEPTH = 5;\nexport function collectErrorCauses(error, options = {}) {\n const maxDepth = options.maxDepth ?? DEFAULT_CAUSE_DEPTH;\n const causes = [];\n const visited = new Set();\n let current = error;\n let depth = 0;\n while (current != null && depth < maxDepth) {\n const cause = current?.cause;\n if (cause == null || visited.has(cause)) {\n break;\n }\n visited.add(cause);\n causes.push(toError(cause));\n current = cause;\n depth += 1;\n }\n return causes;\n}\nexport function toError(value) {\n if (value instanceof Error) {\n return value;\n }\n const error = new Error(typeof value === \"string\" ? value : JSON.stringify(value));\n if (typeof value === \"object\" && value != null) {\n Object.assign(error, value);\n }\n return error;\n}\nexport function toErrorObject(error, parseLine) {\n return {\n nativeError: error,\n name: error.name ?? \"Error\",\n message: error.message ?? \"\",\n stack: buildStackTrace(error, parseLine),\n };\n}\n","export function jsonStringifyRecursive(obj) {\n const cache = new Set();\n return JSON.stringify(obj, (key, value) => {\n if (typeof value === \"object\" && value !== null) {\n if (cache.has(value)) {\n return \"[Circular]\";\n }\n cache.add(value);\n }\n if (typeof value === \"bigint\") {\n return `${value}`;\n }\n if (typeof value === \"undefined\") {\n return \"[undefined]\";\n }\n return value;\n });\n}\n","import { prettyLogStyles } from \"../prettyLogStyles.js\";\nimport { jsonStringifyRecursive } from \"./jsonStringifyRecursive.js\";\nexport function inspect(obj, opts) {\n const ctx = {\n seen: [],\n stylize: stylizeNoColor,\n };\n if (opts != null) {\n _extend(ctx, opts);\n }\n if (isUndefined(ctx.showHidden))\n ctx.showHidden = false;\n if (isUndefined(ctx.depth))\n ctx.depth = 2;\n if (isUndefined(ctx.colors))\n ctx.colors = true;\n if (isUndefined(ctx.customInspect))\n ctx.customInspect = true;\n if (ctx.colors)\n ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\ninspect.colors = prettyLogStyles;\ninspect.styles = {\n special: \"cyan\",\n number: \"yellow\",\n boolean: \"yellow\",\n undefined: \"grey\",\n null: \"bold\",\n string: \"green\",\n date: \"magenta\",\n regexp: \"red\",\n};\nfunction isBoolean(arg) {\n return typeof arg === \"boolean\";\n}\nfunction isUndefined(arg) {\n return arg === undefined;\n}\nfunction stylizeNoColor(str) {\n return str;\n}\nfunction stylizeWithColor(str, styleType) {\n const style = inspect.styles[styleType];\n if (style != null && inspect?.colors?.[style]?.[0] != null && inspect?.colors?.[style]?.[1] != null) {\n return \"\\u001b[\" + inspect.colors[style][0] + \"m\" + str + \"\\u001b[\" + inspect.colors[style][1] + \"m\";\n }\n else {\n return str;\n }\n}\nfunction isFunction(arg) {\n return typeof arg === \"function\";\n}\nfunction isString(arg) {\n return typeof arg === \"string\";\n}\nfunction isNumber(arg) {\n return typeof arg === \"number\";\n}\nfunction isNull(arg) {\n return arg === null;\n}\nfunction hasOwn(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === \"[object RegExp]\";\n}\nfunction isObject(arg) {\n return typeof arg === \"object\" && arg !== null;\n}\nfunction isError(e) {\n return isObject(e) && (objectToString(e) === \"[object Error]\" || e instanceof Error);\n}\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === \"[object Date]\";\n}\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\nfunction arrayToHash(array) {\n const hash = {};\n array.forEach((val) => {\n hash[val] = true;\n });\n return hash;\n}\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n const output = [];\n for (let i = 0, l = value.length; i < l; ++i) {\n if (hasOwn(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));\n }\n else {\n output.push(\"\");\n }\n }\n keys.forEach((key) => {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));\n }\n });\n return output;\n}\nfunction formatError(value) {\n return \"[\" + Error.prototype.toString.call(value) + \"]\";\n}\nexport function formatValue(ctx, value, recurseTimes = 0) {\n if (ctx.customInspect &&\n value != null &&\n isFunction(value) &&\n value?.inspect !== inspect &&\n !(value?.constructor && value?.constructor.prototype === value)) {\n if (typeof value.inspect !== \"function\" && value.toString != null) {\n return value.toString();\n }\n let ret = value?.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n const primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n let keys = Object.keys(value);\n const visibleKeys = arrayToHash(keys);\n try {\n if (ctx.showHidden && Object.getOwnPropertyNames) {\n keys = Object.getOwnPropertyNames(value);\n }\n }\n catch {\n }\n if (isError(value) && (keys.indexOf(\"message\") >= 0 || keys.indexOf(\"description\") >= 0)) {\n return formatError(value);\n }\n if (keys.length === 0) {\n if (isFunction(ctx.stylize)) {\n if (isFunction(value)) {\n const name = value.name ? \": \" + value.name : \"\";\n return ctx.stylize(\"[Function\" + name + \"]\", \"special\");\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), \"regexp\");\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toISOString.call(value), \"date\");\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n else {\n return value;\n }\n }\n let base = \"\";\n let array = false;\n let braces = [\"{\\n\", \"\\n}\"];\n if (Array.isArray(value)) {\n array = true;\n braces = [\"[\\n\", \"\\n]\"];\n }\n if (isFunction(value)) {\n const n = value.name ? \": \" + value.name : \"\";\n base = \" [Function\" + n + \"]\";\n }\n if (isRegExp(value)) {\n base = \" \" + RegExp.prototype.toString.call(value);\n }\n if (isDate(value)) {\n base = \" \" + Date.prototype.toUTCString.call(value);\n }\n if (isError(value)) {\n base = \" \" + formatError(value);\n }\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), \"regexp\");\n }\n else {\n return ctx.stylize(\"[Object]\", \"special\");\n }\n }\n ctx.seen.push(value);\n let output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n }\n else {\n output = keys.map((key) => {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n ctx.seen.pop();\n return reduceToSingleString(output, base, braces);\n}\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n let name, str;\n let desc = { value: void 0 };\n try {\n desc.value = value[key];\n }\n catch {\n }\n try {\n if (Object.getOwnPropertyDescriptor) {\n desc = Object.getOwnPropertyDescriptor(value, key) || desc;\n }\n }\n catch {\n }\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize(\"[Getter/Setter]\", \"special\");\n }\n else {\n str = ctx.stylize(\"[Getter]\", \"special\");\n }\n }\n else {\n if (desc.set) {\n str = ctx.stylize(\"[Setter]\", \"special\");\n }\n }\n if (!hasOwn(visibleKeys, key)) {\n name = \"[\" + key + \"]\";\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, undefined);\n }\n else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf(\"\\n\") > -1) {\n if (array) {\n str = str\n .split(\"\\n\")\n .map((line) => {\n return \" \" + line;\n })\n .join(\"\\n\")\n .substr(2);\n }\n else {\n str =\n \"\\n\" +\n str\n .split(\"\\n\")\n .map((line) => {\n return \" \" + line;\n })\n .join(\"\\n\");\n }\n }\n }\n else {\n str = ctx.stylize(\"[Circular]\", \"special\");\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify(\"\" + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, \"name\");\n }\n else {\n name = name\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, \"\\\\'\")\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, \"string\");\n }\n }\n return name + \": \" + str;\n}\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize(\"undefined\", \"undefined\");\n if (isString(value)) {\n const simple = \"'\" + JSON.stringify(value).replace(/^\"|\"$/g, \"\").replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, \"\\\\'\") + \"'\";\n return ctx.stylize(simple, \"string\");\n }\n if (isNumber(value))\n return ctx.stylize(\"\" + value, \"number\");\n if (isBoolean(value))\n return ctx.stylize(\"\" + value, \"boolean\");\n if (isNull(value))\n return ctx.stylize(\"null\", \"null\");\n}\nfunction reduceToSingleString(output, base, braces) {\n return braces[0] + (base === \"\" ? \"\" : base + \"\\n\") + \" \" + output.join(\",\\n \") + \" \" + braces[1];\n}\nfunction _extend(origin, add) {\n const typedOrigin = { ...origin };\n if (!add || !isObject(add))\n return origin;\n const clonedAdd = { ...add };\n const keys = Object.keys(add);\n let i = keys.length;\n while (i--) {\n typedOrigin[keys[i]] = clonedAdd[keys[i]];\n }\n return typedOrigin;\n}\nexport function formatWithOptions(inspectOptions, ...args) {\n const ctx = {\n seen: [],\n stylize: stylizeNoColor,\n };\n if (inspectOptions != null) {\n _extend(ctx, inspectOptions);\n }\n const first = args[0];\n let a = 0;\n let str = \"\";\n let join = \"\";\n if (typeof first === \"string\") {\n if (args.length === 1) {\n return first;\n }\n let tempStr;\n let lastPos = 0;\n for (let i = 0; i < first.length - 1; i++) {\n if (first.charCodeAt(i) === 37) {\n const nextChar = first.charCodeAt(++i);\n if (a + 1 !== args.length) {\n switch (nextChar) {\n case 115: {\n const tempArg = args[++a];\n if (typeof tempArg === \"number\") {\n tempStr = formatPrimitive(ctx, tempArg);\n }\n else if (typeof tempArg === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempArg);\n }\n else if (typeof tempArg !== \"object\" || tempArg === null) {\n tempStr = String(tempArg);\n }\n else {\n tempStr = inspect(tempArg, {\n ...inspectOptions,\n compact: 3,\n colors: false,\n depth: 0,\n });\n }\n break;\n }\n case 106:\n tempStr = jsonStringifyRecursive(args[++a]);\n break;\n case 100: {\n const tempNum = args[++a];\n if (typeof tempNum === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempNum);\n }\n else if (typeof tempNum === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, tempNum);\n }\n break;\n }\n case 79:\n tempStr = inspect(args[++a], inspectOptions);\n break;\n case 111:\n tempStr = inspect(args[++a], {\n ...inspectOptions,\n showHidden: true,\n showProxy: true,\n depth: 4,\n });\n break;\n case 105: {\n const tempInteger = args[++a];\n if (typeof tempInteger === \"bigint\") {\n tempStr = formatPrimitive(ctx, tempInteger);\n }\n else if (typeof tempInteger === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, parseInt(tempStr));\n }\n break;\n }\n case 102: {\n const tempFloat = args[++a];\n if (typeof tempFloat === \"symbol\") {\n tempStr = \"NaN\";\n }\n else {\n tempStr = formatPrimitive(ctx, parseInt(tempFloat));\n }\n break;\n }\n case 99:\n a += 1;\n tempStr = \"\";\n break;\n case 37:\n str += first.slice(lastPos, i);\n lastPos = i + 1;\n continue;\n default:\n continue;\n }\n if (lastPos !== i - 1) {\n str += first.slice(lastPos, i - 1);\n }\n str += tempStr;\n lastPos = i + 1;\n }\n else if (nextChar === 37) {\n str += first.slice(lastPos, i);\n lastPos = i + 1;\n }\n }\n }\n if (lastPos !== 0) {\n a++;\n join = \" \";\n if (lastPos < first.length) {\n str += first.slice(lastPos);\n }\n }\n }\n while (a < args.length) {\n const value = args[a];\n str += join;\n str += typeof value !== \"string\" ? inspect(value, inspectOptions) : value;\n join = \" \";\n a++;\n }\n return str;\n}\n","export function safeGetCwd() {\n try {\n const nodeProcess = globalThis?.process;\n if (typeof nodeProcess?.cwd === \"function\") {\n return nodeProcess.cwd();\n }\n }\n catch {\n }\n try {\n const deno = globalThis?.[\"Deno\"];\n if (typeof deno?.cwd === \"function\") {\n return deno.cwd();\n }\n }\n catch {\n }\n return undefined;\n}\nexport function isBrowserEnvironment() {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\nexport function consoleSupportsCssStyling() {\n if (!isBrowserEnvironment()) {\n return false;\n }\n const navigatorObj = globalThis?.navigator;\n const userAgent = navigatorObj?.userAgent ?? \"\";\n if (/firefox/i.test(userAgent)) {\n return true;\n }\n const windowObj = globalThis;\n if (windowObj?.CSS?.supports?.(\"color\", \"#000\")) {\n return true;\n }\n return /safari/i.test(userAgent) && !/chrome/i.test(userAgent);\n}\n","import { urlToObject } from \"./urlToObj.js\";\nimport { buildPrettyMeta } from \"./internal/metaFormatting.js\";\nimport { toError, collectErrorCauses } from \"./internal/errorUtils.js\";\nimport { formatTemplate } from \"./formatTemplate.js\";\nimport { formatWithOptions } from \"./internal/util.inspect.polyfill.js\";\nimport { buildStackTrace, findFirstExternalFrameIndex, clampIndex, getDefaultIgnorePatterns } from \"./internal/stackTrace.js\";\nimport { safeGetCwd, consoleSupportsCssStyling, isBrowserEnvironment } from \"./internal/environment.js\";\nimport { jsonStringifyRecursive } from \"./internal/jsonStringifyRecursive.js\";\nexport function createLoggerEnvironment() {\n const runtimeInfo = detectRuntimeInfo();\n const meta = createRuntimeMeta(runtimeInfo);\n const usesBrowserStack = runtimeInfo.name === \"browser\" || runtimeInfo.name === \"worker\";\n const callerIgnorePatterns = usesBrowserStack\n ? [...getDefaultIgnorePatterns(), /node_modules[\\\\/].*tslog/i]\n : [...getDefaultIgnorePatterns(), /node:(?:internal|vm)/i, /\\binternal[\\\\/]/i];\n let cachedCwd;\n const environment = {\n getMeta(logLevelId, logLevelName, stackDepthLevel, hideLogPositionForPerformance, name, parentNames) {\n return Object.assign({}, meta, {\n name,\n parentNames,\n date: new Date(),\n logLevelId,\n logLevelName,\n path: !hideLogPositionForPerformance ? environment.getCallerStackFrame(stackDepthLevel) : undefined,\n });\n },\n getCallerStackFrame(stackDepthLevel, error = new Error()) {\n const frames = buildStackTrace(error, (line) => parseStackLine(line));\n if (frames.length === 0) {\n return {};\n }\n const autoIndex = findFirstExternalFrameIndex(frames, callerIgnorePatterns);\n const useManualIndex = Number.isFinite(stackDepthLevel) && stackDepthLevel >= 0;\n const resolvedIndex = useManualIndex ? clampIndex(stackDepthLevel, frames.length) : clampIndex(autoIndex, frames.length);\n return frames[resolvedIndex] ?? {};\n },\n getErrorTrace(error) {\n return buildStackTrace(error, (line) => parseStackLine(line));\n },\n isError(value) {\n return isNativeError(value);\n },\n isBuffer(value) {\n return typeof Buffer !== \"undefined\" && typeof Buffer.isBuffer === \"function\" ? Buffer.isBuffer(value) : false;\n },\n prettyFormatLogObj(maskedArgs, settings) {\n return maskedArgs.reduce((result, arg) => {\n if (environment.isError(arg)) {\n result.errors.push(environment.prettyFormatErrorObj(arg, settings));\n }\n else {\n result.args.push(arg);\n }\n return result;\n }, { args: [], errors: [] });\n },\n prettyFormatErrorObj(error, settings) {\n const stackLines = formatStackFrames(environment.getErrorTrace(error), settings);\n const causeSections = collectErrorCauses(error).map((cause, index) => {\n const header = `Caused by (${index + 1}): ${cause.name ?? \"Error\"}${cause.message ? `: ${cause.message}` : \"\"}`;\n const frames = formatStackFrames(buildStackTrace(cause, (line) => parseStackLine(line)), settings);\n return [header, ...frames].join(\"\\n\");\n });\n const placeholderValuesError = {\n errorName: ` ${error.name} `,\n errorMessage: formatErrorMessage(error),\n errorStack: [...stackLines, ...causeSections].join(\"\\n\"),\n };\n return formatTemplate(settings, settings.prettyErrorTemplate, placeholderValuesError);\n },\n transportFormatted(logMetaMarkup, logArgs, logErrors, logMeta, settings) {\n const prettyLogs = settings.stylePrettyLogs !== false;\n const logErrorsStr = (logErrors.length > 0 && logArgs.length > 0 ? \"\\n\" : \"\") + logErrors.join(\"\\n\");\n const sanitizedMetaMarkup = stripAnsi(logMetaMarkup);\n const metaMarkupForText = prettyLogs ? logMetaMarkup : sanitizedMetaMarkup;\n if (shouldUseCss(prettyLogs)) {\n settings.prettyInspectOptions.colors = false;\n const formattedArgs = formatWithOptionsSafe(settings.prettyInspectOptions, logArgs);\n const cssMeta = logMeta != null ? buildCssMetaOutput(settings, logMeta) : { text: sanitizedMetaMarkup, styles: [] };\n const hasCssMeta = cssMeta.text.length > 0 && cssMeta.styles.length > 0;\n const metaOutput = hasCssMeta ? cssMeta.text : sanitizedMetaMarkup;\n const output = metaOutput + formattedArgs + logErrorsStr;\n if (hasCssMeta) {\n console.log(output, ...cssMeta.styles);\n }\n else {\n console.log(output);\n }\n return;\n }\n settings.prettyInspectOptions.colors = prettyLogs;\n const formattedArgs = formatWithOptionsSafe(settings.prettyInspectOptions, logArgs);\n console.log(metaMarkupForText + formattedArgs + logErrorsStr);\n },\n transportJSON(json) {\n console.log(jsonStringifyRecursive(json));\n },\n };\n if (getNodeEnv() === \"test\") {\n environment.__resetWorkingDirectoryCacheForTests = () => {\n cachedCwd = undefined;\n };\n }\n return environment;\n function parseStackLine(line) {\n return usesBrowserStack ? parseBrowserStackLine(line) : parseServerStackLine(line);\n }\n function parseServerStackLine(rawLine) {\n if (typeof rawLine !== \"string\" || rawLine.length === 0) {\n return undefined;\n }\n const trimmedLine = rawLine.trim();\n if (!trimmedLine.includes(\" at \") && !trimmedLine.startsWith(\"at \")) {\n return undefined;\n }\n const line = trimmedLine.replace(/^at\\s+/, \"\");\n let method;\n let location = line;\n const methodMatch = line.match(/^(.*?)\\s+\\((.*)\\)$/);\n if (methodMatch) {\n method = methodMatch[1];\n location = methodMatch[2];\n }\n const sanitizedLocation = location.replace(/^\\(/, \"\").replace(/\\)$/, \"\");\n const withoutQuery = sanitizedLocation.replace(/\\?.*$/, \"\");\n let fileLine;\n let fileColumn;\n let filePathCandidate = withoutQuery;\n const segments = withoutQuery.split(\":\");\n if (segments.length >= 3 && /^\\d+$/.test(segments[segments.length - 1] ?? \"\")) {\n fileColumn = segments.pop();\n fileLine = segments.pop();\n filePathCandidate = segments.join(\":\");\n }\n else if (segments.length >= 2 && /^\\d+$/.test(segments[segments.length - 1] ?? \"\")) {\n fileLine = segments.pop();\n filePathCandidate = segments.join(\":\");\n }\n let normalizedPath = filePathCandidate.replace(/^file:\\/\\//, \"\");\n const cwd = getWorkingDirectory();\n if (cwd != null && normalizedPath.startsWith(cwd)) {\n normalizedPath = normalizedPath.slice(cwd.length);\n normalizedPath = normalizedPath.replace(/^[\\\\/]/, \"\");\n }\n if (normalizedPath.length === 0) {\n normalizedPath = filePathCandidate;\n }\n const normalizedPathWithoutLine = normalizeFilePath(normalizedPath);\n const effectivePath = normalizedPathWithoutLine.length > 0 ? normalizedPathWithoutLine : normalizedPath;\n const pathSegments = effectivePath.split(/\\\\|\\//);\n const fileName = pathSegments[pathSegments.length - 1];\n const fileNameWithLine = fileName && fileLine ? `${fileName}:${fileLine}` : undefined;\n const filePathWithLine = effectivePath && fileLine ? `${effectivePath}:${fileLine}` : undefined;\n return {\n fullFilePath: sanitizedLocation,\n fileName,\n fileNameWithLine,\n fileColumn,\n fileLine,\n filePath: effectivePath,\n filePathWithLine,\n method,\n };\n }\n function parseBrowserStackLine(line) {\n const href = globalThis.location?.origin;\n if (line == null) {\n return undefined;\n }\n const match = line.match(BROWSER_PATH_REGEX);\n if (!match) {\n return undefined;\n }\n const filePath = match[1]?.replace(/\\?.*$/, \"\");\n if (filePath == null) {\n return undefined;\n }\n const pathParts = filePath.split(\"/\");\n const fileLine = match[2];\n const fileColumn = match[3];\n const fileName = pathParts[pathParts.length - 1];\n return {\n fullFilePath: href ? `${href}${filePath}` : filePath,\n fileName,\n fileNameWithLine: fileName && fileLine ? `${fileName}:${fileLine}` : undefined,\n fileColumn,\n fileLine,\n filePath,\n filePathWithLine: fileLine ? `${filePath}:${fileLine}` : undefined,\n method: undefined,\n };\n }\n function formatStackFrames(frames, settings) {\n return frames.map((stackFrame) => formatTemplate(settings, settings.prettyErrorStackTemplate, { ...stackFrame }, true));\n }\n function formatErrorMessage(error) {\n return Object.getOwnPropertyNames(error)\n .filter((key) => key !== \"stack\" && key !== \"cause\")\n .reduce((result, key) => {\n const value = error[key];\n if (typeof value === \"function\") {\n return result;\n }\n result.push(String(value));\n return result;\n }, [])\n .join(\", \");\n }\n function shouldUseCss(prettyLogs) {\n return prettyLogs && (runtimeInfo.name === \"browser\" || runtimeInfo.name === \"worker\") && consoleSupportsCssStyling();\n }\n function stripAnsi(value) {\n return value.replace(ANSI_REGEX, \"\");\n }\n function buildCssMetaOutput(settings, metaValue) {\n if (metaValue == null) {\n return { text: \"\", styles: [] };\n }\n const { template, placeholders } = buildPrettyMeta(settings, metaValue);\n const parts = [];\n const styles = [];\n let lastIndex = 0;\n const placeholderRegex = /{{(.+?)}}/g;\n let match;\n while ((match = placeholderRegex.exec(template)) != null) {\n if (match.index > lastIndex) {\n parts.push(template.slice(lastIndex, match.index));\n }\n const key = match[1];\n const rawValue = placeholders[key] != null ? String(placeholders[key]) : \"\";\n const tokens = collectStyleTokens(settings.prettyLogStyles?.[key], rawValue);\n const css = tokensToCss(tokens);\n if (css.length > 0) {\n parts.push(`%c${rawValue}%c`);\n styles.push(css, \"\");\n }\n else {\n parts.push(rawValue);\n }\n lastIndex = placeholderRegex.lastIndex;\n }\n if (lastIndex < template.length) {\n parts.push(template.slice(lastIndex));\n }\n return {\n text: parts.join(\"\"),\n styles,\n };\n }\n function collectStyleTokens(style, value) {\n if (style == null) {\n return [];\n }\n if (typeof style === \"string\") {\n return [style];\n }\n if (Array.isArray(style)) {\n return style.flatMap((token) => collectStyleTokens(token, value));\n }\n if (typeof style === \"object\") {\n const normalizedValue = value.trim();\n const nextStyle = style[normalizedValue] ?? style[\"*\"];\n if (nextStyle == null) {\n return [];\n }\n return collectStyleTokens(nextStyle, value);\n }\n return [];\n }\n function tokensToCss(tokens) {\n const seen = new Set();\n const cssParts = [];\n for (const token of tokens) {\n const css = styleTokenToCss(token);\n if (css != null && css.length > 0 && !seen.has(css)) {\n seen.add(css);\n cssParts.push(css);\n }\n }\n return cssParts.join(\"; \");\n }\n function styleTokenToCss(token) {\n const color = COLOR_TOKENS[token];\n if (color != null) {\n return `color: ${color}`;\n }\n const background = BACKGROUND_TOKENS[token];\n if (background != null) {\n return `background-color: ${background}`;\n }\n switch (token) {\n case \"bold\":\n return \"font-weight: bold\";\n case \"dim\":\n return \"opacity: 0.75\";\n case \"italic\":\n return \"font-style: italic\";\n case \"underline\":\n return \"text-decoration: underline\";\n case \"overline\":\n return \"text-decoration: overline\";\n case \"inverse\":\n return \"filter: invert(1)\";\n case \"hidden\":\n return \"visibility: hidden\";\n case \"strikethrough\":\n return \"text-decoration: line-through\";\n default:\n return undefined;\n }\n }\n function getWorkingDirectory() {\n if (cachedCwd === undefined) {\n cachedCwd = safeGetCwd() ?? null;\n }\n return cachedCwd ?? undefined;\n }\n function shouldCaptureHostname() {\n return runtimeInfo.name === \"node\" || runtimeInfo.name === \"deno\" || runtimeInfo.name === \"bun\";\n }\n function shouldCaptureRuntimeVersion() {\n return runtimeInfo.name === \"node\" || runtimeInfo.name === \"deno\" || runtimeInfo.name === \"bun\";\n }\n function createRuntimeMeta(info) {\n if (info.name === \"browser\" || info.name === \"worker\") {\n return {\n runtime: info.name,\n browser: info.userAgent,\n };\n }\n const metaStatic = {\n runtime: info.name,\n };\n if (shouldCaptureRuntimeVersion()) {\n metaStatic.runtimeVersion = info.version ?? \"unknown\";\n }\n if (shouldCaptureHostname()) {\n metaStatic.hostname = info.hostname ?? \"unknown\";\n }\n return metaStatic;\n }\n function formatWithOptionsSafe(options, args) {\n try {\n return formatWithOptions(options, ...args);\n }\n catch {\n return args.map(stringifyFallback).join(\" \");\n }\n }\n function stringifyFallback(value) {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n }\n catch {\n return String(value);\n }\n }\n function normalizeFilePath(value) {\n if (typeof value !== \"string\" || value.length === 0) {\n return value;\n }\n const replaced = value.replace(/\\\\+/g, \"\\\\\").replace(/\\\\/g, \"/\");\n const hasRootDoubleSlash = replaced.startsWith(\"//\");\n const hasLeadingSlash = replaced.startsWith(\"/\") && !hasRootDoubleSlash;\n const driveMatch = replaced.match(/^[A-Za-z]:/);\n const drivePrefix = driveMatch ? driveMatch[0] : \"\";\n const withoutDrive = drivePrefix ? replaced.slice(drivePrefix.length) : replaced;\n const segments = withoutDrive.split(\"/\");\n const normalizedSegments = [];\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n if (normalizedSegments.length > 0) {\n normalizedSegments.pop();\n }\n continue;\n }\n normalizedSegments.push(segment);\n }\n let normalized = normalizedSegments.join(\"/\");\n if (hasRootDoubleSlash) {\n normalized = `//${normalized}`;\n }\n else if (hasLeadingSlash) {\n normalized = `/${normalized}`;\n }\n else if (drivePrefix !== \"\") {\n normalized = `${drivePrefix}${normalized.length > 0 ? `/${normalized}` : \"\"}`;\n }\n if (normalized.length === 0) {\n return value;\n }\n return normalized;\n }\n function detectRuntimeInfo() {\n if (isBrowserEnvironment()) {\n const navigatorObj = globalThis.navigator;\n return {\n name: \"browser\",\n userAgent: navigatorObj?.userAgent,\n };\n }\n const globalScope = globalThis;\n if (typeof globalScope.importScripts === \"function\") {\n return {\n name: \"worker\",\n userAgent: globalScope.navigator?.userAgent,\n };\n }\n const globalAny = globalThis;\n if (globalAny.Bun != null) {\n const bunVersion = globalAny.Bun.version;\n return {\n name: \"bun\",\n version: bunVersion != null ? `bun/${bunVersion}` : undefined,\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.Deno != null) {\n const denoHostname = resolveDenoHostname(globalAny.Deno);\n const denoVersion = globalAny.Deno?.version?.deno;\n return {\n name: \"deno\",\n version: denoVersion != null ? `deno/${denoVersion}` : undefined,\n hostname: denoHostname ?? getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.process?.versions?.node != null || globalAny.process?.version != null) {\n return {\n name: \"node\",\n version: globalAny.process?.versions?.node ?? globalAny.process?.version,\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n if (globalAny.process != null) {\n return {\n name: \"node\",\n version: \"unknown\",\n hostname: getEnvironmentHostname(globalAny.process, globalAny.Deno, globalAny.Bun, globalAny.location),\n };\n }\n return {\n name: \"unknown\",\n };\n }\n function getEnvironmentHostname(nodeProcess, deno, bun, location) {\n const processHostname = nodeProcess?.env?.HOSTNAME ?? nodeProcess?.env?.HOST ?? nodeProcess?.env?.COMPUTERNAME;\n if (processHostname != null && processHostname.length > 0) {\n return processHostname;\n }\n const bunHostname = bun?.env?.HOSTNAME ?? bun?.env?.HOST ?? bun?.env?.COMPUTERNAME;\n if (bunHostname != null && bunHostname.length > 0) {\n return bunHostname;\n }\n try {\n const denoEnvGet = deno?.env?.get;\n if (typeof denoEnvGet === \"function\") {\n const value = denoEnvGet(\"HOSTNAME\");\n if (value != null && value.length > 0) {\n return value;\n }\n }\n }\n catch {\n }\n if (location?.hostname != null && location.hostname.length > 0) {\n return location.hostname;\n }\n return undefined;\n }\n function resolveDenoHostname(deno) {\n try {\n if (typeof deno?.hostname === \"function\") {\n const value = deno.hostname();\n if (value != null && value.length > 0) {\n return value;\n }\n }\n }\n catch {\n }\n const locationHostname = globalThis.location?.hostname;\n if (locationHostname != null && locationHostname.length > 0) {\n return locationHostname;\n }\n return undefined;\n }\n function getNodeEnv() {\n const globalProcess = globalThis?.process;\n return globalProcess?.env?.NODE_ENV;\n }\n function isNativeError(value) {\n if (value instanceof Error) {\n return true;\n }\n if (value != null && typeof value === \"object\") {\n const objectTag = Object.prototype.toString.call(value);\n if (/\\[object .*Error\\]/.test(objectTag)) {\n return true;\n }\n const name = value.name;\n if (typeof name === \"string\" && name.endsWith(\"Error\")) {\n return true;\n }\n }\n return false;\n }\n}\nconst ANSI_REGEX = /\\u001b\\[[0-9;]*m/g;\nconst COLOR_TOKENS = {\n black: \"#000000\",\n red: \"#ef5350\",\n green: \"#66bb6a\",\n yellow: \"#fdd835\",\n blue: \"#42a5f5\",\n magenta: \"#ab47bc\",\n cyan: \"#26c6da\",\n white: \"#fafafa\",\n blackBright: \"#424242\",\n redBright: \"#ff7043\",\n greenBright: \"#81c784\",\n yellowBright: \"#ffe082\",\n blueBright: \"#64b5f6\",\n magentaBright: \"#ce93d8\",\n cyanBright: \"#4dd0e1\",\n whiteBright: \"#ffffff\",\n};\nconst BACKGROUND_TOKENS = {\n bgBlack: \"#000000\",\n bgRed: \"#ef5350\",\n bgGreen: \"#66bb6a\",\n bgYellow: \"#fdd835\",\n bgBlue: \"#42a5f5\",\n bgMagenta: \"#ab47bc\",\n bgCyan: \"#26c6da\",\n bgWhite: \"#fafafa\",\n bgBlackBright: \"#424242\",\n bgRedBright: \"#ff7043\",\n bgGreenBright: \"#81c784\",\n bgYellowBright: \"#ffe082\",\n bgBlueBright: \"#64b5f6\",\n bgMagentaBright: \"#ce93d8\",\n bgCyanBright: \"#4dd0e1\",\n bgWhiteBright: \"#ffffff\",\n};\nconst BROWSER_PATH_REGEX = /(?:(?:file|https?|global code|[^@]+)@)?(?:file:)?((?:\\/[^:/]+){2,})(?::(\\d+))?(?::(\\d+))?/;\nconst runtime = createLoggerEnvironment();\nexport const loggerEnvironment = runtime;\nexport * from \"./interfaces.js\";\nexport class BaseLogger {\n constructor(settings, logObj, stackDepthLevel = Number.NaN) {\n this.logObj = logObj;\n this.stackDepthLevel = stackDepthLevel;\n this.runtime = runtime;\n this.maxErrorCauseDepth = 5;\n this.settings = {\n type: settings?.type ?? \"pretty\",\n name: settings?.name,\n parentNames: settings?.parentNames,\n minLevel: settings?.minLevel ?? 0,\n argumentsArrayName: settings?.argumentsArrayName,\n hideLogPositionForProduction: settings?.hideLogPositionForProduction ?? false,\n prettyLogTemplate: settings?.prettyLogTemplate ??\n \"{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\\t{{logLevelName}}\\t{{filePathWithLine}}{{nameWithDelimiterPrefix}}\\t\",\n prettyErrorTemplate: settings?.prettyErrorTemplate ?? \"\\n{{errorName}} {{errorMessage}}\\nerror stack:\\n{{errorStack}}\",\n prettyErrorStackTemplate: settings?.prettyErrorStackTemplate ?? \" • {{fileName}}\\t{{method}}\\n\\t{{filePathWithLine}}\",\n prettyErrorParentNamesSeparator: settings?.prettyErrorParentNamesSeparator ?? \":\",\n prettyErrorLoggerNameDelimiter: settings?.prettyErrorLoggerNameDelimiter ?? \"\\t\",\n stylePrettyLogs: settings?.stylePrettyLogs ?? true,\n prettyLogTimeZone: settings?.prettyLogTimeZone ?? \"UTC\",\n prettyLogStyles: settings?.prettyLogStyles ?? {\n logLevelName: {\n \"*\": [\"bold\", \"black\", \"bgWhiteBright\", \"dim\"],\n SILLY: [\"bold\", \"white\"],\n TRACE: [\"bold\", \"whiteBright\"],\n DEBUG: [\"bold\", \"green\"],\n INFO: [\"bold\", \"blue\"],\n WARN: [\"bold\", \"yellow\"],\n ERROR: [\"bold\", \"red\"],\n FATAL: [\"bold\", \"redBright\"],\n },\n dateIsoStr: \"white\",\n filePathWithLine: \"white\",\n name: [\"white\", \"bold\"],\n nameWithDelimiterPrefix: [\"white\", \"bold\"],\n nameWithDelimiterSuffix: [\"white\", \"bold\"],\n errorName: [\"bold\", \"bgRedBright\", \"whiteBright\"],\n fileName: [\"yellow\"],\n fileNameWithLine: \"white\",\n },\n prettyInspectOptions: settings?.prettyInspectOptions ?? {\n colors: true,\n compact: false,\n depth: Infinity,\n },\n metaProperty: settings?.metaProperty ?? \"_meta\",\n maskPlaceholder: settings?.maskPlaceholder ?? \"[***]\",\n maskValuesOfKeys: settings?.maskValuesOfKeys ?? [\"password\"],\n maskValuesOfKeysCaseInsensitive: settings?.maskValuesOfKeysCaseInsensitive ?? false,\n maskValuesRegEx: settings?.maskValuesRegEx,\n prefix: [...(settings?.prefix ?? [])],\n attachedTransports: [...(settings?.attachedTransports ?? [])],\n overwrite: {\n mask: settings?.overwrite?.mask,\n toLogObj: settings?.overwrite?.toLogObj,\n addMeta: settings?.overwrite?.addMeta,\n addPlaceholders: settings?.overwrite?.addPlaceholders,\n formatMeta: settings?.overwrite?.formatMeta,\n formatLogObj: settings?.overwrite?.formatLogObj,\n transportFormatted: settings?.overwrite?.transportFormatted,\n transportJSON: settings?.overwrite?.transportJSON,\n },\n };\n this.captureStackForMeta = this._shouldCaptureStack();\n }\n log(logLevelId, logLevelName, ...args) {\n if (logLevelId < this.settings.minLevel) {\n return;\n }\n const resolvedArgs = this._resolveLogArguments(args);\n const logArgs = [...this.settings.prefix, ...resolvedArgs];\n const maskedArgs = this.settings.overwrite?.mask != null\n ? this.settings.overwrite?.mask(logArgs)\n : this.settings.maskValuesOfKeys != null && this.settings.maskValuesOfKeys.length > 0\n ? this._mask(logArgs)\n : logArgs;\n const thisLogObj = this.logObj != null ? this._recursiveCloneAndExecuteFunctions(this.logObj) : undefined;\n const logObj = this.settings.overwrite?.toLogObj != null ? this.settings.overwrite?.toLogObj(maskedArgs, thisLogObj) : this._toLogObj(maskedArgs, thisLogObj);\n const logObjWithMeta = this.settings.overwrite?.addMeta != null\n ? this.settings.overwrite?.addMeta(logObj, logLevelId, logLevelName)\n : this._addMetaToLogObj(logObj, logLevelId, logLevelName);\n const logMeta = logObjWithMeta?.[this.settings.metaProperty];\n let logMetaMarkup;\n let logArgsAndErrorsMarkup = undefined;\n if (this.settings.overwrite?.formatMeta != null) {\n logMetaMarkup = this.settings.overwrite?.formatMeta(logObjWithMeta?.[this.settings.metaProperty]);\n }\n if (this.settings.overwrite?.formatLogObj != null) {\n logArgsAndErrorsMarkup = this.settings.overwrite?.formatLogObj(maskedArgs, this.settings);\n }\n if (this.settings.type === \"pretty\") {\n logMetaMarkup = logMetaMarkup ?? this._prettyFormatLogObjMeta(logObjWithMeta?.[this.settings.metaProperty]);\n logArgsAndErrorsMarkup = logArgsAndErrorsMarkup ?? runtime.prettyFormatLogObj(maskedArgs, this.settings);\n }\n if (logMetaMarkup != null && logArgsAndErrorsMarkup != null) {\n if (this.settings.overwrite?.transportFormatted != null) {\n const transport = this.settings.overwrite.transportFormatted;\n const declaredParams = transport.length;\n if (declaredParams < 4) {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors);\n }\n else if (declaredParams === 4) {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta);\n }\n else {\n transport(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta, this.settings);\n }\n }\n else {\n runtime.transportFormatted(logMetaMarkup, logArgsAndErrorsMarkup.args, logArgsAndErrorsMarkup.errors, logMeta, this.settings);\n }\n }\n else {\n if (this.settings.overwrite?.transportJSON != null) {\n this.settings.overwrite.transportJSON(logObjWithMeta);\n }\n else if (this.settings.type !== \"hidden\") {\n runtime.transportJSON(logObjWithMeta);\n }\n }\n if (this.settings.attachedTransports != null && this.settings.attachedTransports.length > 0) {\n this.settings.attachedTransports.forEach((transportLogger) => {\n transportLogger(logObjWithMeta);\n });\n }\n return logObjWithMeta;\n }\n attachTransport(transportLogger) {\n this.settings.attachedTransports.push(transportLogger);\n }\n getSubLogger(settings, logObj) {\n const subLoggerSettings = {\n ...this.settings,\n ...settings,\n parentNames: this.settings?.parentNames != null && this.settings?.name != null\n ? [...this.settings.parentNames, this.settings.name]\n : this.settings?.name != null\n ? [this.settings.name]\n : undefined,\n prefix: [...this.settings.prefix, ...(settings?.prefix ?? [])],\n };\n const subLogger = new this.constructor(subLoggerSettings, logObj ?? this.logObj, this.stackDepthLevel);\n return subLogger;\n }\n _mask(args) {\n const maskKeys = this._getMaskKeys();\n return args?.map((arg) => {\n return this._recursiveCloneAndMaskValuesOfKeys(arg, maskKeys);\n });\n }\n _getMaskKeys() {\n const maskKeys = this.settings.maskValuesOfKeys ?? [];\n const signature = maskKeys.map(String).join(\"|\");\n if (this.settings.maskValuesOfKeysCaseInsensitive === true) {\n if (this.maskKeysCache?.source === maskKeys && this.maskKeysCache.caseInsensitive === true && this.maskKeysCache.signature === signature) {\n return this.maskKeysCache.normalized;\n }\n const normalized = maskKeys.map((key) => (typeof key === \"string\" ? key.toLowerCase() : String(key).toLowerCase()));\n this.maskKeysCache = {\n source: maskKeys,\n caseInsensitive: true,\n normalized,\n signature,\n };\n return normalized;\n }\n this.maskKeysCache = {\n source: maskKeys,\n caseInsensitive: false,\n normalized: maskKeys,\n signature,\n };\n return maskKeys;\n }\n _resolveLogArguments(args) {\n if (args.length === 1 && typeof args[0] === \"function\") {\n const candidate = args[0];\n if (candidate.length === 0) {\n const result = candidate();\n return Array.isArray(result) ? result : [result];\n }\n }\n return args;\n }\n _recursiveCloneAndMaskValuesOfKeys(source, keys, seen = []) {\n if (seen.includes(source)) {\n return { ...source };\n }\n if (typeof source === \"object\" && source !== null) {\n seen.push(source);\n }\n if (runtime.isError(source) || runtime.isBuffer(source)) {\n return source;\n }\n else if (source instanceof Map) {\n return new Map(source);\n }\n else if (source instanceof Set) {\n return new Set(source);\n }\n else if (Array.isArray(source)) {\n return source.map((item) => this._recursiveCloneAndMaskValuesOfKeys(item, keys, seen));\n }\n else if (source instanceof Date) {\n return new Date(source.getTime());\n }\n else if (source instanceof URL) {\n return urlToObject(source);\n }\n else if (source !== null && typeof source === \"object\") {\n const baseObject = runtime.isError(source) ? this._cloneError(source) : Object.create(Object.getPrototypeOf(source));\n return Object.getOwnPropertyNames(source).reduce((o, prop) => {\n const lookupKey = this.settings?.maskValuesOfKeysCaseInsensitive !== true\n ? prop\n : typeof prop === \"string\"\n ? prop.toLowerCase()\n : String(prop).toLowerCase();\n o[prop] = keys.includes(lookupKey)\n ? this.settings.maskPlaceholder\n : (() => {\n try {\n return this._recursiveCloneAndMaskValuesOfKeys(source[prop], keys, seen);\n }\n catch {\n return null;\n }\n })();\n return o;\n }, baseObject);\n }\n else {\n if (typeof source === \"string\") {\n let modifiedSource = source;\n for (const regEx of this.settings?.maskValuesRegEx || []) {\n modifiedSource = modifiedSource.replace(regEx, this.settings?.maskPlaceholder || \"\");\n }\n return modifiedSource;\n }\n return source;\n }\n }\n _recursiveCloneAndExecuteFunctions(source, seen = []) {\n if (this.isObjectOrArray(source) && seen.includes(source)) {\n return this.shallowCopy(source);\n }\n if (this.isObjectOrArray(source)) {\n seen.push(source);\n }\n if (Array.isArray(source)) {\n return source.map((item) => this._recursiveCloneAndExecuteFunctions(item, seen));\n }\n else if (source instanceof Date) {\n return new Date(source.getTime());\n }\n else if (this.isObject(source)) {\n return Object.getOwnPropertyNames(source).reduce((o, prop) => {\n const descriptor = Object.getOwnPropertyDescriptor(source, prop);\n if (descriptor) {\n Object.defineProperty(o, prop, descriptor);\n const value = source[prop];\n o[prop] = typeof value === \"function\" ? value() : this._recursiveCloneAndExecuteFunctions(value, seen);\n }\n return o;\n }, Object.create(Object.getPrototypeOf(source)));\n }\n else {\n return source;\n }\n }\n isObjectOrArray(value) {\n return typeof value === \"object\" && value !== null;\n }\n isObject(value) {\n return typeof value === \"object\" && !Array.isArray(value) && value !== null;\n }\n shallowCopy(source) {\n if (Array.isArray(source)) {\n return [...source];\n }\n else {\n return { ...source };\n }\n }\n _toLogObj(args, clonedLogObj = {}) {\n args = args?.map((arg) => (runtime.isError(arg) ? this._toErrorObject(arg) : arg));\n if (this.settings.argumentsArrayName == null) {\n if (args.length === 1 && !Array.isArray(args[0]) && runtime.isBuffer(args[0]) !== true && !(args[0] instanceof Date)) {\n clonedLogObj = typeof args[0] === \"object\" && args[0] != null ? { ...args[0], ...clonedLogObj } : { 0: args[0], ...clonedLogObj };\n }\n else {\n clonedLogObj = { ...clonedLogObj, ...args };\n }\n }\n else {\n clonedLogObj = {\n ...clonedLogObj,\n [this.settings.argumentsArrayName]: args,\n };\n }\n return clonedLogObj;\n }\n _cloneError(error) {\n const cloned = new error.constructor();\n Object.getOwnPropertyNames(error).forEach((key) => {\n cloned[key] = error[key];\n });\n return cloned;\n }\n _toErrorObject(error, depth = 0, seen = new Set()) {\n if (!seen.has(error)) {\n seen.add(error);\n }\n const errorObject = {\n nativeError: error,\n name: error.name ?? \"Error\",\n message: error.message,\n stack: runtime.getErrorTrace(error),\n };\n if (depth >= this.maxErrorCauseDepth) {\n return errorObject;\n }\n const causeValue = error.cause;\n if (causeValue != null) {\n const normalizedCause = toError(causeValue);\n if (!seen.has(normalizedCause)) {\n errorObject.cause = this._toErrorObject(normalizedCause, depth + 1, seen);\n }\n }\n return errorObject;\n }\n _addMetaToLogObj(logObj, logLevelId, logLevelName) {\n return {\n ...logObj,\n [this.settings.metaProperty]: runtime.getMeta(logLevelId, logLevelName, this.stackDepthLevel, !this.captureStackForMeta, this.settings.name, this.settings.parentNames),\n };\n }\n _shouldCaptureStack() {\n if (this.settings.hideLogPositionForProduction) {\n return false;\n }\n if (this.settings.type === \"json\") {\n return true;\n }\n const template = this.settings.prettyLogTemplate ?? \"\";\n const stackPlaceholders = /{{\\s*(file(Name|Path|Line|PathWithLine|NameWithLine)|fullFilePath)\\s*}}/;\n if (stackPlaceholders.test(template)) {\n return true;\n }\n return false;\n }\n _prettyFormatLogObjMeta(logObjMeta) {\n return buildPrettyMeta(this.settings, logObjMeta).text;\n }\n}\n","import { BaseLogger } from \"./BaseLogger.js\";\nexport * from \"./interfaces.js\";\nexport * from \"./BaseLogger.js\";\nexport class Logger extends BaseLogger {\n constructor(settings, logObj) {\n const isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n const normalizedSettings = { ...(settings ?? {}) };\n if (isBrowser) {\n normalizedSettings.stylePrettyLogs = settings?.stylePrettyLogs ?? true;\n }\n super(normalizedSettings, logObj, Number.NaN);\n }\n log(logLevelId, logLevelName, ...args) {\n return super.log(logLevelId, logLevelName, ...args);\n }\n silly(...args) {\n return super.log(0, \"SILLY\", ...args);\n }\n trace(...args) {\n return super.log(1, \"TRACE\", ...args);\n }\n debug(...args) {\n return super.log(2, \"DEBUG\", ...args);\n }\n info(...args) {\n return super.log(3, \"INFO\", ...args);\n }\n warn(...args) {\n return super.log(4, \"WARN\", ...args);\n }\n error(...args) {\n return super.log(5, \"ERROR\", ...args);\n }\n fatal(...args) {\n return super.log(6, \"FATAL\", ...args);\n }\n getSubLogger(settings, logObj) {\n return super.getSubLogger(settings, logObj);\n }\n}\n","import { loadUnifiedConfig, saveUnifiedConfig } from \"../unified-config.js\";\nimport type { SyncFilter, SyncTarget } from \"./types.js\";\n\nexport interface SyncConfig {\n targets: SyncTarget[];\n filter?: SyncFilter;\n}\n\nexport function loadSyncConfig(): SyncConfig {\n const cfg = loadUnifiedConfig();\n return { targets: cfg.sync.targets, filter: cfg.sync.filter };\n}\n\nexport function saveSyncConfig(syncCfg: SyncConfig): void {\n const cfg = loadUnifiedConfig();\n cfg.sync.targets = syncCfg.targets;\n cfg.sync.filter = syncCfg.filter;\n saveUnifiedConfig(cfg);\n}\n\nexport function addTarget(target: SyncTarget): void {\n const cfg = loadUnifiedConfig();\n const existing = cfg.sync.targets.findIndex((t) => t.name === target.name);\n if (existing >= 0) {\n cfg.sync.targets[existing] = target;\n } else {\n cfg.sync.targets.push(target);\n }\n saveUnifiedConfig(cfg);\n}\n\nexport function removeTarget(name: string): boolean {\n const cfg = loadUnifiedConfig();\n const before = cfg.sync.targets.length;\n cfg.sync.targets = cfg.sync.targets.filter((t) => t.name !== name);\n if (cfg.sync.targets.length === before) return false;\n saveUnifiedConfig(cfg);\n return true;\n}\n\nexport function listTargets(): SyncTarget[] {\n return loadUnifiedConfig().sync.targets;\n}\n","declare const __PANOPTICON_VERSION__: string;\n\nimport { execSync } from \"node:child_process\";\nimport { getDb } from \"../db/schema.js\";\nimport { log } from \"../log.js\";\nimport { captureException } from \"../sentry.js\";\nimport { postSync } from \"./post.js\";\nimport { readSessionsByIds, SESSION_READERS } from \"./reader.js\";\nimport { TABLE_SYNC_REGISTRY } from \"./registry.js\";\nimport type {\n SyncFilter,\n SyncHandle,\n SyncOptions,\n SyncTarget,\n} from \"./types.js\";\nimport { readWatermark, watermarkKey, writeWatermark } from \"./watermark.js\";\n\nconst DEFAULT_BATCH_SIZE = 2000;\nconst DEFAULT_POST_BATCH_SIZE = 100;\nconst DEFAULT_IDLE_MS = 30_000;\nconst DEFAULT_CATCHUP_MS = 100;\nconst MAX_SESSIONS_PER_TICK = 10;\n\n/** Maps SESSION_READERS table name → target_session_sync column name. */\nconst WM_COLUMNS = {\n messages: \"wm_messages\",\n tool_calls: \"wm_tool_calls\",\n scanner_turns: \"wm_scanner_turns\",\n scanner_events: \"wm_scanner_events\",\n hook_events: \"wm_hook_events\",\n otel_logs: \"wm_otel_logs\",\n otel_metrics: \"wm_otel_metrics\",\n otel_spans: \"wm_otel_spans\",\n} as const;\n\nfunction matchesGlob(value: string, pattern: string): boolean {\n if (pattern === \"*/*\") return true;\n if (pattern.endsWith(\"/*\")) {\n return value.startsWith(pattern.slice(0, -1));\n }\n return value === pattern;\n}\n\n/** Returns true if the repository passes the include/exclude filter. */\nfunction repoMatchesFilter(repository: string, filter?: SyncFilter): boolean {\n if (!filter) return true;\n if (filter.excludeRepos?.some((p) => matchesGlob(repository, p)))\n return false;\n if (filter.includeRepos?.length) {\n if (!filter.includeRepos.some((p) => matchesGlob(repository, p)))\n return false;\n }\n return true;\n}\n\n/** Set of session IDs that have repo attribution matching the filter. */\nfunction buildSyncableSessionIds(opts: SyncOptions): Set<string> | null {\n const requireRepo = opts.filter?.requireRepo ?? true;\n if (!requireRepo && !opts.filter?.includeRepos?.length) return null; // no filtering\n\n const db = getDb();\n const rows = db\n .prepare(\n \"SELECT DISTINCT sr.session_id, sr.repository FROM session_repositories sr\",\n )\n .all() as Array<{ session_id: string; repository: string }>;\n\n const sessionIds = new Set<string>();\n for (const row of rows) {\n if (!repoMatchesFilter(row.repository, opts.filter)) continue;\n sessionIds.add(row.session_id);\n }\n\n return sessionIds;\n}\n\nconst TOKEN_CACHE_TTL_MS = 5 * 60 * 1000;\nconst tokenCache = new Map<string, { token: string; expiresAt: number }>();\n\nfunction resolveToken(target: SyncTarget): string | undefined {\n if (target.token) return target.token;\n if (!target.tokenCommand) return undefined;\n\n const cached = tokenCache.get(target.name);\n if (cached && Date.now() < cached.expiresAt) return cached.token;\n\n try {\n const token = execSync(target.tokenCommand, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (token) {\n tokenCache.set(target.name, {\n token,\n expiresAt: Date.now() + TOKEN_CACHE_TTL_MS,\n });\n }\n return token || undefined;\n } catch (err) {\n log.sync.error(\n `tokenCommand failed for \"${target.name}\": ${err instanceof Error ? err.message : err}`,\n );\n return undefined;\n }\n}\n\nexport function createSyncLoop(opts: SyncOptions): SyncHandle {\n const batchSize = opts.batchSize ?? DEFAULT_BATCH_SIZE;\n const postBatchSize = opts.postBatchSize ?? DEFAULT_POST_BATCH_SIZE;\n const idleMs = opts.idleIntervalMs ?? DEFAULT_IDLE_MS;\n const catchUpMs = opts.catchUpIntervalMs ?? DEFAULT_CATCHUP_MS;\n\n const panopticonVersion =\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"dev\";\n\n function resolveHeaders(target: SyncTarget): Record<string, string> {\n const headers: Record<string, string> = { ...target.headers };\n headers[\"X-Panopticon-Version\"] = panopticonVersion;\n const token = resolveToken(target);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n }\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n let syncing = false;\n let stopping = false;\n\n function scheduleNext(hadWork: boolean): void {\n if (stopping) return;\n const delay = hadWork ? catchUpMs : idleMs;\n timer = setTimeout(() => {\n tick().catch((err) => log.sync.error(`Tick error: ${err}`));\n }, delay);\n if (!opts.keepAlive && timer.unref) {\n timer.unref();\n }\n }\n\n // ── Phase 1: Sync sessions (compared against target_session_sync) ────────\n\n async function syncSessions(\n target: SyncTarget,\n syncableSessionIds: Set<string> | null,\n ): Promise<boolean> {\n const db = getDb();\n const requireRepo = opts.filter?.requireRepo ?? true;\n\n // SQL-level filter to skip sessions with no repository attribution.\n // Without this, a large backlog of no-repo sessions consumes every LIMIT\n // slot in the \"new sessions\" branch and starves the \"updated sessions\"\n // branch indefinitely (so per-session watermarks for confirmed sessions\n // can never advance).\n const repoExists = requireRepo\n ? \"AND EXISTS (SELECT 1 FROM session_repositories sr WHERE sr.session_id = s.session_id)\"\n : \"\";\n\n // Find sessions that need syncing: new (no tss entry) or updated\n // (sessions.sync_seq advanced past tss.sync_seq).\n //\n // These run as two independent queries with their own LIMITs (rather than\n // UNION ALL with one shared LIMIT) so neither branch can starve the other.\n const newRows = db\n .prepare(\n `SELECT s.session_id FROM sessions s\n LEFT JOIN target_session_sync tss\n ON s.session_id = tss.session_id AND tss.target = ?\n WHERE tss.session_id IS NULL ${repoExists}\n LIMIT ?`,\n )\n .all(target.name, batchSize) as Array<{ session_id: string }>;\n\n const updatedRows = db\n .prepare(\n `SELECT s.session_id FROM sessions s\n JOIN target_session_sync tss\n ON s.session_id = tss.session_id AND tss.target = ?\n WHERE tss.confirmed = 1 AND s.sync_seq > tss.sync_seq ${repoExists}\n LIMIT ?`,\n )\n .all(target.name, batchSize) as Array<{ session_id: string }>;\n\n if (newRows.length === 0 && updatedRows.length === 0) return false;\n\n // In-memory filter for includeRepos/excludeRepos globs (requireRepo is\n // already enforced in SQL above).\n let sessionIds = [\n ...newRows.map((r) => r.session_id),\n ...updatedRows.map((r) => r.session_id),\n ];\n if (syncableSessionIds) {\n sessionIds = sessionIds.filter((id) => syncableSessionIds.has(id));\n }\n\n const hasMore =\n newRows.length >= batchSize || updatedRows.length >= batchSize;\n\n if (sessionIds.length === 0) return hasMore;\n\n const rows = readSessionsByIds(sessionIds);\n if (rows.length > 0) {\n log.sync.info(`sessions: ${rows.length} sessions to sync`);\n\n for (let j = 0; j < rows.length; j += postBatchSize) {\n const batch = rows.slice(j, j + postBatchSize);\n const response = await postSync(\n `${target.url}/v1/sync`,\n { table: \"sessions\", rows: batch },\n resolveHeaders(target),\n );\n\n const accepted = response.accepted;\n if (Array.isArray(accepted)) {\n recordConfirmedSessions(accepted as string[], target.name);\n }\n }\n }\n\n return hasMore;\n }\n\n // ── Phase 2: Sync dependent data (per-session, gated by confirmed) ───────\n\n async function syncSessionData(target: SyncTarget): Promise<boolean> {\n const db = getDb();\n\n // Clean up orphaned entries (session deleted from local DB)\n db.prepare(\n `DELETE FROM target_session_sync\n WHERE session_id NOT IN (SELECT session_id FROM sessions)`,\n ).run();\n\n // Get confirmed sessions that have new data (sync_seq > synced_seq)\n const pending = db\n .prepare(\n `SELECT session_id, sync_seq,\n wm_messages, wm_tool_calls, wm_scanner_turns,\n wm_scanner_events, wm_hook_events, wm_otel_logs,\n wm_otel_metrics, wm_otel_spans\n FROM target_session_sync\n WHERE target = ? AND confirmed = 1\n AND sync_seq > synced_seq\n ORDER BY rowid\n LIMIT ?`,\n )\n .all(target.name, MAX_SESSIONS_PER_TICK) as Array<{\n session_id: string;\n sync_seq: number;\n wm_messages: number;\n wm_tool_calls: number;\n wm_scanner_turns: number;\n wm_scanner_events: number;\n wm_hook_events: number;\n wm_otel_logs: number;\n wm_otel_metrics: number;\n wm_otel_spans: number;\n }>;\n\n if (pending.length === 0) return false;\n\n const headers = resolveHeaders(target);\n const url = `${target.url}/v1/sync`;\n\n for (const entry of pending) {\n // Build watermarks from explicit columns\n const wmRow = entry as unknown as Record<string, number>;\n const watermarks: Record<string, number> = {};\n for (const [table, col] of Object.entries(WM_COLUMNS)) {\n watermarks[table] = wmRow[col] ?? 0;\n }\n let anyData = false;\n\n for (const [table, reader] of Object.entries(SESSION_READERS)) {\n // Read and POST in batches, draining until no more rows\n let afterId = watermarks[table] ?? 0;\n for (;;) {\n const { rows, maxId } = reader(entry.session_id, afterId, batchSize);\n if (rows.length === 0) break;\n\n anyData = true;\n\n for (let i = 0; i < rows.length; i += postBatchSize) {\n const batch = rows.slice(i, i + postBatchSize);\n await postSync(url, { table, rows: batch }, headers);\n }\n\n afterId = maxId;\n watermarks[table] = maxId;\n\n if (rows.length < batchSize) break;\n }\n }\n\n // Update watermarks and mark as synced up to cached sync_seq\n db.prepare(\n `UPDATE target_session_sync\n SET wm_messages = ?, wm_tool_calls = ?, wm_scanner_turns = ?,\n wm_scanner_events = ?, wm_hook_events = ?, wm_otel_logs = ?,\n wm_otel_metrics = ?, wm_otel_spans = ?, synced_seq = ?\n WHERE session_id = ? AND target = ?`,\n ).run(\n watermarks.messages,\n watermarks.tool_calls,\n watermarks.scanner_turns,\n watermarks.scanner_events,\n watermarks.hook_events,\n watermarks.otel_logs,\n watermarks.otel_metrics,\n watermarks.otel_spans,\n entry.sync_seq,\n entry.session_id,\n target.name,\n );\n\n if (anyData) {\n log.sync.info(\n `session-sync: synced data for ${entry.session_id} to ${target.name}`,\n );\n }\n }\n\n // Check if more confirmed sessions with new data remain\n const remaining = db\n .prepare(\n `SELECT COUNT(*) as cnt FROM target_session_sync\n WHERE target = ? AND confirmed = 1\n AND sync_seq > synced_seq`,\n )\n .get(target.name) as { cnt: number };\n\n return remaining.cnt > 0;\n }\n\n // ── Phase 3: Sync non-session tables (unchanged) ─────────────────────────\n\n async function syncNonSessionTables(target: SyncTarget): Promise<boolean> {\n let hasMore = false;\n\n for (const desc of TABLE_SYNC_REGISTRY) {\n if (desc.sessionLinked) continue; // handled by Phase 1 and 2\n\n const wmKey = watermarkKey(desc.table, target.name);\n const wm = readWatermark(wmKey);\n const { rows, maxId } = desc.read(wm, batchSize);\n if (rows.length === 0) continue;\n\n // Apply repo filter to repo_config_snapshots\n const filtered =\n desc.table === \"repo_config_snapshots\"\n ? rows.filter((r: unknown) => {\n const row = r as Record<string, unknown>;\n return repoMatchesFilter(row.repository as string, opts.filter);\n })\n : rows;\n\n if (filtered.length > 0) {\n log.sync.info(\n `${desc.table}: ${filtered.length} ${desc.logNoun} (watermark ${wm} → ${maxId})`,\n );\n\n for (let j = 0; j < filtered.length; j += postBatchSize) {\n const batch = filtered.slice(j, j + postBatchSize);\n await postSync(\n `${target.url}/v1/sync`,\n { table: desc.table, rows: batch },\n resolveHeaders(target),\n );\n }\n }\n\n writeWatermark(wmKey, maxId);\n if (rows.length === batchSize) hasMore = true;\n }\n\n return hasMore;\n }\n\n // ── Helpers ──────────────────────────────────────────────────────────────\n\n function recordConfirmedSessions(\n sessionIds: string[],\n targetName: string,\n ): void {\n const db = getDb();\n const upsert = db.prepare(\n `INSERT INTO target_session_sync (session_id, target, confirmed, sync_seq)\n VALUES (?, ?, 1, (SELECT sync_seq FROM sessions WHERE session_id = ?))\n ON CONFLICT(session_id, target) DO UPDATE SET\n confirmed = 1,\n sync_seq = MAX(target_session_sync.sync_seq,\n (SELECT sync_seq FROM sessions WHERE session_id = excluded.session_id))`,\n );\n for (const sessionId of sessionIds) {\n upsert.run(sessionId, targetName, sessionId);\n }\n }\n\n // ── Main loop ────────────────────────────────────────────────────────────\n\n async function runOnce(): Promise<boolean> {\n let hasMore = false;\n\n const syncableSessionIds = buildSyncableSessionIds(opts);\n\n for (const target of opts.targets) {\n try {\n // Phase 1: Sync sessions (repo-filtered, backend confirms)\n if (await syncSessions(target, syncableSessionIds)) hasMore = true;\n\n // Phase 2: Sync dependent data for confirmed sessions\n if (await syncSessionData(target)) hasMore = true;\n\n // Phase 3: Sync non-session tables\n if (await syncNonSessionTables(target)) hasMore = true;\n } catch (err) {\n log.sync.error(\n `Error syncing to ${target.name}: ${err instanceof Error ? err.message : err}`,\n );\n captureException(err, {\n component: \"sync\",\n target: target.name,\n });\n }\n }\n\n return hasMore;\n }\n\n async function tick(): Promise<void> {\n if (syncing || stopping) return;\n syncing = true;\n let hasMore = false;\n try {\n getDb(); // ensure DB is accessible\n hasMore = await runOnce();\n } catch (err) {\n log.sync.error(\n `Cycle error: ${err instanceof Error ? (err.stack ?? err.message) : err}`,\n );\n captureException(err, { component: \"sync\" });\n } finally {\n syncing = false;\n }\n\n if (!stopping) {\n scheduleNext(hasMore);\n }\n }\n\n return {\n start() {\n if (timer || syncing) return;\n stopping = false;\n log.sync.info(\"Starting sync\");\n tick().catch((err) => log.sync.error(`Tick error: ${err}`));\n },\n stop() {\n stopping = true;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n log.sync.info(\"Stopped sync\");\n }\n },\n runOnce,\n };\n}\n","const MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 2000;\nconst REQUEST_TIMEOUT_MS = 30_000;\n\nexport async function postSync(\n url: string,\n body: { table: string; rows: unknown[] },\n headers: Record<string, string>,\n): Promise<Record<string, unknown>> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n REQUEST_TIMEOUT_MS,\n );\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n\n if (response.ok) {\n const text = await response.text().catch(() => \"\");\n try {\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n }\n\n const status = response.status;\n\n // Don't retry client errors (except 429 rate limit)\n if (status >= 400 && status < 500 && status !== 429) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`HTTP ${status}: ${text}`);\n }\n\n lastError = new Error(`HTTP ${status}`);\n } catch (err) {\n if (\n err instanceof Error &&\n err.message.startsWith(\"HTTP 4\") &&\n !err.message.startsWith(\"HTTP 429\")\n ) {\n throw err;\n }\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n\n if (attempt < MAX_RETRIES) {\n const delay = BASE_DELAY_MS * 2 ** attempt;\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n throw lastError ?? new Error(\"postSync failed\");\n}\n","/**\n * HTTP client for the panopticon server API.\n *\n * Provides typed wrappers around POST /api/tool and POST /api/exec\n * so that CLI and MCP can query the server instead of opening the\n * database directly.\n */\nimport http from \"node:http\";\nimport { config } from \"../config.js\";\nimport type {\n ActivitySummaryResult,\n SearchResult,\n SessionListResult,\n SessionTimelineResult,\n SpendingResult,\n} from \"../types.js\";\n\n// ── Core transport ───────────────────────────────────────────────────────────\n\nfunction post(\n path: string,\n body: unknown,\n timeoutMs: number,\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const json = JSON.stringify(body);\n const req = http.request(\n {\n hostname: config.host,\n port: config.port,\n path,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(json),\n },\n timeout: timeoutMs,\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n reject(\n new Error(\n `Invalid JSON response from server: ${text.slice(0, 200)}`,\n ),\n );\n return;\n }\n if (\n res.statusCode &&\n res.statusCode >= 400 &&\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"error\" in parsed\n ) {\n reject(new Error((parsed as { error: string }).error));\n return;\n }\n resolve(parsed);\n });\n },\n );\n req.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"ECONNREFUSED\") {\n reject(\n new Error(\n \"Panopticon server is not running. Start with: panopticon start\",\n ),\n );\n return;\n }\n reject(err);\n });\n req.on(\"timeout\", () => {\n req.destroy();\n reject(new Error(\"Request to panopticon server timed out\"));\n });\n req.write(json);\n req.end();\n });\n}\n\n// ── Tool calls (read-only) ──────────────────────────────────────────────────\n\nconst TOOL_TIMEOUT = 30_000;\n\nexport function callTool(\n name: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n return post(\"/api/tool\", { name, params }, TOOL_TIMEOUT);\n}\n\nexport function listSessions(opts?: {\n limit?: number;\n since?: string;\n}): Promise<SessionListResult> {\n return callTool(\n \"sessions\",\n opts as Record<string, unknown>,\n ) as Promise<SessionListResult>;\n}\n\nexport function sessionTimeline(opts: {\n sessionId: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): Promise<SessionTimelineResult> {\n return callTool(\n \"timeline\",\n opts as Record<string, unknown>,\n ) as Promise<SessionTimelineResult>;\n}\n\nexport function costBreakdown(opts?: {\n since?: string;\n groupBy?: \"session\" | \"model\" | \"day\";\n}): Promise<SpendingResult> {\n return callTool(\n \"costs\",\n opts as Record<string, unknown>,\n ) as Promise<SpendingResult>;\n}\n\nexport function activitySummary(opts?: {\n since?: string;\n}): Promise<ActivitySummaryResult> {\n return callTool(\n \"summary\",\n opts as Record<string, unknown>,\n ) as Promise<ActivitySummaryResult>;\n}\n\nexport function listPlans(opts?: {\n session_id?: string;\n since?: string;\n limit?: number;\n}): Promise<unknown> {\n return callTool(\"plans\", opts as Record<string, unknown>);\n}\n\nexport function search(opts: {\n query: string;\n eventTypes?: string[];\n since?: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): Promise<SearchResult> {\n return callTool(\n \"search\",\n opts as Record<string, unknown>,\n ) as Promise<SearchResult>;\n}\n\nexport function print(opts: {\n source: \"hook\" | \"otel\" | \"message\";\n id: number;\n}): Promise<unknown> {\n return callTool(\"get\", opts as Record<string, unknown>);\n}\n\nexport function rawQuery(sql: string): Promise<unknown> {\n return callTool(\"query\", { sql });\n}\n\nexport function dbStats(): Promise<unknown> {\n return callTool(\"status\");\n}\n\n// ── Exec calls (write operations, CLI only) ─────────────────────────────────\n\nconst EXEC_TIMEOUT = 60_000;\n\nexport function callExec(\n command: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n return post(\"/api/exec\", { command, params }, EXEC_TIMEOUT);\n}\n\nexport function pruneEstimate(cutoffMs: number): Promise<unknown> {\n return callExec(\"prune\", { cutoffMs, dryRun: true });\n}\n\nexport function pruneExecute(\n cutoffMs: number,\n opts?: { vacuum?: boolean },\n): Promise<unknown> {\n return callExec(\"prune\", { cutoffMs, ...opts });\n}\n\nexport function refreshPricing(): Promise<unknown> {\n return callExec(\"refresh-pricing\");\n}\n\nexport interface ScanResult {\n filesScanned: number;\n newTurns: number;\n summariesUpdated: number;\n}\n\nexport function scan(opts?: { summaries?: boolean }): Promise<ScanResult> {\n return callExec(\"scan\", opts ?? {}) as Promise<ScanResult>;\n}\n\nexport function syncReset(target?: string): Promise<unknown> {\n return callExec(\"sync-reset\", target ? { target } : {});\n}\n\nexport function syncWatermarkGet(\n target: string,\n table?: string,\n): Promise<unknown> {\n return callExec(\"sync-watermark-get\", { target, table });\n}\n\nexport function syncWatermarkSet(\n target: string,\n table: string,\n value: number,\n): Promise<unknown> {\n return callExec(\"sync-watermark-set\", { target, table, value });\n}\n\nexport function syncPending(target: string): Promise<{\n target: string;\n totalPending: number;\n tables: Record<string, { total: number; synced: number; pending: number }>;\n}> {\n return callExec(\"sync-pending\", { target }) as Promise<{\n target: string;\n totalPending: number;\n tables: Record<string, { total: number; synced: number; pending: number }>;\n }>;\n}\n\nexport function syncTargetList(): Promise<unknown> {\n return callExec(\"sync-target-list\");\n}\n\nexport function syncTargetAdd(target: {\n name: string;\n url: string;\n token?: string;\n tokenCommand?: string;\n}): Promise<unknown> {\n return callExec(\"sync-target-add\", target as Record<string, unknown>);\n}\n\nexport function syncTargetRemove(name: string): Promise<unknown> {\n return callExec(\"sync-target-remove\", { name });\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { addTarget, listTargets } from \"@fml-inc/panopticon/sync\";\nimport { printBanner } from \"../banner.js\";\nimport {\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n writeEnvConfig,\n} from \"../config.js\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n // At runtime we're in dist/ (tsup bundles into entry point), go up one level\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport async function handleInstall(): Promise<void> {\n const pluginRoot = getPluginRoot();\n console.log(\"Installing fml...\\n\");\n\n // 1. Ensure panopticon is installed globally and up to date\n console.log(\"[1/5] Setting up panopticon...\");\n const { resolvePanopticonBin } = await import(\"../daemon-utils.js\");\n let freshInstall = false;\n const bin = resolvePanopticonBin();\n let needsInstall = !bin;\n if (bin) {\n // Check version — upgrade if below the minimum required by this build\n const MIN_PANOPTICON = \"0.2.2\";\n const vResult = panopticonExec(\"--version\", { timeout: 5_000 });\n const installed = vResult.ok ? vResult.stdout.trim().split(\"+\")[0] : \"0.0.0\";\n if (installed < MIN_PANOPTICON) {\n console.log(` Found panopticon ${installed}, need >=${MIN_PANOPTICON}`);\n needsInstall = true;\n }\n }\n if (needsInstall) {\n console.log(\n bin\n ? \" Upgrading @fml-inc/panopticon...\"\n : \" Installing @fml-inc/panopticon globally...\",\n );\n try {\n execFileSync(\"npm\", [\"install\", \"-g\", \"@fml-inc/panopticon@latest\"], {\n encoding: \"utf-8\",\n timeout: 120_000,\n stdio: \"pipe\",\n });\n freshInstall = true;\n console.log(\" Installed @fml-inc/panopticon\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(` Failed to install panopticon: ${msg}`);\n console.error(\" Install manually: npm install -g @fml-inc/panopticon@latest\");\n }\n }\n // npm postinstall already ran panopticon install for fresh installs;\n // only re-run for existing installs to pick up config changes.\n if (!freshInstall) {\n const result = panopticonExec(\"install\", { timeout: 60_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon install failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n }\n console.log();\n\n // 2. Ensure fml-specific directories exist\n console.log(\"[2/5] Creating fml directories...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n fs.mkdirSync(dir, { recursive: true });\n }\n console.log(` ${FML_DATA_DIR}`);\n console.log(` ${FML_LOG_DIR}\\n`);\n\n // 3. Ensure plugin manifest has the current version\n console.log(\"[3/5] Writing plugin manifest...\");\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = (pkgJson?.version as string) ?? \"0.0.0-dev\";\n const pluginManifestDir = path.join(pluginRoot, \".claude-plugin\");\n fs.mkdirSync(pluginManifestDir, { recursive: true });\n writeJsonFile(path.join(pluginManifestDir, \"plugin.json\"), {\n name: \"fml\",\n version,\n description: \"FML agent tools for Claude Code\",\n mcpServers: {\n fml: {\n command: \"node\",\n args: [\"${CLAUDE_PLUGIN_ROOT}/bin/mcp-server\"],\n },\n },\n });\n console.log(` Version: ${version}\\n`);\n\n // 4. Register fml plugin in local marketplace + Claude Code settings\n console.log(\"[4/5] Setting up fml plugin...\");\n fs.mkdirSync(path.join(MARKETPLACE_DIR, \".claude-plugin\"), {\n recursive: true,\n });\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n if (!plugins.some((p) => p.name === \"fml\")) {\n plugins.push({\n name: \"fml\",\n source: \"./fml\",\n description: \"FML agent tools for Claude Code\",\n });\n manifest.plugins = plugins;\n }\n writeJsonFile(manifestPath, manifest);\n\n // Symlink plugin source into marketplace\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n fs.symlinkSync(pluginRoot, marketplaceLink, \"dir\");\n console.log(` Marketplace: ${MARKETPLACE_DIR}`);\n console.log(` Plugin: ${pluginRoot}`);\n\n // Layer fml-specific settings on top for Claude Code\n const settings = (readJsonFile(CLAUDE_SETTINGS_PATH) ?? {}) as Record<\n string,\n Record<string, unknown>\n >;\n settings.extraKnownMarketplaces = settings.extraKnownMarketplaces ?? {};\n settings.extraKnownMarketplaces[\"local-plugins\"] = {\n source: { source: \"directory\", path: MARKETPLACE_DIR },\n };\n settings.enabledPlugins = settings.enabledPlugins ?? {};\n settings.enabledPlugins[\"fml@local-plugins\"] = true;\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Claude settings: ${CLAUDE_SETTINGS_PATH}`);\n\n // Register plugin with Claude Code (install if new, update if existing)\n try {\n try {\n execFileSync(\"claude\", [\"plugin\", \"install\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n } catch {\n execFileSync(\"claude\", [\"plugin\", \"update\", \"fml@local-plugins\"], {\n stdio: \"pipe\",\n timeout: 15_000,\n });\n }\n console.log(\" Plugin registered via Claude Code CLI\");\n } catch {\n console.log(\" warn: claude CLI not found, run 'claude plugin install fml@local-plugins' manually\");\n }\n console.log();\n\n // 5. Auto-configure sync target (best-effort)\n console.log(\"[5/5] Configuring sync target...\");\n const existingTargets = listTargets();\n const existingProd = existingTargets.find((t) => t.url === DEFAULT_SYNC_URL);\n if (existingProd) {\n console.log(` Production target already configured`);\n } else {\n const tokenCommand = resolveSyncTokenCommand();\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n console.log(` Target \"${DEFAULT_TARGET_NAME}\": ${DEFAULT_SYNC_URL}`);\n if (tokenCommand) {\n console.log(` Auth: ${tokenCommand}`);\n } else {\n // No gh and no fml login yet — target is URL-only. `fml login` will\n // back-patch it to `fml sync-token` once the user signs in.\n console.log(\n \" Auth: not configured — run `fml login` to enable sync.\",\n );\n }\n }\n\n // Set active env to the default sync target\n writeEnvConfig({ active: DEFAULT_TARGET_NAME });\n\n console.log(\"\");\n printBanner();\n console.log(\"Done! Start a new coding session to activate.\\n\");\n console.log(\"\\nNext steps:\");\n console.log(\" fml login Sign in to your FML account\");\n console.log(\" fml org Select organization\");\n console.log(\" fml sync status Check sync status\");\n console.log(\" fml status Verify setup\");\n}\n","import pc from \"picocolors\";\n\nconst LOGO_LINES = [\n \" ▄██▀ ██▄██▄██ ██\",\n \" ██ ██ ██ ██ ██\",\n \"█████ ██ ██ ██\",\n \" ██ ██ ██ ████\",\n \" ▀▀ ▀▀ ▀▀ ▀▀▀▀\",\n];\n\nexport function printBanner(): void {\n console.log(\"\");\n for (let i = 0; i < LOGO_LINES.length; i++) {\n const color = i < 3 ? pc.blue : pc.cyan;\n console.log(\" \" + color(LOGO_LINES[i]));\n }\n console.log(\"\");\n}\n","import { execSync } from \"node:child_process\";\nimport { readTokens } from \"../auth/token-store.js\";\n\nconst TOKEN_TTL_MS = 5 * 60 * 1000;\n\nlet cachedGitHubToken: { value: string; expiresAt: number } | null = null;\n\nexport function resolveGitHubToken(): string | null {\n if (cachedGitHubToken && Date.now() < cachedGitHubToken.expiresAt) {\n return cachedGitHubToken.value;\n }\n\n const envToken = process.env.PANOPTICON_GITHUB_TOKEN;\n if (envToken) {\n cachedGitHubToken = {\n value: envToken,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n return envToken;\n }\n\n try {\n const token = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (token) {\n cachedGitHubToken = {\n value: token,\n expiresAt: Date.now() + TOKEN_TTL_MS,\n };\n }\n return token || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Pick the best `tokenCommand` to write onto a sync target, given what's\n * currently available on this machine:\n *\n * 1. `gh auth token` — preferred on dev laptops. Keeps telemetry\n * attributed to the GitHub identity, which is how work is rolled up\n * for individual contributors.\n * 2. `fml sync-token` — fallback for sandboxes / CI / containers that\n * don't have `gh` but have (or will have) an `fml login` session.\n * The FML session token carries `actAsExternalId` so attribution\n * still lands on a specific user — via FML identity instead of GH.\n * 3. `undefined` — nothing usable yet. Install writes a URL-only target\n * and `fml login` will back-patch it to `fml sync-token` after the\n * user signs in.\n */\nexport function resolveSyncTokenCommand(): string | undefined {\n if (resolveGitHubToken()) return \"gh auth token\";\n if (readTokens()) return \"fml sync-token\";\n return undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { panopticonExec } from \"../daemon-utils.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\nconst CLAUDE_SETTINGS_PATH = path.join(CLAUDE_DIR, \"settings.json\");\nconst MARKETPLACE_DIR = path.join(\n os.homedir(),\n \".local\",\n \"share\",\n \"claude-plugins\",\n);\nconst PLUGIN_CACHE_DIR = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"cache\",\n \"local-plugins\",\n \"fml\",\n);\n\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nexport function handleUninstall(opts: {\n purge?: boolean;\n target?: string;\n}): void {\n const targetSpecific = opts.target && opts.target !== \"all\";\n\n console.log(\"Uninstalling fml...\\n\");\n\n // 1. Tell Claude Code to uninstall the plugin (kills MCP server, evicts cache)\n if (targetSpecific) {\n console.log(\"[1/5] Skipping plugin uninstall (target-specific uninstall)\");\n } else {\n console.log(\"[1/5] Uninstalling MCP plugin...\");\n // Uninstall from user scope via CLI\n try {\n execFileSync(\n \"claude\",\n [\"plugin\", \"uninstall\", \"fml@local-plugins\", \"--scope\", \"user\"],\n { stdio: \"pipe\", timeout: 10_000 },\n );\n console.log(\" Uninstalled (user scope)\");\n } catch {\n // Not installed at this scope, or claude CLI not found\n }\n\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n // Clean all scopes from installed_plugins.json directly — the CLI\n // can only remove project-scoped entries from within that project dir,\n // so we handle it ourselves.\n const installedPluginsPath = path.join(\n CLAUDE_DIR,\n \"plugins\",\n \"installed_plugins.json\",\n );\n const installedPlugins = readJsonFile(installedPluginsPath) as {\n version?: number;\n plugins?: Record<string, unknown[]>;\n } | null;\n const plugins = installedPlugins?.plugins;\n const fmlEntries = plugins?.[\"fml@local-plugins\"];\n if (plugins && fmlEntries) {\n // Clean project-level settings that reference fml\n for (const entry of fmlEntries) {\n const e = entry as { scope?: string; projectPath?: string };\n if (e.scope === \"project\" && e.projectPath) {\n const projSettings = path.join(e.projectPath, \".claude\", \"settings.json\");\n const proj = readJsonFile(projSettings) as Record<string, Record<string, unknown>> | null;\n if (proj?.enabledPlugins?.[\"fml@local-plugins\"] != null) {\n delete proj.enabledPlugins[\"fml@local-plugins\"];\n writeJsonFile(projSettings, proj);\n console.log(` Cleaned ${projSettings}`);\n }\n }\n }\n delete plugins[\"fml@local-plugins\"];\n writeJsonFile(installedPluginsPath, installedPlugins as Record<string, unknown>);\n console.log(\" Cleaned installed_plugins.json\");\n }\n }\n\n // 2. Remove fml plugin from Claude Code settings\n if (targetSpecific) {\n console.log(\"[2/5] Skipping plugin settings (target-specific uninstall)\");\n } else {\n console.log(\"[2/5] Removing plugin from Claude Code settings...\");\n const settings = readJsonFile(CLAUDE_SETTINGS_PATH) as Record<\n string,\n Record<string, unknown>\n > | null;\n if (settings) {\n if (settings.enabledPlugins) {\n delete settings.enabledPlugins[\"fml@local-plugins\"];\n }\n if (settings.extraKnownMarketplaces) {\n delete settings.extraKnownMarketplaces[\"local-plugins\"];\n }\n writeJsonFile(CLAUDE_SETTINGS_PATH, settings);\n console.log(` Updated ${CLAUDE_SETTINGS_PATH}`);\n } else {\n console.log(\" No settings file found, skipping\");\n }\n }\n\n // 3. Remove marketplace symlink and manifest entry\n if (targetSpecific) {\n console.log(\"[3/5] Skipping marketplace (target-specific uninstall)\");\n } else {\n console.log(\"[3/5] Removing marketplace registration...\");\n const marketplaceLink = path.join(MARKETPLACE_DIR, \"fml\");\n try {\n fs.rmSync(marketplaceLink, { recursive: true, force: true });\n console.log(` Removed ${marketplaceLink}`);\n } catch {\n console.log(\" No marketplace link found, skipping\");\n }\n\n const manifestPath = path.join(\n MARKETPLACE_DIR,\n \".claude-plugin\",\n \"marketplace.json\",\n );\n const manifest = readJsonFile(manifestPath);\n if (manifest && Array.isArray(manifest.plugins)) {\n manifest.plugins = (\n manifest.plugins as Array<Record<string, unknown>>\n ).filter((p) => p.name !== \"fml\");\n writeJsonFile(manifestPath, manifest);\n console.log(` Updated ${manifestPath}`);\n }\n }\n\n // 4. Run panopticon uninstall\n console.log(\"[4/5] Running panopticon uninstall...\");\n const panoArgs = [\"uninstall\"];\n if (opts.target) panoArgs.push(\"--target\", opts.target);\n if (opts.purge) panoArgs.push(\"--purge\");\n const result = panopticonExec(...panoArgs, { timeout: 30_000 });\n if (result.ok) {\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n } else {\n console.error(\" panopticon uninstall failed:\");\n for (const line of result.stdout.trim().split(\"\\n\")) {\n console.error(` ${line}`);\n }\n }\n\n // 5. Remove fml data, logs, and plugin cache\n if (targetSpecific) {\n console.log(\"[5/5] Skipping data removal (target-specific uninstall)\");\n } else {\n console.log(\"[5/5] Removing plugin cache...\");\n try {\n fs.rmSync(PLUGIN_CACHE_DIR, { recursive: true, force: true });\n console.log(` Removed ${PLUGIN_CACHE_DIR}`);\n } catch {\n console.log(\" No plugin cache found\");\n }\n }\n\n if (opts.purge) {\n console.log(\"Removing fml data and logs...\");\n for (const dir of [FML_DATA_DIR, FML_LOG_DIR]) {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` Removed ${dir}`);\n } catch {\n console.log(` Could not remove ${dir}`);\n }\n }\n } else {\n console.log(\"Keeping fml data (use --purge to remove)\");\n }\n\n console.log(\"\\nDone! FML has been uninstalled.\");\n}\n","import { execSync } from \"node:child_process\";\nimport { Sentry } from \"../sentry.js\";\n\ndeclare const __FML_PLUGIN_VERSION__: string;\n\nexport async function handleUpdate(): Promise<void> {\n const currentVersion =\n typeof __FML_PLUGIN_VERSION__ !== \"undefined\"\n ? __FML_PLUGIN_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\"Updating via npm...\\n\");\n\n try {\n const env = { ...process.env };\n delete env.npm_config_registry;\n\n execSync(\"npm install -g @fml-inc/fml@latest\", {\n stdio: \"inherit\",\n timeout: 120_000,\n env,\n });\n\n console.log(\"\\nUpdated. Run `fml install --skip-build` to reconfigure.\");\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg =\n err instanceof Error\n ? ((err as Error & { stderr?: Buffer }).stderr?.toString() ??\n err.message)\n : String(err);\n console.error(\"Update failed:\", msg);\n process.exit(1);\n }\n}\n","import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { CONVEX_URL, WORKOS_API_URL, WORKOS_AUTH_URL } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\n/**\n * Fetch the WorkOS client ID from the active Convex deployment.\n * This allows each environment to use its own WorkOS configuration.\n */\nasync function fetchWorkosClientId(): Promise<string> {\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n const ref =\n \"public_config:getAuthConfig\" as unknown as import(\"convex/server\").FunctionReference<\"query\">;\n const result = (await client.query(ref, {})) as {\n workosClientId: string;\n };\n return result.workosClientId;\n}\n\n/**\n * Detect if a browser can be opened on this machine.\n * Returns false for headless environments (containers, SSH, no display).\n */\nexport async function canOpenBrowser(): Promise<boolean> {\n // Explicit overrides\n if (process.env.FML_DEVICE_FLOW === \"1\") return false;\n if (process.env.FML_NO_BROWSER === \"1\") return false;\n\n // Linux without a display server\n if (\n process.platform === \"linux\" &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return false;\n }\n\n // Remote/container environments\n if (process.env.SSH_CONNECTION) return false;\n if (process.env.CODESPACES) return false;\n if (process.env.REMOTE_CONTAINERS) return false;\n\n // Container detection\n try {\n const fs = await import(\"node:fs\");\n if (fs.existsSync(\"/.dockerenv\")) return false;\n } catch {\n // ignore\n }\n\n return true;\n}\n\n/**\n * Run the WorkOS PKCE OAuth flow:\n * 1. Generate code_verifier + code_challenge\n * 2. Start local HTTP server for callback\n * 3. Open browser to WorkOS authorization URL\n * 4. Receive callback with authorization code\n * 5. Exchange code for tokens\n * 6. Store tokens\n */\nexport async function login(): Promise<{\n email: string;\n name: string;\n}> {\n // Fetch the WorkOS client ID from the active Convex deployment\n const clientId = await fetchWorkosClientId();\n\n // Generate PKCE code verifier and challenge\n const codeVerifier = crypto.randomBytes(32).toString(\"base64url\");\n const codeChallenge = crypto\n .createHash(\"sha256\")\n .update(codeVerifier)\n .digest(\"base64url\");\n\n // Generate state for CSRF protection (defense-in-depth alongside PKCE)\n const state = crypto.randomBytes(16).toString(\"hex\");\n\n // Find a free port and start callback server (pass state for CSRF verification)\n const { port, waitForCode, close } = await startCallbackServer(state);\n\n const redirectUri = `http://localhost:${port}/callback`;\n const authUrl = new URL(`${WORKOS_AUTH_URL}/user_management/authorize`);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"provider\", \"authkit\");\n authUrl.searchParams.set(\"state\", state);\n\n // Open browser\n const open = (await import(\"open\")).default;\n await open(authUrl.toString());\n\n console.log(\"\\nOpening browser for login...\");\n console.log(`If it doesn't open, visit: ${authUrl.toString()}\\n`);\n\n // Wait for the callback\n const code = await waitForCode();\n close();\n\n // Exchange code for tokens\n const tokenResponse = await fetch(\n `${WORKOS_API_URL}/user_management/authenticate`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code,\n code_verifier: codeVerifier,\n redirect_uri: redirectUri,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const error = await tokenResponse.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = (await tokenResponse.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n user: {\n id: string;\n email: string;\n first_name?: string;\n last_name?: string;\n };\n };\n\n const userName = [data.user.first_name, data.user.last_name]\n .filter(Boolean)\n .join(\" \");\n\n writeTokens({\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: Date.now() + (data.expires_in ?? 300) * 1000,\n user: {\n id: data.user.id,\n email: data.user.email,\n name: userName,\n },\n workosClientId: clientId,\n });\n\n return { email: data.user.email, name: userName };\n}\n\nfunction startCallbackServer(expectedState: string): Promise<{\n port: number;\n waitForCode: () => Promise<string>;\n close: () => void;\n}> {\n return new Promise((resolve, reject) => {\n let resolveCode: (code: string) => void;\n let rejectCode: (err: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = http.createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n const error = url.searchParams.get(\"error\");\n const returnedState = url.searchParams.get(\"state\");\n\n // Verify state parameter to prevent CSRF\n if (returnedState !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>Invalid state parameter. You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(\"OAuth state mismatch — possible CSRF attack\"));\n return;\n }\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login failed</h1><p>You can close this tab.</p></body></html>\",\n );\n rejectCode(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Login successful!</h1><p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n resolveCode(code);\n return;\n }\n\n res.writeHead(400);\n res.end(\"Missing code parameter\");\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n // Listen on a random available port\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n\n resolve({\n port: addr.port,\n waitForCode: () => codePromise,\n close: () => server.close(),\n });\n });\n\n server.on(\"error\", reject);\n\n // Timeout after 5 minutes\n setTimeout(\n () => {\n rejectCode(new Error(\"Login timed out (5 minutes)\"));\n server.close();\n },\n 5 * 60 * 1000,\n );\n });\n}\n","/**\n * Device Authorization Flow — Double Handshake\n *\n * 1. CLI gets a unique URL + deviceCode from backend\n * 2. User pastes URL in browser → page shows confirmation code\n * 3. User types confirmation code back into CLI\n * 4. CLI polls with deviceCode + confirmationCode → gets tokens\n */\n\nimport { createInterface } from \"node:readline\";\nimport { getSiteUrl } from \"../config.js\";\nimport { writeTokens } from \"./token-store.js\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr, // Use stderr so stdout stays clean for MCP\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n verificationUri: string;\n expiresAt: number;\n interval: number;\n}\n\ninterface PollResponse {\n status:\n | \"pending\"\n | \"authorized\"\n | \"expired\"\n | \"rate_limited\"\n | \"invalid_code\";\n refreshToken?: string;\n accessToken?: string;\n expiresAt?: number;\n user?: { id: string; email: string; name: string };\n orgSlug?: string;\n interval?: number;\n}\n\n/**\n * Run the double-handshake device authorization flow.\n */\nexport async function deviceLogin(): Promise<{\n email: string;\n name: string;\n}> {\n const siteUrl = getSiteUrl();\n\n // 1. Request device code + session URL\n const codeRes = await fetch(`${siteUrl}/api/auth/device/code`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n if (!codeRes.ok) {\n const body = await codeRes.text();\n throw new Error(`Failed to start device flow: ${body}`);\n }\n\n const codeData = (await codeRes.json()) as DeviceCodeResponse;\n\n // 2. Show URL for user to paste in browser\n console.log(\"\");\n console.log(\" Paste this URL in your browser to sign in:\");\n console.log(\"\");\n console.log(` ${codeData.verificationUri}`);\n console.log(\"\");\n\n // 3. Wait for user to enter the confirmation code from the browser\n const confirmationCode = await prompt(\" Enter the code from your browser: \");\n\n if (!confirmationCode) {\n throw new Error(\"No confirmation code entered.\");\n }\n\n // Normalize: uppercase, strip dashes/spaces\n const normalizedCode = confirmationCode\n .toUpperCase()\n .replace(/[\\s-]/g, \"\")\n .replace(/^(.{4})/, \"$1-\");\n\n console.log(\" Verifying...\");\n\n // 4. Poll with deviceCode + confirmationCode\n let pollInterval = codeData.interval * 1000;\n\n while (Date.now() < codeData.expiresAt) {\n const pollRes = await fetch(`${siteUrl}/api/auth/device/poll`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n deviceCode: codeData.deviceCode,\n confirmationCode: normalizedCode,\n }),\n });\n\n if (pollRes.status === 429) {\n const data = (await pollRes.json()) as PollResponse;\n pollInterval = (data.interval ?? codeData.interval * 2) * 1000;\n await sleep(pollInterval);\n continue;\n }\n\n const data = (await pollRes.json()) as PollResponse;\n\n if (data.status === \"pending\") {\n // User hasn't clicked Authorize yet — wait and retry\n await sleep(pollInterval);\n continue;\n }\n\n if (data.status === \"authorized\") {\n writeTokens({\n accessToken: data.accessToken!,\n refreshToken: data.refreshToken!,\n expiresAt: data.expiresAt!,\n user: data.user!,\n orgSlug: data.orgSlug ?? undefined,\n tokenType: \"service\",\n });\n\n return { email: data.user!.email, name: data.user!.name };\n }\n\n if (data.status === \"invalid_code\") {\n throw new Error(\n \"Invalid confirmation code. Make sure you copied the code from the browser correctly.\",\n );\n }\n\n if (data.status === \"expired\") {\n throw new Error(\"Device authorization expired. Run `fml login` again.\");\n }\n\n throw new Error(`Device authorization failed: ${data.status}`);\n }\n\n throw new Error(\n \"Device authorization timed out (15 minutes). Run `fml login` again.\",\n );\n}\n","import type { FunctionReference } from \"convex/server\";\nimport {\n addTarget,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { login, canOpenBrowser } from \"../auth/oauth.js\";\nimport { deviceLogin } from \"../auth/device-flow.js\";\nimport { getValidToken, setSelectedOrg } from \"../auth/token-store.js\";\nimport { createApiClient } from \"../convex-client.js\";\nimport { resolveGitHubToken } from \"../sync/client.js\";\nimport {\n CONVEX_URL,\n DEFAULT_SYNC_URL,\n DEFAULT_TARGET_NAME,\n getActiveEnv,\n} from \"../config.js\";\nimport { Sentry } from \"../sentry.js\";\n\n/**\n * After login, link the user's GitHub identity to their FML account\n * so that sync data (authenticated via GitHub token) can be attributed.\n */\nasync function linkGitHubIdentity(): Promise<void> {\n const token = resolveGitHubToken();\n if (!token) {\n console.warn(\"[fml] No GitHub token available — skipping identity link\");\n return;\n }\n\n try {\n const response = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n });\n if (!response.ok) {\n console.warn(\n `[fml] GitHub API returned ${response.status} — skipping identity link`,\n );\n return;\n }\n\n const user = (await response.json()) as {\n login: string;\n id: number;\n email: string | null;\n };\n\n const fmlToken = await getValidToken();\n if (!fmlToken) {\n console.warn(\"[fml] No FML token available — skipping identity link\");\n return;\n }\n\n // Service tokens (device flow) can't call JWT-authenticated Convex mutations.\n // Identity is already attributed server-side via actAsExternalId on the token.\n if (fmlToken.startsWith(\"fml_st_\")) {\n return;\n }\n\n const { ConvexHttpClient } = await import(\"convex/browser\");\n const client = new ConvexHttpClient(CONVEX_URL);\n client.setAuth(fmlToken);\n\n const ref =\n \"user/panopticon:linkGitHubIdentity\" as unknown as FunctionReference<\"mutation\">;\n await client.mutation(ref, {\n githubUsername: user.login,\n githubId: user.id,\n githubEmail: user.email ?? undefined,\n });\n\n console.log(`Linked GitHub account: ${user.login}`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Failed to link GitHub identity: ${msg}`);\n }\n}\n\n// Config snapshots are now synced automatically via panopticon sync —\n// no manual upload needed after login.\n\n/**\n * After a successful login, upgrade the default sync target to use\n * `fml sync-token` if it doesn't already have a working `tokenCommand`.\n *\n * - Target missing entirely → add one pointing at prod with fml sync-token.\n * - Target exists with no tokenCommand (URL-only, written by `fml install`\n * on a sandbox) → attach fml sync-token.\n * - Target already has a tokenCommand (gh auth token on a dev laptop, or\n * a custom one) → leave it alone; we don't second-guess the user's\n * explicit choice and GH attribution is preferred when available.\n */\n// Exported for unit testing; called from within handleLogin otherwise.\nexport function upgradeSyncTargetAfterLogin(): void {\n try {\n const config = loadSyncConfig();\n const existing = config.targets.find((t) => t.name === DEFAULT_TARGET_NAME);\n if (!existing) {\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand: \"fml sync-token\",\n });\n console.log(\n `Sync target \"${DEFAULT_TARGET_NAME}\" configured with fml sync-token.`,\n );\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n return;\n }\n if (!existing.tokenCommand && !existing.token) {\n existing.tokenCommand = \"fml sync-token\";\n saveSyncConfig(config);\n console.log(`Sync target \"${existing.name}\" now using fml sync-token.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n }\n } catch (err: unknown) {\n // Non-fatal — login itself succeeded, worst case sync stays URL-only\n // and the user can run `fml sync setup` manually.\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`[fml] Could not update sync target: ${msg}`);\n }\n}\n\n/**\n * After login, select and persist the user's org.\n * Single-org users get auto-selected; multi-org users get the first org\n * (can be changed later via `fml org`).\n */\nasync function selectOrg(): Promise<void> {\n try {\n const token = await getValidToken();\n if (!token) return;\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) return;\n\n const org = orgs[0];\n const slug = org.slug ?? org.name;\n setSelectedOrg(slug);\n console.log(`Selected org: ${org.name} (${slug})`);\n } catch {\n // Non-fatal — org selection can happen later via `fml org`\n }\n}\n\nexport async function handleLogin(opts?: { device?: boolean }): Promise<void> {\n const { name: envName } = getActiveEnv();\n\n // Skip OAuth if already authenticated — still run post-login tasks\n const existingToken = await getValidToken();\n if (existingToken) {\n const { readTokens } = await import(\"../auth/token-store.js\");\n const stored = readTokens();\n console.log(\n `Already logged in as ${stored?.user.name} (${stored?.user.email}) on ${envName}.`,\n );\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n }\n\n console.log(`Signing in to FML (${envName})...`);\n try {\n const useDeviceFlow = opts?.device || !(await canOpenBrowser());\n let result: { email: string; name: string };\n\n if (useDeviceFlow) {\n result = await deviceLogin();\n } else {\n result = await login();\n }\n\n console.log(`\\nLogged in as ${result.name} (${result.email})`);\n\n await linkGitHubIdentity();\n await selectOrg();\n upgradeSyncTargetAfterLogin();\n\n console.log(\"You're all set! Restart Claude Code to use FML tools.\");\n process.exit(0);\n } catch (err: unknown) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Login failed: ${msg}`);\n process.exit(1);\n }\n}\n","import fs from \"node:fs\";\nimport { AUTH_STORE_PATH } from \"../config.js\";\n\nexport function handleLogout(): void {\n try {\n fs.unlinkSync(AUTH_STORE_PATH);\n } catch {\n // File doesn't exist, that's fine\n }\n console.log(\"Logged out. Stored credentials cleared.\");\n}\n","import { createApiClient } from \"../convex-client.js\";\nimport {\n getSelectedOrg,\n getValidToken,\n setSelectedOrg,\n} from \"../auth/token-store.js\";\n\nexport async function handleOrg(slug?: string): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"Not logged in. Run `fml login` first.\");\n process.exit(1);\n }\n\n const api = createApiClient(token);\n const orgs = await api.queryOrgs();\n\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n\n const current = getSelectedOrg();\n\n // No slug provided — show current selection and available orgs\n if (!slug) {\n console.log(\"Organizations:\\n\");\n for (const org of orgs) {\n const orgSlug = org.slug ?? org.name;\n const marker = orgSlug === current ? \" (selected)\" : \"\";\n console.log(` ${orgSlug}${marker}`);\n }\n if (!current) {\n console.log(\"\\nNo org selected. Run `fml org <slug>` to select one.\");\n }\n return;\n }\n\n // Slug provided — select it\n const match = orgs.find(\n (o) => (o.slug ?? o.name) === slug || o.name === slug,\n );\n if (!match) {\n console.error(\n `Organization \"${slug}\" not found. Available: ${orgs.map((o) => o.slug ?? o.name).join(\", \")}`,\n );\n process.exit(1);\n }\n\n const matchSlug = match.slug ?? match.name;\n setSelectedOrg(matchSlug);\n console.log(`Selected org: ${match.name} (${matchSlug})`);\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst APP_BASE_URL = \"https://app.fml.app\";\n\nexport async function handleOpen(opts: { json?: boolean }): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` first.\");\n process.exit(1);\n }\n\n let slug: string;\n try {\n const orgs = await api.queryOrgs();\n if (orgs.length === 0) {\n console.error(\"No organizations found.\");\n process.exit(1);\n }\n slug = orgs[0].slug ?? orgs[0].name;\n } catch {\n console.error(\"Could not fetch organizations. Opening base URL.\");\n slug = \"\";\n }\n\n const url = slug ? `${APP_BASE_URL}/${slug}` : APP_BASE_URL;\n\n if (opts.json) {\n console.log(JSON.stringify({ url }));\n } else {\n const openBrowser = (await import(\"open\")).default;\n await openBrowser(url);\n }\n}\n","import { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { getActiveEnv } from \"../config.js\";\n\nexport async function handleStatus(): Promise<void> {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex: ${convexUrl}\\n`);\n\n const tokens = readTokens();\n\n if (!tokens) {\n console.log(\"Not authenticated. Run `fml login` to sign in.\");\n return;\n }\n\n const tokenValid = await getValidToken();\n\n console.log(\"Authentication:\");\n console.log(` User: ${tokens.user.name} (${tokens.user.email})`);\n console.log(\n ` Token: ${tokenValid ? \"valid\" : \"expired (needs refresh/re-login)\"}`,\n );\n console.log(` Org: ${tokens.orgSlug ?? \"(none — run `fml org <slug>`)\"}`);\n}\n","import { DEFAULT_SYNC_URL, DEFAULT_TARGET_NAME } from \"../config.js\";\nimport { resolveSyncTokenCommand } from \"../sync/client.js\";\nimport {\n addTarget,\n removeTarget,\n listTargets,\n loadSyncConfig,\n saveSyncConfig,\n} from \"@fml-inc/panopticon/sync\";\nimport { syncPending, syncReset } from \"@fml-inc/panopticon/api\";\n\n// ── Setup (convenience shortcut) ────────────────────────────────────────────\n\nexport async function handleSyncSetup(): Promise<void> {\n console.log(\"FML Sync Setup\\n\");\n\n const tokenCommand = resolveSyncTokenCommand();\n if (!tokenCommand) {\n console.error(\n \"No credential available. Run `fml login` first, or set PANOPTICON_GITHUB_TOKEN / install gh CLI.\",\n );\n process.exit(1);\n }\n\n // Replace any existing entry so re-running setup upgrades the target in\n // place (e.g. URL-only → fml sync-token after first login).\n removeTarget(DEFAULT_TARGET_NAME);\n addTarget({\n name: DEFAULT_TARGET_NAME,\n url: DEFAULT_SYNC_URL,\n tokenCommand,\n });\n\n console.log(`Sync target \"${DEFAULT_TARGET_NAME}\" configured:`);\n console.log(` URL: ${DEFAULT_SYNC_URL}`);\n console.log(` Auth: ${tokenCommand}`);\n console.log(`\\nRestart panopticon to activate: fml stop && fml start`);\n}\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncList(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\n \"No sync targets configured. Run `fml sync setup` or `fml sync add`.\",\n );\n return;\n }\n\n console.log(\"Sync targets:\\n\");\n for (const t of targets) {\n const auth = t.token\n ? \"static token\"\n : t.tokenCommand\n ? `command: ${t.tokenCommand}`\n : \"none\";\n console.log(` ${t.name}`);\n console.log(` URL: ${t.url}`);\n console.log(` Auth: ${auth}`);\n }\n}\n\n// ── Add ──────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncAdd(\n name: string,\n url: string,\n opts: { tokenCmd?: string; token?: string },\n): Promise<void> {\n const existing = listTargets();\n if (existing.some((t) => t.name === name)) {\n console.error(\n `Target \"${name}\" already exists. Use \\`fml sync edit\\` to modify it.`,\n );\n process.exit(1);\n }\n\n addTarget({\n name,\n url,\n tokenCommand: opts.tokenCmd,\n token: opts.token,\n });\n\n console.log(`Sync target \"${name}\" added:`);\n console.log(` URL: ${url}`);\n if (opts.tokenCmd) console.log(` Auth: command: ${opts.tokenCmd}`);\n else if (opts.token) console.log(\" Auth: static token\");\n else console.log(\" Auth: none\");\n console.log(\"\\nRestart panopticon to activate: fml stop && fml start\");\n}\n\n// ── Remove ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncRemove(name: string): Promise<void> {\n const removed = removeTarget(name);\n if (removed) {\n console.log(`Sync target \"${name}\" removed.`);\n console.log(\"Restart panopticon to apply: fml stop && fml start\");\n } else {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n}\n\n// ── Edit ─────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncEdit(\n name: string,\n opts: { url?: string; tokenCmd?: string; token?: string },\n): Promise<void> {\n const config = loadSyncConfig();\n const target = config.targets.find((t) => t.name === name);\n if (!target) {\n console.error(`Target \"${name}\" not found.`);\n process.exit(1);\n }\n\n if (opts.url) target.url = opts.url;\n if (opts.tokenCmd) {\n target.tokenCommand = opts.tokenCmd;\n delete target.token;\n }\n if (opts.token) {\n target.token = opts.token;\n delete target.tokenCommand;\n }\n\n saveSyncConfig(config);\n console.log(`Sync target \"${name}\" updated:`);\n console.log(` URL: ${target.url}`);\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(` Auth: ${auth}`);\n console.log(\"\\nRestart panopticon to apply: fml stop && fml start\");\n}\n\n// ── Status ───────────────────────────────────────────────────────────────────\n\nexport async function handleSyncStatus(): Promise<void> {\n const targets = listTargets();\n\n if (targets.length === 0) {\n console.log(\"No sync targets configured. Run `fml sync setup` first.\");\n return;\n }\n\n for (const target of targets) {\n const auth = target.token\n ? \"static token\"\n : target.tokenCommand\n ? `command: ${target.tokenCommand}`\n : \"none\";\n console.log(`${target.name}:`);\n console.log(` URL: ${target.url}`);\n console.log(` Auth: ${auth}`);\n\n try {\n const result = await syncPending(target.name);\n if (result.totalPending === 0) {\n console.log(\" Status: up to date\");\n } else {\n console.log(` Pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} pending (${info.synced} / ${info.total})`,\n );\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.log(` Status: unavailable (${msg})`);\n }\n console.log();\n }\n}\n\n// ── Reset ────────────────────────────────────────────────────────────────────\n\nexport async function handleSyncReset(targetName?: string): Promise<void> {\n await syncReset(targetName ?? DEFAULT_TARGET_NAME);\n console.log(\n `Sync watermarks for \"${targetName ?? DEFAULT_TARGET_NAME}\" reset to 0.`,\n );\n}\n","import { once } from \"node:events\";\nimport { getValidToken } from \"../auth/token-store.js\";\n\n/**\n * Print the current FML access token to stdout.\n *\n * Wired into panopticon sync targets as `tokenCommand: \"fml sync-token\"`.\n * Resolves and refreshes the stored FML session token, the same credential\n * `fml login` produces. Used on sandboxes / CI / containers where there's\n * no `gh auth token` to attribute sync telemetry to a GitHub identity.\n *\n * Output: token on stdout, nothing else. Non-zero exit on any failure so\n * panopticon's token helper treats it as a missed refresh rather than\n * caching an empty string as the bearer.\n */\nexport async function handleSyncToken(): Promise<void> {\n const token = await getValidToken();\n if (!token) {\n console.error(\"fml: not logged in. Run `fml login` to enable sync.\");\n process.exit(1);\n }\n // Wait for drain before exiting — small writes on a pipe are usually\n // synchronous up to PIPE_BUF, but on slow/full pipes (or non-Linux\n // platforms) `process.exit` can cut off the write mid-flight and\n // hand panopticon a truncated token.\n if (!process.stdout.write(token)) {\n await once(process.stdout, \"drain\");\n }\n process.exit(0);\n}\n","import { listTargets } from \"@fml-inc/panopticon/sync\";\nimport { getActiveEnv, writeEnvConfig } from \"../config.js\";\nimport { handleStop, handleStart } from \"./daemon.js\";\n\n/**\n * Show the active environment.\n */\nexport function handleEnvShow(): void {\n const { name, convexUrl } = getActiveEnv();\n console.log(`Environment: ${name}`);\n console.log(` Convex URL: ${convexUrl}`);\n}\n\n/**\n * Switch to a sync target as the active environment.\n * Automatically restarts daemons so the new URL takes effect.\n */\nexport async function handleEnvSwitch(target: string): Promise<void> {\n const targets = listTargets();\n const match = targets.find((t) => t.name === target);\n if (!match) {\n console.error(`Sync target \"${target}\" not found. Available targets:`);\n for (const t of targets) {\n console.error(` ${t.name} ${t.url}`);\n }\n console.error(\"\\nAdd a target with `fml sync add`.\");\n process.exit(1);\n }\n\n writeEnvConfig({ active: target });\n const convexUrl = match.url.replace(\".convex.site\", \".convex.cloud\");\n console.log(`Switched to ${target}: ${convexUrl}`);\n\n console.log(\"\\nRestarting daemons...\");\n handleStop();\n await handleStart();\n console.log(\n \"MCP server will pick up the change on next Claude Code session.\",\n );\n}\n","/**\n * CLI wrappers for remote FML backend data queries.\n * Each command queries the FML Convex backend via the authenticated API client.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nasync function queryBackend(\n toolName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login` to sign in.\");\n process.exit(1);\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error ?? \"Unknown error\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleActivity(opts: { since?: string }): Promise<void> {\n await queryBackend(\"get-engineering-activity\", {\n timeRange: opts.since ?? \"24h\",\n });\n}\n\nexport async function handleSessions(opts: {\n since?: string;\n limit?: string;\n}): Promise<void> {\n await queryBackend(\"list-engineering-sessions\", {\n timeRange: opts.since ?? \"24h\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n\nexport async function handleTimeline(\n sessionId: string,\n opts: { limit?: string; offset?: string },\n): Promise<void> {\n await queryBackend(\"get-session-timeline\", {\n sessionId,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n offset: opts.offset ? parseInt(opts.offset, 10) : undefined,\n });\n}\n\nexport async function handleSpending(opts: {\n since?: string;\n groupBy?: string;\n}): Promise<void> {\n await queryBackend(\"get-ai-spending\", {\n timeRange: opts.since ?? \"7d\",\n groupBy: opts.groupBy,\n });\n}\n\nexport async function handleSearch(\n query: string,\n opts: { since?: string; limit?: string },\n): Promise<void> {\n await queryBackend(\"search-engineering-sessions\", {\n query,\n timeRange: opts.since ?? \"7d\",\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n}\n","/**\n * Unified provider query command.\n * Routes requests to the appropriate backend tool based on provider and endpoint.\n */\n\nimport { getAuthenticatedClient } from \"../convex-client.js\";\n\nconst GENERIC_PROVIDERS = [\n \"sentry\",\n \"slack\",\n \"github\",\n \"linear\",\n \"notion\",\n \"freshdesk\",\n \"stripe\",\n];\n\nconst POSTHOG_ENDPOINTS: Record<string, string> = {\n insights: \"query-posthog-insights\",\n events: \"query-posthog-events\",\n recordings: \"query-posthog-recordings\",\n \"feature-flags\": \"query-posthog-feature-flags\",\n experiments: \"query-posthog-experiments\",\n surveys: \"query-posthog-surveys\",\n hogql: \"run-posthog-hogql\",\n cohorts: \"query-posthog-cohorts\",\n};\n\nconst AMPLITUDE_ENDPOINTS: Record<string, string> = {\n events: \"query-amplitude-events\",\n funnel: \"query-amplitude-funnel\",\n retention: \"query-amplitude-retention\",\n chart: \"get-amplitude-chart\",\n \"list-events\": \"list-amplitude-events\",\n};\n\nconst META_ADS_ENDPOINTS: Record<string, string> = {\n accounts: \"list-meta-ad-accounts\",\n campaigns: \"list-meta-campaigns\",\n insights: \"get-meta-ad-insights\",\n \"ad-sets\": \"list-meta-ad-sets\",\n};\n\nfunction parseBody(body?: string): Record<string, unknown> {\n if (!body) return {};\n try {\n return JSON.parse(body) as Record<string, unknown>;\n } catch {\n console.error(\"Invalid JSON in --body argument.\");\n process.exit(1);\n }\n}\n\nexport async function handleQuery(\n provider: string,\n endpoint: string,\n opts: { method?: string; body?: string; projectId?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n\n const parsedBody = parseBody(opts.body);\n let toolName: string;\n let args: Record<string, unknown>;\n\n if (GENERIC_PROVIDERS.includes(provider)) {\n toolName = `integration-${provider}`;\n args = {\n endpoint,\n method: opts.method || \"GET\",\n body: parsedBody,\n projectId: opts.projectId,\n };\n } else if (provider === \"posthog\") {\n toolName = POSTHOG_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown posthog endpoint: ${endpoint}. Valid: ${Object.keys(POSTHOG_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n args = { ...parsedBody };\n } else if (provider === \"amplitude\") {\n toolName = AMPLITUDE_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown amplitude endpoint: ${endpoint}. Valid: ${Object.keys(AMPLITUDE_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // list-events takes no args — --body is ignored for this endpoint\n args = endpoint === \"list-events\" ? {} : { ...parsedBody };\n } else if (provider === \"meta-ads\") {\n toolName = META_ADS_ENDPOINTS[endpoint];\n if (!toolName) {\n console.error(\n `Unknown meta-ads endpoint: ${endpoint}. Valid: ${Object.keys(META_ADS_ENDPOINTS).join(\", \")}`,\n );\n process.exit(1);\n }\n // accounts takes no args — --body is ignored for this endpoint\n args = endpoint === \"accounts\" ? {} : { ...parsedBody };\n } else {\n console.error(\n `Unknown provider: ${provider}. Valid: ${[...GENERIC_PROVIDERS, \"posthog\", \"amplitude\", \"meta-ads\"].join(\", \")}`,\n );\n process.exit(1);\n }\n\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleAutomationList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-automations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreate(opts: {\n name: string;\n prompt: string;\n frequency: string;\n hour: string;\n minute: string;\n timezone: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n maxRuns?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n frequency: opts.frequency,\n hour: parseInt(opts.hour, 10),\n minute: parseInt(opts.minute, 10),\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n maxRuns: opts.maxRuns ? parseInt(opts.maxRuns, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationCreatePattern(opts: {\n name: string;\n prompt: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"create-pattern-automation\", {\n name: opts.name,\n prompt: opts.prompt,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationUpdate(\n id: string,\n opts: {\n name?: string;\n prompt?: string;\n enabled?: string;\n frequency?: string;\n hour?: string;\n minute?: string;\n timezone?: string;\n dayOfWeek?: string;\n dayOfMonth?: string;\n },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"update-automation\", {\n automationId: id,\n name: opts.name,\n prompt: opts.prompt,\n enabled:\n opts.enabled !== undefined\n ? (() => {\n if (opts.enabled !== \"true\" && opts.enabled !== \"false\") {\n console.error(\n `Invalid --enabled value: \"${opts.enabled}\". Use \"true\" or \"false\".`,\n );\n process.exit(1);\n }\n return opts.enabled === \"true\";\n })()\n : undefined,\n frequency: opts.frequency,\n hour: opts.hour ? parseInt(opts.hour, 10) : undefined,\n minute: opts.minute ? parseInt(opts.minute, 10) : undefined,\n timezone: opts.timezone,\n dayOfWeek: opts.dayOfWeek ? parseInt(opts.dayOfWeek, 10) : undefined,\n dayOfMonth: opts.dayOfMonth ? parseInt(opts.dayOfMonth, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationDelete(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleAutomationTest(id: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"test-automation\", {\n automationId: id,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMemoryList(opts: {\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-memory-files\", {\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryRead(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"read-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryWrite(opts: {\n title: string;\n content: string;\n scope?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"write-memory-file\", {\n title: opts.title,\n content: opts.content,\n scope: opts.scope,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMemoryDelete(fileId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"delete-memory-file\", { fileId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSearchAnalysis(\n query: string,\n opts: { status?: string; limit?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"search-analysis\", {\n query,\n status: opts.status,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleRunAnalysis(opts: {\n prompts?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"run-analysis-workflow\", {\n selectedPromptKeys: opts.prompts?.split(\",\"),\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleIntegrations(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-integrations\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleEvents(opts: {\n source?: string;\n eventType?: string;\n projectId?: string;\n since?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-integration-events\", {\n source: opts.source,\n eventType: opts.eventType,\n projectId: opts.projectId,\n timeRange: opts.since,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleResolveIdentity(opts: {\n provider?: string;\n username?: string;\n email?: string;\n externalId?: string;\n externalUserId?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"resolve-identities\", {\n provider: opts.provider,\n externalUsername: opts.username,\n normalizedEmail: opts.email,\n externalId: opts.externalId,\n externalUserId: opts.externalUserId,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSlackHistory(opts: {\n channel?: string;\n limit?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-channel-history\", {\n channelId: opts.channel,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSlackMessage(opts: {\n permalink?: string;\n channel?: string;\n ts?: string;\n includeThread?: boolean;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"get-slack-message\", {\n permalink: opts.permalink,\n channelId: opts.channel,\n messageTs: opts.ts,\n includeThreadContext: opts.includeThread,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleMessagesList(opts: {\n start?: string;\n end?: string;\n limit?: string;\n cursor?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages\", {\n startTime: opts.start ? parseInt(opts.start, 10) : undefined,\n endTime: opts.end ? parseInt(opts.end, 10) : undefined,\n limit: opts.limit ? parseInt(opts.limit, 10) : undefined,\n cursor: opts.cursor,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleMessagesContext(\n messageId: string,\n opts: { before?: string; after?: string },\n): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-messages-with-context\", {\n messageId,\n before: opts.before ? parseInt(opts.before, 10) : undefined,\n after: opts.after ? parseInt(opts.after, 10) : undefined,\n });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleSkillsList(): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"list-skills\", {});\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n\nexport async function handleSkillsLoad(skillId: string): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n const result = await api.callBackend(\"load-skill\", { skillId });\n if (!result.ok) {\n console.error(result.error || \"Request failed\");\n process.exit(1);\n }\n console.log(JSON.stringify(result.result, null, 2));\n}\n","import { getAuthenticatedClient } from \"../convex-client.js\";\n\nexport async function handleConfigList(opts: {\n org: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.listRepoConfigSnapshots(opts.org, opts.repo)\n : await api.listUserConfigSnapshots(opts.org);\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nexport async function handleConfigDetail(opts: {\n org: string;\n user?: string;\n repo?: string;\n}): Promise<void> {\n const api = await getAuthenticatedClient();\n if (!api) {\n console.error(\"Not authenticated. Run `fml login`.\");\n process.exit(1);\n }\n try {\n const result = opts.repo\n ? await api.getRepoConfigDetail(opts.org, opts.repo)\n : opts.user\n ? await api.getUserConfigDetail(opts.org, opts.user)\n : null;\n if (!result) {\n console.error(\"Provide --user or --repo\");\n process.exit(1);\n }\n console.log(JSON.stringify(result, null, 2));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["formattedArgs","path","parts","os","path","pc","path","os","execFileSync","fs","os","path","CLAUDE_DIR","path","os","CLAUDE_SETTINGS_PATH","MARKETPLACE_DIR","readJsonFile","fs","writeJsonFile","execFileSync","execSync","execSync","http","fs","http","data","config","readTokens","fs","fs","config","config"]}