ultracontext 1.3.1 → 1.3.3
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 +7 -4
- package/dist/cli/entry.mjs.map +1 -1
- 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/postinstall.mjs +3 -0
- package/dist/src-B7VNX8_g.mjs.map +0 -1
- package/dist/tui-BmUdW0Nf.mjs.map +0 -1
package/dist/cli/entry.mjs
CHANGED
|
@@ -201,7 +201,10 @@ function runGlobalUpdate(manager, tag) {
|
|
|
201
201
|
if (!tuple) throw new Error(`Unsupported package manager: ${manager}`);
|
|
202
202
|
const [bin, args] = tuple;
|
|
203
203
|
if (spawnSync(bin, args, {
|
|
204
|
-
env:
|
|
204
|
+
env: {
|
|
205
|
+
...process.env,
|
|
206
|
+
ULTRACONTEXT_SKIP_POSTINSTALL: "1"
|
|
207
|
+
},
|
|
205
208
|
stdio: "inherit"
|
|
206
209
|
}).status !== 0) throw new Error(`Update failed while running: ${bin} ${args.join(" ")}`);
|
|
207
210
|
}
|
|
@@ -313,18 +316,18 @@ async function checkForUpdate() {
|
|
|
313
316
|
if (latest && isNewer(latest, current)) printUpdateNotice(current, latest);
|
|
314
317
|
}
|
|
315
318
|
async function launchDaemonSDK() {
|
|
316
|
-
const { launchDaemon } = await import("../launcher-
|
|
319
|
+
const { launchDaemon } = await import("../launcher-BFPi7_wD.mjs");
|
|
317
320
|
await launchDaemon({
|
|
318
321
|
entryPath: fileURLToPath(new URL("./sdk-daemon.mjs", import.meta.url)),
|
|
319
322
|
diagnosticsHint: "DAEMON_VERBOSE=1 ultracontext start"
|
|
320
323
|
});
|
|
321
324
|
}
|
|
322
325
|
async function runCtlSDK() {
|
|
323
|
-
const { runCtl } = await import("../ctl-
|
|
326
|
+
const { runCtl } = await import("../ctl-BVPu-D57.mjs");
|
|
324
327
|
await runCtl();
|
|
325
328
|
}
|
|
326
329
|
async function launchTuiSDK() {
|
|
327
|
-
const { tuiBoot } = await import("../tui-
|
|
330
|
+
const { tuiBoot } = await import("../tui-C3H6iRjz.mjs");
|
|
328
331
|
await tuiBoot({
|
|
329
332
|
assetsRoot: path.resolve(__dirname, "..", ".."),
|
|
330
333
|
offlineNotice: "Daemon offline. Run: ultracontext start"
|
package/dist/cli/entry.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.mjs","names":[],"sources":["../../src/cli/entry.mjs"],"sourcesContent":["#!/usr/bin/env node\n\n// CLI router — dispatches subcommands to daemon/tui entry points\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport { spawnSync } from \"node:child_process\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst command = (process.argv[2] ?? \"\").trim().toLowerCase().replace(/^--?/, \"\");\nconst PACKAGE_NAME = \"ultracontext\";\nconst packageRoot = path.resolve(__dirname, \"..\", \"..\");\nconst cliWrapperPath = path.join(packageRoot, \"ultracontext.mjs\");\n\n// resolve package version\nfunction readVersion() {\n try {\n const pkgPath = path.resolve(__dirname, \"..\", \"..\", \"package.json\");\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n return pkg.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction printHelp() {\n const version = readVersion();\n console.log(`ultracontext v${version}\n\nUsage: ultracontext [command] [options]\n\nCommands:\n (none) Start daemon if needed, then open TUI\n config Run the setup wizard\n start Start the daemon in the background\n stop Stop a running daemon\n status Show daemon status\n tui Launch the interactive terminal UI\n update Update CLI globally via npm/pnpm/bun\n version Print version\n help Show this help message\n\nEnvironment:\n ULTRACONTEXT_API_KEY Required. Your UltraContext API key.\n ULTRACONTEXT_BASE_URL API base URL (default: https://api.ultracontext.ai)\n`);\n}\n\nfunction printUpdateHelp() {\n console.log(`Usage: ultracontext update [options]\n\nOptions:\n --tag <dist-tag|version> Package tag/version (default: latest)\n --manager <npm|pnpm|bun> Force package manager (auto-detected by default)\n --no-restart Do not restart daemon after update\n -h, --help Show this help message\n`);\n}\n\n// commands that need an API key\nconst NEEDS_KEY = new Set([\"\", \"start\", \"tui\"]);\n\n// interactive onboarding wizard (Ink-based), returns { launchTui }\nasync function runOnboarding() {\n const { onboard } = await import(\"./onboarding.mjs\");\n return onboard();\n}\n\n// check if daemon is already running via lock file\nfunction isDaemonRunning() {\n try {\n const lockPath = path.join(process.env.HOME || process.env.USERPROFILE || \"~\", \".ultracontext\", \"daemon.lock\");\n const lock = JSON.parse(fs.readFileSync(lockPath, \"utf8\"));\n const pid = Number.parseInt(String(lock?.pid ?? \"\"), 10);\n if (!Number.isInteger(pid) || pid <= 1) return false;\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n// try loading key from config file if env is empty\nfunction loadApiKeyFromConfig() {\n if (process.env.ULTRACONTEXT_API_KEY) return;\n try {\n const configPath = path.join(process.env.HOME || process.env.USERPROFILE || \"~\", \".ultracontext\", \"config.json\");\n const cfg = JSON.parse(fs.readFileSync(configPath, \"utf8\"));\n if (cfg.apiKey) process.env.ULTRACONTEXT_API_KEY = String(cfg.apiKey);\n } catch { /* no config */ }\n}\n\nfunction normalizeTag(value) {\n const trimmed = String(value ?? \"\").trim();\n if (!trimmed) return \"latest\";\n if (trimmed.startsWith(`${PACKAGE_NAME}@`)) return trimmed.slice(`${PACKAGE_NAME}@`.length);\n return trimmed;\n}\n\nfunction safeRealpath(targetPath) {\n try {\n return fs.realpathSync(targetPath);\n } catch {\n return path.resolve(targetPath);\n }\n}\n\nfunction pathsEqual(left, right) {\n return path.resolve(left) === path.resolve(right);\n}\n\nfunction runCapture(commandName, args) {\n const result = spawnSync(commandName, args, {\n env: process.env,\n encoding: \"utf8\",\n });\n return {\n ok: result.status === 0,\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n };\n}\n\nfunction resolveBunGlobalRoot() {\n const home = process.env.HOME || process.env.USERPROFILE || os.homedir();\n const bunInstall = String(process.env.BUN_INSTALL ?? \"\").trim() || path.join(home, \".bun\");\n return path.join(bunInstall, \"install\", \"global\", \"node_modules\");\n}\n\nfunction detectGlobalInstallManager() {\n const packageRootReal = safeRealpath(packageRoot);\n const npmGlobalRoot = runCapture(\"npm\", [\"root\", \"-g\"]);\n if (npmGlobalRoot.ok) {\n const npmRoot = npmGlobalRoot.stdout.trim();\n if (npmRoot) {\n const npmExpected = safeRealpath(path.join(npmRoot, PACKAGE_NAME));\n if (pathsEqual(npmExpected, packageRootReal)) return \"npm\";\n }\n }\n\n const pnpmGlobalRoot = runCapture(\"pnpm\", [\"root\", \"-g\"]);\n if (pnpmGlobalRoot.ok) {\n const pnpmRoot = pnpmGlobalRoot.stdout.trim();\n if (pnpmRoot) {\n const pnpmExpected = safeRealpath(path.join(pnpmRoot, PACKAGE_NAME));\n if (pathsEqual(pnpmExpected, packageRootReal)) return \"pnpm\";\n }\n }\n\n const bunExpected = safeRealpath(path.join(resolveBunGlobalRoot(), PACKAGE_NAME));\n if (pathsEqual(bunExpected, packageRootReal)) return \"bun\";\n\n return null;\n}\n\nfunction parseUpdateOptions(args) {\n const opts = {\n tag: \"latest\",\n manager: null,\n restart: true,\n help: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = String(args[i] ?? \"\").trim();\n if (!arg) continue;\n\n if (arg === \"-h\" || arg === \"--help\") {\n opts.help = true;\n continue;\n }\n\n if (arg === \"--no-restart\") {\n opts.restart = false;\n continue;\n }\n\n if (arg === \"--tag\") {\n const next = args[i + 1];\n if (!next || String(next).startsWith(\"-\")) {\n throw new Error(\"Missing value for --tag\");\n }\n opts.tag = normalizeTag(next);\n i += 1;\n continue;\n }\n\n if (arg === \"--manager\") {\n const next = String(args[i + 1] ?? \"\").trim().toLowerCase();\n if (!next || next.startsWith(\"-\")) {\n throw new Error(\"Missing value for --manager\");\n }\n if (![\"npm\", \"pnpm\", \"bun\"].includes(next)) {\n throw new Error(`Invalid --manager value: ${next}`);\n }\n opts.manager = next;\n i += 1;\n continue;\n }\n\n throw new Error(`Unknown update option: ${arg}`);\n }\n\n return opts;\n}\n\nfunction runCliSubcommand(subcommand) {\n const result = spawnSync(process.execPath, [cliWrapperPath, subcommand], {\n env: process.env,\n stdio: \"inherit\",\n });\n return result.status ?? 1;\n}\n\nfunction runGlobalUpdate(manager, tag) {\n const spec = `${PACKAGE_NAME}@${normalizeTag(tag)}`;\n const argvByManager = {\n npm: [\"npm\", [\"i\", \"-g\", spec]],\n pnpm: [\"pnpm\", [\"add\", \"-g\", spec]],\n bun: [\"bun\", [\"add\", \"-g\", spec]],\n };\n\n const tuple = argvByManager[manager];\n if (!tuple) {\n throw new Error(`Unsupported package manager: ${manager}`);\n }\n\n const [bin, args] = tuple;\n const result = spawnSync(bin, args, {\n env: process.env,\n stdio: \"inherit\",\n });\n if (result.status !== 0) {\n throw new Error(`Update failed while running: ${bin} ${args.join(\" \")}`);\n }\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 cyan = esc(\"36\");\nconst gray = esc(\"38;5;245\");\n\nfunction runUpdate(rawArgs) {\n const opts = parseUpdateOptions(rawArgs);\n if (opts.help) {\n printUpdateHelp();\n return;\n }\n\n const manager = opts.manager ?? detectGlobalInstallManager();\n if (!manager) {\n throw new Error(\n \"Could not detect install manager for this CLI. Re-run with --manager <npm|pnpm|bun>.\",\n );\n }\n\n const previousVersion = readVersion();\n\n console.log(\"\");\n console.log(` ${blue}${b}UltraContext${r} ${d}Update${r}`);\n console.log(\"\");\n\n // stop daemon before update\n const wasRunning = isDaemonRunning();\n if (wasRunning && opts.restart) {\n console.log(` ${gray}○${r} ${d}Stopping daemon...${r}`);\n const stopCode = runCliSubcommand(\"stop\");\n if (stopCode !== 0) {\n throw new Error(`Failed to stop daemon before update (exit ${stopCode}).`);\n }\n }\n\n // run update\n console.log(` ${gray}↓${r} ${d}Updating via ${manager}${r} ${gray}(${PACKAGE_NAME}@${opts.tag})${r}`);\n runGlobalUpdate(manager, opts.tag);\n\n // read new version after update\n const newVersion = readVersion();\n console.log(\"\");\n console.log(` ${green}✓${r} ${b}Updated${r} ${gray}${previousVersion} → ${newVersion}${r}`);\n\n // restart daemon\n if (wasRunning && opts.restart) {\n console.log(` ${green}●${r} ${d}Restarting daemon...${r}`);\n const startCode = runCliSubcommand(\"start\");\n if (startCode !== 0) {\n throw new Error(`Update succeeded but daemon restart failed (exit ${startCode}).`);\n }\n } else if (wasRunning) {\n console.log(` ${gray}○${r} ${d}Daemon was stopped. Run:${r} ${cyan}ultracontext start${r}`);\n }\n\n console.log(\"\");\n}\n\n// ── update check ────────────────────────────────────────────────\n\nconst UPDATE_CHECK_INTERVAL = 3 * 60 * 60 * 1000; // 3h\nconst SKIP_UPDATE_CHECK = new Set([\"version\", \"v\", \"update\", \"upgrade\", \"help\", \"h\", \"stop\", \"status\"]);\n\nfunction getUpdateCheckPath() {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return path.join(home, \".ultracontext\", \"update-check.json\");\n}\n\nfunction readUpdateCache() {\n try { return JSON.parse(fs.readFileSync(getUpdateCheckPath(), \"utf8\")); }\n catch { return null; }\n}\n\nfunction writeUpdateCache(data) {\n try { fs.writeFileSync(getUpdateCheckPath(), JSON.stringify(data)); }\n catch { /* best effort */ }\n}\n\nasync function fetchLatestVersion() {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n try {\n const res = await fetch(\"https://registry.npmjs.org/ultracontext/latest\", { signal: controller.signal });\n const data = await res.json();\n return data.version ?? null;\n } catch { return null; }\n finally { clearTimeout(timeout); }\n}\n\nfunction isNewer(latest, current) {\n const l = latest.split(\".\").map(Number);\n const c = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] ?? 0) > (c[i] ?? 0)) return true;\n if ((l[i] ?? 0) < (c[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction printUpdateNotice(current, latest) {\n console.log(`\\n ${blue}${b}UltraContext${r} ${d}Update available${r}`);\n console.log(` ${gray}${current}${r} → ${green}${b}${latest}${r}`);\n console.log(` Run ${cyan}ultracontext update${r} to upgrade.\\n`);\n}\n\nasync function checkForUpdate() {\n const current = readVersion();\n if (current === \"unknown\") return;\n\n // use cache if fresh\n const cache = readUpdateCache();\n if (cache?.lastCheck && Date.now() - cache.lastCheck < UPDATE_CHECK_INTERVAL) {\n if (cache.latestVersion && isNewer(cache.latestVersion, current)) {\n printUpdateNotice(current, cache.latestVersion);\n }\n return;\n }\n\n // fetch from registry\n const latest = await fetchLatestVersion();\n writeUpdateCache({ lastCheck: Date.now(), latestVersion: latest });\n if (latest && isNewer(latest, current)) {\n printUpdateNotice(current, latest);\n }\n}\n\n// ── launch helpers ──────────────────────────────────────────────\n\nasync function launchDaemonSDK() {\n const { launchDaemon } = await import(\"@ultracontext/daemon/launcher\");\n await launchDaemon({\n entryPath: fileURLToPath(new URL(\"./sdk-daemon.mjs\", import.meta.url)),\n diagnosticsHint: \"DAEMON_VERBOSE=1 ultracontext start\",\n });\n}\n\nasync function runCtlSDK() {\n const { runCtl } = await import(\"@ultracontext/daemon/ctl\");\n await runCtl();\n}\n\nasync function launchTuiSDK() {\n const { tuiBoot } = await import(\"@ultracontext/tui/tui\");\n await tuiBoot({\n assetsRoot: path.resolve(__dirname, \"..\", \"..\"),\n offlineNotice: \"Daemon offline. Run: ultracontext start\",\n });\n}\n\n// ── main ────────────────────────────────────────────────────────\n\nasync function run() {\n // check for updates (silent on error, cached 24h)\n if (!SKIP_UPDATE_CHECK.has(command)) await checkForUpdate();\n\n // load saved key, then onboard if still missing\n let onboardResult = null;\n if (NEEDS_KEY.has(command)) {\n loadApiKeyFromConfig();\n if (!process.env.ULTRACONTEXT_API_KEY) onboardResult = await runOnboarding();\n }\n\n switch (command) {\n case \"start\":\n await launchDaemonSDK();\n if (onboardResult?.launchTui) await launchTuiSDK();\n break;\n\n case \"stop\":\n process.argv[2] = \"stop\";\n await runCtlSDK();\n break;\n\n case \"status\":\n process.argv[2] = \"status\";\n await runCtlSDK();\n break;\n\n case \"config\": {\n const configResult = await runOnboarding();\n if (configResult?.launchTui) {\n if (!isDaemonRunning()) await launchDaemonSDK();\n await launchTuiSDK();\n }\n break;\n }\n\n case \"tui\":\n await launchTuiSDK();\n break;\n\n case \"version\":\n case \"v\":\n console.log(readVersion());\n break;\n\n case \"update\":\n case \"upgrade\":\n runUpdate(process.argv.slice(3));\n break;\n\n // default: ensure daemon running, then open TUI\n case \"\": {\n if (!isDaemonRunning()) await launchDaemonSDK();\n await launchTuiSDK();\n break;\n }\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n default:\n console.error(`Unknown command: ${process.argv[2]}`);\n printHelp();\n process.exit(1);\n }\n}\n\nrun().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entry.mjs","names":[],"sources":["../../src/cli/entry.mjs"],"sourcesContent":["#!/usr/bin/env node\n\n// CLI router — dispatches subcommands to daemon/tui entry points\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport { spawnSync } from \"node:child_process\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst command = (process.argv[2] ?? \"\").trim().toLowerCase().replace(/^--?/, \"\");\nconst PACKAGE_NAME = \"ultracontext\";\nconst packageRoot = path.resolve(__dirname, \"..\", \"..\");\nconst cliWrapperPath = path.join(packageRoot, \"ultracontext.mjs\");\n\n// resolve package version\nfunction readVersion() {\n try {\n const pkgPath = path.resolve(__dirname, \"..\", \"..\", \"package.json\");\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n return pkg.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction printHelp() {\n const version = readVersion();\n console.log(`ultracontext v${version}\n\nUsage: ultracontext [command] [options]\n\nCommands:\n (none) Start daemon if needed, then open TUI\n config Run the setup wizard\n start Start the daemon in the background\n stop Stop a running daemon\n status Show daemon status\n tui Launch the interactive terminal UI\n update Update CLI globally via npm/pnpm/bun\n version Print version\n help Show this help message\n\nEnvironment:\n ULTRACONTEXT_API_KEY Required. Your UltraContext API key.\n ULTRACONTEXT_BASE_URL API base URL (default: https://api.ultracontext.ai)\n`);\n}\n\nfunction printUpdateHelp() {\n console.log(`Usage: ultracontext update [options]\n\nOptions:\n --tag <dist-tag|version> Package tag/version (default: latest)\n --manager <npm|pnpm|bun> Force package manager (auto-detected by default)\n --no-restart Do not restart daemon after update\n -h, --help Show this help message\n`);\n}\n\n// commands that need an API key\nconst NEEDS_KEY = new Set([\"\", \"start\", \"tui\"]);\n\n// interactive onboarding wizard (Ink-based), returns { launchTui }\nasync function runOnboarding() {\n const { onboard } = await import(\"./onboarding.mjs\");\n return onboard();\n}\n\n// check if daemon is already running via lock file\nfunction isDaemonRunning() {\n try {\n const lockPath = path.join(process.env.HOME || process.env.USERPROFILE || \"~\", \".ultracontext\", \"daemon.lock\");\n const lock = JSON.parse(fs.readFileSync(lockPath, \"utf8\"));\n const pid = Number.parseInt(String(lock?.pid ?? \"\"), 10);\n if (!Number.isInteger(pid) || pid <= 1) return false;\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n// try loading key from config file if env is empty\nfunction loadApiKeyFromConfig() {\n if (process.env.ULTRACONTEXT_API_KEY) return;\n try {\n const configPath = path.join(process.env.HOME || process.env.USERPROFILE || \"~\", \".ultracontext\", \"config.json\");\n const cfg = JSON.parse(fs.readFileSync(configPath, \"utf8\"));\n if (cfg.apiKey) process.env.ULTRACONTEXT_API_KEY = String(cfg.apiKey);\n } catch { /* no config */ }\n}\n\nfunction normalizeTag(value) {\n const trimmed = String(value ?? \"\").trim();\n if (!trimmed) return \"latest\";\n if (trimmed.startsWith(`${PACKAGE_NAME}@`)) return trimmed.slice(`${PACKAGE_NAME}@`.length);\n return trimmed;\n}\n\nfunction safeRealpath(targetPath) {\n try {\n return fs.realpathSync(targetPath);\n } catch {\n return path.resolve(targetPath);\n }\n}\n\nfunction pathsEqual(left, right) {\n return path.resolve(left) === path.resolve(right);\n}\n\nfunction runCapture(commandName, args) {\n const result = spawnSync(commandName, args, {\n env: process.env,\n encoding: \"utf8\",\n });\n return {\n ok: result.status === 0,\n stdout: String(result.stdout ?? \"\"),\n stderr: String(result.stderr ?? \"\"),\n };\n}\n\nfunction resolveBunGlobalRoot() {\n const home = process.env.HOME || process.env.USERPROFILE || os.homedir();\n const bunInstall = String(process.env.BUN_INSTALL ?? \"\").trim() || path.join(home, \".bun\");\n return path.join(bunInstall, \"install\", \"global\", \"node_modules\");\n}\n\nfunction detectGlobalInstallManager() {\n const packageRootReal = safeRealpath(packageRoot);\n const npmGlobalRoot = runCapture(\"npm\", [\"root\", \"-g\"]);\n if (npmGlobalRoot.ok) {\n const npmRoot = npmGlobalRoot.stdout.trim();\n if (npmRoot) {\n const npmExpected = safeRealpath(path.join(npmRoot, PACKAGE_NAME));\n if (pathsEqual(npmExpected, packageRootReal)) return \"npm\";\n }\n }\n\n const pnpmGlobalRoot = runCapture(\"pnpm\", [\"root\", \"-g\"]);\n if (pnpmGlobalRoot.ok) {\n const pnpmRoot = pnpmGlobalRoot.stdout.trim();\n if (pnpmRoot) {\n const pnpmExpected = safeRealpath(path.join(pnpmRoot, PACKAGE_NAME));\n if (pathsEqual(pnpmExpected, packageRootReal)) return \"pnpm\";\n }\n }\n\n const bunExpected = safeRealpath(path.join(resolveBunGlobalRoot(), PACKAGE_NAME));\n if (pathsEqual(bunExpected, packageRootReal)) return \"bun\";\n\n return null;\n}\n\nfunction parseUpdateOptions(args) {\n const opts = {\n tag: \"latest\",\n manager: null,\n restart: true,\n help: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = String(args[i] ?? \"\").trim();\n if (!arg) continue;\n\n if (arg === \"-h\" || arg === \"--help\") {\n opts.help = true;\n continue;\n }\n\n if (arg === \"--no-restart\") {\n opts.restart = false;\n continue;\n }\n\n if (arg === \"--tag\") {\n const next = args[i + 1];\n if (!next || String(next).startsWith(\"-\")) {\n throw new Error(\"Missing value for --tag\");\n }\n opts.tag = normalizeTag(next);\n i += 1;\n continue;\n }\n\n if (arg === \"--manager\") {\n const next = String(args[i + 1] ?? \"\").trim().toLowerCase();\n if (!next || next.startsWith(\"-\")) {\n throw new Error(\"Missing value for --manager\");\n }\n if (![\"npm\", \"pnpm\", \"bun\"].includes(next)) {\n throw new Error(`Invalid --manager value: ${next}`);\n }\n opts.manager = next;\n i += 1;\n continue;\n }\n\n throw new Error(`Unknown update option: ${arg}`);\n }\n\n return opts;\n}\n\nfunction runCliSubcommand(subcommand) {\n const result = spawnSync(process.execPath, [cliWrapperPath, subcommand], {\n env: process.env,\n stdio: \"inherit\",\n });\n return result.status ?? 1;\n}\n\nfunction runGlobalUpdate(manager, tag) {\n const spec = `${PACKAGE_NAME}@${normalizeTag(tag)}`;\n const argvByManager = {\n npm: [\"npm\", [\"i\", \"-g\", spec]],\n pnpm: [\"pnpm\", [\"add\", \"-g\", spec]],\n bun: [\"bun\", [\"add\", \"-g\", spec]],\n };\n\n const tuple = argvByManager[manager];\n if (!tuple) {\n throw new Error(`Unsupported package manager: ${manager}`);\n }\n\n const [bin, args] = tuple;\n\n // skip postinstall to prevent launching a new instance mid-update\n const result = spawnSync(bin, args, {\n env: { ...process.env, ULTRACONTEXT_SKIP_POSTINSTALL: \"1\" },\n stdio: \"inherit\",\n });\n if (result.status !== 0) {\n throw new Error(`Update failed while running: ${bin} ${args.join(\" \")}`);\n }\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 cyan = esc(\"36\");\nconst gray = esc(\"38;5;245\");\n\nfunction runUpdate(rawArgs) {\n const opts = parseUpdateOptions(rawArgs);\n if (opts.help) {\n printUpdateHelp();\n return;\n }\n\n const manager = opts.manager ?? detectGlobalInstallManager();\n if (!manager) {\n throw new Error(\n \"Could not detect install manager for this CLI. Re-run with --manager <npm|pnpm|bun>.\",\n );\n }\n\n const previousVersion = readVersion();\n\n console.log(\"\");\n console.log(` ${blue}${b}UltraContext${r} ${d}Update${r}`);\n console.log(\"\");\n\n // stop daemon before update\n const wasRunning = isDaemonRunning();\n if (wasRunning && opts.restart) {\n console.log(` ${gray}○${r} ${d}Stopping daemon...${r}`);\n const stopCode = runCliSubcommand(\"stop\");\n if (stopCode !== 0) {\n throw new Error(`Failed to stop daemon before update (exit ${stopCode}).`);\n }\n }\n\n // run update\n console.log(` ${gray}↓${r} ${d}Updating via ${manager}${r} ${gray}(${PACKAGE_NAME}@${opts.tag})${r}`);\n runGlobalUpdate(manager, opts.tag);\n\n // read new version after update\n const newVersion = readVersion();\n console.log(\"\");\n console.log(` ${green}✓${r} ${b}Updated${r} ${gray}${previousVersion} → ${newVersion}${r}`);\n\n // restart daemon\n if (wasRunning && opts.restart) {\n console.log(` ${green}●${r} ${d}Restarting daemon...${r}`);\n const startCode = runCliSubcommand(\"start\");\n if (startCode !== 0) {\n throw new Error(`Update succeeded but daemon restart failed (exit ${startCode}).`);\n }\n } else if (wasRunning) {\n console.log(` ${gray}○${r} ${d}Daemon was stopped. Run:${r} ${cyan}ultracontext start${r}`);\n }\n\n console.log(\"\");\n}\n\n// ── update check ────────────────────────────────────────────────\n\nconst UPDATE_CHECK_INTERVAL = 3 * 60 * 60 * 1000; // 3h\nconst SKIP_UPDATE_CHECK = new Set([\"version\", \"v\", \"update\", \"upgrade\", \"help\", \"h\", \"stop\", \"status\"]);\n\nfunction getUpdateCheckPath() {\n const home = process.env.HOME || process.env.USERPROFILE || \"~\";\n return path.join(home, \".ultracontext\", \"update-check.json\");\n}\n\nfunction readUpdateCache() {\n try { return JSON.parse(fs.readFileSync(getUpdateCheckPath(), \"utf8\")); }\n catch { return null; }\n}\n\nfunction writeUpdateCache(data) {\n try { fs.writeFileSync(getUpdateCheckPath(), JSON.stringify(data)); }\n catch { /* best effort */ }\n}\n\nasync function fetchLatestVersion() {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n try {\n const res = await fetch(\"https://registry.npmjs.org/ultracontext/latest\", { signal: controller.signal });\n const data = await res.json();\n return data.version ?? null;\n } catch { return null; }\n finally { clearTimeout(timeout); }\n}\n\nfunction isNewer(latest, current) {\n const l = latest.split(\".\").map(Number);\n const c = current.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] ?? 0) > (c[i] ?? 0)) return true;\n if ((l[i] ?? 0) < (c[i] ?? 0)) return false;\n }\n return false;\n}\n\nfunction printUpdateNotice(current, latest) {\n console.log(`\\n ${blue}${b}UltraContext${r} ${d}Update available${r}`);\n console.log(` ${gray}${current}${r} → ${green}${b}${latest}${r}`);\n console.log(` Run ${cyan}ultracontext update${r} to upgrade.\\n`);\n}\n\nasync function checkForUpdate() {\n const current = readVersion();\n if (current === \"unknown\") return;\n\n // use cache if fresh\n const cache = readUpdateCache();\n if (cache?.lastCheck && Date.now() - cache.lastCheck < UPDATE_CHECK_INTERVAL) {\n if (cache.latestVersion && isNewer(cache.latestVersion, current)) {\n printUpdateNotice(current, cache.latestVersion);\n }\n return;\n }\n\n // fetch from registry\n const latest = await fetchLatestVersion();\n writeUpdateCache({ lastCheck: Date.now(), latestVersion: latest });\n if (latest && isNewer(latest, current)) {\n printUpdateNotice(current, latest);\n }\n}\n\n// ── launch helpers ──────────────────────────────────────────────\n\nasync function launchDaemonSDK() {\n const { launchDaemon } = await import(\"@ultracontext/daemon/launcher\");\n await launchDaemon({\n entryPath: fileURLToPath(new URL(\"./sdk-daemon.mjs\", import.meta.url)),\n diagnosticsHint: \"DAEMON_VERBOSE=1 ultracontext start\",\n });\n}\n\nasync function runCtlSDK() {\n const { runCtl } = await import(\"@ultracontext/daemon/ctl\");\n await runCtl();\n}\n\nasync function launchTuiSDK() {\n const { tuiBoot } = await import(\"@ultracontext/tui/tui\");\n await tuiBoot({\n assetsRoot: path.resolve(__dirname, \"..\", \"..\"),\n offlineNotice: \"Daemon offline. Run: ultracontext start\",\n });\n}\n\n// ── main ────────────────────────────────────────────────────────\n\nasync function run() {\n // check for updates (silent on error, cached 24h)\n if (!SKIP_UPDATE_CHECK.has(command)) await checkForUpdate();\n\n // load saved key, then onboard if still missing\n let onboardResult = null;\n if (NEEDS_KEY.has(command)) {\n loadApiKeyFromConfig();\n if (!process.env.ULTRACONTEXT_API_KEY) onboardResult = await runOnboarding();\n }\n\n switch (command) {\n case \"start\":\n await launchDaemonSDK();\n if (onboardResult?.launchTui) await launchTuiSDK();\n break;\n\n case \"stop\":\n process.argv[2] = \"stop\";\n await runCtlSDK();\n break;\n\n case \"status\":\n process.argv[2] = \"status\";\n await runCtlSDK();\n break;\n\n case \"config\": {\n const configResult = await runOnboarding();\n if (configResult?.launchTui) {\n if (!isDaemonRunning()) await launchDaemonSDK();\n await launchTuiSDK();\n }\n break;\n }\n\n case \"tui\":\n await launchTuiSDK();\n break;\n\n case \"version\":\n case \"v\":\n console.log(readVersion());\n break;\n\n case \"update\":\n case \"upgrade\":\n runUpdate(process.argv.slice(3));\n break;\n\n // default: ensure daemon running, then open TUI\n case \"\": {\n if (!isDaemonRunning()) await launchDaemonSDK();\n await launchTuiSDK();\n break;\n }\n\n case \"help\":\n case \"h\":\n printHelp();\n break;\n\n default:\n console.error(`Unknown command: ${process.argv[2]}`);\n printHelp();\n process.exit(1);\n }\n}\n\nrun().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":"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"}
|
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":"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"}
|
|
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
|