@fml-inc/panopticon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +5 -0
  3. package/README.md +363 -0
  4. package/bin/hook-handler +3 -0
  5. package/bin/mcp-server +3 -0
  6. package/bin/panopticon +3 -0
  7. package/bin/proxy +3 -0
  8. package/bin/server +3 -0
  9. package/dist/api/client.d.ts +67 -0
  10. package/dist/api/client.js +48 -0
  11. package/dist/api/client.js.map +1 -0
  12. package/dist/chunk-3BUJ7URA.js +387 -0
  13. package/dist/chunk-3BUJ7URA.js.map +1 -0
  14. package/dist/chunk-3TZAKV3M.js +158 -0
  15. package/dist/chunk-3TZAKV3M.js.map +1 -0
  16. package/dist/chunk-4SM2H22C.js +169 -0
  17. package/dist/chunk-4SM2H22C.js.map +1 -0
  18. package/dist/chunk-7Q3BJMLG.js +62 -0
  19. package/dist/chunk-7Q3BJMLG.js.map +1 -0
  20. package/dist/chunk-BVOE7A2Z.js +412 -0
  21. package/dist/chunk-BVOE7A2Z.js.map +1 -0
  22. package/dist/chunk-CF4GPWLI.js +170 -0
  23. package/dist/chunk-CF4GPWLI.js.map +1 -0
  24. package/dist/chunk-DZ5HJFB4.js +467 -0
  25. package/dist/chunk-DZ5HJFB4.js.map +1 -0
  26. package/dist/chunk-HQCY722C.js +428 -0
  27. package/dist/chunk-HQCY722C.js.map +1 -0
  28. package/dist/chunk-HRCEIYKU.js +134 -0
  29. package/dist/chunk-HRCEIYKU.js.map +1 -0
  30. package/dist/chunk-K7YUPLES.js +76 -0
  31. package/dist/chunk-K7YUPLES.js.map +1 -0
  32. package/dist/chunk-L7G27XWF.js +130 -0
  33. package/dist/chunk-L7G27XWF.js.map +1 -0
  34. package/dist/chunk-LWXF7YRG.js +626 -0
  35. package/dist/chunk-LWXF7YRG.js.map +1 -0
  36. package/dist/chunk-NXH7AONS.js +1120 -0
  37. package/dist/chunk-NXH7AONS.js.map +1 -0
  38. package/dist/chunk-QK5442ZP.js +55 -0
  39. package/dist/chunk-QK5442ZP.js.map +1 -0
  40. package/dist/chunk-QVK6VGCV.js +1703 -0
  41. package/dist/chunk-QVK6VGCV.js.map +1 -0
  42. package/dist/chunk-RX2RXHBH.js +1699 -0
  43. package/dist/chunk-RX2RXHBH.js.map +1 -0
  44. package/dist/chunk-SEXU2WYG.js +788 -0
  45. package/dist/chunk-SEXU2WYG.js.map +1 -0
  46. package/dist/chunk-SUGSQ4YI.js +264 -0
  47. package/dist/chunk-SUGSQ4YI.js.map +1 -0
  48. package/dist/chunk-TGXFVAID.js +138 -0
  49. package/dist/chunk-TGXFVAID.js.map +1 -0
  50. package/dist/chunk-WLBNFVIG.js +447 -0
  51. package/dist/chunk-WLBNFVIG.js.map +1 -0
  52. package/dist/chunk-XLTCUH5A.js +1072 -0
  53. package/dist/chunk-XLTCUH5A.js.map +1 -0
  54. package/dist/chunk-YVRWVDIA.js +146 -0
  55. package/dist/chunk-YVRWVDIA.js.map +1 -0
  56. package/dist/chunk-ZEC4LRKS.js +176 -0
  57. package/dist/chunk-ZEC4LRKS.js.map +1 -0
  58. package/dist/cli.d.ts +1 -0
  59. package/dist/cli.js +1084 -0
  60. package/dist/cli.js.map +1 -0
  61. package/dist/config-NwoZC-GM.d.ts +20 -0
  62. package/dist/db.d.ts +46 -0
  63. package/dist/db.js +15 -0
  64. package/dist/db.js.map +1 -0
  65. package/dist/doctor.d.ts +37 -0
  66. package/dist/doctor.js +14 -0
  67. package/dist/doctor.js.map +1 -0
  68. package/dist/hooks/handler.d.ts +23 -0
  69. package/dist/hooks/handler.js +295 -0
  70. package/dist/hooks/handler.js.map +1 -0
  71. package/dist/index.d.ts +57 -0
  72. package/dist/index.js +101 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/mcp/server.d.ts +1 -0
  75. package/dist/mcp/server.js +243 -0
  76. package/dist/mcp/server.js.map +1 -0
  77. package/dist/otlp/server.d.ts +7 -0
  78. package/dist/otlp/server.js +17 -0
  79. package/dist/otlp/server.js.map +1 -0
  80. package/dist/permissions.d.ts +33 -0
  81. package/dist/permissions.js +14 -0
  82. package/dist/permissions.js.map +1 -0
  83. package/dist/pricing.d.ts +29 -0
  84. package/dist/pricing.js +13 -0
  85. package/dist/pricing.js.map +1 -0
  86. package/dist/proxy/server.d.ts +10 -0
  87. package/dist/proxy/server.js +20 -0
  88. package/dist/proxy/server.js.map +1 -0
  89. package/dist/prune.d.ts +18 -0
  90. package/dist/prune.js +13 -0
  91. package/dist/prune.js.map +1 -0
  92. package/dist/query.d.ts +56 -0
  93. package/dist/query.js +27 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/reparse-636YZCE3.js +14 -0
  96. package/dist/reparse-636YZCE3.js.map +1 -0
  97. package/dist/repo.d.ts +17 -0
  98. package/dist/repo.js +9 -0
  99. package/dist/repo.js.map +1 -0
  100. package/dist/scanner.d.ts +73 -0
  101. package/dist/scanner.js +15 -0
  102. package/dist/scanner.js.map +1 -0
  103. package/dist/sdk.d.ts +82 -0
  104. package/dist/sdk.js +208 -0
  105. package/dist/sdk.js.map +1 -0
  106. package/dist/server.d.ts +5 -0
  107. package/dist/server.js +25 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/setup.d.ts +35 -0
  110. package/dist/setup.js +19 -0
  111. package/dist/setup.js.map +1 -0
  112. package/dist/sync/index.d.ts +29 -0
  113. package/dist/sync/index.js +32 -0
  114. package/dist/sync/index.js.map +1 -0
  115. package/dist/targets.d.ts +279 -0
  116. package/dist/targets.js +20 -0
  117. package/dist/targets.js.map +1 -0
  118. package/dist/types-D-MYCBol.d.ts +128 -0
  119. package/dist/types.d.ts +164 -0
  120. package/dist/types.js +1 -0
  121. package/dist/types.js.map +1 -0
  122. package/hooks/hooks.json +274 -0
  123. package/package.json +124 -0
  124. package/skills/panopticon-optimize/SKILL.md +222 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/targets/registry.ts","../src/targets/claude.ts","../src/scanner/categories.ts","../src/scanner/reader.ts","../src/targets/gemini.ts","../src/targets/codex.ts"],"sourcesContent":["import type { TargetAdapter } from \"./types.js\";\n\nconst targets = new Map<string, TargetAdapter>();\n\nexport function registerTarget(adapter: TargetAdapter): void {\n if (targets.has(adapter.id)) {\n throw new Error(`Target \"${adapter.id}\" is already registered`);\n }\n targets.set(adapter.id, adapter);\n}\n\nexport function getTarget(id: string): TargetAdapter | undefined {\n return targets.get(id);\n}\n\nexport function getTargetOrThrow(id: string): TargetAdapter {\n const v = targets.get(id);\n if (!v) {\n throw new Error(\n `Unknown target: \"${id}\". Known: ${[...targets.keys()].join(\", \")}`,\n );\n }\n return v;\n}\n\nexport function allTargets(): TargetAdapter[] {\n return [...targets.values()];\n}\n\nexport function targetIds(): string[] {\n return [...targets.keys()];\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { config } from \"../config.js\";\nimport { defaultToolCategory } from \"../scanner/categories.js\";\nimport { readNewLines } from \"../scanner/reader.js\";\nimport { registerTarget } from \"./registry.js\";\nimport type { ParsedToolCall, ParseResult, TargetAdapter } from \"./types.js\";\n\nconst CLAUDE_TOOL_CATEGORIES: Record<string, string> = {\n Read: \"Read\",\n read_file: \"Read\",\n ReadNotebook: \"Read\",\n Edit: \"Edit\",\n StrReplace: \"Edit\",\n MultiEdit: \"Edit\",\n Write: \"Write\",\n create_file: \"Write\",\n NotebookEdit: \"Write\",\n Bash: \"Bash\",\n Grep: \"Grep\",\n Glob: \"Glob\",\n list_dir: \"Glob\",\n Task: \"Task\",\n Agent: \"Task\",\n TaskCreate: \"Task\",\n TaskUpdate: \"Task\",\n Skill: \"Tool\",\n WebSearch: \"Web\",\n WebFetch: \"Web\",\n ToolSearch: \"Web\",\n};\n\nfunction claudeToolCategory(toolName: string): string {\n const mapped = CLAUDE_TOOL_CATEGORIES[toolName];\n if (mapped) return mapped;\n if (toolName.startsWith(\"mcp__\")) return \"MCP\";\n if (toolName.toLowerCase().includes(\"subagent\")) return \"Task\";\n return defaultToolCategory(toolName);\n}\n\n// ── System message detection & command envelope handling ────────────────────\n\n/** Patterns for system-injected user messages that should be marked isSystem. */\nconst SYSTEM_MESSAGE_PREFIXES = [\n \"This session is being continued\",\n \"[Request interrupted\",\n \"<task-notification>\",\n \"<local-command-\",\n \"Stop hook feedback:\",\n];\n\n/** Check if content matches a known system-injected pattern. */\nfunction isSystemMessage(content: string): boolean {\n const trimmed = content.trimStart();\n return SYSTEM_MESSAGE_PREFIXES.some((p) => trimmed.startsWith(p));\n}\n\nconst CMD_NAME_RE = /<command-name>([^<]+)<\\/command-name>/;\nconst CMD_ARGS_RE = /<command-args>([^<]*)<\\/command-args>/;\nconst CMD_MSG_RE = /<command-message>([^<]+)<\\/command-message>/;\nconst CMD_STRIP_RE =\n /<\\/?(?:command-name|command-message|command-args)>[^<]*<\\/(?:command-name|command-message|command-args)>|<\\/?(?:command-name|command-message|command-args)>/g;\n\n/**\n * Detect command/skill XML envelopes and convert to readable form.\n * Returns [convertedText, true] if it was a command envelope,\n * or [originalText, false] if not.\n */\nfunction extractCommandText(content: string): [string, boolean] {\n // Strip BOM and leading whitespace for matching\n const trimmed = content.replace(/^\\uFEFF/, \"\").trimStart();\n if (\n !trimmed.startsWith(\"<command-message>\") &&\n !trimmed.startsWith(\"<command-name>\")\n ) {\n return [content, false];\n }\n // Verify it's purely command XML (no trailing prose)\n const stripped = trimmed.replace(CMD_STRIP_RE, \"\");\n if (stripped.trim() !== \"\") {\n return [content, false];\n }\n\n const nameMatch = CMD_NAME_RE.exec(content);\n if (!nameMatch) {\n // Bare <command-message> without <command-name>\n const msgMatch = CMD_MSG_RE.exec(content);\n if (msgMatch) return [`/${msgMatch[1]}`, true];\n return [content, false];\n }\n\n let name = nameMatch[1];\n if (!name.startsWith(\"/\")) name = `/${name}`;\n const argsMatch = CMD_ARGS_RE.exec(content);\n const args = argsMatch?.[1]?.trim();\n return [args ? `${name} ${args}` : name, true];\n}\n\n/** Extract total text length from a tool_result content field. */\nfunction extractToolResultTextLength(content: unknown): number {\n if (typeof content === \"string\") return content.length;\n if (Array.isArray(content)) {\n let len = 0;\n for (const b of content) {\n if (\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\"\n ) {\n const text = (b as Record<string, unknown>).text;\n if (typeof text === \"string\") len += text.length;\n }\n }\n return len;\n }\n return 0;\n}\n\n// ── DAG fork detection ─────────────────────────────────────────────────────\n// Adapted from agentsview's parseDAG/walkBranch (internal/parser/claude.go).\n// Detects uuid/parentUuid branching in JSONL files and separates large-gap\n// forks (>FORK_THRESHOLD user turns on first child) into separate sessions.\n\ninterface DagEntry {\n uuid: string;\n parentUuid: string;\n type: \"user\" | \"assistant\";\n lineIndex: number;\n timestampMs: number;\n}\n\nconst FORK_THRESHOLD = 3;\n\n/** True if entries don't form a simple linear chain. */\nfunction hasDAGFork(entries: DagEntry[]): boolean {\n for (let i = 1; i < entries.length; i++) {\n if (entries[i].parentUuid !== entries[i - 1].uuid) return true;\n }\n return false;\n}\n\ninterface ForkBranch {\n parentId: string;\n dagIndices: number[];\n}\n\n/**\n * Walk the DAG from root, detecting large-gap forks.\n * Returns which dag entry indices belong to the main path vs fork branches.\n */\nfunction detectForks(\n entries: DagEntry[],\n sessionId: string,\n): { mainDagIndices: number[]; forkBranches: ForkBranch[] } {\n const children = new Map<string, number[]>();\n const roots: number[] = [];\n const uuidSet = new Set<string>();\n\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n uuidSet.add(e.uuid);\n if (!e.parentUuid) {\n roots.push(i);\n } else {\n const kids = children.get(e.parentUuid) ?? [];\n kids.push(i);\n children.set(e.parentUuid, kids);\n }\n }\n\n // Need exactly one root; all parentUuids must reference known uuids\n if (roots.length !== 1) {\n return { mainDagIndices: entries.map((_, i) => i), forkBranches: [] };\n }\n for (const e of entries) {\n if (e.parentUuid && !uuidSet.has(e.parentUuid)) {\n return { mainDagIndices: entries.map((_, i) => i), forkBranches: [] };\n }\n }\n\n const forkBranches: ForkBranch[] = [];\n\n /** Count ALL user entries reachable from startIdx (full subtree DFS). */\n function countUserTurns(startIdx: number): number {\n const stack = [startIdx];\n let count = 0;\n while (stack.length > 0) {\n const idx = stack.pop()!;\n if (entries[idx].type === \"user\") count++;\n for (const k of children.get(entries[idx].uuid) ?? []) stack.push(k);\n }\n return count;\n }\n\n function walkBranch(startIdx: number, ownerId: string): number[] {\n const pathIndices: number[] = [];\n let current: number | null = startIdx;\n\n while (current !== null) {\n pathIndices.push(current);\n const kids: number[] = children.get(entries[current].uuid) ?? [];\n\n if (kids.length === 0) {\n current = null;\n } else if (kids.length === 1) {\n current = kids[0];\n } else {\n // Fork point — check first child's subtree user turn count\n const firstChildTurns = countUserTurns(kids[0]);\n if (firstChildTurns <= FORK_THRESHOLD) {\n // Small-gap retry: follow latest child (last), skip earlier\n current = kids[kids.length - 1];\n } else {\n // Large-gap fork: follow first child on main path,\n // collect other children as separate fork branches\n for (let k = 1; k < kids.length; k++) {\n const branchIndices = walkBranch(kids[k], ownerId);\n forkBranches.push({\n parentId: ownerId,\n dagIndices: branchIndices,\n });\n }\n current = kids[0];\n }\n }\n }\n return pathIndices;\n }\n\n const mainDagIndices = walkBranch(roots[0], sessionId);\n return { mainDagIndices, forkBranches };\n}\n\n/** Claude Code session files use standard UUIDs as filenames. */\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nconst CLAUDE_DIR = path.join(os.homedir(), \".claude\");\n\nconst claude: TargetAdapter = {\n id: \"claude\",\n\n config: {\n dir: CLAUDE_DIR,\n configPath: path.join(CLAUDE_DIR, \"settings.json\"),\n configFormat: \"json\",\n },\n\n hooks: {\n // Claude Code uses plugin marketplace, not direct hook registration.\n // Marketplace setup is handled separately in the install command;\n // this method handles the settings.json portion only.\n events: [],\n applyInstallConfig(existing, _opts) {\n const settings = { ...existing };\n settings.extraKnownMarketplaces =\n (settings.extraKnownMarketplaces as Record<string, unknown>) ?? {};\n (settings.extraKnownMarketplaces as Record<string, unknown>)[\n \"local-plugins\"\n ] = {\n source: { source: \"directory\", path: config.marketplaceDir },\n };\n settings.enabledPlugins =\n (settings.enabledPlugins as Record<string, unknown>) ?? {};\n (settings.enabledPlugins as Record<string, unknown>)[\n \"panopticon@local-plugins\"\n ] = true;\n\n // Clean up stale hooks from older panopticon/fml installs that wrote\n // hook entries directly into settings.json. The plugin system now\n // handles hooks via hooks.json, so these are redundant and break when\n // package paths change.\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (hooks) {\n for (const event of Object.keys(hooks)) {\n const entries = hooks[event];\n if (!Array.isArray(entries)) continue;\n hooks[event] = entries.filter(\n (h) =>\n !(\n typeof h === \"object\" &&\n h !== null &&\n JSON.stringify(h).includes(\"hook-handler\")\n ),\n );\n if ((hooks[event] as unknown[]).length === 0) delete hooks[event];\n }\n if (Object.keys(hooks).length === 0) delete settings.hooks;\n }\n\n return settings;\n },\n removeInstallConfig(existing) {\n const settings = { ...existing };\n const marketplaces = settings.extraKnownMarketplaces as\n | Record<string, unknown>\n | undefined;\n if (marketplaces) {\n delete marketplaces[\"local-plugins\"];\n if (Object.keys(marketplaces).length === 0)\n delete settings.extraKnownMarketplaces;\n }\n const plugins = settings.enabledPlugins as\n | Record<string, unknown>\n | undefined;\n if (plugins) {\n delete plugins[\"panopticon@local-plugins\"];\n delete plugins[\"fml@local-plugins\"];\n if (Object.keys(plugins).length === 0) delete settings.enabledPlugins;\n }\n return settings;\n },\n },\n\n shellEnv: {\n envVars(port, proxy) {\n const vars: Array<[string, string]> = [\n [\"CLAUDE_CODE_ENABLE_TELEMETRY\", \"1\"],\n ];\n if (proxy) {\n vars.push([\n \"ANTHROPIC_BASE_URL\",\n `http://localhost:${port}/proxy/anthropic`,\n ]);\n }\n return vars;\n },\n },\n\n events: {\n // Claude Code already sends canonical event names\n eventMap: {},\n formatPermissionResponse({ allow, reason }) {\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: allow ? \"allow\" : \"deny\",\n permissionDecisionReason: reason,\n },\n };\n },\n },\n\n detect: {\n displayName: \"Claude Code\",\n isInstalled: () => fs.existsSync(CLAUDE_DIR),\n isConfigured() {\n try {\n const settings = JSON.parse(\n fs.readFileSync(path.join(CLAUDE_DIR, \"settings.json\"), \"utf-8\"),\n );\n const plugins = settings.enabledPlugins ?? {};\n return (\n !!plugins[\"panopticon@local-plugins\"] ||\n !!plugins[\"fml@local-plugins\"]\n );\n } catch {\n return false;\n }\n },\n },\n\n proxy: {\n upstreamHost: \"api.anthropic.com\",\n accumulatorType: \"anthropic\",\n },\n\n otel: {\n metrics: {\n metricNames: [\"claude_code.token.usage\"],\n aggregation: \"SUM\",\n tokenTypeAttrs: [\"$.type\"],\n modelAttrs: [\"$.model\"],\n },\n },\n\n ident: {\n modelPatterns: [/^claude-/],\n },\n\n scanner: {\n normalizeToolCategory: claudeToolCategory,\n discover() {\n const projectsDir = path.join(CLAUDE_DIR, \"projects\");\n const files: { filePath: string }[] = [];\n const safeReaddir = (d: string) => {\n try {\n return fs.readdirSync(d);\n } catch {\n return [];\n }\n };\n const safeIsDir = (d: string) => {\n try {\n return fs.statSync(d).isDirectory();\n } catch {\n return false;\n }\n };\n try {\n for (const slug of fs.readdirSync(projectsDir)) {\n const slugDir = path.join(projectsDir, slug);\n if (!safeIsDir(slugDir)) continue;\n for (const entry of fs.readdirSync(slugDir)) {\n const entryPath = path.join(slugDir, entry);\n if (entry.endsWith(\".jsonl\")) {\n files.push({ filePath: entryPath });\n }\n // Recurse into session UUID directories for subagent JSONL files\n // e.g. {slug}/{uuid}/subagents/agent-*.jsonl\n if (safeIsDir(entryPath)) {\n const subagentsDir = path.join(entryPath, \"subagents\");\n for (const sub of safeReaddir(subagentsDir)) {\n if (sub.endsWith(\".jsonl\")) {\n files.push({\n filePath: path.join(subagentsDir, sub),\n });\n }\n }\n }\n }\n }\n } catch {\n /* projects dir may not exist */\n }\n return files;\n },\n\n parseFile(filePath: string, fromByteOffset: number): ParseResult | null {\n const { lines, newByteOffset } = readNewLines(filePath, fromByteOffset);\n if (lines.length === 0) return null;\n\n // For continuation detection: extract UUID from file path\n // File pattern: ~/.claude/projects/{slug}/{uuid}.jsonl\n const fileUuid = path.basename(filePath, \".jsonl\");\n const isSubagentPath = filePath.includes(\"/subagents/\");\n\n let meta: ParseResult[\"meta\"];\n const turns: ParseResult[\"turns\"] = [];\n const events: ParseResult[\"events\"] = [];\n const messages: ParseResult[\"messages\"] = [];\n let turnIndex = 0;\n let ordinal = 0;\n let firstPrompt: string | undefined;\n // Map tool_use_id → subagent session ID (e.g. \"agent-abc123\")\n const subagentMap = new Map<string, string>();\n // Tool results from filtered-out messages (tool-result-only user entries)\n const orphanedToolResults = new Map<\n string,\n { contentLength: number; contentRaw: string; timestampMs?: number }\n >();\n\n // DAG tracking: collect uuid/parentUuid entries and map them to\n // message/turn indices for fork partitioning\n const dagEntries: DagEntry[] = [];\n // Per-message and per-turn: which line index produced it (-1 = no DAG)\n const msgLineIdx: number[] = [];\n const turnLineIdx: number[] = [];\n\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const line = lines[lineIdx];\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(line);\n } catch {\n continue;\n }\n\n const type = obj.type as string;\n const sessionId = obj.sessionId as string | undefined;\n const agentId = obj.agentId as string | undefined;\n const tsMs = obj.timestamp\n ? new Date(obj.timestamp as string).getTime()\n : Date.now();\n\n // Track uuid/parentUuid for DAG fork detection\n const uuid = obj.uuid as string | undefined;\n const parentUuid = obj.parentUuid as string | undefined;\n if (uuid && (type === \"user\" || type === \"assistant\")) {\n dagEntries.push({\n uuid,\n parentUuid: parentUuid ?? \"\",\n type,\n lineIndex: lineIdx,\n timestampMs: tsMs,\n });\n }\n\n if (!meta && sessionId) {\n const common = {\n cliVersion: obj.version as string | undefined,\n cwd: obj.cwd as string | undefined,\n startedAtMs: tsMs,\n };\n if (agentId) {\n // Subagent files have agentId set and sessionId is the parent's ID.\n // Use \"agent-{agentId}\" as the session ID (matches file naming).\n meta = {\n sessionId: `agent-${agentId}`,\n parentSessionId: sessionId,\n relationshipType: \"subagent\",\n ...common,\n };\n } else if (\n !isSubagentPath &&\n UUID_RE.test(fileUuid) &&\n sessionId !== fileUuid\n ) {\n // Continuation: file UUID differs from JSONL sessionId.\n // This file continues the original session under a new file\n // (e.g. claude --continue / --resume).\n meta = {\n sessionId: fileUuid,\n parentSessionId: sessionId,\n relationshipType: \"continuation\",\n ...common,\n };\n } else {\n meta = { sessionId, ...common };\n }\n }\n\n const sid = meta?.sessionId ?? sessionId ?? \"\";\n\n if (type === \"user\") {\n const msg = obj.message as Record<string, unknown> | undefined;\n const content = msg?.content;\n let preview: string | undefined;\n const textParts: string[] = [];\n const toolResults = new Map<\n string,\n { contentLength: number; contentRaw: string; timestampMs?: number }\n >();\n\n if (typeof content === \"string\") {\n preview = content.slice(0, 200);\n textParts.push(content);\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n if (b.type === \"text\" && typeof b.text === \"string\") {\n textParts.push(b.text);\n } else if (b.type === \"tool_result\") {\n const textLen = extractToolResultTextLength(b.content);\n // Store raw content as-is: string stays string, arrays/objects get serialized\n const raw =\n typeof b.content === \"string\"\n ? b.content\n : JSON.stringify(b.content ?? \"\");\n toolResults.set(b.tool_use_id as string, {\n contentLength: textLen,\n contentRaw: raw,\n timestampMs: tsMs,\n });\n }\n }\n if (textParts.length > 0) {\n preview = textParts[0].slice(0, 200);\n }\n }\n if (!firstPrompt && preview) firstPrompt = preview;\n\n let fullContent = textParts.join(\"\\n\");\n\n // Skip meta/compact messages\n const isMeta = obj.isMeta === true;\n const isCompact = obj.isCompactSummary === true;\n if (isMeta || isCompact) {\n // still push turn below, but skip message\n } else if (fullContent.length === 0 && toolResults.size > 0) {\n // Tool-result-only user message (no text content).\n // Don't create a message — collect results for backfill.\n for (const [id, result] of toolResults) {\n orphanedToolResults.set(id, result);\n }\n } else if (fullContent.length > 0) {\n // Convert command envelopes to readable form\n const [converted, wasCommand] = extractCommandText(fullContent);\n if (wasCommand) {\n fullContent = converted;\n }\n\n // Detect system-injected messages\n const isSystem = isSystemMessage(fullContent);\n\n messages.push({\n sessionId: sid,\n ordinal: ordinal++,\n role: \"user\",\n content: fullContent,\n timestampMs: tsMs,\n hasThinking: false,\n hasToolUse: false,\n isSystem,\n contentLength: fullContent.length,\n hasContextTokens: false,\n hasOutputTokens: false,\n uuid,\n parentUuid: parentUuid ?? undefined,\n toolCalls: [],\n toolResults,\n });\n msgLineIdx.push(lineIdx);\n }\n\n turns.push({\n sessionId: sid,\n turnIndex: turnIndex++,\n timestampMs: tsMs,\n role: \"user\",\n contentPreview: preview,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n reasoningTokens: 0,\n });\n turnLineIdx.push(lineIdx);\n }\n\n if (type === \"assistant\") {\n const msg = obj.message as Record<string, unknown> | undefined;\n const usage = msg?.usage as Record<string, unknown> | undefined;\n const model = msg?.model as string | undefined;\n if (meta && model && !meta.model) meta.model = model;\n\n // Build message content and tool calls from content blocks\n const textParts: string[] = [];\n let hasThinking = false;\n let hasToolUse = false;\n const toolCalls: ParsedToolCall[] = [];\n\n const content = msg?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n\n if (b.type === \"text\" && typeof b.text === \"string\") {\n textParts.push(b.text);\n }\n\n if (b.type === \"thinking\") {\n hasThinking = true;\n if (typeof b.thinking === \"string\") {\n textParts.push(`[Thinking]\\n${b.thinking}\\n[/Thinking]`);\n }\n\n events.push({\n sessionId: sid,\n eventType: \"thinking\",\n timestampMs: tsMs,\n content:\n typeof b.thinking === \"string\"\n ? b.thinking.slice(0, 2_000)\n : undefined,\n metadata: {\n has_signature: !!b.signature,\n },\n });\n }\n\n if (b.type === \"tool_use\") {\n hasToolUse = true;\n const toolName = (b.name as string) ?? \"\";\n const input = b.input as Record<string, unknown> | undefined;\n const inputJson = input ? JSON.stringify(input) : undefined;\n\n // Extract skill name for Skill tools\n let skillName: string | undefined;\n if (toolName === \"Skill\" && input) {\n skillName = (input.skill ?? input.name) as string | undefined;\n }\n\n toolCalls.push({\n toolUseId: (b.id as string) ?? \"\",\n toolName,\n category: claudeToolCategory(toolName),\n inputJson,\n skillName,\n timestampMs: tsMs,\n });\n\n events.push({\n sessionId: sid,\n eventType: \"tool_call\",\n timestampMs: tsMs,\n toolName,\n toolInput: inputJson?.slice(0, 10_000),\n metadata: { tool_use_id: b.id },\n });\n }\n }\n }\n\n const fullContent = textParts.join(\"\\n\");\n const inputTokens = (usage?.input_tokens as number) ?? 0;\n const outTokens = (usage?.output_tokens as number) ?? 0;\n const cacheRead = (usage?.cache_read_input_tokens as number) ?? 0;\n const cacheCreation =\n (usage?.cache_creation_input_tokens as number) ?? 0;\n const ctxTokens = inputTokens + cacheRead + cacheCreation;\n const hasCtx = inputTokens > 0 || cacheRead > 0 || cacheCreation > 0;\n\n messages.push({\n sessionId: sid,\n ordinal: ordinal++,\n role: \"assistant\",\n content: fullContent,\n timestampMs: tsMs,\n hasThinking,\n hasToolUse,\n isSystem: false,\n contentLength: fullContent.length,\n model,\n tokenUsage: usage ? JSON.stringify(usage) : undefined,\n contextTokens: hasCtx ? ctxTokens : undefined,\n outputTokens: outTokens > 0 ? outTokens : undefined,\n hasContextTokens: hasCtx,\n hasOutputTokens: outTokens > 0,\n uuid,\n parentUuid: parentUuid ?? undefined,\n toolCalls,\n toolResults: new Map(),\n });\n msgLineIdx.push(lineIdx);\n\n turns.push({\n sessionId: sid,\n turnIndex: turnIndex++,\n timestampMs: tsMs,\n model,\n role: \"assistant\",\n inputTokens,\n outputTokens: outTokens,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: cacheCreation,\n reasoningTokens: 0,\n });\n turnLineIdx.push(lineIdx);\n }\n\n // Extract content blocks from user messages (events only — message already built above)\n if (type === \"user\") {\n const msg = obj.message as Record<string, unknown> | undefined;\n const content = msg?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n\n if (b.type === \"tool_result\") {\n const resultContent = b.content;\n events.push({\n sessionId: sid,\n eventType: \"tool_result\",\n timestampMs: tsMs,\n toolOutput:\n typeof resultContent === \"string\"\n ? resultContent.slice(0, 500)\n : undefined,\n metadata: {\n tool_use_id: b.tool_use_id,\n is_error: b.is_error,\n },\n });\n }\n\n if (b.type === \"image\") {\n const src = b.source as Record<string, unknown> | undefined;\n events.push({\n sessionId: sid,\n eventType: \"image\",\n timestampMs: tsMs,\n metadata: {\n media_type: src?.media_type,\n source_type: src?.type,\n },\n });\n }\n }\n }\n }\n\n // System events\n if (type === \"system\") {\n const data = obj.data as Record<string, unknown> | undefined;\n const level = obj.level as string | undefined;\n const subtype = obj.subtype as string | undefined;\n\n if (data?.type === \"api_error\" || level === \"error\") {\n events.push({\n sessionId: sid,\n eventType: \"error\",\n timestampMs: tsMs,\n content:\n typeof data?.message === \"string\" ? data.message : undefined,\n metadata: {\n level,\n retryAttempt: data?.retryAttempt,\n maxRetries: data?.maxRetries,\n retryInMs: data?.retryInMs,\n },\n });\n } else if (\n subtype === \"stop_hook_summary\" ||\n level === \"suggestion\"\n ) {\n events.push({\n sessionId: sid,\n eventType: subtype ?? \"system\",\n timestampMs: tsMs,\n metadata: {\n subtype,\n level,\n hookCount: obj.hookCount,\n hookInfos: obj.hookInfos,\n stopReason: obj.stopReason,\n preventedContinuation: obj.preventedContinuation,\n },\n });\n }\n }\n\n // File history snapshots\n if (type === \"file-history-snapshot\") {\n const data = obj.data as Record<string, unknown> | undefined;\n const messageId = obj.messageId as string | undefined;\n events.push({\n sessionId: sid,\n eventType: \"file_snapshot\",\n timestampMs: tsMs,\n metadata: { messageId, ...(data ?? {}) },\n });\n }\n\n // Progress events\n if (type === \"progress\") {\n const data = obj.data as Record<string, unknown> | undefined;\n const hookEvent = data?.hookEvent as string | undefined;\n const progressType = data?.type as string | undefined;\n\n if (hookEvent || data?.durationMs) {\n // Hook-related progress (PreToolUse, PostToolUse, Stop, etc.)\n events.push({\n sessionId: sid,\n eventType: hookEvent ? `progress:${hookEvent}` : \"progress\",\n timestampMs: tsMs,\n toolName: (data?.hookName ?? data?.toolName) as\n | string\n | undefined,\n metadata: {\n hookEvent,\n durationMs: data?.durationMs,\n },\n });\n } else if (progressType === \"agent_progress\") {\n // Subagent activity — build tool_use_id → agent session mapping\n const tuid = (data?.parentToolUseID ?? obj.parentToolUseID) as\n | string\n | undefined;\n const agentId = (data?.agentId ?? obj.agentId) as\n | string\n | undefined;\n if (tuid && agentId) {\n subagentMap.set(tuid, `agent-${agentId}`);\n }\n events.push({\n sessionId: sid,\n eventType: \"agent_progress\",\n timestampMs: tsMs,\n metadata: {\n parentToolUseID: tuid,\n toolUseID: obj.toolUseID,\n },\n });\n }\n }\n\n // Queue operations (user prompt queue)\n if (type === \"queue-operation\") {\n const operation = obj.operation as string | undefined;\n // Extract subagent mapping from enqueue operations\n if (operation === \"enqueue\" && typeof obj.content === \"string\") {\n try {\n const qc = JSON.parse(obj.content) as Record<string, unknown>;\n const tuid = qc.tool_use_id as string | undefined;\n const taskId = qc.task_id as string | undefined;\n if (tuid && taskId) {\n subagentMap.set(tuid, `agent-${taskId}`);\n }\n } catch {\n // Try XML-style extraction as fallback\n const tuidMatch = obj.content.match(\n /<tool-use-id>([^<]+)<\\/tool-use-id>/,\n );\n const taskMatch = obj.content.match(\n /<task-id>([^<]+)<\\/task-id>/,\n );\n if (tuidMatch?.[1] && taskMatch?.[1]) {\n subagentMap.set(tuidMatch[1], `agent-${taskMatch[1]}`);\n }\n }\n }\n events.push({\n sessionId: sid,\n eventType: `queue:${operation ?? \"unknown\"}`,\n timestampMs: tsMs,\n content:\n typeof obj.content === \"string\"\n ? obj.content.slice(0, 500)\n : undefined,\n });\n }\n\n // Last prompt marker\n if (type === \"last-prompt\") {\n events.push({\n sessionId: sid,\n eventType: \"last_prompt\",\n timestampMs: tsMs,\n content:\n typeof obj.lastPrompt === \"string\"\n ? obj.lastPrompt.slice(0, 500)\n : undefined,\n });\n }\n }\n\n if (meta && firstPrompt && !meta.firstPrompt)\n meta.firstPrompt = firstPrompt;\n\n // Annotate tool calls with subagent session IDs\n if (subagentMap.size > 0) {\n for (const msg of messages) {\n for (const tc of msg.toolCalls) {\n const agentSid = subagentMap.get(tc.toolUseId);\n if (agentSid && (tc.category === \"Task\" || tc.toolName === \"Agent\"))\n tc.subagentSessionId = agentSid;\n }\n }\n }\n\n // DAG fork detection on incremental reads: if new lines contain a fork,\n // signal the caller to reset the watermark and reparse from byte 0.\n if (\n fromByteOffset > 0 &&\n dagEntries.length > 1 &&\n hasDAGFork(dagEntries)\n ) {\n return {\n meta,\n turns: [],\n events: [],\n messages: [],\n newByteOffset: fromByteOffset, // don't advance watermark\n needsFullReparse: true,\n };\n }\n\n // DAG fork detection on full file reads\n if (\n fromByteOffset === 0 &&\n meta &&\n dagEntries.length > 1 &&\n hasDAGFork(dagEntries)\n ) {\n const { mainDagIndices, forkBranches } = detectForks(\n dagEntries,\n meta.sessionId,\n );\n\n if (forkBranches.length > 0) {\n // Build line index sets for main path and each fork branch\n const mainLineSet = new Set(\n mainDagIndices.map((i) => dagEntries[i].lineIndex),\n );\n\n // Partition messages and turns by line index membership\n const mainMessages = messages.filter((_, i) =>\n mainLineSet.has(msgLineIdx[i]),\n );\n const mainTurns = turns.filter((_, i) =>\n mainLineSet.has(turnLineIdx[i]),\n );\n\n // Re-index ordinals and turn indices for main path\n for (let i = 0; i < mainMessages.length; i++) {\n mainMessages[i] = { ...mainMessages[i], ordinal: i };\n }\n for (let i = 0; i < mainTurns.length; i++) {\n mainTurns[i] = { ...mainTurns[i], turnIndex: i };\n }\n\n // Build fork ParseResults\n const forks: ParseResult[] = [];\n for (const branch of forkBranches) {\n const branchLineSet = new Set(\n branch.dagIndices.map((i) => dagEntries[i].lineIndex),\n );\n const forkUuid = dagEntries[branch.dagIndices[0]].uuid;\n const forkSessionId = `${meta.sessionId}-${forkUuid}`;\n const forkStartMs = dagEntries[branch.dagIndices[0]].timestampMs;\n\n const forkMessages = messages\n .filter((_, i) => branchLineSet.has(msgLineIdx[i]))\n .map((m, i) => ({\n ...m,\n sessionId: forkSessionId,\n ordinal: i,\n }));\n const forkTurns = turns\n .filter((_, i) => branchLineSet.has(turnLineIdx[i]))\n .map((t, i) => ({\n ...t,\n sessionId: forkSessionId,\n turnIndex: i,\n }));\n\n forks.push({\n meta: {\n sessionId: forkSessionId,\n parentSessionId: branch.parentId,\n relationshipType: \"fork\",\n model: meta.model,\n cwd: meta.cwd,\n cliVersion: meta.cliVersion,\n startedAtMs: forkStartMs,\n },\n turns: forkTurns,\n events: [], // events stay in main result\n messages: forkMessages,\n newByteOffset,\n });\n }\n\n return {\n meta,\n turns: mainTurns,\n events, // all events stay in main\n messages: mainMessages,\n newByteOffset,\n forks,\n orphanedToolResults:\n orphanedToolResults.size > 0 ? orphanedToolResults : undefined,\n };\n }\n }\n\n return {\n meta,\n turns,\n events,\n messages,\n newByteOffset,\n orphanedToolResults:\n orphanedToolResults.size > 0 ? orphanedToolResults : undefined,\n };\n },\n },\n};\n\nregisterTarget(claude);\n","/**\n * Default tool category fallback for unknown tool names.\n * Each target provides its own normalizeToolCategory with a full map;\n * this is the final fallback when no target-specific match is found.\n */\nexport function defaultToolCategory(_toolName: string): string {\n return \"\";\n}\n","import fs from \"node:fs\";\n\n/**\n * Read complete lines appended to a file since the given byte offset.\n * Incomplete trailing lines (no newline) are left for the next read.\n */\nexport function readNewLines(\n filePath: string,\n fromByteOffset: number,\n): { lines: string[]; newByteOffset: number } {\n let fd: number;\n try {\n fd = fs.openSync(filePath, \"r\");\n } catch {\n return { lines: [], newByteOffset: fromByteOffset };\n }\n\n try {\n const size = fs.fstatSync(fd).size;\n if (size <= fromByteOffset) {\n return { lines: [], newByteOffset: fromByteOffset };\n }\n\n const bytesToRead = size - fromByteOffset;\n const buf = Buffer.alloc(bytesToRead);\n fs.readSync(fd, buf, 0, bytesToRead, fromByteOffset);\n\n const text = buf.toString(\"utf-8\");\n const lastNewline = text.lastIndexOf(\"\\n\");\n if (lastNewline === -1) {\n // No complete line yet\n return { lines: [], newByteOffset: fromByteOffset };\n }\n\n const complete = text.slice(0, lastNewline);\n const lines = complete.split(\"\\n\").filter((l) => l.length > 0);\n const bytesConsumed = Buffer.byteLength(\n text.slice(0, lastNewline + 1),\n \"utf-8\",\n );\n\n return {\n lines,\n newByteOffset: fromByteOffset + bytesConsumed,\n };\n } finally {\n fs.closeSync(fd);\n }\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { HookInput } from \"../hooks/ingest.js\";\nimport { defaultToolCategory } from \"../scanner/categories.js\";\nimport { registerTarget } from \"./registry.js\";\nimport type { ParsedToolCall, ParseResult, TargetAdapter } from \"./types.js\";\n\nconst GEMINI_TOOL_CATEGORIES: Record<string, string> = {\n read_file: \"Read\",\n read_many_files: \"Read\",\n write_file: \"Write\",\n edit_file: \"Edit\",\n run_shell_command: \"Bash\",\n shell: \"Bash\",\n glob: \"Glob\",\n list_directory: \"Glob\",\n grep: \"Grep\",\n search_files: \"Grep\",\n web_search: \"Web\",\n};\n\nfunction geminiToolCategory(toolName: string): string {\n return GEMINI_TOOL_CATEGORIES[toolName] ?? defaultToolCategory(toolName);\n}\n\nconst GEMINI_DIR = path.join(os.homedir(), \".gemini\");\n\nconst gemini: TargetAdapter = {\n id: \"gemini\",\n\n config: {\n dir: GEMINI_DIR,\n configPath: path.join(GEMINI_DIR, \"settings.json\"),\n configFormat: \"json\",\n },\n\n hooks: {\n // Gemini's native event names\n events: [\"SessionStart\", \"BeforeModel\", \"BeforeTool\", \"AfterTool\"],\n applyInstallConfig(existing, opts) {\n const settings = { ...existing };\n const hookBin = path.join(opts.pluginRoot, \"bin\", \"hook-handler\");\n const mcpBin = path.join(opts.pluginRoot, \"bin\", \"mcp-server\");\n\n // Deep-copy hooks to avoid mutating the input\n const hooks = structuredClone(\n (settings.hooks as Record<string, unknown[]>) ?? {},\n );\n for (const event of this.events) {\n hooks[event] = hooks[event] || [];\n // Remove existing panopticon hooks (check both old and new format)\n hooks[event] = (hooks[event] as Array<Record<string, unknown>>)\n .map((group) => ({\n ...group,\n hooks: (\n (group.hooks as Array<Record<string, unknown>>) || []\n ).filter(\n (h) =>\n !(h.command as string)?.includes(\"panopticon\") &&\n !(h.path as string)?.includes(\"panopticon\"),\n ),\n }))\n .filter((group) => (group.hooks as unknown[]).length > 0);\n // Add panopticon hook\n (hooks[event] as unknown[]).push({\n hooks: [\n {\n type: \"command\",\n command: `node ${hookBin} gemini ${opts.port}${opts.proxy ? \" --proxy\" : \"\"}`,\n },\n ],\n });\n }\n settings.hooks = hooks;\n\n // Register MCP server\n settings.mcpServers =\n (settings.mcpServers as Record<string, unknown>) || {};\n (settings.mcpServers as Record<string, unknown>).panopticon = {\n command: \"node\",\n args: [mcpBin],\n };\n\n // Configure telemetry\n settings.telemetry =\n (settings.telemetry as Record<string, unknown>) || {};\n Object.assign(settings.telemetry as Record<string, unknown>, {\n enabled: true,\n target: \"local\",\n otlpProtocol: \"http\",\n otlpEndpoint: `http://localhost:${opts.port}`,\n });\n\n return settings;\n },\n removeInstallConfig(existing) {\n const settings = { ...existing };\n\n // Remove panopticon hooks from each event (check both old and new format)\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (hooks) {\n for (const event of Object.keys(hooks)) {\n hooks[event] = (hooks[event] as Array<Record<string, unknown>>)\n .map((group) => ({\n ...group,\n hooks: (\n (group.hooks as Array<Record<string, unknown>>) || []\n ).filter(\n (h) =>\n !(h.command as string)?.includes(\"panopticon\") &&\n !(h.path as string)?.includes(\"panopticon\"),\n ),\n }))\n .filter((group) => (group.hooks as unknown[]).length > 0);\n if ((hooks[event] as unknown[]).length === 0) delete hooks[event];\n }\n if (Object.keys(hooks).length === 0) delete settings.hooks;\n }\n\n // Remove hooksConfig if empty\n delete settings.hooksConfig;\n\n // Remove MCP server\n const servers = settings.mcpServers as\n | Record<string, unknown>\n | undefined;\n if (servers) {\n delete servers.panopticon;\n if (Object.keys(servers).length === 0) delete settings.mcpServers;\n }\n\n // Remove telemetry config\n delete settings.telemetry;\n\n return settings;\n },\n },\n\n shellEnv: {\n envVars(port) {\n return [\n [\"GEMINI_TELEMETRY_ENABLED\", \"true\"],\n [\"GEMINI_TELEMETRY_TARGET\", \"local\"],\n [\"GEMINI_TELEMETRY_USE_COLLECTOR\", \"true\"],\n [\"GEMINI_TELEMETRY_OTLP_ENDPOINT\", `http://localhost:${port}`],\n [\"GEMINI_TELEMETRY_OTLP_PROTOCOL\", \"http\"],\n [\"GEMINI_TELEMETRY_LOG_PROMPTS\", \"true\"],\n ];\n },\n },\n\n events: {\n eventMap: {\n BeforeTool: \"PreToolUse\",\n AfterTool: \"PostToolUse\",\n BeforeModel: \"UserPromptSubmit\",\n },\n\n normalizePayload(data: HookInput): HookInput {\n // Extract user_prompt from Gemini's llm_request.messages format\n const messages = (data as Record<string, unknown>).llm_request as\n | { messages?: Array<{ role: string; content: unknown }> }\n | undefined;\n if (messages?.messages && Array.isArray(messages.messages)) {\n const lastUser = [...messages.messages]\n .reverse()\n .find((m) => m.role === \"user\");\n if (lastUser?.content) {\n const text =\n typeof lastUser.content === \"string\"\n ? lastUser.content\n : Array.isArray(lastUser.content)\n ? (lastUser.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\")\n : \"\";\n if (text) {\n (data as Record<string, unknown>).user_prompt = text;\n }\n }\n }\n return data;\n },\n\n formatPermissionResponse({ allow, reason }) {\n return { decision: allow ? \"allow\" : \"deny\", reason };\n },\n },\n\n detect: {\n displayName: \"Gemini CLI\",\n isInstalled: () => fs.existsSync(GEMINI_DIR),\n isConfigured() {\n try {\n const settings = JSON.parse(\n fs.readFileSync(path.join(GEMINI_DIR, \"settings.json\"), \"utf-8\"),\n );\n return !!settings.telemetry?.enabled;\n } catch {\n return false;\n }\n },\n },\n\n proxy: {\n upstreamHost: \"generativelanguage.googleapis.com\",\n accumulatorType: \"openai\",\n },\n\n otel: {\n serviceName: \"gemini-cli\",\n metrics: {\n metricNames: [\"gemini_cli.token.usage\", \"gen_ai.client.token.usage\"],\n aggregation: \"MAX\",\n tokenTypeAttrs: ['$.\"gen_ai.token.type\"'],\n modelAttrs: ['$.\"gen_ai.response.model\"'],\n },\n },\n\n scanner: {\n normalizeToolCategory: geminiToolCategory,\n discover() {\n const tmpDir = path.join(GEMINI_DIR, \"tmp\");\n const files: { filePath: string }[] = [];\n const safeReaddir = (d: string) => {\n try {\n return fs.readdirSync(d);\n } catch {\n return [];\n }\n };\n for (const project of safeReaddir(tmpDir)) {\n const chatsDir = path.join(tmpDir, project, \"chats\");\n for (const entry of safeReaddir(chatsDir)) {\n if (entry.startsWith(\"session-\") && entry.endsWith(\".json\"))\n files.push({ filePath: path.join(chatsDir, entry) });\n }\n }\n return files;\n },\n\n parseFile(filePath: string, fromByteOffset: number): ParseResult | null {\n let size: number;\n try {\n size = fs.statSync(filePath).size;\n } catch {\n return null;\n }\n if (size <= fromByteOffset) return null;\n\n // Gemini writes a single JSON object, re-read fully when changed.\n let session: Record<string, unknown>;\n try {\n session = JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n\n const sessionId = session.sessionId as string | undefined;\n if (!sessionId) return null;\n\n const messages = session.messages as\n | Array<Record<string, unknown>>\n | undefined;\n if (!messages?.length) return null;\n\n const meta: ParseResult[\"meta\"] = {\n sessionId,\n startedAtMs: session.startTime\n ? new Date(session.startTime as string).getTime()\n : undefined,\n };\n\n const turns: ParseResult[\"turns\"] = [];\n const events: ParseResult[\"events\"] = [];\n const parsedMessages: ParseResult[\"messages\"] = [];\n let turnIndex = 0;\n let ordinal = 0;\n let firstPrompt: string | undefined;\n\n for (const msg of messages) {\n const type = msg.type as string;\n const timestamp = msg.timestamp as string | undefined;\n const timestampMs = timestamp\n ? new Date(timestamp).getTime()\n : Date.now();\n\n if (type === \"user\") {\n const content = msg.content as Array<{ text?: string }> | undefined;\n const textParts: string[] = [];\n if (content) {\n for (const block of content) {\n if (block.text) textParts.push(block.text);\n }\n }\n const fullContent = textParts.join(\"\\n\");\n const preview = textParts[0]?.slice(0, 200);\n if (!firstPrompt && preview) firstPrompt = preview;\n\n turns.push({\n sessionId,\n turnIndex: turnIndex++,\n timestampMs,\n role: \"user\",\n contentPreview: preview,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n reasoningTokens: 0,\n });\n\n if (fullContent.length > 0) {\n parsedMessages.push({\n sessionId,\n ordinal: ordinal++,\n role: \"user\",\n content: fullContent,\n timestampMs,\n hasThinking: false,\n hasToolUse: false,\n isSystem: false,\n contentLength: fullContent.length,\n hasContextTokens: false,\n hasOutputTokens: false,\n toolCalls: [],\n toolResults: new Map(),\n });\n }\n }\n\n if (type === \"gemini\") {\n const model = msg.model as string | undefined;\n const tokens = msg.tokens as Record<string, number> | undefined;\n if (model && !meta.model) meta.model = model;\n\n const inputTokens = tokens?.input ?? 0;\n const outTokens = tokens?.output ?? 0;\n const cacheRead = tokens?.cached ?? 0;\n const reasoning = tokens?.thoughts ?? 0;\n\n turns.push({\n sessionId,\n turnIndex: turnIndex++,\n timestampMs,\n model,\n role: \"assistant\",\n contentPreview:\n typeof msg.content === \"string\"\n ? msg.content.slice(0, 200)\n : undefined,\n inputTokens,\n outputTokens: outTokens,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: 0,\n reasoningTokens: reasoning,\n });\n\n // Build message content\n const textParts: string[] = [];\n if (typeof msg.content === \"string\") textParts.push(msg.content);\n\n // Tool calls\n const msgToolCalls = msg.toolCalls as\n | Array<Record<string, unknown>>\n | undefined;\n const toolCalls: ParsedToolCall[] = [];\n const toolResults = new Map<\n string,\n { contentLength: number; contentRaw: string }\n >();\n\n if (msgToolCalls) {\n for (let tcIdx = 0; tcIdx < msgToolCalls.length; tcIdx++) {\n const tc = msgToolCalls[tcIdx];\n const toolName = ((tc.name ?? tc.displayName) as string) ?? \"\";\n const inputJson = tc.args ? JSON.stringify(tc.args) : undefined;\n const toolUseId =\n (tc.id as string) || `${toolName}-${timestampMs}-${tcIdx}`;\n\n toolCalls.push({\n toolUseId,\n toolName,\n category: geminiToolCategory(toolName),\n inputJson,\n });\n\n const result = tc.result as\n | Array<Record<string, unknown>>\n | undefined;\n const fnResponse = result?.[0]?.functionResponse as\n | Record<string, unknown>\n | undefined;\n const responseObj = fnResponse?.response as\n | Record<string, unknown>\n | undefined;\n const output =\n typeof responseObj?.output === \"string\"\n ? responseObj.output\n : fnResponse\n ? JSON.stringify(fnResponse)\n : undefined;\n if (output) {\n toolResults.set(toolUseId, {\n contentLength: output.length,\n contentRaw: output,\n });\n }\n\n events.push({\n sessionId,\n eventType: \"tool_call\",\n timestampMs,\n toolName,\n toolInput: inputJson?.slice(0, 1000),\n toolOutput: output?.slice(0, 1000),\n });\n }\n }\n\n // Thoughts/reasoning\n let hasThinking = false;\n const thoughts = msg.thoughts as\n | Array<Record<string, unknown>>\n | undefined;\n if (thoughts) {\n hasThinking = true;\n for (const t of thoughts) {\n const text = (t.description ?? t.subject) as string | undefined;\n if (text) textParts.push(`[Thinking]\\n${text}\\n[/Thinking]`);\n events.push({\n sessionId,\n eventType: \"reasoning\",\n timestampMs,\n content: text?.slice(0, 500),\n });\n }\n }\n\n const fullContent = textParts.join(\"\\n\");\n const ctxTokens = inputTokens + cacheRead;\n const hasCtx = inputTokens > 0 || cacheRead > 0;\n\n parsedMessages.push({\n sessionId,\n ordinal: ordinal++,\n role: \"assistant\",\n content: fullContent,\n timestampMs,\n hasThinking,\n hasToolUse: toolCalls.length > 0,\n isSystem: false,\n contentLength: fullContent.length,\n model,\n tokenUsage: tokens ? JSON.stringify(tokens) : undefined,\n contextTokens: hasCtx ? ctxTokens : undefined,\n outputTokens: outTokens > 0 ? outTokens : undefined,\n hasContextTokens: hasCtx,\n hasOutputTokens: outTokens > 0,\n toolCalls,\n toolResults,\n });\n }\n\n if (type === \"info\") {\n events.push({\n sessionId,\n eventType: \"info\",\n timestampMs,\n content:\n typeof msg.content === \"string\"\n ? msg.content.slice(0, 500)\n : undefined,\n });\n }\n }\n\n if (firstPrompt) meta.firstPrompt = firstPrompt;\n return {\n meta,\n turns,\n events,\n messages: parsedMessages,\n newByteOffset: size,\n absoluteIndices: true,\n };\n },\n },\n};\n\nregisterTarget(gemini);\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { defaultToolCategory } from \"../scanner/categories.js\";\nimport { readNewLines } from \"../scanner/reader.js\";\nimport { registerTarget } from \"./registry.js\";\nimport type { ParsedToolCall, ParseResult, TargetAdapter } from \"./types.js\";\n\nconst CODEX_TOOL_CATEGORIES: Record<string, string> = {\n shell_command: \"Bash\",\n shell: \"Bash\",\n exec_command: \"Bash\",\n write_stdin: \"Bash\",\n run_command: \"Bash\",\n read_file: \"Read\",\n write_file: \"Write\",\n create_file: \"Write\",\n edit_file: \"Edit\",\n list_dir: \"Glob\",\n grep_search: \"Grep\",\n finder: \"Grep\",\n spawn_agent: \"Task\",\n};\n\nfunction codexToolCategory(toolName: string): string {\n return CODEX_TOOL_CATEGORIES[toolName] ?? defaultToolCategory(toolName);\n}\n\nconst CODEX_SYSTEM_PREFIXES = [\n \"# AGENTS.md\",\n \"<environment_context>\",\n \"<INSTRUCTIONS>\",\n \"<subagent_notification>\",\n];\n\nfunction isCodexSystemMessage(content: string): boolean {\n return CODEX_SYSTEM_PREFIXES.some((p) => content.startsWith(p));\n}\n\nconst CODEX_DIR = path.join(os.homedir(), \".codex\");\nconst CODEX_HOOKS_JSON = path.join(CODEX_DIR, \"hooks.json\");\n\n// PascalCase event names matching the Codex hooks engine schema\nconst HOOK_EVENTS = [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"Stop\",\n];\n\nfunction readHooksJson(): Record<string, unknown> {\n try {\n return JSON.parse(fs.readFileSync(CODEX_HOOKS_JSON, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeHooksJson(data: Record<string, unknown>): void {\n fs.mkdirSync(CODEX_DIR, { recursive: true });\n fs.writeFileSync(CODEX_HOOKS_JSON, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nconst codex: TargetAdapter = {\n id: \"codex\",\n\n config: {\n dir: CODEX_DIR,\n configPath: path.join(CODEX_DIR, \"config.toml\"),\n configFormat: \"toml\",\n },\n\n hooks: {\n events: HOOK_EVENTS,\n applyInstallConfig(existing, opts) {\n const codexConfig = { ...existing };\n const hookBin = path.join(opts.pluginRoot, \"bin\", \"hook-handler\");\n const mcpBin = path.join(opts.pluginRoot, \"bin\", \"mcp-server\");\n\n // Enable the codex_hooks feature flag\n codexConfig.features =\n (codexConfig.features as Record<string, unknown>) ?? {};\n (codexConfig.features as Record<string, unknown>).codex_hooks = true;\n // Codex reads this at top level, not under [features]\n codexConfig.suppress_unstable_features_warning = true;\n\n // Remove any legacy TOML hook entries\n delete codexConfig.hooks;\n\n // Write hooks.json (the format the new hooks engine expects)\n const hooksFile = readHooksJson();\n const hooks = (hooksFile.hooks as Record<string, unknown[]>) ?? {};\n const proxyFlag = opts.proxy ? \" --proxy\" : \"\";\n const command = `node ${hookBin} codex ${opts.port}${proxyFlag}`;\n for (const event of HOOK_EVENTS) {\n const groups = (hooks[event] ?? []) as Array<Record<string, unknown>>;\n // Remove existing panopticon groups\n hooks[event] = groups.filter((g) => {\n const h = ((g.hooks as unknown[]) ?? []) as Array<\n Record<string, unknown>\n >;\n return !h.some((entry) =>\n (entry.command as string)?.includes(\"panopticon\"),\n );\n });\n // Add panopticon hook group\n (hooks[event] as unknown[]).push({\n hooks: [{ type: \"command\", command, timeout: 10 }],\n });\n }\n hooksFile.hooks = hooks;\n writeHooksJson(hooksFile);\n\n // Configure API proxy (opt-in via --proxy)\n if (opts.proxy) {\n codexConfig.openai_base_url = `http://localhost:${opts.port}/proxy/codex`;\n } else {\n delete codexConfig.openai_base_url;\n }\n\n // Configure OTel telemetry\n delete codexConfig.telemetry; // Remove legacy format\n const endpoint = `http://localhost:${opts.port}`;\n const exporterConfig = { endpoint, protocol: \"binary\" };\n codexConfig.otel = {\n ...((codexConfig.otel as Record<string, unknown>) ?? {}),\n log_user_prompt: true,\n exporter: { \"otlp-http\": exporterConfig },\n trace_exporter: { \"otlp-http\": exporterConfig },\n metrics_exporter: { \"otlp-http\": exporterConfig },\n };\n\n // Register MCP server\n const mcpServers = (codexConfig.mcp_servers ?? {}) as Record<\n string,\n unknown\n >;\n mcpServers.panopticon = { command: \"node\", args: [mcpBin] };\n codexConfig.mcp_servers = mcpServers;\n\n return codexConfig;\n },\n removeInstallConfig(existing) {\n const cfg = { ...existing };\n\n // Remove feature flags\n const features = cfg.features as Record<string, unknown> | undefined;\n if (features) {\n delete features.codex_hooks;\n if (Object.keys(features).length === 0) delete cfg.features;\n }\n delete cfg.suppress_unstable_features_warning;\n\n // Remove any legacy TOML hook entries\n delete cfg.hooks;\n\n // Remove panopticon hooks from hooks.json\n const hooksFile = readHooksJson();\n const hooks = hooksFile.hooks as Record<string, unknown[]> | undefined;\n if (hooks) {\n for (const event of Object.keys(hooks)) {\n hooks[event] = (\n hooks[event] as Array<Record<string, unknown>>\n ).filter((g) => {\n const h = ((g.hooks as unknown[]) ?? []) as Array<\n Record<string, unknown>\n >;\n return !h.some((entry) =>\n (entry.command as string)?.includes(\"panopticon\"),\n );\n });\n if ((hooks[event] as unknown[]).length === 0) delete hooks[event];\n }\n if (Object.keys(hooks).length === 0) {\n // Remove hooks.json entirely if empty\n try {\n fs.unlinkSync(CODEX_HOOKS_JSON);\n } catch {}\n } else {\n hooksFile.hooks = hooks;\n writeHooksJson(hooksFile);\n }\n }\n\n // Remove proxy URL if it points to panopticon\n if (\n typeof cfg.openai_base_url === \"string\" &&\n cfg.openai_base_url.includes(\"panopticon\")\n ) {\n delete cfg.openai_base_url;\n }\n\n // Remove OTel config\n delete cfg.telemetry; // Legacy format\n const otel = cfg.otel as Record<string, unknown> | undefined;\n if (otel) {\n delete otel.log_user_prompt;\n delete otel.exporter;\n delete otel.trace_exporter;\n delete otel.metrics_exporter;\n if (Object.keys(otel).length === 0) delete cfg.otel;\n }\n\n // Remove MCP server\n const servers = cfg.mcp_servers as Record<string, unknown> | undefined;\n if (servers) {\n delete servers.panopticon;\n if (Object.keys(servers).length === 0) delete cfg.mcp_servers;\n }\n\n return cfg;\n },\n },\n\n shellEnv: {\n // Codex CLI reads its config from TOML, no shell env vars needed\n envVars() {\n return [];\n },\n },\n\n events: {\n // Codex uses snake_case but the hook handler already accepts both cases;\n // no mapping needed since ingest.ts normalizes at storage time\n eventMap: {},\n formatPermissionResponse({ allow, reason }) {\n // Codex uses the same format as Claude Code\n return {\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\",\n permissionDecision: allow ? \"allow\" : \"deny\",\n permissionDecisionReason: reason,\n },\n };\n },\n },\n\n detect: {\n displayName: \"Codex CLI\",\n isInstalled: () => fs.existsSync(CODEX_DIR),\n isConfigured() {\n try {\n const content = fs.readFileSync(CODEX_HOOKS_JSON, \"utf-8\");\n return content.includes(\"panopticon\");\n } catch {\n return false;\n }\n },\n },\n\n otel: {\n serviceName: \"codex_cli_rs\",\n metrics: {\n metricNames: [\"codex.turn.token_usage\"],\n aggregation: \"SUM\",\n tokenTypeAttrs: [\"$.token_type\"],\n modelAttrs: [\"$.model\"],\n tokenTypeMap: {\n cached_input: \"cacheRead\",\n reasoning_output: \"output\",\n },\n excludeTokenTypes: [\"total\"],\n },\n logFields: {\n eventTypeExprs: [\"body\", `json_extract(attributes, '$.\"event.name\"')`],\n timestampMsExprs: [\n \"CAST(timestamp_ns / 1000000 AS INTEGER)\",\n `CAST(strftime('%s', json_extract(attributes, '$.\"event.timestamp\"')) AS INTEGER) * 1000`,\n ],\n },\n },\n\n ident: {\n modelPatterns: [/^(gpt-|o[1-9]|chatgpt-)/],\n },\n\n proxy: {\n upstreamHost(headers) {\n // Codex auto-detect: ChatGPT OAuth (JWT) vs API key route to different upstreams\n const auth = headers.authorization ?? \"\";\n return auth.startsWith(\"Bearer eyJ\") ? \"chatgpt.com\" : \"api.openai.com\";\n },\n rewritePath(requestPath, headers) {\n const auth = headers.authorization ?? \"\";\n const isChatGptOAuth = auth.startsWith(\"Bearer eyJ\");\n return isChatGptOAuth\n ? `/backend-api/codex${requestPath}`\n : `/v1${requestPath}`;\n },\n accumulatorType: \"openai\",\n },\n\n scanner: {\n normalizeToolCategory: codexToolCategory,\n discover() {\n const sessionsDir = path.join(CODEX_DIR, \"sessions\");\n const files: { filePath: string }[] = [];\n const safeReaddir = (d: string) => {\n try {\n return fs.readdirSync(d);\n } catch {\n return [];\n }\n };\n for (const year of safeReaddir(sessionsDir)) {\n for (const month of safeReaddir(path.join(sessionsDir, year))) {\n for (const day of safeReaddir(path.join(sessionsDir, year, month))) {\n const dayDir = path.join(sessionsDir, year, month, day);\n for (const entry of safeReaddir(dayDir)) {\n if (entry.endsWith(\".jsonl\"))\n files.push({ filePath: path.join(dayDir, entry) });\n }\n }\n }\n }\n return files;\n },\n\n parseFile(filePath: string, fromByteOffset: number): ParseResult | null {\n const { lines, newByteOffset } = readNewLines(filePath, fromByteOffset);\n if (lines.length === 0) return null;\n\n let meta: ParseResult[\"meta\"];\n const turns: ParseResult[\"turns\"] = [];\n const events: ParseResult[\"events\"] = [];\n const messages: ParseResult[\"messages\"] = [];\n let turnIndex = 0;\n let ordinal = 0;\n let currentModel: string | undefined;\n let firstPrompt: string | undefined;\n\n // Collect tool calls and results keyed by call_id to match them up\n let pendingToolCalls: ParsedToolCall[] = [];\n let pendingAssistantContent = \"\";\n const toolResultsByCallId = new Map<\n string,\n { contentLength: number; contentRaw: string }\n >();\n\n for (const line of lines) {\n let obj: Record<string, unknown>;\n try {\n obj = JSON.parse(line);\n } catch {\n continue;\n }\n\n const type = obj.type as string;\n const timestamp = obj.timestamp as string | undefined;\n const tsMs = timestamp ? new Date(timestamp).getTime() : Date.now();\n const payload = obj.payload as Record<string, unknown> | undefined;\n\n if (type === \"session_meta\" && payload) {\n meta = {\n sessionId: payload.id as string,\n cwd: payload.cwd as string | undefined,\n cliVersion: payload.cli_version as string | undefined,\n startedAtMs: payload.timestamp\n ? new Date(payload.timestamp as string).getTime()\n : tsMs,\n };\n }\n\n if (type === \"turn_context\" && payload) {\n currentModel = payload.model as string | undefined;\n if (meta && currentModel && !meta.model) meta.model = currentModel;\n }\n\n const sid = meta?.sessionId ?? \"\";\n\n if (type === \"event_msg\" && payload) {\n const eventType = payload.type as string;\n\n if (eventType === \"user_message\") {\n const message = payload.message as string | undefined;\n if (!firstPrompt && message) firstPrompt = message.slice(0, 200);\n turns.push({\n sessionId: sid,\n turnIndex: turnIndex++,\n timestampMs: tsMs,\n model: currentModel,\n role: \"user\",\n contentPreview: message?.slice(0, 200),\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n reasoningTokens: 0,\n });\n\n if (message && !isCodexSystemMessage(message)) {\n messages.push({\n sessionId: sid,\n ordinal: ordinal++,\n role: \"user\",\n content: message,\n timestampMs: tsMs,\n hasThinking: false,\n hasToolUse: false,\n isSystem: false,\n contentLength: message.length,\n hasContextTokens: false,\n hasOutputTokens: false,\n toolCalls: [],\n toolResults: new Map(),\n });\n }\n }\n\n if (eventType === \"token_count\") {\n const info = payload.info as Record<string, unknown> | null;\n if (!info) continue;\n const lastUsage = info.last_token_usage as\n | Record<string, unknown>\n | undefined;\n if (!lastUsage) continue;\n\n const inputTokens = (lastUsage.input_tokens as number) ?? 0;\n const outTokens = (lastUsage.output_tokens as number) ?? 0;\n const cacheRead = (lastUsage.cached_input_tokens as number) ?? 0;\n const reasoning =\n (lastUsage.reasoning_output_tokens as number) ?? 0;\n const ctxTokens = inputTokens + cacheRead;\n const hasCtx = inputTokens > 0 || cacheRead > 0;\n\n turns.push({\n sessionId: sid,\n turnIndex: turnIndex++,\n timestampMs: tsMs,\n model: currentModel,\n role: \"assistant\",\n inputTokens,\n outputTokens: outTokens,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: 0,\n reasoningTokens: reasoning,\n });\n\n // Flush accumulated tool calls into an assistant message\n const toolResults = new Map<\n string,\n { contentLength: number; contentRaw: string }\n >();\n for (const tc of pendingToolCalls) {\n const result = toolResultsByCallId.get(tc.toolUseId);\n if (result) toolResults.set(tc.toolUseId, result);\n }\n\n messages.push({\n sessionId: sid,\n ordinal: ordinal++,\n role: \"assistant\",\n content: pendingAssistantContent,\n timestampMs: tsMs,\n hasThinking: false,\n hasToolUse: pendingToolCalls.length > 0,\n isSystem: false,\n contentLength: pendingAssistantContent.length,\n model: currentModel,\n tokenUsage: JSON.stringify(lastUsage),\n contextTokens: hasCtx ? ctxTokens : undefined,\n outputTokens: outTokens > 0 ? outTokens : undefined,\n hasContextTokens: hasCtx,\n hasOutputTokens: outTokens > 0,\n toolCalls: pendingToolCalls,\n toolResults,\n });\n pendingToolCalls = [];\n pendingAssistantContent = \"\";\n }\n\n if (eventType === \"agent_message\") {\n events.push({\n sessionId: sid,\n eventType: \"agent_message\",\n timestampMs: tsMs,\n content: (payload.message as string)?.slice(0, 500),\n metadata: { phase: payload.phase },\n });\n }\n }\n\n // Tool calls and content from response_item\n if (type === \"response_item\") {\n const p = obj.payload as Record<string, unknown> | undefined;\n const itemType = p?.type as string | undefined;\n\n // Capture assistant text content from message/text items\n if (itemType === \"message\" || itemType === \"text\") {\n const text =\n (p?.text as string) ??\n (p?.content as string) ??\n (p?.output_text as string);\n if (text) {\n pendingAssistantContent +=\n (pendingAssistantContent ? \"\\n\" : \"\") + text;\n }\n }\n\n if (itemType === \"function_call\") {\n const toolName = (p?.name as string) ?? \"\";\n const callId = (p?.call_id as string) ?? \"\";\n const inputJson =\n typeof p?.arguments === \"string\"\n ? p.arguments\n : JSON.stringify(p?.arguments);\n\n pendingToolCalls.push({\n toolUseId: callId,\n toolName,\n category: codexToolCategory(toolName),\n inputJson,\n });\n\n events.push({\n sessionId: sid,\n eventType: \"tool_call\",\n timestampMs: tsMs,\n toolName,\n toolInput: inputJson?.slice(0, 1000),\n metadata: { call_id: callId },\n });\n }\n\n if (itemType === \"function_call_output\") {\n const callId = (p?.call_id as string) ?? \"\";\n const output = typeof p?.output === \"string\" ? p.output : undefined;\n\n if (output) {\n toolResultsByCallId.set(callId, {\n contentLength: output.length,\n contentRaw: output,\n });\n }\n\n events.push({\n sessionId: sid,\n eventType: \"tool_result\",\n timestampMs: tsMs,\n toolOutput: output?.slice(0, 1000),\n metadata: { call_id: callId },\n });\n }\n }\n }\n\n if (meta && firstPrompt && !meta.firstPrompt)\n meta.firstPrompt = firstPrompt;\n return { meta, turns, events, messages, newByteOffset };\n },\n },\n};\n\nregisterTarget(codex);\n"],"mappings":"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","names":["fs","fs","agentId","fs","os","path","path","os","fs","fs","os","path","path","os","fs"]}