ultracontext 1.4.13 → 1.6.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 (41) hide show
  1. package/dist/cli/entry.mjs +9 -3
  2. package/dist/cli/entry.mjs.map +1 -1
  3. package/dist/cli/onboarding.mjs +268 -111
  4. package/dist/cli/onboarding.mjs.map +1 -1
  5. package/dist/cli/sdk-sync.mjs +199 -939
  6. package/dist/cli/sdk-sync.mjs.map +1 -1
  7. package/dist/cli/switch.mjs +168 -0
  8. package/dist/cli/switch.mjs.map +1 -0
  9. package/dist/{ctl-CXfNEPN8.mjs → ctl-DTQZxn3N.mjs} +2 -2
  10. package/dist/{ctl-CXfNEPN8.mjs.map → ctl-DTQZxn3N.mjs.map} +1 -1
  11. package/dist/hero-art-C03HmDXN.mjs +46 -0
  12. package/dist/hero-art-C03HmDXN.mjs.map +1 -0
  13. package/dist/index.d.mts +21 -1
  14. package/dist/index.d.mts.map +1 -1
  15. package/dist/index.mjs +25 -3
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/{launcher-BMMjzr5k.mjs → launcher-ZylswrpR.mjs} +3 -3
  18. package/dist/{launcher-BMMjzr5k.mjs.map → launcher-ZylswrpR.mjs.map} +1 -1
  19. package/dist/{lock-5aJnda81.mjs → lock-BhZX2aF3.mjs} +2 -2
  20. package/dist/{lock-5aJnda81.mjs.map → lock-BhZX2aF3.mjs.map} +1 -1
  21. package/dist/onboarding-preferences-Alhblobi.mjs +76 -0
  22. package/dist/onboarding-preferences-Alhblobi.mjs.map +1 -0
  23. package/dist/src-Bovo1ukU.mjs +1200 -0
  24. package/dist/src-Bovo1ukU.mjs.map +1 -0
  25. package/dist/{tui-DZ1SDOH2.mjs → tui-DLEjew3K.mjs} +334 -115
  26. package/dist/tui-DLEjew3K.mjs.map +1 -0
  27. package/dist/utils-BTfShW0g.mjs +36 -0
  28. package/dist/utils-BTfShW0g.mjs.map +1 -0
  29. package/dist/{utils-CmuIYHtm.mjs → utils-D9CKnbke.mjs} +26 -34
  30. package/dist/utils-D9CKnbke.mjs.map +1 -0
  31. package/lib/register-skills.mjs +96 -0
  32. package/package.json +8 -3
  33. package/plugin/.claude-plugin/plugin.json +6 -0
  34. package/plugin/README.md +112 -0
  35. package/plugin/marketplace.json +17 -0
  36. package/plugin/skills/switch/SKILL.md +27 -0
  37. package/postinstall.mjs +35 -2
  38. package/dist/Spinner-CwBjkXHv.mjs +0 -153
  39. package/dist/Spinner-CwBjkXHv.mjs.map +0 -1
  40. package/dist/tui-DZ1SDOH2.mjs.map +0 -1
  41. package/dist/utils-CmuIYHtm.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-Bovo1ukU.mjs","names":["fs","fs"],"sources":["../../../packages/parsers/src/agents/claude.mjs","../../../packages/parsers/src/agents/codex.mjs","../../../packages/parsers/src/agents/openclaw.mjs","../../../packages/parsers/src/agents/cursor.mjs","../../../packages/parsers/src/agents/gemini.mjs","../../../packages/parsers/src/gstack.mjs","../../../packages/parsers/src/writers/claude.mjs","../../../packages/parsers/src/writers/codex.mjs","../../../packages/parsers/src/switch.mjs","../../../packages/parsers/src/index.mjs"],"sourcesContent":["import {\n extractSessionIdFromPath,\n normalizeRole,\n normalizeWhitespace,\n preserveText,\n safeJsonParse,\n toMessage,\n truncateString,\n} from \"../utils.mjs\";\n\n// format a tool_use block into a readable string\nfunction formatToolUse(item) {\n const name = (item.name ?? \"unknown\").toLowerCase();\n const input = item.input ?? {};\n const filePath = input.file_path ?? input.path ?? \"\";\n\n if (name === \"write\") {\n const content = preserveText(input.content ?? input.file_text ?? \"\");\n return `[Write] ${filePath}\\n${content}`;\n }\n\n if (name === \"edit\") {\n const parts = [`[Edit] ${filePath}`];\n if (input.old_string) parts.push(`- ${preserveText(input.old_string)}`);\n if (input.new_string) parts.push(`+ ${preserveText(input.new_string)}`);\n return parts.join(\"\\n\");\n }\n\n if (name === \"read\") return `[Read] ${filePath}`;\n if (name === \"bash\") return `[Bash] ${preserveText(input.command ?? \"\")}`;\n\n // grep and glob share the same shape\n if (name === \"grep\" || name === \"glob\") {\n const loc = filePath ? ` in ${filePath}` : \"\";\n return `[${item.name}] ${input.pattern ?? \"\"}${loc}`;\n }\n\n // generic fallback\n const compact = JSON.stringify(input);\n return `[${item.name ?? name}] ${compact.length > 500 ? compact.slice(0, 500) + \"...\" : compact}`;\n}\n\n// format a tool_result block into a readable string\nfunction formatToolResult(item) {\n const content = item.content ?? \"\";\n\n if (typeof content === \"string\") {\n const text = preserveText(content);\n return text ? `[result] ${truncateString(text, 1000)}` : \"[result] ok\";\n }\n\n if (Array.isArray(content)) {\n const text = content\n .filter((c) => c?.type === \"text\" && typeof c.text === \"string\")\n .map((c) => preserveText(c.text))\n .filter(Boolean)\n .join(\"\\n\");\n return text ? `[result] ${truncateString(text, 1000)}` : \"[result] ok\";\n }\n\n return \"[result] ok\";\n}\n\n// extract text content from Claude Code's message.content (string, array, or object)\nexport function extractClaudeTextContent(content) {\n if (!content) return \"\";\n if (typeof content === \"string\") return preserveText(content);\n\n if (Array.isArray(content)) {\n const parts = [];\n for (const item of content) {\n if (!item || typeof item !== \"object\") continue;\n if (item.type === \"text\" && typeof item.text === \"string\") {\n const chunk = preserveText(item.text);\n if (chunk) parts.push(chunk);\n }\n if (item.type === \"thinking\" && typeof item.thinking === \"string\") {\n const chunk = preserveText(item.thinking);\n if (chunk) parts.push(`[thinking] ${chunk}`);\n }\n if (item.type === \"tool_use\") parts.push(formatToolUse(item));\n if (item.type === \"tool_result\") parts.push(formatToolResult(item));\n }\n return parts.join(\"\\n\\n\");\n }\n\n if (typeof content === \"object\") {\n if (typeof content.text === \"string\") return preserveText(content.text);\n if (typeof content.content === \"string\") return preserveText(content.content);\n }\n\n return \"\";\n}\n\n// parse a single JSONL line from a Claude Code session file\nexport function parseClaudeCodeLine({ line, filePath }) {\n const parsed = safeJsonParse(line);\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const type = String(parsed.type ?? \"\").toLowerCase();\n const sessionId =\n parsed.sessionId ??\n parsed.session_id ??\n parsed.payload?.sessionId ??\n parsed.payload?.session_id ??\n extractSessionIdFromPath(filePath);\n const timestamp = parsed.timestamp ?? parsed.ts ?? new Date().toISOString();\n\n // summary entries\n if (type === \"summary\") {\n const summary = normalizeWhitespace(parsed.summary);\n if (!summary) return null;\n return {\n sessionId,\n eventType: \"claude.summary\",\n kind: \"system\",\n timestamp,\n message: toMessage(summary),\n raw: parsed,\n };\n }\n\n // file history snapshots\n if (type === \"file-history-snapshot\") {\n const trackedFiles = Object.keys(parsed.snapshot?.trackedFileBackups ?? {}).length;\n const label = parsed.isSnapshotUpdate ? \"File snapshot update\" : \"File snapshot\";\n const message = `${label}: ${trackedFiles} tracked files`;\n return {\n sessionId,\n eventType: \"claude.file_snapshot\",\n kind: \"system\",\n timestamp,\n message: toMessage(message),\n raw: parsed,\n };\n }\n\n // system entries (local_command, stop_hook_summary, turn_duration, etc.)\n if (type === \"system\") {\n const subtype = parsed.subtype ?? \"unknown\";\n let message;\n\n if (subtype === \"local_command\") {\n message = parsed.content ? preserveText(parsed.content) : \"Local command executed\";\n } else if (subtype === \"stop_hook_summary\") {\n message = `Hook summary: ${parsed.hookCount ?? 0} hooks`;\n } else if (subtype === \"turn_duration\") {\n message = `Turn completed in ${parsed.durationMs ?? 0}ms (${parsed.messageCount ?? 0} messages)`;\n } else {\n message = `System event: ${subtype}`;\n }\n\n if (!message) return null;\n return {\n sessionId,\n eventType: `claude.system.${subtype}`,\n kind: \"system\",\n timestamp,\n message: toMessage(message),\n raw: parsed,\n };\n }\n\n // attachment entries (deferred_tools_delta, mcp_instructions_delta, etc.)\n if (type === \"attachment\") {\n const attachmentType = parsed.attachment?.type ?? \"unknown\";\n const parts = [];\n const added = parsed.attachment?.addedNames;\n const removed = parsed.attachment?.removedNames;\n if (Array.isArray(added) && added.length) parts.push(`added: ${added.join(\", \")}`);\n if (Array.isArray(removed) && removed.length) parts.push(`removed: ${removed.join(\", \")}`);\n const detail = parts.length ? ` (${parts.join(\"; \")})` : \"\";\n return {\n sessionId,\n eventType: `claude.attachment.${attachmentType}`,\n kind: \"system\",\n timestamp,\n message: toMessage(`Attachment: ${attachmentType}${detail}`),\n raw: parsed,\n };\n }\n\n // progress entries (hook_progress, etc.)\n if (type === \"progress\") {\n const data = parsed.data ?? {};\n const subtype = data.type ?? \"unknown\";\n const label = data.hookName ?? subtype;\n return {\n sessionId,\n eventType: `claude.progress.${subtype}`,\n kind: \"system\",\n timestamp,\n message: toMessage(`Progress: ${subtype} (${label})`),\n raw: parsed,\n };\n }\n\n // queue operation entries (enqueue, dequeue, etc.)\n if (type === \"queue-operation\") {\n const operation = parsed.operation ?? \"unknown\";\n const content = parsed.content ? `: ${parsed.content}` : \"\";\n return {\n sessionId,\n eventType: \"claude.queue_operation\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Queue ${operation}${content}`),\n raw: parsed,\n };\n }\n\n // custom title entries\n if (type === \"custom-title\") {\n const customTitle = parsed.customTitle ?? \"unknown\";\n return {\n sessionId,\n eventType: \"claude.custom_title\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Custom title: ${customTitle}`),\n raw: parsed,\n };\n }\n\n // agent name entries\n if (type === \"agent-name\") {\n const agentName = parsed.agentName ?? \"unknown\";\n return {\n sessionId,\n eventType: \"claude.agent_name\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Agent name: ${agentName}`),\n raw: parsed,\n };\n }\n\n // PR link entries\n if (type === \"pr-link\") {\n const prNumber = parsed.prNumber ?? 0;\n const prUrl = parsed.prUrl ?? \"\";\n return {\n sessionId,\n eventType: \"claude.pr_link\",\n kind: \"system\",\n timestamp,\n message: toMessage(`PR #${prNumber}: ${prUrl}`),\n raw: parsed,\n };\n }\n\n // permission mode changes\n if (type === \"permission-mode\") {\n return {\n sessionId,\n eventType: \"claude.permission_mode\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Permission mode: ${parsed.permissionMode ?? \"unknown\"}`),\n raw: parsed,\n };\n }\n\n // last user prompt captured by the session\n if (type === \"last-prompt\") {\n const prompt = parsed.lastPrompt ?? \"\";\n if (!prompt) return null;\n return {\n sessionId,\n eventType: \"claude.last_prompt\",\n kind: \"system\",\n timestamp,\n message: toMessage(prompt),\n raw: parsed,\n };\n }\n\n // AI-generated session title\n if (type === \"ai-title\") {\n return {\n sessionId,\n eventType: \"claude.ai_title\",\n kind: \"system\",\n timestamp,\n message: toMessage(`AI title: ${parsed.aiTitle ?? \"unknown\"}`),\n raw: parsed,\n };\n }\n\n // periodic task summary (fork-generated, every min(5 steps, 2min))\n if (type === \"task-summary\") {\n return {\n sessionId,\n eventType: \"claude.task_summary\",\n kind: \"system\",\n timestamp,\n message: toMessage(parsed.summary ?? \"[task summary]\"),\n raw: parsed,\n };\n }\n\n // session tag for searchability\n if (type === \"tag\") {\n return {\n sessionId,\n eventType: \"claude.tag\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Tag: ${parsed.tag ?? \"\"}`),\n raw: parsed,\n };\n }\n\n // agent color assignment (from /rename or swarm)\n if (type === \"agent-color\") {\n return {\n sessionId,\n eventType: \"claude.agent_color\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Agent color: ${parsed.agentColor ?? \"unknown\"}`),\n raw: parsed,\n };\n }\n\n // agent setting/definition (from --agent flag)\n if (type === \"agent-setting\") {\n return {\n sessionId,\n eventType: \"claude.agent_setting\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Agent setting: ${parsed.agentSetting ?? \"unknown\"}`),\n raw: parsed,\n };\n }\n\n // session mode (coordinator/normal)\n if (type === \"mode\") {\n return {\n sessionId,\n eventType: \"claude.mode\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Mode: ${parsed.mode ?? \"unknown\"}`),\n raw: parsed,\n };\n }\n\n // worktree session state\n if (type === \"worktree-state\") {\n const ws = parsed.worktreeSession;\n const label = ws ? `entered ${ws.worktreePath ?? \"\"}` : \"exited\";\n return {\n sessionId,\n eventType: \"claude.worktree_state\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Worktree: ${label}`),\n raw: parsed,\n };\n }\n\n // file attribution snapshot (character-level contribution tracking)\n if (type === \"attribution-snapshot\") {\n const fileCount = Object.keys(parsed.fileStates ?? {}).length;\n return {\n sessionId,\n eventType: \"claude.attribution_snapshot\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Attribution snapshot: ${fileCount} files`),\n raw: parsed,\n };\n }\n\n // content replacement stubs (replayed on resume for prompt cache stability)\n if (type === \"content-replacement\") {\n const count = parsed.replacements?.length ?? 0;\n return {\n sessionId,\n eventType: \"claude.content_replacement\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Content replacement: ${count} blocks`),\n raw: parsed,\n };\n }\n\n // speculation accept (speculative execution savings)\n if (type === \"speculation-accept\") {\n return {\n sessionId,\n eventType: \"claude.speculation_accept\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Speculation accepted: saved ${parsed.timeSavedMs ?? 0}ms`),\n raw: parsed,\n };\n }\n\n // context collapse commit (marble-origami)\n if (type === \"marble-origami-commit\") {\n return {\n sessionId,\n eventType: \"claude.context_collapse_commit\",\n kind: \"system\",\n timestamp,\n message: toMessage(parsed.summary ?? `Context collapse: ${parsed.collapseId ?? \"\"}`),\n raw: parsed,\n };\n }\n\n // context collapse snapshot (marble-origami staged queue)\n if (type === \"marble-origami-snapshot\") {\n const stagedCount = parsed.staged?.length ?? 0;\n return {\n sessionId,\n eventType: \"claude.context_collapse_snapshot\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Context collapse snapshot: ${stagedCount} staged`),\n raw: parsed,\n };\n }\n\n if (type !== \"user\" && type !== \"assistant\") return null;\n\n // user/assistant messages\n const rawContent =\n parsed.message?.content ??\n parsed.message ??\n parsed.content ??\n parsed.payload?.content ??\n \"\";\n let message = extractClaudeTextContent(rawContent);\n\n // thinking-only entries have redacted content — preserve them as system events\n if (!message) {\n const hasThinking = Array.isArray(rawContent) && rawContent.some((c) => c?.type === \"thinking\");\n if (!hasThinking) return null;\n message = \"[thinking]\";\n }\n\n const roleHint = parsed.message?.role ?? type;\n return {\n sessionId,\n eventType: `claude.${type}`,\n kind: normalizeRole(roleHint, type === \"user\" ? \"user\" : \"assistant\"),\n timestamp,\n message: toMessage(message),\n raw: parsed,\n };\n}\n","import { extractSessionIdFromPath, normalizeRole, safeJsonParse, toMessage } from \"../utils.mjs\";\n\n// parse a single JSONL line from a Codex session file\nexport function parseCodexLine({ line, filePath }) {\n const parsed = safeJsonParse(line);\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const payload = parsed.payload ?? {};\n const sessionId =\n payload.session_id ??\n payload.id ??\n parsed.session_id ??\n extractSessionIdFromPath(filePath);\n\n // event messages (user/agent/task)\n if (parsed.type === \"event_msg\") {\n const eventType = payload.type ?? \"unknown\";\n if (![\"user_message\", \"agent_message\", \"task_started\", \"task_complete\", \"token_count\", \"agent_reasoning\", \"turn_aborted\", \"context_compacted\"].includes(eventType)) {\n return null;\n }\n\n // resolve kind based on event subtype\n const kind =\n eventType === \"user_message\" ? \"user\" :\n eventType === \"agent_message\" ? \"assistant\" :\n \"system\";\n\n // resolve message based on event subtype\n const message =\n eventType === \"token_count\" ? \"Token count update\" :\n eventType === \"agent_reasoning\" ? payload.text :\n eventType === \"turn_aborted\" ? (payload.reason ? `Turn aborted: ${payload.reason}` : \"Turn aborted\") :\n eventType === \"context_compacted\" ? \"Context compacted\" :\n payload.message ??\n payload.last_agent_message ??\n `${eventType}${payload.turn_id ? ` (${payload.turn_id})` : \"\"}`;\n\n return {\n sessionId,\n eventType: `event_msg.${eventType}`,\n kind,\n timestamp: parsed.timestamp ?? new Date().toISOString(),\n message: toMessage(message),\n raw: parsed,\n };\n }\n\n // session metadata\n if (parsed.type === \"session_meta\") {\n return {\n sessionId,\n eventType: \"session_meta\",\n kind: \"system\",\n timestamp: parsed.timestamp ?? new Date().toISOString(),\n message: `Session started in ${payload.cwd ?? \"unknown cwd\"}`,\n raw: parsed,\n };\n }\n\n // response items (message, reasoning, function calls)\n if (parsed.type === \"response_item\") {\n const subtype = payload.type;\n const ts = parsed.timestamp ?? new Date().toISOString();\n\n // assistant/user/developer messages\n if (subtype === \"message\") {\n const text = (payload.content ?? [])\n .map((c) => c.text ?? \"\")\n .filter(Boolean)\n .join(\"\\n\");\n const roleMap = { developer: \"system\", assistant: \"assistant\", user: \"user\" };\n const kind = roleMap[payload.role] ?? normalizeRole(payload.role);\n\n return {\n sessionId,\n eventType: \"response_item.message\",\n kind,\n timestamp: ts,\n message: toMessage(text || `[${payload.role ?? \"unknown\"} message]`),\n raw: parsed,\n };\n }\n\n // reasoning summaries\n if (subtype === \"reasoning\") {\n const text = (payload.summary ?? [])\n .map((s) => s.text ?? \"\")\n .filter(Boolean)\n .join(\"\\n\");\n\n return {\n sessionId,\n eventType: \"response_item.reasoning\",\n kind: \"system\",\n timestamp: ts,\n message: toMessage(text || \"[reasoning]\"),\n raw: parsed,\n };\n }\n\n // tool invocations\n if (subtype === \"function_call\") {\n const msg = `[${payload.name ?? \"unknown\"}] ${payload.arguments ?? \"\"}`;\n\n return {\n sessionId,\n eventType: \"response_item.function_call\",\n kind: \"system\",\n timestamp: ts,\n message: toMessage(msg),\n raw: parsed,\n };\n }\n\n // tool outputs\n if (subtype === \"function_call_output\") {\n return {\n sessionId,\n eventType: \"response_item.function_call_output\",\n kind: \"system\",\n timestamp: ts,\n message: toMessage(payload.output ?? `[output ${payload.call_id ?? \"\"}]`),\n raw: parsed,\n };\n }\n\n // web search invocations\n if (subtype === \"web_search_call\") {\n const query = payload.action?.query;\n return {\n sessionId,\n eventType: \"response_item.web_search_call\",\n kind: \"system\",\n timestamp: ts,\n message: query ? `[web_search] ${query}` : \"[web_search]\",\n raw: parsed,\n };\n }\n\n // custom tool invocations (e.g. apply_patch)\n if (subtype === \"custom_tool_call\") {\n const msg = `[${payload.name ?? \"unknown\"}] ${payload.input ?? \"\"}`;\n return {\n sessionId,\n eventType: \"response_item.custom_tool_call\",\n kind: \"system\",\n timestamp: ts,\n message: toMessage(msg),\n raw: parsed,\n };\n }\n\n // custom tool outputs\n if (subtype === \"custom_tool_call_output\") {\n return {\n sessionId,\n eventType: \"response_item.custom_tool_call_output\",\n kind: \"system\",\n timestamp: ts,\n message: toMessage(payload.output ?? `[output ${payload.call_id ?? \"\"}]`),\n raw: parsed,\n };\n }\n\n // unknown response_item subtype\n return null;\n }\n\n // session compacted (context window reset)\n if (parsed.type === \"compacted\") {\n return {\n sessionId,\n eventType: \"compacted\",\n kind: \"system\",\n timestamp: parsed.timestamp ?? new Date().toISOString(),\n message: \"Session compacted\",\n raw: parsed,\n };\n }\n\n // turn context (model, policies, cwd)\n if (parsed.type === \"turn_context\") {\n return {\n sessionId,\n eventType: \"turn_context\",\n kind: \"system\",\n timestamp: parsed.timestamp ?? new Date().toISOString(),\n message: `Turn context: model=${payload.model}, policy=${payload.approval_policy}`,\n raw: parsed,\n };\n }\n\n return null;\n}\n","import {\n extractSessionIdFromPath,\n normalizeWhitespace,\n safeJsonParse,\n toMessage,\n truncateString,\n} from \"../utils.mjs\";\n\n// extract text from OpenClaw content (string, array, or object)\nfunction extractOpenClawTextContent(content) {\n if (!content) return \"\";\n if (typeof content === \"string\") return normalizeWhitespace(content);\n\n if (Array.isArray(content)) {\n const textParts = [];\n for (const item of content) {\n if (!item || typeof item !== \"object\") continue;\n if (item.type === \"text\" && typeof item.text === \"string\") {\n const chunk = normalizeWhitespace(item.text);\n if (chunk) textParts.push(chunk);\n }\n }\n return textParts.join(\"\\n\");\n }\n\n if (typeof content === \"object\" && typeof content.text === \"string\") {\n return normalizeWhitespace(content.text);\n }\n\n return \"\";\n}\n\n// extract tool call names from OpenClaw content array\nfunction extractOpenClawToolCalls(content) {\n if (!Array.isArray(content)) return [];\n const names = [];\n for (const item of content) {\n if (!item || typeof item !== \"object\" || item.type !== \"toolCall\") continue;\n const name = normalizeWhitespace(item.name);\n if (name) names.push(name);\n }\n return names;\n}\n\n// build compact raw representation for storage\nfunction buildOpenClawRaw(parsed) {\n const raw = {\n type: parsed.type,\n id: parsed.id,\n parentId: parsed.parentId,\n timestamp: parsed.timestamp,\n };\n\n if (parsed.type === \"session\") {\n raw.session = {\n id: parsed.id,\n version: parsed.version,\n cwd: parsed.cwd,\n parentSession: parsed.parentSession,\n };\n return raw;\n }\n\n if (parsed.type === \"custom\") {\n raw.customType = parsed.customType;\n if (parsed.customType === \"model-snapshot\" && parsed.data && typeof parsed.data === \"object\") {\n raw.data = {\n provider: parsed.data.provider,\n modelApi: parsed.data.modelApi,\n modelId: parsed.data.modelId,\n timestamp: parsed.data.timestamp,\n };\n }\n return raw;\n }\n\n if (parsed.message && typeof parsed.message === \"object\") {\n const contentTypes = Array.isArray(parsed.message.content)\n ? parsed.message.content\n .filter((item) => item && typeof item === \"object\")\n .map((item) => String(item.type ?? \"unknown\"))\n .slice(0, 12)\n : [];\n\n raw.message = {\n role: parsed.message.role,\n stopReason: parsed.message.stopReason,\n toolName: parsed.message.toolName,\n toolCallId: parsed.message.toolCallId,\n isError: parsed.message.isError,\n contentTypes,\n };\n }\n\n if (parsed.type === \"compaction\") {\n raw.compaction = {\n firstKeptEntryId: parsed.firstKeptEntryId,\n tokensBefore: parsed.tokensBefore,\n };\n } else if (parsed.type === \"branch_summary\") {\n raw.branchSummary = {\n firstKeptEntryId: parsed.firstKeptEntryId,\n summary: typeof parsed.summary === \"string\" ? truncateString(parsed.summary, 350) : \"\",\n };\n }\n\n return raw;\n}\n\n// parse a single JSONL line from an OpenClaw session file\nexport function parseOpenClawLine({ line, filePath }) {\n const parsed = safeJsonParse(line);\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const type = String(parsed.type ?? \"\").toLowerCase();\n const sessionId =\n parsed.session_id ??\n parsed.sessionId ??\n parsed.message?.session_id ??\n parsed.message?.sessionId ??\n extractSessionIdFromPath(filePath);\n\n const timestamp = parsed.timestamp ?? parsed.message?.timestamp ?? new Date().toISOString();\n\n // session start\n if (type === \"session\") {\n return {\n sessionId,\n eventType: \"openclaw.session\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Session started in ${parsed.cwd ?? \"unknown cwd\"}`),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n // custom events\n if (type === \"custom\") {\n const customType = normalizeWhitespace(parsed.customType || \"custom\");\n if (customType === \"openclaw.cache-ttl\") return null;\n\n let message = `Custom event: ${customType}`;\n if (customType === \"model-snapshot\" && parsed.data && typeof parsed.data === \"object\") {\n const provider = normalizeWhitespace(parsed.data.provider || \"\");\n const modelId = normalizeWhitespace(parsed.data.modelId || \"\");\n const modelApi = normalizeWhitespace(parsed.data.modelApi || \"\");\n const details = [provider, modelId].filter(Boolean).join(\"/\");\n message = `Model snapshot${details ? `: ${details}` : \"\"}${modelApi ? ` (${modelApi})` : \"\"}`;\n }\n\n return {\n sessionId,\n eventType: `openclaw.custom.${customType || \"custom\"}`,\n kind: \"system\",\n timestamp,\n message: toMessage(message),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n // compaction\n if (type === \"compaction\") {\n return {\n sessionId,\n eventType: \"openclaw.compaction\",\n kind: \"system\",\n timestamp,\n message: toMessage(\"Session compaction summary updated\"),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n // branch summary\n if (type === \"branch_summary\") {\n const summary = normalizeWhitespace(parsed.summary || \"\");\n return {\n sessionId,\n eventType: \"openclaw.branch_summary\",\n kind: \"system\",\n timestamp,\n message: toMessage(summary || \"Branch summary updated\"),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n if (type !== \"message\" && type !== \"custom_message\") return null;\n\n // user/assistant messages\n const eventMessage = parsed.message ?? {};\n const role = String(eventMessage.role ?? \"\").toLowerCase();\n\n if (role === \"user\" || role === \"assistant\") {\n const text = extractOpenClawTextContent(eventMessage.content);\n if (text) {\n return {\n sessionId,\n eventType: `openclaw.${role}`,\n kind: role === \"user\" ? \"user\" : \"assistant\",\n timestamp,\n message: toMessage(text),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n // assistant tool calls without text\n if (role === \"assistant\") {\n const toolCalls = extractOpenClawToolCalls(eventMessage.content);\n if (toolCalls.length > 0) {\n const list = toolCalls.slice(0, 5).join(\", \");\n const suffix = toolCalls.length > 5 ? ` (+${toolCalls.length - 5})` : \"\";\n return {\n sessionId,\n eventType: \"openclaw.assistant.tool_use\",\n kind: \"system\",\n timestamp,\n message: toMessage(`Assistant requested tools: ${list}${suffix}`),\n raw: buildOpenClawRaw(parsed),\n };\n }\n }\n\n return null;\n }\n\n // tool results\n if (role === \"toolresult\") {\n const toolName = normalizeWhitespace(eventMessage.toolName || \"\");\n const isError = Boolean(eventMessage.isError);\n let message = `Tool result${toolName ? `: ${toolName}` : \"\"} (${isError ? \"error\" : \"ok\"})`;\n const text = extractOpenClawTextContent(eventMessage.content);\n if (text) message = `${message} ${truncateString(text, 320)}`;\n\n return {\n sessionId,\n eventType: \"openclaw.tool_result\",\n kind: \"system\",\n timestamp,\n message: toMessage(message),\n raw: buildOpenClawRaw(parsed),\n };\n }\n\n return null;\n}\n","import { safeJsonParse, stripIDEContextTags } from \"../utils.mjs\";\nimport { parseClaudeCodeLine } from \"./claude.mjs\";\n\n// parse a single JSONL line from a Cursor session file\n// Cursor format is nearly identical to Claude Code, but uses \"role\" instead of \"type\"\nexport function parseCursorLine({ line, filePath }) {\n const parsed = safeJsonParse(line);\n if (!parsed || typeof parsed !== \"object\") return null;\n\n // normalize: Cursor uses \"role\" where Claude uses \"type\"\n if (!parsed.type && parsed.role) {\n parsed.type = parsed.role;\n }\n\n // delegate to Claude parser with re-serialized line\n const result = parseClaudeCodeLine({ line: JSON.stringify(parsed), filePath });\n if (!result) return null;\n\n // re-namespace event types: claude.* -> cursor.*\n result.eventType = result.eventType.replace(/^claude\\./, \"cursor.\");\n\n // strip Cursor's <user_query> tags and other IDE context from user messages\n if (result.kind === \"user\" && result.message) {\n result.message = stripIDEContextTags(result.message);\n }\n\n return result;\n}\n","import path from \"node:path\";\nimport { normalizeWhitespace, preserveText, safeJsonParse, toMessage, truncateString } from \"../utils.mjs\";\n\n// file modification tool names for Gemini CLI\nconst FILE_MOD_TOOLS = [\"write_file\", \"edit_file\", \"save_file\", \"replace\"];\n\n// multi-key fallback for file path extraction from tool args\nconst FILE_PATH_KEYS = [\"file_path\", \"path\", \"filePath\", \"filename\"];\n\n// extract text from Gemini's polymorphic content field\n// user messages: [{text: \"...\"}] (array), gemini messages: \"string\" (plain)\nexport function extractGeminiTextContent(content) {\n if (!content) return \"\";\n if (typeof content === \"string\") return preserveText(content);\n\n if (Array.isArray(content)) {\n const parts = [];\n for (const item of content) {\n if (!item || typeof item !== \"object\") continue;\n if (typeof item.text === \"string\") {\n const chunk = preserveText(item.text);\n if (chunk) parts.push(chunk);\n }\n }\n return parts.join(\"\\n\");\n }\n\n if (typeof content === \"object\" && typeof content.text === \"string\") {\n return preserveText(content.text);\n }\n\n return \"\";\n}\n\n// format a single Gemini tool call into a readable string\nfunction formatToolCall(tc) {\n const name = tc.name ?? \"unknown\";\n const args = tc.args ?? {};\n\n // extract file path with multi-key fallback\n let filePath = \"\";\n for (const key of FILE_PATH_KEYS) {\n if (typeof args[key] === \"string\" && args[key]) {\n filePath = args[key];\n break;\n }\n }\n\n // file modification tools get special formatting\n if (FILE_MOD_TOOLS.includes(name)) {\n const content = preserveText(args.content ?? args.file_text ?? args.new_content ?? \"\");\n if (content) return `[${name}] ${filePath}\\n${truncateString(content, 500)}`;\n return `[${name}] ${filePath}`;\n }\n\n // generic tool formatting\n const compact = JSON.stringify(args);\n const detail = compact.length > 500 ? compact.slice(0, 500) + \"...\" : compact;\n return `[${name}]${filePath ? ` ${filePath}` : \"\"} ${detail}`;\n}\n\n// extract session ID from Gemini session filename\n// pattern: session-<date>-<id>.json -> use <id> portion\nfunction extractGeminiSessionId(filePath) {\n const base = path.basename(filePath, \".json\");\n const match = base.match(/session-[\\d-]+-(.+)$/);\n if (match) return match[1];\n\n // fallback: use full filename without extension\n return base || \"unknown-session\";\n}\n\n// extract timestamp from Gemini session filename\n// pattern: session-YYYYMMDD-<id>.json\nfunction extractGeminiTimestamp(filePath) {\n const base = path.basename(filePath, \".json\");\n const match = base.match(/session-(\\d{4})(\\d{2})(\\d{2})/);\n if (match) return `${match[1]}-${match[2]}-${match[3]}T00:00:00.000Z`;\n return new Date().toISOString();\n}\n\n// parse an entire Gemini CLI session file (JSON, not JSONL)\n// returns array of normalized events\nexport function parseGeminiFile({ fileContents, filePath }) {\n const parsed = safeJsonParse(fileContents);\n if (!parsed || typeof parsed !== \"object\") return [];\n\n const messages = parsed.messages;\n if (!Array.isArray(messages) || messages.length === 0) return [];\n\n const sessionId = extractGeminiSessionId(filePath);\n const fileTimestamp = extractGeminiTimestamp(filePath);\n const events = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg || typeof msg !== \"object\") continue;\n\n const type = String(msg.type ?? \"\").toLowerCase();\n const isUser = type === \"user\";\n const isGemini = type === \"gemini\";\n if (!isUser && !isGemini) continue;\n\n // extract text content\n const text = extractGeminiTextContent(msg.content);\n\n // format tool calls (gemini messages only)\n const toolCallTexts = [];\n if (Array.isArray(msg.toolCalls)) {\n for (const tc of msg.toolCalls) {\n if (!tc || typeof tc !== \"object\") continue;\n toolCallTexts.push(formatToolCall(tc));\n }\n }\n\n // build message: text + tool calls\n const parts = [];\n if (text) parts.push(text);\n if (toolCallTexts.length) parts.push(toolCallTexts.join(\"\\n\\n\"));\n const message = parts.join(\"\\n\\n\");\n if (!message) continue;\n\n events.push({\n sessionId,\n eventType: isUser ? \"gemini.user\" : \"gemini.assistant\",\n kind: isUser ? \"user\" : \"assistant\",\n timestamp: msg.timestamp ?? fileTimestamp,\n message: toMessage(message),\n raw: {\n type: msg.type,\n id: msg.id,\n index: i,\n hasToolCalls: toolCallTexts.length > 0,\n toolCallCount: toolCallTexts.length,\n },\n });\n }\n\n return events;\n}\n","import { normalizeWhitespace, safeJsonParse, toMessage } from \"./utils.mjs\";\n\n// extract project slug from gstack path: ~/.gstack/projects/{slug}/...\nfunction extractGstackProjectSlug(filePath) {\n const match = filePath.match(/\\.gstack\\/projects\\/([^/]+)\\//);\n return match?.[1] ?? \"unknown-project\";\n}\n\n// detect gstack file type from filename\nfunction gstackFileType(filePath) {\n const base = filePath.split(\"/\").pop() ?? \"\";\n if (base === \"learnings.jsonl\") return \"learning\";\n if (base === \"timeline.jsonl\") return \"timeline\";\n if (base === \"resources-shown.jsonl\") return \"resource\";\n if (base.endsWith(\"-reviews.jsonl\")) return \"review\";\n return \"unknown\";\n}\n\n// parse a single JSONL line from a gstack artifact file\nexport function parseGstackLine({ line, filePath }) {\n const parsed = safeJsonParse(line);\n if (!parsed || typeof parsed !== \"object\") return null;\n\n const projectSlug = extractGstackProjectSlug(filePath);\n const fileType = gstackFileType(filePath);\n const timestamp = parsed.ts ?? parsed.timestamp ?? new Date().toISOString();\n\n // sessionId = project slug — one context per gstack project\n const sessionId = projectSlug;\n\n // skill learnings (insights, patterns, preferences)\n if (fileType === \"learning\") {\n const insight = normalizeWhitespace(parsed.insight);\n if (!insight) return null;\n const skill = parsed.skill ?? \"unknown\";\n const conf = typeof parsed.confidence === \"number\" ? ` [${parsed.confidence}/10]` : \"\";\n return {\n sessionId,\n eventType: `gstack.learning.${parsed.type ?? \"insight\"}`,\n kind: \"system\",\n timestamp,\n message: toMessage(`[${skill}]${conf} ${insight}`),\n raw: parsed,\n };\n }\n\n // skill execution timeline (started, completed)\n if (fileType === \"timeline\") {\n const skill = parsed.skill ?? \"unknown\";\n const event = parsed.event ?? \"unknown\";\n const branch = parsed.branch ? ` (${parsed.branch})` : \"\";\n const outcome = parsed.outcome ? ` → ${parsed.outcome}` : \"\";\n const duration = parsed.duration_s ? ` ${parsed.duration_s}s` : \"\";\n return {\n sessionId,\n eventType: `gstack.timeline.${event}`,\n kind: \"system\",\n timestamp,\n message: toMessage(`${skill} ${event}${branch}${outcome}${duration}`),\n raw: parsed,\n };\n }\n\n // code review records\n if (fileType === \"review\") {\n const skill = parsed.skill ?? \"review\";\n const score = parsed.overall_score != null ? ` score=${parsed.overall_score}` : \"\";\n const status = parsed.status ? ` [${parsed.status}]` : \"\";\n return {\n sessionId,\n eventType: \"gstack.review\",\n kind: \"system\",\n timestamp,\n message: toMessage(`${skill}${status}${score}`),\n raw: parsed,\n };\n }\n\n // external resources shown during sessions\n if (fileType === \"resource\") {\n const title = normalizeWhitespace(parsed.title);\n const url = parsed.url ?? \"\";\n if (!title && !url) return null;\n return {\n sessionId,\n eventType: \"gstack.resource\",\n kind: \"system\",\n timestamp,\n message: toMessage(title ? `${title} — ${url}` : url),\n raw: parsed,\n };\n }\n\n return null;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { asIso, claudeProjectDirName, expandHome, firstMessageTimestamp, normalizeRole } from \"../utils.mjs\";\n\n// validate UUID format\nfunction isUuid(value) {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n String(value ?? \"\").trim()\n );\n}\n\n// ensure we have a valid UUID, generate one if not\nfunction normalizeSessionUuid(raw) {\n const value = String(raw ?? \"\").trim();\n if (isUuid(value)) return value;\n return randomUUID();\n}\n\n// compute session file path under ~/.claude/projects/<project>/\nfunction claudeSessionFilePath(sessionId, cwd, baseDir) {\n const root = baseDir || expandHome(\"~/.claude/projects\");\n return path.join(root, claudeProjectDirName(cwd), `${sessionId}.jsonl`);\n}\n\n// check if a Claude Code session already exists locally\nexport async function hasLocalClaudeSession(sessionId, cwd = \"\", baseDir) {\n const id = String(sessionId ?? \"\").trim();\n if (!id) return false;\n\n // check preferred path first\n const preferredPath = claudeSessionFilePath(id, cwd || process.cwd(), baseDir);\n try {\n const stat = await fs.stat(preferredPath);\n if (stat.isFile()) return true;\n } catch {\n // fall through to glob\n }\n\n // dynamic import to avoid bundling fast-glob as hard dep\n const fg = (await import(\"fast-glob\")).default;\n const root = baseDir || expandHome(\"~/.claude/projects\");\n const pattern = path.join(root, `**/*${id}.jsonl`);\n const files = await fg([pattern], {\n onlyFiles: true,\n absolute: true,\n unique: true,\n suppressErrors: true,\n followSymbolicLinks: false,\n });\n return files.some((filePath) => path.basename(filePath, \".jsonl\") === id);\n}\n\n// check if raw entry is native Claude Code format\nfunction isNativeClaudeEntry(raw) {\n return raw && typeof raw === \"object\" && (\"type\" in raw) && (\"sessionId\" in raw || \"uuid\" in raw);\n}\n\n// write a Claude Code-native JSONL session file from UltraContext messages\nexport async function writeClaudeSession({ sessionId, cwd, messages, baseDir }) {\n const runCwd = String(cwd || process.cwd());\n const resolvedSessionId = normalizeSessionUuid(sessionId);\n const firstTs = asIso(firstMessageTimestamp(messages));\n const filePath = claudeSessionFilePath(resolvedSessionId, runCwd, baseDir);\n\n if (await hasLocalClaudeSession(resolvedSessionId, runCwd, baseDir)) {\n return {\n written: false,\n reason: \"already_exists\",\n filePath,\n sessionId: resolvedSessionId,\n };\n }\n\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n const lines = [];\n let parentUuid = null;\n\n for (let i = 0; i < (messages?.length ?? 0); i += 1) {\n const message = messages[i];\n const raw = message?.content?.raw;\n\n // native Claude Code entry — write back as-is with updated session linkage\n if (isNativeClaudeEntry(raw)) {\n const entryUuid = raw.uuid || randomUUID();\n lines.push(JSON.stringify({\n ...raw,\n parentUuid,\n sessionId: resolvedSessionId,\n }));\n parentUuid = entryUuid;\n continue;\n }\n\n // non-claude source (codex, openclaw) — convert to Claude Code format\n const normalizedRole = normalizeRole(message?.role);\n const role = normalizedRole === \"assistant\" ? \"assistant\" : normalizedRole === \"user\" ? \"user\" : \"assistant\";\n const text = extractMessageText(message, normalizedRole);\n if (!text) continue;\n\n const ts = asIso(\n message?.content?.timestamp ??\n message?.metadata?.timestamp ??\n new Date(new Date(firstTs).getTime() + i * 1000).toISOString()\n );\n const entryUuid = randomUUID();\n lines.push(JSON.stringify({\n parentUuid,\n isSidechain: false,\n userType: \"external\",\n cwd: runCwd,\n sessionId: resolvedSessionId,\n version: \"adapter\",\n gitBranch: \"\",\n type: role,\n message: { role, content: [{ type: \"text\", text }] },\n timestamp: ts,\n uuid: entryUuid,\n }));\n parentUuid = entryUuid;\n }\n\n // fallback if no messages\n if (lines.length === 0) {\n lines.push(JSON.stringify({\n parentUuid: null,\n isSidechain: false,\n userType: \"external\",\n cwd: runCwd,\n sessionId: resolvedSessionId,\n version: \"adapter\",\n gitBranch: \"\",\n type: \"assistant\",\n message: {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"[system] Session restored from UltraContext with no user/assistant messages.\" }],\n },\n timestamp: new Date().toISOString(),\n uuid: randomUUID(),\n }));\n }\n\n await fs.writeFile(filePath, `${lines.join(\"\\n\")}\\n`, \"utf8\");\n return {\n written: true,\n reason: \"created\",\n filePath,\n sessionId: resolvedSessionId,\n };\n } catch (error) {\n return {\n written: false,\n reason: \"write_failed\",\n filePath,\n sessionId: resolvedSessionId,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n// extract text from message, handling various formats\nfunction extractMessageText(message, normalizedRole) {\n const raw = message?.content?.raw;\n\n // codex response_item.message — extract from content array\n if (raw?.type === \"response_item\" && raw?.payload?.type === \"message\") {\n const parts = raw.payload.content ?? [];\n const text = parts.map(c => c.text ?? \"\").filter(Boolean).join(\"\\n\");\n if (text) return normalizedRole === \"system\" ? `[system] ${text}` : text;\n }\n\n // codex event_msg.user_message\n if (raw?.type === \"event_msg\" && raw?.payload?.type === \"user_message\") {\n return raw.payload.message ?? \"\";\n }\n\n // fallback — use stored message text\n const msg = message?.content?.message ?? \"\";\n if (!msg) return \"\";\n return normalizedRole === \"system\" ? `[system] ${msg}` : msg;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { asIso, coerceMessageText, expandHome, firstMessageTimestamp, normalizeRole } from \"../utils.mjs\";\n\n// build a single event_msg JSONL entry\nfunction buildEventMsgLine(message, fallbackTs) {\n const ts = asIso(message?.content?.timestamp ?? message?.metadata?.timestamp ?? fallbackTs);\n const role = normalizeRole(message?.role);\n const text = coerceMessageText(message).trim();\n if (!text) return null;\n\n if (role === \"user\") {\n return {\n timestamp: ts,\n type: \"event_msg\",\n payload: {\n type: \"user_message\",\n message: text,\n images: [],\n local_images: [],\n text_elements: [],\n },\n };\n }\n\n if (role === \"assistant\") {\n return {\n timestamp: ts,\n type: \"event_msg\",\n payload: { type: \"agent_message\", message: text },\n };\n }\n\n // system events\n return {\n timestamp: ts,\n type: \"event_msg\",\n payload: { type: \"agent_message\", message: `[system] ${text}` },\n };\n}\n\n// compute session file path under ~/.codex/sessions/YYYY/MM/DD/\nfunction sessionFilePath(sessionId, firstTimestamp, baseDir) {\n const iso = asIso(firstTimestamp);\n const [year, month, day] = iso.slice(0, 10).split(\"-\");\n const stamp = iso.replace(/\\.\\d{3}Z$/, \"\").replace(/:/g, \"-\").replace(\"Z\", \"\");\n const root = baseDir || expandHome(\"~/.codex/sessions\");\n const fileName = `rollout-${stamp}-${sessionId}.jsonl`;\n return path.join(root, year, month, day, fileName);\n}\n\n// check if a Codex session already exists locally\nexport async function hasLocalCodexSession(sessionId, baseDir) {\n const id = String(sessionId ?? \"\").trim();\n if (!id) return false;\n\n // dynamic import to avoid bundling fast-glob as hard dep\n const fg = (await import(\"fast-glob\")).default;\n const root = baseDir || expandHome(\"~/.codex/sessions\");\n const pattern = path.join(root, `**/*${id}*.jsonl`);\n const files = await fg([pattern], {\n onlyFiles: true,\n absolute: true,\n unique: true,\n suppressErrors: true,\n followSymbolicLinks: false,\n });\n return files.some((filePath) => filePath.includes(id));\n}\n\n// write a Codex-native JSONL session file from UltraContext messages\nexport async function writeCodexSession({ sessionId, cwd, messages, baseDir }) {\n const id = String(sessionId ?? \"\").trim();\n if (!id) return { written: false, reason: \"missing_session_id\", filePath: \"\", sessionId: \"\" };\n\n if (await hasLocalCodexSession(id, baseDir)) {\n return { written: false, reason: \"already_exists\", filePath: \"\", sessionId: id };\n }\n\n const firstMessageTs = firstMessageTimestamp(messages);\n const firstTs = asIso(firstMessageTs);\n const filePath = sessionFilePath(id, firstTs, baseDir);\n\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n // session_meta header\n const lines = [];\n lines.push(\n JSON.stringify({\n timestamp: firstTs,\n type: \"session_meta\",\n payload: {\n id,\n timestamp: firstTs,\n cwd: cwd || process.cwd(),\n originator: \"ultracontext_daemon\",\n cli_version: \"restored\",\n source: \"cli\",\n model_provider: \"openai\",\n },\n })\n );\n\n // event messages\n let emitted = 0;\n for (let i = 0; i < (messages?.length ?? 0); i += 1) {\n const fallbackTs = new Date(new Date(firstTs).getTime() + i * 1000).toISOString();\n const line = buildEventMsgLine(messages[i], fallbackTs);\n if (!line) continue;\n lines.push(JSON.stringify(line));\n emitted += 1;\n }\n\n // fallback if no messages\n if (emitted === 0) {\n lines.push(\n JSON.stringify({\n timestamp: new Date().toISOString(),\n type: \"event_msg\",\n payload: {\n type: \"agent_message\",\n message: \"[system] Session restored from UltraContext with no user/assistant messages.\",\n },\n })\n );\n }\n\n await fs.writeFile(filePath, `${lines.join(\"\\n\")}\\n`, \"utf8\");\n return { written: true, reason: \"created\", filePath, sessionId: id };\n } catch (error) {\n return {\n written: false,\n reason: \"write_failed\",\n filePath,\n sessionId: id,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { parseClaudeCodeLine } from \"./agents/claude.mjs\";\nimport { parseCodexLine } from \"./agents/codex.mjs\";\nimport { writeCodexSession } from \"./writers/codex.mjs\";\nimport { writeClaudeSession } from \"./writers/claude.mjs\";\nimport { claudeProjectDirName, expandHome, extractSessionIdFromPath, isSafeCwd } from \"./utils.mjs\";\n\n// reject sessions larger than this — prevents OOM on crafted/huge JSONL\nconst MAX_SESSION_BYTES = 256 * 1024 * 1024;\n\n// find latest .jsonl file matching a glob pattern\nasync function findLatestSession(pattern, excludePattern) {\n const fg = (await import(\"fast-glob\")).default;\n const files = await fg([pattern], {\n onlyFiles: true,\n absolute: true,\n unique: true,\n suppressErrors: true,\n followSymbolicLinks: false,\n ignore: excludePattern ? [excludePattern] : [],\n stats: true,\n });\n if (!files.length) return null;\n\n // sort by mtime descending, pick latest\n files.sort((a, b) => (b.stats?.mtimeMs ?? 0) - (a.stats?.mtimeMs ?? 0));\n return files[0].path;\n}\n\n// auto-detect latest session file for a given agent\n// baseDirs override lets tests point at tmp roots instead of ~/.claude or ~/.codex\nasync function resolveSessionPath(source, cwd, baseDirs = {}) {\n if (source === \"claude\") {\n const projectDir = claudeProjectDirName(cwd);\n const root = baseDirs.claude || expandHome(\"~/.claude/projects\");\n const pattern = path.join(root, projectDir, \"*.jsonl\");\n return findLatestSession(pattern, \"**/subagents/**\");\n }\n\n if (source === \"codex\") {\n const root = baseDirs.codex || expandHome(\"~/.codex/sessions\");\n const pattern = path.join(root, \"**/*.jsonl\");\n return findLatestSession(pattern);\n }\n\n return null;\n}\n\n// read and parse a local agent session file\nexport async function readLocalSession({ source, sessionPath, cwd, sourceRoots }) {\n const resolvedCwd = cwd || process.cwd();\n\n // resolve session file path — sourceRoots lets callers/tests override ~/.claude + ~/.codex\n const filePath = sessionPath || (await resolveSessionPath(source, resolvedCwd, sourceRoots));\n if (!filePath) {\n throw new Error(`No ${source} session found. Specify --session <path>.`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Session file not found: ${filePath}`);\n }\n\n // stat via lstat to detect symlinks / special files before read\n const stat = fs.lstatSync(filePath);\n if (!stat.isFile()) {\n throw new Error(`Session path is not a regular file: ${filePath}`);\n }\n if (stat.size > MAX_SESSION_BYTES) {\n throw new Error(`Session file too large: ${stat.size} bytes (max ${MAX_SESSION_BYTES}).`);\n }\n\n // read and parse lines\n const raw = fs.readFileSync(filePath, \"utf8\");\n const lines = raw.split(\"\\n\").filter((l) => l.trim());\n const parser = source === \"claude\" ? parseClaudeCodeLine : parseCodexLine;\n\n const messages = [];\n let extractedCwd = null;\n let sessionId = null;\n\n for (const line of lines) {\n const parsed = parser({ line, filePath });\n if (!parsed) continue;\n\n // capture session id\n if (!sessionId && parsed.sessionId) sessionId = parsed.sessionId;\n\n // extract cwd from metadata entries — only accept safe absolute paths (shell sink)\n if (source === \"claude\" && parsed.raw?.cwd && !extractedCwd && isSafeCwd(parsed.raw.cwd)) {\n extractedCwd = parsed.raw.cwd;\n }\n if (\n source === \"codex\" &&\n parsed.raw?.type === \"session_meta\" &&\n !extractedCwd &&\n isSafeCwd(parsed.raw.payload?.cwd)\n ) {\n extractedCwd = parsed.raw.payload.cwd;\n }\n\n // only keep user/assistant messages\n if (parsed.kind === \"user\" || parsed.kind === \"assistant\") {\n messages.push(parsed);\n }\n }\n\n return {\n messages,\n sessionId: sessionId || extractSessionIdFromPath(filePath),\n cwd: extractedCwd || resolvedCwd,\n filePath,\n };\n}\n\n// convert parsed messages to writer format\nfunction toWriterMessages(messages, source) {\n return messages.map((m) => ({\n role: m.kind,\n content: {\n message: typeof m.message === \"string\" ? m.message : m.message ?? \"\",\n timestamp: m.timestamp,\n raw: m.raw,\n },\n metadata: { source },\n }));\n}\n\n// switch a session from one agent to another\n// baseDir: override target writer's output root (for tests)\n// sourceRoots: { claude, codex } override source auto-detect roots (for tests)\nexport async function switchSession({ source, target, sessionPath, cwd, last, baseDir, sourceRoots }) {\n const session = await readLocalSession({ source, sessionPath, cwd, sourceRoots });\n\n // optionally slice to last N messages\n let msgs = session.messages;\n if (typeof last === \"number\" && last > 0) {\n msgs = msgs.slice(-last);\n }\n\n // convert to writer format\n const writerMessages = toWriterMessages(msgs, source);\n const firstId = randomUUID();\n\n // pick writer\n const writer = target === \"codex\" ? writeCodexSession : writeClaudeSession;\n let result = await writer({\n sessionId: firstId,\n cwd: session.cwd,\n messages: writerMessages,\n baseDir,\n });\n let usedId = firstId;\n\n // retry with fresh UUID if already exists\n if (!result.written && result.reason === \"already_exists\") {\n const retryId = randomUUID();\n result = await writer({\n sessionId: retryId,\n cwd: session.cwd,\n messages: writerMessages,\n baseDir,\n });\n usedId = retryId;\n }\n\n return {\n written: result.written,\n filePath: result.filePath,\n // only claim a sessionId when write actually succeeded\n sessionId: result.written ? (result.sessionId || usedId) : null,\n messageCount: writerMessages.length,\n reason: result.reason,\n cwd: session.cwd,\n };\n}\n","// shared utils\nexport { expandHome, truncateString, safeJsonParse, extractSessionIdFromPath, stripIDEContextTags } from \"./utils.mjs\";\n\n// agent session parsers\nexport { parseClaudeCodeLine, extractClaudeTextContent } from \"./agents/claude.mjs\";\nexport { parseCodexLine } from \"./agents/codex.mjs\";\nexport { parseOpenClawLine } from \"./agents/openclaw.mjs\";\nexport { parseCursorLine } from \"./agents/cursor.mjs\";\nexport { parseGeminiFile, extractGeminiTextContent } from \"./agents/gemini.mjs\";\n\n// tool artifact parsers\nexport { parseGstackLine } from \"./gstack.mjs\";\nexport { parseGenericJsonlLine } from \"./generic.mjs\";\n\n// post-processing utilities\nexport { extractModifiedFiles } from \"./extract-modified-files.mjs\";\nexport { extractClaudeTokenUsage } from \"./token-usage.mjs\";\n\n// writers: UltraContext → agent JSONL\nexport { writeClaudeSession, hasLocalClaudeSession } from \"./writers/claude.mjs\";\nexport { writeCodexSession, hasLocalCodexSession } from \"./writers/codex.mjs\";\n\n// switch: cross-agent session portability\nexport { switchSession, readLocalSession } from \"./switch.mjs\";\n\n// compatibility matrix\nexport { AGENT_COMPAT, isResumePairTested, getTestedVersions } from \"./compat.mjs\";\n"],"mappings":"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"}