ultracontext 1.4.13 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/entry.mjs +9 -3
- package/dist/cli/entry.mjs.map +1 -1
- package/dist/cli/onboarding.mjs +268 -111
- package/dist/cli/onboarding.mjs.map +1 -1
- package/dist/cli/sdk-sync.mjs +199 -939
- package/dist/cli/sdk-sync.mjs.map +1 -1
- package/dist/cli/switch.mjs +168 -0
- package/dist/cli/switch.mjs.map +1 -0
- package/dist/{ctl-CXfNEPN8.mjs → ctl-DTQZxn3N.mjs} +2 -2
- package/dist/{ctl-CXfNEPN8.mjs.map → ctl-DTQZxn3N.mjs.map} +1 -1
- package/dist/hero-art-C03HmDXN.mjs +46 -0
- package/dist/hero-art-C03HmDXN.mjs.map +1 -0
- package/dist/index.d.mts +21 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +25 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{launcher-BMMjzr5k.mjs → launcher-ZylswrpR.mjs} +3 -3
- package/dist/{launcher-BMMjzr5k.mjs.map → launcher-ZylswrpR.mjs.map} +1 -1
- package/dist/{lock-5aJnda81.mjs → lock-BhZX2aF3.mjs} +2 -2
- package/dist/{lock-5aJnda81.mjs.map → lock-BhZX2aF3.mjs.map} +1 -1
- package/dist/onboarding-preferences-Alhblobi.mjs +76 -0
- package/dist/onboarding-preferences-Alhblobi.mjs.map +1 -0
- package/dist/src-Bovo1ukU.mjs +1200 -0
- package/dist/src-Bovo1ukU.mjs.map +1 -0
- package/dist/{tui-DZ1SDOH2.mjs → tui-DLEjew3K.mjs} +334 -115
- package/dist/tui-DLEjew3K.mjs.map +1 -0
- package/dist/utils-BTfShW0g.mjs +36 -0
- package/dist/utils-BTfShW0g.mjs.map +1 -0
- package/dist/{utils-CmuIYHtm.mjs → utils-D9CKnbke.mjs} +26 -34
- package/dist/utils-D9CKnbke.mjs.map +1 -0
- package/lib/register-skills.mjs +96 -0
- package/package.json +8 -3
- package/plugin/.claude-plugin/plugin.json +6 -0
- package/plugin/README.md +112 -0
- package/plugin/marketplace.json +17 -0
- package/plugin/skills/switch/SKILL.md +27 -0
- package/postinstall.mjs +35 -2
- package/dist/Spinner-CwBjkXHv.mjs +0 -153
- package/dist/Spinner-CwBjkXHv.mjs.map +0 -1
- package/dist/tui-DZ1SDOH2.mjs.map +0 -1
- package/dist/utils-CmuIYHtm.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.mjs","names":[],"sources":["../../src/cli/onboarding.mjs"],"sourcesContent":["// Interactive onboarding wizard — guides new users through setup\nimport React from \"react\";\nimport { render, Box, Text, useInput, useStdout } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\nimport { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { heroArtForWidth } from \"@ultracontext/sync/ui/hero-art\";\nimport { UC_BRAND_BLUE, UC_BLUE_LIGHT } from \"@ultracontext/sync/ui/constants\";\nimport Spinner from \"@ultracontext/sync/Spinner\";\n\n// ── config helpers ──────────────────────────────────────────────\n\nconst CONFIG_DIR = path.join(process.env.HOME || process.env.USERPROFILE || \"~\", \".ultracontext\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\n\nfunction readConfig() {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(patch) {\n const existing = readConfig();\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify({ ...existing, ...patch }, null, 2) + \"\\n\", \"utf8\");\n}\n\n// ── open URL (cross-platform) ───────────────────────────────────\n\nfunction openUrl(url) {\n const cmd = process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n try {\n const child = spawn(cmd, [url], { detached: true, stdio: \"ignore\" });\n child.unref();\n } catch { /* best effort */ }\n}\n\n// ── validation ──────────────────────────────────────────────────\n\nfunction isValidKey(key) {\n return /^uc_(live|test)_/.test(key);\n}\n\n// ── step constants ──────────────────────────────────────────────\n\nconst STEPS = [\"welcome\", \"mode\", \"url\", \"key\", \"bootstrap\", \"launch\", \"done\"];\n\nconst MODE_OPTIONS = [\n { label: \"Login (ultracontext.ai)\", value: \"cloud\" },\n { label: \"Self-host\", value: \"selfhost\" },\n];\n\nconst BOOTSTRAP_OPTIONS = [\n { label: \"New only (recommended)\", value: \"new_only\" },\n { label: \"Last 24h\", value: \"last_24h\" },\n { label: \"All\", value: \"all\" },\n];\n\nconst LAUNCH_OPTIONS = [\n { label: \"Yes, open the TUI (recommended)\", value: true },\n { label: \"No, just finish setup\", value: false },\n];\n\n// ── step number display ─────────────────────────────────────────\n\nfunction stepNumber(step) {\n if (step === \"welcome\") return 1;\n if (step === \"mode\") return 2;\n if (step === \"url\" || step === \"key\") return 3;\n if (step === \"bootstrap\") return 4;\n if (step === \"launch\") return 5;\n return 5;\n}\n\nconst TOTAL_STEPS = 5;\n\n// ── Onboarding component ────────────────────────────────────────\n\nfunction Onboarding({ onDone }) {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? process.stdout.columns ?? 80;\n\n const [step, setStep] = React.useState(\"welcome\");\n const [hosting, setHosting] = React.useState(\"cloud\");\n const [baseUrl, setBaseUrl] = React.useState(\"https://api.ultracontext.ai\");\n const [apiKey, setApiKey] = React.useState(\"\");\n const [bootstrapMode, setBootstrapMode] = React.useState(\"new_only\");\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [keyInput, setKeyInput] = React.useState(\"\");\n const [urlInput, setUrlInput] = React.useState(\"https://\");\n const [error, setError] = React.useState(\"\");\n const [launchTui, setLaunchTui] = React.useState(false);\n\n // save config + env, advance to launch step\n const finish = React.useCallback((finalKey, finalUrl, finalBootstrap) => {\n writeConfig({ apiKey: finalKey, baseUrl: finalUrl, bootstrapMode: finalBootstrap });\n process.env.ULTRACONTEXT_API_KEY = finalKey;\n process.env.ULTRACONTEXT_BASE_URL = finalUrl;\n setStep(\"launch\");\n setSelectedIndex(0);\n }, []);\n\n useInput((input, key) => {\n // escape or ctrl+c exits at any step\n if (key.escape || (input === \"c\" && key.ctrl)) {\n process.exit(0);\n }\n\n // ── welcome ──\n if (step === \"welcome\") {\n if (key.return) {\n setStep(\"mode\");\n setSelectedIndex(0);\n }\n return;\n }\n\n // ── mode selection ──\n if (step === \"mode\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, MODE_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n\n if (key.return || input === \" \") {\n const chosen = MODE_OPTIONS[selectedIndex].value;\n setHosting(chosen);\n if (chosen === \"selfhost\") {\n setStep(\"url\");\n setUrlInput(\"https://\");\n setError(\"\");\n } else {\n setBaseUrl(\"https://api.ultracontext.ai\");\n openUrl(\"https://ultracontext.ai\");\n setStep(\"key\");\n setKeyInput(\"\");\n setError(\"\");\n }\n setSelectedIndex(0);\n }\n return;\n }\n\n // ── url input (self-host) ──\n if (step === \"url\") {\n if (key.return) {\n const trimmed = urlInput.trim();\n if (!trimmed || trimmed === \"https://\") {\n setError(\"Enter a valid base URL\");\n return;\n }\n setBaseUrl(trimmed);\n setStep(\"key\");\n setKeyInput(\"\");\n setError(\"\");\n return;\n }\n if (key.backspace || key.delete) {\n setUrlInput((v) => v.slice(0, -1));\n setError(\"\");\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setUrlInput((v) => v + input);\n setError(\"\");\n }\n return;\n }\n\n // ── key input ──\n if (step === \"key\") {\n if (key.return) {\n const trimmed = keyInput.trim();\n if (!trimmed) {\n setError(\"Enter your API key\");\n return;\n }\n if (!isValidKey(trimmed)) {\n setError(\"Key must start with uc_live_ or uc_test_\");\n return;\n }\n setApiKey(trimmed);\n setStep(\"bootstrap\");\n setSelectedIndex(0);\n setError(\"\");\n return;\n }\n if (key.backspace || key.delete) {\n setKeyInput((v) => v.slice(0, -1));\n setError(\"\");\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setKeyInput((v) => v + input);\n setError(\"\");\n }\n return;\n }\n\n // ── bootstrap mode ──\n if (step === \"bootstrap\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, BOOTSTRAP_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n if (input === \"3\") setSelectedIndex(2);\n\n if (key.return || input === \" \") {\n const chosen = BOOTSTRAP_OPTIONS[selectedIndex].value;\n setBootstrapMode(chosen);\n finish(apiKey, baseUrl, chosen);\n }\n return;\n }\n\n // ── launch TUI? ──\n if (step === \"launch\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, LAUNCH_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n\n if (key.return || input === \" \") {\n const chosen = LAUNCH_OPTIONS[selectedIndex].value;\n setLaunchTui(chosen);\n setStep(\"done\");\n setTimeout(() => onDone(chosen), 80);\n }\n return;\n }\n });\n\n // ── render ──\n\n const heroLines = heroArtForWidth(cols - 4);\n const stepNum = stepNumber(step);\n\n // hero art — 3d spinner + figlet on all steps\n const hero = React.createElement(\n Box,\n { flexDirection: \"row\", justifyContent: \"center\", width: \"100%\" },\n React.createElement(Spinner, { color: UC_BLUE_LIGHT }),\n React.createElement(Box, { width: 3 }),\n React.createElement(\n Box,\n { flexDirection: \"column\", justifyContent: \"center\" },\n ...heroLines.map((line, i) =>\n React.createElement(Text, { key: `h${i}`, color: \"white\", bold: true }, line)\n )\n )\n );\n\n // step content\n let content = null;\n\n if (step === \"welcome\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Welcome to UltraContext\"),\n React.createElement(Text, { color: \"gray\" }, \"Context engineering for AI coding agents.\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: UC_BLUE_LIGHT }, \"Press Enter to begin setup...\")\n );\n }\n\n if (step === \"mode\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"How do you want to connect?\"),\n React.createElement(Box, { height: 1 }),\n ...MODE_OPTIONS.map((opt, i) => {\n const sel = i === selectedIndex;\n return React.createElement(\n Text,\n { key: `m${i}`, color: sel ? UC_BLUE_LIGHT : \"white\" },\n sel ? \"[\\u2022]\" : \"[ ]\",\n ` ${i + 1}. ${opt.label}`\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Navigate: up/down, 1/2 | Confirm: Enter\")\n );\n }\n\n if (step === \"url\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Enter your API base URL:\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: UC_BLUE_LIGHT }, `> ${urlInput}_`),\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Enter to confirm | Esc to quit\")\n );\n }\n\n if (step === \"key\") {\n const keyPrompt = hosting === \"cloud\"\n ? \"Paste your API key (browser opened for you):\"\n : \"Enter your API key:\";\n\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, keyPrompt),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: UC_BLUE_LIGHT }, `> ${keyInput}_`),\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Format: uc_live_... or uc_test_... | Enter to confirm\")\n );\n }\n\n if (step === \"bootstrap\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Initial sync mode:\"),\n React.createElement(Box, { height: 1 }),\n ...BOOTSTRAP_OPTIONS.map((opt, i) => {\n const sel = i === selectedIndex;\n return React.createElement(\n Text,\n { key: `b${i}`, color: sel ? UC_BLUE_LIGHT : \"white\" },\n sel ? \"[\\u2022]\" : \"[ ]\",\n ` ${i + 1}. ${opt.label}`\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Navigate: up/down, 1/2/3 | Confirm: Enter\")\n );\n }\n\n if (step === \"launch\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Launch the TUI dashboard?\"),\n React.createElement(Box, { height: 1 }),\n ...LAUNCH_OPTIONS.map((opt, i) => {\n const sel = i === selectedIndex;\n return React.createElement(\n Text,\n { key: `l${i}`, color: sel ? UC_BLUE_LIGHT : \"white\" },\n sel ? \"[\\u2022]\" : \"[ ]\",\n ` ${i + 1}. ${opt.label}`\n );\n }),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Navigate: up/down, 1/2 | Confirm: Enter\")\n );\n }\n\n if (step === \"done\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"green\", bold: true }, \"Setup complete!\"),\n React.createElement(Text, { color: \"gray\" }, `Config saved to ${CONFIG_PATH}`)\n );\n }\n\n const boxWidth = Math.min(cols - 2, 60);\n\n return React.createElement(\n Box,\n { flexDirection: \"column\", alignItems: \"center\", paddingX: 1, paddingY: 1, width: cols },\n hero,\n React.createElement(Text, { color: UC_BLUE_LIGHT, bold: true }, \"[ The Context Hub for AI Agents ]\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(\n TitledBox,\n {\n borderStyle: \"single\",\n titles: [\"Setup\"],\n titleJustify: \"flex-start\",\n borderColor: UC_BRAND_BLUE,\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width: boxWidth,\n },\n React.createElement(\n Text,\n { color: \"gray\", dimColor: true },\n step !== \"done\" ? `Step ${stepNum} of ${TOTAL_STEPS}` : \"Done\"\n ),\n React.createElement(Box, { height: 1 }),\n content\n )\n );\n}\n\n// ── public entry point ──────────────────────────────────────────\n\nexport function onboard() {\n return new Promise((resolve) => {\n const app = render(\n React.createElement(Onboarding, {\n onDone: (wantsTui) => {\n app.unmount();\n resolve({ launchTui: Boolean(wantsTui) });\n },\n }),\n { exitOnCtrlC: false }\n );\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"onboarding.mjs","names":["process"],"sources":["../../../sync/src/recent-projects.mjs","../../src/cli/onboarding.mjs"],"sourcesContent":["// Discover recent project paths by peeking into Claude Code + Cursor session dirs.\n// The directory-name encoding used by those agents is lossy (dashes in real paths\n// collide with the `/` → `-` substitution), so we prefer the authoritative `cwd`\n// recorded inside the session JSONL files and only fall back to the decoded dir name.\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nfunction safeStat(p) {\n try { return fs.statSync(p); } catch { return null; }\n}\n\nfunction safeReaddir(dir) {\n try { return fs.readdirSync(dir, { withFileTypes: true }); } catch { return []; }\n}\n\n// find the first .jsonl file in a directory, most-recently modified first\nfunction firstJsonlFile(dir) {\n const files = safeReaddir(dir)\n .filter((e) => e.isFile() && e.name.endsWith(\".jsonl\"))\n .map((e) => {\n const full = path.join(dir, e.name);\n const stat = safeStat(full);\n return { full, mtime: stat ? stat.mtimeMs : 0 };\n })\n .sort((a, b) => b.mtime - a.mtime);\n return files[0]?.full ?? null;\n}\n\n// read up to `maxLines` from a jsonl file and return the first `cwd` value we can find\nfunction readCwdFromJsonl(file, maxLines = 10) {\n try {\n const raw = fs.readFileSync(file, \"utf8\");\n const lines = raw.split(\"\\n\", maxLines + 1).slice(0, maxLines);\n for (const line of lines) {\n if (!line) continue;\n try {\n const obj = JSON.parse(line);\n if (typeof obj.cwd === \"string\" && obj.cwd) return obj.cwd;\n // codex session_meta shape: { payload: { cwd } }\n if (obj.payload && typeof obj.payload.cwd === \"string\" && obj.payload.cwd) return obj.payload.cwd;\n } catch { /* skip malformed line */ }\n }\n } catch { /* file unreadable */ }\n return null;\n}\n\n// lossy fallback — \"/Users/fabio-Code-foo\" → ambiguous, but fine for simple paths\nfunction decodeDirNameWithLeadingSlash(name) {\n return \"/\" + name.replace(/^-/, \"\").replace(/-/g, \"/\");\n}\n\nfunction decodeCursorDirName(name) {\n return \"/\" + name.replace(/-/g, \"/\");\n}\n\n// collect one candidate row per session dir — prefer cwd from inside the file,\n// fall back to a best-effort decode of the directory name\nfunction collect(rootDir, decode) {\n return safeReaddir(rootDir)\n .filter((entry) => entry.isDirectory())\n .map((entry) => {\n const dir = path.join(rootDir, entry.name);\n const stat = safeStat(dir);\n const mtime = stat ? stat.mtimeMs : 0;\n\n const jsonl = firstJsonlFile(dir);\n const cwdFromFile = jsonl ? readCwdFromJsonl(jsonl) : null;\n const projectPath = cwdFromFile || decode(entry.name);\n\n return { path: projectPath, mtime };\n });\n}\n\n// returns absolute project paths, most-recently-used first, deduped,\n// filtered to only those that still exist on disk\nexport function discoverRecentProjects({ home = process.env.HOME } = {}) {\n if (!home) return [];\n\n const candidates = [\n ...collect(path.join(home, \".claude\", \"projects\"), decodeDirNameWithLeadingSlash),\n ...collect(path.join(home, \".cursor\", \"projects\"), decodeCursorDirName),\n ];\n\n const best = new Map();\n for (const c of candidates) {\n if (!c.path || !c.path.startsWith(\"/\")) continue;\n const stat = safeStat(c.path);\n if (!stat || !stat.isDirectory()) continue;\n const prev = best.get(c.path);\n if (!prev || prev.mtime < c.mtime) best.set(c.path, c);\n }\n\n return [...best.values()]\n .sort((a, b) => b.mtime - a.mtime)\n .map((c) => c.path);\n}\n","// Interactive onboarding wizard — guides new users through setup\nimport React from \"react\";\nimport { render, Box, Text, useInput, useStdout } from \"ink\";\nimport { TitledBox } from \"@mishieck/ink-titled-box\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { heroArtForWidth } from \"@ultracontext/sync/ui/hero-art\";\nimport {\n buildOnboardingConfigPatch,\n ONBOARDING_AGENT_OPTIONS,\n ONBOARDING_AGENT_ALL_OPTION,\n ONBOARDING_CAPTURE_OPTIONS,\n} from \"@ultracontext/sync/onboarding-preferences\";\nimport { discoverRecentProjects } from \"@ultracontext/sync/recent-projects\";\n\n// agents list rendered in the wizard — \"All\" shortcut first, then each agent\nconst AGENT_ROWS = [ONBOARDING_AGENT_ALL_OPTION, ...ONBOARDING_AGENT_OPTIONS];\n\n// uniform row renderer used by every list step — focus shown by ❯ + bold,\n// selection shown by ✓ for multi-select (nothing for single-select since the\n// focused row *is* the selection). Keeps the line compact.\nfunction ListRow({ focused, checked, label, multi = false, keyProp }) {\n const arrow = focused ? \"\\u276F \" : \" \";\n const marker = multi ? (checked ? \"\\u2713 \" : \" \") : \"\";\n const line = `${arrow}${marker}${label}`;\n return React.createElement(\n Text,\n { key: keyProp, color: focused ? \"white\" : \"gray\", bold: focused },\n line,\n );\n}\n\n// ── config helpers ──────────────────────────────────────────────\n\n// resolve at call time. ULTRACONTEXT_CONFIG_HOME lets you redirect config.json\n// without touching HOME, so project inference still reads real session dirs.\nfunction configPaths() {\n const home = process.env.ULTRACONTEXT_CONFIG_HOME\n || process.env.HOME\n || process.env.USERPROFILE\n || \"~\";\n const dir = path.join(home, \".ultracontext\");\n return { dir, path: path.join(dir, \"config.json\") };\n}\n\nfunction readConfig() {\n try {\n return JSON.parse(fs.readFileSync(configPaths().path, \"utf8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(patch) {\n const existing = readConfig();\n const { dir, path: file } = configPaths();\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(file, JSON.stringify({ ...existing, ...patch }, null, 2) + \"\\n\", \"utf8\");\n}\n\n// ── validation ──────────────────────────────────────────────────\n\nfunction isValidKey(key) {\n return /^uc_(live|test)_/.test(key);\n}\n\n// ── step constants ──────────────────────────────────────────────\n\nconst STEPS = [\"welcome\", \"mode\", \"url\", \"key\", \"agents\", \"projects\", \"capture\", \"launch\", \"done\"];\n\nconst MODE_OPTIONS = [\n { label: \"Login (ultracontext.ai)\", value: \"cloud\" },\n { label: \"Self-host\", value: \"selfhost\" },\n];\n\nconst LAUNCH_OPTIONS = [\n { label: \"Yes, open the TUI (recommended)\", value: true },\n { label: \"No, just finish setup\", value: false },\n];\n\n// ── step number display ─────────────────────────────────────────\n\nfunction stepNumber(step) {\n if (step === \"welcome\") return 1;\n if (step === \"mode\") return 2;\n if (step === \"url\" || step === \"key\") return 3;\n if (step === \"agents\") return 4;\n if (step === \"projects\") return 5;\n if (step === \"capture\") return 6;\n if (step === \"launch\") return 7;\n return 7;\n}\n\nconst TOTAL_STEPS = 7;\n\n// ── Onboarding component ────────────────────────────────────────\n\nfunction Onboarding({ onDone }) {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? process.stdout.columns ?? 80;\n\n const [step, setStep] = React.useState(\"welcome\");\n // stack of prior steps — every forward transition pushes, goBack pops\n const [history, setHistory] = React.useState([]);\n const [hosting, setHosting] = React.useState(\"cloud\");\n const [baseUrl, setBaseUrl] = React.useState(\"https://api.ultracontext.ai\");\n const [apiKey, setApiKey] = React.useState(\"\");\n // multi-select agent list — default: watch them all\n const [captureAgents, setCaptureAgents] = React.useState(\n ONBOARDING_AGENT_OPTIONS.map((o) => o.id),\n );\n const [projectPaths, setProjectPaths] = React.useState([]);\n const [autoCaptureMode, setAutoCaptureMode] = React.useState(\"all\");\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [keyInput, setKeyInput] = React.useState(\"\");\n const [urlInput, setUrlInput] = React.useState(\"https://\");\n const [error, setError] = React.useState(\"\");\n\n // discovered projects from Claude/Cursor session dirs — computed once.\n // The picker shows an \"All projects\" meta row at the top plus one row per\n // inferred project. ALL_PROJECTS is a sentinel that means \"no restriction\".\n const inferredProjects = React.useMemo(() => discoverRecentProjects(), []);\n const ALL_PROJECTS = \"__all__\";\n const projectRows = React.useMemo(\n () => [ALL_PROJECTS, ...inferredProjects],\n [inferredProjects],\n );\n // default: \"All projects\" selected — works even when inference finds nothing\n const [pickedProjects, setPickedProjects] = React.useState([ALL_PROJECTS]);\n\n // forward transition — remembers where we came from so Esc can walk back\n const pushStep = React.useCallback((nextStep) => {\n setHistory((h) => [...h, step]);\n setStep(nextStep);\n setSelectedIndex(0);\n setError(\"\");\n }, [step]);\n\n // walk one step back using the history stack\n const goBack = React.useCallback(() => {\n setHistory((h) => {\n if (h.length === 0) return h;\n setStep(h[h.length - 1]);\n setSelectedIndex(0);\n setError(\"\");\n return h.slice(0, -1);\n });\n }, []);\n\n // save config + env, advance to launch step\n const finish = React.useCallback((finalKey, finalUrl, preferences) => {\n writeConfig({\n apiKey: finalKey,\n baseUrl: finalUrl,\n ...buildOnboardingConfigPatch(preferences),\n });\n process.env.ULTRACONTEXT_API_KEY = finalKey;\n process.env.ULTRACONTEXT_BASE_URL = finalUrl;\n pushStep(\"launch\");\n }, [pushStep]);\n\n useInput((input, key) => {\n // ctrl+c always exits; esc / left-arrow walk back (esc on welcome exits)\n if (input === \"c\" && key.ctrl) process.exit(0);\n if (key.escape) {\n if (step === \"welcome\") process.exit(0);\n goBack();\n return;\n }\n if (key.leftArrow && step !== \"welcome\") {\n goBack();\n return;\n }\n\n // ── welcome ──\n if (step === \"welcome\") {\n if (key.return) pushStep(\"mode\");\n return;\n }\n\n // ── mode selection ──\n if (step === \"mode\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, MODE_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n\n if (key.return || input === \" \") {\n const chosen = MODE_OPTIONS[selectedIndex].value;\n setHosting(chosen);\n if (chosen === \"selfhost\") {\n pushStep(\"url\");\n } else {\n setBaseUrl(\"https://api.ultracontext.ai\");\n pushStep(\"key\");\n }\n }\n return;\n }\n\n // ── url input (self-host) ──\n if (step === \"url\") {\n if (key.return) {\n const trimmed = urlInput.trim();\n if (!trimmed || trimmed === \"https://\") {\n setError(\"Enter a valid base URL\");\n return;\n }\n setBaseUrl(trimmed);\n pushStep(\"key\");\n return;\n }\n if (key.backspace || key.delete) {\n setUrlInput((v) => v.slice(0, -1));\n setError(\"\");\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setUrlInput((v) => v + input);\n setError(\"\");\n }\n return;\n }\n\n // ── key input ──\n if (step === \"key\") {\n if (key.return) {\n const trimmed = keyInput.trim();\n if (!trimmed) {\n setError(\"Enter your API key\");\n return;\n }\n if (!isValidKey(trimmed)) {\n setError(\"Key must start with uc_live_ or uc_test_\");\n return;\n }\n setApiKey(trimmed);\n pushStep(\"agents\");\n return;\n }\n if (key.backspace || key.delete) {\n setKeyInput((v) => v.slice(0, -1));\n setError(\"\");\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n setKeyInput((v) => v + input);\n setError(\"\");\n }\n return;\n }\n\n // ── capture agents (multi-select, first row = \"All\" shortcut) ──\n if (step === \"agents\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, AGENT_ROWS.length - 1));\n\n if (input === \" \") {\n setError(\"\");\n const row = AGENT_ROWS[selectedIndex];\n // \"All\" row toggles every concrete agent at once\n if (row.id === \"all\") {\n const allIds = ONBOARDING_AGENT_OPTIONS.map((o) => o.id);\n setCaptureAgents((current) => (\n current.length === allIds.length ? [] : allIds\n ));\n } else {\n setCaptureAgents((current) => (\n current.includes(row.id) ? current.filter((x) => x !== row.id) : [...current, row.id]\n ));\n }\n return;\n }\n\n if (key.return) {\n if (captureAgents.length === 0) {\n setError(\"Select at least one agent\");\n return;\n }\n pushStep(\"projects\");\n }\n return;\n }\n\n // ── unified project picker: \"All projects\" + inferred paths ──\n if (step === \"projects\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, projectRows.length - 1));\n\n if (input === \" \") {\n const row = projectRows[selectedIndex];\n setPickedProjects((current) => {\n // toggling \"All projects\" — if already on, clear; if off, make it the only pick\n if (row === ALL_PROJECTS) {\n return current.includes(ALL_PROJECTS) ? [] : [ALL_PROJECTS];\n }\n // toggling a specific project — uncheck the \"All\" meta to avoid ambiguity\n const without = current.filter((p) => p !== ALL_PROJECTS && p !== row);\n return current.includes(row) ? without : [...without, row];\n });\n setError(\"\");\n return;\n }\n\n if (key.return) {\n if (pickedProjects.length === 0) {\n setError(\"Select at least one project (or 'All projects')\");\n return;\n }\n // \"All projects\" means no path restriction — otherwise save exactly what was picked\n const paths = pickedProjects.includes(ALL_PROJECTS)\n ? []\n : pickedProjects.slice();\n setProjectPaths(paths);\n pushStep(\"capture\");\n }\n return;\n }\n\n // ── auto-capture mode ──\n if (step === \"capture\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, ONBOARDING_CAPTURE_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n\n if (key.return || input === \" \") {\n const chosen = ONBOARDING_CAPTURE_OPTIONS[selectedIndex].id;\n setAutoCaptureMode(chosen);\n finish(apiKey, baseUrl, {\n captureAgents,\n // empty projectPaths = \"all projects\" (see buildOnboardingConfigPatch)\n projectPaths,\n autoCaptureMode: chosen,\n });\n }\n return;\n }\n\n // ── launch TUI? ──\n if (step === \"launch\") {\n if (key.upArrow) setSelectedIndex((i) => Math.max(i - 1, 0));\n if (key.downArrow) setSelectedIndex((i) => Math.min(i + 1, LAUNCH_OPTIONS.length - 1));\n if (input === \"1\") setSelectedIndex(0);\n if (input === \"2\") setSelectedIndex(1);\n\n if (key.return || input === \" \") {\n const chosen = LAUNCH_OPTIONS[selectedIndex].value;\n pushStep(\"done\");\n setTimeout(() => onDone(chosen), 80);\n }\n return;\n }\n });\n\n // ── render ──\n\n // figlet sized to the full terminal — picks a smaller font automatically\n // when the terminal is too narrow for ANSI Shadow\n const heroLines = heroArtForWidth(cols - 4);\n const stepNum = stepNumber(step);\n\n // centered figlet hero — no spinner, no side-by-side layout, no line-wrapping\n const hero = React.createElement(\n Box,\n { flexDirection: \"column\", alignItems: \"center\", width: \"100%\" },\n ...heroLines.map((line, i) =>\n React.createElement(Text, { key: `h${i}`, color: \"white\", bold: true }, line)\n )\n );\n\n // step content\n let content = null;\n\n if (step === \"welcome\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Welcome to UltraContext\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"white\" }, \"Press Enter to begin setup...\")\n );\n }\n\n if (step === \"mode\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"How do you want to connect?\"),\n React.createElement(Box, { height: 1 }),\n ...MODE_OPTIONS.map((opt, i) => ListRow({\n keyProp: `m${i}`,\n focused: i === selectedIndex,\n label: opt.label,\n })),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"\\u2191\\u2193 navigate \\u00B7 enter select\")\n );\n }\n\n if (step === \"url\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Enter your API base URL:\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"white\", bold: true }, `> ${urlInput}_`),\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Enter to confirm | Esc to go back\")\n );\n }\n\n if (step === \"key\") {\n const keyPrompt = hosting === \"cloud\"\n ? \"Paste your API key from ultracontext.ai:\"\n : \"Enter your API key:\";\n\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, keyPrompt),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"white\", bold: true }, `> ${keyInput}_`),\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"Format: uc_live_... or uc_test_... | Enter to confirm\")\n );\n }\n\n if (step === \"agents\") {\n // \"All\" shortcut is checked only when every concrete agent is selected\n const allChecked = ONBOARDING_AGENT_OPTIONS.every((o) => captureAgents.includes(o.id));\n const selectedCount = captureAgents.length;\n const totalCount = ONBOARDING_AGENT_OPTIONS.length;\n\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Which agents should UltraContext watch?\"),\n React.createElement(Text, { color: \"gray\" }, `${selectedCount} of ${totalCount} selected`),\n React.createElement(Box, { height: 1 }),\n ...AGENT_ROWS.map((opt, i) => ListRow({\n keyProp: `a${i}`,\n focused: i === selectedIndex,\n checked: opt.id === \"all\" ? allChecked : captureAgents.includes(opt.id),\n label: opt.label,\n multi: true,\n })),\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"\\u2191\\u2193 navigate \\u00B7 space toggle \\u00B7 enter confirm\")\n );\n }\n\n if (step === \"projects\") {\n const specificsPicked = pickedProjects.filter((p) => p !== ALL_PROJECTS).length;\n const allPicked = pickedProjects.includes(ALL_PROJECTS);\n const summary = allPicked\n ? \"all projects\"\n : `${specificsPicked} of ${inferredProjects.length} selected`;\n\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Which projects should UltraContext auto-capture?\"),\n React.createElement(Text, { color: \"gray\" }, `${summary} \\u00B7 their agent sessions will be ingested`),\n React.createElement(Box, { height: 1 }),\n // \"All projects\" meta row rendered with a friendly label; the sentinel ALL_PROJECTS\n // is hidden from the user but used internally to mean \"no restriction\"\n ...projectRows.map((row, i) => ListRow({\n keyProp: `pr${i}`,\n focused: i === selectedIndex,\n checked: pickedProjects.includes(row),\n label: row === ALL_PROJECTS ? \"All projects (recommended)\" : row,\n multi: true,\n })),\n inferredProjects.length === 0\n ? React.createElement(Text, { color: \"gray\" }, \"(no recent Claude/Cursor projects found — all will be captured)\")\n : null,\n error ? React.createElement(Text, { color: \"red\" }, error) : null,\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"\\u2191\\u2193 navigate \\u00B7 space toggle \\u00B7 enter confirm\")\n );\n }\n\n if (step === \"capture\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Auto-capture mode:\"),\n React.createElement(Box, { height: 1 }),\n ...ONBOARDING_CAPTURE_OPTIONS.map((opt, i) => ListRow({\n keyProp: `c${i}`,\n focused: i === selectedIndex,\n label: opt.label,\n })),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"\\u2191\\u2193 navigate \\u00B7 enter select\")\n );\n }\n\n if (step === \"launch\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"white\", bold: true }, \"Launch the TUI dashboard?\"),\n React.createElement(Box, { height: 1 }),\n ...LAUNCH_OPTIONS.map((opt, i) => ListRow({\n keyProp: `l${i}`,\n focused: i === selectedIndex,\n label: opt.label,\n })),\n React.createElement(Box, { height: 1 }),\n React.createElement(Text, { color: \"gray\" }, \"\\u2191\\u2193 navigate \\u00B7 enter select\")\n );\n }\n\n if (step === \"done\") {\n content = React.createElement(\n Box,\n { flexDirection: \"column\" },\n React.createElement(Text, { color: \"green\", bold: true }, \"Setup complete!\"),\n React.createElement(Text, { color: \"gray\" }, `Config saved to ${configPaths().path}`)\n );\n }\n\n const boxWidth = Math.min(cols - 2, 60);\n\n return React.createElement(\n Box,\n { flexDirection: \"column\", alignItems: \"center\", paddingX: 1, paddingY: 1, width: cols },\n hero,\n React.createElement(Text, { color: \"white\", bold: true }, \"[ Same context, everywhere ]\"),\n React.createElement(Box, { height: 1 }),\n React.createElement(\n TitledBox,\n {\n borderStyle: \"single\",\n titles: [\"Setup\"],\n titleJustify: \"flex-start\",\n borderColor: \"white\",\n flexDirection: \"column\",\n paddingX: 2,\n paddingY: 1,\n width: boxWidth,\n },\n React.createElement(\n Text,\n { color: \"gray\", dimColor: true },\n step !== \"done\" ? `Step ${stepNum} of ${TOTAL_STEPS}` : \"Done\"\n ),\n // universal nav hint — Esc steps back (or quits on welcome), Ctrl+C always quits\n step !== \"done\" && step !== \"welcome\"\n ? React.createElement(Text, { color: \"gray\", dimColor: true }, \"← / Esc: back · Ctrl+C: quit\")\n : null,\n React.createElement(Box, { height: 1 }),\n content\n )\n );\n}\n\n// ── public entry point ──────────────────────────────────────────\n\nexport function onboard() {\n return new Promise((resolve) => {\n const app = render(\n React.createElement(Onboarding, {\n onDone: (wantsTui) => {\n app.unmount();\n resolve({ launchTui: Boolean(wantsTui) });\n },\n }),\n { exitOnCtrlC: false }\n );\n });\n}\n"],"mappings":"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"}
|