ultracontext 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-DzUz8GPJ.mjs","names":[],"sources":["../../../packages/parsers/src/agents/claude.mjs","../../../packages/parsers/src/agents/codex.mjs","../../../packages/parsers/src/agents/openclaw.mjs","../../../packages/parsers/src/gstack.mjs","../../../packages/parsers/src/writers/claude.mjs","../../../packages/parsers/src/writers/codex.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 { 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, coerceMessageText, 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// build Claude Code project directory name from cwd\nfunction claudeProjectDirName(cwd) {\n const resolved = path.resolve(String(cwd || process.cwd()));\n return resolved.replace(/[\\\\/]/g, \"-\").replace(/[^A-Za-z0-9._-]/g, \"-\");\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// 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 // build linked-list of message entries\n const lines = [];\n let parentUuid = null;\n for (let i = 0; i < (messages?.length ?? 0); i += 1) {\n const message = messages[i];\n const normalizedRole = normalizeRole(message?.role);\n const role = normalizedRole === \"assistant\" ? \"assistant\" : normalizedRole === \"user\" ? \"user\" : \"assistant\";\n const rawText = coerceMessageText(message).trim();\n if (!rawText) continue;\n const text = normalizedRole === \"system\" ? `[system] ${rawText}` : rawText;\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(\n 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: text },\n timestamp: ts,\n uuid: entryUuid,\n })\n );\n parentUuid = entryUuid;\n }\n\n // fallback if no messages\n if (lines.length === 0) {\n const entryUuid = randomUUID();\n lines.push(\n 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: \"[system] Session restored from UltraContext with no user/assistant messages.\",\n },\n timestamp: new Date().toISOString(),\n uuid: entryUuid,\n })\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","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: \"\" };\n\n if (await hasLocalCodexSession(id, baseDir)) {\n return { written: false, reason: \"already_exists\", filePath: \"\" };\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 };\n } catch (error) {\n return {\n written: false,\n reason: \"write_failed\",\n filePath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { a as UC_CLAUDE_ORANGE, c as heroArtForWidth, i as UC_BRAND_BLUE, n as MENU_TABS, o as UC_CODEX_BLUE, r as UC_BLUE_LIGHT, s as UC_OPENCLAW_RED, t as Spinner } from "./Spinner-C_38udz8.mjs";
2
- import { a as parseDaemonWsMessage, c as resolveDaemonWsInfoFile, i as normalizeBootstrapMode, s as resolveDaemonWsHost, t as DAEMON_WS_MESSAGE_TYPES } from "./src-Xh68VkBy.mjs";
2
+ import { a as parseDaemonWsMessage, c as resolveDaemonWsInfoFile, f as expandHome, i as normalizeBootstrapMode, s as resolveDaemonWsHost, t as DAEMON_WS_MESSAGE_TYPES } from "./src-BSCJv6SU.mjs";
3
+ import { i as writeClaudeSession, n as writeCodexSession, r as hasLocalClaudeSession, t as hasLocalCodexSession } from "./src-DzUz8GPJ.mjs";
3
4
  import process$1 from "node:process";
4
5
  import { fileURLToPath } from "node:url";
5
6
  import path from "node:path";
@@ -9,297 +10,11 @@ import { spawn, spawnSync } from "node:child_process";
9
10
  import React from "react";
10
11
  import { Box, Text, render, useInput, useStdout } from "ink";
11
12
  import { TitledBox } from "@mishieck/ink-titled-box";
12
- import crypto, { randomUUID } from "node:crypto";
13
+ import crypto from "node:crypto";
13
14
  import fs$1 from "node:fs/promises";
14
- import fg from "fast-glob";
15
15
  import { UltraContext } from "ultracontext";
16
16
  import WebSocket from "ws";
17
17
 
18
- //#region ../tui/src/utils.mjs
19
- function expandHome(inputPath) {
20
- if (!inputPath || !inputPath.startsWith("~")) return inputPath;
21
- if (inputPath === "~") return os.homedir();
22
- if (inputPath.startsWith("~/")) return path.join(os.homedir(), inputPath.slice(2));
23
- return inputPath;
24
- }
25
- function toInt(value, fallback) {
26
- const parsed = Number.parseInt(String(value ?? ""), 10);
27
- return Number.isFinite(parsed) ? parsed : fallback;
28
- }
29
- function boolFromEnv(value, fallback = false) {
30
- if (value === void 0) return fallback;
31
- const normalized = String(value).trim().toLowerCase();
32
- if ([
33
- "1",
34
- "true",
35
- "yes",
36
- "on"
37
- ].includes(normalized)) return true;
38
- if ([
39
- "0",
40
- "false",
41
- "no",
42
- "off"
43
- ].includes(normalized)) return false;
44
- return fallback;
45
- }
46
-
47
- //#endregion
48
- //#region ../tui/src/codex-local-resume.mjs
49
- function asIso(value) {
50
- if (!value) return (/* @__PURE__ */ new Date()).toISOString();
51
- const d = new Date(String(value));
52
- if (Number.isNaN(d.getTime())) return (/* @__PURE__ */ new Date()).toISOString();
53
- return d.toISOString();
54
- }
55
- function coerceMessageText(message) {
56
- const content = message?.content;
57
- if (typeof content === "string") return content;
58
- if (content && typeof content === "object") {
59
- if (typeof content.message === "string") return content.message;
60
- if (typeof content.text === "string") return content.text;
61
- if (typeof content.raw === "string") return content.raw;
62
- }
63
- if (typeof message?.message === "string") return message.message;
64
- return "";
65
- }
66
- function normalizeRole$1(role) {
67
- const lowered = String(role ?? "").toLowerCase();
68
- if (["user", "human"].includes(lowered)) return "user";
69
- if ([
70
- "assistant",
71
- "agent",
72
- "ai"
73
- ].includes(lowered)) return "assistant";
74
- return "system";
75
- }
76
- function firstMessageTimestamp(messages) {
77
- return messages?.[0]?.content?.timestamp ?? messages?.[0]?.metadata?.timestamp ?? (/* @__PURE__ */ new Date()).toISOString();
78
- }
79
- function buildEventMsgLine(message, fallbackTs) {
80
- const ts = asIso(message?.content?.timestamp ?? message?.metadata?.timestamp ?? fallbackTs);
81
- const role = normalizeRole$1(message?.role);
82
- const text = coerceMessageText(message).trim();
83
- if (!text) return null;
84
- if (role === "user") return {
85
- timestamp: ts,
86
- type: "event_msg",
87
- payload: {
88
- type: "user_message",
89
- message: text,
90
- images: [],
91
- local_images: [],
92
- text_elements: []
93
- }
94
- };
95
- if (role === "assistant") return {
96
- timestamp: ts,
97
- type: "event_msg",
98
- payload: {
99
- type: "agent_message",
100
- message: text
101
- }
102
- };
103
- return {
104
- timestamp: ts,
105
- type: "event_msg",
106
- payload: {
107
- type: "agent_message",
108
- message: `[system] ${text}`
109
- }
110
- };
111
- }
112
- function sessionFilePath(sessionId, firstTimestamp) {
113
- const iso = asIso(firstTimestamp);
114
- const [year, month, day] = iso.slice(0, 10).split("-");
115
- const stamp = iso.replace(/\.\d{3}Z$/, "").replace(/:/g, "-").replace("Z", "");
116
- const baseDir = expandHome("~/.codex/sessions");
117
- const fileName = `rollout-${stamp}-${sessionId}.jsonl`;
118
- return path.join(baseDir, year, month, day, fileName);
119
- }
120
- async function hasLocalCodexSession(sessionId) {
121
- const id = String(sessionId ?? "").trim();
122
- if (!id) return false;
123
- return (await fg([expandHome(`~/.codex/sessions/**/*${id}*.jsonl`)], {
124
- onlyFiles: true,
125
- absolute: true,
126
- unique: true,
127
- suppressErrors: true,
128
- followSymbolicLinks: false
129
- })).some((filePath) => filePath.includes(id));
130
- }
131
- async function materializeCodexSession({ sessionId, cwd, messages }) {
132
- const id = String(sessionId ?? "").trim();
133
- if (!id) return {
134
- written: false,
135
- reason: "missing_session_id",
136
- filePath: ""
137
- };
138
- if (await hasLocalCodexSession(id)) return {
139
- written: false,
140
- reason: "already_exists",
141
- filePath: ""
142
- };
143
- const firstTs = asIso(firstMessageTimestamp(messages));
144
- const filePath = sessionFilePath(id, firstTs);
145
- try {
146
- await fs$1.mkdir(path.dirname(filePath), { recursive: true });
147
- const lines = [];
148
- lines.push(JSON.stringify({
149
- timestamp: firstTs,
150
- type: "session_meta",
151
- payload: {
152
- id,
153
- timestamp: firstTs,
154
- cwd: cwd || process.cwd(),
155
- originator: "ultracontext_daemon",
156
- cli_version: "restored",
157
- source: "cli",
158
- model_provider: "openai"
159
- }
160
- }));
161
- let emitted = 0;
162
- for (let i = 0; i < (messages?.length ?? 0); i += 1) {
163
- const fallbackTs = new Date(new Date(firstTs).getTime() + i * 1e3).toISOString();
164
- const line = buildEventMsgLine(messages[i], fallbackTs);
165
- if (!line) continue;
166
- lines.push(JSON.stringify(line));
167
- emitted += 1;
168
- }
169
- if (emitted === 0) lines.push(JSON.stringify({
170
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
171
- type: "event_msg",
172
- payload: {
173
- type: "agent_message",
174
- message: "[system] Session restored from UltraContext with no user/assistant messages."
175
- }
176
- }));
177
- await fs$1.writeFile(filePath, `${lines.join("\n")}\n`, "utf8");
178
- return {
179
- written: true,
180
- reason: "created",
181
- filePath
182
- };
183
- } catch (error) {
184
- return {
185
- written: false,
186
- reason: "write_failed",
187
- filePath,
188
- error: error instanceof Error ? error.message : String(error)
189
- };
190
- }
191
- }
192
- function isUuid(value) {
193
- 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(String(value ?? "").trim());
194
- }
195
- function normalizeSessionUuid(raw) {
196
- const value = String(raw ?? "").trim();
197
- if (isUuid(value)) return value;
198
- return randomUUID();
199
- }
200
- function claudeProjectDirName(cwd) {
201
- return path.resolve(String(cwd || process.cwd())).replace(/[\\/]/g, "-").replace(/[^A-Za-z0-9._-]/g, "-");
202
- }
203
- function claudeSessionFilePath(sessionId, cwd) {
204
- const baseDir = expandHome("~/.claude/projects");
205
- return path.join(baseDir, claudeProjectDirName(cwd), `${sessionId}.jsonl`);
206
- }
207
- async function hasLocalClaudeSession(sessionId, cwd = "") {
208
- const id = String(sessionId ?? "").trim();
209
- if (!id) return false;
210
- const preferredPath = claudeSessionFilePath(id, cwd || process.cwd());
211
- try {
212
- if ((await fs$1.stat(preferredPath)).isFile()) return true;
213
- } catch {}
214
- return (await fg([expandHome(`~/.claude/projects/**/*${id}.jsonl`)], {
215
- onlyFiles: true,
216
- absolute: true,
217
- unique: true,
218
- suppressErrors: true,
219
- followSymbolicLinks: false
220
- })).some((filePath) => path.basename(filePath, ".jsonl") === id);
221
- }
222
- async function materializeClaudeSession({ sessionId, cwd, messages }) {
223
- const runCwd = String(cwd || process.cwd());
224
- const resolvedSessionId = normalizeSessionUuid(sessionId);
225
- const firstTs = asIso(firstMessageTimestamp(messages));
226
- const filePath = claudeSessionFilePath(resolvedSessionId, runCwd);
227
- if (await hasLocalClaudeSession(resolvedSessionId, runCwd)) return {
228
- written: false,
229
- reason: "already_exists",
230
- filePath,
231
- sessionId: resolvedSessionId
232
- };
233
- try {
234
- await fs$1.mkdir(path.dirname(filePath), { recursive: true });
235
- const lines = [];
236
- let parentUuid = null;
237
- for (let i = 0; i < (messages?.length ?? 0); i += 1) {
238
- const message = messages[i];
239
- const normalizedRole = normalizeRole$1(message?.role);
240
- const role = normalizedRole === "assistant" ? "assistant" : normalizedRole === "user" ? "user" : "assistant";
241
- const rawText = coerceMessageText(message).trim();
242
- if (!rawText) continue;
243
- const text = normalizedRole === "system" ? `[system] ${rawText}` : rawText;
244
- const ts = asIso(message?.content?.timestamp ?? message?.metadata?.timestamp ?? new Date(new Date(firstTs).getTime() + i * 1e3).toISOString());
245
- const entryUuid = randomUUID();
246
- const entry = {
247
- parentUuid,
248
- isSidechain: false,
249
- userType: "external",
250
- cwd: runCwd,
251
- sessionId: resolvedSessionId,
252
- version: "adapter",
253
- gitBranch: "",
254
- type: role,
255
- message: {
256
- role,
257
- content: text
258
- },
259
- timestamp: ts,
260
- uuid: entryUuid
261
- };
262
- lines.push(JSON.stringify(entry));
263
- parentUuid = entryUuid;
264
- }
265
- if (lines.length === 0) {
266
- const entryUuid = randomUUID();
267
- lines.push(JSON.stringify({
268
- parentUuid: null,
269
- isSidechain: false,
270
- userType: "external",
271
- cwd: runCwd,
272
- sessionId: resolvedSessionId,
273
- version: "adapter",
274
- gitBranch: "",
275
- type: "assistant",
276
- message: {
277
- role: "assistant",
278
- content: "[system] Session restored from UltraContext with no user/assistant messages."
279
- },
280
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
281
- uuid: entryUuid
282
- }));
283
- }
284
- await fs$1.writeFile(filePath, `${lines.join("\n")}\n`, "utf8");
285
- return {
286
- written: true,
287
- reason: "created",
288
- filePath,
289
- sessionId: resolvedSessionId
290
- };
291
- } catch (error) {
292
- return {
293
- written: false,
294
- reason: "write_failed",
295
- filePath,
296
- sessionId: resolvedSessionId,
297
- error: error instanceof Error ? error.message : String(error)
298
- };
299
- }
300
- }
301
-
302
- //#endregion
303
18
  //#region ../tui/src/ui/layout.mjs
304
19
  function computeTuiLayout(stdoutColumns, stdoutRows) {
305
20
  const safeCols = Math.max(Math.floor(Number(stdoutColumns) || 0), 1);
@@ -1248,7 +963,7 @@ function HeaderPanel({ snapshot, stdoutColumns }) {
1248
963
  }, []);
1249
964
  const health = snapshot.stats.errors > 0 ? "DEGRADED" : "HEALTHY";
1250
965
  const healthColor = health === "HEALTHY" ? "green" : "yellow";
1251
- const tagline = "The Context Hub for AI Agents";
966
+ const tagline = "Same context, everywhere";
1252
967
  const innerWidth = Math.max(stdoutColumns, 40);
1253
968
  const spinnerVisualWidth = 28;
1254
969
  const gap = innerWidth >= 96 ? 3 : 2;
@@ -1764,6 +1479,30 @@ function createInkUiController({ getSnapshot, actions }) {
1764
1479
  };
1765
1480
  }
