ultracontext 1.4.13 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-sync.mjs","names":["fs","fs","process","fs","fsSync"],"sources":["../../../sync/src/store.mjs","../../../sync/src/redact.mjs","../../../../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","../../../sync/src/daemon.mjs","../../src/cli/sdk-sync.mjs"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport { expandHome } from \"./utils.mjs\";\n\nconst DEFAULT_DB_PATH = \"~/.ultracontext/daemon.db\";\n\nfunction ensureParentDir(filePath) {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nfunction parseNumber(value, fallback = 0) {\n const num = Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(num) ? num : fallback;\n}\n\nfunction parseBool(value, fallback = false) {\n if (value === null || value === undefined) return fallback;\n const normalized = String(value).trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n return fallback;\n}\n\nexport function resolveDbPath(env = process.env) {\n return expandHome(env.ULTRACONTEXT_DB_FILE ?? DEFAULT_DB_PATH);\n}\n\nexport function createStore({ dbPath = resolveDbPath(process.env) } = {}) {\n const resolvedPath = path.resolve(dbPath);\n ensureParentDir(resolvedPath);\n\n const db = new DatabaseSync(resolvedPath);\n db.exec(\"PRAGMA journal_mode = WAL\");\n db.exec(\"PRAGMA synchronous = NORMAL\");\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS seen_events (\n event_hash TEXT PRIMARY KEY,\n created_at INTEGER DEFAULT (unixepoch()),\n expires_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS file_offsets (\n file_key TEXT PRIMARY KEY,\n offset_value INTEGER DEFAULT 0,\n updated_at INTEGER DEFAULT (unixepoch())\n );\n\n CREATE TABLE IF NOT EXISTS context_cache (\n cache_key TEXT PRIMARY KEY,\n context_id TEXT NOT NULL,\n updated_at INTEGER DEFAULT (unixepoch())\n );\n `);\n\n const stmt = {\n markSeen: db.prepare(`\n INSERT OR IGNORE INTO seen_events (event_hash, expires_at)\n VALUES (?, ?)\n `),\n deleteSeenIfExpired: db.prepare(`\n DELETE FROM seen_events\n WHERE event_hash = ? AND expires_at <= unixepoch()\n `),\n cleanupSeen: db.prepare(`\n DELETE FROM seen_events\n WHERE expires_at <= unixepoch()\n `),\n getSeen: db.prepare(`\n SELECT event_hash\n FROM seen_events\n WHERE event_hash = ? AND expires_at > unixepoch()\n LIMIT 1\n `),\n getOffset: db.prepare(`\n SELECT offset_value\n FROM file_offsets\n WHERE file_key = ?\n LIMIT 1\n `),\n setOffset: db.prepare(`\n INSERT INTO file_offsets (file_key, offset_value, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(file_key) DO UPDATE SET\n offset_value = excluded.offset_value,\n updated_at = unixepoch()\n `),\n getContextCache: db.prepare(`\n SELECT context_id\n FROM context_cache\n WHERE cache_key = ?\n LIMIT 1\n `),\n setContextCache: db.prepare(`\n INSERT INTO context_cache (cache_key, context_id, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(cache_key) DO UPDATE SET\n context_id = excluded.context_id,\n updated_at = unixepoch()\n `),\n };\n\n // manual transaction wrapper (node:sqlite has no .transaction() helper)\n function markEventSeenTxn(eventHash, ttlSeconds) {\n db.exec(\"BEGIN\");\n try {\n stmt.deleteSeenIfExpired.run(eventHash);\n const expiresAt = Math.floor(Date.now() / 1000) + Math.max(parseNumber(ttlSeconds, 60), 1);\n const result = stmt.markSeen.run(eventHash, expiresAt);\n db.exec(\"COMMIT\");\n return result.changes === 1;\n } catch (error) {\n db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n return {\n dbPath: resolvedPath,\n markEventSeen(eventHash, ttlSeconds) {\n return markEventSeenTxn(String(eventHash ?? \"\"), ttlSeconds);\n },\n isEventSeen(eventHash) {\n return Boolean(stmt.getSeen.get(String(eventHash ?? \"\")));\n },\n cleanupExpired() {\n stmt.cleanupSeen.run();\n },\n getOffset(fileKey) {\n const row = stmt.getOffset.get(String(fileKey ?? \"\"));\n return row ? parseNumber(row.offset_value, 0) : 0;\n },\n setOffset(fileKey, value) {\n stmt.setOffset.run(String(fileKey ?? \"\"), parseNumber(value, 0));\n },\n getContextCache(cacheKey) {\n const row = stmt.getContextCache.get(String(cacheKey ?? \"\"));\n return row ? String(row.context_id ?? \"\") : \"\";\n },\n setContextCache(cacheKey, contextId) {\n stmt.setContextCache.run(String(cacheKey ?? \"\"), String(contextId ?? \"\"));\n },\n close() {\n db.close();\n },\n };\n}\n","import { truncateString } from \"./utils.mjs\";\n\nconst REDACTED = \"***REDACTED***\";\n\nconst SENSITIVE_KEY_REGEX = /(token|secret|password|api[-_]?key|authorization|cookie|session[-_]?key)/i;\n\nconst SECRET_PATTERNS = [\n { regex: /\\buc_(live|test)_[A-Za-z0-9_-]+\\b/g, replacement: \"uc_$1_***\" },\n { regex: /\\bsk-[A-Za-z0-9_-]{12,}\\b/g, replacement: \"sk-***\" },\n { regex: /\\bBearer\\s+[A-Za-z0-9._-]{8,}\\b/gi, replacement: \"Bearer ***\" },\n {\n regex: /\\bAIza[0-9A-Za-z\\-_]{20,}\\b/g,\n replacement: \"AIza***\",\n },\n];\n\nfunction redactString(value) {\n let output = truncateString(value, 8000);\n for (const { regex, replacement } of SECRET_PATTERNS) {\n output = output.replace(regex, replacement);\n }\n return output;\n}\n\nexport function redact(value, currentKey = \"\") {\n if (value === null || value === undefined) return value;\n\n if (typeof value === \"string\") {\n return SENSITIVE_KEY_REGEX.test(currentKey) ? REDACTED : redactString(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => redact(item));\n }\n\n if (typeof value === \"object\") {\n const out = {};\n for (const [key, raw] of Object.entries(value)) {\n out[key] = SENSITIVE_KEY_REGEX.test(key) ? REDACTED : redact(raw, key);\n }\n return out;\n }\n\n return REDACTED;\n}\n","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","// daemon core — receives store factory as param so callers control env/sqlite\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { spawnSync } from \"node:child_process\";\n\nimport fg from \"fast-glob\";\nimport { UltraContext } from \"ultracontext\";\nimport {\n createBootstrapStateKey,\n normalizeBootstrapMode,\n parseProtocolJson,\n} from \"./protocol.mjs\";\n\nimport { acquireFileLock, resolveLockPath } from \"./lock.mjs\";\nimport { redact } from \"./redact.mjs\";\nimport { parseClaudeCodeLine, parseCodexLine, parseGstackLine, parseOpenClawLine } from \"@ultracontext/parsers\";\nimport { boolFromEnv, expandHome, extractProjectPathFromFile, sha256, toInt } from \"./utils.mjs\";\n\nconst LOG_LEVELS = { error: 0, warn: 1, info: 2, debug: 3 };\nconst DEFAULT_RUNTIME_CONFIG_FILE = \"~/.ultracontext/config.json\";\nconst BOOTSTRAP_OPTIONS = [\n { id: \"new_only\", label: \"New only (recommended)\" },\n { id: \"last_24h\", label: \"Last 24h\" },\n { id: \"all\", label: \"All\" },\n { id: \"prompt\", label: \"Ask on startup\" },\n];\nconst cliArgs = new Set(process.argv.slice(2));\n\n// file-based IPC paths\nconst STATUS_FILE = path.join(os.homedir(), \".ultracontext\", \"status.json\");\nconst CONFIG_FILE = path.join(os.homedir(), \".ultracontext\", \"config.json\");\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n gray: \"\\x1b[90m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n};\n\nfunction shouldUseColor() {\n return Boolean(process.stdout?.isTTY) && !boolFromEnv(process.env.NO_COLOR, false);\n}\n\nfunction levelColor(level) {\n if (level === \"error\") return ANSI.red;\n if (level === \"warn\") return ANSI.yellow;\n if (level === \"debug\") return ANSI.gray;\n return ANSI.cyan;\n}\n\nfunction colorize(text, color) {\n if (!shouldUseColor()) return String(text ?? \"\");\n return `${color}${String(text ?? \"\")}${ANSI.reset}`;\n}\n\nfunction normalizeApiKey(raw) {\n if (!raw) return \"\";\n return String(raw).trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction resolveRuntimeConfigPath() {\n return expandHome(process.env.ULTRACONTEXT_CONFIG_FILE ?? DEFAULT_RUNTIME_CONFIG_FILE);\n}\n\nfunction normalizeBootstrapModeWithPrompt(raw) {\n return normalizeBootstrapMode(raw, { allowPrompt: true }) || \"\";\n}\n\n// ── file-based IPC helpers ─────────────────────────────────────\n\nasync function writeStatusJson(cfg, stats, state, runtime) {\n const snapshot = {\n pid: process.pid,\n startedAt: new Date(stats.startedAt).toISOString(),\n updatedAt: new Date().toISOString(),\n host: cfg.host,\n userId: cfg.userId,\n mode: runtime.ingestMode,\n running: runtime.daemonRunning,\n stats: { ...stats },\n sources: state.sourceOrder.map(name => {\n const s = state.sourceStats.get(name) || {};\n return { name, ...s };\n }),\n recentLogs: state.recentLogs.slice(-240),\n config: { bootstrapMode: cfg.bootstrapMode, claudeIncludeSubagents: cfg.claudeIncludeSubagents },\n };\n const tmp = STATUS_FILE + \".tmp\";\n await fs.writeFile(tmp, JSON.stringify(snapshot, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, STATUS_FILE);\n}\n\nasync function readConfigJson() {\n try {\n const raw = await fs.readFile(CONFIG_FILE, \"utf8\");\n return JSON.parse(raw);\n } catch { return null; }\n}\n\nasync function writeConfigJson(data) {\n const tmp = CONFIG_FILE + \".tmp\";\n await fs.writeFile(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, CONFIG_FILE);\n}\n\n// ── bootstrap state (persisted in config.json under _bootstrapState) ──\n\nfunction getBootstrapState(key) {\n try {\n const raw = fsSync.readFileSync(CONFIG_FILE, \"utf8\");\n const data = JSON.parse(raw);\n return data?._bootstrapState?.[key] ?? \"\";\n } catch { return \"\"; }\n}\n\nfunction setBootstrapState(key, value) {\n try {\n let data = {};\n try { data = JSON.parse(fsSync.readFileSync(CONFIG_FILE, \"utf8\")); } catch { /* empty */ }\n if (!data._bootstrapState) data._bootstrapState = {};\n data._bootstrapState[key] = String(value);\n const tmp = CONFIG_FILE + \".tmp.bs\";\n fsSync.writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n fsSync.renameSync(tmp, CONFIG_FILE);\n } catch { /* best effort */ }\n}\n\nfunction deleteBootstrapState(key) {\n try {\n let data = {};\n try { data = JSON.parse(fsSync.readFileSync(CONFIG_FILE, \"utf8\")); } catch { /* empty */ }\n if (data._bootstrapState) delete data._bootstrapState[key];\n const tmp = CONFIG_FILE + \".tmp.bs\";\n fsSync.writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n fsSync.renameSync(tmp, CONFIG_FILE);\n } catch { /* best effort */ }\n}\n\n// ── exported boot function ──────────────────────────────────────\n\nexport async function daemonBoot({ createStore, resolveDbPath }) {\n const cfg = {\n apiKey: normalizeApiKey(process.env.ULTRACONTEXT_API_KEY),\n baseUrl: (process.env.ULTRACONTEXT_BASE_URL ?? \"https://api.ultracontext.ai\").trim(),\n userId: process.env.DAEMON_USER_ID ?? process.env.USER ?? \"unknown-user\",\n host: (process.env.DAEMON_HOST || os.hostname() || \"unknown-host\").trim(),\n pollMs: toInt(process.env.DAEMON_POLL_MS, 1500),\n logLevel: process.env.DAEMON_LOG_LEVEL ?? \"info\",\n verboseLogs: cliArgs.has(\"--verbose\") || boolFromEnv(process.env.DAEMON_VERBOSE, false),\n logAppends: boolFromEnv(process.env.DAEMON_LOG_APPENDS, true),\n uiRefreshMs: toInt(process.env.TUI_REFRESH_MS, 1200),\n uiRecentLimit: toInt(process.env.TUI_RECENT_LIMIT, 240),\n configFile: resolveRuntimeConfigPath(),\n dbFile: resolveDbPath(process.env),\n lockFile: resolveLockPath(process.env),\n dedupeTtlSec: toInt(process.env.DAEMON_DEDUPE_TTL_SEC, 60 * 60 * 24 * 30),\n maxReadBytes: toInt(process.env.DAEMON_MAX_READ_BYTES, 4 * 1024 * 1024),\n bootstrapMode: normalizeBootstrapModeWithPrompt(process.env.DAEMON_BOOTSTRAP_MODE ?? \"prompt\") || \"prompt\",\n bootstrapReset: boolFromEnv(process.env.DAEMON_BOOTSTRAP_RESET, false),\n claudeIncludeSubagents: boolFromEnv(process.env.CLAUDE_INCLUDE_SUBAGENTS, false),\n cleanupEveryCycles: Math.max(toInt(process.env.DAEMON_STORE_CLEANUP_CYCLES, 20), 1),\n };\n\n const stats = {\n startedAt: Date.now(),\n cycles: 0,\n filesScanned: 0,\n linesRead: 0,\n parsedEvents: 0,\n appended: 0,\n deduped: 0,\n contextsCreated: 0,\n errors: 0,\n };\n\n const state = {\n recentLogs: [],\n sourceStats: new Map(),\n sourceOrder: [],\n };\n\n let stdioErrorHandled = false;\n\n const runtime = {\n uc: null,\n stop: null,\n store: null,\n sources: null,\n ingestMode: \"all\",\n daemonRunning: false,\n lockHandle: null,\n };\n\n // ── stdio guards ──\n\n function isBenignStdioError(error) {\n const code = String(error?.code ?? \"\");\n return code === \"EIO\" || code === \"EPIPE\" || code === \"ENXIO\";\n }\n\n function handleStdioError(error, streamName) {\n if (!isBenignStdioError(error)) return;\n if (stdioErrorHandled) return;\n stdioErrorHandled = true;\n try { runtime.stop?.(\"stdio\"); } catch { /* ignore */ }\n if (LOG_LEVELS[cfg.logLevel] >= LOG_LEVELS.debug) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[debug] Ignored stdio ${streamName} error (${error?.code ?? \"?\"}): ${msg}`);\n }\n }\n\n process.stdin?.on?.(\"error\", (error) => handleStdioError(error, \"stdin\"));\n process.stdout?.on?.(\"error\", (error) => handleStdioError(error, \"stdout\"));\n process.stderr?.on?.(\"error\", (error) => handleStdioError(error, \"stderr\"));\n\n // ── helpers ──\n\n function runtimeLogsKeep() {\n return Math.max(cfg.uiRecentLimit, 180);\n }\n\n function formatTime(value = Date.now()) {\n return new Date(value).toISOString().slice(11, 19);\n }\n\n function safeText(value) {\n return String(value ?? \"\");\n }\n\n function compactValue(value) {\n const raw = safeText(value);\n if (raw.length <= 32) return raw;\n return `${raw.slice(0, 14)}...${raw.slice(-12)}`;\n }\n\n function formatDataInline(data) {\n if (!data || typeof data !== \"object\") return \"\";\n const entries = Object.entries(data).slice(0, 8);\n if (entries.length === 0) return \"\";\n return entries.map(([k, v]) => `${k}=${compactValue(v)}`).join(\" \");\n }\n\n function ensureSourceStats(sourceName) {\n if (!state.sourceStats.has(sourceName)) {\n state.sourceStats.set(sourceName, {\n filesScanned: 0, linesRead: 0, parsedEvents: 0,\n appended: 0, deduped: 0, contextsCreated: 0, errors: 0,\n lastEventType: \"-\", lastSessionId: \"-\", lastAt: 0, lastFile: \"-\",\n });\n }\n return state.sourceStats.get(sourceName);\n }\n\n function bumpSourceStat(sourceName, key, delta = 1) {\n const current = ensureSourceStats(sourceName);\n current[key] = (current[key] ?? 0) + delta;\n }\n\n function noteSourceActivity(sourceName, patch) {\n Object.assign(ensureSourceStats(sourceName), patch ?? {});\n }\n\n function logSourceFromData(data) {\n if (!data || typeof data !== \"object\") return \"\";\n for (const value of [data.source, data.context_source, data.contextSource, data?.metadata?.source]) {\n const raw = String(value ?? \"\").trim();\n if (raw) return raw.toLowerCase();\n }\n return \"\";\n }\n\n function pushRecentLog(level, message, data) {\n let line = String(message ?? \"\");\n if (line.startsWith(\"Appended event to session context\")) line = \"context append\";\n if (line.startsWith(\"Context created\")) line = \"Context created\";\n if (line.startsWith(\"Context created without metadata fallback\")) line = \"Context created (fallback)\";\n if (line.startsWith(\"UltraContext daemon started\")) line = \"Daemon started\";\n if (line.startsWith(\"UltraContext daemon stopped\")) line = \"Daemon stopped\";\n if (line.startsWith(\"Failed to process file\")) line = \"File processing warning\";\n if (line.startsWith(\"Failed to create context with metadata\")) line = \"Context create warning\";\n\n const suffix = level === \"error\" ? formatDataInline(data) : \"\";\n if (suffix) line = `${line} ${suffix}`;\n\n state.recentLogs.push({ ts: formatTime(), level, source: logSourceFromData(data), text: line });\n const keep = runtimeLogsKeep();\n while (state.recentLogs.length > keep) state.recentLogs.shift();\n }\n\n function log(level, message, data) {\n const current = LOG_LEVELS[cfg.logLevel] ?? LOG_LEVELS.info;\n const target = LOG_LEVELS[level] ?? LOG_LEVELS.info;\n if (target > current) return;\n\n pushRecentLog(level, message, data);\n\n if (cfg.verboseLogs) {\n const stamp = colorize(new Date().toISOString(), ANSI.dim);\n const badge = colorize(`[${String(level).toUpperCase()}]`, levelColor(level));\n console.log(`${stamp} ${badge} ${message}`);\n if (data && typeof data === \"object\" && Object.keys(data).length > 0) {\n for (const line of JSON.stringify(data, null, 2).split(\"\\n\")) {\n console.log(`${colorize(\" |\", ANSI.gray)} ${line}`);\n }\n }\n return;\n }\n\n const now = formatTime();\n const suffix = formatDataInline(data);\n const finalLine = suffix ? `${message} ${suffix}` : message;\n console.log(`${now} ${String(level).toUpperCase().padEnd(5)} ${finalLine}`);\n }\n\n function bumpStat(name, delta = 1) {\n stats[name] = (stats[name] ?? 0) + delta;\n }\n\n function humanUptime(ms) {\n const totalSec = Math.max(Math.floor(ms / 1000), 0);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n }\n\n function emitStatusLine() {\n console.log([\n \"STATUS\", `uptime=${humanUptime(Date.now() - stats.startedAt)}`,\n `cycles=${stats.cycles}`, `files=${stats.filesScanned}`, `lines=${stats.linesRead}`,\n `parsed=${stats.parsedEvents}`, `append=${stats.appended}`, `dedupe=${stats.deduped}`,\n `ctx_new=${stats.contextsCreated}`, `errors=${stats.errors}`,\n ].join(\" \"));\n }\n\n function printVerboseBanner() {\n if (!cfg.verboseLogs) return;\n for (const row of [\n \"+------------------------------------------+\",\n \"| UltraContext Daemon (Verbose) |\",\n \"+------------------------------------------+\",\n ]) console.log(colorize(row, ANSI.cyan));\n }\n\n function errorDetails(error) {\n if (!error || typeof error !== \"object\") return { message: String(error) };\n const details = { message: error.message ?? String(error) };\n if (\"status\" in error) details.status = error.status;\n if (\"url\" in error) details.url = error.url;\n if (\"bodyText\" in error) details.bodyText = error.bodyText;\n return details;\n }\n\n // ── config persistence (file-only) ──\n\n function serializeConfigPrefs() {\n return {\n bootstrapMode: normalizeBootstrapModeWithPrompt(cfg.bootstrapMode) || \"prompt\",\n claudeIncludeSubagents: Boolean(cfg.claudeIncludeSubagents),\n };\n }\n\n async function persistConfigPrefsToFile(targetFile = cfg.configFile) {\n const target = path.resolve(targetFile);\n let existing = {};\n try {\n const raw = await fs.readFile(target, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) existing = parsed;\n } catch { /* ignore */ }\n\n const payload = JSON.stringify({ ...existing, ...serializeConfigPrefs() }, null, 2);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, `${payload}\\n`, \"utf8\");\n return { saved: true, file: target };\n }\n\n async function loadConfigPrefsFromPath(target) {\n let raw = \"\";\n try {\n raw = await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (error?.code === \"ENOENT\") return { loaded: false, missing: true, raw: \"\" };\n log(\"warn\", \"Failed to read config prefs file\", { file: target, ...errorDetails(error) });\n return { loaded: false, missing: false, raw: \"\" };\n }\n let parsed = null;\n try { parsed = JSON.parse(raw); } catch (error) {\n log(\"warn\", \"Failed to parse config prefs file\", { file: target, ...errorDetails(error) });\n return { loaded: false, missing: false, raw };\n }\n applyConfigPrefs(parsed);\n return { loaded: true, missing: false, raw };\n }\n\n async function loadConfigPrefsFromFile() {\n const primary = path.resolve(cfg.configFile);\n const loaded = await loadConfigPrefsFromPath(primary);\n return {\n loaded: loaded.loaded,\n source: loaded.loaded ? \"primary\" : \"none\",\n file: loaded.loaded ? primary : \"\",\n raw: loaded.raw ?? \"\",\n };\n }\n\n function applyConfigPrefs(prefs) {\n if (!prefs || typeof prefs !== \"object\") return;\n const fields = [\"bootstrapMode\", \"claudeIncludeSubagents\"];\n for (const field of fields) {\n if (!(field in prefs)) continue;\n if (field === \"bootstrapMode\") {\n cfg.bootstrapMode = normalizeBootstrapModeWithPrompt(prefs.bootstrapMode) || \"prompt\";\n continue;\n }\n cfg[field] = Boolean(prefs[field]);\n }\n }\n\n // ── config.json reading each cycle ──\n\n async function refreshConfigFromFile() {\n const data = await readConfigJson();\n if (!data || typeof data !== \"object\") return;\n\n // apply setting changes\n const before = serializeConfigPrefs();\n applyConfigPrefs(data);\n const after = serializeConfigPrefs();\n\n // rebuild sources if subagent toggle changed\n if (before.claudeIncludeSubagents !== after.claudeIncludeSubagents) {\n applyRuntimeSources(buildSources());\n }\n\n if (JSON.stringify(before) !== JSON.stringify(after)) {\n log(\"info\", \"Reloaded config from config.json\", {\n claude_subagents: after.claudeIncludeSubagents ? \"on\" : \"off\",\n bootstrap_mode: after.bootstrapMode,\n });\n }\n\n // handle bootstrapReset command flag\n if (data.bootstrapReset) {\n cfg.bootstrapReset = true;\n await resetBootstrapState();\n log(\"info\", \"Bootstrap reset triggered via config.json\");\n\n // clear the flag by writing config.json back\n const cleaned = { ...data };\n delete cleaned.bootstrapReset;\n await writeConfigJson(cleaned);\n }\n }\n\n // ── sources ──\n\n function applyRuntimeSources(sources) {\n runtime.sources = sources;\n state.sourceOrder = sources.map((s) => s.name);\n for (const name of state.sourceOrder) ensureSourceStats(name);\n }\n\n function buildSources() {\n const codexGlob = expandHome(process.env.CODEX_GLOB ?? \"~/.codex/sessions/**/*.jsonl\");\n const claudeGlob = expandHome(process.env.CLAUDE_GLOB ?? \"~/.claude/projects/**/*.jsonl\");\n const openclawGlob = expandHome(process.env.OPENCLAW_GLOB ?? \"~/.openclaw/agents/*/sessions/**/*.jsonl\");\n\n const sources = [];\n if (boolFromEnv(process.env.INGEST_CODEX, true)) {\n sources.push({ name: \"codex\", enabled: true, globs: [codexGlob], parseLine: parseCodexLine });\n }\n if (boolFromEnv(process.env.INGEST_CLAUDE, true)) {\n sources.push({\n name: \"claude\", enabled: true, globs: [claudeGlob],\n ignoreGlobs: cfg.claudeIncludeSubagents ? [] : [\"**/subagents/**\"],\n parseLine: parseClaudeCodeLine,\n });\n }\n if (boolFromEnv(process.env.INGEST_OPENCLAW, true)) {\n sources.push({ name: \"openclaw\", enabled: true, globs: [openclawGlob], parseLine: parseOpenClawLine });\n }\n\n // gstack — skill artifacts (learnings, timeline, reviews, resources)\n const gstackGlob = expandHome(process.env.GSTACK_GLOB ?? \"~/.gstack/projects/**/*.jsonl\");\n if (boolFromEnv(process.env.INGEST_GSTACK, true)) {\n sources.push({ name: \"gstack\", enabled: true, globs: [gstackGlob], parseLine: parseGstackLine });\n }\n\n return sources;\n }\n\n async function listSourceFiles(source) {\n return fg(source.globs, {\n onlyFiles: true, absolute: true, followSymbolicLinks: false,\n unique: true, suppressErrors: true, ignore: source.ignoreGlobs ?? [],\n });\n }\n\n // ── bootstrap ──\n\n function bootstrapStateStoreKey(sources) {\n return createBootstrapStateKey({\n host: cfg.host, userId: cfg.userId,\n sourceNames: sources.map((s) => s.name),\n });\n }\n\n function bootstrapModeLabel(mode) {\n return BOOTSTRAP_OPTIONS.find((o) => o.id === mode)?.label ?? mode;\n }\n\n function isWithinLast24h(timestamp, nowMs = Date.now()) {\n if (!timestamp) return false;\n const d = new Date(String(timestamp));\n if (Number.isNaN(d.getTime())) return false;\n return nowMs - d.getTime() <= 24 * 60 * 60 * 1000;\n }\n\n function offsetStoreKey(sourceName, fileId) { return `offset:${sourceName}:${fileId}`; }\n function seenEventStoreKey(sourceName, eventId) { return `seen:${sourceName}:${eventId}`; }\n function sessionContextStoreKey(sourceName, sessionId) { return `ctx:session:${sourceName}:${cfg.host}:${cfg.userId}:${sessionId}`; }\n\n async function primeOffsetsToEof(store, source, shouldStop = () => false) {\n if (shouldStop()) return;\n const files = await listSourceFiles(source);\n for (const filePath of files) {\n if (shouldStop()) break;\n try {\n const stat = await fs.stat(filePath);\n store.setOffset(offsetStoreKey(source.name, `${stat.dev}:${stat.ino}`), stat.size);\n } catch { /* ignore */ }\n }\n }\n\n function resolveBootstrapPlan({ sources }) {\n const key = bootstrapStateStoreKey(sources);\n if (cfg.bootstrapReset) {\n deleteBootstrapState(key);\n log(\"info\", \"Bootstrap state reset by configuration\", { key });\n }\n const forcedMode = normalizeBootstrapMode(cfg.bootstrapMode);\n if (forcedMode) return { mode: forcedMode, needsBootstrap: true, forced: true };\n const stored = normalizeBootstrapMode(getBootstrapState(key));\n if (stored) return { mode: stored, needsBootstrap: false, forced: false };\n return { mode: \"new_only\", needsBootstrap: true, forced: false };\n }\n\n async function applyBootstrapMode({ store, sources, mode, needsBootstrap, shouldStop = () => false }) {\n const selected = normalizeBootstrapMode(mode) || \"new_only\";\n if (!needsBootstrap) return \"all\";\n if (selected === \"new_only\") {\n for (const source of sources) {\n if (shouldStop()) break;\n await primeOffsetsToEof(store, source, shouldStop);\n }\n }\n if (shouldStop()) return \"all\";\n setBootstrapState(bootstrapStateStoreKey(sources), selected);\n if (selected === \"last_24h\") return \"last_24h\";\n return \"all\";\n }\n\n // ── validation ──\n\n function validateConfig() {\n if (!cfg.apiKey) throw new Error(\"Missing ULTRACONTEXT_API_KEY. Run `ultracontext config` to set up your API key.\");\n if (!cfg.apiKey.startsWith(\"uc_live_\") && !cfg.apiKey.startsWith(\"uc_test_\")) {\n log(\"warn\", \"ULTRACONTEXT_API_KEY format looks unusual\", { key_prefix: cfg.apiKey.slice(0, 8), key_len: cfg.apiKey.length });\n }\n }\n\n // ── process helpers ──\n\n function readProcessInfo(pid) {\n try {\n const out = spawnSync(\"ps\", [\"-o\", \"ppid=,command=\", \"-p\", String(pid)], { stdio: \"pipe\", encoding: \"utf8\" });\n const raw = String(out.stdout ?? \"\").trim();\n if (!raw) return null;\n const match = raw.match(/^(\\d+)\\s+(.*)$/);\n if (!match) return null;\n return { ppid: Number(match[1]), command: match[2] ?? \"\" };\n } catch { return null; }\n }\n\n function isWatchCommand(command) {\n const raw = String(command ?? \"\").trim();\n return raw.includes(\"node --watch\") || raw.includes(\" --watch \");\n }\n\n function stopWatchParentProcess() {\n let pid = Number(process.ppid);\n const seen = new Set();\n for (let depth = 0; depth < 10; depth += 1) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n if (seen.has(pid)) return false;\n seen.add(pid);\n const info = readProcessInfo(pid);\n if (!info) return false;\n if (isWatchCommand(info.command)) {\n try { process.kill(pid, \"SIGTERM\"); return true; } catch { return false; }\n }\n pid = Number(info.ppid);\n }\n return false;\n }\n\n // ── event ingestion ──\n\n function markEventSeen(store, sourceName, eventId) {\n return store.markEventSeen(seenEventStoreKey(sourceName, eventId), cfg.dedupeTtlSec);\n }\n\n // prevent duplicate context creation when files are processed in parallel\n const contextCreateInflight = new Map();\n\n async function getOrCreateContext(store, uc, cacheKey, metadata, sourceName) {\n const cached = store.getContextCache(cacheKey);\n if (cached) return cached;\n\n // coalesce concurrent creates for the same cache key\n if (contextCreateInflight.has(cacheKey)) return contextCreateInflight.get(cacheKey);\n\n const pending = (async () => {\n try {\n const created = await uc.create({ metadata });\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n if (cfg.logAppends) {\n log(\"info\", \"Context created\", {\n source: sourceName, context_id: created.id,\n session_id: metadata?.session_id ?? \"\",\n });\n }\n return created.id;\n } catch (error) {\n const details = errorDetails(error);\n bumpStat(\"errors\");\n bumpSourceStat(sourceName, \"errors\");\n log(\"warn\", \"Failed to create context with metadata\", details);\n\n if (details.status === 400) {\n const created = await uc.create();\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n if (cfg.logAppends) {\n log(\"warn\", \"Context created without metadata fallback\", {\n source: sourceName, context_id: created.id,\n });\n }\n return created.id;\n }\n throw error;\n } finally {\n contextCreateInflight.delete(cacheKey);\n }\n })();\n\n contextCreateInflight.set(cacheKey, pending);\n return pending;\n }\n\n async function appendToUltraContext({ store, uc, sourceName, normalized, eventId, filePath, lineOffset }) {\n\n // enrich context metadata with project path + first event timestamp\n const contextMeta = {\n source: sourceName, host: cfg.host, user_id: cfg.userId,\n session_id: normalized.sessionId,\n started_at: normalized.timestamp,\n };\n const projectPath = extractProjectPathFromFile(filePath);\n if (projectPath) contextMeta.project_path = projectPath;\n\n const sessionContextId = await getOrCreateContext(store, uc,\n sessionContextStoreKey(sourceName, normalized.sessionId),\n contextMeta, sourceName,\n );\n\n const safeRaw = redact(normalized.raw);\n const payload = {\n role: normalized.kind,\n content: { message: normalized.message, event_type: normalized.eventType, timestamp: normalized.timestamp, raw: safeRaw },\n metadata: { source: sourceName, host: cfg.host, user_id: cfg.userId, session_id: normalized.sessionId, event_id: eventId, file_path: filePath, file_offset: lineOffset },\n };\n\n await uc.append(sessionContextId, payload);\n bumpStat(\"appended\");\n bumpSourceStat(sourceName, \"appended\");\n noteSourceActivity(sourceName, { lastEventType: normalized.eventType, lastSessionId: normalized.sessionId, lastAt: Date.now() });\n\n if (cfg.logAppends) {\n log(\"info\", \"Appended event to session context\", {\n source: sourceName, session_id: normalized.sessionId, context_id: sessionContextId,\n event_type: normalized.eventType, role: normalized.kind, event_id: eventId,\n });\n }\n }\n\n // bulk ingestion tunables\n const BULK_BATCH_SIZE = 50;\n const FILE_CONCURRENCY = 8;\n const SESSION_CONCURRENCY = 6;\n\n // run async tasks with bounded concurrency\n async function parallelMap(items, concurrency, fn) {\n const results = [];\n let idx = 0;\n async function worker() {\n while (idx < items.length) {\n const i = idx++;\n results[i] = await fn(items[i], i);\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));\n return results;\n }\n\n async function appendBulkToUltraContext({ store, uc, sourceName, events, filePath }) {\n\n // group events by session id\n const bySession = new Map();\n for (const ev of events) {\n const key = ev.normalized.sessionId;\n if (!bySession.has(key)) bySession.set(key, []);\n bySession.get(key).push(ev);\n }\n\n // resolve all context ids first (sequential — touches local store)\n const sessionEntries = [...bySession.entries()];\n const projectPath = extractProjectPathFromFile(filePath);\n const contextIds = new Map();\n for (const [sessionId, sessionEvents] of sessionEntries) {\n const contextMeta = {\n source: sourceName, host: cfg.host, user_id: cfg.userId,\n session_id: sessionId,\n started_at: sessionEvents[0].normalized.timestamp,\n };\n if (projectPath) contextMeta.project_path = projectPath;\n const ctxId = await getOrCreateContext(store, uc,\n sessionContextStoreKey(sourceName, sessionId),\n contextMeta, sourceName,\n );\n contextIds.set(sessionId, ctxId);\n }\n\n // send bulk requests in parallel across sessions\n await parallelMap(sessionEntries, SESSION_CONCURRENCY, async ([sessionId, sessionEvents]) => {\n const sessionContextId = contextIds.get(sessionId);\n\n // build payloads array\n const payloads = sessionEvents.map(({ normalized, eventId, lineOffset }) => {\n const safeRaw = redact(normalized.raw);\n return {\n role: normalized.kind,\n content: { message: normalized.message, event_type: normalized.eventType, timestamp: normalized.timestamp, raw: safeRaw },\n metadata: { source: sourceName, host: cfg.host, user_id: cfg.userId, session_id: sessionId, event_id: eventId, file_path: filePath, file_offset: lineOffset },\n };\n });\n\n // send in batches of BULK_BATCH_SIZE\n for (let i = 0; i < payloads.length; i += BULK_BATCH_SIZE) {\n const batch = payloads.slice(i, i + BULK_BATCH_SIZE);\n await uc.append(sessionContextId, batch);\n }\n\n // update stats\n bumpStat(\"appended\", sessionEvents.length);\n bumpSourceStat(sourceName, \"appended\", sessionEvents.length);\n const last = sessionEvents[sessionEvents.length - 1].normalized;\n noteSourceActivity(sourceName, { lastEventType: last.eventType, lastSessionId: sessionId, lastAt: Date.now() });\n\n if (cfg.logAppends) {\n log(\"info\", \"Bulk appended events to session context\", {\n source: sourceName, session_id: sessionId, context_id: sessionContextId, count: sessionEvents.length,\n });\n }\n });\n }\n\n // ── file reading ──\n\n async function readNewLines(filePath, offset) {\n const handle = await fs.open(filePath, \"r\");\n try {\n const stat = await handle.stat();\n let start = offset;\n if (start > stat.size) start = 0;\n const unread = stat.size - start;\n if (unread <= 0) return { lines: [], nextOffset: start, fileId: `${stat.dev}:${stat.ino}` };\n\n const readLen = Math.min(unread, cfg.maxReadBytes);\n const buffer = Buffer.allocUnsafe(readLen);\n const { bytesRead } = await handle.read(buffer, 0, readLen, start);\n const chunk = buffer.subarray(0, bytesRead);\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline === -1) return { lines: [], nextOffset: start, fileId: `${stat.dev}:${stat.ino}` };\n\n const text = chunk.subarray(0, lastNewline + 1).toString(\"utf8\");\n const lines = [];\n let consumed = 0;\n for (const line of text.split(\"\\n\")) {\n const lineBytes = Buffer.byteLength(line, \"utf8\") + 1;\n const lineOffset = start + consumed;\n consumed += lineBytes;\n if (!line.trim()) continue;\n lines.push({ line, lineOffset });\n }\n return { lines, nextOffset: start + lastNewline + 1, fileId: `${stat.dev}:${stat.ino}` };\n } finally {\n await handle.close();\n }\n }\n\n async function processFile({ store, uc, source, filePath, shouldStop = () => false, ingestMode = \"all\" }) {\n if (shouldStop()) return;\n try {\n const stat = await fs.stat(filePath);\n bumpStat(\"filesScanned\");\n bumpSourceStat(source.name, \"filesScanned\");\n\n const fileId = `${stat.dev}:${stat.ino}`;\n const offsetKey = offsetStoreKey(source.name, fileId);\n const currentOffset = toInt(store.getOffset(offsetKey), 0);\n const { lines, nextOffset } = await readNewLines(filePath, currentOffset);\n\n bumpStat(\"linesRead\", lines.length);\n bumpSourceStat(source.name, \"linesRead\", lines.length);\n noteSourceActivity(source.name, { lastFile: filePath, lastAt: Date.now() });\n if (lines.length === 0) return;\n\n // collect all new events, then bulk-append per session\n const pendingEvents = [];\n\n for (const { line, lineOffset } of lines) {\n if (shouldStop()) break;\n const normalized = source.parseLine({ line, filePath });\n if (!normalized || !normalized.sessionId) continue;\n if (ingestMode === \"last_24h\" && !isWithinLast24h(normalized.timestamp)) continue;\n\n bumpStat(\"parsedEvents\");\n bumpSourceStat(source.name, \"parsedEvents\");\n noteSourceActivity(source.name, { lastEventType: normalized.eventType, lastSessionId: normalized.sessionId, lastAt: Date.now() });\n\n const eventId = sha256(`${source.name}|${cfg.host}|${cfg.userId}|${normalized.sessionId}|${fileId}|${lineOffset}|${sha256(line)}`);\n const isNew = markEventSeen(store, source.name, eventId);\n if (!isNew) { bumpStat(\"deduped\"); bumpSourceStat(source.name, \"deduped\"); continue; }\n\n pendingEvents.push({ normalized, eventId, lineOffset });\n }\n\n // bulk append all collected events\n if (pendingEvents.length > 0) {\n await appendBulkToUltraContext({ store, uc, sourceName: source.name, events: pendingEvents, filePath });\n }\n\n store.setOffset(offsetKey, nextOffset);\n } catch (error) {\n bumpStat(\"errors\");\n bumpSourceStat(source.name, \"errors\");\n log(\"warn\", `Failed to process file for source=${source.name}`, { filePath, ...errorDetails(error) });\n }\n }\n\n async function processSource({ store, uc, source, shouldStop = () => false, ingestMode = \"all\" }) {\n if (shouldStop()) return;\n let files = [];\n try { files = await listSourceFiles(source); } catch (error) {\n bumpStat(\"errors\");\n log(\"warn\", `Failed to list files for source=${source.name}`, { error: error instanceof Error ? error.message : String(error) });\n return;\n }\n\n // process files concurrently\n await parallelMap(\n files.filter(() => !shouldStop()),\n FILE_CONCURRENCY,\n (filePath) => processFile({ store, uc, source, filePath, shouldStop, ingestMode }),\n );\n }\n\n // ── runtime commands ──\n\n async function resetBootstrapState() {\n const sources = runtime.sources ?? buildSources();\n deleteBootstrapState(bootstrapStateStoreKey(sources));\n }\n\n // ── cleanup ──\n\n async function stopRuntimeResources() {\n runtime.daemonRunning = false;\n if (runtime.lockHandle) { try { await runtime.lockHandle.release(); } catch (e) { log(\"warn\", \"Failed to release daemon lock\", errorDetails(e)); } runtime.lockHandle = null; }\n if (runtime.store) { try { runtime.store.close(); } catch (e) { log(\"warn\", \"Failed to close local store\", errorDetails(e)); } runtime.store = null; }\n runtime.uc = null;\n runtime.stop = null;\n runtime.sources = null;\n runtime.ingestMode = \"all\";\n }\n\n // ── main loop ──\n\n async function daemonMain() {\n validateConfig();\n printVerboseBanner();\n\n const store = createStore({ dbPath: cfg.dbFile });\n runtime.store = store;\n\n // load persisted config from file\n try {\n const fileLoad = await loadConfigPrefsFromFile();\n if (fileLoad.loaded) {\n log(\"info\", \"Loaded persisted config preferences\", {\n file_source: fileLoad.source, file_path: fileLoad.file,\n });\n } else {\n await persistConfigPrefsToFile();\n log(\"info\", \"Created default runtime config file\", { file: path.resolve(cfg.configFile) });\n }\n } catch (error) {\n log(\"warn\", \"Failed to load persisted config preferences\", errorDetails(error));\n }\n\n // sources + lock\n const sources = buildSources();\n if (sources.length === 0) throw new Error(\"No sources enabled. Set INGEST_CODEX=true, INGEST_CLAUDE=true, and/or INGEST_GSTACK=true\");\n applyRuntimeSources(sources);\n\n runtime.lockHandle = await acquireFileLock({ lockPath: cfg.lockFile, userId: cfg.userId, host: cfg.host });\n\n const uc = new UltraContext({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl });\n runtime.uc = uc;\n\n // connectivity check\n try { await uc.get({ limit: 1 }); } catch (error) {\n const details = errorDetails(error);\n throw new Error(`UltraContext auth/connectivity check failed (status=${details.status ?? \"?\"}, url=${details.url ?? cfg.baseUrl}, body=${details.bodyText ?? details.message}). Check your API key at https://ultracontext.ai`);\n }\n\n log(\"info\", \"UltraContext daemon started\", {\n user_id: cfg.userId, host: cfg.host, poll_ms: cfg.pollMs, mode: \"headless\",\n db_file: cfg.dbFile,\n sources: sources.map((s) => ({ name: s.name, globs: s.globs })),\n });\n\n runtime.daemonRunning = true;\n\n // main poll loop\n let running = true;\n let stopRequested = false;\n const stop = (reason = \"internal\") => {\n if (stopRequested) return;\n stopRequested = true;\n if (reason === \"user\" || reason === \"sigint\") stopWatchParentProcess();\n running = false;\n };\n runtime.stop = stop;\n\n process.on(\"SIGINT\", () => stop(\"sigint\"));\n process.on(\"SIGTERM\", () => stop(\"sigterm\"));\n\n // bootstrap\n runtime.ingestMode = \"all\";\n if (running) {\n const bootstrapPlan = resolveBootstrapPlan({ store, sources });\n if (running) {\n runtime.ingestMode = await applyBootstrapMode({\n store, sources, mode: bootstrapPlan.mode,\n needsBootstrap: bootstrapPlan.needsBootstrap, shouldStop: () => !running,\n });\n log(\"info\", \"Bootstrap mode resolved\", {\n mode: bootstrapPlan.mode, mode_label: bootstrapModeLabel(bootstrapPlan.mode),\n applied: bootstrapPlan.needsBootstrap ? \"yes\" : \"no\", ingest_mode: runtime.ingestMode,\n });\n }\n }\n\n while (running) {\n // check config.json for setting changes + commands\n try { await refreshConfigFromFile(); } catch (error) {\n log(\"warn\", \"Failed to refresh config from config.json\", errorDetails(error));\n }\n\n bumpStat(\"cycles\");\n const cycleStart = Date.now();\n\n // process all sources in parallel\n const activeSources = (runtime.sources ?? []);\n await Promise.all(activeSources.map((source) =>\n processSource({ store, uc, source, shouldStop: () => !running, ingestMode: runtime.ingestMode ?? \"all\" }),\n ));\n\n if (stats.cycles % cfg.cleanupEveryCycles === 0) { try { store.cleanupExpired(); } catch { /* ignore */ } }\n\n // write status.json atomically after each cycle\n try { await writeStatusJson(cfg, stats, state, runtime); } catch { /* ignore */ }\n\n if (!running) break;\n const waitMs = Math.max(cfg.pollMs - (Date.now() - cycleStart), 10);\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n\n runtime.daemonRunning = false;\n\n // final status write\n try { await writeStatusJson(cfg, stats, state, runtime); } catch { /* ignore */ }\n\n emitStatusLine();\n await stopRuntimeResources();\n log(\"info\", \"UltraContext daemon stopped\");\n }\n\n // ── run ──\n\n daemonMain().catch(async (error) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isAlreadyRunning = error?.code === \"ELOCKED\" || errorMessage.startsWith(\"UltraContext daemon already running\");\n await stopRuntimeResources();\n\n if (isAlreadyRunning) {\n log(\"warn\", \"UltraContext already running\", { error: errorMessage });\n stopWatchParentProcess();\n } else {\n bumpStat(\"errors\");\n log(\"error\", \"UltraContext failed\", { error: errorMessage });\n }\n process.exit(isAlreadyRunning ? 2 : 1);\n });\n}\n","// SDK sync entry-point — wires store + boots daemon without dotenv\n// NOTE: parsers are re-exported here so the TUI bundle can import them\n// from this chunk. The daemonBoot() call MUST be guarded so importing\n// this module for parsers alone doesn't start a second daemon.\nimport { createStore, resolveDbPath } from \"@ultracontext/sync/store\";\nimport { daemonBoot } from \"@ultracontext/sync/sync\";\n\n// only boot when spawned as daemon child (launcher passes --daemon)\nif (process.argv.includes(\"--daemon\")) {\n daemonBoot({ createStore, resolveDbPath });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sdk-sync.mjs","names":["fs","fs","process","fs","fsSync"],"sources":["../../../sync/src/store.mjs","../../../sync/src/redact.mjs","../../../../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","../../../sync/src/daemon.mjs","../../src/cli/sdk-sync.mjs"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport { expandHome } from \"./utils.mjs\";\n\nconst DEFAULT_DB_PATH = \"~/.ultracontext/daemon.db\";\n\nfunction ensureParentDir(filePath) {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n}\n\nfunction parseNumber(value, fallback = 0) {\n const num = Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(num) ? num : fallback;\n}\n\nfunction parseBool(value, fallback = false) {\n if (value === null || value === undefined) return fallback;\n const normalized = String(value).trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\n return fallback;\n}\n\nexport function resolveDbPath(env = process.env) {\n return expandHome(env.ULTRACONTEXT_DB_FILE ?? DEFAULT_DB_PATH);\n}\n\nexport function createStore({ dbPath = resolveDbPath(process.env) } = {}) {\n const resolvedPath = path.resolve(dbPath);\n ensureParentDir(resolvedPath);\n\n const db = new DatabaseSync(resolvedPath);\n db.exec(\"PRAGMA journal_mode = WAL\");\n db.exec(\"PRAGMA synchronous = NORMAL\");\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS seen_events (\n event_hash TEXT PRIMARY KEY,\n created_at INTEGER DEFAULT (unixepoch()),\n expires_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS file_offsets (\n file_key TEXT PRIMARY KEY,\n offset_value INTEGER DEFAULT 0,\n updated_at INTEGER DEFAULT (unixepoch())\n );\n\n CREATE TABLE IF NOT EXISTS context_cache (\n cache_key TEXT PRIMARY KEY,\n context_id TEXT NOT NULL,\n updated_at INTEGER DEFAULT (unixepoch())\n );\n `);\n\n const stmt = {\n markSeen: db.prepare(`\n INSERT OR IGNORE INTO seen_events (event_hash, expires_at)\n VALUES (?, ?)\n `),\n deleteSeenIfExpired: db.prepare(`\n DELETE FROM seen_events\n WHERE event_hash = ? AND expires_at <= unixepoch()\n `),\n cleanupSeen: db.prepare(`\n DELETE FROM seen_events\n WHERE expires_at <= unixepoch()\n `),\n getSeen: db.prepare(`\n SELECT event_hash\n FROM seen_events\n WHERE event_hash = ? AND expires_at > unixepoch()\n LIMIT 1\n `),\n getOffset: db.prepare(`\n SELECT offset_value\n FROM file_offsets\n WHERE file_key = ?\n LIMIT 1\n `),\n setOffset: db.prepare(`\n INSERT INTO file_offsets (file_key, offset_value, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(file_key) DO UPDATE SET\n offset_value = excluded.offset_value,\n updated_at = unixepoch()\n `),\n getContextCache: db.prepare(`\n SELECT context_id\n FROM context_cache\n WHERE cache_key = ?\n LIMIT 1\n `),\n setContextCache: db.prepare(`\n INSERT INTO context_cache (cache_key, context_id, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(cache_key) DO UPDATE SET\n context_id = excluded.context_id,\n updated_at = unixepoch()\n `),\n };\n\n // manual transaction wrapper (node:sqlite has no .transaction() helper)\n function markEventSeenTxn(eventHash, ttlSeconds) {\n db.exec(\"BEGIN\");\n try {\n stmt.deleteSeenIfExpired.run(eventHash);\n const expiresAt = Math.floor(Date.now() / 1000) + Math.max(parseNumber(ttlSeconds, 60), 1);\n const result = stmt.markSeen.run(eventHash, expiresAt);\n db.exec(\"COMMIT\");\n return result.changes === 1;\n } catch (error) {\n db.exec(\"ROLLBACK\");\n throw error;\n }\n }\n\n return {\n dbPath: resolvedPath,\n markEventSeen(eventHash, ttlSeconds) {\n return markEventSeenTxn(String(eventHash ?? \"\"), ttlSeconds);\n },\n isEventSeen(eventHash) {\n return Boolean(stmt.getSeen.get(String(eventHash ?? \"\")));\n },\n cleanupExpired() {\n stmt.cleanupSeen.run();\n },\n getOffset(fileKey) {\n const row = stmt.getOffset.get(String(fileKey ?? \"\"));\n return row ? parseNumber(row.offset_value, 0) : 0;\n },\n setOffset(fileKey, value) {\n stmt.setOffset.run(String(fileKey ?? \"\"), parseNumber(value, 0));\n },\n getContextCache(cacheKey) {\n const row = stmt.getContextCache.get(String(cacheKey ?? \"\"));\n return row ? String(row.context_id ?? \"\") : \"\";\n },\n setContextCache(cacheKey, contextId) {\n stmt.setContextCache.run(String(cacheKey ?? \"\"), String(contextId ?? \"\"));\n },\n close() {\n db.close();\n },\n };\n}\n","import { truncateString } from \"./utils.mjs\";\n\nconst REDACTED = \"***REDACTED***\";\n\nconst SENSITIVE_KEY_REGEX = /(token|secret|password|api[-_]?key|authorization|cookie|session[-_]?key)/i;\n\nconst SECRET_PATTERNS = [\n { regex: /\\buc_(live|test)_[A-Za-z0-9_-]+\\b/g, replacement: \"uc_$1_***\" },\n { regex: /\\bsk-[A-Za-z0-9_-]{12,}\\b/g, replacement: \"sk-***\" },\n { regex: /\\bBearer\\s+[A-Za-z0-9._-]{8,}\\b/gi, replacement: \"Bearer ***\" },\n {\n regex: /\\bAIza[0-9A-Za-z\\-_]{20,}\\b/g,\n replacement: \"AIza***\",\n },\n];\n\nfunction redactString(value) {\n let output = truncateString(value, 8000);\n for (const { regex, replacement } of SECRET_PATTERNS) {\n output = output.replace(regex, replacement);\n }\n return output;\n}\n\nexport function redact(value, currentKey = \"\") {\n if (value === null || value === undefined) return value;\n\n if (typeof value === \"string\") {\n return SENSITIVE_KEY_REGEX.test(currentKey) ? REDACTED : redactString(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => redact(item));\n }\n\n if (typeof value === \"object\") {\n const out = {};\n for (const [key, raw] of Object.entries(value)) {\n out[key] = SENSITIVE_KEY_REGEX.test(key) ? REDACTED : redact(raw, key);\n }\n return out;\n }\n\n return REDACTED;\n}\n","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, 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// 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: \"\" };\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","// daemon core — receives store factory as param so callers control env/sqlite\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { spawnSync } from \"node:child_process\";\n\nimport fg from \"fast-glob\";\nimport { UltraContext } from \"ultracontext\";\nimport {\n createBootstrapStateKey,\n normalizeBootstrapMode,\n parseProtocolJson,\n} from \"./protocol.mjs\";\n\nimport { acquireFileLock, resolveLockPath } from \"./lock.mjs\";\nimport { redact } from \"./redact.mjs\";\nimport {\n parseClaudeCodeLine, parseCodexLine, parseGstackLine, parseOpenClawLine,\n parseCursorLine, parseGeminiFile,\n} from \"@ultracontext/parsers\";\nimport { boolFromEnv, expandHome, extractProjectPathFromFile, sha256, toInt } from \"./utils.mjs\";\n\nconst LOG_LEVELS = { error: 0, warn: 1, info: 2, debug: 3 };\nconst DEFAULT_RUNTIME_CONFIG_FILE = \"~/.ultracontext/config.json\";\nconst BOOTSTRAP_OPTIONS = [\n { id: \"new_only\", label: \"New only (recommended)\" },\n { id: \"last_24h\", label: \"Last 24h\" },\n { id: \"all\", label: \"All\" },\n { id: \"prompt\", label: \"Ask on startup\" },\n];\nconst cliArgs = new Set(process.argv.slice(2));\n\n// file-based IPC paths\nconst STATUS_FILE = path.join(os.homedir(), \".ultracontext\", \"status.json\");\nconst CONFIG_FILE = path.join(os.homedir(), \".ultracontext\", \"config.json\");\n\nconst ANSI = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n gray: \"\\x1b[90m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n};\n\nfunction shouldUseColor() {\n return Boolean(process.stdout?.isTTY) && !boolFromEnv(process.env.NO_COLOR, false);\n}\n\nfunction levelColor(level) {\n if (level === \"error\") return ANSI.red;\n if (level === \"warn\") return ANSI.yellow;\n if (level === \"debug\") return ANSI.gray;\n return ANSI.cyan;\n}\n\nfunction colorize(text, color) {\n if (!shouldUseColor()) return String(text ?? \"\");\n return `${color}${String(text ?? \"\")}${ANSI.reset}`;\n}\n\nfunction normalizeApiKey(raw) {\n if (!raw) return \"\";\n return String(raw).trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction resolveRuntimeConfigPath() {\n return expandHome(process.env.ULTRACONTEXT_CONFIG_FILE ?? DEFAULT_RUNTIME_CONFIG_FILE);\n}\n\nfunction normalizeBootstrapModeWithPrompt(raw) {\n return normalizeBootstrapMode(raw, { allowPrompt: true }) || \"\";\n}\n\n// ── file-based IPC helpers ─────────────────────────────────────\n\nasync function writeStatusJson(cfg, stats, state, runtime) {\n const snapshot = {\n pid: process.pid,\n startedAt: new Date(stats.startedAt).toISOString(),\n updatedAt: new Date().toISOString(),\n host: cfg.host,\n userId: cfg.userId,\n mode: runtime.ingestMode,\n running: runtime.daemonRunning,\n stats: { ...stats },\n sources: state.sourceOrder.map(name => {\n const s = state.sourceStats.get(name) || {};\n return { name, ...s };\n }),\n recentLogs: state.recentLogs.slice(-240),\n config: { bootstrapMode: cfg.bootstrapMode, claudeIncludeSubagents: cfg.claudeIncludeSubagents },\n };\n const tmp = STATUS_FILE + \".tmp\";\n await fs.writeFile(tmp, JSON.stringify(snapshot, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, STATUS_FILE);\n}\n\nasync function readConfigJson() {\n try {\n const raw = await fs.readFile(CONFIG_FILE, \"utf8\");\n return JSON.parse(raw);\n } catch { return null; }\n}\n\nasync function writeConfigJson(data) {\n const tmp = CONFIG_FILE + \".tmp\";\n await fs.writeFile(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, CONFIG_FILE);\n}\n\n// ── bootstrap state (persisted in config.json under _bootstrapState) ──\n\nfunction getBootstrapState(key) {\n try {\n const raw = fsSync.readFileSync(CONFIG_FILE, \"utf8\");\n const data = JSON.parse(raw);\n return data?._bootstrapState?.[key] ?? \"\";\n } catch { return \"\"; }\n}\n\nfunction setBootstrapState(key, value) {\n try {\n let data = {};\n try { data = JSON.parse(fsSync.readFileSync(CONFIG_FILE, \"utf8\")); } catch { /* empty */ }\n if (!data._bootstrapState) data._bootstrapState = {};\n data._bootstrapState[key] = String(value);\n const tmp = CONFIG_FILE + \".tmp.bs\";\n fsSync.writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n fsSync.renameSync(tmp, CONFIG_FILE);\n } catch { /* best effort */ }\n}\n\nfunction deleteBootstrapState(key) {\n try {\n let data = {};\n try { data = JSON.parse(fsSync.readFileSync(CONFIG_FILE, \"utf8\")); } catch { /* empty */ }\n if (data._bootstrapState) delete data._bootstrapState[key];\n const tmp = CONFIG_FILE + \".tmp.bs\";\n fsSync.writeFileSync(tmp, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n fsSync.renameSync(tmp, CONFIG_FILE);\n } catch { /* best effort */ }\n}\n\n// ── exported boot function ──────────────────────────────────────\n\nexport async function daemonBoot({ createStore, resolveDbPath }) {\n const cfg = {\n apiKey: normalizeApiKey(process.env.ULTRACONTEXT_API_KEY),\n baseUrl: (process.env.ULTRACONTEXT_BASE_URL ?? \"https://api.ultracontext.ai\").trim(),\n userId: process.env.DAEMON_USER_ID ?? process.env.USER ?? \"unknown-user\",\n host: (process.env.DAEMON_HOST || os.hostname() || \"unknown-host\").trim(),\n pollMs: toInt(process.env.DAEMON_POLL_MS, 1500),\n logLevel: process.env.DAEMON_LOG_LEVEL ?? \"info\",\n verboseLogs: cliArgs.has(\"--verbose\") || boolFromEnv(process.env.DAEMON_VERBOSE, false),\n logAppends: boolFromEnv(process.env.DAEMON_LOG_APPENDS, true),\n uiRefreshMs: toInt(process.env.TUI_REFRESH_MS, 1200),\n uiRecentLimit: toInt(process.env.TUI_RECENT_LIMIT, 240),\n configFile: resolveRuntimeConfigPath(),\n dbFile: resolveDbPath(process.env),\n lockFile: resolveLockPath(process.env),\n dedupeTtlSec: toInt(process.env.DAEMON_DEDUPE_TTL_SEC, 60 * 60 * 24 * 30),\n maxReadBytes: toInt(process.env.DAEMON_MAX_READ_BYTES, 4 * 1024 * 1024),\n bootstrapMode: normalizeBootstrapModeWithPrompt(process.env.DAEMON_BOOTSTRAP_MODE ?? \"prompt\") || \"prompt\",\n bootstrapReset: boolFromEnv(process.env.DAEMON_BOOTSTRAP_RESET, false),\n claudeIncludeSubagents: boolFromEnv(process.env.CLAUDE_INCLUDE_SUBAGENTS, false),\n cleanupEveryCycles: Math.max(toInt(process.env.DAEMON_STORE_CLEANUP_CYCLES, 20), 1),\n };\n\n const stats = {\n startedAt: Date.now(),\n cycles: 0,\n filesScanned: 0,\n linesRead: 0,\n parsedEvents: 0,\n appended: 0,\n deduped: 0,\n contextsCreated: 0,\n errors: 0,\n };\n\n const state = {\n recentLogs: [],\n sourceStats: new Map(),\n sourceOrder: [],\n };\n\n let stdioErrorHandled = false;\n\n const runtime = {\n uc: null,\n stop: null,\n store: null,\n sources: null,\n ingestMode: \"all\",\n daemonRunning: false,\n lockHandle: null,\n };\n\n // ── stdio guards ──\n\n function isBenignStdioError(error) {\n const code = String(error?.code ?? \"\");\n return code === \"EIO\" || code === \"EPIPE\" || code === \"ENXIO\";\n }\n\n function handleStdioError(error, streamName) {\n if (!isBenignStdioError(error)) return;\n if (stdioErrorHandled) return;\n stdioErrorHandled = true;\n try { runtime.stop?.(\"stdio\"); } catch { /* ignore */ }\n if (LOG_LEVELS[cfg.logLevel] >= LOG_LEVELS.debug) {\n const msg = error instanceof Error ? error.message : String(error);\n console.error(`[debug] Ignored stdio ${streamName} error (${error?.code ?? \"?\"}): ${msg}`);\n }\n }\n\n process.stdin?.on?.(\"error\", (error) => handleStdioError(error, \"stdin\"));\n process.stdout?.on?.(\"error\", (error) => handleStdioError(error, \"stdout\"));\n process.stderr?.on?.(\"error\", (error) => handleStdioError(error, \"stderr\"));\n\n // ── helpers ──\n\n function runtimeLogsKeep() {\n return Math.max(cfg.uiRecentLimit, 180);\n }\n\n function formatTime(value = Date.now()) {\n return new Date(value).toISOString().slice(11, 19);\n }\n\n function safeText(value) {\n return String(value ?? \"\");\n }\n\n function compactValue(value) {\n const raw = safeText(value);\n if (raw.length <= 32) return raw;\n return `${raw.slice(0, 14)}...${raw.slice(-12)}`;\n }\n\n function formatDataInline(data) {\n if (!data || typeof data !== \"object\") return \"\";\n const entries = Object.entries(data).slice(0, 8);\n if (entries.length === 0) return \"\";\n return entries.map(([k, v]) => `${k}=${compactValue(v)}`).join(\" \");\n }\n\n function ensureSourceStats(sourceName) {\n if (!state.sourceStats.has(sourceName)) {\n state.sourceStats.set(sourceName, {\n filesScanned: 0, linesRead: 0, parsedEvents: 0,\n appended: 0, deduped: 0, contextsCreated: 0, errors: 0,\n lastEventType: \"-\", lastSessionId: \"-\", lastAt: 0, lastFile: \"-\",\n });\n }\n return state.sourceStats.get(sourceName);\n }\n\n function bumpSourceStat(sourceName, key, delta = 1) {\n const current = ensureSourceStats(sourceName);\n current[key] = (current[key] ?? 0) + delta;\n }\n\n function noteSourceActivity(sourceName, patch) {\n Object.assign(ensureSourceStats(sourceName), patch ?? {});\n }\n\n function logSourceFromData(data) {\n if (!data || typeof data !== \"object\") return \"\";\n for (const value of [data.source, data.context_source, data.contextSource, data?.metadata?.source]) {\n const raw = String(value ?? \"\").trim();\n if (raw) return raw.toLowerCase();\n }\n return \"\";\n }\n\n function pushRecentLog(level, message, data) {\n let line = String(message ?? \"\").replace(/[\\r\\n\\t\\v\\f\\x00-\\x1f]+/g, \" \").replace(/\\s{2,}/g, \" \");\n if (line.startsWith(\"Appended event to session context\")) line = \"context append\";\n if (line.startsWith(\"Context created\")) line = \"Context created\";\n if (line.startsWith(\"Context created without metadata fallback\")) line = \"Context created (fallback)\";\n if (line.startsWith(\"UltraContext daemon started\")) line = \"Daemon started\";\n if (line.startsWith(\"UltraContext daemon stopped\")) line = \"Daemon stopped\";\n if (line.startsWith(\"Failed to process file\")) line = \"File processing warning\";\n if (line.startsWith(\"Failed to create context with metadata\")) line = \"Context create warning\";\n\n const suffix = level === \"error\" ? formatDataInline(data) : \"\";\n if (suffix) line = `${line} ${suffix}`;\n\n state.recentLogs.push({ ts: formatTime(), level, source: logSourceFromData(data), text: line });\n const keep = runtimeLogsKeep();\n while (state.recentLogs.length > keep) state.recentLogs.shift();\n }\n\n function log(level, message, data) {\n const current = LOG_LEVELS[cfg.logLevel] ?? LOG_LEVELS.info;\n const target = LOG_LEVELS[level] ?? LOG_LEVELS.info;\n if (target > current) return;\n\n pushRecentLog(level, message, data);\n\n if (cfg.verboseLogs) {\n const stamp = colorize(new Date().toISOString(), ANSI.dim);\n const badge = colorize(`[${String(level).toUpperCase()}]`, levelColor(level));\n console.log(`${stamp} ${badge} ${message}`);\n if (data && typeof data === \"object\" && Object.keys(data).length > 0) {\n for (const line of JSON.stringify(data, null, 2).split(\"\\n\")) {\n console.log(`${colorize(\" |\", ANSI.gray)} ${line}`);\n }\n }\n return;\n }\n\n const now = formatTime();\n const suffix = formatDataInline(data);\n const finalLine = suffix ? `${message} ${suffix}` : message;\n console.log(`${now} ${String(level).toUpperCase().padEnd(5)} ${finalLine}`);\n }\n\n function bumpStat(name, delta = 1) {\n stats[name] = (stats[name] ?? 0) + delta;\n }\n\n function humanUptime(ms) {\n const totalSec = Math.max(Math.floor(ms / 1000), 0);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n }\n\n function emitStatusLine() {\n console.log([\n \"STATUS\", `uptime=${humanUptime(Date.now() - stats.startedAt)}`,\n `cycles=${stats.cycles}`, `files=${stats.filesScanned}`, `lines=${stats.linesRead}`,\n `parsed=${stats.parsedEvents}`, `append=${stats.appended}`, `dedupe=${stats.deduped}`,\n `ctx_new=${stats.contextsCreated}`, `errors=${stats.errors}`,\n ].join(\" \"));\n }\n\n function printVerboseBanner() {\n if (!cfg.verboseLogs) return;\n for (const row of [\n \"+------------------------------------------+\",\n \"| UltraContext Daemon (Verbose) |\",\n \"+------------------------------------------+\",\n ]) console.log(colorize(row, ANSI.cyan));\n }\n\n function errorDetails(error) {\n if (!error || typeof error !== \"object\") return { message: String(error) };\n const details = { message: error.message ?? String(error) };\n if (\"status\" in error) details.status = error.status;\n if (\"url\" in error) details.url = error.url;\n if (\"bodyText\" in error) details.bodyText = error.bodyText;\n return details;\n }\n\n // ── config persistence (file-only) ──\n\n function serializeConfigPrefs() {\n return {\n bootstrapMode: normalizeBootstrapModeWithPrompt(cfg.bootstrapMode) || \"prompt\",\n claudeIncludeSubagents: Boolean(cfg.claudeIncludeSubagents),\n };\n }\n\n async function persistConfigPrefsToFile(targetFile = cfg.configFile) {\n const target = path.resolve(targetFile);\n let existing = {};\n try {\n const raw = await fs.readFile(target, \"utf8\");\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) existing = parsed;\n } catch { /* ignore */ }\n\n const payload = JSON.stringify({ ...existing, ...serializeConfigPrefs() }, null, 2);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, `${payload}\\n`, \"utf8\");\n return { saved: true, file: target };\n }\n\n async function loadConfigPrefsFromPath(target) {\n let raw = \"\";\n try {\n raw = await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (error?.code === \"ENOENT\") return { loaded: false, missing: true, raw: \"\" };\n log(\"warn\", \"Failed to read config prefs file\", { file: target, ...errorDetails(error) });\n return { loaded: false, missing: false, raw: \"\" };\n }\n let parsed = null;\n try { parsed = JSON.parse(raw); } catch (error) {\n log(\"warn\", \"Failed to parse config prefs file\", { file: target, ...errorDetails(error) });\n return { loaded: false, missing: false, raw };\n }\n applyConfigPrefs(parsed);\n return { loaded: true, missing: false, raw };\n }\n\n async function loadConfigPrefsFromFile() {\n const primary = path.resolve(cfg.configFile);\n const loaded = await loadConfigPrefsFromPath(primary);\n return {\n loaded: loaded.loaded,\n source: loaded.loaded ? \"primary\" : \"none\",\n file: loaded.loaded ? primary : \"\",\n raw: loaded.raw ?? \"\",\n };\n }\n\n function applyConfigPrefs(prefs) {\n if (!prefs || typeof prefs !== \"object\") return;\n const fields = [\"bootstrapMode\", \"claudeIncludeSubagents\"];\n for (const field of fields) {\n if (!(field in prefs)) continue;\n if (field === \"bootstrapMode\") {\n cfg.bootstrapMode = normalizeBootstrapModeWithPrompt(prefs.bootstrapMode) || \"prompt\";\n continue;\n }\n cfg[field] = Boolean(prefs[field]);\n }\n }\n\n // ── config.json reading each cycle ──\n\n async function refreshConfigFromFile() {\n const data = await readConfigJson();\n if (!data || typeof data !== \"object\") return;\n\n // apply setting changes\n const before = serializeConfigPrefs();\n applyConfigPrefs(data);\n const after = serializeConfigPrefs();\n\n // rebuild sources if subagent toggle changed\n if (before.claudeIncludeSubagents !== after.claudeIncludeSubagents) {\n applyRuntimeSources(buildSources());\n }\n\n if (JSON.stringify(before) !== JSON.stringify(after)) {\n log(\"info\", \"Reloaded config from config.json\", {\n claude_subagents: after.claudeIncludeSubagents ? \"on\" : \"off\",\n bootstrap_mode: after.bootstrapMode,\n });\n }\n\n // handle bootstrapReset command flag\n if (data.bootstrapReset) {\n cfg.bootstrapReset = true;\n await resetBootstrapState();\n log(\"info\", \"Bootstrap reset triggered via config.json\");\n\n // clear the flag by writing config.json back\n const cleaned = { ...data };\n delete cleaned.bootstrapReset;\n await writeConfigJson(cleaned);\n }\n }\n\n // ── sources ──\n\n function applyRuntimeSources(sources) {\n runtime.sources = sources;\n state.sourceOrder = sources.map((s) => s.name);\n for (const name of state.sourceOrder) ensureSourceStats(name);\n }\n\n function buildSources() {\n const codexGlob = expandHome(process.env.CODEX_GLOB ?? \"~/.codex/sessions/**/*.jsonl\");\n const claudeGlob = expandHome(process.env.CLAUDE_GLOB ?? \"~/.claude/projects/**/*.jsonl\");\n const openclawGlob = expandHome(process.env.OPENCLAW_GLOB ?? \"~/.openclaw/agents/*/sessions/**/*.jsonl\");\n\n const sources = [];\n if (boolFromEnv(process.env.INGEST_CODEX, true)) {\n sources.push({ name: \"codex\", enabled: true, globs: [codexGlob], parseLine: parseCodexLine });\n }\n if (boolFromEnv(process.env.INGEST_CLAUDE, true)) {\n sources.push({\n name: \"claude\", enabled: true, globs: [claudeGlob],\n ignoreGlobs: cfg.claudeIncludeSubagents ? [] : [\"**/subagents/**\"],\n parseLine: parseClaudeCodeLine,\n });\n }\n if (boolFromEnv(process.env.INGEST_OPENCLAW, true)) {\n sources.push({ name: \"openclaw\", enabled: true, globs: [openclawGlob], parseLine: parseOpenClawLine });\n }\n\n // cursor — same format as Claude but uses \"role\" instead of \"type\"\n const cursorGlob = expandHome(process.env.CURSOR_GLOB ?? \"~/.cursor/projects/**/*.jsonl\");\n if (boolFromEnv(process.env.INGEST_CURSOR, true)) {\n sources.push({ name: \"cursor\", enabled: true, globs: [cursorGlob], parseLine: parseCursorLine });\n }\n\n // gemini — JSON format (not JSONL), uses parseFile instead of parseLine\n const geminiGlob = expandHome(process.env.GEMINI_GLOB ?? \"~/.gemini/tmp/*/chats/session-*.json\");\n if (boolFromEnv(process.env.INGEST_GEMINI, true)) {\n sources.push({ name: \"gemini\", enabled: true, globs: [geminiGlob], parseFile: parseGeminiFile });\n }\n\n // gstack — skill artifacts (learnings, timeline, reviews, resources)\n const gstackGlob = expandHome(process.env.GSTACK_GLOB ?? \"~/.gstack/projects/**/*.jsonl\");\n if (boolFromEnv(process.env.INGEST_GSTACK, true)) {\n sources.push({ name: \"gstack\", enabled: true, globs: [gstackGlob], parseLine: parseGstackLine });\n }\n\n return sources;\n }\n\n async function listSourceFiles(source) {\n return fg(source.globs, {\n onlyFiles: true, absolute: true, followSymbolicLinks: false,\n unique: true, suppressErrors: true, ignore: source.ignoreGlobs ?? [],\n });\n }\n\n // ── bootstrap ──\n\n function bootstrapStateStoreKey(sources) {\n return createBootstrapStateKey({\n host: cfg.host, userId: cfg.userId,\n sourceNames: sources.map((s) => s.name),\n });\n }\n\n function bootstrapModeLabel(mode) {\n return BOOTSTRAP_OPTIONS.find((o) => o.id === mode)?.label ?? mode;\n }\n\n function isWithinLast24h(timestamp, nowMs = Date.now()) {\n if (!timestamp) return false;\n const d = new Date(String(timestamp));\n if (Number.isNaN(d.getTime())) return false;\n return nowMs - d.getTime() <= 24 * 60 * 60 * 1000;\n }\n\n function offsetStoreKey(sourceName, fileId) { return `offset:${sourceName}:${fileId}`; }\n function seenEventStoreKey(sourceName, eventId) { return `seen:${sourceName}:${eventId}`; }\n function sessionContextStoreKey(sourceName, sessionId) { return `ctx:session:${sourceName}:${cfg.host}:${cfg.userId}:${sessionId}`; }\n\n async function primeOffsetsToEof(store, source, shouldStop = () => false) {\n if (shouldStop()) return;\n const files = await listSourceFiles(source);\n for (const filePath of files) {\n if (shouldStop()) break;\n try {\n const stat = await fs.stat(filePath);\n const fileId = `${stat.dev}:${stat.ino}`;\n\n // JSON-format sources (e.g. Gemini): store content hash to match processFile's comparison\n if (source.parseFile) {\n const contents = await fs.readFile(filePath, \"utf8\");\n store.setOffset(offsetStoreKey(source.name, fileId), sha256(contents));\n } else {\n store.setOffset(offsetStoreKey(source.name, fileId), stat.size);\n }\n } catch { /* ignore */ }\n }\n }\n\n function resolveBootstrapPlan({ sources }) {\n const key = bootstrapStateStoreKey(sources);\n if (cfg.bootstrapReset) {\n deleteBootstrapState(key);\n log(\"info\", \"Bootstrap state reset by configuration\", { key });\n }\n const forcedMode = normalizeBootstrapMode(cfg.bootstrapMode);\n if (forcedMode) return { mode: forcedMode, needsBootstrap: true, forced: true };\n const stored = normalizeBootstrapMode(getBootstrapState(key));\n if (stored) return { mode: stored, needsBootstrap: false, forced: false };\n return { mode: \"new_only\", needsBootstrap: true, forced: false };\n }\n\n async function applyBootstrapMode({ store, sources, mode, needsBootstrap, shouldStop = () => false }) {\n const selected = normalizeBootstrapMode(mode) || \"new_only\";\n if (!needsBootstrap) return \"all\";\n if (selected === \"new_only\") {\n for (const source of sources) {\n if (shouldStop()) break;\n await primeOffsetsToEof(store, source, shouldStop);\n }\n }\n if (shouldStop()) return \"all\";\n setBootstrapState(bootstrapStateStoreKey(sources), selected);\n if (selected === \"last_24h\") return \"last_24h\";\n return \"all\";\n }\n\n // ── validation ──\n\n function validateConfig() {\n if (!cfg.apiKey) throw new Error(\"Missing ULTRACONTEXT_API_KEY. Run `ultracontext config` to set up your API key.\");\n if (!cfg.apiKey.startsWith(\"uc_live_\") && !cfg.apiKey.startsWith(\"uc_test_\")) {\n log(\"warn\", \"ULTRACONTEXT_API_KEY format looks unusual\", { key_prefix: cfg.apiKey.slice(0, 8), key_len: cfg.apiKey.length });\n }\n }\n\n // ── process helpers ──\n\n function readProcessInfo(pid) {\n try {\n const out = spawnSync(\"ps\", [\"-o\", \"ppid=,command=\", \"-p\", String(pid)], { stdio: \"pipe\", encoding: \"utf8\" });\n const raw = String(out.stdout ?? \"\").trim();\n if (!raw) return null;\n const match = raw.match(/^(\\d+)\\s+(.*)$/);\n if (!match) return null;\n return { ppid: Number(match[1]), command: match[2] ?? \"\" };\n } catch { return null; }\n }\n\n function isWatchCommand(command) {\n const raw = String(command ?? \"\").trim();\n return raw.includes(\"node --watch\") || raw.includes(\" --watch \");\n }\n\n function stopWatchParentProcess() {\n let pid = Number(process.ppid);\n const seen = new Set();\n for (let depth = 0; depth < 10; depth += 1) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n if (seen.has(pid)) return false;\n seen.add(pid);\n const info = readProcessInfo(pid);\n if (!info) return false;\n if (isWatchCommand(info.command)) {\n try { process.kill(pid, \"SIGTERM\"); return true; } catch { return false; }\n }\n pid = Number(info.ppid);\n }\n return false;\n }\n\n // ── event ingestion ──\n\n function markEventSeen(store, sourceName, eventId) {\n return store.markEventSeen(seenEventStoreKey(sourceName, eventId), cfg.dedupeTtlSec);\n }\n\n // prevent duplicate context creation when files are processed in parallel\n const contextCreateInflight = new Map();\n\n async function getOrCreateContext(store, uc, cacheKey, metadata, sourceName) {\n const cached = store.getContextCache(cacheKey);\n if (cached) return cached;\n\n // coalesce concurrent creates for the same cache key\n if (contextCreateInflight.has(cacheKey)) return contextCreateInflight.get(cacheKey);\n\n const pending = (async () => {\n try {\n const created = await uc.create({ metadata });\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n if (cfg.logAppends) {\n log(\"info\", \"Context created\", {\n source: sourceName, context_id: created.id,\n session_id: metadata?.session_id ?? \"\",\n });\n }\n return created.id;\n } catch (error) {\n const details = errorDetails(error);\n bumpStat(\"errors\");\n bumpSourceStat(sourceName, \"errors\");\n log(\"warn\", \"Failed to create context with metadata\", details);\n\n if (details.status === 400) {\n const created = await uc.create();\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n if (cfg.logAppends) {\n log(\"warn\", \"Context created without metadata fallback\", {\n source: sourceName, context_id: created.id,\n });\n }\n return created.id;\n }\n throw error;\n } finally {\n contextCreateInflight.delete(cacheKey);\n }\n })();\n\n contextCreateInflight.set(cacheKey, pending);\n return pending;\n }\n\n async function appendToUltraContext({ store, uc, sourceName, normalized, eventId, filePath, lineOffset }) {\n\n // enrich context metadata with project path + first event timestamp\n const contextMeta = {\n source: sourceName, host: cfg.host, user_id: cfg.userId,\n session_id: normalized.sessionId,\n started_at: normalized.timestamp,\n };\n const projectPath = extractProjectPathFromFile(filePath);\n if (projectPath) contextMeta.project_path = projectPath;\n\n const sessionContextId = await getOrCreateContext(store, uc,\n sessionContextStoreKey(sourceName, normalized.sessionId),\n contextMeta, sourceName,\n );\n\n const safeRaw = redact(normalized.raw);\n const payload = {\n role: normalized.kind,\n content: { message: normalized.message, event_type: normalized.eventType, timestamp: normalized.timestamp, raw: safeRaw },\n metadata: { source: sourceName, host: cfg.host, user_id: cfg.userId, session_id: normalized.sessionId, event_id: eventId, file_path: filePath, file_offset: lineOffset },\n };\n\n await uc.append(sessionContextId, payload);\n bumpStat(\"appended\");\n bumpSourceStat(sourceName, \"appended\");\n noteSourceActivity(sourceName, { lastEventType: normalized.eventType, lastSessionId: normalized.sessionId, lastAt: Date.now() });\n\n if (cfg.logAppends) {\n log(\"info\", \"Appended event to session context\", {\n source: sourceName, session_id: normalized.sessionId, context_id: sessionContextId,\n event_type: normalized.eventType, role: normalized.kind, event_id: eventId,\n });\n }\n }\n\n // bulk ingestion tunables\n const BULK_BATCH_SIZE = 50;\n const FILE_CONCURRENCY = 8;\n const SESSION_CONCURRENCY = 6;\n\n // run async tasks with bounded concurrency\n async function parallelMap(items, concurrency, fn) {\n const results = [];\n let idx = 0;\n async function worker() {\n while (idx < items.length) {\n const i = idx++;\n results[i] = await fn(items[i], i);\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));\n return results;\n }\n\n async function appendBulkToUltraContext({ store, uc, sourceName, events, filePath }) {\n\n // group events by session id\n const bySession = new Map();\n for (const ev of events) {\n const key = ev.normalized.sessionId;\n if (!bySession.has(key)) bySession.set(key, []);\n bySession.get(key).push(ev);\n }\n\n // resolve all context ids first (sequential — touches local store)\n const sessionEntries = [...bySession.entries()];\n const projectPath = extractProjectPathFromFile(filePath);\n const contextIds = new Map();\n for (const [sessionId, sessionEvents] of sessionEntries) {\n const contextMeta = {\n source: sourceName, host: cfg.host, user_id: cfg.userId,\n session_id: sessionId,\n started_at: sessionEvents[0].normalized.timestamp,\n };\n if (projectPath) contextMeta.project_path = projectPath;\n\n // extract title from first real user message\n const isRealUserEvent = (ev) => {\n if (ev.normalized.kind !== \"user\") return false;\n const et = ev.normalized.eventType ?? \"\";\n const msg = ev.normalized.message ?? \"\";\n // skip codex system-injected user messages (AGENTS.md, permissions)\n if (et === \"response_item.message\") return false;\n // skip openclaw session init + claude tool results + xml tags\n if (msg.startsWith(\"A new session was started\")) return false;\n if (msg.startsWith(\"[result]\")) return false;\n if (msg.startsWith(\"<\")) return false;\n return true;\n };\n const firstUserEvent = sessionEvents.find(isRealUserEvent)\n ?? sessionEvents.find(ev => ev.normalized.kind === \"user\");\n if (firstUserEvent?.normalized?.message) {\n contextMeta.title = firstUserEvent.normalized.message.replace(/[\\r\\n\\t\\v\\f\\x00-\\x1f]+/g, \" \").replace(/\\s{2,}/g, \" \").trim().slice(0, 120);\n }\n const ctxId = await getOrCreateContext(store, uc,\n sessionContextStoreKey(sourceName, sessionId),\n contextMeta, sourceName,\n );\n contextIds.set(sessionId, ctxId);\n }\n\n // send bulk requests in parallel across sessions\n await parallelMap(sessionEntries, SESSION_CONCURRENCY, async ([sessionId, sessionEvents]) => {\n const sessionContextId = contextIds.get(sessionId);\n\n // build payloads array\n const payloads = sessionEvents.map(({ normalized, eventId, lineOffset }) => {\n const safeRaw = redact(normalized.raw);\n return {\n role: normalized.kind,\n content: { message: normalized.message, event_type: normalized.eventType, timestamp: normalized.timestamp, raw: safeRaw },\n metadata: { source: sourceName, host: cfg.host, user_id: cfg.userId, session_id: sessionId, event_id: eventId, file_path: filePath, file_offset: lineOffset },\n };\n });\n\n // send in batches of BULK_BATCH_SIZE\n for (let i = 0; i < payloads.length; i += BULK_BATCH_SIZE) {\n const batch = payloads.slice(i, i + BULK_BATCH_SIZE);\n await uc.append(sessionContextId, batch);\n }\n\n // update stats\n bumpStat(\"appended\", sessionEvents.length);\n bumpSourceStat(sourceName, \"appended\", sessionEvents.length);\n const last = sessionEvents[sessionEvents.length - 1].normalized;\n noteSourceActivity(sourceName, { lastEventType: last.eventType, lastSessionId: sessionId, lastAt: Date.now() });\n\n if (cfg.logAppends) {\n for (const { normalized } of sessionEvents) {\n const msg = (normalized.message ?? \"\").replace(/[\\r\\n\\t\\v\\f\\x00-\\x1f]+/g, \" \").replace(/\\s{2,}/g, \" \").trim().slice(0, 80);\n log(\"info\", `[${normalized.eventType}] ${msg}`, {\n source: sourceName, session_id: sessionId,\n });\n }\n }\n });\n }\n\n // ── file reading ──\n\n async function readNewLines(filePath, offset) {\n const handle = await fs.open(filePath, \"r\");\n try {\n const stat = await handle.stat();\n let start = offset;\n if (start > stat.size) start = 0;\n const unread = stat.size - start;\n if (unread <= 0) return { lines: [], nextOffset: start, fileId: `${stat.dev}:${stat.ino}` };\n\n const readLen = Math.min(unread, cfg.maxReadBytes);\n const buffer = Buffer.allocUnsafe(readLen);\n const { bytesRead } = await handle.read(buffer, 0, readLen, start);\n const chunk = buffer.subarray(0, bytesRead);\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline === -1) return { lines: [], nextOffset: start, fileId: `${stat.dev}:${stat.ino}` };\n\n const text = chunk.subarray(0, lastNewline + 1).toString(\"utf8\");\n const lines = [];\n let consumed = 0;\n for (const line of text.split(\"\\n\")) {\n const lineBytes = Buffer.byteLength(line, \"utf8\") + 1;\n const lineOffset = start + consumed;\n consumed += lineBytes;\n if (!line.trim()) continue;\n lines.push({ line, lineOffset });\n }\n return { lines, nextOffset: start + lastNewline + 1, fileId: `${stat.dev}:${stat.ino}` };\n } finally {\n await handle.close();\n }\n }\n\n async function processFile({ store, uc, source, filePath, shouldStop = () => false, ingestMode = \"all\" }) {\n if (shouldStop()) return;\n try {\n const stat = await fs.stat(filePath);\n bumpStat(\"filesScanned\");\n bumpSourceStat(source.name, \"filesScanned\");\n\n const fileId = `${stat.dev}:${stat.ino}`;\n const offsetKey = offsetStoreKey(source.name, fileId);\n\n // JSON-format sources (e.g. Gemini): read entire file, dedup by content hash\n if (source.parseFile) {\n const fileContents = await fs.readFile(filePath, \"utf8\");\n const contentHash = sha256(fileContents);\n const storedHash = store.getOffset(offsetKey);\n if (storedHash === contentHash) return;\n\n noteSourceActivity(source.name, { lastFile: filePath, lastAt: Date.now() });\n const allEvents = source.parseFile({ fileContents, filePath });\n if (!Array.isArray(allEvents) || allEvents.length === 0) return;\n\n bumpStat(\"linesRead\", allEvents.length);\n bumpSourceStat(source.name, \"linesRead\", allEvents.length);\n\n const pendingEvents = [];\n for (let i = 0; i < allEvents.length; i++) {\n if (shouldStop()) break;\n const normalized = allEvents[i];\n if (!normalized || !normalized.sessionId) continue;\n if (ingestMode === \"last_24h\" && !isWithinLast24h(normalized.timestamp)) continue;\n\n bumpStat(\"parsedEvents\");\n bumpSourceStat(source.name, \"parsedEvents\");\n noteSourceActivity(source.name, { lastEventType: normalized.eventType, lastSessionId: normalized.sessionId, lastAt: Date.now() });\n\n const eventId = sha256(`${source.name}|${cfg.host}|${cfg.userId}|${normalized.sessionId}|${fileId}|${i}`);\n const isNew = markEventSeen(store, source.name, eventId);\n if (!isNew) { bumpStat(\"deduped\"); bumpSourceStat(source.name, \"deduped\"); continue; }\n\n pendingEvents.push({ normalized, eventId, lineOffset: i });\n }\n\n if (pendingEvents.length > 0) {\n await appendBulkToUltraContext({ store, uc, sourceName: source.name, events: pendingEvents, filePath });\n }\n store.setOffset(offsetKey, contentHash);\n return;\n }\n\n // JSONL-format sources: read new lines from byte offset\n const currentOffset = toInt(store.getOffset(offsetKey), 0);\n const { lines, nextOffset } = await readNewLines(filePath, currentOffset);\n\n bumpStat(\"linesRead\", lines.length);\n bumpSourceStat(source.name, \"linesRead\", lines.length);\n noteSourceActivity(source.name, { lastFile: filePath, lastAt: Date.now() });\n if (lines.length === 0) return;\n\n // collect all new events, then bulk-append per session\n const pendingEvents = [];\n\n for (const { line, lineOffset } of lines) {\n if (shouldStop()) break;\n const normalized = source.parseLine({ line, filePath });\n if (!normalized || !normalized.sessionId) continue;\n if (ingestMode === \"last_24h\" && !isWithinLast24h(normalized.timestamp)) continue;\n\n bumpStat(\"parsedEvents\");\n bumpSourceStat(source.name, \"parsedEvents\");\n noteSourceActivity(source.name, { lastEventType: normalized.eventType, lastSessionId: normalized.sessionId, lastAt: Date.now() });\n\n const eventId = sha256(`${source.name}|${cfg.host}|${cfg.userId}|${normalized.sessionId}|${fileId}|${lineOffset}|${sha256(line)}`);\n const isNew = markEventSeen(store, source.name, eventId);\n if (!isNew) { bumpStat(\"deduped\"); bumpSourceStat(source.name, \"deduped\"); continue; }\n\n pendingEvents.push({ normalized, eventId, lineOffset });\n }\n\n // bulk append all collected events\n if (pendingEvents.length > 0) {\n await appendBulkToUltraContext({ store, uc, sourceName: source.name, events: pendingEvents, filePath });\n }\n\n store.setOffset(offsetKey, nextOffset);\n } catch (error) {\n bumpStat(\"errors\");\n bumpSourceStat(source.name, \"errors\");\n log(\"warn\", `Failed to process file for source=${source.name}`, { filePath, ...errorDetails(error) });\n }\n }\n\n async function processSource({ store, uc, source, shouldStop = () => false, ingestMode = \"all\" }) {\n if (shouldStop()) return;\n let files = [];\n try { files = await listSourceFiles(source); } catch (error) {\n bumpStat(\"errors\");\n log(\"warn\", `Failed to list files for source=${source.name}`, { error: error instanceof Error ? error.message : String(error) });\n return;\n }\n\n // process files concurrently\n await parallelMap(\n files.filter(() => !shouldStop()),\n FILE_CONCURRENCY,\n (filePath) => processFile({ store, uc, source, filePath, shouldStop, ingestMode }),\n );\n }\n\n // ── runtime commands ──\n\n async function resetBootstrapState() {\n const sources = runtime.sources ?? buildSources();\n deleteBootstrapState(bootstrapStateStoreKey(sources));\n }\n\n // ── cleanup ──\n\n async function stopRuntimeResources() {\n runtime.daemonRunning = false;\n if (runtime.lockHandle) { try { await runtime.lockHandle.release(); } catch (e) { log(\"warn\", \"Failed to release daemon lock\", errorDetails(e)); } runtime.lockHandle = null; }\n if (runtime.store) { try { runtime.store.close(); } catch (e) { log(\"warn\", \"Failed to close local store\", errorDetails(e)); } runtime.store = null; }\n runtime.uc = null;\n runtime.stop = null;\n runtime.sources = null;\n runtime.ingestMode = \"all\";\n }\n\n // ── main loop ──\n\n async function daemonMain() {\n validateConfig();\n printVerboseBanner();\n\n const store = createStore({ dbPath: cfg.dbFile });\n runtime.store = store;\n\n // load persisted config from file\n try {\n const fileLoad = await loadConfigPrefsFromFile();\n if (fileLoad.loaded) {\n log(\"info\", \"Loaded persisted config preferences\", {\n file_source: fileLoad.source, file_path: fileLoad.file,\n });\n } else {\n await persistConfigPrefsToFile();\n log(\"info\", \"Created default runtime config file\", { file: path.resolve(cfg.configFile) });\n }\n } catch (error) {\n log(\"warn\", \"Failed to load persisted config preferences\", errorDetails(error));\n }\n\n // sources + lock\n const sources = buildSources();\n if (sources.length === 0) throw new Error(\"No sources enabled. Set INGEST_CODEX=true, INGEST_CLAUDE=true, and/or INGEST_GSTACK=true\");\n applyRuntimeSources(sources);\n\n runtime.lockHandle = await acquireFileLock({ lockPath: cfg.lockFile, userId: cfg.userId, host: cfg.host });\n\n const uc = new UltraContext({ apiKey: cfg.apiKey, baseUrl: cfg.baseUrl });\n runtime.uc = uc;\n\n // connectivity check\n try { await uc.get({ limit: 1 }); } catch (error) {\n const details = errorDetails(error);\n throw new Error(`UltraContext auth/connectivity check failed (status=${details.status ?? \"?\"}, url=${details.url ?? cfg.baseUrl}, body=${details.bodyText ?? details.message}). Check your API key at https://ultracontext.ai`);\n }\n\n log(\"info\", \"UltraContext daemon started\", {\n user_id: cfg.userId, host: cfg.host, poll_ms: cfg.pollMs, mode: \"headless\",\n db_file: cfg.dbFile,\n sources: sources.map((s) => ({ name: s.name, globs: s.globs })),\n });\n\n runtime.daemonRunning = true;\n\n // main poll loop\n let running = true;\n let stopRequested = false;\n const stop = (reason = \"internal\") => {\n if (stopRequested) return;\n stopRequested = true;\n if (reason === \"user\" || reason === \"sigint\") stopWatchParentProcess();\n running = false;\n };\n runtime.stop = stop;\n\n process.on(\"SIGINT\", () => stop(\"sigint\"));\n process.on(\"SIGTERM\", () => stop(\"sigterm\"));\n\n // bootstrap\n runtime.ingestMode = \"all\";\n if (running) {\n const bootstrapPlan = resolveBootstrapPlan({ store, sources });\n if (running) {\n runtime.ingestMode = await applyBootstrapMode({\n store, sources, mode: bootstrapPlan.mode,\n needsBootstrap: bootstrapPlan.needsBootstrap, shouldStop: () => !running,\n });\n log(\"info\", \"Bootstrap mode resolved\", {\n mode: bootstrapPlan.mode, mode_label: bootstrapModeLabel(bootstrapPlan.mode),\n applied: bootstrapPlan.needsBootstrap ? \"yes\" : \"no\", ingest_mode: runtime.ingestMode,\n });\n }\n }\n\n while (running) {\n // check config.json for setting changes + commands\n try { await refreshConfigFromFile(); } catch (error) {\n log(\"warn\", \"Failed to refresh config from config.json\", errorDetails(error));\n }\n\n bumpStat(\"cycles\");\n const cycleStart = Date.now();\n\n // process all sources in parallel\n const activeSources = (runtime.sources ?? []);\n await Promise.all(activeSources.map((source) =>\n processSource({ store, uc, source, shouldStop: () => !running, ingestMode: runtime.ingestMode ?? \"all\" }),\n ));\n\n if (stats.cycles % cfg.cleanupEveryCycles === 0) { try { store.cleanupExpired(); } catch { /* ignore */ } }\n\n // write status.json atomically after each cycle\n try { await writeStatusJson(cfg, stats, state, runtime); } catch { /* ignore */ }\n\n if (!running) break;\n const waitMs = Math.max(cfg.pollMs - (Date.now() - cycleStart), 10);\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n\n runtime.daemonRunning = false;\n\n // final status write\n try { await writeStatusJson(cfg, stats, state, runtime); } catch { /* ignore */ }\n\n emitStatusLine();\n await stopRuntimeResources();\n log(\"info\", \"UltraContext daemon stopped\");\n }\n\n // ── run ──\n\n daemonMain().catch(async (error) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isAlreadyRunning = error?.code === \"ELOCKED\" || errorMessage.startsWith(\"UltraContext daemon already running\");\n await stopRuntimeResources();\n\n if (isAlreadyRunning) {\n log(\"warn\", \"UltraContext already running\", { error: errorMessage });\n stopWatchParentProcess();\n } else {\n bumpStat(\"errors\");\n log(\"error\", \"UltraContext failed\", { error: errorMessage });\n }\n process.exit(isAlreadyRunning ? 2 : 1);\n });\n}\n","// SDK sync entry-point — wires store + boots daemon without dotenv\n// NOTE: parsers are re-exported here so the TUI bundle can import them\n// from this chunk. The daemonBoot() call MUST be guarded so importing\n// this module for parsers alone doesn't start a second daemon.\nimport { createStore, resolveDbPath } from \"@ultracontext/sync/store\";\nimport { daemonBoot } from \"@ultracontext/sync/sync\";\n\n// only boot when spawned as daemon child (launcher passes --daemon)\nif (process.argv.includes(\"--daemon\")) {\n daemonBoot({ createStore, resolveDbPath });\n}\n"],"mappings":"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"}