ultracontext 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/entry.mjs +3 -3
- package/dist/cli/sdk-daemon.mjs +11 -4
- package/dist/cli/sdk-daemon.mjs.map +1 -1
- package/dist/{ctl-3wE5-uEy.mjs → ctl-BVPu-D57.mjs} +3 -3
- package/dist/{ctl-3wE5-uEy.mjs.map → ctl-BVPu-D57.mjs.map} +1 -1
- package/dist/{launcher-DeTwUGTs.mjs → launcher-BFPi7_wD.mjs} +3 -3
- package/dist/{launcher-DeTwUGTs.mjs.map → launcher-BFPi7_wD.mjs.map} +1 -1
- package/dist/{lock-PqeXMp7P.mjs → lock-CQ3xrIlj.mjs} +2 -2
- package/dist/{lock-PqeXMp7P.mjs.map → lock-CQ3xrIlj.mjs.map} +1 -1
- package/dist/{src-B9CWO5Xk.mjs → src-BSCJv6SU.mjs} +2 -2
- package/dist/{src-B9CWO5Xk.mjs.map → src-BSCJv6SU.mjs.map} +1 -1
- package/dist/{src-B7VNX8_g.mjs → src-DzUz8GPJ.mjs} +85 -8
- package/dist/src-DzUz8GPJ.mjs.map +1 -0
- package/dist/{tui-BmUdW0Nf.mjs → tui-C3H6iRjz.mjs} +4 -4
- package/dist/tui-C3H6iRjz.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/src-B7VNX8_g.mjs.map +0 -1
- package/dist/tui-BmUdW0Nf.mjs.map +0 -1
package/dist/cli/entry.mjs
CHANGED
|
@@ -313,18 +313,18 @@ async function checkForUpdate() {
|
|
|
313
313
|
if (latest && isNewer(latest, current)) printUpdateNotice(current, latest);
|
|
314
314
|
}
|
|
315
315
|
async function launchDaemonSDK() {
|
|
316
|
-
const { launchDaemon } = await import("../launcher-
|
|
316
|
+
const { launchDaemon } = await import("../launcher-BFPi7_wD.mjs");
|
|
317
317
|
await launchDaemon({
|
|
318
318
|
entryPath: fileURLToPath(new URL("./sdk-daemon.mjs", import.meta.url)),
|
|
319
319
|
diagnosticsHint: "DAEMON_VERBOSE=1 ultracontext start"
|
|
320
320
|
});
|
|
321
321
|
}
|
|
322
322
|
async function runCtlSDK() {
|
|
323
|
-
const { runCtl } = await import("../ctl-
|
|
323
|
+
const { runCtl } = await import("../ctl-BVPu-D57.mjs");
|
|
324
324
|
await runCtl();
|
|
325
325
|
}
|
|
326
326
|
async function launchTuiSDK() {
|
|
327
|
-
const { tuiBoot } = await import("../tui-
|
|
327
|
+
const { tuiBoot } = await import("../tui-C3H6iRjz.mjs");
|
|
328
328
|
await tuiBoot({
|
|
329
329
|
assetsRoot: path.resolve(__dirname, "..", ".."),
|
|
330
330
|
offlineNotice: "Daemon offline. Run: ultracontext start"
|
package/dist/cli/sdk-daemon.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as parseDaemonWsMessage, b as truncateString, c as resolveDaemonWsInfoFile, f as expandHome, i as normalizeBootstrapMode, l as resolveDaemonWsPort, n as buildDaemonWsMessage, o as parseProtocolJson, r as createBootstrapStateKey, s as resolveDaemonWsHost, t as DAEMON_WS_MESSAGE_TYPES } from "../src-
|
|
2
|
-
import { a as sha256, i as extractProjectPathFromFile, n as resolveLockPath, o as toInt, r as boolFromEnv, t as acquireFileLock } from "../lock-
|
|
3
|
-
import { a as
|
|
1
|
+
import { a as parseDaemonWsMessage, b as truncateString, c as resolveDaemonWsInfoFile, f as expandHome, i as normalizeBootstrapMode, l as resolveDaemonWsPort, n as buildDaemonWsMessage, o as parseProtocolJson, r as createBootstrapStateKey, s as resolveDaemonWsHost, t as DAEMON_WS_MESSAGE_TYPES } from "../src-BSCJv6SU.mjs";
|
|
2
|
+
import { a as sha256, i as extractProjectPathFromFile, n as resolveLockPath, o as toInt, r as boolFromEnv, t as acquireFileLock } from "../lock-CQ3xrIlj.mjs";
|
|
3
|
+
import { a as parseGstackLine, c as parseClaudeCodeLine, o as parseOpenClawLine, s as parseCodexLine } from "../src-DzUz8GPJ.mjs";
|
|
4
4
|
import process$1 from "node:process";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import fs from "node:fs";
|
|
@@ -882,6 +882,13 @@ async function daemonBoot({ createStore, resolveDbPath }) {
|
|
|
882
882
|
globs: [openclawGlob],
|
|
883
883
|
parseLine: parseOpenClawLine
|
|
884
884
|
});
|
|
885
|
+
const gstackGlob = expandHome(process$1.env.GSTACK_GLOB ?? "~/.gstack/projects/**/*.jsonl");
|
|
886
|
+
if (boolFromEnv(process$1.env.INGEST_GSTACK, true)) sources.push({
|
|
887
|
+
name: "gstack",
|
|
888
|
+
enabled: true,
|
|
889
|
+
globs: [gstackGlob],
|
|
890
|
+
parseLine: parseGstackLine
|
|
891
|
+
});
|
|
885
892
|
return sources;
|
|
886
893
|
}
|
|
887
894
|
async function listSourceFiles(source) {
|
|
@@ -1386,7 +1393,7 @@ async function daemonBoot({ createStore, resolveDbPath }) {
|
|
|
1386
1393
|
log("warn", "Failed to load persisted config preferences", errorDetails(error));
|
|
1387
1394
|
}
|
|
1388
1395
|
const sources = buildSources();
|
|
1389
|
-
if (sources.length === 0) throw new Error("No sources enabled. Set INGEST_CODEX=true and/or
|
|
1396
|
+
if (sources.length === 0) throw new Error("No sources enabled. Set INGEST_CODEX=true, INGEST_CLAUDE=true, and/or INGEST_GSTACK=true");
|
|
1390
1397
|
applyRuntimeSources(sources);
|
|
1391
1398
|
runtime.lockHandle = await acquireFileLock({
|
|
1392
1399
|
lockPath: cfg.lockFile,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-daemon.mjs","names":["WebSocket","fs","process","fs"],"sources":["../../../daemon/src/store.mjs","../../../daemon/src/redact.mjs","../../../daemon/src/ws-server.mjs","../../../daemon/src/daemon.mjs","../../src/cli/sdk-daemon.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 daemon_config (\n key TEXT PRIMARY KEY,\n value TEXT,\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 getConfig: db.prepare(`\n SELECT value\n FROM daemon_config\n WHERE key = ?\n LIMIT 1\n `),\n setConfig: db.prepare(`\n INSERT INTO daemon_config (key, value, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n updated_at = unixepoch()\n `),\n deleteConfig: db.prepare(`\n DELETE FROM daemon_config\n WHERE key = ?\n `),\n getAllConfig: db.prepare(`\n SELECT key, value\n FROM daemon_config\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 getConfig(key) {\n const row = stmt.getConfig.get(String(key ?? \"\"));\n return row ? String(row.value ?? \"\") : null;\n },\n setConfig(key, value) {\n stmt.setConfig.run(String(key ?? \"\"), String(value ?? \"\"));\n },\n deleteConfig(key) {\n stmt.deleteConfig.run(String(key ?? \"\"));\n },\n getAllConfig() {\n const out = {};\n for (const row of stmt.getAllConfig.all()) {\n out[String(row.key)] = String(row.value ?? \"\");\n }\n return out;\n },\n getConfigBool(key, fallback = false) {\n return parseBool(this.getConfig(key), fallback);\n },\n getConfigInt(key, fallback = 0) {\n return parseNumber(this.getConfig(key), fallback);\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 fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n DAEMON_WS_MESSAGE_TYPES,\n buildDaemonWsMessage,\n parseDaemonWsMessage,\n} from \"@ultracontext/protocol\";\nimport { WebSocket, WebSocketServer } from \"ws\";\n\nfunction safeParseMessage(raw) {\n return parseDaemonWsMessage(String(raw ?? \"\"), null);\n}\n\nfunction safeSend(ws, payload) {\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n ws.send(JSON.stringify(payload));\n}\n\nfunction safeErrorMessage(error, fallback = \"unknown_error\") {\n if (!error) return fallback;\n if (error instanceof Error && error.message) return error.message;\n return String(error);\n}\n\nexport function createWsServer({\n host,\n port,\n infoFilePath,\n portFilePath,\n heartbeatMs = 5000,\n getSnapshot = () => ({}),\n getLogs = () => [],\n getConfig = () => ({}),\n onCommand = async () => ({}),\n} = {}) {\n const clients = new Set();\n let wss = null;\n let heartbeatTimer = null;\n let currentPort = 0;\n const discoveryFilePath = infoFilePath ?? portFilePath;\n\n const broadcast = (message) => {\n for (const client of clients) safeSend(client, message);\n };\n\n const stopHeartbeat = () => {\n if (!heartbeatTimer) return;\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n };\n\n const startHeartbeat = () => {\n stopHeartbeat();\n heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const client of clients) {\n const lastPong = Number(client.__ucLastPong ?? 0);\n if (lastPong && now - lastPong > heartbeatMs * 3) {\n try {\n client.terminate();\n } catch {\n // ignore\n }\n continue;\n }\n safeSend(client, buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.PING, { ts: now }));\n }\n }, heartbeatMs);\n heartbeatTimer.unref?.();\n };\n\n async function writePortFile() {\n if (!discoveryFilePath) return;\n const resolved = path.resolve(discoveryFilePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n const payload = {\n pid: process.pid,\n host,\n port: currentPort,\n startedAt: new Date().toISOString(),\n };\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n }\n\n async function removePortFile() {\n if (!discoveryFilePath) return;\n try {\n await fs.unlink(path.resolve(discoveryFilePath));\n } catch {\n // ignore\n }\n }\n\n return {\n async start() {\n if (wss) return { host, port: currentPort };\n wss = new WebSocketServer({ host, port });\n\n await new Promise((resolve, reject) => {\n const onError = (error) => {\n wss?.off?.(\"listening\", onListening);\n reject(error);\n };\n const onListening = () => {\n wss?.off?.(\"error\", onError);\n resolve();\n };\n wss.once(\"error\", onError);\n wss.once(\"listening\", onListening);\n });\n\n const address = wss.address();\n currentPort = typeof address === \"object\" && address ? Number(address.port ?? 0) : Number(port ?? 0);\n await writePortFile();\n\n wss.on(\"connection\", (ws) => {\n ws.__ucLastPong = Date.now();\n clients.add(ws);\n\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.SNAPSHOT,\n data: {\n state: getSnapshot(),\n recentLogs: getLogs(),\n config: getConfig(),\n clients: clients.size,\n },\n });\n\n ws.on(\"message\", async (raw) => {\n const msg = safeParseMessage(raw);\n if (!msg || typeof msg !== \"object\") return;\n\n if (msg.type === DAEMON_WS_MESSAGE_TYPES.PONG) {\n ws.__ucLastPong = Date.now();\n return;\n }\n\n const requestId = msg.id ?? null;\n try {\n const result = await onCommand(msg, { clients: clients.size });\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.REQUEST_ACK,\n id: requestId,\n ok: true,\n data: result ?? {},\n });\n } catch (error) {\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.REQUEST_ACK,\n id: requestId,\n ok: false,\n error: safeErrorMessage(error),\n });\n }\n });\n\n ws.on(\"close\", () => {\n clients.delete(ws);\n broadcast({\n type: DAEMON_WS_MESSAGE_TYPES.STATE,\n data: {\n ...getSnapshot(),\n clients: clients.size,\n },\n });\n });\n\n ws.on(\"error\", () => {\n clients.delete(ws);\n });\n });\n\n startHeartbeat();\n return { host, port: currentPort };\n },\n broadcastState() {\n broadcast({\n type: DAEMON_WS_MESSAGE_TYPES.STATE,\n data: {\n ...getSnapshot(),\n clients: clients.size,\n },\n });\n },\n broadcastLog(entry) {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.LOG, entry));\n },\n broadcastEvent(event) {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.CONTEXT_EVENT, event));\n },\n broadcastConfig() {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.CONFIG_STATE, getConfig()));\n },\n clientCount() {\n return clients.size;\n },\n async stop() {\n stopHeartbeat();\n for (const client of clients) {\n try {\n client.close();\n } catch {\n // ignore\n }\n }\n clients.clear();\n\n if (wss) {\n await new Promise((resolve) => {\n wss.close(() => resolve());\n });\n wss = null;\n }\n await removePortFile();\n },\n };\n}\n","// daemon core — receives store factory as param so callers control env/sqlite\nimport fs from \"node:fs/promises\";\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 DAEMON_WS_MESSAGE_TYPES,\n createBootstrapStateKey,\n normalizeBootstrapMode,\n parseProtocolJson,\n resolveDaemonWsHost,\n resolveDaemonWsInfoFile,\n resolveDaemonWsPort,\n} from \"@ultracontext/protocol\";\n\nimport { acquireFileLock, resolveLockPath } from \"./lock.mjs\";\nimport { redact } from \"./redact.mjs\";\nimport { parseClaudeCodeLine, parseCodexLine, parseOpenClawLine } from \"@ultracontext/harness\";\nimport { boolFromEnv, expandHome, extractProjectPathFromFile, sha256, toInt } from \"./utils.mjs\";\nimport { createWsServer } from \"./ws-server.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 PERSISTED_CONFIG_FIELDS = [\"bootstrapMode\", \"claudeIncludeSubagents\"];\nconst STORE_CONFIG_PREFS_KEY = \"daemon:prefs\";\nconst cliArgs = new Set(process.argv.slice(2));\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// ── 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 wsHost: resolveDaemonWsHost(process.env),\n wsPort: resolveDaemonWsPort(process.env),\n wsInfoFile: resolveDaemonWsInfoFile(process.env),\n dedupeTtlSec: toInt(process.env.DAEMON_DEDUPE_TTL_SEC, 60 * 60 * 24 * 30),\n maxReadBytes: toInt(process.env.DAEMON_MAX_READ_BYTES, 512 * 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 daemonStateTimer = null;\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 wsServer: null,\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 const last = state.recentLogs[state.recentLogs.length - 1];\n if (runtime.wsServer && last) runtime.wsServer.broadcastLog(last);\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\n // ── config persistence ──\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 function persistConfigPrefsToStore(store = runtime.store) {\n if (!store) return;\n store.setConfig(STORE_CONFIG_PREFS_KEY, JSON.stringify(serializeConfigPrefs()));\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 async function backupConfigFileAsBak(targetFile, sourceRaw = \"\") {\n const source = path.resolve(targetFile);\n const backup = `${source}.bak`;\n let raw = sourceRaw;\n if (!raw) {\n try { raw = await fs.readFile(source, \"utf8\"); } catch { return { backedUp: false, reason: \"missing\", backup }; }\n }\n try { await fs.access(backup); return { backedUp: false, reason: \"exists\", backup }; } catch { /* continue */ }\n await fs.rename(source, backup);\n await fs.writeFile(source, raw, \"utf8\");\n return { backedUp: true, reason: \"ok\", backup };\n }\n\n function applyConfigPrefs(prefs) {\n if (!prefs || typeof prefs !== \"object\") return;\n for (const field of PERSISTED_CONFIG_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 function loadConfigPrefsFromStore(store = runtime.store) {\n if (!store) return false;\n const raw = store.getConfig(STORE_CONFIG_PREFS_KEY);\n const parsed = parseProtocolJson(raw, null);\n if (!parsed || typeof parsed !== \"object\") return false;\n applyConfigPrefs(parsed);\n return true;\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 refreshDaemonConfigFromStore(store = runtime.store) {\n if (!store) return false;\n const before = serializeConfigPrefs();\n const loaded = loadConfigPrefsFromStore(store);\n if (!loaded) return false;\n const after = serializeConfigPrefs();\n if (JSON.stringify(before) === JSON.stringify(after)) return false;\n\n if (before.claudeIncludeSubagents !== after.claudeIncludeSubagents) {\n applyRuntimeSources(buildSources());\n }\n log(\"info\", \"Reloaded config prefs from local store\", {\n claude_subagents: after.claudeIncludeSubagents ? \"on\" : \"off\",\n bootstrap_mode: after.bootstrapMode,\n });\n runtime.wsServer?.broadcastConfig();\n return true;\n }\n\n function buildDaemonRuntimeSnapshot() {\n return {\n ts: Date.now(), mode: \"daemon\", running: Boolean(runtime.daemonRunning),\n pid: process.pid, host: cfg.host, userId: cfg.userId,\n stats: { ...stats },\n sourceStats: state.sourceOrder.map((name) => ({ name, ...ensureSourceStats(name) })),\n };\n }\n\n function publishDaemonRuntimeSnapshot() {\n runtime.wsServer?.broadcastState();\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 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\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({ store, sources }) {\n const key = bootstrapStateStoreKey(sources);\n if (cfg.bootstrapReset) {\n store.deleteConfig(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(store.getConfig(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 store.setConfig(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\");\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 async function getOrCreateContext(store, uc, cacheKey, metadata, sourceName) {\n const cached = store.getContextCache(cacheKey);\n if (cached) return cached;\n\n try {\n const created = await uc.create({ metadata });\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n runtime.wsServer?.broadcastEvent({\n action: \"created\", source: sourceName,\n sessionId: String(metadata?.session_id ?? \"\"),\n contextId: created.id,\n });\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 runtime.wsServer?.broadcastEvent({\n action: \"created\", source: sourceName,\n sessionId: String(metadata?.session_id ?? \"\"),\n contextId: created.id,\n });\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 }\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 runtime.wsServer?.broadcastEvent({ action: \"appended\", source: sourceName, sessionId: normalized.sessionId, contextId: sessionContextId });\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 // ── 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 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 await appendToUltraContext({ store, uc, sourceName: source.name, normalized, eventId, filePath, lineOffset });\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 for (const filePath of files) {\n if (shouldStop()) break;\n await processFile({ store, uc, source, filePath, shouldStop, ingestMode });\n }\n }\n\n // ── runtime commands ──\n\n async function resetBootstrapState() {\n if (!runtime.store) return;\n const sources = runtime.sources ?? buildSources();\n runtime.store.deleteConfig(bootstrapStateStoreKey(sources));\n }\n\n async function persistDaemonConfigEverywhere() {\n persistConfigPrefsToStore(runtime.store);\n await persistConfigPrefsToFile();\n publishDaemonRuntimeSnapshot();\n runtime.wsServer?.broadcastConfig();\n }\n\n async function handleWsCommand(message) {\n if (!message || typeof message !== \"object\") return { ok: true };\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONFIG_GET) {\n return { config: serializeConfigPrefs() };\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONFIG_SET) {\n const key = String(message?.data?.key ?? \"\").trim();\n const value = message?.data?.value;\n if (!key) throw new Error(\"config key is required\");\n\n if (key === \"claudeIncludeSubagents\") {\n cfg.claudeIncludeSubagents = boolFromEnv(value, cfg.claudeIncludeSubagents);\n applyRuntimeSources(buildSources());\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.claudeIncludeSubagents ? \"on\" : \"off\" });\n return { config: serializeConfigPrefs() };\n }\n\n if (key === \"bootstrapMode\") {\n const next = normalizeBootstrapModeWithPrompt(value);\n if (!next) throw new Error(\"invalid bootstrap mode\");\n cfg.bootstrapMode = next;\n cfg.bootstrapReset = next === \"prompt\";\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.bootstrapMode });\n return { config: serializeConfigPrefs() };\n }\n\n if (key === \"bootstrapReset\") {\n cfg.bootstrapReset = boolFromEnv(value, false);\n if (cfg.bootstrapReset) await resetBootstrapState();\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.bootstrapReset ? \"on\" : \"off\" });\n return { config: serializeConfigPrefs() };\n }\n\n throw new Error(`unsupported config key: ${key}`);\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.BOOTSTRAP_RESET) {\n const profile = normalizeBootstrapModeWithPrompt(message?.data?.profile) || \"prompt\";\n cfg.bootstrapMode = profile;\n cfg.bootstrapReset = true;\n await resetBootstrapState();\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Bootstrap reset requested via TUI\", { profile });\n return { ok: true, config: serializeConfigPrefs(), reset: true };\n }\n\n return { ignored: true };\n }\n\n // ── cleanup ──\n\n async function stopRuntimeResources() {\n if (daemonStateTimer) { clearInterval(daemonStateTimer); daemonStateTimer = null; }\n runtime.daemonRunning = false;\n try { publishDaemonRuntimeSnapshot(); } catch { /* ignore */ }\n if (runtime.wsServer) { try { await runtime.wsServer.stop(); } catch (e) { log(\"warn\", \"Failed to stop WS server\", errorDetails(e)); } runtime.wsServer = null; }\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\n try {\n const fileLoad = await loadConfigPrefsFromFile();\n const loadedFromFile = fileLoad.loaded;\n const loadedFromStore = loadConfigPrefsFromStore(store);\n\n if (loadedFromFile || loadedFromStore) {\n log(\"info\", \"Loaded persisted config preferences\", {\n file: loadedFromFile ? \"yes\" : \"no\", file_source: loadedFromFile ? fileLoad.source : \"none\",\n file_path: loadedFromFile ? fileLoad.file : \"\", store: loadedFromStore ? \"yes\" : \"no\", db_path: cfg.dbFile,\n });\n }\n if (loadedFromStore && !loadedFromFile) {\n await persistConfigPrefsToFile();\n log(\"info\", \"Materialized store config prefs into file\", { file_saved: \"yes\" });\n }\n if (loadedFromFile && !loadedFromStore) {\n persistConfigPrefsToStore(store);\n const backup = await backupConfigFileAsBak(fileLoad.file || cfg.configFile, fileLoad.raw);\n log(\"info\", \"Materialized file config prefs into store\", { db_saved: \"yes\", file_backup: backup.backedUp ? \"yes\" : \"no\", backup_path: backup.backup });\n }\n if (!loadedFromFile && !loadedFromStore) {\n persistConfigPrefsToStore(store);\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 and/or INGEST_CLAUDE=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})`);\n }\n\n // ws server\n const wsServer = createWsServer({\n host: cfg.wsHost, port: cfg.wsPort, infoFilePath: cfg.wsInfoFile, heartbeatMs: 5000,\n getSnapshot: buildDaemonRuntimeSnapshot,\n getLogs: () => state.recentLogs.slice(-runtimeLogsKeep()),\n getConfig: serializeConfigPrefs,\n onCommand: handleWsCommand,\n });\n runtime.wsServer = wsServer;\n const wsInfo = await wsServer.start();\n\n log(\"info\", \"UltraContext daemon started\", {\n user_id: cfg.userId, host: cfg.host, poll_ms: cfg.pollMs, mode: \"headless\",\n ws_host: wsInfo.host, ws_port: wsInfo.port, ws_info_file: cfg.wsInfoFile, db_file: cfg.dbFile,\n sources: sources.map((s) => ({ name: s.name, globs: s.globs })),\n });\n\n runtime.daemonRunning = true;\n publishDaemonRuntimeSnapshot();\n\n daemonStateTimer = setInterval(() => { try { publishDaemonRuntimeSnapshot(); } catch { /* ignore */ } }, Math.max(cfg.uiRefreshMs, 500));\n daemonStateTimer.unref?.();\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 try { refreshDaemonConfigFromStore(store); } catch (error) {\n log(\"warn\", \"Failed to refresh daemon config from local store\", errorDetails(error));\n }\n\n bumpStat(\"cycles\");\n const cycleStart = Date.now();\n for (const source of (runtime.sources ?? [])) {\n if (!running) break;\n await 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 publishDaemonRuntimeSnapshot();\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 publishDaemonRuntimeSnapshot();\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 daemon entry-point — wires store + boots daemon without dotenv\nimport { createStore, resolveDbPath } from \"@ultracontext/daemon/store\";\nimport { daemonBoot } from \"@ultracontext/daemon/daemon\";\n\ndaemonBoot({ createStore, resolveDbPath });\n"],"mappings":";;;;;;;;;;;;;;;AAMA,MAAM,kBAAkB;AAExB,SAAS,gBAAgB,UAAU;AACjC,IAAG,UAAU,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;;AAG3D,SAAS,YAAY,OAAO,WAAW,GAAG;CACxC,MAAM,MAAM,OAAO,SAAS,OAAO,SAAS,GAAG,EAAE,GAAG;AACpD,QAAO,OAAO,SAAS,IAAI,GAAG,MAAM;;AAGtC,SAAS,UAAU,OAAO,WAAW,OAAO;AAC1C,KAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;CAClD,MAAM,aAAa,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa;AACrD,KAAI;EAAC;EAAK;EAAQ;EAAO;EAAK,CAAC,SAAS,WAAW,CAAE,QAAO;AAC5D,KAAI;EAAC;EAAK;EAAS;EAAM;EAAM,CAAC,SAAS,WAAW,CAAE,QAAO;AAC7D,QAAO;;AAGT,SAAgB,cAAc,MAAM,QAAQ,KAAK;AAC/C,QAAO,WAAW,IAAI,wBAAwB,gBAAgB;;AAGhE,SAAgB,YAAY,EAAE,SAAS,cAAc,QAAQ,IAAI,KAAK,EAAE,EAAE;CACxE,MAAM,eAAe,KAAK,QAAQ,OAAO;AACzC,iBAAgB,aAAa;CAE7B,MAAM,KAAK,IAAI,aAAa,aAAa;AACzC,IAAG,KAAK,4BAA4B;AACpC,IAAG,KAAK,8BAA8B;AAEtC,IAAG,KAAK;;;;;;;;;;;;;;;;;;;;;;;;IAwBN;CAEF,MAAM,OAAO;EACX,UAAU,GAAG,QAAQ;;;MAGnB;EACF,qBAAqB,GAAG,QAAQ;;;MAG9B;EACF,aAAa,GAAG,QAAQ;;;MAGtB;EACF,SAAS,GAAG,QAAQ;;;;;MAKlB;EACF,WAAW,GAAG,QAAQ;;;;;MAKpB;EACF,WAAW,GAAG,QAAQ;;;;;;MAMpB;EACF,WAAW,GAAG,QAAQ;;;;;MAKpB;EACF,WAAW,GAAG,QAAQ;;;;;;MAMpB;EACF,cAAc,GAAG,QAAQ;;;MAGvB;EACF,cAAc,GAAG,QAAQ;;;MAGvB;EACF,iBAAiB,GAAG,QAAQ;;;;;MAK1B;EACF,iBAAiB,GAAG,QAAQ;;;;;;MAM1B;EACH;CAGD,SAAS,iBAAiB,WAAW,YAAY;AAC/C,KAAG,KAAK,QAAQ;AAChB,MAAI;AACF,QAAK,oBAAoB,IAAI,UAAU;GACvC,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAAG,KAAK,IAAI,YAAY,YAAY,GAAG,EAAE,EAAE;GAC1F,MAAM,SAAS,KAAK,SAAS,IAAI,WAAW,UAAU;AACtD,MAAG,KAAK,SAAS;AACjB,UAAO,OAAO,YAAY;WACnB,OAAO;AACd,MAAG,KAAK,WAAW;AACnB,SAAM;;;AAIV,QAAO;EACL,QAAQ;EACR,cAAc,WAAW,YAAY;AACnC,UAAO,iBAAiB,OAAO,aAAa,GAAG,EAAE,WAAW;;EAE9D,YAAY,WAAW;AACrB,UAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,aAAa,GAAG,CAAC,CAAC;;EAE3D,iBAAiB;AACf,QAAK,YAAY,KAAK;;EAExB,UAAU,SAAS;GACjB,MAAM,MAAM,KAAK,UAAU,IAAI,OAAO,WAAW,GAAG,CAAC;AACrD,UAAO,MAAM,YAAY,IAAI,cAAc,EAAE,GAAG;;EAElD,UAAU,SAAS,OAAO;AACxB,QAAK,UAAU,IAAI,OAAO,WAAW,GAAG,EAAE,YAAY,OAAO,EAAE,CAAC;;EAElE,UAAU,KAAK;GACb,MAAM,MAAM,KAAK,UAAU,IAAI,OAAO,OAAO,GAAG,CAAC;AACjD,UAAO,MAAM,OAAO,IAAI,SAAS,GAAG,GAAG;;EAEzC,UAAU,KAAK,OAAO;AACpB,QAAK,UAAU,IAAI,OAAO,OAAO,GAAG,EAAE,OAAO,SAAS,GAAG,CAAC;;EAE5D,aAAa,KAAK;AAChB,QAAK,aAAa,IAAI,OAAO,OAAO,GAAG,CAAC;;EAE1C,eAAe;GACb,MAAM,MAAM,EAAE;AACd,QAAK,MAAM,OAAO,KAAK,aAAa,KAAK,CACvC,KAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,SAAS,GAAG;AAEhD,UAAO;;EAET,cAAc,KAAK,WAAW,OAAO;AACnC,UAAO,UAAU,KAAK,UAAU,IAAI,EAAE,SAAS;;EAEjD,aAAa,KAAK,WAAW,GAAG;AAC9B,UAAO,YAAY,KAAK,UAAU,IAAI,EAAE,SAAS;;EAEnD,gBAAgB,UAAU;GACxB,MAAM,MAAM,KAAK,gBAAgB,IAAI,OAAO,YAAY,GAAG,CAAC;AAC5D,UAAO,MAAM,OAAO,IAAI,cAAc,GAAG,GAAG;;EAE9C,gBAAgB,UAAU,WAAW;AACnC,QAAK,gBAAgB,IAAI,OAAO,YAAY,GAAG,EAAE,OAAO,aAAa,GAAG,CAAC;;EAE3E,QAAQ;AACN,MAAG,OAAO;;EAEb;;;;;ACnMH,MAAM,WAAW;AAEjB,MAAM,sBAAsB;AAE5B,MAAM,kBAAkB;CACtB;EAAE,OAAO;EAAsC,aAAa;EAAa;CACzE;EAAE,OAAO;EAA8B,aAAa;EAAU;CAC9D;EAAE,OAAO;EAAqC,aAAa;EAAc;CACzE;EACE,OAAO;EACP,aAAa;EACd;CACF;AAED,SAAS,aAAa,OAAO;CAC3B,IAAI,SAAS,eAAe,OAAO,IAAK;AACxC,MAAK,MAAM,EAAE,OAAO,iBAAiB,gBACnC,UAAS,OAAO,QAAQ,OAAO,YAAY;AAE7C,QAAO;;AAGT,SAAgB,OAAO,OAAO,aAAa,IAAI;AAC7C,KAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,KAAI,OAAO,UAAU,SACnB,QAAO,oBAAoB,KAAK,WAAW,GAAG,WAAW,aAAa,MAAM;AAG9E,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QAAO;AAGT,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,OAAO,KAAK,CAAC;AAG1C,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,MAAM,EAAE;AACd,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,CAC5C,KAAI,OAAO,oBAAoB,KAAK,IAAI,GAAG,WAAW,OAAO,KAAK,IAAI;AAExE,SAAO;;AAGT,QAAO;;;;;ACrCT,SAAS,iBAAiB,KAAK;AAC7B,QAAO,qBAAqB,OAAO,OAAO,GAAG,EAAE,KAAK;;AAGtD,SAAS,SAAS,IAAI,SAAS;AAC7B,KAAI,CAAC,MAAM,GAAG,eAAeA,YAAU,KAAM;AAC7C,IAAG,KAAK,KAAK,UAAU,QAAQ,CAAC;;AAGlC,SAAS,iBAAiB,OAAO,WAAW,iBAAiB;AAC3D,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,iBAAiB,SAAS,MAAM,QAAS,QAAO,MAAM;AAC1D,QAAO,OAAO,MAAM;;AAGtB,SAAgB,eAAe,EAC7B,MACA,MACA,cACA,cACA,cAAc,KACd,qBAAqB,EAAE,GACvB,gBAAgB,EAAE,EAClB,mBAAmB,EAAE,GACrB,YAAY,aAAa,EAAE,MACzB,EAAE,EAAE;CACN,MAAM,0BAAU,IAAI,KAAK;CACzB,IAAI,MAAM;CACV,IAAI,iBAAiB;CACrB,IAAI,cAAc;CAClB,MAAM,oBAAoB,gBAAgB;CAE1C,MAAM,aAAa,YAAY;AAC7B,OAAK,MAAM,UAAU,QAAS,UAAS,QAAQ,QAAQ;;CAGzD,MAAM,sBAAsB;AAC1B,MAAI,CAAC,eAAgB;AACrB,gBAAc,eAAe;AAC7B,mBAAiB;;CAGnB,MAAM,uBAAuB;AAC3B,iBAAe;AACf,mBAAiB,kBAAkB;GACjC,MAAM,MAAM,KAAK,KAAK;AACtB,QAAK,MAAM,UAAU,SAAS;IAC5B,MAAM,WAAW,OAAO,OAAO,gBAAgB,EAAE;AACjD,QAAI,YAAY,MAAM,WAAW,cAAc,GAAG;AAChD,SAAI;AACF,aAAO,WAAW;aACZ;AAGR;;AAEF,aAAS,QAAQ,qBAAqB,wBAAwB,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC;;KAElF,YAAY;AACf,iBAAe,SAAS;;CAG1B,eAAe,gBAAgB;AAC7B,MAAI,CAAC,kBAAmB;EACxB,MAAM,WAAW,KAAK,QAAQ,kBAAkB;AAChD,QAAMC,KAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;EAC3D,MAAM,UAAU;GACd,KAAK,QAAQ;GACb;GACA,MAAM;GACN,4BAAW,IAAI,MAAM,EAAC,aAAa;GACpC;AACD,QAAMA,KAAG,UAAU,UAAU,GAAG,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,KAAK,OAAO;;CAG/E,eAAe,iBAAiB;AAC9B,MAAI,CAAC,kBAAmB;AACxB,MAAI;AACF,SAAMA,KAAG,OAAO,KAAK,QAAQ,kBAAkB,CAAC;UAC1C;;AAKV,QAAO;EACL,MAAM,QAAQ;AACZ,OAAI,IAAK,QAAO;IAAE;IAAM,MAAM;IAAa;AAC3C,SAAM,IAAI,gBAAgB;IAAE;IAAM;IAAM,CAAC;AAEzC,SAAM,IAAI,SAAS,SAAS,WAAW;IACrC,MAAM,WAAW,UAAU;AACzB,UAAK,MAAM,aAAa,YAAY;AACpC,YAAO,MAAM;;IAEf,MAAM,oBAAoB;AACxB,UAAK,MAAM,SAAS,QAAQ;AAC5B,cAAS;;AAEX,QAAI,KAAK,SAAS,QAAQ;AAC1B,QAAI,KAAK,aAAa,YAAY;KAClC;GAEF,MAAM,UAAU,IAAI,SAAS;AAC7B,iBAAc,OAAO,YAAY,YAAY,UAAU,OAAO,QAAQ,QAAQ,EAAE,GAAG,OAAO,QAAQ,EAAE;AACpG,SAAM,eAAe;AAErB,OAAI,GAAG,eAAe,OAAO;AAC3B,OAAG,eAAe,KAAK,KAAK;AAC5B,YAAQ,IAAI,GAAG;AAEf,aAAS,IAAI;KACX,MAAM,wBAAwB;KAC9B,MAAM;MACJ,OAAO,aAAa;MACpB,YAAY,SAAS;MACrB,QAAQ,WAAW;MACnB,SAAS,QAAQ;MAClB;KACF,CAAC;AAEF,OAAG,GAAG,WAAW,OAAO,QAAQ;KAC9B,MAAM,MAAM,iBAAiB,IAAI;AACjC,SAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AAErC,SAAI,IAAI,SAAS,wBAAwB,MAAM;AAC7C,SAAG,eAAe,KAAK,KAAK;AAC5B;;KAGF,MAAM,YAAY,IAAI,MAAM;AAC5B,SAAI;MACF,MAAM,SAAS,MAAM,UAAU,KAAK,EAAE,SAAS,QAAQ,MAAM,CAAC;AAC9D,eAAS,IAAI;OACX,MAAM,wBAAwB;OAC9B,IAAI;OACJ,IAAI;OACJ,MAAM,UAAU,EAAE;OACnB,CAAC;cACK,OAAO;AACd,eAAS,IAAI;OACX,MAAM,wBAAwB;OAC9B,IAAI;OACJ,IAAI;OACJ,OAAO,iBAAiB,MAAM;OAC/B,CAAC;;MAEJ;AAEF,OAAG,GAAG,eAAe;AACnB,aAAQ,OAAO,GAAG;AAClB,eAAU;MACR,MAAM,wBAAwB;MAC9B,MAAM;OACJ,GAAG,aAAa;OAChB,SAAS,QAAQ;OAClB;MACF,CAAC;MACF;AAEF,OAAG,GAAG,eAAe;AACnB,aAAQ,OAAO,GAAG;MAClB;KACF;AAEF,mBAAgB;AAChB,UAAO;IAAE;IAAM,MAAM;IAAa;;EAEpC,iBAAiB;AACf,aAAU;IACR,MAAM,wBAAwB;IAC9B,MAAM;KACJ,GAAG,aAAa;KAChB,SAAS,QAAQ;KAClB;IACF,CAAC;;EAEJ,aAAa,OAAO;AAClB,aAAU,qBAAqB,wBAAwB,KAAK,MAAM,CAAC;;EAErE,eAAe,OAAO;AACpB,aAAU,qBAAqB,wBAAwB,eAAe,MAAM,CAAC;;EAE/E,kBAAkB;AAChB,aAAU,qBAAqB,wBAAwB,cAAc,WAAW,CAAC,CAAC;;EAEpF,cAAc;AACZ,UAAO,QAAQ;;EAEjB,MAAM,OAAO;AACX,kBAAe;AACf,QAAK,MAAM,UAAU,QACnB,KAAI;AACF,WAAO,OAAO;WACR;AAIV,WAAQ,OAAO;AAEf,OAAI,KAAK;AACP,UAAM,IAAI,SAAS,YAAY;AAC7B,SAAI,YAAY,SAAS,CAAC;MAC1B;AACF,UAAM;;AAER,SAAM,gBAAgB;;EAEzB;;;;;AChMH,MAAM,aAAa;CAAE,OAAO;CAAG,MAAM;CAAG,MAAM;CAAG,OAAO;CAAG;AAC3D,MAAM,8BAA8B;AACpC,MAAM,oBAAoB;CACxB;EAAE,IAAI;EAAY,OAAO;EAA0B;CACnD;EAAE,IAAI;EAAY,OAAO;EAAY;CACrC;EAAE,IAAI;EAAO,OAAO;EAAO;CAC3B;EAAE,IAAI;EAAU,OAAO;EAAkB;CAC1C;AACD,MAAM,0BAA0B,CAAC,iBAAiB,yBAAyB;AAC3E,MAAM,yBAAyB;AAC/B,MAAM,UAAU,IAAI,IAAIC,UAAQ,KAAK,MAAM,EAAE,CAAC;AAE9C,MAAM,OAAO;CACX,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,QAAQ;CACR,MAAM;CACP;AAED,SAAS,iBAAiB;AACxB,QAAO,QAAQA,UAAQ,QAAQ,MAAM,IAAI,CAAC,YAAYA,UAAQ,IAAI,UAAU,MAAM;;AAGpF,SAAS,WAAW,OAAO;AACzB,KAAI,UAAU,QAAS,QAAO,KAAK;AACnC,KAAI,UAAU,OAAQ,QAAO,KAAK;AAClC,KAAI,UAAU,QAAS,QAAO,KAAK;AACnC,QAAO,KAAK;;AAGd,SAAS,SAAS,MAAM,OAAO;AAC7B,KAAI,CAAC,gBAAgB,CAAE,QAAO,OAAO,QAAQ,GAAG;AAChD,QAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG,GAAG,KAAK;;AAG9C,SAAS,gBAAgB,KAAK;AAC5B,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,gBAAgB,GAAG;;AAGvD,SAAS,2BAA2B;AAClC,QAAO,WAAWA,UAAQ,IAAI,4BAA4B,4BAA4B;;AAGxF,SAAS,iCAAiC,KAAK;AAC7C,QAAO,uBAAuB,KAAK,EAAE,aAAa,MAAM,CAAC,IAAI;;AAK/D,eAAsB,WAAW,EAAE,aAAa,iBAAiB;CAC/D,MAAM,MAAM;EACV,QAAQ,gBAAgBA,UAAQ,IAAI,qBAAqB;EACzD,UAAUA,UAAQ,IAAI,yBAAyB,+BAA+B,MAAM;EACpF,QAAQA,UAAQ,IAAI,kBAAkBA,UAAQ,IAAI,QAAQ;EAC1D,OAAOA,UAAQ,IAAI,eAAe,GAAG,UAAU,IAAI,gBAAgB,MAAM;EACzE,QAAQ,MAAMA,UAAQ,IAAI,gBAAgB,KAAK;EAC/C,UAAUA,UAAQ,IAAI,oBAAoB;EAC1C,aAAa,QAAQ,IAAI,YAAY,IAAI,YAAYA,UAAQ,IAAI,gBAAgB,MAAM;EACvF,YAAY,YAAYA,UAAQ,IAAI,oBAAoB,KAAK;EAC7D,aAAa,MAAMA,UAAQ,IAAI,gBAAgB,KAAK;EACpD,eAAe,MAAMA,UAAQ,IAAI,kBAAkB,IAAI;EACvD,YAAY,0BAA0B;EACtC,QAAQ,cAAcA,UAAQ,IAAI;EAClC,UAAU,gBAAgBA,UAAQ,IAAI;EACtC,QAAQ,oBAAoBA,UAAQ,IAAI;EACxC,QAAQ,oBAAoBA,UAAQ,IAAI;EACxC,YAAY,wBAAwBA,UAAQ,IAAI;EAChD,cAAc,MAAMA,UAAQ,IAAI,uBAAuB,OAAU,KAAK,GAAG;EACzE,cAAc,MAAMA,UAAQ,IAAI,uBAAuB,MAAM,KAAK;EAClE,eAAe,iCAAiCA,UAAQ,IAAI,yBAAyB,SAAS,IAAI;EAClG,gBAAgB,YAAYA,UAAQ,IAAI,wBAAwB,MAAM;EACtE,wBAAwB,YAAYA,UAAQ,IAAI,0BAA0B,MAAM;EAChF,oBAAoB,KAAK,IAAI,MAAMA,UAAQ,IAAI,6BAA6B,GAAG,EAAE,EAAE;EACpF;CAED,MAAM,QAAQ;EACZ,WAAW,KAAK,KAAK;EACrB,QAAQ;EACR,cAAc;EACd,WAAW;EACX,cAAc;EACd,UAAU;EACV,SAAS;EACT,iBAAiB;EACjB,QAAQ;EACT;CAED,MAAM,QAAQ;EACZ,YAAY,EAAE;EACd,6BAAa,IAAI,KAAK;EACtB,aAAa,EAAE;EAChB;CAED,IAAI,mBAAmB;CACvB,IAAI,oBAAoB;CAExB,MAAM,UAAU;EACd,IAAI;EACJ,MAAM;EACN,OAAO;EACP,SAAS;EACT,YAAY;EACZ,eAAe;EACf,UAAU;EACV,YAAY;EACb;CAID,SAAS,mBAAmB,OAAO;EACjC,MAAM,OAAO,OAAO,OAAO,QAAQ,GAAG;AACtC,SAAO,SAAS,SAAS,SAAS,WAAW,SAAS;;CAGxD,SAAS,iBAAiB,OAAO,YAAY;AAC3C,MAAI,CAAC,mBAAmB,MAAM,CAAE;AAChC,MAAI,kBAAmB;AACvB,sBAAoB;AACpB,MAAI;AAAE,WAAQ,OAAO,QAAQ;UAAU;AACvC,MAAI,WAAW,IAAI,aAAa,WAAW,OAAO;GAChD,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,WAAQ,MAAM,yBAAyB,WAAW,UAAU,OAAO,QAAQ,IAAI,KAAK,MAAM;;;AAI9F,WAAQ,OAAO,KAAK,UAAU,UAAU,iBAAiB,OAAO,QAAQ,CAAC;AACzE,WAAQ,QAAQ,KAAK,UAAU,UAAU,iBAAiB,OAAO,SAAS,CAAC;AAC3E,WAAQ,QAAQ,KAAK,UAAU,UAAU,iBAAiB,OAAO,SAAS,CAAC;CAI3E,SAAS,kBAAkB;AACzB,SAAO,KAAK,IAAI,IAAI,eAAe,IAAI;;CAGzC,SAAS,WAAW,QAAQ,KAAK,KAAK,EAAE;AACtC,SAAO,IAAI,KAAK,MAAM,CAAC,aAAa,CAAC,MAAM,IAAI,GAAG;;CAGpD,SAAS,SAAS,OAAO;AACvB,SAAO,OAAO,SAAS,GAAG;;CAG5B,SAAS,aAAa,OAAO;EAC3B,MAAM,MAAM,SAAS,MAAM;AAC3B,MAAI,IAAI,UAAU,GAAI,QAAO;AAC7B,SAAO,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,MAAM,IAAI;;CAGhD,SAAS,iBAAiB,MAAM;AAC9B,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;EAC9C,MAAM,UAAU,OAAO,QAAQ,KAAK,CAAC,MAAM,GAAG,EAAE;AAChD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,QAAQ,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,KAAK,IAAI;;CAGrE,SAAS,kBAAkB,YAAY;AACrC,MAAI,CAAC,MAAM,YAAY,IAAI,WAAW,CACpC,OAAM,YAAY,IAAI,YAAY;GAChC,cAAc;GAAG,WAAW;GAAG,cAAc;GAC7C,UAAU;GAAG,SAAS;GAAG,iBAAiB;GAAG,QAAQ;GACrD,eAAe;GAAK,eAAe;GAAK,QAAQ;GAAG,UAAU;GAC9D,CAAC;AAEJ,SAAO,MAAM,YAAY,IAAI,WAAW;;CAG1C,SAAS,eAAe,YAAY,KAAK,QAAQ,GAAG;EAClD,MAAM,UAAU,kBAAkB,WAAW;AAC7C,UAAQ,QAAQ,QAAQ,QAAQ,KAAK;;CAGvC,SAAS,mBAAmB,YAAY,OAAO;AAC7C,SAAO,OAAO,kBAAkB,WAAW,EAAE,SAAS,EAAE,CAAC;;CAG3D,SAAS,kBAAkB,MAAM;AAC/B,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,OAAK,MAAM,SAAS;GAAC,KAAK;GAAQ,KAAK;GAAgB,KAAK;GAAe,MAAM,UAAU;GAAO,EAAE;GAClG,MAAM,MAAM,OAAO,SAAS,GAAG,CAAC,MAAM;AACtC,OAAI,IAAK,QAAO,IAAI,aAAa;;AAEnC,SAAO;;CAGT,SAAS,cAAc,OAAO,SAAS,MAAM;EAC3C,IAAI,OAAO,OAAO,WAAW,GAAG;AAChC,MAAI,KAAK,WAAW,oCAAoC,CAAE,QAAO;AACjE,MAAI,KAAK,WAAW,kBAAkB,CAAE,QAAO;AAC/C,MAAI,KAAK,WAAW,4CAA4C,CAAE,QAAO;AACzE,MAAI,KAAK,WAAW,8BAA8B,CAAE,QAAO;AAC3D,MAAI,KAAK,WAAW,8BAA8B,CAAE,QAAO;AAC3D,MAAI,KAAK,WAAW,yBAAyB,CAAE,QAAO;AACtD,MAAI,KAAK,WAAW,yCAAyC,CAAE,QAAO;EAEtE,MAAM,SAAS,UAAU,UAAU,iBAAiB,KAAK,GAAG;AAC5D,MAAI,OAAQ,QAAO,GAAG,KAAK,GAAG;AAE9B,QAAM,WAAW,KAAK;GAAE,IAAI,YAAY;GAAE;GAAO,QAAQ,kBAAkB,KAAK;GAAE,MAAM;GAAM,CAAC;EAC/F,MAAM,OAAO,iBAAiB;AAC9B,SAAO,MAAM,WAAW,SAAS,KAAM,OAAM,WAAW,OAAO;EAE/D,MAAM,OAAO,MAAM,WAAW,MAAM,WAAW,SAAS;AACxD,MAAI,QAAQ,YAAY,KAAM,SAAQ,SAAS,aAAa,KAAK;;CAGnE,SAAS,IAAI,OAAO,SAAS,MAAM;EACjC,MAAM,UAAU,WAAW,IAAI,aAAa,WAAW;AAEvD,OADe,WAAW,UAAU,WAAW,QAClC,QAAS;AAEtB,gBAAc,OAAO,SAAS,KAAK;AAEnC,MAAI,IAAI,aAAa;GACnB,MAAM,QAAQ,0BAAS,IAAI,MAAM,EAAC,aAAa,EAAE,KAAK,IAAI;GAC1D,MAAM,QAAQ,SAAS,IAAI,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,MAAM,CAAC;AAC7E,WAAQ,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU;AAC3C,OAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,CAAC,SAAS,EACjE,MAAK,MAAM,QAAQ,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC,MAAM,KAAK,CAC1D,SAAQ,IAAI,GAAG,SAAS,OAAO,KAAK,KAAK,CAAC,GAAG,OAAO;AAGxD;;EAGF,MAAM,MAAM,YAAY;EACxB,MAAM,SAAS,iBAAiB,KAAK;EACrC,MAAM,YAAY,SAAS,GAAG,QAAQ,GAAG,WAAW;AACpD,UAAQ,IAAI,GAAG,IAAI,GAAG,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY;;CAG7E,SAAS,SAAS,MAAM,QAAQ,GAAG;AACjC,QAAM,SAAS,MAAM,SAAS,KAAK;;CAGrC,SAAS,YAAY,IAAI;EACvB,MAAM,WAAW,KAAK,IAAI,KAAK,MAAM,KAAK,IAAK,EAAE,EAAE;EACnD,MAAM,IAAI,KAAK,MAAM,WAAW,KAAK;EACrC,MAAM,IAAI,KAAK,MAAO,WAAW,OAAQ,GAAG;EAC5C,MAAM,IAAI,WAAW;AACrB,SAAO,GAAG,OAAO,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,GAAG,IAAI;;CAGlG,SAAS,iBAAiB;AACxB,UAAQ,IAAI;GACV;GAAU,UAAU,YAAY,KAAK,KAAK,GAAG,MAAM,UAAU;GAC7D,UAAU,MAAM;GAAU,SAAS,MAAM;GAAgB,SAAS,MAAM;GACxE,UAAU,MAAM;GAAgB,UAAU,MAAM;GAAY,UAAU,MAAM;GAC5E,WAAW,MAAM;GAAmB,UAAU,MAAM;GACrD,CAAC,KAAK,IAAI,CAAC;;CAGd,SAAS,qBAAqB;AAC5B,MAAI,CAAC,IAAI,YAAa;AACtB,OAAK,MAAM,OAAO;GAChB;GACA;GACA;GACD,CAAE,SAAQ,IAAI,SAAS,KAAK,KAAK,KAAK,CAAC;;CAG1C,SAAS,aAAa,OAAO;AAC3B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,EAAE,SAAS,OAAO,MAAM,EAAE;EAC1E,MAAM,UAAU,EAAE,SAAS,MAAM,WAAW,OAAO,MAAM,EAAE;AAC3D,MAAI,YAAY,MAAO,SAAQ,SAAS,MAAM;AAC9C,MAAI,SAAS,MAAO,SAAQ,MAAM,MAAM;AACxC,MAAI,cAAc,MAAO,SAAQ,WAAW,MAAM;AAClD,SAAO;;CAMT,SAAS,uBAAuB;AAC9B,SAAO;GACL,eAAe,iCAAiC,IAAI,cAAc,IAAI;GACtE,wBAAwB,QAAQ,IAAI,uBAAuB;GAC5D;;CAGH,eAAe,yBAAyB,aAAa,IAAI,YAAY;EACnE,MAAM,SAAS,KAAK,QAAQ,WAAW;EACvC,IAAI,WAAW,EAAE;AACjB,MAAI;GACF,MAAM,MAAM,MAAMC,KAAG,SAAS,QAAQ,OAAO;GAC7C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,OAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAE,YAAW;UACzE;EAER,MAAM,UAAU,KAAK,UAAU;GAAE,GAAG;GAAU,GAAG,sBAAsB;GAAE,EAAE,MAAM,EAAE;AACnF,QAAMA,KAAG,MAAM,KAAK,QAAQ,OAAO,EAAE,EAAE,WAAW,MAAM,CAAC;AACzD,QAAMA,KAAG,UAAU,QAAQ,GAAG,QAAQ,KAAK,OAAO;AAClD,SAAO;GAAE,OAAO;GAAM,MAAM;GAAQ;;CAGtC,SAAS,0BAA0B,QAAQ,QAAQ,OAAO;AACxD,MAAI,CAAC,MAAO;AACZ,QAAM,UAAU,wBAAwB,KAAK,UAAU,sBAAsB,CAAC,CAAC;;CAGjF,eAAe,wBAAwB,QAAQ;EAC7C,IAAI,MAAM;AACV,MAAI;AACF,SAAM,MAAMA,KAAG,SAAS,QAAQ,OAAO;WAChC,OAAO;AACd,OAAI,OAAO,SAAS,SAAU,QAAO;IAAE,QAAQ;IAAO,SAAS;IAAM,KAAK;IAAI;AAC9E,OAAI,QAAQ,oCAAoC;IAAE,MAAM;IAAQ,GAAG,aAAa,MAAM;IAAE,CAAC;AACzF,UAAO;IAAE,QAAQ;IAAO,SAAS;IAAO,KAAK;IAAI;;EAEnD,IAAI,SAAS;AACb,MAAI;AAAE,YAAS,KAAK,MAAM,IAAI;WAAW,OAAO;AAC9C,OAAI,QAAQ,qCAAqC;IAAE,MAAM;IAAQ,GAAG,aAAa,MAAM;IAAE,CAAC;AAC1F,UAAO;IAAE,QAAQ;IAAO,SAAS;IAAO;IAAK;;AAE/C,mBAAiB,OAAO;AACxB,SAAO;GAAE,QAAQ;GAAM,SAAS;GAAO;GAAK;;CAG9C,eAAe,0BAA0B;EACvC,MAAM,UAAU,KAAK,QAAQ,IAAI,WAAW;EAC5C,MAAM,SAAS,MAAM,wBAAwB,QAAQ;AACrD,SAAO;GACL,QAAQ,OAAO;GACf,QAAQ,OAAO,SAAS,YAAY;GACpC,MAAM,OAAO,SAAS,UAAU;GAChC,KAAK,OAAO,OAAO;GACpB;;CAGH,eAAe,sBAAsB,YAAY,YAAY,IAAI;EAC/D,MAAM,SAAS,KAAK,QAAQ,WAAW;EACvC,MAAM,SAAS,GAAG,OAAO;EACzB,IAAI,MAAM;AACV,MAAI,CAAC,IACH,KAAI;AAAE,SAAM,MAAMA,KAAG,SAAS,QAAQ,OAAO;UAAU;AAAE,UAAO;IAAE,UAAU;IAAO,QAAQ;IAAW;IAAQ;;AAEhH,MAAI;AAAE,SAAMA,KAAG,OAAO,OAAO;AAAE,UAAO;IAAE,UAAU;IAAO,QAAQ;IAAU;IAAQ;UAAU;AAC7F,QAAMA,KAAG,OAAO,QAAQ,OAAO;AAC/B,QAAMA,KAAG,UAAU,QAAQ,KAAK,OAAO;AACvC,SAAO;GAAE,UAAU;GAAM,QAAQ;GAAM;GAAQ;;CAGjD,SAAS,iBAAiB,OAAO;AAC/B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,OAAK,MAAM,SAAS,yBAAyB;AAC3C,OAAI,EAAE,SAAS,OAAQ;AACvB,OAAI,UAAU,iBAAiB;AAC7B,QAAI,gBAAgB,iCAAiC,MAAM,cAAc,IAAI;AAC7E;;AAEF,OAAI,SAAS,QAAQ,MAAM,OAAO;;;CAItC,SAAS,yBAAyB,QAAQ,QAAQ,OAAO;AACvD,MAAI,CAAC,MAAO,QAAO;EAEnB,MAAM,SAAS,kBADH,MAAM,UAAU,uBAAuB,EACb,KAAK;AAC3C,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,mBAAiB,OAAO;AACxB,SAAO;;CAKT,SAAS,oBAAoB,SAAS;AACpC,UAAQ,UAAU;AAClB,QAAM,cAAc,QAAQ,KAAK,MAAM,EAAE,KAAK;AAC9C,OAAK,MAAM,QAAQ,MAAM,YAAa,mBAAkB,KAAK;;CAG/D,SAAS,6BAA6B,QAAQ,QAAQ,OAAO;AAC3D,MAAI,CAAC,MAAO,QAAO;EACnB,MAAM,SAAS,sBAAsB;AAErC,MAAI,CADW,yBAAyB,MAAM,CACjC,QAAO;EACpB,MAAM,QAAQ,sBAAsB;AACpC,MAAI,KAAK,UAAU,OAAO,KAAK,KAAK,UAAU,MAAM,CAAE,QAAO;AAE7D,MAAI,OAAO,2BAA2B,MAAM,uBAC1C,qBAAoB,cAAc,CAAC;AAErC,MAAI,QAAQ,0CAA0C;GACpD,kBAAkB,MAAM,yBAAyB,OAAO;GACxD,gBAAgB,MAAM;GACvB,CAAC;AACF,UAAQ,UAAU,iBAAiB;AACnC,SAAO;;CAGT,SAAS,6BAA6B;AACpC,SAAO;GACL,IAAI,KAAK,KAAK;GAAE,MAAM;GAAU,SAAS,QAAQ,QAAQ,cAAc;GACvE,KAAKD,UAAQ;GAAK,MAAM,IAAI;GAAM,QAAQ,IAAI;GAC9C,OAAO,EAAE,GAAG,OAAO;GACnB,aAAa,MAAM,YAAY,KAAK,UAAU;IAAE;IAAM,GAAG,kBAAkB,KAAK;IAAE,EAAE;GACrF;;CAGH,SAAS,+BAA+B;AACtC,UAAQ,UAAU,gBAAgB;;CAGpC,SAAS,eAAe;EACtB,MAAM,YAAY,WAAWA,UAAQ,IAAI,cAAc,+BAA+B;EACtF,MAAM,aAAa,WAAWA,UAAQ,IAAI,eAAe,gCAAgC;EACzF,MAAM,eAAe,WAAWA,UAAQ,IAAI,iBAAiB,2CAA2C;EAExG,MAAM,UAAU,EAAE;AAClB,MAAI,YAAYA,UAAQ,IAAI,cAAc,KAAK,CAC7C,SAAQ,KAAK;GAAE,MAAM;GAAS,SAAS;GAAM,OAAO,CAAC,UAAU;GAAE,WAAW;GAAgB,CAAC;AAE/F,MAAI,YAAYA,UAAQ,IAAI,eAAe,KAAK,CAC9C,SAAQ,KAAK;GACX,MAAM;GAAU,SAAS;GAAM,OAAO,CAAC,WAAW;GAClD,aAAa,IAAI,yBAAyB,EAAE,GAAG,CAAC,kBAAkB;GAClE,WAAW;GACZ,CAAC;AAEJ,MAAI,YAAYA,UAAQ,IAAI,iBAAiB,KAAK,CAChD,SAAQ,KAAK;GAAE,MAAM;GAAY,SAAS;GAAM,OAAO,CAAC,aAAa;GAAE,WAAW;GAAmB,CAAC;AAExG,SAAO;;CAGT,eAAe,gBAAgB,QAAQ;AACrC,SAAO,GAAG,OAAO,OAAO;GACtB,WAAW;GAAM,UAAU;GAAM,qBAAqB;GACtD,QAAQ;GAAM,gBAAgB;GAAM,QAAQ,OAAO,eAAe,EAAE;GACrE,CAAC;;CAKJ,SAAS,uBAAuB,SAAS;AACvC,SAAO,wBAAwB;GAC7B,MAAM,IAAI;GAAM,QAAQ,IAAI;GAC5B,aAAa,QAAQ,KAAK,MAAM,EAAE,KAAK;GACxC,CAAC;;CAGJ,SAAS,mBAAmB,MAAM;AAChC,SAAO,kBAAkB,MAAM,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS;;CAGhE,SAAS,gBAAgB,WAAW,QAAQ,KAAK,KAAK,EAAE;AACtD,MAAI,CAAC,UAAW,QAAO;EACvB,MAAM,IAAI,IAAI,KAAK,OAAO,UAAU,CAAC;AACrC,MAAI,OAAO,MAAM,EAAE,SAAS,CAAC,CAAE,QAAO;AACtC,SAAO,QAAQ,EAAE,SAAS,IAAI,OAAU,KAAK;;CAG/C,SAAS,eAAe,YAAY,QAAQ;AAAE,SAAO,UAAU,WAAW,GAAG;;CAC7E,SAAS,kBAAkB,YAAY,SAAS;AAAE,SAAO,QAAQ,WAAW,GAAG;;CAC/E,SAAS,uBAAuB,YAAY,WAAW;AAAE,SAAO,eAAe,WAAW,GAAG,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG;;CAGvH,eAAe,kBAAkB,OAAO,QAAQ,mBAAmB,OAAO;AACxE,MAAI,YAAY,CAAE;EAClB,MAAM,QAAQ,MAAM,gBAAgB,OAAO;AAC3C,OAAK,MAAM,YAAY,OAAO;AAC5B,OAAI,YAAY,CAAE;AAClB,OAAI;IACF,MAAM,OAAO,MAAMC,KAAG,KAAK,SAAS;AACpC,UAAM,UAAU,eAAe,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,KAAK,KAAK;WAC5E;;;CAIZ,SAAS,qBAAqB,EAAE,OAAO,WAAW;EAChD,MAAM,MAAM,uBAAuB,QAAQ;AAC3C,MAAI,IAAI,gBAAgB;AACtB,SAAM,aAAa,IAAI;AACvB,OAAI,QAAQ,0CAA0C,EAAE,KAAK,CAAC;;EAEhE,MAAM,aAAa,uBAAuB,IAAI,cAAc;AAC5D,MAAI,WAAY,QAAO;GAAE,MAAM;GAAY,gBAAgB;GAAM,QAAQ;GAAM;EAC/E,MAAM,SAAS,uBAAuB,MAAM,UAAU,IAAI,CAAC;AAC3D,MAAI,OAAQ,QAAO;GAAE,MAAM;GAAQ,gBAAgB;GAAO,QAAQ;GAAO;AACzE,SAAO;GAAE,MAAM;GAAY,gBAAgB;GAAM,QAAQ;GAAO;;CAGlE,eAAe,mBAAmB,EAAE,OAAO,SAAS,MAAM,gBAAgB,mBAAmB,SAAS;EACpG,MAAM,WAAW,uBAAuB,KAAK,IAAI;AACjD,MAAI,CAAC,eAAgB,QAAO;AAC5B,MAAI,aAAa,WACf,MAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,YAAY,CAAE;AAClB,SAAM,kBAAkB,OAAO,QAAQ,WAAW;;AAGtD,MAAI,YAAY,CAAE,QAAO;AACzB,QAAM,UAAU,uBAAuB,QAAQ,EAAE,SAAS;AAC1D,MAAI,aAAa,WAAY,QAAO;AACpC,SAAO;;CAKT,SAAS,iBAAiB;AACxB,MAAI,CAAC,IAAI,OAAQ,OAAM,IAAI,MAAM,+BAA+B;AAChE,MAAI,CAAC,IAAI,OAAO,WAAW,WAAW,IAAI,CAAC,IAAI,OAAO,WAAW,WAAW,CAC1E,KAAI,QAAQ,6CAA6C;GAAE,YAAY,IAAI,OAAO,MAAM,GAAG,EAAE;GAAE,SAAS,IAAI,OAAO;GAAQ,CAAC;;CAMhI,SAAS,gBAAgB,KAAK;AAC5B,MAAI;GACF,MAAM,MAAM,UAAU,MAAM;IAAC;IAAM;IAAkB;IAAM,OAAO,IAAI;IAAC,EAAE;IAAE,OAAO;IAAQ,UAAU;IAAQ,CAAC;GAC7G,MAAM,MAAM,OAAO,IAAI,UAAU,GAAG,CAAC,MAAM;AAC3C,OAAI,CAAC,IAAK,QAAO;GACjB,MAAM,QAAQ,IAAI,MAAM,iBAAiB;AACzC,OAAI,CAAC,MAAO,QAAO;AACnB,UAAO;IAAE,MAAM,OAAO,MAAM,GAAG;IAAE,SAAS,MAAM,MAAM;IAAI;UACpD;AAAE,UAAO;;;CAGnB,SAAS,eAAe,SAAS;EAC/B,MAAM,MAAM,OAAO,WAAW,GAAG,CAAC,MAAM;AACxC,SAAO,IAAI,SAAS,eAAe,IAAI,IAAI,SAAS,YAAY;;CAGlE,SAAS,yBAAyB;EAChC,IAAI,MAAM,OAAOD,UAAQ,KAAK;EAC9B,MAAM,uBAAO,IAAI,KAAK;AACtB,OAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,SAAS,GAAG;AAC1C,OAAI,CAAC,OAAO,UAAU,IAAI,IAAI,OAAO,EAAG,QAAO;AAC/C,OAAI,KAAK,IAAI,IAAI,CAAE,QAAO;AAC1B,QAAK,IAAI,IAAI;GACb,MAAM,OAAO,gBAAgB,IAAI;AACjC,OAAI,CAAC,KAAM,QAAO;AAClB,OAAI,eAAe,KAAK,QAAQ,CAC9B,KAAI;AAAE,cAAQ,KAAK,KAAK,UAAU;AAAE,WAAO;WAAc;AAAE,WAAO;;AAEpE,SAAM,OAAO,KAAK,KAAK;;AAEzB,SAAO;;CAKT,SAAS,cAAc,OAAO,YAAY,SAAS;AACjD,SAAO,MAAM,cAAc,kBAAkB,YAAY,QAAQ,EAAE,IAAI,aAAa;;CAGtF,eAAe,mBAAmB,OAAO,IAAI,UAAU,UAAU,YAAY;EAC3E,MAAM,SAAS,MAAM,gBAAgB,SAAS;AAC9C,MAAI,OAAQ,QAAO;AAEnB,MAAI;GACF,MAAM,UAAU,MAAM,GAAG,OAAO,EAAE,UAAU,CAAC;AAC7C,SAAM,gBAAgB,UAAU,QAAQ,GAAG;AAC3C,YAAS,kBAAkB;AAC3B,kBAAe,YAAY,kBAAkB;AAC7C,WAAQ,UAAU,eAAe;IAC/B,QAAQ;IAAW,QAAQ;IAC3B,WAAW,OAAO,UAAU,cAAc,GAAG;IAC7C,WAAW,QAAQ;IACpB,CAAC;AACF,OAAI,IAAI,WACN,KAAI,QAAQ,mBAAmB;IAC7B,QAAQ;IAAY,YAAY,QAAQ;IACxC,YAAY,UAAU,cAAc;IACrC,CAAC;AAEJ,UAAO,QAAQ;WACR,OAAO;GACd,MAAM,UAAU,aAAa,MAAM;AACnC,YAAS,SAAS;AAClB,kBAAe,YAAY,SAAS;AACpC,OAAI,QAAQ,0CAA0C,QAAQ;AAE9D,OAAI,QAAQ,WAAW,KAAK;IAC1B,MAAM,UAAU,MAAM,GAAG,QAAQ;AACjC,UAAM,gBAAgB,UAAU,QAAQ,GAAG;AAC3C,aAAS,kBAAkB;AAC3B,mBAAe,YAAY,kBAAkB;AAC7C,YAAQ,UAAU,eAAe;KAC/B,QAAQ;KAAW,QAAQ;KAC3B,WAAW,OAAO,UAAU,cAAc,GAAG;KAC7C,WAAW,QAAQ;KACpB,CAAC;AACF,QAAI,IAAI,WACN,KAAI,QAAQ,6CAA6C;KACvD,QAAQ;KAAY,YAAY,QAAQ;KACzC,CAAC;AAEJ,WAAO,QAAQ;;AAEjB,SAAM;;;CAIV,eAAe,qBAAqB,EAAE,OAAO,IAAI,YAAY,YAAY,SAAS,UAAU,cAAc;EAGxG,MAAM,cAAc;GAClB,QAAQ;GAAY,MAAM,IAAI;GAAM,SAAS,IAAI;GACjD,YAAY,WAAW;GACvB,YAAY,WAAW;GACxB;EACD,MAAM,cAAc,2BAA2B,SAAS;AACxD,MAAI,YAAa,aAAY,eAAe;EAE5C,MAAM,mBAAmB,MAAM,mBAAmB,OAAO,IACvD,uBAAuB,YAAY,WAAW,UAAU,EACxD,aAAa,WACd;EAED,MAAM,UAAU,OAAO,WAAW,IAAI;EACtC,MAAM,UAAU;GACd,MAAM,WAAW;GACjB,SAAS;IAAE,SAAS,WAAW;IAAS,YAAY,WAAW;IAAW,WAAW,WAAW;IAAW,KAAK;IAAS;GACzH,UAAU;IAAE,QAAQ;IAAY,MAAM,IAAI;IAAM,SAAS,IAAI;IAAQ,YAAY,WAAW;IAAW,UAAU;IAAS,WAAW;IAAU,aAAa;IAAY;GACzK;AAED,QAAM,GAAG,OAAO,kBAAkB,QAAQ;AAC1C,WAAS,WAAW;AACpB,iBAAe,YAAY,WAAW;AACtC,UAAQ,UAAU,eAAe;GAAE,QAAQ;GAAY,QAAQ;GAAY,WAAW,WAAW;GAAW,WAAW;GAAkB,CAAC;AAC1I,qBAAmB,YAAY;GAAE,eAAe,WAAW;GAAW,eAAe,WAAW;GAAW,QAAQ,KAAK,KAAK;GAAE,CAAC;AAEhI,MAAI,IAAI,WACN,KAAI,QAAQ,qCAAqC;GAC/C,QAAQ;GAAY,YAAY,WAAW;GAAW,YAAY;GAClE,YAAY,WAAW;GAAW,MAAM,WAAW;GAAM,UAAU;GACpE,CAAC;;CAMN,eAAe,aAAa,UAAU,QAAQ;EAC5C,MAAM,SAAS,MAAMC,KAAG,KAAK,UAAU,IAAI;AAC3C,MAAI;GACF,MAAM,OAAO,MAAM,OAAO,MAAM;GAChC,IAAI,QAAQ;AACZ,OAAI,QAAQ,KAAK,KAAM,SAAQ;GAC/B,MAAM,SAAS,KAAK,OAAO;AAC3B,OAAI,UAAU,EAAG,QAAO;IAAE,OAAO,EAAE;IAAE,YAAY;IAAO,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK;IAAO;GAE3F,MAAM,UAAU,KAAK,IAAI,QAAQ,IAAI,aAAa;GAClD,MAAM,SAAS,OAAO,YAAY,QAAQ;GAC1C,MAAM,EAAE,cAAc,MAAM,OAAO,KAAK,QAAQ,GAAG,SAAS,MAAM;GAClE,MAAM,QAAQ,OAAO,SAAS,GAAG,UAAU;GAC3C,MAAM,cAAc,MAAM,YAAY,GAAK;AAC3C,OAAI,gBAAgB,GAAI,QAAO;IAAE,OAAO,EAAE;IAAE,YAAY;IAAO,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK;IAAO;GAElG,MAAM,OAAO,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC,SAAS,OAAO;GAChE,MAAM,QAAQ,EAAE;GAChB,IAAI,WAAW;AACf,QAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE;IACnC,MAAM,YAAY,OAAO,WAAW,MAAM,OAAO,GAAG;IACpD,MAAM,aAAa,QAAQ;AAC3B,gBAAY;AACZ,QAAI,CAAC,KAAK,MAAM,CAAE;AAClB,UAAM,KAAK;KAAE;KAAM;KAAY,CAAC;;AAElC,UAAO;IAAE;IAAO,YAAY,QAAQ,cAAc;IAAG,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK;IAAO;YAChF;AACR,SAAM,OAAO,OAAO;;;CAIxB,eAAe,YAAY,EAAE,OAAO,IAAI,QAAQ,UAAU,mBAAmB,OAAO,aAAa,SAAS;AACxG,MAAI,YAAY,CAAE;AAClB,MAAI;GACF,MAAM,OAAO,MAAMA,KAAG,KAAK,SAAS;AACpC,YAAS,eAAe;AACxB,kBAAe,OAAO,MAAM,eAAe;GAE3C,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK;GACnC,MAAM,YAAY,eAAe,OAAO,MAAM,OAAO;GAErD,MAAM,EAAE,OAAO,eAAe,MAAM,aAAa,UAD3B,MAAM,MAAM,UAAU,UAAU,EAAE,EAAE,CACe;AAEzE,YAAS,aAAa,MAAM,OAAO;AACnC,kBAAe,OAAO,MAAM,aAAa,MAAM,OAAO;AACtD,sBAAmB,OAAO,MAAM;IAAE,UAAU;IAAU,QAAQ,KAAK,KAAK;IAAE,CAAC;AAC3E,OAAI,MAAM,WAAW,EAAG;AAExB,QAAK,MAAM,EAAE,MAAM,gBAAgB,OAAO;AACxC,QAAI,YAAY,CAAE;IAClB,MAAM,aAAa,OAAO,UAAU;KAAE;KAAM;KAAU,CAAC;AACvD,QAAI,CAAC,cAAc,CAAC,WAAW,UAAW;AAC1C,QAAI,eAAe,cAAc,CAAC,gBAAgB,WAAW,UAAU,CAAE;AAEzE,aAAS,eAAe;AACxB,mBAAe,OAAO,MAAM,eAAe;AAC3C,uBAAmB,OAAO,MAAM;KAAE,eAAe,WAAW;KAAW,eAAe,WAAW;KAAW,QAAQ,KAAK,KAAK;KAAE,CAAC;IAEjI,MAAM,UAAU,OAAO,GAAG,OAAO,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG,WAAW,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,KAAK,GAAG;AAElI,QAAI,CADU,cAAc,OAAO,OAAO,MAAM,QAAQ,EAC5C;AAAE,cAAS,UAAU;AAAE,oBAAe,OAAO,MAAM,UAAU;AAAE;;AAE3E,UAAM,qBAAqB;KAAE;KAAO;KAAI,YAAY,OAAO;KAAM;KAAY;KAAS;KAAU;KAAY,CAAC;;AAE/G,SAAM,UAAU,WAAW,WAAW;WAC/B,OAAO;AACd,YAAS,SAAS;AAClB,kBAAe,OAAO,MAAM,SAAS;AACrC,OAAI,QAAQ,qCAAqC,OAAO,QAAQ;IAAE;IAAU,GAAG,aAAa,MAAM;IAAE,CAAC;;;CAIzG,eAAe,cAAc,EAAE,OAAO,IAAI,QAAQ,mBAAmB,OAAO,aAAa,SAAS;AAChG,MAAI,YAAY,CAAE;EAClB,IAAI,QAAQ,EAAE;AACd,MAAI;AAAE,WAAQ,MAAM,gBAAgB,OAAO;WAAW,OAAO;AAC3D,YAAS,SAAS;AAClB,OAAI,QAAQ,mCAAmC,OAAO,QAAQ,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAAE,CAAC;AAChI;;AAEF,OAAK,MAAM,YAAY,OAAO;AAC5B,OAAI,YAAY,CAAE;AAClB,SAAM,YAAY;IAAE;IAAO;IAAI;IAAQ;IAAU;IAAY;IAAY,CAAC;;;CAM9E,eAAe,sBAAsB;AACnC,MAAI,CAAC,QAAQ,MAAO;EACpB,MAAM,UAAU,QAAQ,WAAW,cAAc;AACjD,UAAQ,MAAM,aAAa,uBAAuB,QAAQ,CAAC;;CAG7D,eAAe,gCAAgC;AAC7C,4BAA0B,QAAQ,MAAM;AACxC,QAAM,0BAA0B;AAChC,gCAA8B;AAC9B,UAAQ,UAAU,iBAAiB;;CAGrC,eAAe,gBAAgB,SAAS;AACtC,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO,EAAE,IAAI,MAAM;AAEhE,MAAI,QAAQ,SAAS,wBAAwB,WAC3C,QAAO,EAAE,QAAQ,sBAAsB,EAAE;AAG3C,MAAI,QAAQ,SAAS,wBAAwB,YAAY;GACvD,MAAM,MAAM,OAAO,SAAS,MAAM,OAAO,GAAG,CAAC,MAAM;GACnD,MAAM,QAAQ,SAAS,MAAM;AAC7B,OAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yBAAyB;AAEnD,OAAI,QAAQ,0BAA0B;AACpC,QAAI,yBAAyB,YAAY,OAAO,IAAI,uBAAuB;AAC3E,wBAAoB,cAAc,CAAC;AACnC,UAAM,+BAA+B;AACrC,QAAI,QAAQ,0BAA0B;KAAE;KAAK,OAAO,IAAI,yBAAyB,OAAO;KAAO,CAAC;AAChG,WAAO,EAAE,QAAQ,sBAAsB,EAAE;;AAG3C,OAAI,QAAQ,iBAAiB;IAC3B,MAAM,OAAO,iCAAiC,MAAM;AACpD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,yBAAyB;AACpD,QAAI,gBAAgB;AACpB,QAAI,iBAAiB,SAAS;AAC9B,UAAM,+BAA+B;AACrC,QAAI,QAAQ,0BAA0B;KAAE;KAAK,OAAO,IAAI;KAAe,CAAC;AACxE,WAAO,EAAE,QAAQ,sBAAsB,EAAE;;AAG3C,OAAI,QAAQ,kBAAkB;AAC5B,QAAI,iBAAiB,YAAY,OAAO,MAAM;AAC9C,QAAI,IAAI,eAAgB,OAAM,qBAAqB;AACnD,UAAM,+BAA+B;AACrC,QAAI,QAAQ,0BAA0B;KAAE;KAAK,OAAO,IAAI,iBAAiB,OAAO;KAAO,CAAC;AACxF,WAAO,EAAE,QAAQ,sBAAsB,EAAE;;AAG3C,SAAM,IAAI,MAAM,2BAA2B,MAAM;;AAGnD,MAAI,QAAQ,SAAS,wBAAwB,iBAAiB;GAC5D,MAAM,UAAU,iCAAiC,SAAS,MAAM,QAAQ,IAAI;AAC5E,OAAI,gBAAgB;AACpB,OAAI,iBAAiB;AACrB,SAAM,qBAAqB;AAC3B,SAAM,+BAA+B;AACrC,OAAI,QAAQ,qCAAqC,EAAE,SAAS,CAAC;AAC7D,UAAO;IAAE,IAAI;IAAM,QAAQ,sBAAsB;IAAE,OAAO;IAAM;;AAGlE,SAAO,EAAE,SAAS,MAAM;;CAK1B,eAAe,uBAAuB;AACpC,MAAI,kBAAkB;AAAE,iBAAc,iBAAiB;AAAE,sBAAmB;;AAC5E,UAAQ,gBAAgB;AACxB,MAAI;AAAE,iCAA8B;UAAU;AAC9C,MAAI,QAAQ,UAAU;AAAE,OAAI;AAAE,UAAM,QAAQ,SAAS,MAAM;YAAW,GAAG;AAAE,QAAI,QAAQ,4BAA4B,aAAa,EAAE,CAAC;;AAAI,WAAQ,WAAW;;AAC1J,MAAI,QAAQ,YAAY;AAAE,OAAI;AAAE,UAAM,QAAQ,WAAW,SAAS;YAAW,GAAG;AAAE,QAAI,QAAQ,iCAAiC,aAAa,EAAE,CAAC;;AAAI,WAAQ,aAAa;;AACxK,MAAI,QAAQ,OAAO;AAAE,OAAI;AAAE,YAAQ,MAAM,OAAO;YAAW,GAAG;AAAE,QAAI,QAAQ,+BAA+B,aAAa,EAAE,CAAC;;AAAI,WAAQ,QAAQ;;AAC/I,UAAQ,KAAK;AACb,UAAQ,OAAO;AACf,UAAQ,UAAU;AAClB,UAAQ,aAAa;;CAKvB,eAAe,aAAa;AAC1B,kBAAgB;AAChB,sBAAoB;EAEpB,MAAM,QAAQ,YAAY,EAAE,QAAQ,IAAI,QAAQ,CAAC;AACjD,UAAQ,QAAQ;AAGhB,MAAI;GACF,MAAM,WAAW,MAAM,yBAAyB;GAChD,MAAM,iBAAiB,SAAS;GAChC,MAAM,kBAAkB,yBAAyB,MAAM;AAEvD,OAAI,kBAAkB,gBACpB,KAAI,QAAQ,uCAAuC;IACjD,MAAM,iBAAiB,QAAQ;IAAM,aAAa,iBAAiB,SAAS,SAAS;IACrF,WAAW,iBAAiB,SAAS,OAAO;IAAI,OAAO,kBAAkB,QAAQ;IAAM,SAAS,IAAI;IACrG,CAAC;AAEJ,OAAI,mBAAmB,CAAC,gBAAgB;AACtC,UAAM,0BAA0B;AAChC,QAAI,QAAQ,6CAA6C,EAAE,YAAY,OAAO,CAAC;;AAEjF,OAAI,kBAAkB,CAAC,iBAAiB;AACtC,8BAA0B,MAAM;IAChC,MAAM,SAAS,MAAM,sBAAsB,SAAS,QAAQ,IAAI,YAAY,SAAS,IAAI;AACzF,QAAI,QAAQ,6CAA6C;KAAE,UAAU;KAAO,aAAa,OAAO,WAAW,QAAQ;KAAM,aAAa,OAAO;KAAQ,CAAC;;AAExJ,OAAI,CAAC,kBAAkB,CAAC,iBAAiB;AACvC,8BAA0B,MAAM;AAChC,UAAM,0BAA0B;AAChC,QAAI,QAAQ,uCAAuC,EAAE,MAAM,KAAK,QAAQ,IAAI,WAAW,EAAE,CAAC;;WAErF,OAAO;AACd,OAAI,QAAQ,+CAA+C,aAAa,MAAM,CAAC;;EAIjF,MAAM,UAAU,cAAc;AAC9B,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,sEAAsE;AAChH,sBAAoB,QAAQ;AAE5B,UAAQ,aAAa,MAAM,gBAAgB;GAAE,UAAU,IAAI;GAAU,QAAQ,IAAI;GAAQ,MAAM,IAAI;GAAM,CAAC;EAE1G,MAAM,KAAK,IAAI,aAAa;GAAE,QAAQ,IAAI;GAAQ,SAAS,IAAI;GAAS,CAAC;AACzE,UAAQ,KAAK;AAGb,MAAI;AAAE,SAAM,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC;WAAW,OAAO;GAChD,MAAM,UAAU,aAAa,MAAM;AACnC,SAAM,IAAI,MAAM,uDAAuD,QAAQ,UAAU,IAAI,QAAQ,QAAQ,OAAO,IAAI,QAAQ,SAAS,QAAQ,YAAY,QAAQ,QAAQ,GAAG;;EAIlL,MAAM,WAAW,eAAe;GAC9B,MAAM,IAAI;GAAQ,MAAM,IAAI;GAAQ,cAAc,IAAI;GAAY,aAAa;GAC/E,aAAa;GACb,eAAe,MAAM,WAAW,MAAM,CAAC,iBAAiB,CAAC;GACzD,WAAW;GACX,WAAW;GACZ,CAAC;AACF,UAAQ,WAAW;EACnB,MAAM,SAAS,MAAM,SAAS,OAAO;AAErC,MAAI,QAAQ,+BAA+B;GACzC,SAAS,IAAI;GAAQ,MAAM,IAAI;GAAM,SAAS,IAAI;GAAQ,MAAM;GAChE,SAAS,OAAO;GAAM,SAAS,OAAO;GAAM,cAAc,IAAI;GAAY,SAAS,IAAI;GACvF,SAAS,QAAQ,KAAK,OAAO;IAAE,MAAM,EAAE;IAAM,OAAO,EAAE;IAAO,EAAE;GAChE,CAAC;AAEF,UAAQ,gBAAgB;AACxB,gCAA8B;AAE9B,qBAAmB,kBAAkB;AAAE,OAAI;AAAE,kCAA8B;WAAU;KAAoB,KAAK,IAAI,IAAI,aAAa,IAAI,CAAC;AACxI,mBAAiB,SAAS;EAG1B,IAAI,UAAU;EACd,IAAI,gBAAgB;EACpB,MAAM,QAAQ,SAAS,eAAe;AACpC,OAAI,cAAe;AACnB,mBAAgB;AAChB,OAAI,WAAW,UAAU,WAAW,SAAU,yBAAwB;AACtE,aAAU;;AAEZ,UAAQ,OAAO;AAEf,YAAQ,GAAG,gBAAgB,KAAK,SAAS,CAAC;AAC1C,YAAQ,GAAG,iBAAiB,KAAK,UAAU,CAAC;AAG5C,UAAQ,aAAa;AACrB,MAAI,SAAS;GACX,MAAM,gBAAgB,qBAAqB;IAAE;IAAO;IAAS,CAAC;AAC9D,OAAI,SAAS;AACX,YAAQ,aAAa,MAAM,mBAAmB;KAC5C;KAAO;KAAS,MAAM,cAAc;KACpC,gBAAgB,cAAc;KAAgB,kBAAkB,CAAC;KAClE,CAAC;AACF,QAAI,QAAQ,2BAA2B;KACrC,MAAM,cAAc;KAAM,YAAY,mBAAmB,cAAc,KAAK;KAC5E,SAAS,cAAc,iBAAiB,QAAQ;KAAM,aAAa,QAAQ;KAC5E,CAAC;;;AAIN,SAAO,SAAS;AACd,OAAI;AAAE,iCAA6B,MAAM;YAAW,OAAO;AACzD,QAAI,QAAQ,oDAAoD,aAAa,MAAM,CAAC;;AAGtF,YAAS,SAAS;GAClB,MAAM,aAAa,KAAK,KAAK;AAC7B,QAAK,MAAM,UAAW,QAAQ,WAAW,EAAE,EAAG;AAC5C,QAAI,CAAC,QAAS;AACd,UAAM,cAAc;KAAE;KAAO;KAAI;KAAQ,kBAAkB,CAAC;KAAS,YAAY,QAAQ,cAAc;KAAO,CAAC;;AAGjH,OAAI,MAAM,SAAS,IAAI,uBAAuB,EAAK,KAAI;AAAE,UAAM,gBAAgB;WAAU;AACzF,iCAA8B;AAE9B,OAAI,CAAC,QAAS;GACd,MAAM,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,KAAK,GAAG,aAAa,GAAG;AACnE,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,OAAO,CAAC;;AAG7D,UAAQ,gBAAgB;AACxB,gCAA8B;AAC9B,kBAAgB;AAChB,QAAM,sBAAsB;AAC5B,MAAI,QAAQ,8BAA8B;;AAK5C,aAAY,CAAC,MAAM,OAAO,UAAU;EAClC,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;EAC3E,MAAM,mBAAmB,OAAO,SAAS,aAAa,aAAa,WAAW,sCAAsC;AACpH,QAAM,sBAAsB;AAE5B,MAAI,kBAAkB;AACpB,OAAI,QAAQ,gCAAgC,EAAE,OAAO,cAAc,CAAC;AACpE,2BAAwB;SACnB;AACL,YAAS,SAAS;AAClB,OAAI,SAAS,uBAAuB,EAAE,OAAO,cAAc,CAAC;;AAE9D,YAAQ,KAAK,mBAAmB,IAAI,EAAE;GACtC;;;;;ACn9BJ,WAAW;CAAE;CAAa;CAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"sdk-daemon.mjs","names":["WebSocket","fs","process","fs"],"sources":["../../../daemon/src/store.mjs","../../../daemon/src/redact.mjs","../../../daemon/src/ws-server.mjs","../../../daemon/src/daemon.mjs","../../src/cli/sdk-daemon.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 daemon_config (\n key TEXT PRIMARY KEY,\n value TEXT,\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 getConfig: db.prepare(`\n SELECT value\n FROM daemon_config\n WHERE key = ?\n LIMIT 1\n `),\n setConfig: db.prepare(`\n INSERT INTO daemon_config (key, value, updated_at)\n VALUES (?, ?, unixepoch())\n ON CONFLICT(key) DO UPDATE SET\n value = excluded.value,\n updated_at = unixepoch()\n `),\n deleteConfig: db.prepare(`\n DELETE FROM daemon_config\n WHERE key = ?\n `),\n getAllConfig: db.prepare(`\n SELECT key, value\n FROM daemon_config\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 getConfig(key) {\n const row = stmt.getConfig.get(String(key ?? \"\"));\n return row ? String(row.value ?? \"\") : null;\n },\n setConfig(key, value) {\n stmt.setConfig.run(String(key ?? \"\"), String(value ?? \"\"));\n },\n deleteConfig(key) {\n stmt.deleteConfig.run(String(key ?? \"\"));\n },\n getAllConfig() {\n const out = {};\n for (const row of stmt.getAllConfig.all()) {\n out[String(row.key)] = String(row.value ?? \"\");\n }\n return out;\n },\n getConfigBool(key, fallback = false) {\n return parseBool(this.getConfig(key), fallback);\n },\n getConfigInt(key, fallback = 0) {\n return parseNumber(this.getConfig(key), fallback);\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 fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n DAEMON_WS_MESSAGE_TYPES,\n buildDaemonWsMessage,\n parseDaemonWsMessage,\n} from \"@ultracontext/protocol\";\nimport { WebSocket, WebSocketServer } from \"ws\";\n\nfunction safeParseMessage(raw) {\n return parseDaemonWsMessage(String(raw ?? \"\"), null);\n}\n\nfunction safeSend(ws, payload) {\n if (!ws || ws.readyState !== WebSocket.OPEN) return;\n ws.send(JSON.stringify(payload));\n}\n\nfunction safeErrorMessage(error, fallback = \"unknown_error\") {\n if (!error) return fallback;\n if (error instanceof Error && error.message) return error.message;\n return String(error);\n}\n\nexport function createWsServer({\n host,\n port,\n infoFilePath,\n portFilePath,\n heartbeatMs = 5000,\n getSnapshot = () => ({}),\n getLogs = () => [],\n getConfig = () => ({}),\n onCommand = async () => ({}),\n} = {}) {\n const clients = new Set();\n let wss = null;\n let heartbeatTimer = null;\n let currentPort = 0;\n const discoveryFilePath = infoFilePath ?? portFilePath;\n\n const broadcast = (message) => {\n for (const client of clients) safeSend(client, message);\n };\n\n const stopHeartbeat = () => {\n if (!heartbeatTimer) return;\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n };\n\n const startHeartbeat = () => {\n stopHeartbeat();\n heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const client of clients) {\n const lastPong = Number(client.__ucLastPong ?? 0);\n if (lastPong && now - lastPong > heartbeatMs * 3) {\n try {\n client.terminate();\n } catch {\n // ignore\n }\n continue;\n }\n safeSend(client, buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.PING, { ts: now }));\n }\n }, heartbeatMs);\n heartbeatTimer.unref?.();\n };\n\n async function writePortFile() {\n if (!discoveryFilePath) return;\n const resolved = path.resolve(discoveryFilePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n const payload = {\n pid: process.pid,\n host,\n port: currentPort,\n startedAt: new Date().toISOString(),\n };\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n }\n\n async function removePortFile() {\n if (!discoveryFilePath) return;\n try {\n await fs.unlink(path.resolve(discoveryFilePath));\n } catch {\n // ignore\n }\n }\n\n return {\n async start() {\n if (wss) return { host, port: currentPort };\n wss = new WebSocketServer({ host, port });\n\n await new Promise((resolve, reject) => {\n const onError = (error) => {\n wss?.off?.(\"listening\", onListening);\n reject(error);\n };\n const onListening = () => {\n wss?.off?.(\"error\", onError);\n resolve();\n };\n wss.once(\"error\", onError);\n wss.once(\"listening\", onListening);\n });\n\n const address = wss.address();\n currentPort = typeof address === \"object\" && address ? Number(address.port ?? 0) : Number(port ?? 0);\n await writePortFile();\n\n wss.on(\"connection\", (ws) => {\n ws.__ucLastPong = Date.now();\n clients.add(ws);\n\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.SNAPSHOT,\n data: {\n state: getSnapshot(),\n recentLogs: getLogs(),\n config: getConfig(),\n clients: clients.size,\n },\n });\n\n ws.on(\"message\", async (raw) => {\n const msg = safeParseMessage(raw);\n if (!msg || typeof msg !== \"object\") return;\n\n if (msg.type === DAEMON_WS_MESSAGE_TYPES.PONG) {\n ws.__ucLastPong = Date.now();\n return;\n }\n\n const requestId = msg.id ?? null;\n try {\n const result = await onCommand(msg, { clients: clients.size });\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.REQUEST_ACK,\n id: requestId,\n ok: true,\n data: result ?? {},\n });\n } catch (error) {\n safeSend(ws, {\n type: DAEMON_WS_MESSAGE_TYPES.REQUEST_ACK,\n id: requestId,\n ok: false,\n error: safeErrorMessage(error),\n });\n }\n });\n\n ws.on(\"close\", () => {\n clients.delete(ws);\n broadcast({\n type: DAEMON_WS_MESSAGE_TYPES.STATE,\n data: {\n ...getSnapshot(),\n clients: clients.size,\n },\n });\n });\n\n ws.on(\"error\", () => {\n clients.delete(ws);\n });\n });\n\n startHeartbeat();\n return { host, port: currentPort };\n },\n broadcastState() {\n broadcast({\n type: DAEMON_WS_MESSAGE_TYPES.STATE,\n data: {\n ...getSnapshot(),\n clients: clients.size,\n },\n });\n },\n broadcastLog(entry) {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.LOG, entry));\n },\n broadcastEvent(event) {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.CONTEXT_EVENT, event));\n },\n broadcastConfig() {\n broadcast(buildDaemonWsMessage(DAEMON_WS_MESSAGE_TYPES.CONFIG_STATE, getConfig()));\n },\n clientCount() {\n return clients.size;\n },\n async stop() {\n stopHeartbeat();\n for (const client of clients) {\n try {\n client.close();\n } catch {\n // ignore\n }\n }\n clients.clear();\n\n if (wss) {\n await new Promise((resolve) => {\n wss.close(() => resolve());\n });\n wss = null;\n }\n await removePortFile();\n },\n };\n}\n","// daemon core — receives store factory as param so callers control env/sqlite\nimport fs from \"node:fs/promises\";\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 DAEMON_WS_MESSAGE_TYPES,\n createBootstrapStateKey,\n normalizeBootstrapMode,\n parseProtocolJson,\n resolveDaemonWsHost,\n resolveDaemonWsInfoFile,\n resolveDaemonWsPort,\n} from \"@ultracontext/protocol\";\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\";\nimport { createWsServer } from \"./ws-server.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 PERSISTED_CONFIG_FIELDS = [\"bootstrapMode\", \"claudeIncludeSubagents\"];\nconst STORE_CONFIG_PREFS_KEY = \"daemon:prefs\";\nconst cliArgs = new Set(process.argv.slice(2));\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// ── 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 wsHost: resolveDaemonWsHost(process.env),\n wsPort: resolveDaemonWsPort(process.env),\n wsInfoFile: resolveDaemonWsInfoFile(process.env),\n dedupeTtlSec: toInt(process.env.DAEMON_DEDUPE_TTL_SEC, 60 * 60 * 24 * 30),\n maxReadBytes: toInt(process.env.DAEMON_MAX_READ_BYTES, 512 * 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 daemonStateTimer = null;\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 wsServer: null,\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 const last = state.recentLogs[state.recentLogs.length - 1];\n if (runtime.wsServer && last) runtime.wsServer.broadcastLog(last);\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\n // ── config persistence ──\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 function persistConfigPrefsToStore(store = runtime.store) {\n if (!store) return;\n store.setConfig(STORE_CONFIG_PREFS_KEY, JSON.stringify(serializeConfigPrefs()));\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 async function backupConfigFileAsBak(targetFile, sourceRaw = \"\") {\n const source = path.resolve(targetFile);\n const backup = `${source}.bak`;\n let raw = sourceRaw;\n if (!raw) {\n try { raw = await fs.readFile(source, \"utf8\"); } catch { return { backedUp: false, reason: \"missing\", backup }; }\n }\n try { await fs.access(backup); return { backedUp: false, reason: \"exists\", backup }; } catch { /* continue */ }\n await fs.rename(source, backup);\n await fs.writeFile(source, raw, \"utf8\");\n return { backedUp: true, reason: \"ok\", backup };\n }\n\n function applyConfigPrefs(prefs) {\n if (!prefs || typeof prefs !== \"object\") return;\n for (const field of PERSISTED_CONFIG_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 function loadConfigPrefsFromStore(store = runtime.store) {\n if (!store) return false;\n const raw = store.getConfig(STORE_CONFIG_PREFS_KEY);\n const parsed = parseProtocolJson(raw, null);\n if (!parsed || typeof parsed !== \"object\") return false;\n applyConfigPrefs(parsed);\n return true;\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 refreshDaemonConfigFromStore(store = runtime.store) {\n if (!store) return false;\n const before = serializeConfigPrefs();\n const loaded = loadConfigPrefsFromStore(store);\n if (!loaded) return false;\n const after = serializeConfigPrefs();\n if (JSON.stringify(before) === JSON.stringify(after)) return false;\n\n if (before.claudeIncludeSubagents !== after.claudeIncludeSubagents) {\n applyRuntimeSources(buildSources());\n }\n log(\"info\", \"Reloaded config prefs from local store\", {\n claude_subagents: after.claudeIncludeSubagents ? \"on\" : \"off\",\n bootstrap_mode: after.bootstrapMode,\n });\n runtime.wsServer?.broadcastConfig();\n return true;\n }\n\n function buildDaemonRuntimeSnapshot() {\n return {\n ts: Date.now(), mode: \"daemon\", running: Boolean(runtime.daemonRunning),\n pid: process.pid, host: cfg.host, userId: cfg.userId,\n stats: { ...stats },\n sourceStats: state.sourceOrder.map((name) => ({ name, ...ensureSourceStats(name) })),\n };\n }\n\n function publishDaemonRuntimeSnapshot() {\n runtime.wsServer?.broadcastState();\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\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({ store, sources }) {\n const key = bootstrapStateStoreKey(sources);\n if (cfg.bootstrapReset) {\n store.deleteConfig(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(store.getConfig(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 store.setConfig(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\");\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 async function getOrCreateContext(store, uc, cacheKey, metadata, sourceName) {\n const cached = store.getContextCache(cacheKey);\n if (cached) return cached;\n\n try {\n const created = await uc.create({ metadata });\n store.setContextCache(cacheKey, created.id);\n bumpStat(\"contextsCreated\");\n bumpSourceStat(sourceName, \"contextsCreated\");\n runtime.wsServer?.broadcastEvent({\n action: \"created\", source: sourceName,\n sessionId: String(metadata?.session_id ?? \"\"),\n contextId: created.id,\n });\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 runtime.wsServer?.broadcastEvent({\n action: \"created\", source: sourceName,\n sessionId: String(metadata?.session_id ?? \"\"),\n contextId: created.id,\n });\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 }\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 runtime.wsServer?.broadcastEvent({ action: \"appended\", source: sourceName, sessionId: normalized.sessionId, contextId: sessionContextId });\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 // ── 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 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 await appendToUltraContext({ store, uc, sourceName: source.name, normalized, eventId, filePath, lineOffset });\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 for (const filePath of files) {\n if (shouldStop()) break;\n await processFile({ store, uc, source, filePath, shouldStop, ingestMode });\n }\n }\n\n // ── runtime commands ──\n\n async function resetBootstrapState() {\n if (!runtime.store) return;\n const sources = runtime.sources ?? buildSources();\n runtime.store.deleteConfig(bootstrapStateStoreKey(sources));\n }\n\n async function persistDaemonConfigEverywhere() {\n persistConfigPrefsToStore(runtime.store);\n await persistConfigPrefsToFile();\n publishDaemonRuntimeSnapshot();\n runtime.wsServer?.broadcastConfig();\n }\n\n async function handleWsCommand(message) {\n if (!message || typeof message !== \"object\") return { ok: true };\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONFIG_GET) {\n return { config: serializeConfigPrefs() };\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.CONFIG_SET) {\n const key = String(message?.data?.key ?? \"\").trim();\n const value = message?.data?.value;\n if (!key) throw new Error(\"config key is required\");\n\n if (key === \"claudeIncludeSubagents\") {\n cfg.claudeIncludeSubagents = boolFromEnv(value, cfg.claudeIncludeSubagents);\n applyRuntimeSources(buildSources());\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.claudeIncludeSubagents ? \"on\" : \"off\" });\n return { config: serializeConfigPrefs() };\n }\n\n if (key === \"bootstrapMode\") {\n const next = normalizeBootstrapModeWithPrompt(value);\n if (!next) throw new Error(\"invalid bootstrap mode\");\n cfg.bootstrapMode = next;\n cfg.bootstrapReset = next === \"prompt\";\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.bootstrapMode });\n return { config: serializeConfigPrefs() };\n }\n\n if (key === \"bootstrapReset\") {\n cfg.bootstrapReset = boolFromEnv(value, false);\n if (cfg.bootstrapReset) await resetBootstrapState();\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Config updated via TUI\", { key, value: cfg.bootstrapReset ? \"on\" : \"off\" });\n return { config: serializeConfigPrefs() };\n }\n\n throw new Error(`unsupported config key: ${key}`);\n }\n\n if (message.type === DAEMON_WS_MESSAGE_TYPES.BOOTSTRAP_RESET) {\n const profile = normalizeBootstrapModeWithPrompt(message?.data?.profile) || \"prompt\";\n cfg.bootstrapMode = profile;\n cfg.bootstrapReset = true;\n await resetBootstrapState();\n await persistDaemonConfigEverywhere();\n log(\"info\", \"Bootstrap reset requested via TUI\", { profile });\n return { ok: true, config: serializeConfigPrefs(), reset: true };\n }\n\n return { ignored: true };\n }\n\n // ── cleanup ──\n\n async function stopRuntimeResources() {\n if (daemonStateTimer) { clearInterval(daemonStateTimer); daemonStateTimer = null; }\n runtime.daemonRunning = false;\n try { publishDaemonRuntimeSnapshot(); } catch { /* ignore */ }\n if (runtime.wsServer) { try { await runtime.wsServer.stop(); } catch (e) { log(\"warn\", \"Failed to stop WS server\", errorDetails(e)); } runtime.wsServer = null; }\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\n try {\n const fileLoad = await loadConfigPrefsFromFile();\n const loadedFromFile = fileLoad.loaded;\n const loadedFromStore = loadConfigPrefsFromStore(store);\n\n if (loadedFromFile || loadedFromStore) {\n log(\"info\", \"Loaded persisted config preferences\", {\n file: loadedFromFile ? \"yes\" : \"no\", file_source: loadedFromFile ? fileLoad.source : \"none\",\n file_path: loadedFromFile ? fileLoad.file : \"\", store: loadedFromStore ? \"yes\" : \"no\", db_path: cfg.dbFile,\n });\n }\n if (loadedFromStore && !loadedFromFile) {\n await persistConfigPrefsToFile();\n log(\"info\", \"Materialized store config prefs into file\", { file_saved: \"yes\" });\n }\n if (loadedFromFile && !loadedFromStore) {\n persistConfigPrefsToStore(store);\n const backup = await backupConfigFileAsBak(fileLoad.file || cfg.configFile, fileLoad.raw);\n log(\"info\", \"Materialized file config prefs into store\", { db_saved: \"yes\", file_backup: backup.backedUp ? \"yes\" : \"no\", backup_path: backup.backup });\n }\n if (!loadedFromFile && !loadedFromStore) {\n persistConfigPrefsToStore(store);\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})`);\n }\n\n // ws server\n const wsServer = createWsServer({\n host: cfg.wsHost, port: cfg.wsPort, infoFilePath: cfg.wsInfoFile, heartbeatMs: 5000,\n getSnapshot: buildDaemonRuntimeSnapshot,\n getLogs: () => state.recentLogs.slice(-runtimeLogsKeep()),\n getConfig: serializeConfigPrefs,\n onCommand: handleWsCommand,\n });\n runtime.wsServer = wsServer;\n const wsInfo = await wsServer.start();\n\n log(\"info\", \"UltraContext daemon started\", {\n user_id: cfg.userId, host: cfg.host, poll_ms: cfg.pollMs, mode: \"headless\",\n ws_host: wsInfo.host, ws_port: wsInfo.port, ws_info_file: cfg.wsInfoFile, db_file: cfg.dbFile,\n sources: sources.map((s) => ({ name: s.name, globs: s.globs })),\n });\n\n runtime.daemonRunning = true;\n publishDaemonRuntimeSnapshot();\n\n daemonStateTimer = setInterval(() => { try { publishDaemonRuntimeSnapshot(); } catch { /* ignore */ } }, Math.max(cfg.uiRefreshMs, 500));\n daemonStateTimer.unref?.();\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 try { refreshDaemonConfigFromStore(store); } catch (error) {\n log(\"warn\", \"Failed to refresh daemon config from local store\", errorDetails(error));\n }\n\n bumpStat(\"cycles\");\n const cycleStart = Date.now();\n for (const source of (runtime.sources ?? [])) {\n if (!running) break;\n await 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 publishDaemonRuntimeSnapshot();\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 publishDaemonRuntimeSnapshot();\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 daemon entry-point — wires store + boots daemon without dotenv\nimport { createStore, resolveDbPath } from \"@ultracontext/daemon/store\";\nimport { daemonBoot } from \"@ultracontext/daemon/daemon\";\n\ndaemonBoot({ createStore, resolveDbPath });\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveDaemonWsInfoFile } from "./src-
|
|
2
|
-
import { n as resolveLockPath } from "./lock-
|
|
1
|
+
import { c as resolveDaemonWsInfoFile } from "./src-BSCJv6SU.mjs";
|
|
2
|
+
import { n as resolveLockPath } from "./lock-CQ3xrIlj.mjs";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import fs from "node:fs/promises";
|
|
@@ -126,4 +126,4 @@ if (process.argv[1] && import.meta.url.endsWith(process.argv[1].replace(/.*\//,
|
|
|
126
126
|
|
|
127
127
|
//#endregion
|
|
128
128
|
export { runCtl };
|
|
129
|
-
//# sourceMappingURL=ctl-
|
|
129
|
+
//# sourceMappingURL=ctl-BVPu-D57.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ctl-
|
|
1
|
+
{"version":3,"file":"ctl-BVPu-D57.mjs","names":[],"sources":["../../daemon/src/ctl.mjs"],"sourcesContent":["// daemon ctl — status/stop commands, exported as runCtl()\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { resolveDaemonWsInfoFile } from \"@ultracontext/protocol\";\n\nimport { resolveLockPath } from \"./lock.mjs\";\n\nfunction isPidAlive(pid) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (error?.code === \"EPERM\") return true;\n if (error?.code === \"ESRCH\") return false;\n return false;\n }\n}\n\nasync function readJsonFile(filePath) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" ? parsed : null;\n } catch {\n return null;\n }\n}\n\nasync function removeFileIfExists(filePath) {\n try { await fs.unlink(filePath); } catch { /* ignore */ }\n}\n\nfunction pickPid(lock, info) {\n const lockPid = Number.parseInt(String(lock?.pid ?? \"\"), 10);\n if (Number.isInteger(lockPid) && lockPid > 1) return lockPid;\n const infoPid = Number.parseInt(String(info?.pid ?? \"\"), 10);\n if (Number.isInteger(infoPid) && infoPid > 1) return infoPid;\n return 0;\n}\n\n// ── ANSI helpers ────────────────────────────────────────────────\n\nconst isTTY = process.stdout.isTTY;\nconst esc = (code) => (isTTY ? `\\x1b[${code}m` : \"\");\nconst r = esc(0);\nconst b = esc(1);\nconst d = esc(2);\nconst blue = esc(\"38;2;47;111;179\");\nconst green = esc(\"38;2;80;200;120\");\nconst red = esc(\"38;2;220;80;80\");\nconst gray = esc(\"38;5;245\");\n\n// ── commands ────────────────────────────────────────────────────\n\nasync function status({ lockPath, infoPath }) {\n const lock = await readJsonFile(lockPath);\n const info = await readJsonFile(infoPath);\n const pid = pickPid(lock, info);\n\n console.log(\"\");\n console.log(` ${blue}${b}UltraContext${r} ${d}Daemon${r}`);\n console.log(\"\");\n\n if (!isPidAlive(pid)) {\n console.log(` ${gray}○${r} ${d}Offline${r}`);\n console.log(\"\");\n return 0;\n }\n\n const port = Number.parseInt(String(info?.port ?? \"\"), 10);\n const portStr = Number.isInteger(port) && port > 0 ? ` ${gray}Port ${port}${r}` : \"\";\n const sinceStr = info?.startedAt ? ` ${gray}Since ${info.startedAt}${r}` : \"\";\n console.log(` ${green}●${r} ${b}Online${r} ${gray}PID ${pid}${r}${portStr}`);\n if (sinceStr) console.log(` ${sinceStr}`);\n console.log(\"\");\n return 0;\n}\n\nasync function stop({ lockPath, infoPath }) {\n const lock = await readJsonFile(lockPath);\n const info = await readJsonFile(infoPath);\n const pid = pickPid(lock, info);\n\n console.log(\"\");\n console.log(` ${blue}${b}UltraContext${r} ${d}Daemon${r}`);\n console.log(\"\");\n\n if (!isPidAlive(pid)) {\n await removeFileIfExists(lockPath);\n await removeFileIfExists(infoPath);\n console.log(` ${gray}○${r} ${d}Already stopped${r}`);\n console.log(\"\");\n return 0;\n }\n\n process.kill(pid, \"SIGTERM\");\n\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (!isPidAlive(pid)) break;\n await new Promise((resolve) => setTimeout(resolve, 120));\n }\n\n if (isPidAlive(pid)) {\n console.error(` ${red}✕${r} ${b}Timed out${r} ${gray}PID ${pid} still running${r}`);\n console.error(\"\");\n return 1;\n }\n\n await removeFileIfExists(lockPath);\n await removeFileIfExists(infoPath);\n console.log(` ${green}✓${r} ${b}Stopped${r} ${gray}PID ${pid}${r}`);\n console.log(\"\");\n return 0;\n}\n\n// ── exported entry point ────────────────────────────────────────\n\nexport async function runCtl() {\n const cmd = String(process.argv[2] ?? \"status\").trim().toLowerCase();\n const lockPath = path.resolve(resolveLockPath(process.env));\n const infoPath = path.resolve(resolveDaemonWsInfoFile(process.env));\n\n if (cmd === \"status\") {\n const code = await status({ lockPath, infoPath });\n process.exit(code);\n return;\n }\n\n if (cmd === \"stop\") {\n const code = await stop({ lockPath, infoPath });\n process.exit(code);\n return;\n }\n\n console.error(`Invalid command: ${cmd}`);\n console.error(\"Use: ultracontext [status|stop]\");\n process.exit(1);\n}\n\n// auto-exec when run directly\nconst isDirectRun = process.argv[1] && import.meta.url.endsWith(process.argv[1].replace(/.*\\//, \"\"));\nif (isDirectRun) {\n runCtl().catch((error) => {\n console.error(`Daemon control failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as resolveDaemonWsInfoFile, f as expandHome } from "./src-
|
|
2
|
-
import { n as resolveLockPath } from "./lock-
|
|
1
|
+
import { c as resolveDaemonWsInfoFile, f as expandHome } from "./src-BSCJv6SU.mjs";
|
|
2
|
+
import { n as resolveLockPath } from "./lock-CQ3xrIlj.mjs";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import path from "node:path";
|
|
@@ -138,4 +138,4 @@ if (process.argv[1] && import.meta.url.endsWith(process.argv[1].replace(/.*\//,
|
|
|
138
138
|
|
|
139
139
|
//#endregion
|
|
140
140
|
export { launchDaemon };
|
|
141
|
-
//# sourceMappingURL=launcher-
|
|
141
|
+
//# sourceMappingURL=launcher-BFPi7_wD.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher-
|
|
1
|
+
{"version":3,"file":"launcher-BFPi7_wD.mjs","names":["fs","fsSync"],"sources":["../../daemon/src/launcher.mjs"],"sourcesContent":["// daemon launcher — spawns daemon in background, exported as launchDaemon()\nimport fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { resolveDaemonWsInfoFile } from \"@ultracontext/protocol\";\n\nimport { resolveLockPath } from \"./lock.mjs\";\nimport { expandHome } from \"./utils.mjs\";\n\nconst DEFAULT_LOG_FILE = \"~/.ultracontext/daemon.log\";\n\n// ── ANSI helpers ────────────────────────────────────────────────\n\nconst isTTY = process.stdout.isTTY;\nconst esc = (code) => (isTTY ? `\\x1b[${code}m` : \"\");\nconst reset = esc(0);\nconst bold = esc(1);\nconst dim = esc(2);\nconst blue = esc(\"38;2;47;111;179\");\nconst cyan = esc(\"38;2;126;195;255\");\nconst green = esc(\"38;2;80;200;120\");\nconst red = esc(\"38;2;220;80;80\");\nconst gray = esc(\"38;5;245\");\n\n// ── process helpers ─────────────────────────────────────────────\n\nfunction isPidAlive(pid) {\n if (!Number.isInteger(pid) || pid <= 1) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (error?.code === \"EPERM\") return true;\n if (error?.code === \"ESRCH\") return false;\n return false;\n }\n}\n\nasync function readJsonFile(filePath) {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" ? parsed : null;\n } catch {\n return null;\n }\n}\n\nasync function readLogTail(logPath, lines = 12) {\n try {\n const raw = await fs.readFile(logPath, \"utf8\");\n const allLines = raw.split(\"\\n\").map((l) => l.trimEnd()).filter(Boolean);\n return allLines.length === 0 ? [] : allLines.slice(-Math.max(lines, 1));\n } catch {\n return [];\n }\n}\n\nfunction resolveDaemonLogFile(env = process.env) {\n return expandHome(env.ULTRACONTEXT_DAEMON_LOG_FILE ?? DEFAULT_LOG_FILE);\n}\n\nasync function resolveRunningProcess(lockPath) {\n const lock = await readJsonFile(lockPath);\n const lockPid = Number.parseInt(String(lock?.pid ?? \"\"), 10);\n if (isPidAlive(lockPid)) {\n return { pid: lockPid, startedAt: String(lock?.startedAt ?? \"\"), userId: String(lock?.userId ?? \"\"), host: String(lock?.host ?? \"\") };\n }\n return null;\n}\n\nasync function resolveWritableLogPath(preferredPath) {\n const primary = path.resolve(preferredPath);\n try {\n await fs.mkdir(path.dirname(primary), { recursive: true });\n fsSync.accessSync(path.dirname(primary), fsSync.constants.W_OK);\n return primary;\n } catch {\n const fallback = path.resolve(process.cwd(), \".ultracontext-daemon.log\");\n await fs.mkdir(path.dirname(fallback), { recursive: true });\n return fallback;\n }\n}\n\n// ── exported entry point ────────────────────────────────────────\n\nexport async function launchDaemon({ entryPath, diagnosticsHint } = {}) {\n const resolvedEntry = entryPath ?? fileURLToPath(new URL(\"./index.mjs\", import.meta.url));\n const hint = diagnosticsHint ?? \"pnpm --filter @ultracontext/daemon run start:verbose\";\n\n const lockPath = path.resolve(resolveLockPath(process.env));\n const infoPath = path.resolve(resolveDaemonWsInfoFile(process.env));\n const preferredLogPath = resolveDaemonLogFile(process.env);\n\n console.log(\"\");\n console.log(` ${blue}${bold}UltraContext${reset} ${dim}Daemon${reset}`);\n console.log(\"\");\n\n // already running\n const running = await resolveRunningProcess(lockPath);\n if (running) {\n console.log(` ${cyan}●${reset} ${bold}Already running${reset} ${gray}PID ${running.pid}${reset}`);\n console.log(\"\");\n process.exit(2);\n return;\n }\n\n // spawn daemon\n const logPath = await resolveWritableLogPath(preferredLogPath);\n const outFd = fsSync.openSync(logPath, \"a\");\n const errFd = fsSync.openSync(logPath, \"a\");\n\n let child;\n try {\n child = spawn(process.execPath, [resolvedEntry, \"--daemon\"], {\n env: process.env,\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n });\n child.unref();\n } finally {\n try { fsSync.closeSync(outFd); } catch { /* ignore */ }\n try { fsSync.closeSync(errFd); } catch { /* ignore */ }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 350));\n\n // failed\n if (!isPidAlive(child.pid)) {\n console.log(` ${red}✕${reset} ${bold}Failed to start${reset}`);\n const tail = await readLogTail(logPath);\n if (tail.length > 0) {\n console.log(\"\");\n for (const line of tail) console.error(` ${gray}${line}${reset}`);\n }\n console.log(\"\");\n console.log(` ${dim}Try: ${hint}${reset}`);\n console.log(\"\");\n process.exit(1);\n return;\n }\n\n // success\n console.log(` ${green}✓${reset} ${bold}Started${reset} ${gray}PID ${child.pid}${reset}`);\n console.log(` ${gray}${logPath}${reset}`);\n console.log(\"\");\n}\n\n// auto-exec when run directly\nconst isDirectRun = process.argv[1] && import.meta.url.endsWith(process.argv[1].replace(/.*\\//, \"\"));\nif (isDirectRun) {\n launchDaemon().catch((error) => {\n console.error(` ${red}✕${reset} ${error instanceof Error ? error.message : String(error)}`);\n console.error(\"\");\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;;;;AAaA,MAAM,mBAAmB;AAIzB,MAAM,QAAQ,QAAQ,OAAO;AAC7B,MAAM,OAAO,SAAU,QAAQ,QAAQ,KAAK,KAAK;AACjD,MAAM,QAAQ,IAAI,EAAE;AACpB,MAAM,OAAO,IAAI,EAAE;AACnB,MAAM,MAAM,IAAI,EAAE;AAClB,MAAM,OAAO,IAAI,kBAAkB;AACnC,MAAM,OAAO,IAAI,mBAAmB;AACpC,MAAM,QAAQ,IAAI,kBAAkB;AACpC,MAAM,MAAM,IAAI,iBAAiB;AACjC,MAAM,OAAO,IAAI,WAAW;AAI5B,SAAS,WAAW,KAAK;AACvB,KAAI,CAAC,OAAO,UAAU,IAAI,IAAI,OAAO,EAAG,QAAO;AAC/C,KAAI;AACF,UAAQ,KAAK,KAAK,EAAE;AACpB,SAAO;UACA,OAAO;AACd,MAAI,OAAO,SAAS,QAAS,QAAO;AACpC,MAAI,OAAO,SAAS,QAAS,QAAO;AACpC,SAAO;;;AAIX,eAAe,aAAa,UAAU;AACpC,KAAI;EACF,MAAM,MAAM,MAAMA,KAAG,SAAS,UAAU,OAAO;EAC/C,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,SAAO,UAAU,OAAO,WAAW,WAAW,SAAS;SACjD;AACN,SAAO;;;AAIX,eAAe,YAAY,SAAS,QAAQ,IAAI;AAC9C,KAAI;EAEF,MAAM,YADM,MAAMA,KAAG,SAAS,SAAS,OAAO,EACzB,MAAM,KAAK,CAAC,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,QAAQ;AACxE,SAAO,SAAS,WAAW,IAAI,EAAE,GAAG,SAAS,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;SACjE;AACN,SAAO,EAAE;;;AAIb,SAAS,qBAAqB,MAAM,QAAQ,KAAK;AAC/C,QAAO,WAAW,IAAI,gCAAgC,iBAAiB;;AAGzE,eAAe,sBAAsB,UAAU;CAC7C,MAAM,OAAO,MAAM,aAAa,SAAS;CACzC,MAAM,UAAU,OAAO,SAAS,OAAO,MAAM,OAAO,GAAG,EAAE,GAAG;AAC5D,KAAI,WAAW,QAAQ,CACrB,QAAO;EAAE,KAAK;EAAS,WAAW,OAAO,MAAM,aAAa,GAAG;EAAE,QAAQ,OAAO,MAAM,UAAU,GAAG;EAAE,MAAM,OAAO,MAAM,QAAQ,GAAG;EAAE;AAEvI,QAAO;;AAGT,eAAe,uBAAuB,eAAe;CACnD,MAAM,UAAU,KAAK,QAAQ,cAAc;AAC3C,KAAI;AACF,QAAMA,KAAG,MAAM,KAAK,QAAQ,QAAQ,EAAE,EAAE,WAAW,MAAM,CAAC;AAC1D,KAAO,WAAW,KAAK,QAAQ,QAAQ,EAAEC,GAAO,UAAU,KAAK;AAC/D,SAAO;SACD;EACN,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK,EAAE,2BAA2B;AACxE,QAAMD,KAAG,MAAM,KAAK,QAAQ,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC3D,SAAO;;;AAMX,eAAsB,aAAa,EAAE,WAAW,oBAAoB,EAAE,EAAE;CACtE,MAAM,gBAAgB,aAAa,cAAc,IAAI,IAAI,eAAe,OAAO,KAAK,IAAI,CAAC;CACzF,MAAM,OAAO,mBAAmB;CAEhC,MAAM,WAAW,KAAK,QAAQ,gBAAgB,QAAQ,IAAI,CAAC;AAC1C,MAAK,QAAQ,wBAAwB,QAAQ,IAAI,CAAC;CACnE,MAAM,mBAAmB,qBAAqB,QAAQ,IAAI;AAE1D,SAAQ,IAAI,GAAG;AACf,SAAQ,IAAI,KAAK,OAAO,KAAK,cAAc,MAAM,GAAG,IAAI,QAAQ,QAAQ;AACxE,SAAQ,IAAI,GAAG;CAGf,MAAM,UAAU,MAAM,sBAAsB,SAAS;AACrD,KAAI,SAAS;AACX,UAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,iBAAiB,MAAM,IAAI,KAAK,MAAM,QAAQ,MAAM,QAAQ;AACnG,UAAQ,IAAI,GAAG;AACf,UAAQ,KAAK,EAAE;AACf;;CAIF,MAAM,UAAU,MAAM,uBAAuB,iBAAiB;CAC9D,MAAM,QAAQC,GAAO,SAAS,SAAS,IAAI;CAC3C,MAAM,QAAQA,GAAO,SAAS,SAAS,IAAI;CAE3C,IAAI;AACJ,KAAI;AACF,UAAQ,MAAM,QAAQ,UAAU,CAAC,eAAe,WAAW,EAAE;GAC3D,KAAK,QAAQ;GACb,UAAU;GACV,OAAO;IAAC;IAAU;IAAO;IAAM;GAChC,CAAC;AACF,QAAM,OAAO;WACL;AACR,MAAI;AAAE,MAAO,UAAU,MAAM;UAAU;AACvC,MAAI;AAAE,MAAO,UAAU,MAAM;UAAU;;AAGzC,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;AAGxD,KAAI,CAAC,WAAW,MAAM,IAAI,EAAE;AAC1B,UAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,GAAG,KAAK,iBAAiB,QAAQ;EAC/D,MAAM,OAAO,MAAM,YAAY,QAAQ;AACvC,MAAI,KAAK,SAAS,GAAG;AACnB,WAAQ,IAAI,GAAG;AACf,QAAK,MAAM,QAAQ,KAAM,SAAQ,MAAM,OAAO,OAAO,OAAO,QAAQ;;AAEtE,UAAQ,IAAI,GAAG;AACf,UAAQ,IAAI,KAAK,IAAI,OAAO,OAAO,QAAQ;AAC3C,UAAQ,IAAI,GAAG;AACf,UAAQ,KAAK,EAAE;AACf;;AAIF,SAAQ,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,SAAS,MAAM,IAAI,KAAK,MAAM,MAAM,MAAM,QAAQ;AAC1F,SAAQ,IAAI,OAAO,OAAO,UAAU,QAAQ;AAC5C,SAAQ,IAAI,GAAG;;AAKjB,IADoB,QAAQ,KAAK,MAAM,OAAO,KAAK,IAAI,SAAS,QAAQ,KAAK,GAAG,QAAQ,QAAQ,GAAG,CAAC,CAElG,eAAc,CAAC,OAAO,UAAU;AAC9B,SAAQ,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GAAG;AAC5F,SAAQ,MAAM,GAAG;AACjB,SAAQ,KAAK,EAAE;EACf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as expandHome } from "./src-
|
|
1
|
+
import { f as expandHome } from "./src-BSCJv6SU.mjs";
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import crypto from "node:crypto";
|
|
@@ -111,4 +111,4 @@ async function acquireFileLock({ lockPath = resolveLockPath(process.env), userId
|
|
|
111
111
|
|
|
112
112
|
//#endregion
|
|
113
113
|
export { sha256 as a, extractProjectPathFromFile as i, resolveLockPath as n, toInt as o, boolFromEnv as r, acquireFileLock as t };
|
|
114
|
-
//# sourceMappingURL=lock-
|
|
114
|
+
//# sourceMappingURL=lock-CQ3xrIlj.mjs.map
|