1766
1481
 
1482
+ //#endregion
1483
+ //#region ../tui/src/utils.mjs
1484
+ function toInt(value, fallback) {
1485
+ const parsed = Number.parseInt(String(value ?? ""), 10);
1486
+ return Number.isFinite(parsed) ? parsed : fallback;
1487
+ }
1488
+ function boolFromEnv(value, fallback = false) {
1489
+ if (value === void 0) return fallback;
1490
+ const normalized = String(value).trim().toLowerCase();
1491
+ if ([
1492
+ "1",
1493
+ "true",
1494
+ "yes",
1495
+ "on"
1496
+ ].includes(normalized)) return true;
1497
+ if ([
1498
+ "0",
1499
+ "false",
1500
+ "no",
1501
+ "off"
1502
+ ].includes(normalized)) return false;
1503
+ return fallback;
1504
+ }
1505
+
1767
1506
  //#endregion
1768
1507
  //#region ../tui/src/ws-client.mjs
1769
1508
  function sleep(ms) {
@@ -2934,7 +2673,7 @@ async function tuiBoot({ assetsRoot, offlineNotice, onFatalError } = {}) {
2934
2673
  let restoredPath = "";
2935
2674
  let restoredError = "";
2936
2675
  if (!canResumeBySessionId && originalSessionId) {
2937
- const restored = await materializeCodexSession({
2676
+ const restored = await writeCodexSession({
2938
2677
  sessionId: originalSessionId,
2939
2678
  cwd: runCwd,
2940
2679
  messages
@@ -2958,7 +2697,7 @@ async function tuiBoot({ assetsRoot, offlineNotice, onFatalError } = {}) {
2958
2697
  let restoredPath = "";
2959
2698
  let restoredError = "";
2960
2699
  if (!canResumeBySessionId || !candidateSessionId) {
2961
- const restored = await materializeClaudeSession({
2700
+ const restored = await writeClaudeSession({
2962
2701
  sessionId: candidateSessionId,
2963
2702
  cwd: runCwd,
2964
2703
  messages
@@ -3684,4 +3423,4 @@ async function tuiBoot({ assetsRoot, offlineNotice, onFatalError } = {}) {
3684
3423
 
3685
3424
  //#endregion
3686
3425
  export { tuiBoot };
3687
- //# sourceMappingURL=tui-DNqvslCq.mjs.map
3426
+ //# sourceMappingURL=tui-C3H6iRjz.mjs.map