@akon-labs/nexus-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +3 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.js +278 -78
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/web-access.d.ts +14 -0
- package/dist/extensions/web-access.d.ts.map +1 -0
- package/dist/extensions/web-access.js +110 -0
- package/dist/extensions/web-access.js.map +1 -0
- package/dist/extensions/web-search-concurrency.d.ts +14 -0
- package/dist/extensions/web-search-concurrency.d.ts.map +1 -0
- package/dist/extensions/web-search-concurrency.js +93 -0
- package/dist/extensions/web-search-concurrency.js.map +1 -0
- package/dist/index.js +291 -91
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -1
- package/dist/main.js.map +1 -1
- package/dist/rpc-entry.js +278 -78
- package/npm-shrinkwrap.json +3 -3
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
|
|
73
73
|
### Added
|
|
74
74
|
|
|
75
|
+
- Added default web access through the pinned `pi-web-access` package, with quota-aware provider fallback ending in keyless DuckDuckGo, optional self-hosted SearXNG, raw CLI results, the existing `websearch` tool name preserved, and concurrent searches capped at three.
|
|
75
76
|
- Added built-in Baseten provider support with `BASETEN_API_KEY` authentication and `zai-org/GLM-5.2` as the default model.
|
|
76
77
|
- Added `CredentialSynchronizationError` for credential changes that commit successfully but fail to synchronize local model state.
|
|
77
78
|
- Added chainable `pi.registerMarkdownTransformer()` hooks for display-only transformation of user and assistant Markdown.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup-ui.d.ts","sourceRoot":"","sources":["../../src/cli/startup-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,GAAG,EAAiB,MAAM,wBAAwB,CAAC;AAMlG,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"startup-ui.d.ts","sourceRoot":"","sources":["../../src/cli/startup-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,GAAG,EAAiB,MAAM,wBAAwB,CAAC;AAMlG,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAyE9D,wBAAsB,gBAAgB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAQrF;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CAG/E;AAkBD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,MAA0B,GAAG,OAAO,CAiBzF;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EAC1C,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,GACzC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAyBxB;AAED,8DAA8D;AAC9D,wBAAsB,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCxF;AAED,wBAAsB,gBAAgB,CACrC,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4B7B","sourcesContent":["import { ProcessTerminal, setKeybindings, type TUI, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport { existsSync } from \"fs\";\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR, getAgentDir, getSettingsPath, PACKAGE_NAME } from \"../config.ts\";\nimport { areExperimentalFeaturesEnabled } from \"../core/experimental.ts\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport { DefaultPackageManager, type ResolvedResource } from \"../core/package-manager.ts\";\nimport { SettingsManager } from \"../core/settings-manager.ts\";\nimport { ExtensionInputComponent } from \"../modes/interactive/components/extension-input.ts\";\nimport { ExtensionSelectorComponent } from \"../modes/interactive/components/extension-selector.ts\";\nimport {\n\tFirstTimeSetupComponent,\n\ttype FirstTimeSetupResult,\n} from \"../modes/interactive/components/first-time-setup.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tloadThemeFromPath,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetRegisteredThemes,\n\tsetTheme,\n\ttype Theme,\n} from \"../modes/interactive/theme/theme.ts\";\n\n// nexus is this fork's official identity — first-time setup runs for it.\n// Must track the published package name in package.json: a mismatch silently\n// disables first-time setup for every user installing from npm.\nconst OFFICIAL_PACKAGE_NAME = \"@akon-labs/nexus-cli\";\nconst OFFICIAL_APP_NAME = \"nexus\";\nconst OFFICIAL_CONFIG_DIR_NAME = \".nexus\";\n\ninterface DistributionMetadata {\n\tpackageName: string;\n\tappName: string;\n\tconfigDirName: string;\n}\n\nfunction isOfficialDistribution({ packageName, appName, configDirName }: DistributionMetadata): boolean {\n\treturn (\n\t\tpackageName === OFFICIAL_PACKAGE_NAME &&\n\t\tappName === OFFICIAL_APP_NAME &&\n\t\tconfigDirName === OFFICIAL_CONFIG_DIR_NAME\n\t);\n}\n\nfunction loadThemes(resources: ResolvedResource[]): Theme[] {\n\tconst themes: Theme[] = [];\n\tconst seen = new Set<string>();\n\tfor (const resource of resources) {\n\t\tif (!resource.enabled) continue;\n\t\ttry {\n\t\t\tconst loadedTheme = loadThemeFromPath(resource.path);\n\t\t\tif (loadedTheme.name) {\n\t\t\t\tif (seen.has(loadedTheme.name)) continue;\n\t\t\t\tseen.add(loadedTheme.name);\n\t\t\t}\n\t\t\tthemes.push(loadedTheme);\n\t\t} catch {\n\t\t\t// Startup prompts should not fail because a theme is broken. The normal\n\t\t\t// resource loader reports theme diagnostics later in startup.\n\t\t}\n\t}\n\treturn themes;\n}\n\nasync function loadStartupThemes(settingsManager: SettingsManager): Promise<Theme[]> {\n\tconst globalSettingsManager = SettingsManager.inMemory(settingsManager.getGlobalSettings(), {\n\t\tprojectTrusted: false,\n\t});\n\tconst packageManager = new DefaultPackageManager({\n\t\tcwd: process.cwd(),\n\t\tagentDir: getAgentDir(),\n\t\tsettingsManager: globalSettingsManager,\n\t});\n\tconst resolvedPaths = await packageManager.resolve(async () => \"skip\");\n\treturn loadThemes(resolvedPaths.themes);\n}\n\nexport async function createStartupTui(settingsManager: SettingsManager): Promise<TUI> {\n\tsetRegisteredThemes(await loadStartupThemes(settingsManager));\n\tconst terminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tinitTheme(resolveThemeSetting(settingsManager.getThemeSetting(), terminalTheme) ?? terminalTheme);\n\tsetKeybindings(KeybindingsManager.create());\n\tconst ui: TUI = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor(), getAgentDir());\n\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\treturn ui;\n}\n\nexport function startStartupTui(ui: TUI, settingsManager: SettingsManager): void {\n\tui.start();\n\tvoid applyDetectedStartupTheme(ui, settingsManager);\n}\n\nasync function applyDetectedStartupTheme(ui: TUI, settingsManager: SettingsManager): Promise<void> {\n\tconst themeSetting = settingsManager.getThemeSetting();\n\tif (themeSetting && !parseAutoThemeSetting(themeSetting)) return;\n\n\tconst terminalTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\tsetTheme(resolveThemeSetting(themeSetting, terminalTheme) ?? terminalTheme);\n\tui.invalidate();\n\tui.requestRender();\n}\n\nasync function clearStartupTui(ui: TUI): Promise<void> {\n\tui.clear();\n\tui.requestRender();\n\tawait new Promise((resolve) => setTimeout(resolve, 25));\n}\n\n/**\n * First-time setup runs when all of these hold:\n * - this is the official Pi distribution (not a fork/rebrand)\n * - experimental features are enabled (PI_EXPERIMENTAL=1)\n * - the default agent directory is used (no custom agent dir override)\n * - setup was not completed before (settings.json does not exist)\n */\nexport function shouldRunFirstTimeSetup(settingsPath: string = getSettingsPath()): boolean {\n\tif (\n\t\t!isOfficialDistribution({\n\t\t\tpackageName: PACKAGE_NAME,\n\t\t\tappName: APP_NAME,\n\t\t\tconfigDirName: CONFIG_DIR_NAME,\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\tif (!areExperimentalFeaturesEnabled()) {\n\t\treturn false;\n\t}\n\tif (process.env[ENV_AGENT_DIR]) {\n\t\treturn false;\n\t}\n\treturn !existsSync(settingsPath);\n}\n\nexport async function showStartupSelector<T>(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\toptions: Array<{ label: string; value: T }>,\n): Promise<T | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: T | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\toptions.map((option) => option.label),\n\t\t\t(option) => void finish(options.find((entry) => entry.label === option)?.value),\n\t\t\t() => void finish(undefined),\n\t\t\t{ tui: ui },\n\t\t);\n\t\tui.addChild(selector);\n\t\tui.setFocus(selector);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n\n/** Show the first-time setup dialog and persist the result */\nexport async function showFirstTimeSetup(settingsManager: SettingsManager): Promise<void> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: FirstTimeSetupResult | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tif (result) {\n\t\t\t\tsettingsManager.setTheme(result.theme);\n\t\t\t\tsettingsManager.setEnableAnalytics(result.shareAnalytics);\n\t\t\t\tawait settingsManager.flush();\n\t\t\t}\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve();\n\t\t};\n\n\t\tconst showSetup = async () => {\n\t\t\tui.start();\n\t\t\tconst detectedTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\t\t\tsetTheme(detectedTheme);\n\t\t\tconst component = new FirstTimeSetupComponent({\n\t\t\t\tdetectedTheme,\n\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\tsetTheme(themeName);\n\t\t\t\t\tui.requestRender();\n\t\t\t\t},\n\t\t\t\tonSubmit: (result) => void finish(result),\n\t\t\t\tonCancel: () => void finish(undefined),\n\t\t\t});\n\t\t\tui.addChild(component);\n\t\t\tui.setFocus(component);\n\t\t\tui.requestRender();\n\t\t};\n\n\t\tvoid showSetup();\n\t});\n}\n\nexport async function showStartupInput(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\tplaceholder?: string,\n): Promise<string | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: string | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tinput.dispose();\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst input = new ExtensionInputComponent(\n\t\t\ttitle,\n\t\t\tplaceholder,\n\t\t\t(value) => void finish(value),\n\t\t\t() => void finish(undefined),\n\t\t\t{\n\t\t\t\ttui: ui,\n\t\t\t},\n\t\t);\n\t\tui.addChild(input);\n\t\tui.setFocus(input);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n"]}
|
package/dist/cli/startup-ui.js
CHANGED
|
@@ -10,7 +10,9 @@ import { ExtensionSelectorComponent } from "../modes/interactive/components/exte
|
|
|
10
10
|
import { FirstTimeSetupComponent, } from "../modes/interactive/components/first-time-setup.js";
|
|
11
11
|
import { detectTerminalBackgroundFromEnv, detectTerminalThemeForAuto, initTheme, loadThemeFromPath, parseAutoThemeSetting, resolveThemeSetting, setRegisteredThemes, setTheme, } from "../modes/interactive/theme/theme.js";
|
|
12
12
|
// nexus is this fork's official identity — first-time setup runs for it.
|
|
13
|
-
|
|
13
|
+
// Must track the published package name in package.json: a mismatch silently
|
|
14
|
+
// disables first-time setup for every user installing from npm.
|
|
15
|
+
const OFFICIAL_PACKAGE_NAME = "@akon-labs/nexus-cli";
|
|
14
16
|
const OFFICIAL_APP_NAME = "nexus";
|
|
15
17
|
const OFFICIAL_CONFIG_DIR_NAME = ".nexus";
|
|
16
18
|
function isOfficialDistribution({ packageName, appName, configDirName }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup-ui.js","sourceRoot":"","sources":["../../src/cli/startup-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProcessTerminal, setKeybindings, type TUI, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport { existsSync } from \"fs\";\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR, getAgentDir, getSettingsPath, PACKAGE_NAME } from \"../config.ts\";\nimport { areExperimentalFeaturesEnabled } from \"../core/experimental.ts\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport { DefaultPackageManager, type ResolvedResource } from \"../core/package-manager.ts\";\nimport { SettingsManager } from \"../core/settings-manager.ts\";\nimport { ExtensionInputComponent } from \"../modes/interactive/components/extension-input.ts\";\nimport { ExtensionSelectorComponent } from \"../modes/interactive/components/extension-selector.ts\";\nimport {\n\tFirstTimeSetupComponent,\n\ttype FirstTimeSetupResult,\n} from \"../modes/interactive/components/first-time-setup.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tloadThemeFromPath,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetRegisteredThemes,\n\tsetTheme,\n\ttype Theme,\n} from \"../modes/interactive/theme/theme.ts\";\n\n// nexus is this fork's official identity — first-time setup runs for it.\nconst OFFICIAL_PACKAGE_NAME = \"@akonlabs/nexus-cli\";\nconst OFFICIAL_APP_NAME = \"nexus\";\nconst OFFICIAL_CONFIG_DIR_NAME = \".nexus\";\n\ninterface DistributionMetadata {\n\tpackageName: string;\n\tappName: string;\n\tconfigDirName: string;\n}\n\nfunction isOfficialDistribution({ packageName, appName, configDirName }: DistributionMetadata): boolean {\n\treturn (\n\t\tpackageName === OFFICIAL_PACKAGE_NAME &&\n\t\tappName === OFFICIAL_APP_NAME &&\n\t\tconfigDirName === OFFICIAL_CONFIG_DIR_NAME\n\t);\n}\n\nfunction loadThemes(resources: ResolvedResource[]): Theme[] {\n\tconst themes: Theme[] = [];\n\tconst seen = new Set<string>();\n\tfor (const resource of resources) {\n\t\tif (!resource.enabled) continue;\n\t\ttry {\n\t\t\tconst loadedTheme = loadThemeFromPath(resource.path);\n\t\t\tif (loadedTheme.name) {\n\t\t\t\tif (seen.has(loadedTheme.name)) continue;\n\t\t\t\tseen.add(loadedTheme.name);\n\t\t\t}\n\t\t\tthemes.push(loadedTheme);\n\t\t} catch {\n\t\t\t// Startup prompts should not fail because a theme is broken. The normal\n\t\t\t// resource loader reports theme diagnostics later in startup.\n\t\t}\n\t}\n\treturn themes;\n}\n\nasync function loadStartupThemes(settingsManager: SettingsManager): Promise<Theme[]> {\n\tconst globalSettingsManager = SettingsManager.inMemory(settingsManager.getGlobalSettings(), {\n\t\tprojectTrusted: false,\n\t});\n\tconst packageManager = new DefaultPackageManager({\n\t\tcwd: process.cwd(),\n\t\tagentDir: getAgentDir(),\n\t\tsettingsManager: globalSettingsManager,\n\t});\n\tconst resolvedPaths = await packageManager.resolve(async () => \"skip\");\n\treturn loadThemes(resolvedPaths.themes);\n}\n\nexport async function createStartupTui(settingsManager: SettingsManager): Promise<TUI> {\n\tsetRegisteredThemes(await loadStartupThemes(settingsManager));\n\tconst terminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tinitTheme(resolveThemeSetting(settingsManager.getThemeSetting(), terminalTheme) ?? terminalTheme);\n\tsetKeybindings(KeybindingsManager.create());\n\tconst ui: TUI = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor(), getAgentDir());\n\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\treturn ui;\n}\n\nexport function startStartupTui(ui: TUI, settingsManager: SettingsManager): void {\n\tui.start();\n\tvoid applyDetectedStartupTheme(ui, settingsManager);\n}\n\nasync function applyDetectedStartupTheme(ui: TUI, settingsManager: SettingsManager): Promise<void> {\n\tconst themeSetting = settingsManager.getThemeSetting();\n\tif (themeSetting && !parseAutoThemeSetting(themeSetting)) return;\n\n\tconst terminalTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\tsetTheme(resolveThemeSetting(themeSetting, terminalTheme) ?? terminalTheme);\n\tui.invalidate();\n\tui.requestRender();\n}\n\nasync function clearStartupTui(ui: TUI): Promise<void> {\n\tui.clear();\n\tui.requestRender();\n\tawait new Promise((resolve) => setTimeout(resolve, 25));\n}\n\n/**\n * First-time setup runs when all of these hold:\n * - this is the official Pi distribution (not a fork/rebrand)\n * - experimental features are enabled (PI_EXPERIMENTAL=1)\n * - the default agent directory is used (no custom agent dir override)\n * - setup was not completed before (settings.json does not exist)\n */\nexport function shouldRunFirstTimeSetup(settingsPath: string = getSettingsPath()): boolean {\n\tif (\n\t\t!isOfficialDistribution({\n\t\t\tpackageName: PACKAGE_NAME,\n\t\t\tappName: APP_NAME,\n\t\t\tconfigDirName: CONFIG_DIR_NAME,\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\tif (!areExperimentalFeaturesEnabled()) {\n\t\treturn false;\n\t}\n\tif (process.env[ENV_AGENT_DIR]) {\n\t\treturn false;\n\t}\n\treturn !existsSync(settingsPath);\n}\n\nexport async function showStartupSelector<T>(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\toptions: Array<{ label: string; value: T }>,\n): Promise<T | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: T | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\toptions.map((option) => option.label),\n\t\t\t(option) => void finish(options.find((entry) => entry.label === option)?.value),\n\t\t\t() => void finish(undefined),\n\t\t\t{ tui: ui },\n\t\t);\n\t\tui.addChild(selector);\n\t\tui.setFocus(selector);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n\n/** Show the first-time setup dialog and persist the result */\nexport async function showFirstTimeSetup(settingsManager: SettingsManager): Promise<void> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: FirstTimeSetupResult | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tif (result) {\n\t\t\t\tsettingsManager.setTheme(result.theme);\n\t\t\t\tsettingsManager.setEnableAnalytics(result.shareAnalytics);\n\t\t\t\tawait settingsManager.flush();\n\t\t\t}\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve();\n\t\t};\n\n\t\tconst showSetup = async () => {\n\t\t\tui.start();\n\t\t\tconst detectedTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\t\t\tsetTheme(detectedTheme);\n\t\t\tconst component = new FirstTimeSetupComponent({\n\t\t\t\tdetectedTheme,\n\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\tsetTheme(themeName);\n\t\t\t\t\tui.requestRender();\n\t\t\t\t},\n\t\t\t\tonSubmit: (result) => void finish(result),\n\t\t\t\tonCancel: () => void finish(undefined),\n\t\t\t});\n\t\t\tui.addChild(component);\n\t\t\tui.setFocus(component);\n\t\t\tui.requestRender();\n\t\t};\n\n\t\tvoid showSetup();\n\t});\n}\n\nexport async function showStartupInput(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\tplaceholder?: string,\n): Promise<string | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: string | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tinput.dispose();\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst input = new ExtensionInputComponent(\n\t\t\ttitle,\n\t\t\tplaceholder,\n\t\t\t(value) => void finish(value),\n\t\t\t() => void finish(undefined),\n\t\t\t{\n\t\t\t\ttui: ui,\n\t\t\t},\n\t\t);\n\t\tui.addChild(input);\n\t\tui.setFocus(input);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"startup-ui.js","sourceRoot":"","sources":["../../src/cli/startup-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import { ProcessTerminal, setKeybindings, type TUI, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport { existsSync } from \"fs\";\nimport { APP_NAME, CONFIG_DIR_NAME, ENV_AGENT_DIR, getAgentDir, getSettingsPath, PACKAGE_NAME } from \"../config.ts\";\nimport { areExperimentalFeaturesEnabled } from \"../core/experimental.ts\";\nimport { KeybindingsManager } from \"../core/keybindings.ts\";\nimport { DefaultPackageManager, type ResolvedResource } from \"../core/package-manager.ts\";\nimport { SettingsManager } from \"../core/settings-manager.ts\";\nimport { ExtensionInputComponent } from \"../modes/interactive/components/extension-input.ts\";\nimport { ExtensionSelectorComponent } from \"../modes/interactive/components/extension-selector.ts\";\nimport {\n\tFirstTimeSetupComponent,\n\ttype FirstTimeSetupResult,\n} from \"../modes/interactive/components/first-time-setup.ts\";\nimport {\n\tdetectTerminalBackgroundFromEnv,\n\tdetectTerminalThemeForAuto,\n\tinitTheme,\n\tloadThemeFromPath,\n\tparseAutoThemeSetting,\n\tresolveThemeSetting,\n\tsetRegisteredThemes,\n\tsetTheme,\n\ttype Theme,\n} from \"../modes/interactive/theme/theme.ts\";\n\n// nexus is this fork's official identity — first-time setup runs for it.\n// Must track the published package name in package.json: a mismatch silently\n// disables first-time setup for every user installing from npm.\nconst OFFICIAL_PACKAGE_NAME = \"@akon-labs/nexus-cli\";\nconst OFFICIAL_APP_NAME = \"nexus\";\nconst OFFICIAL_CONFIG_DIR_NAME = \".nexus\";\n\ninterface DistributionMetadata {\n\tpackageName: string;\n\tappName: string;\n\tconfigDirName: string;\n}\n\nfunction isOfficialDistribution({ packageName, appName, configDirName }: DistributionMetadata): boolean {\n\treturn (\n\t\tpackageName === OFFICIAL_PACKAGE_NAME &&\n\t\tappName === OFFICIAL_APP_NAME &&\n\t\tconfigDirName === OFFICIAL_CONFIG_DIR_NAME\n\t);\n}\n\nfunction loadThemes(resources: ResolvedResource[]): Theme[] {\n\tconst themes: Theme[] = [];\n\tconst seen = new Set<string>();\n\tfor (const resource of resources) {\n\t\tif (!resource.enabled) continue;\n\t\ttry {\n\t\t\tconst loadedTheme = loadThemeFromPath(resource.path);\n\t\t\tif (loadedTheme.name) {\n\t\t\t\tif (seen.has(loadedTheme.name)) continue;\n\t\t\t\tseen.add(loadedTheme.name);\n\t\t\t}\n\t\t\tthemes.push(loadedTheme);\n\t\t} catch {\n\t\t\t// Startup prompts should not fail because a theme is broken. The normal\n\t\t\t// resource loader reports theme diagnostics later in startup.\n\t\t}\n\t}\n\treturn themes;\n}\n\nasync function loadStartupThemes(settingsManager: SettingsManager): Promise<Theme[]> {\n\tconst globalSettingsManager = SettingsManager.inMemory(settingsManager.getGlobalSettings(), {\n\t\tprojectTrusted: false,\n\t});\n\tconst packageManager = new DefaultPackageManager({\n\t\tcwd: process.cwd(),\n\t\tagentDir: getAgentDir(),\n\t\tsettingsManager: globalSettingsManager,\n\t});\n\tconst resolvedPaths = await packageManager.resolve(async () => \"skip\");\n\treturn loadThemes(resolvedPaths.themes);\n}\n\nexport async function createStartupTui(settingsManager: SettingsManager): Promise<TUI> {\n\tsetRegisteredThemes(await loadStartupThemes(settingsManager));\n\tconst terminalTheme = detectTerminalBackgroundFromEnv().theme;\n\tinitTheme(resolveThemeSetting(settingsManager.getThemeSetting(), terminalTheme) ?? terminalTheme);\n\tsetKeybindings(KeybindingsManager.create());\n\tconst ui: TUI = new TuiMainScreen(new ProcessTerminal(), settingsManager.getShowHardwareCursor(), getAgentDir());\n\tui.setClearOnShrink(settingsManager.getClearOnShrink());\n\treturn ui;\n}\n\nexport function startStartupTui(ui: TUI, settingsManager: SettingsManager): void {\n\tui.start();\n\tvoid applyDetectedStartupTheme(ui, settingsManager);\n}\n\nasync function applyDetectedStartupTheme(ui: TUI, settingsManager: SettingsManager): Promise<void> {\n\tconst themeSetting = settingsManager.getThemeSetting();\n\tif (themeSetting && !parseAutoThemeSetting(themeSetting)) return;\n\n\tconst terminalTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\tsetTheme(resolveThemeSetting(themeSetting, terminalTheme) ?? terminalTheme);\n\tui.invalidate();\n\tui.requestRender();\n}\n\nasync function clearStartupTui(ui: TUI): Promise<void> {\n\tui.clear();\n\tui.requestRender();\n\tawait new Promise((resolve) => setTimeout(resolve, 25));\n}\n\n/**\n * First-time setup runs when all of these hold:\n * - this is the official Pi distribution (not a fork/rebrand)\n * - experimental features are enabled (PI_EXPERIMENTAL=1)\n * - the default agent directory is used (no custom agent dir override)\n * - setup was not completed before (settings.json does not exist)\n */\nexport function shouldRunFirstTimeSetup(settingsPath: string = getSettingsPath()): boolean {\n\tif (\n\t\t!isOfficialDistribution({\n\t\t\tpackageName: PACKAGE_NAME,\n\t\t\tappName: APP_NAME,\n\t\t\tconfigDirName: CONFIG_DIR_NAME,\n\t\t})\n\t) {\n\t\treturn false;\n\t}\n\tif (!areExperimentalFeaturesEnabled()) {\n\t\treturn false;\n\t}\n\tif (process.env[ENV_AGENT_DIR]) {\n\t\treturn false;\n\t}\n\treturn !existsSync(settingsPath);\n}\n\nexport async function showStartupSelector<T>(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\toptions: Array<{ label: string; value: T }>,\n): Promise<T | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: T | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst selector = new ExtensionSelectorComponent(\n\t\t\ttitle,\n\t\t\toptions.map((option) => option.label),\n\t\t\t(option) => void finish(options.find((entry) => entry.label === option)?.value),\n\t\t\t() => void finish(undefined),\n\t\t\t{ tui: ui },\n\t\t);\n\t\tui.addChild(selector);\n\t\tui.setFocus(selector);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n\n/** Show the first-time setup dialog and persist the result */\nexport async function showFirstTimeSetup(settingsManager: SettingsManager): Promise<void> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: FirstTimeSetupResult | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tif (result) {\n\t\t\t\tsettingsManager.setTheme(result.theme);\n\t\t\t\tsettingsManager.setEnableAnalytics(result.shareAnalytics);\n\t\t\t\tawait settingsManager.flush();\n\t\t\t}\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve();\n\t\t};\n\n\t\tconst showSetup = async () => {\n\t\t\tui.start();\n\t\t\tconst detectedTheme = await detectTerminalThemeForAuto({ ui, timeoutMs: 100 });\n\t\t\tsetTheme(detectedTheme);\n\t\t\tconst component = new FirstTimeSetupComponent({\n\t\t\t\tdetectedTheme,\n\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\tsetTheme(themeName);\n\t\t\t\t\tui.requestRender();\n\t\t\t\t},\n\t\t\t\tonSubmit: (result) => void finish(result),\n\t\t\t\tonCancel: () => void finish(undefined),\n\t\t\t});\n\t\t\tui.addChild(component);\n\t\t\tui.setFocus(component);\n\t\t\tui.requestRender();\n\t\t};\n\n\t\tvoid showSetup();\n\t});\n}\n\nexport async function showStartupInput(\n\tsettingsManager: SettingsManager,\n\ttitle: string,\n\tplaceholder?: string,\n): Promise<string | undefined> {\n\tconst ui = await createStartupTui(settingsManager);\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = async (result: string | undefined) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tinput.dispose();\n\t\t\tawait clearStartupTui(ui);\n\t\t\tui.stop();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst input = new ExtensionInputComponent(\n\t\t\ttitle,\n\t\t\tplaceholder,\n\t\t\t(value) => void finish(value),\n\t\t\t() => void finish(undefined),\n\t\t\t{\n\t\t\t\ttui: ui,\n\t\t\t},\n\t\t);\n\t\tui.addChild(input);\n\t\tui.setFocus(input);\n\t\tstartStartupTui(ui, settingsManager);\n\t});\n}\n"]}
|