diff --git a/bin/lib/credentials.js b/bin/lib/credentials.js index aed63507308..f8f6acfb0c7 100644 --- a/bin/lib/credentials.js +++ b/bin/lib/credentials.js @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 // -// Thin re-export shim — the implementation lives in src/lib/credentials.ts, -// compiled to dist/lib/credentials.js. +// Thin re-export shim — the implementation lives in src/lib/credentials/store.ts, +// compiled to dist/lib/credentials/store.js. -const mod = require("../../dist/lib/credentials"); +const mod = require("../../dist/lib/credentials/store"); const exports_ = { ...mod }; diff --git a/bin/lib/ports.js b/bin/lib/ports.js index f6106f4a229..8e058a6f16c 100644 --- a/bin/lib/ports.js +++ b/bin/lib/ports.js @@ -5,4 +5,4 @@ // Override any port via environment variables. // Based on the approach from jnun (PR #683). -module.exports = require("../../dist/lib/ports"); +module.exports = require("../../dist/lib/core/ports"); diff --git a/scripts/check-legacy-migrated-paths.ts b/scripts/check-legacy-migrated-paths.ts index 8cffad1a7af..7249e09b81c 100644 --- a/scripts/check-legacy-migrated-paths.ts +++ b/scripts/check-legacy-migrated-paths.ts @@ -38,7 +38,7 @@ const REMOVED_SHIM_MOVES: Record = { "bin/lib/runtime-recovery.js": "src/lib/runtime-recovery.ts", "bin/lib/sandbox-build-context.js": "src/lib/sandbox-build-context.ts", "bin/lib/services.js": "src/lib/services.ts", - "bin/lib/version.js": "src/lib/version.ts", + "bin/lib/version.js": "src/lib/core/version.ts", "bin/lib/onboard.js": "src/lib/onboard.ts", "bin/lib/policies.js": "src/lib/policies.ts", "bin/lib/runner.js": "src/lib/runner.ts", diff --git a/scripts/dev-tier-selector.js b/scripts/dev-tier-selector.js index 38b1d01aca5..49aa6884292 100644 --- a/scripts/dev-tier-selector.js +++ b/scripts/dev-tier-selector.js @@ -18,7 +18,7 @@ const readline = require("readline"); // ── Stubs ────────────────────────────────────────────────────────────────── -const creds = require("../dist/lib/credentials.js"); +const creds = require("../dist/lib/credentials/store.js"); const runner = require("../dist/lib/runner.js"); const registry = require("../dist/lib/state/registry.js"); diff --git a/scripts/generate-openclaw-config.py b/scripts/generate-openclaw-config.py index a37852f1c38..48df4187f86 100755 --- a/scripts/generate-openclaw-config.py +++ b/scripts/generate-openclaw-config.py @@ -69,7 +69,7 @@ def _coerce_positive_int(env: dict, name: str, default: int) -> int: def is_loopback(hostname: str) -> bool: """Check if a hostname is a loopback address. - Mirrors isLoopbackHostname() from src/lib/url-utils.ts. + Mirrors isLoopbackHostname() from src/lib/core/url-utils.ts. Returns True for localhost, ::1, and 127.x.x.x addresses. """ normalized = (hostname or "").strip().lower().strip("[]") diff --git a/scripts/ts-migration-assist.ts b/scripts/ts-migration-assist.ts index 60633acdc62..12fb112e711 100644 --- a/scripts/ts-migration-assist.ts +++ b/scripts/ts-migration-assist.ts @@ -26,7 +26,7 @@ const SPECIAL_REWRITES: Record> = { ['require("./inference-config")', 'require("../../bin/lib/inference-config")'], ['require("./platform")', 'require("../../bin/lib/platform")'], ['require("./resolve-openshell")', 'require("../../bin/lib/resolve-openshell")'], - ['require("./credentials")', 'require("../../bin/lib/credentials")'], + ['require("./credentials/store")', 'require("../../bin/lib/credentials")'], ['require("./state/registry")', 'require("../../bin/lib/registry")'], ['require("./nim")', 'require("../../bin/lib/nim")'], ['require("./onboard-session")', 'require("../../bin/lib/onboard-session")'], diff --git a/src/lib/actions/deploy.ts b/src/lib/actions/deploy.ts index 6fc24e2c8e1..267c450a032 100644 --- a/src/lib/actions/deploy.ts +++ b/src/lib/actions/deploy.ts @@ -3,7 +3,7 @@ import { execFileSync, spawnSync } from "node:child_process"; -import { getCredential } from "../credentials"; +import { getCredential } from "../credentials/store"; import { executeDeploy } from "../deploy"; import { ROOT, run, runInteractive, shellQuote, validateName } from "../runner"; diff --git a/src/lib/actions/maintenance.ts b/src/lib/actions/maintenance.ts index e10a589c018..d4fc970bebd 100644 --- a/src/lib/actions/maintenance.ts +++ b/src/lib/actions/maintenance.ts @@ -3,7 +3,7 @@ /* v8 ignore start -- exercised through CLI subprocess maintenance tests. */ -import { prompt as askPrompt } from "../credentials"; +import { prompt as askPrompt } from "../credentials/store"; import { type GarbageCollectImagesOptions, normalizeGarbageCollectImagesOptions, diff --git a/src/lib/actions/root-help.ts b/src/lib/actions/root-help.ts index c1d39fd3274..127b9106020 100644 --- a/src/lib/actions/root-help.ts +++ b/src/lib/actions/root-help.ts @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { AGENT_PRODUCT_NAME, CLI_DISPLAY_NAME, CLI_NAME } from "../branding"; -import { commandsByGroup, visibleCommands, type CommandDef } from "../command-registry"; +import { AGENT_PRODUCT_NAME, CLI_DISPLAY_NAME, CLI_NAME } from "../cli/branding"; +import { commandsByGroup, visibleCommands, type CommandDef } from "../cli/command-registry"; import { getRegisteredOclifCommandSummary } from "../cli/oclif-metadata"; -import { getVersion } from "../version"; +import { getVersion } from "../core/version"; const useColor = !process.env.NO_COLOR && !!process.stdout.isTTY; const trueColor = diff --git a/src/lib/actions/sandbox/connect.ts b/src/lib/actions/sandbox/connect.ts index 8876d2071db..01ae7d5074f 100644 --- a/src/lib/actions/sandbox/connect.ts +++ b/src/lib/actions/sandbox/connect.ts @@ -6,7 +6,7 @@ import { spawnSync } from "node:child_process"; import os from "node:os"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { parseGatewayInference } from "../../inference-config"; import { ensureOllamaAuthProxy } from "../../onboard-ollama-proxy"; import { @@ -24,7 +24,7 @@ import { } from "../../state/sandbox-session"; import { checkAndRecoverSandboxProcesses } from "./process-recovery"; import * as sandboxVersion from "../../sandbox-version"; -import { D, G, R, YW } from "../../terminal-style"; +import { D, G, R, YW } from "../../cli/terminal-style"; import { resolveOpenshell } from "../../adapters/openshell/resolve"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/sandbox/destroy.ts b/src/lib/actions/sandbox/destroy.ts index 79e27da0537..ddcf8433ae1 100644 --- a/src/lib/actions/sandbox/destroy.ts +++ b/src/lib/actions/sandbox/destroy.ts @@ -5,8 +5,8 @@ import fs from "node:fs"; -import { CLI_NAME } from "../../branding"; -import { prompt as askPrompt } from "../../credentials"; +import { CLI_NAME } from "../../cli/branding"; +import { prompt as askPrompt } from "../../credentials/store"; import { type DestroySandboxOptions, normalizeDestroySandboxOptions, @@ -14,7 +14,7 @@ import { import * as onboardSession from "../../onboard-session"; import type { Session } from "../../onboard-session"; import { OPENSHELL_PROBE_TIMEOUT_MS } from "../../adapters/openshell/timeouts"; -import { DASHBOARD_PORT } from "../../ports"; +import { DASHBOARD_PORT } from "../../core/ports"; import * as registry from "../../state/registry"; import { resolveOpenshell } from "../../adapters/openshell/resolve"; import { parseLiveSandboxNames } from "../../runtime-recovery"; @@ -27,7 +27,7 @@ import { shouldCleanupGatewayAfterDestroy, shouldStopHostServicesAfterDestroy, } from "../../domain/sandbox/destroy"; -import { G, R, YW } from "../../terminal-style"; +import { G, R, YW } from "../../cli/terminal-style"; type DockerRmi = (tag: string, opts?: { ignoreError?: boolean }) => { status: number | null }; diff --git a/src/lib/actions/sandbox/doctor.ts b/src/lib/actions/sandbox/doctor.ts index 83d17aaa08e..b2a821a88c9 100644 --- a/src/lib/actions/sandbox/doctor.ts +++ b/src/lib/actions/sandbox/doctor.ts @@ -7,15 +7,15 @@ import { execFileSync, spawnSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; -import { CLI_DISPLAY_NAME, CLI_NAME } from "../../branding"; -import { isErrnoException } from "../../errno"; +import { CLI_DISPLAY_NAME, CLI_NAME } from "../../cli/branding"; +import { isErrnoException } from "../../core/errno"; import { recoverNamedGatewayRuntime } from "../../gateway-runtime-action"; import { probeProviderHealth } from "../../inference-health"; import { parseGatewayInference } from "../../inference-config"; import { stripAnsi } from "../../adapters/openshell/client"; import { captureOpenshell } from "../../adapters/openshell/runtime"; import { OPENSHELL_PROBE_TIMEOUT_MS } from "../../adapters/openshell/timeouts"; -import { GATEWAY_PORT, OLLAMA_PORT } from "../../ports"; +import { GATEWAY_PORT, OLLAMA_PORT } from "../../core/ports"; import * as registry from "../../state/registry"; import type { SandboxEntry } from "../../state/registry"; import { resolveOpenshell } from "../../adapters/openshell/resolve"; @@ -24,7 +24,7 @@ import { parseLiveSandboxNames } from "../../runtime-recovery"; import * as sandboxVersion from "../../sandbox-version"; import * as shields from "../../shields"; import { buildStatusCommandDeps } from "../../status-command-deps"; -import { B, D, G, R, RD, YW } from "../../terminal-style"; +import { B, D, G, R, RD, YW } from "../../cli/terminal-style"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/sandbox/gateway-state.ts b/src/lib/actions/sandbox/gateway-state.ts index d687594275e..b3aecb2ab13 100644 --- a/src/lib/actions/sandbox/gateway-state.ts +++ b/src/lib/actions/sandbox/gateway-state.ts @@ -7,7 +7,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { CLI_DISPLAY_NAME, CLI_NAME } from "../../branding"; +import { CLI_DISPLAY_NAME, CLI_NAME } from "../../cli/branding"; import { parseSandboxPhase } from "../../state/gateway"; import { getNamedGatewayLifecycleState, diff --git a/src/lib/actions/sandbox/policy-channel.ts b/src/lib/actions/sandbox/policy-channel.ts index a7766bad35d..493fc6aa70c 100644 --- a/src/lib/actions/sandbox/policy-channel.ts +++ b/src/lib/actions/sandbox/policy-channel.ts @@ -6,9 +6,9 @@ import fs from "node:fs"; import path from "node:path"; -import { CLI_DISPLAY_NAME, CLI_NAME } from "../../branding"; -import { hashCredential } from "../../credential-hash"; -import { getCredential, prompt as askPrompt } from "../../credentials"; +import { CLI_DISPLAY_NAME, CLI_NAME } from "../../cli/branding"; +import { hashCredential } from "../../security/credential-hash"; +import { getCredential, prompt as askPrompt } from "../../credentials/store"; import { recoverNamedGatewayRuntime } from "../../gateway-runtime-action"; const { isNonInteractive } = require("../../onboard") as { isNonInteractive: () => boolean }; const onboardProviders = require("../../onboard-providers"); diff --git a/src/lib/actions/sandbox/process-recovery.ts b/src/lib/actions/sandbox/process-recovery.ts index 3686b28da99..cecdafb6ac2 100644 --- a/src/lib/actions/sandbox/process-recovery.ts +++ b/src/lib/actions/sandbox/process-recovery.ts @@ -8,7 +8,7 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { DASHBOARD_PORT } from "../../ports"; +import { DASHBOARD_PORT } from "../../core/ports"; import { ROOT, shellQuote } from "../../runner"; import { captureOpenshell, @@ -19,8 +19,8 @@ import { } from "../../adapters/openshell/runtime"; import { OPENSHELL_PROBE_TIMEOUT_MS } from "../../adapters/openshell/timeouts"; import { parseForwardList } from "../../state/sandbox-session"; -import { G, R } from "../../terminal-style"; -import { sleepSeconds } from "../../wait"; +import { G, R } from "../../cli/terminal-style"; +import { sleepSeconds } from "../../core/wait"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/sandbox/rebuild.ts b/src/lib/actions/sandbox/rebuild.ts index 255096db9b3..1387f1b9a69 100644 --- a/src/lib/actions/sandbox/rebuild.ts +++ b/src/lib/actions/sandbox/rebuild.ts @@ -3,8 +3,8 @@ /* v8 ignore start -- exercised through CLI subprocess rebuild tests. */ -import { CLI_NAME } from "../../branding"; -import { prompt as askPrompt } from "../../credentials"; +import { CLI_NAME } from "../../cli/branding"; +import { prompt as askPrompt } from "../../credentials/store"; import { normalizeRebuildSandboxOptions, type RebuildSandboxOptions, @@ -37,7 +37,7 @@ import { } from "../../state/sandbox-session"; import * as sandboxState from "../../state/sandbox"; import * as sandboxVersion from "../../sandbox-version"; -import { B, D, G, R, RD as _RD, YW } from "../../terminal-style"; +import { B, D, G, R, RD as _RD, YW } from "../../cli/terminal-style"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/sandbox/skill-install.ts b/src/lib/actions/sandbox/skill-install.ts index 19d84768b9e..a671faa0130 100644 --- a/src/lib/actions/sandbox/skill-install.ts +++ b/src/lib/actions/sandbox/skill-install.ts @@ -7,11 +7,11 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { captureOpenshell } from "../../adapters/openshell/runtime"; import { ensureLiveSandboxOrExit } from "./gateway-state"; import * as skillInstall from "../../skill-install"; -import { D, G, R, YW } from "../../terminal-style"; +import { D, G, R, YW } from "../../cli/terminal-style"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/sandbox/snapshot.ts b/src/lib/actions/sandbox/snapshot.ts index 024f36c54a9..2a6ecb21b46 100644 --- a/src/lib/actions/sandbox/snapshot.ts +++ b/src/lib/actions/sandbox/snapshot.ts @@ -6,7 +6,7 @@ import fs from "node:fs"; import path from "node:path"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { dockerCapture, dockerInspect } from "../../adapters/docker"; import { parseLiveSandboxNames } from "../../runtime-recovery"; import { ROOT, run, shellQuote, validateName } from "../../runner"; diff --git a/src/lib/actions/sandbox/status.ts b/src/lib/actions/sandbox/status.ts index 9e998b01dd2..4525658d290 100644 --- a/src/lib/actions/sandbox/status.ts +++ b/src/lib/actions/sandbox/status.ts @@ -3,7 +3,7 @@ /* v8 ignore start -- exercised through CLI subprocess status tests. */ -import { CLI_DISPLAY_NAME, CLI_NAME } from "../../branding"; +import { CLI_DISPLAY_NAME, CLI_NAME } from "../../cli/branding"; import { parseSandboxPhase } from "../../state/gateway"; import { getNamedGatewayLifecycleState } from "../../gateway-runtime-action"; import { parseGatewayInference } from "../../inference-config"; @@ -30,7 +30,7 @@ import { } from "../../state/sandbox-session"; import * as sandboxVersion from "../../sandbox-version"; import * as shields from "../../shields"; -import { D, G, R, RD, YW } from "../../terminal-style"; +import { D, G, R, RD, YW } from "../../cli/terminal-style"; const agentRuntime = require("../../../../bin/lib/agent-runtime"); diff --git a/src/lib/actions/upgrade-sandboxes.ts b/src/lib/actions/upgrade-sandboxes.ts index 71993a7cc05..d5cdf83d4f4 100644 --- a/src/lib/actions/upgrade-sandboxes.ts +++ b/src/lib/actions/upgrade-sandboxes.ts @@ -3,8 +3,8 @@ /* v8 ignore start -- exercised through CLI subprocess upgrade tests. */ -import { CLI_NAME } from "../branding"; -import { prompt as askPrompt } from "../credentials"; +import { CLI_NAME } from "../cli/branding"; +import { prompt as askPrompt } from "../credentials/store"; import { normalizeUpgradeSandboxesOptions, type UpgradeSandboxesOptions, @@ -14,7 +14,7 @@ import * as registry from "../state/registry"; import { parseLiveSandboxNames } from "../runtime-recovery"; import { rebuildSandbox } from "./sandbox/rebuild"; import * as sandboxVersion from "../sandbox-version"; -import { B, D, G, R, YW } from "../terminal-style"; +import { B, D, G, R, YW } from "../cli/terminal-style"; import { classifyUpgradeableSandboxes, shouldSkipUpgradeConfirmation, diff --git a/src/lib/agent/defs.ts b/src/lib/agent/defs.ts index 895e621f9d6..c794f2dd6ff 100644 --- a/src/lib/agent/defs.ts +++ b/src/lib/agent/defs.ts @@ -8,7 +8,7 @@ import fs from "node:fs"; import path from "node:path"; import { ROOT } from "../runner"; -import { DASHBOARD_PORT } from "../ports"; +import { DASHBOARD_PORT } from "../core/ports"; export const AGENTS_DIR = path.join(ROOT, "agents"); diff --git a/src/lib/agent/onboard.ts b/src/lib/agent/onboard.ts index 257bd6bc3e6..d4be11f3059 100644 --- a/src/lib/agent/onboard.ts +++ b/src/lib/agent/onboard.ts @@ -10,12 +10,12 @@ import os from "os"; import path from "path"; import { dockerBuild, dockerImageInspect } from "../adapters/docker"; -import { getAgentBranding } from "../branding"; +import { getAgentBranding } from "../cli/branding"; import { getProviderSelectionConfig } from "../inference-config"; -import type { JsonObject as LooseObject, JsonValue as LooseValue } from "../json-types"; +import type { JsonObject as LooseObject, JsonValue as LooseValue } from "../core/json-types"; import * as onboardSession from "../onboard-session"; import { ROOT, redact, run, shellQuote } from "../runner"; -import { sleepSeconds } from "../wait"; +import { sleepSeconds } from "../core/wait"; import { type AgentDefinition, loadAgent, resolveAgentName } from "./defs"; export interface OnboardContext { diff --git a/src/lib/agent/runtime.ts b/src/lib/agent/runtime.ts index 1520f434a6b..f63a0be745b 100644 --- a/src/lib/agent/runtime.ts +++ b/src/lib/agent/runtime.ts @@ -7,7 +7,7 @@ // When the session agent is openclaw (or absent), all functions return // defaults that match the hardcoded OpenClaw values on main. -import { DASHBOARD_PORT } from "../ports"; +import { DASHBOARD_PORT } from "../core/ports"; import { shellQuote } from "../runner"; import * as onboardSession from "../onboard-session"; import * as registry from "../state/registry"; diff --git a/src/lib/build-context.ts b/src/lib/build-context.ts index 7600e3c08b5..7532c7fd024 100644 --- a/src/lib/build-context.ts +++ b/src/lib/build-context.ts @@ -6,7 +6,7 @@ * creation failures. */ -import { CLI_NAME } from "./branding"; +import { CLI_NAME } from "./cli/branding"; import fs from "node:fs"; import path from "node:path"; diff --git a/src/lib/branding.ts b/src/lib/cli/branding.ts similarity index 100% rename from src/lib/branding.ts rename to src/lib/cli/branding.ts diff --git a/src/lib/command-display-metadata.test.ts b/src/lib/cli/command-display-metadata.test.ts similarity index 95% rename from src/lib/command-display-metadata.test.ts rename to src/lib/cli/command-display-metadata.test.ts index 5002c4ec966..5b6ba9d8eba 100644 --- a/src/lib/command-display-metadata.test.ts +++ b/src/lib/cli/command-display-metadata.test.ts @@ -4,7 +4,7 @@ import { Config as OclifConfig } from "@oclif/core"; import { describe, expect, it } from "vitest"; -import { getRegisteredOclifCommandsMetadata } from "./cli/oclif-metadata"; +import { getRegisteredOclifCommandsMetadata } from "./oclif-metadata"; import { COMMANDS, visibleCommands } from "./command-registry"; describe("public command display metadata", () => { diff --git a/src/lib/command-registry.test.ts b/src/lib/cli/command-registry.test.ts similarity index 100% rename from src/lib/command-registry.test.ts rename to src/lib/cli/command-registry.test.ts diff --git a/src/lib/command-registry.ts b/src/lib/cli/command-registry.ts similarity index 95% rename from src/lib/command-registry.ts rename to src/lib/cli/command-registry.ts index c9040c16c0d..bd2af9772a0 100644 --- a/src/lib/command-registry.ts +++ b/src/lib/cli/command-registry.ts @@ -16,10 +16,10 @@ */ import { CLI_NAME } from "./branding"; -import type { CommandDisplayEntry, CommandGroup } from "./cli/command-display"; -import { getRegisteredOclifCommandsMetadata } from "./cli/oclif-metadata"; +import type { CommandDisplayEntry, CommandGroup } from "./command-display"; +import { getRegisteredOclifCommandsMetadata } from "./oclif-metadata"; -export type { CommandGroup } from "./cli/command-display"; +export type { CommandGroup } from "./command-display"; /** Replace the canonical "nemoclaw" prefix in a usage string with CLI_NAME. */ export function brandedUsage(usage: string): string { diff --git a/src/lib/duration-flags.test.ts b/src/lib/cli/duration-flags.test.ts similarity index 100% rename from src/lib/duration-flags.test.ts rename to src/lib/cli/duration-flags.test.ts diff --git a/src/lib/duration-flags.ts b/src/lib/cli/duration-flags.ts similarity index 95% rename from src/lib/duration-flags.ts rename to src/lib/cli/duration-flags.ts index b82542223dd..9f36e6a9efb 100644 --- a/src/lib/duration-flags.ts +++ b/src/lib/cli/duration-flags.ts @@ -3,7 +3,7 @@ import { Errors, Flags } from "@oclif/core"; -import { parseDuration } from "./domain/duration"; +import { parseDuration } from "../domain/duration"; const LOGS_SINCE_DURATION_RE = /^[1-9]\d*(?:ms|s|m|h|d)$/i; diff --git a/src/lib/oclif-command-metadata.test.ts b/src/lib/cli/oclif-command-metadata.test.ts similarity index 100% rename from src/lib/oclif-command-metadata.test.ts rename to src/lib/cli/oclif-command-metadata.test.ts diff --git a/src/lib/cli/oclif-dispatch.ts b/src/lib/cli/oclif-dispatch.ts index 23204abd3e2..e408e365f36 100644 --- a/src/lib/cli/oclif-dispatch.ts +++ b/src/lib/cli/oclif-dispatch.ts @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { sandboxCommands } from "../command-registry"; +import { sandboxCommands } from "./command-registry"; export type OclifDispatch = { kind: "oclif"; diff --git a/src/lib/cli/oclif-runner.ts b/src/lib/cli/oclif-runner.ts index 30bc0baba2d..574f7bf32a4 100644 --- a/src/lib/cli/oclif-runner.ts +++ b/src/lib/cli/oclif-runner.ts @@ -3,7 +3,7 @@ import { Config as OclifConfig, execute as executeOclif } from "@oclif/core"; -import { CLI_NAME } from "../branding"; +import { CLI_NAME } from "./branding"; export interface OclifCommandRunOptions { rootDir: string; diff --git a/src/lib/cli/public-oclif-help.ts b/src/lib/cli/public-oclif-help.ts index 28a657fd1b9..9d38add14e1 100644 --- a/src/lib/cli/public-oclif-help.ts +++ b/src/lib/cli/public-oclif-help.ts @@ -3,7 +3,7 @@ import { CommandHelp } from "@oclif/core"; -import { CLI_NAME } from "../branding"; +import { CLI_NAME } from "./branding"; import { getRegisteredOclifCommandMetadata, type OclifCommandMetadata } from "./oclif-metadata"; type PublicHelpCommand = OclifCommandMetadata & { diff --git a/src/lib/terminal-style.test.ts b/src/lib/cli/terminal-style.test.ts similarity index 100% rename from src/lib/terminal-style.test.ts rename to src/lib/cli/terminal-style.test.ts diff --git a/src/lib/terminal-style.ts b/src/lib/cli/terminal-style.ts similarity index 100% rename from src/lib/terminal-style.ts rename to src/lib/cli/terminal-style.ts diff --git a/src/lib/commands/credentials.test.ts b/src/lib/commands/credentials.test.ts index b0d784aaa14..eca150e5704 100644 --- a/src/lib/commands/credentials.test.ts +++ b/src/lib/commands/credentials.test.ts @@ -9,7 +9,7 @@ const mocks = vi.hoisted(() => ({ runOpenshellProviderCommand: vi.fn(), })); -vi.mock("../credentials", () => ({ prompt: mocks.prompt })); +vi.mock("../credentials/store", () => ({ prompt: mocks.prompt })); vi.mock("../actions/global", () => ({ recoverNamedGatewayRuntime: mocks.recoverNamedGatewayRuntime, runOpenshellProviderCommand: mocks.runOpenshellProviderCommand, diff --git a/src/lib/commands/credentials/common.ts b/src/lib/commands/credentials/common.ts index f48de6686e2..9ebdb0ef3e2 100644 --- a/src/lib/commands/credentials/common.ts +++ b/src/lib/commands/credentials/common.ts @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { CLI_DISPLAY_NAME, CLI_NAME } from "../../branding"; +import { CLI_DISPLAY_NAME, CLI_NAME } from "../../cli/branding"; import { recoverNamedGatewayRuntime } from "../../actions/global"; // Suffixes that mark per-sandbox messaging integrations in the gateway's diff --git a/src/lib/commands/credentials/list.ts b/src/lib/commands/credentials/list.ts index 86a165fc0c9..cffd4cc4479 100644 --- a/src/lib/commands/credentials/list.ts +++ b/src/lib/commands/credentials/list.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { runOpenshellProviderCommand } from "../../actions/global"; import { OPENSHELL_OPERATION_TIMEOUT_MS } from "../../adapters/openshell/timeouts"; import { isBridgeProviderName, recoverGatewayOrExit } from "./common"; diff --git a/src/lib/commands/credentials/reset.ts b/src/lib/commands/credentials/reset.ts index f86e8d0f6ae..4b2265b9fa6 100644 --- a/src/lib/commands/credentials/reset.ts +++ b/src/lib/commands/credentials/reset.ts @@ -3,8 +3,8 @@ import { Args, Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../branding"; -import { prompt as askPrompt } from "../../credentials"; +import { CLI_NAME } from "../../cli/branding"; +import { prompt as askPrompt } from "../../credentials/store"; import { runOpenshellProviderCommand } from "../../actions/global"; import { OPENSHELL_OPERATION_TIMEOUT_MS } from "../../adapters/openshell/timeouts"; import { isBridgeProviderName, recoverGatewayOrExit } from "./common"; diff --git a/src/lib/commands/debug.ts b/src/lib/commands/debug.ts index 5f22b577ccc..c846d7b1529 100644 --- a/src/lib/commands/debug.ts +++ b/src/lib/commands/debug.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../branding"; +import { CLI_NAME } from "../cli/branding"; import { runDebug } from "../diagnostics/debug"; import type { DebugOptions } from "../diagnostics/debug"; import type { RunDebugCommandDeps } from "../diagnostics/debug-command"; diff --git a/src/lib/commands/deprecated/start.ts b/src/lib/commands/deprecated/start.ts index cf93d209060..b680d4d8809 100644 --- a/src/lib/commands/deprecated/start.ts +++ b/src/lib/commands/deprecated/start.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { startAll } from "../../services"; import { runStartCommand } from "../../services-command"; import { serviceDeps } from "../tunnel/common"; diff --git a/src/lib/commands/deprecated/stop.ts b/src/lib/commands/deprecated/stop.ts index 61cbe01e94f..95ac2ecf980 100644 --- a/src/lib/commands/deprecated/stop.ts +++ b/src/lib/commands/deprecated/stop.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { stopAll } from "../../services"; import { runStopCommand } from "../../services-command"; import { serviceDeps } from "../tunnel/common"; diff --git a/src/lib/commands/sandbox/config/get.ts b/src/lib/commands/sandbox/config/get.ts index 78fb46427c9..2509d44bf31 100644 --- a/src/lib/commands/sandbox/config/get.ts +++ b/src/lib/commands/sandbox/config/get.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../../branding"; +import { CLI_NAME } from "../../../cli/branding"; import * as sandboxConfig from "../../../sandbox-config"; import { sandboxNameArg } from "../common"; diff --git a/src/lib/commands/sandbox/connect.ts b/src/lib/commands/sandbox/connect.ts index 8082e657945..13825f85f82 100644 --- a/src/lib/commands/sandbox/connect.ts +++ b/src/lib/commands/sandbox/connect.ts @@ -3,7 +3,7 @@ import { Args, Command, Flags } from "@oclif/core"; -import { CLI_NAME } from "../../branding"; +import { CLI_NAME } from "../../cli/branding"; import { connectSandbox } from "../../actions/sandbox/runtime"; export default class ConnectCliCommand extends Command { diff --git a/src/lib/commands/sandbox/logs.ts b/src/lib/commands/sandbox/logs.ts index e6b64a60a86..97b45a5a955 100644 --- a/src/lib/commands/sandbox/logs.ts +++ b/src/lib/commands/sandbox/logs.ts @@ -3,7 +3,7 @@ import { Args, Command, Flags } from "@oclif/core"; -import { logsSinceDurationFlag } from "../../duration-flags"; +import { logsSinceDurationFlag } from "../../cli/duration-flags"; import type { SandboxLogsOptions } from "../../domain/sandbox/log-options"; import { DEFAULT_SANDBOX_LOG_LINES } from "../../domain/sandbox/log-options"; import { showSandboxLogs } from "../../actions/sandbox/runtime"; diff --git a/src/lib/commands/sandbox/shields/down.ts b/src/lib/commands/sandbox/shields/down.ts index 7571f73aa7c..2c0c0e39592 100644 --- a/src/lib/commands/sandbox/shields/down.ts +++ b/src/lib/commands/sandbox/shields/down.ts @@ -3,7 +3,7 @@ import { Command, Flags } from "@oclif/core"; -import { shieldsTimeoutDurationFlag } from "../../../duration-flags"; +import { shieldsTimeoutDurationFlag } from "../../../cli/duration-flags"; import * as shields from "../../../shields"; import { sandboxNameArg } from "../common"; diff --git a/src/lib/commands/simple-global-oclif-adapters.test.ts b/src/lib/commands/simple-global-oclif-adapters.test.ts index 95f84bcc3fc..8f3d6cb2535 100644 --- a/src/lib/commands/simple-global-oclif-adapters.test.ts +++ b/src/lib/commands/simple-global-oclif-adapters.test.ts @@ -48,7 +48,7 @@ vi.mock("../uninstall-command", () => ({ buildVersionedUninstallUrl: mocks.buildVersionedUninstallUrl, runUninstallCommand: mocks.runUninstallCommand, })); -vi.mock("../version", () => ({ getVersion: mocks.getVersion })); +vi.mock("../core/version", () => ({ getVersion: mocks.getVersion })); import DebugCliCommand from "./debug"; import DeployCliCommand from "./deploy"; diff --git a/src/lib/commands/uninstall.ts b/src/lib/commands/uninstall.ts index 78e34fedc2a..620044dc497 100644 --- a/src/lib/commands/uninstall.ts +++ b/src/lib/commands/uninstall.ts @@ -5,7 +5,7 @@ import { spawnSync } from "node:child_process"; import { Command, Flags } from "@oclif/core"; -import { getVersion } from "../version"; +import { getVersion } from "../core/version"; import { buildVersionedUninstallUrl, runUninstallCommand } from "../uninstall-command"; export default class UninstallCliCommand extends Command { diff --git a/test/errno.test.ts b/src/lib/core/errno.test.ts similarity index 97% rename from test/errno.test.ts rename to src/lib/core/errno.test.ts index 0a12498559c..9fdd784a30f 100644 --- a/test/errno.test.ts +++ b/src/lib/core/errno.test.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { describe, it, expect } from "vitest"; -import { isErrnoException, isPermissionError } from "../src/lib/errno"; +import { isErrnoException, isPermissionError } from "./errno"; describe("isErrnoException", () => { it("returns true for Error with code property", () => { diff --git a/src/lib/errno.ts b/src/lib/core/errno.ts similarity index 100% rename from src/lib/errno.ts rename to src/lib/core/errno.ts diff --git a/src/lib/json-types.ts b/src/lib/core/json-types.ts similarity index 100% rename from src/lib/json-types.ts rename to src/lib/core/json-types.ts diff --git a/src/lib/ports.test.ts b/src/lib/core/ports.test.ts similarity index 97% rename from src/lib/ports.test.ts rename to src/lib/core/ports.test.ts index 3769c2bf8bd..117d219072f 100644 --- a/src/lib/ports.test.ts +++ b/src/lib/core/ports.test.ts @@ -3,7 +3,7 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest"; // Import from compiled dist/ so coverage is attributed correctly. -import { parsePort } from "../../dist/lib/ports"; +import { parsePort } from "../../../dist/lib/core/ports"; describe("parsePort", () => { const ENV_KEY = "TEST_PORT"; diff --git a/src/lib/ports.ts b/src/lib/core/ports.ts similarity index 100% rename from src/lib/ports.ts rename to src/lib/core/ports.ts diff --git a/src/lib/shell-quote.ts b/src/lib/core/shell-quote.ts similarity index 100% rename from src/lib/shell-quote.ts rename to src/lib/core/shell-quote.ts diff --git a/src/lib/url-utils.test.ts b/src/lib/core/url-utils.test.ts similarity index 98% rename from src/lib/url-utils.test.ts rename to src/lib/core/url-utils.test.ts index 69def4b8496..8527a897083 100644 --- a/src/lib/url-utils.test.ts +++ b/src/lib/core/url-utils.test.ts @@ -10,7 +10,7 @@ import { isLoopbackHostname, formatEnvAssignment, parsePolicyPresetEnv, -} from "../../dist/lib/url-utils"; +} from "../../../dist/lib/core/url-utils"; describe("compactText", () => { it("collapses whitespace", () => { diff --git a/src/lib/url-utils.ts b/src/lib/core/url-utils.ts similarity index 100% rename from src/lib/url-utils.ts rename to src/lib/core/url-utils.ts diff --git a/src/lib/version.test.ts b/src/lib/core/version.test.ts similarity index 96% rename from src/lib/version.test.ts rename to src/lib/core/version.test.ts index 6da6952a7c9..495ce370812 100644 --- a/src/lib/version.test.ts +++ b/src/lib/core/version.test.ts @@ -5,7 +5,7 @@ import { describe, it, expect, beforeAll, afterAll } from "vitest"; import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; -import { getVersion } from "../../dist/lib/version"; +import { getVersion } from "../../../dist/lib/core/version"; describe("lib/version", () => { let testDir: string; diff --git a/src/lib/version.ts b/src/lib/core/version.ts similarity index 92% rename from src/lib/version.ts rename to src/lib/core/version.ts index d6ff45808fa..e7f8bfadfaf 100644 --- a/src/lib/version.ts +++ b/src/lib/core/version.ts @@ -27,8 +27,8 @@ export interface VersionOptions { * 3. `package.json` version — hard-coded fallback */ export function getVersion(opts: VersionOptions = {}): string { - // Compiled location: dist/lib/version.js → repo root is 2 levels up - const root = opts.rootDir ?? join(__dirname, "..", ".."); + // Compiled location: dist/lib/core/version.js → repo root is 3 levels up + const root = opts.rootDir ?? join(__dirname, "..", "..", ".."); // 1. Try git (available in dev clones and CI) try { diff --git a/src/lib/wait.ts b/src/lib/core/wait.ts similarity index 100% rename from src/lib/wait.ts rename to src/lib/core/wait.ts diff --git a/src/lib/coverage-hotspots.test.ts b/src/lib/coverage-hotspots.test.ts index d33029e2a0e..f6241bf003d 100644 --- a/src/lib/coverage-hotspots.test.ts +++ b/src/lib/coverage-hotspots.test.ts @@ -9,7 +9,7 @@ import { describe, expect, it } from "vitest"; import { parseDuration } from "./domain/duration"; import { parseGatewayTokenArgs, runGatewayTokenCommand } from "./gateway-token-command"; import { resolveDefaultSandboxName, runStartCommand, runStopCommand } from "./services-command"; -import { getVersion } from "./version"; +import { getVersion } from "./core/version"; // Narrow coverage guard for small helper modules that are otherwise only // exercised through subprocess CLI flows in this migration stack. diff --git a/src/lib/credentials.ts b/src/lib/credentials/store.ts similarity index 99% rename from src/lib/credentials.ts rename to src/lib/credentials/store.ts index 760e3f99e66..4048a4757d0 100644 --- a/src/lib/credentials.ts +++ b/src/lib/credentials/store.ts @@ -14,8 +14,8 @@ import os from "node:os"; import path from "node:path"; import readline from "node:readline"; -import { rejectSymlinksOnPath } from "./state/config-io"; -import { isErrnoException } from "./errno"; +import { isErrnoException } from "../core/errno"; +import { rejectSymlinksOnPath } from "../state/config-io"; const UNSAFE_HOME_PATHS = new Set(["/tmp", "/var/tmp", "/dev/shm", "/"]); diff --git a/src/lib/dashboard/contract.ts b/src/lib/dashboard/contract.ts index 8de884156d2..bad23cc60fb 100644 --- a/src/lib/dashboard/contract.ts +++ b/src/lib/dashboard/contract.ts @@ -6,8 +6,8 @@ * Pure functions — no I/O, no process.env reads. */ -import { DASHBOARD_PORT } from "../ports"; -import { isLoopbackHostname } from "../url-utils"; +import { DASHBOARD_PORT } from "../core/ports"; +import { isLoopbackHostname } from "../core/url-utils"; export interface PlatformHints { chatUiUrl?: string; diff --git a/src/lib/deploy.ts b/src/lib/deploy.ts index 4dff47d1c93..aa3c6459289 100644 --- a/src/lib/deploy.ts +++ b/src/lib/deploy.ts @@ -6,7 +6,7 @@ import os from "node:os"; import path from "node:path"; import { NAME_ALLOWED_FORMAT, getNameValidationGuidance } from "./name-validation"; -import { sleepSeconds } from "./wait"; +import { sleepSeconds } from "./core/wait"; type ExecLikeValue = | string diff --git a/src/lib/diagnostics/debug.ts b/src/lib/diagnostics/debug.ts index b44b3f0b5c5..f1c0d0fc87a 100644 --- a/src/lib/diagnostics/debug.ts +++ b/src/lib/diagnostics/debug.ts @@ -7,7 +7,7 @@ import { platform, tmpdir } from "node:os"; import { basename, dirname, join } from "node:path"; import { dockerExecFileSync } from "../adapters/docker/exec"; -import { DASHBOARD_PORT } from "../ports"; +import { DASHBOARD_PORT } from "../core/ports"; import { listSandboxes } from "../state/registry"; // --------------------------------------------------------------------------- @@ -54,7 +54,7 @@ function section(title: string): void { // Secret redaction — delegates to unified redact module (#2381). // --------------------------------------------------------------------------- -import { redactFull as redact } from "../redact"; +import { redactFull as redact } from "../security/redact"; export { redact }; // --------------------------------------------------------------------------- diff --git a/src/lib/host-artifact-cleanup.ts b/src/lib/host-artifact-cleanup.ts index 17d51b6b5e4..a5144c4e186 100644 --- a/src/lib/host-artifact-cleanup.ts +++ b/src/lib/host-artifact-cleanup.ts @@ -12,7 +12,7 @@ // entry on STALE_FILES; the loop does not change. If a future leftover is a // folder or symlink instead of a file, widen the shape at that point. -import { removeLegacyCredentialsFileIfEmpty } from "./credentials"; +import { removeLegacyCredentialsFileIfEmpty } from "./credentials/store"; interface StaleHostFile { /** Human-readable description for the success log line. */ diff --git a/src/lib/http-probe.ts b/src/lib/http-probe.ts index 05f51c0ea90..87ebf4ea5b7 100644 --- a/src/lib/http-probe.ts +++ b/src/lib/http-probe.ts @@ -12,9 +12,9 @@ import { import type { ProbeResult } from "./onboard-types"; import { ROOT } from "./state/paths"; -import { compactText } from "./url-utils"; +import { compactText } from "./core/url-utils"; -import { isErrnoException } from "./errno"; +import { isErrnoException } from "./core/errno"; export type CurlProbeResult = ProbeResult; diff --git a/src/lib/inventory-commands.ts b/src/lib/inventory-commands.ts index de7de47da7b..01c174f503f 100644 --- a/src/lib/inventory-commands.ts +++ b/src/lib/inventory-commands.ts @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { CLI_NAME } from "./branding"; +import { CLI_NAME } from "./cli/branding"; import type { GatewayInference } from "./inference-config"; -import { redactFull } from "./redact"; +import { redactFull } from "./security/redact"; export interface SandboxEntry { name: string; diff --git a/src/lib/local-inference.ts b/src/lib/local-inference.ts index bb0d9ba4085..6085ac39eda 100644 --- a/src/lib/local-inference.ts +++ b/src/lib/local-inference.ts @@ -11,8 +11,8 @@ import { runCurlProbe } from "./http-probe"; const { shellQuote, runCapture } = require("./runner"); -import { VLLM_PORT, OLLAMA_PORT, OLLAMA_PROXY_PORT } from "./ports"; -import { sleepSeconds } from "./wait"; +import { VLLM_PORT, OLLAMA_PORT, OLLAMA_PROXY_PORT } from "./core/ports"; +import { sleepSeconds } from "./core/wait"; const { isWsl } = require("./platform"); diff --git a/src/lib/model-prompts.ts b/src/lib/model-prompts.ts index 5096d3d39eb..1b03dd590b7 100644 --- a/src/lib/model-prompts.ts +++ b/src/lib/model-prompts.ts @@ -6,7 +6,7 @@ import { isSafeModelId } from "./validation"; import { validateNvidiaEndpointModel } from "./provider-models"; // credentials.ts still uses CommonJS-style exports. -const { getCredential, prompt } = require("./credentials"); +const { getCredential, prompt } = require("./credentials/store"); export const BACK_TO_SELECTION = "__NEMOCLAW_BACK_TO_SELECTION__"; diff --git a/src/lib/nim.ts b/src/lib/nim.ts index a3e4491e807..75299db90cf 100644 --- a/src/lib/nim.ts +++ b/src/lib/nim.ts @@ -15,10 +15,10 @@ const { dockerRunDetached, dockerStop, } = require("./adapters/docker"); -const { sleepSeconds } = require("./wait"); +const { sleepSeconds } = require("./core/wait"); const nimImages = require("../../bin/lib/nim-images.json"); -import { VLLM_PORT } from "./ports"; +import { VLLM_PORT } from "./core/ports"; const UNIFIED_MEMORY_GPU_TAGS = ["GB10", "Thor", "Orin", "Xavier"]; const NIM_STATUS_PROBE_TIMEOUT_MS = 5000; diff --git a/src/lib/onboard-command.ts b/src/lib/onboard-command.ts index d8a707277a3..9abfaa2d9d9 100644 --- a/src/lib/onboard-command.ts +++ b/src/lib/onboard-command.ts @@ -4,7 +4,7 @@ import fs from "node:fs"; import path from "node:path"; -import { CLI_NAME } from "./branding"; +import { CLI_NAME } from "./cli/branding"; export interface OnboardCommandOptions { nonInteractive: boolean; diff --git a/src/lib/onboard-inference-probes.ts b/src/lib/onboard-inference-probes.ts index e1b00ffa4db..5dc8582a42d 100644 --- a/src/lib/onboard-inference-probes.ts +++ b/src/lib/onboard-inference-probes.ts @@ -5,7 +5,7 @@ // Inference endpoint probes — validate that a provider's API responds // before committing the onboard wizard to a model selection. -const { normalizeCredentialValue } = require("./credentials"); +const { normalizeCredentialValue } = require("./credentials/store"); const { isWsl } = require("./platform"); const httpProbe = require("./http-probe"); const { diff --git a/src/lib/onboard-ollama-proxy.ts b/src/lib/onboard-ollama-proxy.ts index 6d3c8438a81..df02749a765 100644 --- a/src/lib/onboard-ollama-proxy.ts +++ b/src/lib/onboard-ollama-proxy.ts @@ -11,7 +11,7 @@ const path = require("path"); const { spawn, spawnSync } = require("child_process"); const http = require("http"); const { ROOT, SCRIPTS, run, runCapture, shellQuote } = require("./runner"); -const { OLLAMA_PORT, OLLAMA_PROXY_PORT } = require("./ports"); +const { OLLAMA_PORT, OLLAMA_PROXY_PORT } = require("./core/ports"); const { getDefaultOllamaModel, getBootstrapOllamaModelOptions, @@ -23,7 +23,7 @@ const { validateOllamaModel, } = require("./local-inference"); const { buildSubprocessEnv } = require("./subprocess-env"); -const { prompt } = require("./credentials"); +const { prompt } = require("./credentials/store"); const { promptManualModelId } = require("./model-prompts"); // ── State ──────────────────────────────────────────────────────── diff --git a/src/lib/onboard-providers.ts b/src/lib/onboard-providers.ts index 499509deaea..ecd427159c7 100644 --- a/src/lib/onboard-providers.ts +++ b/src/lib/onboard-providers.ts @@ -11,7 +11,7 @@ const { VLLM_LOCAL_CREDENTIAL_ENV, } = require("./inference-config"); const { isSafeModelId } = require("./validation"); -const { compactText } = require("./url-utils"); +const { compactText } = require("./core/url-utils"); // ── Constants ──────────────────────────────────────────────────── diff --git a/src/lib/onboard-session.ts b/src/lib/onboard-session.ts index 5d40c58358c..30fa70472a0 100644 --- a/src/lib/onboard-session.ts +++ b/src/lib/onboard-session.ts @@ -10,8 +10,8 @@ import fs from "node:fs"; import path from "node:path"; -import { redactSensitiveText, redactUrl } from "./redact"; -import { isErrnoException } from "./errno"; +import { isErrnoException } from "./core/errno"; +import { redactSensitiveText, redactUrl } from "./security/redact"; import { sanitizeMessagingChannelConfig, type MessagingChannelConfig, @@ -23,7 +23,7 @@ export const SESSION_DIR = path.join(process.env.HOME || "/tmp", ".nemoclaw"); export const SESSION_FILE = path.join(SESSION_DIR, "onboard-session.json"); export const LOCK_FILE = path.join(SESSION_DIR, "onboard.lock"); -import type { JsonValue, JsonObject } from "./json-types"; +import type { JsonValue, JsonObject } from "./core/json-types"; // Session-specific aliases for the shared JSON types. type SessionJsonValue = JsonValue; diff --git a/src/lib/onboard-vllm.ts b/src/lib/onboard-vllm.ts index 7fe47989c2f..4b981494dba 100644 --- a/src/lib/onboard-vllm.ts +++ b/src/lib/onboard-vllm.ts @@ -7,7 +7,7 @@ const { runCapture, runShell } = require("./runner"); const { dockerCapture, dockerSpawn } = require("./adapters/docker"); -const { VLLM_PORT } = require("./ports"); +const { VLLM_PORT } = require("./core/ports"); const { getGpuIndicesByName } = require("./nim"); // Per-platform install recipe. Add new platforms by appending an entry to diff --git a/src/lib/onboard-windows-ollama.ts b/src/lib/onboard-windows-ollama.ts index bcdf1910ea8..c81fee50788 100644 --- a/src/lib/onboard-windows-ollama.ts +++ b/src/lib/onboard-windows-ollama.ts @@ -8,7 +8,7 @@ const { spawn, spawnSync } = require("child_process"); const { run, runCapture } = require("./runner"); const { OLLAMA_HOST_DOCKER_INTERNAL, setResolvedOllamaHost } = require("./local-inference"); -const { OLLAMA_PORT } = require("./ports"); +const { OLLAMA_PORT } = require("./core/ports"); function sleep(seconds: number): void { spawnSync("sleep", [String(seconds)]); diff --git a/src/lib/onboard.ts b/src/lib/onboard.ts index a41a3ca9370..94de7ef666b 100644 --- a/src/lib/onboard.ts +++ b/src/lib/onboard.ts @@ -5,7 +5,7 @@ // Supports non-interactive mode via --non-interactive flag or // NEMOCLAW_NON_INTERACTIVE=1 env var for CI/CD pipelines. -const { getAgentBranding } = require("./branding"); +const { getAgentBranding } = require("./cli/branding"); const crypto = require("node:crypto"); const fs = require("fs"); const os = require("os"); @@ -31,7 +31,7 @@ function setOnboardBrandingAgent(agentName: string | null | undefined): void { onboardBrandingAgent = agentName || null; } -function onboardBranding(): import("./branding").AgentBranding { +function onboardBranding(): import("./cli/branding").AgentBranding { return getAgentBranding(onboardBrandingAgent || process.env.NEMOCLAW_AGENT || null); } @@ -70,7 +70,7 @@ const { dockerRmi, dockerStop, } = docker; -const errnoUtils: typeof import("./errno") = require("./errno"); +const errnoUtils: typeof import("./core/errno") = require("./core/errno"); const { isErrnoException } = errnoUtils; type RunnerOptions = { @@ -105,7 +105,7 @@ const { OLLAMA_PROXY_PORT, DASHBOARD_PORT_RANGE_START, DASHBOARD_PORT_RANGE_END, -} = require("./ports"); +} = require("./core/ports"); const localInference: typeof import("./local-inference") = require("./local-inference"); const { findReachableOllamaHost, @@ -256,11 +256,11 @@ const { inferenceCompat: LooseObject | null; }; }; -const { sleepSeconds } = require("./wait"); +const { sleepSeconds } = require("./core/wait"); const platformUtils: typeof import("./platform") = require("./platform"); const { inferContainerRuntime, isWsl, shouldPatchCoredns } = platformUtils; const { resolveOpenshell } = require("./adapters/openshell/resolve"); -const credentials: typeof import("./credentials") = require("./credentials"); +const credentials: typeof import("./credentials/store") = require("./credentials/store"); const { prompt, ensureApiKey, @@ -271,7 +271,7 @@ const { resolveProviderCredential, saveCredential, } = credentials; -const { hashCredential }: typeof import("./credential-hash") = require("./credential-hash"); +const { hashCredential }: typeof import("./security/credential-hash") = require("./security/credential-hash"); const { cleanupStaleHostFiles, }: typeof import("./host-artifact-cleanup") = require("./host-artifact-cleanup"); @@ -299,7 +299,7 @@ const agentDefs = require("./agent/defs"); const gatewayState: typeof import("./state/gateway") = require("./state/gateway"); const sandboxState: typeof import("./state/sandbox") = require("./state/sandbox"); const validation: typeof import("./validation") = require("./validation"); -const urlUtils: typeof import("./url-utils") = require("./url-utils"); +const urlUtils: typeof import("./core/url-utils") = require("./core/url-utils"); const buildContext = require("./build-context"); const dashboardContract: typeof import("./dashboard/contract") = require("./dashboard/contract"); const httpProbe: typeof import("./http-probe") = require("./http-probe"); @@ -412,12 +412,12 @@ const OPENCLAW_LAUNCH_AGENT_PLIST = "~/Library/LaunchAgents/ai.openclaw.gateway. const BRAVE_SEARCH_HELP_URL = "https://brave.com/search/api/"; // Re-export shared JSON types under the names used throughout this module. -// See src/lib/json-types.ts for the canonical definitions. +// See src/lib/core/json-types.ts for the canonical definitions. import type { JsonObject as LooseObject, JsonScalar as LooseScalar, JsonValue as LooseValue, -} from "./json-types"; +} from "./core/json-types"; type OnboardOptions = { nonInteractive?: boolean; @@ -1166,7 +1166,7 @@ function executeSandboxCommandForVerification( } } -// URL/string utilities — delegated to src/lib/url-utils.ts +// URL/string utilities — delegated to src/lib/core/url-utils.ts const { compactText, normalizeProviderBaseUrl, @@ -3687,7 +3687,7 @@ async function preflight(): Promise> { // Required ports — gateway, plus the dashboard port when an explicit one // is requested. envVar is the override env var documented in - // src/lib/ports.ts; surfacing it in the preflight error gives users a clear + // src/lib/core/ports.ts; surfacing it in the preflight error gives users a clear // escape hatch when an unrelated process is holding the default port // (closes #2497). When --control-ui-port is set, check that port instead // of the default. When auto-allocation is possible (no explicit port), diff --git a/src/lib/policies.ts b/src/lib/policies.ts index 4ba7f5dee3a..c2dad0850ea 100644 --- a/src/lib/policies.ts +++ b/src/lib/policies.ts @@ -3,7 +3,7 @@ // // Policy preset management — list, load, merge, and apply presets. -import type { JsonValue, JsonObject } from "./json-types"; +import type { JsonValue, JsonObject } from "./core/json-types"; const fs = require("fs"); const path = require("path"); diff --git a/src/lib/preflight.ts b/src/lib/preflight.ts index 8832d10ebe5..de024d2434e 100644 --- a/src/lib/preflight.ts +++ b/src/lib/preflight.ts @@ -14,7 +14,7 @@ import net from "node:net"; import os from "node:os"; import path from "node:path"; -import { DASHBOARD_PORT } from "./ports"; +import { DASHBOARD_PORT } from "./core/ports"; // runner.ts still uses CommonJS-style exports — use require here. const { runCapture } = require("./runner"); diff --git a/src/lib/provider-models.ts b/src/lib/provider-models.ts index b58da3e39e4..603725d47bf 100644 --- a/src/lib/provider-models.ts +++ b/src/lib/provider-models.ts @@ -6,7 +6,7 @@ import { getCurlTimingArgs, runCurlProbe } from "./http-probe"; import type { ModelCatalogFetchResult, ModelValidationResult } from "./onboard-types"; // credentials.ts still uses CommonJS-style exports. -const { normalizeCredentialValue } = require("./credentials"); +const { normalizeCredentialValue } = require("./credentials/store"); export const BUILD_ENDPOINT_URL = "https://integrate.api.nvidia.com/v1"; diff --git a/src/lib/runner.ts b/src/lib/runner.ts index 73c2a61e297..b4cdca517cc 100644 --- a/src/lib/runner.ts +++ b/src/lib/runner.ts @@ -246,7 +246,7 @@ function runCapture(cmd: readonly string[], opts: CaptureOptions = {}): string { } // Unified redaction — see redact.ts (#2381). -const { redact, redactError, writeRedactedResult } = require("./redact"); +const { redact, redactError, writeRedactedResult } = require("./security/redact"); /** * Shell-quote a value for safe interpolation into bash -c strings. diff --git a/src/lib/sandbox-channels.ts b/src/lib/sandbox-channels.ts index a7e9f1e4c2b..15f65a4e207 100644 --- a/src/lib/sandbox-channels.ts +++ b/src/lib/sandbox-channels.ts @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { deleteCredential, saveCredential } from "./credentials"; +import { deleteCredential, saveCredential } from "./credentials/store"; export interface ChannelDef { envKey: string; diff --git a/src/lib/sandbox-config.ts b/src/lib/sandbox-config.ts index 41f0d93db5e..d6f3b12d237 100644 --- a/src/lib/sandbox-config.ts +++ b/src/lib/sandbox-config.ts @@ -20,13 +20,13 @@ const { promises: dnsPromises } = require("node:dns"); const { isIP } = require("node:net"); const { validateName } = require("./runner"); const { dockerExecFileSync } = require("./adapters/docker/exec"); -const credentialFilter: typeof import("./credential-filter") = require("./credential-filter"); +const credentialFilter: typeof import("./security/credential-filter") = require("./security/credential-filter"); const { stripCredentials, isConfigObject, isConfigValue, isCredentialField } = credentialFilter; const { appendAuditEntry } = require("./shields/audit"); const { isPrivateHostname, isPrivateIp } = require("./private-networks"); -type ConfigObject = import("./credential-filter").ConfigObject; -type ConfigValue = import("./credential-filter").ConfigValue; +type ConfigObject = import("./security/credential-filter").ConfigObject; +type ConfigValue = import("./security/credential-filter").ConfigValue; const { runOpenshellCommand, captureOpenshellCommand } = require("./adapters/openshell/client"); function parseJson(text: string): T { @@ -866,7 +866,7 @@ async function configRotateToken(sandboxName: string, opts: RotateTokenOpts = {} } else if (opts.fromStdin) { newToken = await readStdin(); } else { - const { promptSecret } = require("./credentials"); + const { promptSecret } = require("./credentials/store"); newToken = await promptSecret(` New ${credentialEnv} value: `); } @@ -886,7 +886,7 @@ async function configRotateToken(sandboxName: string, opts: RotateTokenOpts = {} // 4. Stage the new value in the current process so the openshell update // that follows can read it via --credential . The OpenShell // gateway becomes the system of record once the update succeeds. - const { saveCredential } = require("./credentials"); + const { saveCredential } = require("./credentials/store"); saveCredential(credentialEnv, newToken); // 5. Update the openshell provider diff --git a/src/lib/credential-filter.test.ts b/src/lib/security/credential-filter.test.ts similarity index 100% rename from src/lib/credential-filter.test.ts rename to src/lib/security/credential-filter.test.ts diff --git a/src/lib/credential-filter.ts b/src/lib/security/credential-filter.ts similarity index 100% rename from src/lib/credential-filter.ts rename to src/lib/security/credential-filter.ts diff --git a/src/lib/credential-hash.ts b/src/lib/security/credential-hash.ts similarity index 100% rename from src/lib/credential-hash.ts rename to src/lib/security/credential-hash.ts diff --git a/src/lib/redact.ts b/src/lib/security/redact.ts similarity index 100% rename from src/lib/redact.ts rename to src/lib/security/redact.ts diff --git a/src/lib/secret-patterns.ts b/src/lib/security/secret-patterns.ts similarity index 96% rename from src/lib/secret-patterns.ts rename to src/lib/security/secret-patterns.ts index f1d90c41f16..318d6e5c048 100644 --- a/src/lib/secret-patterns.ts +++ b/src/lib/security/secret-patterns.ts @@ -4,7 +4,7 @@ /** * Canonical secret redaction patterns — single source of truth. * - * All TypeScript consumers import through src/lib/redact.ts (#2381). + * All TypeScript consumers import through src/lib/security/redact.ts (#2381). * debug.sh delegates to the compiled redact module when node is available; * its sed fallback only covers the prefixes in EXPECTED_SHELL_PREFIXES. * diff --git a/src/lib/services.ts b/src/lib/services.ts index e6dd5088e10..5f54869687e 100644 --- a/src/lib/services.ts +++ b/src/lib/services.ts @@ -15,9 +15,9 @@ import { } from "node:fs"; import { join } from "node:path"; -import { AGENT_PRODUCT_NAME, CLI_DISPLAY_NAME } from "./branding"; +import { AGENT_PRODUCT_NAME, CLI_DISPLAY_NAME } from "./cli/branding"; import { dockerSpawnSync } from "./adapters/docker"; -import { DASHBOARD_PORT } from "./ports"; +import { DASHBOARD_PORT } from "./core/ports"; import { resolveOpenshell } from "./adapters/openshell/resolve"; import { buildSubprocessEnv } from "./subprocess-env"; diff --git a/src/lib/share-command-deps.ts b/src/lib/share-command-deps.ts index 56d649e4834..88fc4f3271b 100644 --- a/src/lib/share-command-deps.ts +++ b/src/lib/share-command-deps.ts @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { CLI_NAME } from "./branding"; +import { CLI_NAME } from "./cli/branding"; import { OPENSHELL_PROBE_TIMEOUT_MS } from "./adapters/openshell/timeouts"; -import { G, R } from "./terminal-style"; +import { G, R } from "./cli/terminal-style"; export interface ShareCommandDeps { /** Run `openshell sandbox ssh-config ` and return output. */ diff --git a/src/lib/shields/audit.ts b/src/lib/shields/audit.ts index f2f7365cb11..75a3484ad7f 100644 --- a/src/lib/shields/audit.ts +++ b/src/lib/shields/audit.ts @@ -11,7 +11,7 @@ import { appendFileSync } from "node:fs"; import { join } from "node:path"; -import { redactFull } from "../redact"; +import { redactFull } from "../security/redact"; import { ensureConfigDir } from "../state/config-io"; const AUDIT_DIR = join(process.env.HOME ?? "/tmp", ".nemoclaw", "state"); diff --git a/src/lib/state/config-io.ts b/src/lib/state/config-io.ts index f9bbc5cfd55..61203f83c85 100644 --- a/src/lib/state/config-io.ts +++ b/src/lib/state/config-io.ts @@ -7,8 +7,8 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { shellQuote } from "../shell-quote"; -import { isErrnoException, isPermissionError } from "../errno"; +import { shellQuote } from "../core/shell-quote"; +import { isErrnoException, isPermissionError } from "../core/errno"; // Strict JSON types for file serialization — unlike json-types.ts, // these exclude undefined since actual JSON cannot contain it. diff --git a/src/lib/state/registry.ts b/src/lib/state/registry.ts index 2f42b384111..b29e0b9acd8 100644 --- a/src/lib/state/registry.ts +++ b/src/lib/state/registry.ts @@ -5,7 +5,7 @@ import fs from "node:fs"; import path from "node:path"; import { ensureConfigDir, readConfigFile, writeConfigFile } from "./config-io"; -import { isErrnoException } from "../errno"; +import { isErrnoException } from "../core/errno"; import type { MessagingChannelConfig } from "../messaging-channel-config"; export interface CustomPolicyEntry { diff --git a/src/lib/state/sandbox.ts b/src/lib/state/sandbox.ts index 5e976f525f7..9e6c5cbd7f5 100644 --- a/src/lib/state/sandbox.ts +++ b/src/lib/state/sandbox.ts @@ -30,7 +30,7 @@ import { loadAgent } from "../agent/defs.js"; import type { AgentStateFile } from "../agent/defs.js"; import { resolveOpenshell } from "../adapters/openshell/resolve.js"; import { captureOpenshellCommand } from "../adapters/openshell/client.js"; -import { sanitizeConfigFile, isSensitiveFile } from "../credential-filter.js"; +import { sanitizeConfigFile, isSensitiveFile } from "../security/credential-filter.js"; import { shellQuote } from "../runner.js"; const HOME_DIR = path.resolve(process.env.HOME || os.homedir()); diff --git a/src/lib/usage-notice.ts b/src/lib/usage-notice.ts index bab1f7999bf..bd062739f27 100644 --- a/src/lib/usage-notice.ts +++ b/src/lib/usage-notice.ts @@ -212,7 +212,7 @@ export async function ensureUsageNoticeConsent({ } // credentials is still CJS - const ask: PromptFn = promptFn ?? (require("./credentials") as { prompt: PromptFn }).prompt; + const ask: PromptFn = promptFn ?? (require("./credentials/store") as { prompt: PromptFn }).prompt; let answer: string; try { answer = String(await ask(` ${config.interactivePrompt}`)) diff --git a/src/lib/validation-recovery.ts b/src/lib/validation-recovery.ts index 16bde56118a..16eb50e3882 100644 --- a/src/lib/validation-recovery.ts +++ b/src/lib/validation-recovery.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { ValidationFailureLike } from "./onboard-types"; -import { compactText } from "./url-utils"; +import { compactText } from "./core/url-utils"; import { classifyValidationFailure, type ValidationClassification } from "./validation"; export interface ProbeRecoveryOptions { diff --git a/src/nemoclaw.ts b/src/nemoclaw.ts index fe29b385c3b..81b5f7abab2 100644 --- a/src/nemoclaw.ts +++ b/src/nemoclaw.ts @@ -4,7 +4,7 @@ const { execFileSync, spawn, spawnSync } = require("child_process"); const path = require("path"); const fs = require("fs"); -const { DASHBOARD_PORT, GATEWAY_PORT, OLLAMA_PORT } = require("./lib/ports"); +const { DASHBOARD_PORT, GATEWAY_PORT, OLLAMA_PORT } = require("./lib/core/ports"); // --------------------------------------------------------------------------- // Color / style — respects NO_COLOR and non-TTY environments. @@ -26,7 +26,7 @@ const { ROOT, run, runInteractive, validateName } = require("./lib/runner"); // Agent branding — derived from NEMOCLAW_AGENT when an alias launcher sets it; // otherwise the branding module falls back to the OpenClaw defaults. // --------------------------------------------------------------------------- -const { CLI_NAME, CLI_DISPLAY_NAME } = require("./lib/branding"); +const { CLI_NAME, CLI_DISPLAY_NAME } = require("./lib/cli/branding"); const { dockerCapture, @@ -68,7 +68,7 @@ const { getSandboxDeleteOutcome, } = require("./lib/actions/sandbox/destroy"); const { runOclifArgv, runRegisteredOclifCommand } = require("./lib/cli/oclif-runner"); -const { isErrnoException }: typeof import("./lib/errno") = require("./lib/errno"); +const { isErrnoException }: typeof import("./lib/core/errno") = require("./lib/core/errno"); const agentRuntime = require("../bin/lib/agent-runtime"); const sandboxState = require("./lib/state/sandbox"); const { parseRestoreArgs } = sandboxState; @@ -81,7 +81,7 @@ const { canonicalUsageList, globalCommandTokens, sandboxActionTokens, -} = require("./lib/command-registry"); +} = require("./lib/cli/command-registry"); import { normalizeArgv, suggestCommand } from "./lib/cli/argv-normalizer"; import { OPENSHELL_PROBE_TIMEOUT_MS } from "./lib/adapters/openshell/timeouts"; import { renderPublicOclifHelp } from "./lib/cli/public-oclif-help"; diff --git a/test/canonical-credential-resolution.test.ts b/test/canonical-credential-resolution.test.ts index 5c5d47ca3de..9b417b5b14a 100644 --- a/test/canonical-credential-resolution.test.ts +++ b/test/canonical-credential-resolution.test.ts @@ -14,7 +14,7 @@ import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -type CredentialsModule = typeof import("../dist/lib/credentials.js"); +type CredentialsModule = typeof import("../dist/lib/credentials/store.js"); const tmpFixtures: string[] = []; @@ -37,7 +37,7 @@ async function importCredentialsModule(home: string): Promise vi.doUnmock("child_process"); vi.doUnmock("readline"); vi.stubEnv("HOME", home); - const module = await import("../dist/lib/credentials.js"); + const module = await import("../dist/lib/credentials/store.js"); const loaded = "default" in module ? module.default : module; return loaded as CredentialsModule; } diff --git a/test/credentials.test.ts b/test/credentials.test.ts index b909e994fef..d0d5768448a 100644 --- a/test/credentials.test.ts +++ b/test/credentials.test.ts @@ -11,7 +11,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const require = createRequire(import.meta.url); -type CredentialsModule = typeof import("../dist/lib/credentials.js"); +type CredentialsModule = typeof import("../dist/lib/credentials/store.js"); function isCredentialsModule(value: object | null): value is CredentialsModule { return ( @@ -28,7 +28,7 @@ function isCredentialsModule(value: object | null): value is CredentialsModule { // Pull the credential-env-key allowlist from the production module so // future additions only need to be made in one place. Plus a few // fixture-only names this suite mutates directly. -import { KNOWN_CREDENTIAL_ENV_KEYS } from "../dist/lib/credentials.js"; +import { KNOWN_CREDENTIAL_ENV_KEYS } from "../dist/lib/credentials/store.js"; const TEST_FIXTURE_ENV_KEYS = ["TEST_API_KEY", "OTHER_KEY", "EMPTY_VALUE", "ZETA", "ALPHA"]; const TRACKED_ENV_KEYS = [...KNOWN_CREDENTIAL_ENV_KEYS, ...TEST_FIXTURE_ENV_KEYS]; @@ -44,7 +44,7 @@ async function importCredentialsModule(home: string): Promise vi.doUnmock("child_process"); vi.doUnmock("readline"); vi.stubEnv("HOME", home); - const module = await import("../dist/lib/credentials.js"); + const module = await import("../dist/lib/credentials/store.js"); const loaded = "default" in module ? module.default : module; const moduleObject = typeof loaded === "object" && loaded !== null ? loaded : null; if (!isCredentialsModule(moduleObject)) { @@ -644,7 +644,7 @@ describe("prompt machinery (unchanged)", () => { it("settles the outer prompt promise on secret prompt errors", () => { const script = ` -const { prompt } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials.js"))}); +const { prompt } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials", "store.js"))}); process.stdin.isTTY = true; process.stderr.isTTY = true; process.stdin.ref = () => process.stdin; @@ -681,7 +681,7 @@ prompt('secret: ', { secret: true }) const stdinUnref = vi.spyOn(process.stdin, "unref").mockImplementation(() => process.stdin); try { - const credentials = await import("../dist/lib/credentials.js"); + const credentials = await import("../dist/lib/credentials/store.js"); const pending = credentials.prompt("question: "); rl.emit("SIGINT"); await expect(pending).rejects.toMatchObject({ @@ -704,7 +704,7 @@ prompt('secret: ', { secret: true }) expect(credentials.normalizeCredentialValue(" nvapi-good-key\r\n")).toBe("nvapi-good-key"); const script = ` -const { ensureApiKey } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials.js"))}); +const { ensureApiKey } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials", "store.js"))}); delete process.env.NVIDIA_API_KEY; ensureApiKey() .then(() => console.log('STAGED=' + process.env.NVIDIA_API_KEY)) @@ -743,7 +743,7 @@ ${JSON.stringify(process.execPath)} ${JSON.stringify(scriptFile)} < "$pipe" it("normal and secret prompts re-ref, cleanup stdin, and preserve masked input", () => { const script = ` -const { prompt } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials.js"))}); +const { prompt } = require(${JSON.stringify(path.join(import.meta.dirname, "..", "dist", "lib", "credentials", "store.js"))}); const counts = { ref: 0, resume: 0, pause: 0, unref: 0, raw: [] }; process.stdin.ref = () => { counts.ref += 1; return process.stdin; }; process.stdin.resume = () => { counts.resume += 1; return process.stdin; }; diff --git a/test/e2e/test-credential-migration.sh b/test/e2e/test-credential-migration.sh index ac5d2fe087f..d9908f01466 100755 --- a/test/e2e/test-credential-migration.sh +++ b/test/e2e/test-credential-migration.sh @@ -267,7 +267,7 @@ ln -s "$VICTIM_FILE" "$LEGACY_FILE" # Drive removeLegacyCredentialsFile() directly via a tiny node one-liner. # Using the compiled module from dist/ matches what the CLI imports. node -e " -const { removeLegacyCredentialsFile } = require('${REPO}/dist/lib/credentials.js'); +const { removeLegacyCredentialsFile } = require('${REPO}/dist/lib/credentials/store.js'); removeLegacyCredentialsFile(); " >/dev/null 2>&1 || { fail "node invocation of removeLegacyCredentialsFile failed" diff --git a/test/gateway-start-wait.test.ts b/test/gateway-start-wait.test.ts index 74fae8b46e4..c83203411c6 100644 --- a/test/gateway-start-wait.test.ts +++ b/test/gateway-start-wait.test.ts @@ -7,7 +7,7 @@ import { createRequire } from "node:module"; const require = createRequire(import.meta.url); const ORIGINAL_ENV = { ...process.env }; const ONBOARD_MODULE = require.resolve("../dist/lib/onboard.js"); -const PORTS_MODULE = require.resolve("../dist/lib/ports.js"); +const PORTS_MODULE = require.resolve("../dist/lib/core/ports.js"); function loadOnboard() { delete require.cache[ONBOARD_MODULE]; diff --git a/test/host-artifact-cleanup.test.ts b/test/host-artifact-cleanup.test.ts index 6dd3624c8f1..e1e8e1aa323 100644 --- a/test/host-artifact-cleanup.test.ts +++ b/test/host-artifact-cleanup.test.ts @@ -6,7 +6,7 @@ import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { KNOWN_CREDENTIAL_ENV_KEYS } from "../dist/lib/credentials.js"; +import { KNOWN_CREDENTIAL_ENV_KEYS } from "../dist/lib/credentials/store.js"; import { cleanupStaleHostFiles } from "../dist/lib/host-artifact-cleanup.js"; const TRACKED_ENV_KEYS = [...KNOWN_CREDENTIAL_ENV_KEYS]; diff --git a/test/image-cleanup.test.ts b/test/image-cleanup.test.ts index d9882b1cbde..bf6376d51bd 100644 --- a/test/image-cleanup.test.ts +++ b/test/image-cleanup.test.ts @@ -15,7 +15,7 @@ import { import { getSandboxDeleteOutcome } from "../src/lib/domain/sandbox/destroy"; import { normalizeGarbageCollectImagesOptions } from "../src/lib/domain/lifecycle/options"; import { help as renderRootHelp } from "../src/lib/actions/root-help"; -import { COMMANDS, globalCommandTokens } from "../src/lib/command-registry"; +import { COMMANDS, globalCommandTokens } from "../src/lib/cli/command-registry"; import { getRegisteredOclifCommandMetadata } from "../src/lib/cli/oclif-metadata"; const ROOT = path.resolve(import.meta.dirname, ".."); diff --git a/test/ollama-tools-capability.test.ts b/test/ollama-tools-capability.test.ts index 52f6b50408d..71b3e96e103 100644 --- a/test/ollama-tools-capability.test.ts +++ b/test/ollama-tools-capability.test.ts @@ -235,7 +235,7 @@ function installSharedStubs(): void { _model: string, ) => SHARED.scriptedCaps; - const credentialsPath = path.join(REPO_ROOT, "dist", "lib", "credentials.js"); + const credentialsPath = path.join(REPO_ROOT, "dist", "lib", "credentials", "store.js"); const credentials = require(credentialsPath) as { prompt: (msg: string) => Promise; }; diff --git a/test/onboard-preset-diff.test.ts b/test/onboard-preset-diff.test.ts index 4319a616caf..d46c112060d 100644 --- a/test/onboard-preset-diff.test.ts +++ b/test/onboard-preset-diff.test.ts @@ -47,7 +47,7 @@ function buildPreamble({ policyPresets = "npm", alreadyApplied = ["npm", "pypi", "huggingface", "brew", "brave"], } = {}): string { - const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const policiesPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "policies.js")); diff --git a/test/onboard-prompt-default-case.test.ts b/test/onboard-prompt-default-case.test.ts index ff502a96b9a..af53228552e 100644 --- a/test/onboard-prompt-default-case.test.ts +++ b/test/onboard-prompt-default-case.test.ts @@ -9,7 +9,7 @@ import { describe, it, expect } from "vitest"; const repoRoot = path.join(import.meta.dirname, ".."); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); -const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); +const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); type RunResult = { result: boolean; diff --git a/test/onboard-selection.test.ts b/test/onboard-selection.test.ts index 17f90205614..14c1bc377ae 100644 --- a/test/onboard-selection.test.ts +++ b/test/onboard-selection.test.ts @@ -104,7 +104,7 @@ describe("onboard provider selection UX", () => { const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "selection-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); @@ -206,7 +206,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "no-recommended-label-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -286,7 +286,7 @@ const { setupNim } = require(${onboardPath}); const scriptPath = path.join(tmpDir, "build-deepseek-selection-check.js"); const curlArgsLog = path.join(tmpDir, "deepseek-curl-args.log"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -391,7 +391,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "build-model-selection-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -487,7 +487,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "build-model-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -586,7 +586,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "gemini-selection-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -681,7 +681,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-validation-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -802,7 +802,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-loopback-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const platformPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "platform.js")); @@ -928,7 +928,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-back-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1027,7 +1027,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-bootstrap-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const pullLog = path.join(tmpDir, "pulls.log"); @@ -1139,7 +1139,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const pullLog = path.join(tmpDir, "pulls.log"); @@ -1259,7 +1259,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-decline-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const pullLog = path.join(tmpDir, "pulls.log"); @@ -1376,7 +1376,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "ollama-yes-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const pullLog = path.join(tmpDir, "pulls.log"); @@ -1492,7 +1492,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "openai-model-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1584,7 +1584,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "anthropic-model-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1672,7 +1672,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "anthropic-validation-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1768,7 +1768,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "anthropic-compatible-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1855,7 +1855,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-openai-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -1970,7 +1970,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-openai-responses-fallback-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2066,7 +2066,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-openai-responses-force-completions-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2167,7 +2167,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-openai-responses-override-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2276,7 +2276,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-endpoint-blank-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2369,7 +2369,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-anthropic-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2479,7 +2479,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "model-back-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2568,7 +2568,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "transport-back-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2666,7 +2666,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "selection-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2772,7 +2772,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "build-noninteractive-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2876,7 +2876,7 @@ const { setupNim, __setNonInteractive } = onboardModule.exports; const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "build-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -2993,7 +2993,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "nvidia-paste-guard-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3069,7 +3069,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "openai-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3145,7 +3145,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "anthropic-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3221,7 +3221,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "gemini-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3299,7 +3299,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-openai-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3391,7 +3391,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "custom-anthropic-auth-retry-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3481,7 +3481,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "vllm-override-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); fs.mkdirSync(fakeBin, { recursive: true }); @@ -3583,7 +3583,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "nim-override-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const nimPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "nim.js")); @@ -3695,7 +3695,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "install-ollama-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const platformPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "platform.js")); @@ -3869,7 +3869,7 @@ const { setupNim } = require(${onboardPath}); const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "nemoclaw-onboard-systemd-fail-")); const scriptPath = path.join(tmpDir, "systemd-fail-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const platformPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "platform.js")); @@ -3947,7 +3947,7 @@ const { setupNim } = require(${onboardPath}); const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "noninteractive-install-ollama-check.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const platformPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "platform.js")); diff --git a/test/onboard.test.ts b/test/onboard.test.ts index f80f73e68fa..3dfcb691c65 100644 --- a/test/onboard.test.ts +++ b/test/onboard.test.ts @@ -1440,7 +1440,7 @@ describe("onboard helpers", () => { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "nemoclaw-web-search-prompt-")); const scriptPath = path.join(tmpDir, "web-search-prompt-check.cjs"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const agentDefsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "agent", "defs.js")); const script = ` @@ -2586,7 +2586,7 @@ const { setupInference, getSandboxInferenceConfig } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const localInferencePath = JSON.stringify( path.join(repoRoot, "dist", "lib", "local-inference.js"), ); @@ -2995,7 +2995,7 @@ const { setupInference } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -3085,7 +3085,7 @@ const { setupInference } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -3560,7 +3560,7 @@ console.log(JSON.stringify({ liveExists, sandbox: registry.getSandbox("my-assist const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -3700,7 +3700,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -3791,7 +3791,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -3923,7 +3923,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -4142,7 +4142,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -4305,7 +4305,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -4785,7 +4785,7 @@ const { createSandbox } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -4916,7 +4916,7 @@ const { createSandbox } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -5058,7 +5058,7 @@ const { createSandbox } = require(${onboardPath}); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -5428,7 +5428,7 @@ console.log(JSON.stringify({ exists: providerExistsInGateway("discord-bridge") } const fakeBin = path.join(tmpDir, "bin"); const scriptPath = path.join(tmpDir, "hydrate-cred.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -5546,7 +5546,7 @@ console.log(JSON.stringify({ exists: providerExistsInGateway("nonexistent") })); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -5945,7 +5945,7 @@ const { setupInference } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6079,7 +6079,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6336,7 +6336,7 @@ const { setupMessagingChannels } = require(${onboardPath}); const scriptPath = path.join(tmpDir, "slack-format-reject.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6447,7 +6447,7 @@ const { setupMessagingChannels, MESSAGING_CHANNELS } = require(${onboardPath}); const scriptPath = path.join(tmpDir, "slack-app-format-reject.js"); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6645,7 +6645,7 @@ const { setupMessagingChannels, MESSAGING_CHANNELS } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); // Create a minimal custom Dockerfile in a temporary directory const customBuildDir = path.join(tmpDir, "custom-image"); @@ -6825,7 +6825,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6886,7 +6886,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); fs.mkdirSync(fakeBin, { recursive: true }); fs.writeFileSync(path.join(fakeBin, "openshell"), "#!/usr/bin/env bash\nexit 0\n", { @@ -6946,7 +6946,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const ignoredDir = path.join(tmpDir, "node_modules", "pkg"); fs.mkdirSync(ignoredDir, { recursive: true }); @@ -7009,7 +7009,7 @@ const { createSandbox } = require(${onboardPath}); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const preflightPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "preflight.js")); - const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credentialsPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const customBuildDir = path.join(tmpDir, "custom-image"); fs.mkdirSync(customBuildDir, { recursive: true }); diff --git a/test/policies.test.ts b/test/policies.test.ts index e3f3797d1ba..684981e0574 100644 --- a/test/policies.test.ts +++ b/test/policies.test.ts @@ -17,7 +17,7 @@ const readline = requireForTest("node:readline") as typeof import("node:readline const YAML = requireForTest("yaml"); const REPO_ROOT = path.join(import.meta.dirname, ".."); const CLI_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "nemoclaw.js")); -const CREDENTIALS_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "credentials.js")); +const CREDENTIALS_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "credentials", "store.js")); const POLICIES_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "policies.js")); const REGISTRY_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "state", "registry.js")); const SELECT_FROM_LIST_ITEMS = [ diff --git a/test/policy-tiers-onboard.test.ts b/test/policy-tiers-onboard.test.ts index 46fad5cd789..83c2cdddb6b 100644 --- a/test/policy-tiers-onboard.test.ts +++ b/test/policy-tiers-onboard.test.ts @@ -49,7 +49,7 @@ function buildPreamble({ stubOpenshellBin = false, runCaptureReturn = "", } = {}): string { - const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); @@ -378,7 +378,7 @@ describe("selectTierPresetsAndAccess", () => { const policiesPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "policies.js")); function buildPresetsScript(body: string): string { - const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials.js")); + const credPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "credentials", "store.js")); const runnerPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "runner.js")); const registryPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "state", "registry.js")); const onboardPath = JSON.stringify(path.join(repoRoot, "dist", "lib", "onboard.js")); diff --git a/test/presets-checkbox.test.ts b/test/presets-checkbox.test.ts index d47ae2ec90f..7e55702f1b4 100644 --- a/test/presets-checkbox.test.ts +++ b/test/presets-checkbox.test.ts @@ -8,7 +8,7 @@ import { execTimeout } from "./helpers/timeouts"; const REPO_ROOT = path.join(import.meta.dirname, ".."); const ONBOARD_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "onboard.js")); -const CREDENTIALS_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "credentials.js")); +const CREDENTIALS_PATH = JSON.stringify(path.join(REPO_ROOT, "dist", "lib", "credentials", "store.js")); type Preset = { name: string; diff --git a/test/runner.test.ts b/test/runner.test.ts index 3ef0032f55b..a426f8a0543 100644 --- a/test/runner.test.ts +++ b/test/runner.test.ts @@ -589,10 +589,10 @@ describe("regression guards", () => { defs.push(path.relative(repoRoot, file)); } } - // runner.ts (CJS consumers) and shell-quote.ts (ESM consumers like config-io.ts) + // runner.ts (CJS consumers) and core/shell-quote.ts (ESM consumers like config-io.ts) expect(defs.sort()).toEqual([ + path.join("src", "lib", "core", "shell-quote.ts"), path.join("src", "lib", "runner.ts"), - path.join("src", "lib", "shell-quote.ts"), ]); }); diff --git a/test/secret-redaction.test.ts b/test/secret-redaction.test.ts index 74042b7cfbf..ffb79a00d48 100644 --- a/test/secret-redaction.test.ts +++ b/test/secret-redaction.test.ts @@ -6,7 +6,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, symlinkSync } from "node import { tmpdir } from "node:os"; import { join } from "node:path"; import { spawnSync } from "node:child_process"; -import { SECRET_PATTERNS } from "../src/lib/secret-patterns"; +import { SECRET_PATTERNS } from "../src/lib/security/secret-patterns"; import { redact as debugRedact } from "../src/lib/diagnostics/debug"; import { redactSensitiveText } from "../src/lib/onboard-session"; // runner.ts uses CJS exports — import via dist diff --git a/test/shellquote-sandbox.test.ts b/test/shellquote-sandbox.test.ts index a161f9472ef..059cfc4da32 100644 --- a/test/shellquote-sandbox.test.ts +++ b/test/shellquote-sandbox.test.ts @@ -45,7 +45,7 @@ describe("sandboxName command hardening in onboard.js", () => { pathToFileURL(path.join(repoRoot, "dist", "lib", "preflight.js")).href, ); const credentialsUrl = JSON.stringify( - pathToFileURL(path.join(repoRoot, "dist", "lib", "credentials.js")).href, + pathToFileURL(path.join(repoRoot, "dist", "lib", "credentials", "store.js")).href, ); const streamUrl = JSON.stringify( pathToFileURL(path.join(repoRoot, "dist", "lib", "sandbox-create-stream.js")).href, diff --git a/test/wait.test.ts b/test/wait.test.ts index b6308746821..a5e4ad85264 100644 --- a/test/wait.test.ts +++ b/test/wait.test.ts @@ -3,7 +3,7 @@ import assert from "node:assert"; import { describe, expect, it } from "vitest"; -import { sleepMs, sleepSeconds } from "../src/lib/wait.js"; +import { sleepMs, sleepSeconds } from "../src/lib/core/wait.js"; describe("wait utility", () => { it("sleepMs blocks for approximately the requested time", () => {