ultracontext 1.1.4 → 1.2.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.
@@ -0,0 +1,153 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Box, Text } from "ink";
3
+ import figlet from "figlet";
4
+
5
+ //#region ../tui/src/ui/hero-art.mjs
6
+ const HERO_TEXT = "UltraContext";
7
+ const HERO_FONT_ORDER = [
8
+ "Standard",
9
+ "Small",
10
+ "Mini",
11
+ "Slant"
12
+ ];
13
+ const HERO_ART_CACHE = /* @__PURE__ */ new Map();
14
+ function trimBlankEdgeLines(lines) {
15
+ let start = 0;
16
+ let end = lines.length;
17
+ while (start < end && !String(lines[start] ?? "").trim()) start += 1;
18
+ while (end > start && !String(lines[end - 1] ?? "").trim()) end -= 1;
19
+ return lines.slice(start, end);
20
+ }
21
+ const HERO_FONT_ART = HERO_FONT_ORDER.map((font) => {
22
+ try {
23
+ const lines = trimBlankEdgeLines(figlet.textSync(HERO_TEXT, {
24
+ font,
25
+ horizontalLayout: "default",
26
+ verticalLayout: "default"
27
+ }).replace(/\n+$/g, "").split("\n").map((line) => line.replace(/\s+$/g, "")));
28
+ return {
29
+ lines,
30
+ width: Math.max(...lines.map((line) => line.length), 0)
31
+ };
32
+ } catch {
33
+ return null;
34
+ }
35
+ }).filter(Boolean);
36
+ function heroArtForWidth(columns) {
37
+ const available = Math.max(columns ?? 8, 8);
38
+ const cacheKey = String(available);
39
+ if (HERO_ART_CACHE.has(cacheKey)) return HERO_ART_CACHE.get(cacheKey);
40
+ const candidate = HERO_FONT_ART.find((entry) => entry.width <= available);
41
+ const art = candidate ? candidate.lines.map((line) => line.padEnd(candidate.width, " ")) : available >= 12 ? [HERO_TEXT] : ["UC"];
42
+ HERO_ART_CACHE.set(cacheKey, art);
43
+ return art;
44
+ }
45
+
46
+ //#endregion
47
+ //#region ../tui/src/ui/constants.mjs
48
+ const UC_BRAND_BLUE = "#2f6fb3";
49
+ const UC_BLUE_LIGHT = "#7ec3ff";
50
+ const UC_CLAUDE_ORANGE = "#f4a261";
51
+ const UC_CODEX_BLUE = "#5fb2ff";
52
+ const UC_OPENCLAW_RED = "#e76f51";
53
+ const MENU_TABS = [
54
+ {
55
+ id: "logs",
56
+ label: "Live View"
57
+ },
58
+ {
59
+ id: "contexts",
60
+ label: "Contexts"
61
+ },
62
+ {
63
+ id: "configs",
64
+ label: "Configs"
65
+ }
66
+ ];
67
+
68
+ //#endregion
69
+ //#region ../tui/src/Spinner.mjs
70
+ const WIDTH = 28;
71
+ const HEIGHT = 10;
72
+ const SCALE = 40;
73
+ const CAMERA_Z = 20;
74
+ const CHARS = "··..,,--::;;==!!**##$$@@";
75
+ const zBuffer = new Float32Array(WIDTH * HEIGHT);
76
+ const screenBuffer = new Uint8Array(WIDTH * HEIGHT);
77
+ const pointsData = [];
78
+ function addPoint(x, y, z, type) {
79
+ pointsData.push(x, y, z, type);
80
+ }
81
+ function addLine(x1, y1, z1, x2, y2, z2) {
82
+ const density = 15;
83
+ for (let i = 0; i <= density; i++) {
84
+ const t = i / density;
85
+ addPoint(x1 + (x2 - x1) * t, y1 + (y2 - y1) * t, z1 + (z2 - z1) * t, 0);
86
+ }
87
+ }
88
+ addLine(-1.8, -1.2, 0, -1.8, 1.2, 0);
89
+ addLine(-1.8, 1.2, 0, -1, 1.2, 0);
90
+ addLine(-1.8, -1.2, 0, -1, -1.2, 0);
91
+ addLine(1.8, -1.2, 0, 1.8, 1.2, 0);
92
+ addLine(1.8, 1.2, 0, 1, 1.2, 0);
93
+ addLine(1.8, -1.2, 0, 1, -1.2, 0);
94
+ addPoint(0, 0, 0, 1);
95
+ const points = new Float32Array(pointsData);
96
+ const pointCount = points.length / 4;
97
+ function renderFrame(angle) {
98
+ zBuffer.fill(-Infinity);
99
+ screenBuffer.fill(32);
100
+ const cosA = Math.cos(angle);
101
+ const sinA = Math.sin(angle);
102
+ for (let i = 0; i < pointCount; i++) {
103
+ const idx = i * 4;
104
+ const px = points[idx];
105
+ const py = points[idx + 1];
106
+ const pz = points[idx + 2];
107
+ const ptype = points[idx + 3];
108
+ const xRot = px * cosA - pz * sinA;
109
+ const yRot = py;
110
+ const zRot = px * sinA + pz * cosA;
111
+ const ooz = -1 / (zRot - CAMERA_Z);
112
+ const screenX = Math.floor(WIDTH / 2 + xRot * ooz * SCALE * 2);
113
+ const screenY = Math.floor(HEIGHT / 2 - yRot * ooz * SCALE);
114
+ if (screenX >= 0 && screenX < WIDTH && screenY >= 0 && screenY < HEIGHT) {
115
+ const bufIdx = screenX + screenY * WIDTH;
116
+ if (ooz > zBuffer[bufIdx]) {
117
+ zBuffer[bufIdx] = ooz;
118
+ if (ptype === 1) screenBuffer[bufIdx] = 79;
119
+ else {
120
+ let charIdx = Math.floor((zRot + 2) * 4.5);
121
+ if (charIdx < 0) charIdx = 0;
122
+ if (charIdx >= 24) charIdx = 23;
123
+ screenBuffer[bufIdx] = CHARS.charCodeAt(charIdx);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ const lines = [];
129
+ for (let y = 0; y < HEIGHT; y++) {
130
+ let row = "";
131
+ const offset = y * WIDTH;
132
+ for (let x = 0; x < WIDTH; x++) row += String.fromCharCode(screenBuffer[offset + x]);
133
+ lines.push(row);
134
+ }
135
+ return lines;
136
+ }
137
+ const Spinner = ({ color = "green", prefix = "", suffix = "", prefixColor = "white", suffixColor = "white", sideLines = [], sideGap = 0, sideColor = "white" }) => {
138
+ const [frameRows, setFrameRows] = useState(() => renderFrame(0));
139
+ useEffect(() => {
140
+ let angle = 0;
141
+ const timer = setInterval(() => {
142
+ angle += .05;
143
+ setFrameRows(renderFrame(angle));
144
+ }, 33);
145
+ timer.unref?.();
146
+ return () => clearInterval(timer);
147
+ }, []);
148
+ return React.createElement(Box, { flexDirection: "column" }, ...frameRows.map((row, index) => React.createElement(Text, { key: `spinner-row-${index}` }, prefix ? React.createElement(Text, { color: prefixColor }, prefix) : "", React.createElement(Text, { color }, row), sideLines.length > 0 ? React.createElement(Text, { color: sideColor }, `${" ".repeat(Math.max(sideGap, 0))}${sideLines[index] ?? ""}`) : "", suffix ? React.createElement(Text, { color: suffixColor }, suffix) : "")));
149
+ };
150
+
151
+ //#endregion
152
+ export { UC_CLAUDE_ORANGE as a, heroArtForWidth as c, UC_BRAND_BLUE as i, MENU_TABS as n, UC_CODEX_BLUE as o, UC_BLUE_LIGHT as r, UC_OPENCLAW_RED as s, Spinner as t };
153
+ //# sourceMappingURL=Spinner-C_38udz8.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner-C_38udz8.mjs","names":[],"sources":["../../tui/src/ui/hero-art.mjs","../../tui/src/ui/constants.mjs","../../tui/src/Spinner.mjs"],"sourcesContent":["import figlet from \"figlet\";\n\nconst HERO_TEXT = \"UltraContext\";\nconst HERO_FONT_ORDER = [\"Standard\", \"Small\", \"Mini\", \"Slant\"];\nconst HERO_ART_CACHE = new Map();\n\nfunction trimBlankEdgeLines(lines) {\n let start = 0;\n let end = lines.length;\n while (start < end && !String(lines[start] ?? \"\").trim()) start += 1;\n while (end > start && !String(lines[end - 1] ?? \"\").trim()) end -= 1;\n return lines.slice(start, end);\n}\n\nconst HERO_FONT_ART = HERO_FONT_ORDER.map((font) => {\n try {\n const raw = figlet.textSync(HERO_TEXT, {\n font,\n horizontalLayout: \"default\",\n verticalLayout: \"default\",\n });\n const lines = trimBlankEdgeLines(\n raw\n .replace(/\\n+$/g, \"\")\n .split(\"\\n\")\n .map((line) => line.replace(/\\s+$/g, \"\"))\n );\n const width = Math.max(...lines.map((line) => line.length), 0);\n return { lines, width };\n } catch {\n return null;\n }\n}).filter(Boolean);\n\nexport function heroArtForWidth(columns) {\n const available = Math.max(columns ?? 8, 8);\n const cacheKey = String(available);\n if (HERO_ART_CACHE.has(cacheKey)) return HERO_ART_CACHE.get(cacheKey);\n\n const candidate = HERO_FONT_ART.find((entry) => entry.width <= available);\n const art = candidate\n ? candidate.lines.map((line) => line.padEnd(candidate.width, \" \"))\n : available >= 12\n ? [HERO_TEXT]\n : [\"UC\"];\n\n HERO_ART_CACHE.set(cacheKey, art);\n return art;\n}\n","export const UC_BRAND_BLUE = \"#2f6fb3\";\nexport const UC_BLUE_LIGHT = \"#7ec3ff\";\nexport const UC_CLAUDE_ORANGE = \"#f4a261\";\nexport const UC_CODEX_BLUE = \"#5fb2ff\";\nexport const UC_OPENCLAW_RED = \"#e76f51\";\n\nexport const MENU_TABS = [\n { id: \"logs\", label: \"Live View\" },\n { id: \"contexts\", label: \"Contexts\" },\n { id: \"configs\", label: \"Configs\" },\n];\n","import React, { useState, useEffect } from \"react\";\nimport { Box, Text } from \"ink\";\n\nconst WIDTH = 28;\nconst HEIGHT = 10;\nconst SCALE = 40.0;\nconst CAMERA_Z = 20.0;\nconst CHARS = \"··..,,--::;;==!!**##$$@@\";\n\nconst zBuffer = new Float32Array(WIDTH * HEIGHT);\nconst screenBuffer = new Uint8Array(WIDTH * HEIGHT);\n\nconst pointsData = [];\nfunction addPoint(x, y, z, type) {\n pointsData.push(x, y, z, type);\n}\n\nfunction addLine(x1, y1, z1, x2, y2, z2) {\n const density = 15;\n for (let i = 0; i <= density; i++) {\n const t = i / density;\n addPoint(\n x1 + (x2 - x1) * t,\n y1 + (y2 - y1) * t,\n z1 + (z2 - z1) * t,\n 0\n );\n }\n}\n\naddLine(-1.8, -1.2, 0, -1.8, 1.2, 0);\naddLine(-1.8, 1.2, 0, -1.0, 1.2, 0);\naddLine(-1.8, -1.2, 0, -1.0, -1.2, 0);\n\naddLine(1.8, -1.2, 0, 1.8, 1.2, 0);\naddLine(1.8, 1.2, 0, 1.0, 1.2, 0);\naddLine(1.8, -1.2, 0, 1.0, -1.2, 0);\n\naddPoint(0, 0, 0, 1);\n\nconst points = new Float32Array(pointsData);\nconst pointCount = points.length / 4;\n\nfunction renderFrame(angle) {\n zBuffer.fill(-Infinity);\n screenBuffer.fill(32);\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n for (let i = 0; i < pointCount; i++) {\n const idx = i * 4;\n const px = points[idx];\n const py = points[idx + 1];\n const pz = points[idx + 2];\n const ptype = points[idx + 3];\n\n const xRot = px * cosA - pz * sinA;\n const yRot = py;\n const zRot = px * sinA + pz * cosA;\n\n const zFinal = zRot - CAMERA_Z;\n const ooz = -1.0 / zFinal;\n\n const screenX = Math.floor(WIDTH / 2 + xRot * ooz * SCALE * 2.0);\n const screenY = Math.floor(HEIGHT / 2 - yRot * ooz * SCALE);\n\n if (screenX >= 0 && screenX < WIDTH && screenY >= 0 && screenY < HEIGHT) {\n const bufIdx = screenX + screenY * WIDTH;\n if (ooz > zBuffer[bufIdx]) {\n zBuffer[bufIdx] = ooz;\n if (ptype === 1) {\n screenBuffer[bufIdx] = 79;\n } else {\n let charIdx = Math.floor((zRot + 2.0) * 4.5);\n if (charIdx < 0) charIdx = 0;\n if (charIdx >= CHARS.length) charIdx = CHARS.length - 1;\n screenBuffer[bufIdx] = CHARS.charCodeAt(charIdx);\n }\n }\n }\n }\n\n const lines = [];\n for (let y = 0; y < HEIGHT; y++) {\n let row = \"\";\n const offset = y * WIDTH;\n for (let x = 0; x < WIDTH; x++) {\n row += String.fromCharCode(screenBuffer[offset + x]);\n }\n lines.push(row);\n }\n return lines;\n}\n\nconst Spinner = ({\n color = \"green\",\n prefix = \"\",\n suffix = \"\",\n prefixColor = \"white\",\n suffixColor = \"white\",\n sideLines = [],\n sideGap = 0,\n sideColor = \"white\",\n}) => {\n const [frameRows, setFrameRows] = useState(() => renderFrame(0));\n\n useEffect(() => {\n let angle = 0;\n const timer = setInterval(() => {\n angle += 0.05;\n setFrameRows(renderFrame(angle));\n }, 33);\n timer.unref?.();\n return () => clearInterval(timer);\n }, []);\n\n return React.createElement(\n Box,\n { flexDirection: \"column\" },\n ...frameRows.map((row, index) =>\n React.createElement(\n Text,\n { key: `spinner-row-${index}` },\n prefix ? React.createElement(Text, { color: prefixColor }, prefix) : \"\",\n React.createElement(Text, { color }, row),\n sideLines.length > 0\n ? React.createElement(Text, { color: sideColor }, `${\" \".repeat(Math.max(sideGap, 0))}${sideLines[index] ?? \"\"}`)\n : \"\",\n suffix ? React.createElement(Text, { color: suffixColor }, suffix) : \"\"\n )\n )\n );\n};\n\nexport default Spinner;\n"],"mappings":"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"}
@@ -313,18 +313,18 @@ async function checkForUpdate() {
313
313
  if (latest && isNewer(latest, current)) printUpdateNotice(current, latest);
314
314
  }
315
315
  async function launchDaemonSDK() {
316
- const { launchDaemon } = await import("@ultracontext/daemon/launcher");
316
+ const { launchDaemon } = await import("../launcher-VTbHuuaQ.mjs");
317
317
  await launchDaemon({
318
318
  entryPath: fileURLToPath(new URL("./sdk-daemon.mjs", import.meta.url)),
319
319
  diagnosticsHint: "DAEMON_VERBOSE=1 ultracontext start"
320
320
  });
321
321
  }
322
322
  async function runCtlSDK() {
323
- const { runCtl } = await import("@ultracontext/daemon/ctl");
323
+ const { runCtl } = await import("../ctl-DaIi3tUU.mjs");
324
324
  await runCtl();
325
325
  }
326
326
  async function launchTuiSDK() {
327
- const { tuiBoot } = await import("@ultracontext/tui/tui");
327
+ const { tuiBoot } = await import("../tui-BwpUi10R.mjs");
328
328
  await tuiBoot({
329
329
  assetsRoot: path.resolve(__dirname, "..", ".."),
330
330
  offlineNotice: "Daemon offline. Run: ultracontext start"
@@ -1,3 +1,4 @@
1
+ import { c as heroArtForWidth, i as UC_BRAND_BLUE, r as UC_BLUE_LIGHT, t as Spinner } from "../Spinner-C_38udz8.mjs";
1
2
  import process from "node:process";
2
3
  import path from "node:path";
3
4
  import fs from "node:fs";
@@ -5,9 +6,6 @@ import { spawn } from "node:child_process";
5
6
  import React from "react";
6
7
  import { Box, Text, render, useInput, useStdout } from "ink";
7
8
  import { TitledBox } from "@mishieck/ink-titled-box";
8
- import { heroArtForWidth } from "@ultracontext/tui/ui/hero-art";
9
- import { UC_BLUE_LIGHT, UC_BRAND_BLUE } from "@ultracontext/tui/ui/constants";
10
- import Spinner from "@ultracontext/tui/Spinner";
11
9
 
12
10
  //#region src/cli/onboarding.mjs
13
11
  const CONFIG_DIR = path.join(process.env.HOME || process.env.USERPROFILE || "~", ".ultracontext");
@@ -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/tui/ui/hero-art\";\nimport { UC_BRAND_BLUE, UC_BLUE_LIGHT } from \"@ultracontext/tui/ui/constants\";\nimport Spinner from \"@ultracontext/tui/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":[],"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/tui/ui/hero-art\";\nimport { UC_BRAND_BLUE, UC_BLUE_LIGHT } from \"@ultracontext/tui/ui/constants\";\nimport Spinner from \"@ultracontext/tui/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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"}