@quatronic/qore 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/cli/io.ts","../src/platform/browser.ts","../src/core/errors.ts","../src/cli/program.ts","../src/core/api/http.ts","../src/cli/render.ts","../src/cli/commands/clone.ts","../src/core/api/meta.ts","../src/core/api/capabilities.ts","../src/core/profiles.ts","../src/core/api/client.ts","../src/core/auth/refresh.ts","../src/core/auth/tokenStore.ts","../src/core/session.ts","../src/core/workspace/apps.ts","../src/core/workspace/apply.ts","../src/core/context/cache.ts","../src/core/jsonFile.ts","../src/core/context/repoKey.ts","../src/core/trust.ts","../src/core/workspace/plan.ts","../src/core/workspace/diagnose.ts","../src/core/workspace/file.ts","../src/core/workspace/safety.ts","../src/cli/workspaceReport.ts","../src/cli/commands/dev.ts","../src/core/context/repoConfig.ts","../src/core/context/repoRoot.ts","../src/core/context/resolver.ts","../src/core/diagnostics/node.ts","../src/core/dev/env.ts","../src/core/env/fetch.ts","../src/core/env/merge.ts","../src/core/env/pull.ts","../src/core/env/write.ts","../src/core/dev/lastStart.ts","../src/core/workspace/access.ts","../src/core/dev/findings.ts","../src/core/dev/project.ts","../src/core/dev/install.ts","../src/core/diagnostics/docker.ts","../src/core/diagnostics/postgres.ts","../src/core/diagnostics/ports.ts","../src/core/diagnostics/pm.ts","../src/core/diagnostics/versions.ts","../src/core/dev/preflight.ts","../src/core/dev/providers.ts","../src/core/dev/runFile.ts","../src/cli/context.ts","../src/cli/findings.ts","../src/cli/devRecover.ts","../src/cli/progress.ts","../src/cli/termination.ts","../src/cli/trustPrompt.ts","../src/cli/commands/devWorkspace.ts","../src/core/dev/order.ts","../src/core/dev/supervisor.ts","../src/core/workspace/stray.ts","../src/cli/devOutput.ts","../src/cli/commands/run.ts","../src/cli/commands/doctor.ts","../src/core/doctor/checks.ts","../src/core/diagnostics/ssh.ts","../src/cli/commands/env.ts","../src/core/auth/oidc.ts","../src/core/auth/login.ts","../src/cli/commands/login.ts","../src/cli/commands/logout.ts","../src/cli/format.ts","../src/cli/commands/status.ts","../src/cli/commands/sync.ts","../src/cli/commands/tenant.ts","../src/cli/commands/version.ts","../src/cli/commands/whoami.ts","../src/cli/commands/index.ts","../src/cli/updateCheck.ts","../src/core/config.ts","../src/platform/git.ts","../src/platform/keychain.ts","../src/platform/lock.ts","../src/platform/paths.ts","../src/platform/spawn.ts","../src/platform/launch.ts","../src/platform/ports.ts","../src/platform/proxy.ts","../src/core/diagnostics/proxy.ts","../src/version.ts"],"sourcesContent":["import { homedir } from \"node:os\"\nimport { EnvHttpProxyAgent, setGlobalDispatcher } from \"undici\"\nimport { isInteractive, processIo } from \"./cli/io.js\"\nimport { argvBeforeSeparator, run } from \"./cli/program.js\"\nimport { COMMANDS } from \"./cli/commands/index.js\"\nimport { childRunning } from \"./cli/commands/run.js\"\nimport { preflightTermination } from \"./cli/termination.js\"\nimport { maybeNotifyUpdate } from \"./cli/updateCheck.js\"\nimport { abortableFetch } from \"./core/api/http.js\"\nimport { createOidc } from \"./core/auth/oidc.js\"\nimport { ConfigStore } from \"./core/config.js\"\nimport type { Deps } from \"./core/deps.js\"\nimport { systemGit } from \"./platform/git.js\"\nimport { OsKeychain } from \"./platform/keychain.js\"\nimport { fileLock } from \"./platform/lock.js\"\nimport { configDir } from \"./platform/paths.js\"\nimport { crossSpawner } from \"./platform/spawn.js\"\nimport { systemLauncher } from \"./platform/launch.js\"\nimport { systemPorts } from \"./platform/ports.js\"\nimport { systemProxy } from \"./platform/proxy.js\"\nimport { VERSION } from \"./version.js\"\n\nif (process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY) setGlobalDispatcher(new EnvHttpProxyAgent())\n\nconst dir = configDir(process.env, process.platform, homedir())\nconst argv = process.argv.slice(2)\n// Ruling R12: a child's own --json/--no-input (after --, e.g. `qore run -- node --json`)\n// must never reach qore's own flag scanning.\nconst preSeparatorArgv = argvBeforeSeparator(argv)\nconst json = preSeparatorArgv.includes(\"--json\")\n// Ctrl+C: the first one aborts every in-flight request and prompt through `ac.signal`\n// (→ CancelledError → exit 130); a second one exits at once, whatever is still running —\n// except while a run/dev child is alive: the child's exit decides, or `onInterrupt` escalates.\nconst ac = new AbortController()\nprocess.on(\"SIGINT\", () => {\n if (ac.signal.aborted) {\n if (childRunning.current) { childRunning.onInterrupt?.(); return }\n process.exit(130)\n }\n ac.abort()\n})\nconst fetch = abortableFetch(globalThis.fetch, ac.signal)\nconst deps: Deps = {\n fetch,\n keychain: new OsKeychain(),\n config: new ConfigStore(dir),\n withLock: fileLock(dir),\n now: () => new Date(),\n oidcFor: (issuer) => createOidc({ issuer, clientId: \"qore-cli\", fetch }),\n env: process.env,\n platform: process.platform,\n version: VERSION,\n nodeVersion: process.versions.node,\n cwd: process.cwd(),\n home: homedir(),\n git: systemGit,\n spawn: crossSpawner,\n launch: systemLauncher,\n ports: systemPorts,\n signals: process,\n raise: (signal) => { process.removeAllListeners(signal); process.kill(process.pid, signal) },\n pid: process.pid,\n systemProxy: () => systemProxy(process.platform),\n}\nconst termination = preflightTermination(() => ac.abort(), deps.raise)\nconst io = processIo(isInteractive({ stdinTTY: Boolean(process.stdin.isTTY), stdoutTTY: Boolean(process.stdout.isTTY),\n json, noInput: preSeparatorArgv.includes(\"--no-input\"), env: process.env }))\nprocess.exitCode = await run(argv, deps, io, ac.signal, COMMANDS)\nawait termination.reRaise(async () => {\n await Promise.all([process.stdout, process.stderr].map((s) => new Promise<void>((r) => { s.write(\"\", () => r()) })))\n})\nif (!ac.signal.aborted) {\n try {\n await maybeNotifyUpdate(deps, io, { json })\n } catch {\n // an update check must never change the exit code\n }\n}\n","import { confirm, search, select } from \"@inquirer/prompts\"\nimport { createInterface } from \"node:readline\"\nimport { openBrowser } from \"../platform/browser.js\"\nimport { CancelledError } from \"../core/errors.js\"\n\n/** The slice of a writable byte stream a raw tee needs: write, and an `error` listener\n * it can add/remove around its own lifetime (e.g. to swallow EPIPE while a consumer\n * downstream of qore's stderr has gone away, per `qore dev | head`). */\nexport interface RawSink {\n write(chunk: Buffer): boolean\n on(event: \"error\", listener: (e: NodeJS.ErrnoException) => void): void\n removeListener(event: \"error\", listener: (e: NodeJS.ErrnoException) => void): void\n}\n\nexport interface Io {\n out(s: string): void\n err(s: string): void\n interactive: boolean\n /** Whether qore's own stderr is a TTY — decides e.g. whether to force color on a\n * piped child (`dev.ts`), without `core`/command logic touching `process.stderr` itself. */\n stderrTTY: boolean\n /** The raw byte sink behind `err`, for tees that must write bytes unchanged\n * (never through `err`'s `+ \"\\n\"` line framing) and need EPIPE-safety. */\n stderrRaw: RawSink\n select<T>(msg: string, choices: { name: string; value: T; description?: string }[]): Promise<T>\n /** A type-to-filter picker: `source` is called with the current search text (empty\n * string on first render) and returns the choices to show. */\n search<T>(msg: string, source: (term: string) => { name: string; value: T; description?: string }[]): Promise<T>\n /** An abort of `signal` closes the prompt with CancelledError. `default` is what Enter answers (false if unset). */\n confirm(message: string, signal?: AbortSignal, o?: { default?: boolean }): Promise<boolean>\n waitForEnter(msg: string, signal: AbortSignal): Promise<void>\n openUrl(url: string): Promise<boolean>\n}\n\nexport function isInteractive(o: { stdinTTY: boolean; stdoutTTY: boolean; json: boolean; noInput: boolean; env: NodeJS.ProcessEnv }): boolean {\n return o.stdinTTY && o.stdoutTTY && !o.json && !o.noInput && !o.env.CI\n}\n\nexport function processIo(interactive: boolean, stderrTTY: boolean = Boolean(process.stderr.isTTY)): Io {\n return {\n out: (s) => { process.stdout.write(s + \"\\n\") },\n err: (s) => { process.stderr.write(s + \"\\n\") },\n interactive,\n stderrTTY,\n stderrRaw: process.stderr,\n async select(message, choices) {\n try { return await select({ message, choices }) } catch (e) {\n if ((e as Error).name === \"ExitPromptError\") throw new CancelledError()\n throw e\n }\n },\n async search(message, source) {\n try { return await search({ message, source: (term) => source(term ?? \"\") }) } catch (e) {\n if ((e as Error).name === \"ExitPromptError\") throw new CancelledError()\n throw e\n }\n },\n async confirm(message, signal, o) {\n try { return await confirm({ message, default: o?.default ?? false }, { signal }) } catch (e) {\n if ((e as Error).name === \"ExitPromptError\" || (e as Error).name === \"AbortPromptError\") throw new CancelledError()\n throw e\n }\n },\n waitForEnter: createWaitForEnter(process.stdin, process.stderr),\n openUrl: openBrowser,\n }\n}\n\n/** Builds a `waitForEnter` bound to the given streams, so tests can drive it without a\n * real TTY. Readline puts a TTY's stdin in raw mode, which turns Ctrl+C into the\n * interface's own 'SIGINT' event rather than a process-level SIGINT (R16) — that must be\n * turned into a CancelledError itself, since `process.once(\"SIGINT\", …)` in cli.ts never\n * fires for it. `terminal: true` makes readline parse Ctrl+C the same way on any stream. */\nexport function createWaitForEnter(\n input: NodeJS.ReadableStream, output: NodeJS.WritableStream,\n): (message: string, signal: AbortSignal) => Promise<void> {\n return (message, signal) => new Promise((resolve, reject) => {\n const rl = createInterface({ input, output, terminal: true })\n const onAbort = () => { rl.close(); reject(new CancelledError()) }\n const done = () => { signal.removeEventListener(\"abort\", onAbort); rl.close(); resolve() }\n signal.addEventListener(\"abort\", onAbort, { once: true })\n rl.on(\"SIGINT\", () => { signal.removeEventListener(\"abort\", onAbort); rl.close(); reject(new CancelledError()) })\n rl.question(message, done)\n })\n}\n","import open from \"open\"\n\n/** Opens the URL; false when there is no display (SSH, container) or it fails. */\nexport async function openBrowser(url: string): Promise<boolean> {\n if (process.platform === \"linux\" && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) return false\n try { await open(url); return true } catch { return false }\n}\n","export const EXIT = {\n QORE_INTERNAL: 1,\n QORE_KEYCHAIN_UNAVAILABLE: 1,\n QORE_KEYCHAIN_DENIED: 1,\n QORE_GIT_UNAVAILABLE: 1,\n QORE_CONTEXT_REQUIRED: 2,\n QORE_CONTEXT_INVALID: 2,\n QORE_CONTEXT_UNSUPPORTED: 2,\n QORE_APP_AMBIGUOUS: 2,\n QORE_NOT_LOGGED_IN: 4,\n QORE_SESSION_EXPIRED: 4,\n QORE_LOGIN_EXPIRED: 4,\n QORE_LOGIN_DENIED: 4,\n QORE_CLOCK_SKEW: 4,\n QORE_TENANT_ACCESS_LOST: 5,\n QORE_RESOURCE_NOT_FOUND: 5,\n QORE_ACCESS_DENIED: 5,\n QORE_NO_DEVELOPER_ACCESS: 5,\n QORE_GITHUB_NOT_LINKED: 5,\n QORE_REPO_NO_ACCESS: 5,\n QORE_REPO_ACCESS_PENDING: 5,\n QORE_GIT_AUTH: 5,\n QORE_WORKSPACE_CONFLICT: 2,\n QORE_AUTH_UNAVAILABLE: 6,\n QORE_AUTH_BUSY: 6,\n QORE_API_UNREACHABLE: 6,\n QORE_API_UNAVAILABLE: 6,\n QORE_INCOMPATIBLE_SERVER: 7,\n QORE_UNSUPPORTED_BY_SERVER: 7,\n QORE_UPGRADE_REQUIRED: 7,\n QORE_PORTAL_UNTRUSTED: 7,\n QORE_RATE_LIMITED: 8,\n QORE_PORT_IN_USE: 2,\n QORE_DEV_UNSUPPORTED: 2,\n QORE_INSTALL_FAILED: 1,\n QORE_PACKAGE_MANAGER: 1,\n QORE_DOCKER_MISSING: 1,\n QORE_DOCKER_NOT_RUNNING: 1,\n QORE_DOCKER_COMPOSE_MISSING: 1,\n QORE_SERVICE_DATA_INCOMPATIBLE: 1,\n QORE_NODE_VERSION: 1,\n QORE_SERVICE_UNHEALTHY: 1,\n} as const\n\nexport type QoreErrorCode = keyof typeof EXIT\n\n/** One element of `error.candidates`, the same shape under every code (--json is a\n * semver contract): what the user can pick from to resolve the error. `tenant` (a\n * tenant slug) accompanies module candidates, whose slugs are unique only per tenant. */\nexport type Candidate = {\n kind: \"module\" | \"tenant\" | \"app\"\n id?: string\n slug: string\n name?: string\n remote?: string\n tenant?: string\n}\n\ntype Opts = {\n hint?: string\n status?: number\n requestId?: string\n candidates?: Candidate[]\n serverCode?: string\n details?: Record<string, unknown>\n cause?: unknown\n}\n\nexport class QoreError extends Error {\n readonly code: QoreErrorCode\n readonly hint?: string\n readonly status?: number\n readonly requestId?: string\n readonly candidates?: Candidate[]\n readonly serverCode?: string\n readonly details?: Record<string, unknown>\n\n constructor(code: QoreErrorCode, message: string, opts: Opts = {}) {\n super(message, opts.cause === undefined ? undefined : { cause: opts.cause })\n this.name = \"QoreError\"\n this.code = code\n this.hint = opts.hint\n this.status = opts.status\n this.requestId = opts.requestId\n this.candidates = opts.candidates\n this.serverCode = opts.serverCode\n this.details = opts.details\n }\n}\n\nexport class CancelledError extends Error {\n constructor() {\n super(\"Cancelled\")\n this.name = \"CancelledError\"\n }\n}\n\nexport function exitCodeFor(err: unknown): number {\n if (err instanceof CancelledError || (err instanceof Error && err.name === \"CancelledError\")) return 130\n if (err instanceof QoreError) return EXIT[err.code]\n return 1\n}\n\nexport function toJsonError(err: unknown): Record<string, unknown> {\n if (!(err instanceof QoreError)) {\n return { code: \"QORE_INTERNAL\", message: err instanceof Error ? err.message : String(err) }\n }\n const out: Record<string, unknown> = { code: err.code, message: err.message }\n for (const k of [\"hint\", \"status\", \"requestId\", \"candidates\", \"serverCode\", \"details\"] as const) {\n if (err[k] !== undefined) out[k] = err[k]\n }\n return out\n}\n","import { Command, CommanderError } from \"commander\"\nimport type { Deps } from \"../core/deps.js\"\nimport { isAbortError, withSystemProxy } from \"../core/api/http.js\"\nimport { CancelledError, exitCodeFor, QoreError, type QoreErrorCode } from \"../core/errors.js\"\nimport type { Io } from \"./io.js\"\nimport pc from \"picocolors\"\nimport { renderError } from \"./render.js\"\n\n/** The portion of argv before the first bare `--`. Everything from `--` on belongs to\n * a child command (e.g. `qore run -- node --json --no-input`), so no qore-side argv\n * scan — here or in cli.ts — may look past it (ruling R12): a child's own `--json` must\n * not switch qore into JSON mode, and a child's own `--no-input` must not disable\n * prompting. */\nexport function argvBeforeSeparator(argv: string[]): string[] {\n const i = argv.indexOf(\"--\")\n return i === -1 ? argv : argv.slice(0, i)\n}\n\n/** Detects --json before commander has parsed anything, so a parse error (thrown before\n * global opts exist) can still be rendered as JSON, and commander's own stderr line\n * can be suppressed in that mode. See ruling R12. */\nfunction jsonFromArgv(argv: string[]): boolean {\n return argvBeforeSeparator(argv).some((a) => a === \"--json\" || a.startsWith(\"--json=\"))\n}\n\nexport type GlobalOpts = { portal?: string; json?: boolean; input?: boolean; verbose?: boolean; color?: boolean }\n\n/** Failures of the developer's machine rather than of the app: they end with a pointer to `qore doctor`. */\nexport const DOCTOR_CODES: ReadonlySet<QoreErrorCode> = new Set<QoreErrorCode>([\"QORE_DOCKER_MISSING\", \"QORE_DOCKER_NOT_RUNNING\",\n \"QORE_DOCKER_COMPOSE_MISSING\", \"QORE_NODE_VERSION\", \"QORE_PACKAGE_MANAGER\", \"QORE_INSTALL_FAILED\", \"QORE_PORT_IN_USE\", \"QORE_SERVICE_UNHEALTHY\"])\n\n/** A port held by a previous `qore dev` is not the machine's fault: its own fix is to stop that run. */\nconst machineFailure = (e: { code?: QoreErrorCode; details?: Record<string, unknown> }) =>\n DOCTOR_CODES.has(e.code!) && !(e.code === \"QORE_PORT_IN_USE\" && e.details?.owner === \"qore\")\n\nfunction needsDoctor(e: unknown): boolean {\n if (!(e instanceof QoreError)) return false\n const problems = e.details?.problems\n if (Array.isArray(problems)) return problems.some((p) => machineFailure(p as { code?: QoreErrorCode; details?: Record<string, unknown> }))\n return machineFailure(e)\n}\n\nexport type CommandContext = { deps: Deps; io: Io; signal: AbortSignal; opts: () => GlobalOpts; setExitCode: (code: number) => void }\n\nexport type Register = (program: Command, ctx: CommandContext) => void\n\n/** `--verbose`: request lines (method, path, status, request id; never a token) on stderr. */\nexport function requestLog(ctx: CommandContext): ((line: string) => void) | undefined {\n return ctx.opts().verbose ? (line) => ctx.io.err(line) : undefined\n}\n\n/** A `QORE_API_UNREACHABLE` connect failure, with none of `HTTPS_PROXY`/`https_proxy`/\n * `HTTP_PROXY`/`http_proxy` set, gets the system-proxy hint named — the one place this is\n * done, so every renderer (top-level `run()`, a workspace's collected-problems list) goes\n * through it. When `HTTP_PROXY`/`http_proxy` is set, cli.ts already installed an\n * `EnvHttpProxyAgent` from it, so the \"qore reads only HTTPS_PROXY\" hint would be wrong.\n * Any other error, or code path, is returned unchanged. `deps.systemProxy` is cached for\n * the process lifetime, so calling this once per problem costs nothing extra. */\nexport async function withProxyHint(deps: Deps, e: unknown): Promise<unknown> {\n if (!(e instanceof QoreError) || e.code !== \"QORE_API_UNREACHABLE\" || e.details?.reason !== \"connect\") return e\n if (deps.env.HTTPS_PROXY || deps.env.https_proxy || deps.env.HTTP_PROXY || deps.env.http_proxy) return e\n const proxy = await deps.systemProxy()\n return proxy ? withSystemProxy(e, proxy, deps.platform) : e\n}\n\nexport function buildProgram(deps: Deps, io: Io, signal: AbortSignal, register: Register[], setExitCode: (code: number) => void): Command {\n const program = new Command(\"qore\")\n .description(\"Qore developer CLI\")\n .option(\"--portal <name|url>\", \"prod, staging, or a portal URL (default: the portal you last logged in to, else prod)\")\n .option(\"--json\", \"print exactly one JSON document on stdout\")\n .option(\"--no-input\", \"never prompt\")\n .option(\"--verbose\", \"log request lines (never secrets)\")\n .option(\"--no-color\", \"disable colours\")\n .exitOverride()\n .configureOutput({ writeOut: (s) => io.out(s.trimEnd()), writeErr: (s) => io.err(s.trimEnd()) })\n const ctx: CommandContext = { deps, io, signal, opts: () => program.opts<GlobalOpts>(), setExitCode }\n for (const r of register) r(program, ctx)\n return program\n}\n\nexport async function run(argv: string[], deps: Deps, io: Io, signal: AbortSignal, register: Register[]): Promise<number> {\n const json = jsonFromArgv(argv)\n // Commander may throw before global opts exist (e.g. an unknown option), and by default\n // writes its own message to stderr on the way there. In --json mode that would land\n // alongside our single JSON document, so suppress it here and render the error ourselves.\n const parseIo: Io = json ? { ...io, err: () => {} } : io\n const state: { exitCode?: number; command?: string } = {}\n const program = buildProgram(deps, parseIo, signal, register, (code) => { state.exitCode = code })\n // the command that ran, as commander resolved it (an option value such as `--only doctor` is not one)\n program.hook(\"preAction\", (_program, action) => { state.command = action.name() })\n try {\n await program.parseAsync(argv, { from: \"user\" })\n return state.exitCode ?? 0\n } catch (caught) {\n // Once Ctrl+C has fired, any AbortError that escaped a mapping is that cancel.\n const e = await withProxyHint(deps, signal.aborted && isAbortError(caught) ? new CancelledError() : caught)\n if (e instanceof CommanderError) {\n if (e.exitCode === 0) return 0\n if (json) io.out(JSON.stringify({ ok: false, error: { code: \"QORE_CONTEXT_INVALID\", message: e.message } }))\n return 2\n }\n const opts = program.opts<GlobalOpts>()\n renderError(io, e, Boolean(opts.json), pc.isColorSupported && opts.color !== false)\n if (!opts.json && needsDoctor(e) && state.command !== \"doctor\") io.err(\"Run qore doctor for a full check of your machine.\")\n return exitCodeFor(e)\n }\n}\n","import { CancelledError, QoreError, type QoreErrorCode } from \"../errors.js\"\n\nexport type Fetch = (input: string | URL, init?: RequestInit) => Promise<Response>\n\n/** Every request also carries `signal` (the process's Ctrl+C signal), next to any signal\n * of the caller's own, so a cancel aborts whatever is in flight (spec §4). */\nexport function abortableFetch(fetch: Fetch, signal: AbortSignal): Fetch {\n return (input, init) => fetch(input, { ...init, signal: init?.signal ? AbortSignal.any([init.signal, signal]) : signal })\n}\n\nconst TLS = new Set([\"SELF_SIGNED_CERT_IN_CHAIN\", \"UNABLE_TO_GET_ISSUER_CERT_LOCALLY\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\", \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\", \"CERT_HAS_EXPIRED\"])\n\nfunction causeCode(e: unknown): string | undefined {\n const c = (e as { cause?: { code?: unknown } })?.cause\n const code = c?.code ?? (e as { code?: unknown })?.code\n // DOMException carries a numeric legacy `code`; only errno-style strings are meaningful here.\n return typeof code === \"string\" ? code : undefined\n}\n\nexport function isAbortError(e: unknown): boolean {\n return (e as { name?: unknown } | null)?.name === \"AbortError\"\n}\n\n/** A failed fetch: a cancel (Ctrl+C aborted the request) or a network failure. */\nexport function fetchError(e: unknown, host: string): Error {\n return isAbortError(e) ? new CancelledError() : networkError(e, host)\n}\n\nfunction proxyHint(proxy: string, platform?: NodeJS.Platform): string {\n const cmd = platform === \"win32\" ? `set HTTPS_PROXY=http://${proxy}` : `export HTTPS_PROXY=http://${proxy}`\n return `Your system uses the proxy ${proxy}, but qore reads only HTTPS_PROXY. Run: ${cmd}`\n}\n\nexport function networkError(e: unknown, host: string, systemProxy?: string | null): QoreError {\n const code = causeCode(e) ?? \"\"\n let reason = \"connect\"\n let hint = \"Check your network or VPN.\"\n if (code === \"ENOTFOUND\" || code === \"EAI_AGAIN\") {\n reason = \"dns\"; hint = `${host} could not be resolved. Check your network or VPN.`\n } else if (TLS.has(code)) {\n reason = \"tls\"\n hint = \"A proxy is re-signing TLS. Point NODE_EXTRA_CA_CERTS at your organisation's CA certificate.\"\n } else if (code.includes(\"TIMEOUT\") || code === \"ETIMEDOUT\") {\n reason = \"timeout\"\n } else if (systemProxy) {\n reason = \"proxy\"\n hint = proxyHint(systemProxy)\n } else if (!process.env.HTTPS_PROXY && !process.env.https_proxy) {\n hint = \"Check your network. Behind a corporate proxy, set HTTPS_PROXY.\"\n }\n const details: Record<string, unknown> = { reason, host, errno: code || undefined }\n if (systemProxy) details.proxy = systemProxy\n return new QoreError(\"QORE_API_UNREACHABLE\", `Could not reach ${host}`, { hint, details, cause: e })\n}\n\n/** Rebuilds an already-thrown `QORE_API_UNREACHABLE` connect error with the system-proxy\n * hint, once the caller has learned the proxy (`networkError` is synchronous and can't\n * look it up itself). */\nexport function withSystemProxy(err: QoreError, proxy: string, platform: NodeJS.Platform): QoreError {\n return new QoreError(err.code, err.message, {\n status: err.status, requestId: err.requestId, cause: err.cause,\n details: { ...err.details, reason: \"proxy\", proxy },\n hint: proxyHint(proxy, platform),\n })\n}\n\nconst BY_SERVER_CODE: Record<string, QoreErrorCode> = {\n \"app.access.denied\": \"QORE_ACCESS_DENIED\",\n \"auth.scope.insufficient\": \"QORE_ACCESS_DENIED\",\n \"cli.upgrade_required\": \"QORE_UPGRADE_REQUIRED\",\n \"rate_limited\": \"QORE_RATE_LIMITED\",\n \"module.not_found\": \"QORE_RESOURCE_NOT_FOUND\",\n \"tenant.not_found\": \"QORE_RESOURCE_NOT_FOUND\",\n \"module.app_ambiguous\": \"QORE_APP_AMBIGUOUS\",\n}\n\nfunction byStatus(status: number): QoreErrorCode {\n if (status === 403) return \"QORE_ACCESS_DENIED\"\n if (status === 404) return \"QORE_RESOURCE_NOT_FOUND\"\n if (status === 426) return \"QORE_UPGRADE_REQUIRED\"\n if (status === 429) return \"QORE_RATE_LIMITED\"\n if (status === 502 || status === 503 || status === 504) return \"QORE_API_UNAVAILABLE\"\n return \"QORE_INTERNAL\"\n}\n\nexport async function problemToError(res: Response): Promise<QoreError> {\n let body: { code?: string; title?: string; detail?: unknown } = {}\n try { body = (await res.json()) as typeof body } catch { /* not JSON */ }\n const serverCode = body.code\n const code = (serverCode && BY_SERVER_CODE[serverCode]) || byStatus(res.status)\n const requestId = res.headers.get(\"x-request-id\") ?? undefined\n const details: Record<string, unknown> = {}\n if (body.detail && typeof body.detail === \"object\") Object.assign(details, body.detail)\n const detail = typeof body.detail === \"string\" && body.detail ? body.detail : undefined\n if (detail) details.detail = detail\n const retry = res.headers.get(\"retry-after\")\n if (retry && /^\\d+$/.test(retry)) details.retryAfter = Number(retry)\n const hint =\n code === \"QORE_UPGRADE_REQUIRED\" ? \"Run: npm i -g @quatronic/qore\"\n : code === \"QORE_RATE_LIMITED\" ? `Wait ${details.retryAfter ?? \"a moment\"} s and retry.`\n : code === \"QORE_API_UNAVAILABLE\" ? \"Qore is temporarily unavailable; retry in a minute.\"\n : code === \"QORE_APP_AMBIGUOUS\" ? \"Pass --app <slug>.\"\n : undefined\n const apps = (body.detail as { apps?: unknown } | undefined)?.apps\n const candidates = code === \"QORE_APP_AMBIGUOUS\" && Array.isArray(apps)\n ? (apps as { id?: string; slug: string; name?: string }[]).map((a) => ({ kind: \"app\" as const, id: a.id, slug: a.slug, name: a.name }))\n : undefined\n if (candidates) delete details.apps\n // portal-api falls back to the title \"HTTP error\"; a server code is no message either.\n // Then the string detail is the most useful message there is.\n const genericTitle = !body.title || body.title === \"HTTP error\" || body.title === serverCode\n const message = (genericTitle && detail) || body.title || `Request failed (${res.status})`\n return new QoreError(code, message, {\n status: res.status, requestId, serverCode, hint, candidates,\n details: Object.keys(details).length ? details : undefined,\n })\n}\n","import pc, { createColors } from \"picocolors\"\nimport type { CheckResult, CheckStatus, DoctorReport } from \"../core/doctor/checks.js\"\nimport { QoreError, toJsonError, type QoreErrorCode } from \"../core/errors.js\"\nimport type { Io } from \"./io.js\"\n\nexport function renderJson(io: Io, data: unknown): void {\n io.out(JSON.stringify({ ok: true, data }))\n}\n\nexport function renderError(io: Io, err: unknown, json: boolean, colorEnabled = pc.isColorSupported): void {\n if (json) { io.out(JSON.stringify({ ok: false, error: toJsonError(err) })); return }\n if (err instanceof Error && err.name === \"CancelledError\") { io.err(\"Cancelled\"); return }\n const c = createColors(colorEnabled)\n const e = err instanceof QoreError ? err : new QoreError(\"QORE_INTERNAL\", err instanceof Error ? err.message : String(err))\n io.err(c.red(`Error: ${e.message}`))\n if (e.hint) io.err(e.hint)\n io.err(c.dim(`Code: ${e.code}${e.requestId ? ` (request ${e.requestId})` : \"\"}`))\n // The last compose log lines are the remedy itself for an unrecognised service failure\n // (classifyComposeLogs already turns a recognised one into its own hint). Never the raw\n // stderr: for QORE_INSTALL_FAILED/QORE_SERVICE_UNHEALTHY that output was already streamed\n // live at module level, so echoing it again here would just duplicate it.\n if (e.code === \"QORE_SERVICE_UNHEALTHY\" && Array.isArray(e.details?.logs)) {\n for (const l of e.details.logs as unknown[]) io.err(c.dim(` ${String(l)}`))\n }\n}\n\n/** --json: one document, per the README contract — success `{ok:true,data}`, failure\n * `{ok:false,error}` with no top-level `data` (same shape `renderError` produces for\n * every other command). On any `fail`, `error` is built the way `reportWorkspaceRun`\n * builds sync's: the first failing result's own code/message/hint (or a generic\n * fallback when none carries one), with the full report nested under `error.details`. */\nexport function renderDoctorJson(io: Io, report: DoctorReport): boolean {\n const failing = report.results.filter((r) => r.status === \"fail\")\n if (failing.length === 0) { io.out(JSON.stringify({ ok: true, data: report })); return false }\n const first = failing.find((r) => r.error)\n const code = (first?.error?.code as QoreErrorCode | undefined) ?? \"QORE_INTERNAL\"\n const message = (first?.error?.message as string | undefined) ?? `${failing.length} of ${report.results.length} checks failed`\n const hint = first?.error?.hint as string | undefined\n const err = new QoreError(code, message, { hint, details: { results: report.results, context: report.context } })\n io.out(JSON.stringify({ ok: false, error: toJsonError(err) }))\n return true\n}\n\nconst SYMBOL: Record<CheckStatus, string> = { ok: \"✓\", warn: \"!\", fail: \"✗\" }\nconst TOOL_IDS = [\"qore\", \"node\", \"git\", \"github-ssh\", \"docker\"]\nconst ROW_WIDTH = 80\nconst COL_B = 36\n\nfunction rawLine(r: CheckResult): string {\n return `${SYMBOL[r.status]} ${r.label}`\n}\n\nfunction colorFor(c: ReturnType<typeof createColors>, status: CheckStatus): (s: string) => string {\n return status === \"ok\" ? c.green : status === \"warn\" ? c.yellow : c.red\n}\n\nfunction coloredLine(c: ReturnType<typeof createColors>, r: CheckResult): string {\n return `${colorFor(c, r.status)(SYMBOL[r.status])} ${r.label}`\n}\n\n/** A fail result's hint, on its own dimmed line under the check. */\nfunction printCheck(io: Io, c: ReturnType<typeof createColors>, indent: string, r: CheckResult): void {\n io.out(`${indent}${coloredLine(c, r)}`)\n const hint = r.status === \"fail\" ? r.error?.hint : undefined\n if (typeof hint === \"string\") io.out(c.dim(`${indent} ${hint}`))\n}\n\n/** Two tool results share a row when both raw (uncoloured) lines fit within 80 columns,\n * otherwise each gets its own row (spec §14.3). B starts at column `COL_B` when A leaves\n * room for it, else right after A (plus a 2-space gap) — the fit check must use that same\n * real column, not a fixed 2-space gap, or a short A + long B can render past 80 columns. */\nfunction toolRows(io: Io, c: ReturnType<typeof createColors>, tools: CheckResult[]): void {\n for (let i = 0; i < tools.length; i += 2) {\n const a = tools[i]!\n const b = tools[i + 1]\n if (!b) { printCheck(io, c, \"\", a); continue }\n const rawA = rawLine(a)\n const rawB = rawLine(b)\n const colB = Math.max(COL_B, rawA.length + 2)\n if (colB + rawB.length > ROW_WIDTH) { printCheck(io, c, \"\", a); printCheck(io, c, \"\", b); continue }\n const pad = \" \".repeat(colB - rawA.length)\n io.out(`${coloredLine(c, a)}${pad}${coloredLine(c, b)}`)\n if (a.status === \"fail\" && typeof a.error?.hint === \"string\") io.out(c.dim(` ${a.error.hint}`))\n if (b.status === \"fail\" && typeof b.error?.hint === \"string\") io.out(c.dim(` ${b.error.hint}`))\n }\n}\n\n/** `pm:`/`node:` results grouped right after their own module, by `r.module` — not by\n * push order, which is an incidental detail of `runDoctor`, not a contract. */\nfunction groupByModule(results: CheckResult[]): CheckResult[] {\n const order: string[] = []\n const groups = new Map<string, CheckResult[]>()\n for (const r of results) {\n const key = r.module ?? r.id\n if (!groups.has(key)) { groups.set(key, []); order.push(key) }\n groups.get(key)!.push(r)\n }\n const isSub = (r: CheckResult) => r.id.startsWith(\"pm:\") || r.id.startsWith(\"node:\")\n return order.flatMap((key) => {\n const g = groups.get(key)!\n return [...g.filter((r) => !isSub(r)), ...g.filter(isSub)]\n })\n}\n\n/** Human rendering of `runDoctor`'s report (spec §14.3): tools, session, clock, then the\n * workspace/module context header with its checks indented. */\nexport function renderDoctorHuman(io: Io, report: DoctorReport, colorEnabled = pc.isColorSupported): void {\n const c = createColors(colorEnabled)\n const byId = new Map(report.results.map((r) => [r.id, r]))\n const tools = TOOL_IDS.map((id) => byId.get(id)).filter((r): r is CheckResult => r !== undefined)\n toolRows(io, c, tools)\n\n for (const r of report.results.filter((r) => r.group === \"session\")) printCheck(io, c, \"\", r)\n const clock = byId.get(\"clock\")\n if (clock) printCheck(io, c, \"\", clock)\n\n const workspace = groupByModule(report.results.filter((r) => r.group === \"workspace\"))\n if (workspace.length === 0) return\n if (report.context.kind !== \"none\") {\n io.out(`→ ${report.context.kind === \"workspace\" ? \"Workspace\" : \"Module\"} ${report.context.label ?? \"\"}`)\n }\n for (const r of workspace) {\n const indent = r.id.startsWith(\"pm:\") || r.id.startsWith(\"node:\") ? \" \" : \" \"\n printCheck(io, c, indent, r)\n }\n}\n","import { join, relative, resolve } from \"node:path\"\nimport { Option, type Command } from \"commander\"\nimport { ensureCapability } from \"../../core/api/capabilities.js\"\nimport type { CliAppModule, CliAppModules } from \"../../core/api/types.js\"\nimport type { DirInfo } from \"../../platform/git.js\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { resolvePortal } from \"../../core/profiles.js\"\nimport { openSession, type Session } from \"../../core/session.js\"\nimport { resolveAppRef, resolveTenant } from \"../../core/workspace/apps.js\"\nimport { applyActions, type ModuleResult } from \"../../core/workspace/apply.js\"\nimport { readWorkspace, writeWorkspace } from \"../../core/workspace/file.js\"\nimport { planWorkspace } from \"../../core/workspace/plan.js\"\nimport { isSafeSlug, unsafeSlugError } from \"../../core/workspace/safety.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { reportWorkspaceRun } from \"../workspaceReport.js\"\n\n/** A `QoreError` thrown for one module/directory is that module's own failed result —\n * the caller keeps going with the rest (controller ruling: per-module isolation). */\nfunction asFailure(slug: string, e: unknown): ModuleResult {\n // Mirrors apply.ts's toFailure: git missing from PATH aborts the run once rather than\n // being reported once per module.\n if (e instanceof QoreError && e.code !== \"QORE_GIT_UNAVAILABLE\") {\n return { slug, status: \"failed\", error: { code: e.code, message: e.message, hint: e.hint } }\n }\n throw e\n}\n\ntype Flags = { tenant?: string; protocol: \"https\" | \"ssh\" }\n\n/** core/ never prompts (R5): resolveAppRef only names candidates in QORE_CONTEXT_REQUIRED\n * / QORE_TENANT_ACCESS_LOST, and only here — the CLI layer — does an interactive session\n * turn that into a picker and retry once with the chosen slug as `--tenant`. A\n * non-interactive session, or an error without candidates, is rethrown as-is. */\nasync function resolveApp(\n deps: CommandContext[\"deps\"], io: CommandContext[\"io\"], session: Session, appArg: string, tenantFlag: string | undefined,\n) {\n try {\n return await resolveAppRef(deps, session, appArg, tenantFlag)\n } catch (e) {\n if (!(e instanceof QoreError) || (e.code !== \"QORE_CONTEXT_REQUIRED\" && e.code !== \"QORE_TENANT_ACCESS_LOST\")) throw e\n if (!io.interactive || !e.candidates?.length) throw e\n const slug = await io.select(\"Select a tenant\", e.candidates.map((c) => ({ name: c.name ?? c.slug, value: c.slug })))\n return resolveAppRef(deps, session, appArg, slug)\n }\n}\n\n/** No app slug on the command line: interactively pick one, tenant-scoped like\n * `resolveApp`'s tenant picker above (core/ never prompts — only the CLI layer does). A\n * non-interactive session can't pick, so it's told to pass `<app>` explicitly. */\nasync function pickApp(\n deps: CommandContext[\"deps\"], io: CommandContext[\"io\"], session: Session, tenantFlag: string | undefined,\n): Promise<{ tenant: string; app: string }> {\n if (!io.interactive) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"An app is required\", {\n hint: \"Pass an app slug: `qore clone <app>`. Interactively, omitting it opens a picker.\",\n })\n }\n let tenant: { id: string; slug: string }, me: Awaited<ReturnType<typeof resolveTenant>>[\"me\"]\n try {\n ({ tenant, me } = await resolveTenant(deps, session, tenantFlag, \"the app you want to clone\"))\n } catch (e) {\n if (!(e instanceof QoreError) || (e.code !== \"QORE_CONTEXT_REQUIRED\" && e.code !== \"QORE_TENANT_ACCESS_LOST\") || !e.candidates?.length) throw e\n const slug = await io.select(\"Select a tenant\", e.candidates.map((c) => ({ name: c.name ?? c.slug, value: c.slug })))\n ;({ tenant, me } = await resolveTenant(deps, session, slug, \"the app you want to clone\"))\n }\n const apps = me.tenants.find((t) => t.id === tenant.id)?.apps ?? []\n if (apps.length === 0) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", `No apps in ${tenant.slug} to clone`, {\n hint: \"Run `qore whoami` to see what you have access to.\",\n })\n }\n const app = await io.search(\"Select an app\", (term) => {\n const q = term.toLowerCase()\n return apps\n .filter((a) => !q || a.slug.toLowerCase().includes(q) || a.name.toLowerCase().includes(q))\n .map((a) => ({ name: `${a.name} (${a.slug})`, value: a.slug }))\n })\n return { tenant: tenant.slug, app }\n}\n\nexport function registerClone(program: Command, ctx: CommandContext): void {\n program.command(\"clone\")\n .description(\"Clone an app's modules into a new workspace directory\")\n .argument(\"[app]\", \"app slug or id (omit to pick one interactively)\")\n .argument(\"[dir]\", \"target directory (default: the app's slug)\")\n .option(\"--tenant <slug>\", \"tenant the app slug belongs to, when it is not your active one\")\n .addOption(new Option(\"--protocol <https|ssh>\", \"clone URL protocol\").choices([\"https\", \"ssh\"]).default(\"https\"))\n .action(async (appArg: string | undefined, dirArg: string | undefined, flags: Flags) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n const onRequest = g.verbose ? (l: string) => io.err(l) : undefined\n const session = await openSession(deps, portal, \"clone\", onRequest)\n await ensureCapability(deps, portal.apiOrigin, \"app.modules\")\n\n const picked = appArg === undefined ? await pickApp(deps, io, session, flags.tenant) : undefined\n const appSlug = picked?.app ?? appArg!\n const ref = await resolveApp(deps, io, session, appSlug, picked?.tenant ?? flags.tenant)\n const app = await session.api.get<CliAppModules>(`/api/cli/v1/apps/${encodeURIComponent(ref.appId)}/modules`)\n\n // The default directory name comes from the server (app.slug); it must be a single\n // safe path segment before it is joined into a filesystem path (defence in depth —\n // a directory the caller typed themselves on the command line is their own choice).\n if (dirArg === undefined && !isSafeSlug(app.app.slug)) throw unsafeSlugError(app.app.slug)\n const dirLabel = dirArg ?? app.app.slug\n const root = resolve(deps.cwd, dirLabel)\n\n // Conflict check before writing anything (controller ruling): the target may hold\n // someone else's files, or another app's/portal's workspace — only *this* app's own\n // workspace at the root is allowed to continue, in which case clone behaves like a\n // sync without fetch (present modules are reported, never re-cloned).\n const info = await deps.git.inspect(root)\n if (info.exists && !info.empty) {\n const ws = await readWorkspace(root)\n if (!ws || ws.appId !== app.app.id || ws.portal !== portal.apiOrigin) {\n throw new QoreError(\"QORE_WORKSPACE_CONFLICT\", `${root} exists and is not the workspace of ${app.app.slug}`, {\n hint: `Pick another directory: qore clone ${appSlug} <dir>.`,\n })\n }\n }\n\n await writeWorkspace(root, { portal: portal.apiOrigin, appId: app.app.id })\n\n const dirs: Record<string, DirInfo> = {}\n const modulesForPlan: CliAppModule[] = []\n const earlyFailures: ModuleResult[] = []\n for (const m of app.modules) {\n if (!isSafeSlug(m.slug)) {\n earlyFailures.push(asFailure(m.slug, unsafeSlugError(m.slug)))\n continue\n }\n try {\n dirs[m.slug] = await deps.git.inspect(join(root, m.slug))\n modulesForPlan.push(m)\n } catch (e) {\n earlyFailures.push(asFailure(m.slug, e))\n }\n }\n\n const { actions } = planWorkspace(root, modulesForPlan, dirs, [])\n const applied = await applyActions(deps, { portal, app, actions, protocol: flags.protocol, onResult: () => {} })\n for (const r of applied) {\n if (r.status === \"cloned\" && r.dir) r.dir = relative(deps.cwd, r.dir) || \".\"\n }\n const results = [...earlyFailures, ...applied]\n\n const err = reportWorkspaceRun(io, results, Boolean(g.json))\n if (!g.json) {\n // The workspace file is written before any module is cloned, so it exists even when\n // some (or every) clone failed — say so, then let the failure decide the exit code.\n io.out(`✓ Wrote ${join(dirLabel, \"qore.workspace.json\")}`)\n const first = results.find((r) => r.status === \"cloned\" || r.status === \"present\")\n if (first && !err) io.out(`Next: cd ${join(dirLabel, first.slug)} && qore env pull`)\n }\n if (err) throw err\n })\n}\n","import { QoreError } from \"../errors.js\"\nimport type { PortalRef } from \"../profiles.js\"\nimport { fetchError, problemToError, type Fetch } from \"./http.js\"\nimport type { CliMeta } from \"./types.js\"\n\nconst SUPPORTED = [\"v1\"] as const\nconst SEMVER = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/\n\nexport function compareVersions(a: string, b: string): number {\n const pa = SEMVER.exec(a), pb = SEMVER.exec(b)\n if (!pa || !pb) return 0\n for (let i = 1; i <= 3; i++) {\n const d = Number(pa[i]) - Number(pb[i])\n if (d !== 0) return d\n }\n if (pa[4] && !pb[4]) return -1\n if (!pa[4] && pb[4]) return 1\n return 0\n}\n\nexport async function fetchMeta(fetch: Fetch, apiOrigin: string): Promise<CliMeta> {\n return (await fetchMetaWithDate(fetch, apiOrigin)).meta\n}\n\n/** Uncached: never reads or writes the profile's meta cache (`qore doctor` writes nothing). */\nexport async function fetchMetaWithDate(fetch: Fetch, apiOrigin: string): Promise<{ meta: CliMeta; date: Date | null }> {\n let res: Response\n try { res = await fetch(`${apiOrigin}/api/cli/meta`, { headers: { accept: \"application/json\" } }) }\n catch (e) { throw fetchError(e, new URL(apiOrigin).host) }\n if (res.status === 404) {\n // No CLI surface at all: a portal-api from before the CLI (or the wrong URL).\n throw new QoreError(\"QORE_INCOMPATIBLE_SERVER\", \"This portal does not support the Qore CLI yet\", {\n status: 404, requestId: res.headers.get(\"x-request-id\") ?? undefined,\n hint: `Check the portal URL (${apiOrigin}); if it is right, the portal must be upgraded before qore can use it.`,\n })\n }\n if (!res.ok) throw await problemToError(res)\n const header = res.headers.get(\"date\")\n const ms = header ? Date.parse(header) : NaN\n return { meta: (await res.json()) as CliMeta, date: Number.isNaN(ms) ? null : new Date(ms) }\n}\n\nexport function negotiate(meta: CliMeta, portal: PortalRef, cliVersion: string): { apiVersion: \"v1\" } {\n if (portal.pinnedIssuer && meta.auth.issuer !== portal.pinnedIssuer) {\n throw new QoreError(\"QORE_PORTAL_UNTRUSTED\", `${portal.apiOrigin} names an unexpected identity provider`, {\n details: { expected: portal.pinnedIssuer, got: meta.auth.issuer },\n hint: \"Refusing to log in. Check the portal URL and your network.\",\n })\n }\n const apiVersion = SUPPORTED.find((v) => meta.apiVersions.includes(v))\n if (!apiVersion) {\n throw new QoreError(\"QORE_INCOMPATIBLE_SERVER\", \"This portal speaks no API version this qore knows\", {\n details: { server: meta.apiVersions, client: [...SUPPORTED] }, hint: \"Run: npm i -g @quatronic/qore\",\n })\n }\n if (!cliVersion.endsWith(\"-dev\") && compareVersions(cliVersion, meta.minCliVersion) < 0) {\n throw new QoreError(\"QORE_UPGRADE_REQUIRED\", `qore ${cliVersion} is too old for this portal (needs ${meta.minCliVersion})`, {\n hint: \"Run: npm i -g @quatronic/qore\",\n })\n }\n return { apiVersion }\n}\n","import type { Deps } from \"../deps.js\"\nimport { QoreError } from \"../errors.js\"\nimport { fetchMeta } from \"./meta.js\"\nimport type { CliMeta } from \"./types.js\"\n\nconst TTL_MS = 3600_000\n\nfunction isMeta(doc: unknown): doc is CliMeta {\n return !!doc && typeof doc === \"object\" && Array.isArray((doc as CliMeta).capabilities)\n}\n\nasync function loadMeta(deps: Deps, apiOrigin: string, refresh: boolean): Promise<{ meta: CliMeta; cached: boolean }> {\n const cached = (await deps.config.read()).profiles[apiOrigin]?.meta\n if (!refresh && cached && isMeta(cached.doc) && deps.now().getTime() - new Date(cached.fetchedAt).getTime() < TTL_MS) {\n return { meta: cached.doc, cached: true }\n }\n const meta = await fetchMeta(deps.fetch, apiOrigin)\n await deps.config.update((c) => {\n const p = c.profiles[apiOrigin]\n if (p) p.meta = { fetchedAt: deps.now().toISOString(), doc: meta }\n })\n return { meta, cached: false }\n}\n\n/** Meta per profile, cached 1 h in the profile (spec §9.1). The issuer was pinned at\n * login; a refresh here only updates capabilities and versions. */\nexport async function metaFor(deps: Deps, apiOrigin: string): Promise<CliMeta> {\n return (await loadMeta(deps, apiOrigin, false)).meta\n}\n\n/** `requireCapability` against the profile's meta. A miss on *cached* meta refetches once\n * before failing: the cache may predate a portal upgrade, and \"try again once it has been\n * updated\" is wrong advice for an hour after it has been. */\nexport async function ensureCapability(deps: Deps, apiOrigin: string, capability: string): Promise<CliMeta> {\n const first = await loadMeta(deps, apiOrigin, false)\n let meta = first.meta\n if (!meta.capabilities.includes(capability) && first.cached) meta = (await loadMeta(deps, apiOrigin, true)).meta\n requireCapability(meta, capability, apiOrigin)\n return meta\n}\n\nexport function requireCapability(meta: CliMeta, capability: string, apiOrigin: string): void {\n if (meta.capabilities.includes(capability)) return\n throw new QoreError(\"QORE_UNSUPPORTED_BY_SERVER\", `This portal does not support ${capability} yet`, {\n hint: `The portal at ${apiOrigin} is older than this qore. Try again once it has been updated.`,\n details: { capability, portal: apiOrigin },\n })\n}\n","import { createHash } from \"node:crypto\"\nimport { QoreError } from \"./errors.js\"\n\nexport type PortalRef = { apiOrigin: string; pinnedIssuer: string | null; builtin: \"prod\" | \"staging\" | null }\n\nexport const BUILTIN_PORTALS = {\n prod: {\n apiOrigin: \"https://api.quatronic.app\",\n pinnedIssuer: \"https://auth.quatronic.app/realms/platform-prod\",\n },\n staging: {\n apiOrigin: \"https://p01--portal-api-staging--hcywmtb2vksv.code.run\",\n pinnedIssuer: \"https://auth-staging.quatronic.app/realms/platform-staging\",\n },\n} as const satisfies Record<string, { apiOrigin: string; pinnedIssuer: string | null }>\n\nfunction builtinFor(origin: string): PortalRef | null {\n for (const [name, p] of Object.entries(BUILTIN_PORTALS)) {\n if (p.apiOrigin === origin) return { ...p, builtin: name as \"prod\" | \"staging\" }\n }\n return null\n}\n\nfunction toOrigin(raw: string): string {\n let url: URL\n try { url = new URL(raw) } catch {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `Not a portal name or URL: ${raw}`, {\n hint: \"Use --portal prod, --portal staging or --portal https://…\",\n })\n }\n const loopback = url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\"\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && loopback)) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", \"A portal URL must use https (http only for localhost)\")\n }\n return url.origin.toLowerCase()\n}\n\nexport function resolvePortal(arg: string | undefined, defaultProfile: string | undefined): PortalRef {\n const chosen = arg ?? defaultProfile\n if (chosen === undefined || chosen === \"prod\") return { ...BUILTIN_PORTALS.prod, builtin: \"prod\" }\n if (chosen === \"staging\") return { ...BUILTIN_PORTALS.staging, builtin: \"staging\" }\n const origin = toOrigin(chosen)\n return builtinFor(origin) ?? { apiOrigin: origin, pinnedIssuer: null, builtin: null }\n}\n\nexport function profileHash(apiOrigin: string, issuer: string): string {\n return createHash(\"sha256\").update(`${apiOrigin}|${issuer}`).digest(\"hex\").slice(0, 16)\n}\n","import { QoreError } from \"../errors.js\"\nimport { fetchError, problemToError, type Fetch } from \"./http.js\"\n\n/** Seconds by which the server's `Date` header leads `now` (rounded), or `null` when the\n * header is absent or unparseable. */\nfunction clockSkewSeconds(dateHeader: string | null, now: Date): number | null {\n if (!dateHeader) return null\n const serverMs = Date.parse(dateHeader)\n if (Number.isNaN(serverMs)) return null\n return Math.round((serverMs - now.getTime()) / 1000)\n}\n\nexport class QoreApiClient {\n constructor(private readonly o: {\n apiOrigin: string; fetch: Fetch; token: (force: boolean) => Promise<string>\n cliVersion: string; command: string; platform: string; onRequest?: (line: string) => void\n now?: () => Date\n }) {}\n\n private async once(method: \"GET\" | \"POST\", path: string, body: unknown, force: boolean): Promise<Response> {\n const token = await this.o.token(force)\n const headers: Record<string, string> = {\n authorization: `Bearer ${token}`,\n accept: \"application/json\",\n \"qore-cli-version\": this.o.cliVersion,\n \"qore-command\": this.o.command,\n \"user-agent\": `qore/${this.o.cliVersion} (${this.o.platform})`,\n }\n if (body !== undefined) headers[\"content-type\"] = \"application/json\"\n let res: Response\n try {\n res = await this.o.fetch(`${this.o.apiOrigin}${path}`, {\n method, headers, body: body === undefined ? undefined : JSON.stringify(body),\n })\n } catch (e) { throw fetchError(e, new URL(this.o.apiOrigin).host) }\n const rid = res.headers.get(\"x-request-id\")\n this.o.onRequest?.(`${method} ${path} → ${res.status}${rid ? ` (${rid})` : \"\"}`)\n return res\n }\n\n private async request<T>(method: \"GET\" | \"POST\", path: string, body?: unknown): Promise<T> {\n let res = await this.once(method, path, body, false)\n if (res.status === 401) {\n res = await this.once(method, path, body, true)\n if (res.status === 401) {\n const skew = clockSkewSeconds(res.headers.get(\"date\"), (this.o.now ?? (() => new Date()))())\n if (skew !== null && Math.abs(skew) > 60) {\n const minutes = Math.max(1, Math.round(Math.abs(skew) / 60))\n throw new QoreError(\"QORE_CLOCK_SKEW\", `Your clock is off by ${minutes} min; tokens look expired`, {\n hint: \"Turn on automatic date and time, then run the command again.\",\n status: 401, details: { skewSeconds: skew },\n })\n }\n throw new QoreError(\"QORE_SESSION_EXPIRED\", \"The portal no longer accepts your session\", {\n hint: \"Run `qore login`.\", status: 401, requestId: res.headers.get(\"x-request-id\") ?? undefined,\n })\n }\n }\n if (!res.ok) throw await problemToError(res)\n return (await res.json()) as T\n }\n\n get<T>(path: string): Promise<T> { return this.request<T>(\"GET\", path) }\n post<T>(path: string, body: unknown): Promise<T> { return this.request<T>(\"POST\", path, body) }\n}\n","import { QoreError } from \"../errors.js\"\nimport type { WithLock } from \"../../platform/lock.js\"\nimport type { Oidc, TokenSet } from \"./oidc.js\"\nimport type { TokenStore } from \"./tokenStore.js\"\n\nconst SKEW_MS = 60_000\n\nexport class RefreshCoordinator {\n constructor(private readonly o: {\n store: TokenStore; oidc: () => Promise<Oidc>; withLock: WithLock; lockName: string; now: () => Date\n }) {}\n\n private fresh(expiresAt: string): boolean {\n return new Date(expiresAt).getTime() - this.o.now().getTime() > SKEW_MS\n }\n\n private async rotate(scope?: string): Promise<TokenSet> {\n let stored = await this.o.store.getRefresh()\n if (!stored) throw new QoreError(\"QORE_NOT_LOGGED_IN\", \"Not logged in\", { hint: \"Run `qore login`.\" })\n let t: TokenSet\n for (let attempt = 0; ; attempt++) {\n try {\n t = await (await this.o.oidc()).refresh(stored.rt, scope)\n break\n } catch (e) {\n if (!(e instanceof QoreError && e.code === \"QORE_SESSION_EXPIRED\")) throw e\n // Only the RT we presented was rejected. Another process may have rotated it\n // meanwhile (a stolen stale lock, a second config dir, a lost response): then the\n // stored RT is newer, so retry once with it instead of logging the user out.\n const now = await this.o.store.getRefresh()\n if (now && now.rt !== stored.rt) {\n if (attempt === 0) { stored = now; continue }\n throw e\n }\n await this.o.store.clear()\n throw e\n }\n }\n // Store the scope the token response reports: after a downscoped refresh the rotated RT\n // may carry only the narrowed scope, so never record the old full scope for it. An empty\n // response scope means \"as requested\" (RFC 6749 §5.1).\n await this.o.store.setRefresh({ rt: t.refreshToken, sub: t.sub, scope: t.scope || (scope ?? stored.scope), obtainedAt: this.o.now().toISOString() })\n return t\n }\n\n async accessToken(opts: { force?: boolean } = {}): Promise<string> {\n const seen = await this.o.store.getAccess()\n if (!opts.force && seen && this.fresh(seen.expiresAt)) return seen.at\n return this.o.withLock(this.o.lockName, async () => {\n const again = await this.o.store.getAccess()\n if (again && again.at !== seen?.at && this.fresh(again.expiresAt)) return again.at\n const t = await this.rotate()\n await this.o.store.setAccess({ at: t.accessToken, expiresAt: new Date(this.o.now().getTime() + t.expiresIn * 1000).toISOString() })\n return t.accessToken\n })\n }\n\n /** A token carrying only `scopes`, held in memory by the caller (qore mcp). */\n async downscoped(scopes: string[]): Promise<string> {\n return this.o.withLock(this.o.lockName, async () => (await this.rotate(scopes.join(\" \"))).accessToken)\n }\n}\n","import type { Keychain } from \"../../platform/keychain.js\"\n\nexport type StoredRefresh = { rt: string; sub: string; scope: string; obtainedAt: string }\nexport type StoredAccess = { at: string; expiresAt: string }\n\nexport class TokenStore {\n constructor(private readonly kc: Keychain, private readonly hash: string) {}\n\n private async read<T>(suffix: string): Promise<T | null> {\n const raw = await this.kc.get(`${this.hash}:${suffix}`)\n if (raw === null) return null\n try { return JSON.parse(raw) as T } catch { return null }\n }\n\n getRefresh() { return this.read<StoredRefresh>(\"refresh\") }\n getAccess() { return this.read<StoredAccess>(\"access\") }\n setRefresh(v: StoredRefresh) { return this.kc.set(`${this.hash}:refresh`, JSON.stringify(v)) }\n setAccess(v: StoredAccess) { return this.kc.set(`${this.hash}:access`, JSON.stringify(v)) }\n async clear() {\n await this.kc.delete(`${this.hash}:access`)\n await this.kc.delete(`${this.hash}:refresh`)\n }\n}\n","import { QoreApiClient } from \"./api/client.js\"\nimport { RefreshCoordinator } from \"./auth/refresh.js\"\nimport { TokenStore } from \"./auth/tokenStore.js\"\nimport type { ProfileRecord } from \"./config.js\"\nimport type { Deps } from \"./deps.js\"\nimport { QoreError } from \"./errors.js\"\nimport { profileHash, type PortalRef } from \"./profiles.js\"\n\nexport function loginHint(portal: PortalRef): string {\n return portal.builtin === \"prod\" ? \"Run `qore login`.\" : `Run \\`qore login --portal ${portal.builtin ?? portal.apiOrigin}\\`.`\n}\n\nexport async function openSession(deps: Deps, portal: PortalRef, command: string, onRequest?: (l: string) => void) {\n const profile: ProfileRecord | undefined = (await deps.config.read()).profiles[portal.apiOrigin]\n if (!profile) throw new QoreError(\"QORE_NOT_LOGGED_IN\", `Not logged in to ${portal.apiOrigin}`, { hint: loginHint(portal) })\n const hash = profileHash(profile.apiOrigin, profile.issuer)\n const tokens = new TokenStore(deps.keychain, hash)\n if (!(await tokens.getRefresh())) throw new QoreError(\"QORE_NOT_LOGGED_IN\", `Not logged in to ${portal.apiOrigin}`, { hint: loginHint(portal) })\n const refresh = new RefreshCoordinator({ store: tokens, oidc: () => deps.oidcFor(profile.issuer), withLock: deps.withLock, lockName: hash, now: deps.now })\n const api = new QoreApiClient({\n apiOrigin: profile.apiOrigin, fetch: deps.fetch, token: (force) => refresh.accessToken({ force }),\n cliVersion: deps.version, command, platform: `${deps.platform} ${process.arch}; node ${process.versions.node}`, onRequest,\n now: deps.now,\n })\n return { profile, api, tokens, refresh }\n}\n\nexport type Session = Awaited<ReturnType<typeof openSession>>\n","import type { CliMe } from \"../api/types.js\"\nimport type { Deps } from \"../deps.js\"\nimport { QoreError, type Candidate } from \"../errors.js\"\nimport type { Session } from \"../session.js\"\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nconst tenantCandidates = (tenants: CliMe[\"tenants\"]): Candidate[] =>\n tenants.map((t) => ({ kind: \"tenant\", id: t.id, slug: t.slug, name: t.name }))\n\n/** Resolves which tenant an app-scoped command runs against: `--tenant` validated against\n * `/me`, else the profile's `activeTenant` revalidated against `/me`\n * (QORE_TENANT_ACCESS_LOST if it is gone), else the single tenant in `/me`, else\n * QORE_CONTEXT_REQUIRED naming every tenant slug as a candidate (the CLI layer turns that,\n * and QORE_TENANT_ACCESS_LOST, into an interactive picker). `whatFor` names the thing the\n * caller is resolving a tenant for, in the \"which tenant\" question (e.g. an app slug). */\nexport async function resolveTenant(\n deps: Deps,\n session: Session,\n tenantFlag: string | undefined,\n whatFor: string,\n): Promise<{ tenant: { id: string; slug: string }; me: CliMe }> {\n const me = await session.api.get<CliMe>(\"/api/cli/v1/me\")\n let tenant: { id: string; slug: string }\n if (tenantFlag) {\n const found = me.tenants.find((t) => t.slug === tenantFlag)\n if (!found) {\n throw new QoreError(\"QORE_RESOURCE_NOT_FOUND\", `No tenant \"${tenantFlag}\" for this account`, {\n candidates: tenantCandidates(me.tenants),\n })\n }\n tenant = { id: found.id, slug: found.slug }\n } else if (session.profile.activeTenant) {\n const active = session.profile.activeTenant\n const found = me.tenants.find((t) => t.id === active.id)\n if (!found) {\n throw new QoreError(\"QORE_TENANT_ACCESS_LOST\", `You no longer have developer access to ${active.slug}`, {\n hint: \"Run `qore tenant use <slug>`.\", candidates: tenantCandidates(me.tenants),\n })\n }\n tenant = { id: found.id, slug: found.slug }\n } else if (me.tenants.length === 1) {\n tenant = { id: me.tenants[0]!.id, slug: me.tenants[0]!.slug }\n } else {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", `Which tenant is \"${whatFor}\" in?`, {\n hint: \"Run `qore tenant use <slug>`, or pass --tenant <slug>.\", candidates: tenantCandidates(me.tenants),\n })\n }\n return { tenant, me }\n}\n\n/** §5.1: the app arg is either a bare app id, or a slug resolved against a tenant. */\nexport async function resolveAppRef(\n deps: Deps,\n session: Session,\n arg: string,\n tenantFlag?: string,\n): Promise<{ appId: string; tenant: { id: string; slug: string } | null }> {\n if (UUID.test(arg)) return { appId: arg, tenant: null }\n\n const { tenant } = await resolveTenant(deps, session, tenantFlag, arg)\n\n try {\n const { id } = await session.api.get<{ id: string }>(\n `/api/cli/v1/tenants/${encodeURIComponent(tenant.id)}/apps/resolve?slug=${encodeURIComponent(arg)}`)\n return { appId: id, tenant }\n } catch (e) {\n // The generic 404 mapping (problemToError) carries no hint — this call site knows\n // specifically that the slug didn't resolve to an app, so it can say what to do\n // about it. Only fills in a hint the server/generic mapping left empty.\n if (e instanceof QoreError && e.code === \"QORE_RESOURCE_NOT_FOUND\" && !e.hint) {\n throw new QoreError(e.code, e.message, {\n hint: \"Check the slug; `qore whoami` lists the apps you can see.\",\n status: e.status, requestId: e.requestId, candidates: e.candidates, serverCode: e.serverCode, details: e.details, cause: e.cause,\n })\n }\n throw e\n }\n}\n","import { join } from \"node:path\"\nimport type { CliAppModules } from \"../api/types.js\"\nimport { ResolutionCache } from \"../context/cache.js\"\nimport { repoKey } from \"../context/repoKey.js\"\nimport type { Deps } from \"../deps.js\"\nimport { QoreError } from \"../errors.js\"\nimport type { PortalRef } from \"../profiles.js\"\nimport { trust } from \"../trust.js\"\nimport { classifyCloneFailure, classifyPullFailure } from \"./diagnose.js\"\nimport { cloneUrl, conflictText, unsupportedRepoUrlError, type ModuleAction } from \"./plan.js\"\n\nexport type ModuleResult = {\n slug: string\n status: \"cloned\" | \"present\" | \"fetched\" | \"pulled\" | \"skipped\" | \"failed\" | \"conflict\" | \"no-repo\" | \"removed\"\n reason?: string\n error?: { code: string; message: string; hint?: string }\n /** Set only for `cloned` — the destination directory, for the human-mode `→ <dir>` line. */\n dir?: string\n}\n\n/** Per-module isolation (controller ruling): a `QoreError` thrown by a git call for one\n * module is caught and turned into that module's own `failed` result, and the loop moves\n * on to the next module — a broken `.git` directory or a `git remote -v` failure in one\n * repository must never abort the whole run. Anything that is not a `QoreError` is a bug,\n * not a per-module failure, and keeps propagating. */\nfunction toFailure(slug: string, e: unknown): ModuleResult {\n // git missing from PATH is not a per-module condition — every remaining git call in this\n // run would fail the same way, so it aborts the run once instead of being reported once\n // per module.\n if (e instanceof QoreError && e.code !== \"QORE_GIT_UNAVAILABLE\") {\n return { slug, status: \"failed\", error: { code: e.code, message: e.message, hint: e.hint } }\n }\n throw e\n}\n\n/** Spec §14.2: a conflicting module directory as a sync result — see `conflictText`. */\nfunction conflictResult(deps: Deps, action: ModuleAction): ModuleResult {\n const { message, hint } = conflictText(deps.cwd, action)\n return { slug: action.module.slug, status: \"conflict\", reason: action.reason, error: { code: \"QORE_WORKSPACE_CONFLICT\", message, hint } }\n}\n\n/** Sequential, never destructive (Global Constraints: \"Clone and sync behaviour\"). A\n * present/conflict/no-repo action is only reported — it never touches the directory. A\n * clone action that succeeds is trusted (spec §5.4: cloned by qore = trusted) and cached,\n * so a later `qore status` in that repository resolves without another repos/resolve. */\nexport async function applyActions(deps: Deps, o: {\n portal: PortalRef\n app: CliAppModules\n actions: ModuleAction[]\n protocol: \"https\" | \"ssh\"\n onResult: (r: ModuleResult) => void\n}): Promise<ModuleResult[]> {\n const cache = new ResolutionCache(join(deps.config.dir, \"cache\"), deps.now)\n const results: ModuleResult[] = []\n for (const action of o.actions) {\n let result: ModuleResult\n switch (action.kind) {\n case \"present\":\n result = { slug: action.module.slug, status: \"present\" }\n break\n case \"conflict\":\n result = conflictResult(deps, action)\n break\n case \"unsupported\": {\n const e = unsupportedRepoUrlError(action.module.slug, action.module.repoUrl ?? \"\")\n result = { slug: action.module.slug, status: \"failed\", reason: action.reason, error: { code: e.code, message: e.message, hint: e.hint } }\n break\n }\n case \"no-repo\":\n result = { slug: action.module.slug, status: \"no-repo\", reason: action.reason }\n break\n case \"clone\": {\n try {\n const url = cloneUrl(action.module.repoUrl!, o.protocol)\n const r = await deps.git.clone(url, action.dir)\n if (r.ok) {\n await trust(deps, action.dir, action.module.id)\n const key = repoKey(action.module.repoUrl!)\n if (key) await cache.put(o.portal.apiOrigin, key, action.module.id)\n result = { slug: action.module.slug, status: \"cloned\", dir: action.dir }\n } else {\n const err = classifyCloneFailure(r.stderr, action.module, o.app, o.protocol)\n result = { slug: action.module.slug, status: \"failed\", error: { code: err.code, message: err.message, hint: err.hint } }\n }\n } catch (e) {\n result = toFailure(action.module.slug, e)\n }\n break\n }\n }\n results.push(result)\n o.onResult(result)\n }\n return results\n}\n\n/** Fetches every `present` repository; `pull` additionally fast-forwards a clean\n * repository with an upstream. Mutates `results` in place — the caller passes the same\n * array it renders and reports the exit code from. A dirty tree, one without an upstream,\n * or a `status`/`pull` failure is `skipped` with its reason, never touched further. Per\n * the controller ruling, a thrown `QoreError` from any git call is that module's own\n * `failed` result — it never aborts the remaining modules. */\nexport async function syncPresent(\n deps: Deps,\n results: ModuleResult[],\n actions: ModuleAction[],\n pull: boolean,\n ctx: { app: CliAppModules; protocol: \"https\" | \"ssh\" },\n): Promise<void> {\n const bySlug = new Map(actions.map((a) => [a.module.slug, a]))\n for (const result of results) {\n if (result.status !== \"present\") continue\n const action = bySlug.get(result.slug)\n if (!action) continue\n\n let fetchRes\n try {\n fetchRes = await deps.git.fetch(action.dir)\n } catch (e) {\n Object.assign(result, toFailure(result.slug, e))\n continue\n }\n if (!fetchRes.ok) {\n const err = classifyCloneFailure(fetchRes.stderr, action.module, ctx.app, ctx.protocol)\n result.status = \"failed\"\n result.error = { code: err.code, message: err.message, hint: err.hint }\n continue\n }\n result.status = \"fetched\"\n if (!pull) continue\n\n let st\n try {\n st = await deps.git.status(action.dir)\n } catch (e) {\n Object.assign(result, toFailure(result.slug, e))\n continue\n }\n if (!st.ok) {\n result.status = \"skipped\"\n result.reason = classifyPullFailure(st.stderr)\n continue\n }\n if (st.dirty) {\n result.status = \"skipped\"\n result.reason = \"uncommitted changes\"\n continue\n }\n if (!st.upstream) {\n result.status = \"skipped\"\n result.reason = \"no upstream branch\"\n continue\n }\n\n let pullRes\n try {\n pullRes = await deps.git.pullFfOnly(action.dir)\n } catch (e) {\n Object.assign(result, toFailure(result.slug, e))\n continue\n }\n if (!pullRes.ok) {\n result.status = \"skipped\"\n result.reason = classifyPullFailure(pullRes.stderr)\n continue\n }\n result.status = \"pulled\"\n }\n}\n","import { join } from \"node:path\"\nimport { readJson, writeJsonAtomic } from \"../jsonFile.js\"\n\ntype Entry = { moduleId: string; resolvedAt: string }\ntype CacheFile = { schemaVersion: 1; entries: Record<string, Entry> }\nconst TTL_MS = 24 * 3600_000\n\n/** Speed and offline display only — every command still sends the moduleId to the\n * server, which authorizes it afresh (spec §5.2). */\nexport class ResolutionCache {\n constructor(private readonly dir: string, private readonly now: () => Date) {}\n\n private async load(): Promise<CacheFile> {\n try {\n const f = await readJson<CacheFile>(join(this.dir, \"repos.json\"))\n if (f && f.schemaVersion === 1 && typeof f.entries === \"object\" && f.entries) return f\n } catch { /* a malformed cache is an empty cache */ }\n return { schemaVersion: 1, entries: {} }\n }\n\n private fresh(e: Entry | undefined): e is Entry {\n return !!e && this.now().getTime() - new Date(e.resolvedAt).getTime() < TTL_MS\n }\n\n async get(origin: string, key: string): Promise<string | null> {\n const e = (await this.load()).entries[`${origin}|${key}`]\n return this.fresh(e) ? e.moduleId : null\n }\n\n /** Never throws: a read-only config dir, a full disk or a Windows EPERM on rename\n * (another qore holding the file) must not fail a command that already resolved. */\n async put(origin: string, key: string, moduleId: string): Promise<void> {\n const f = await this.load()\n f.entries[`${origin}|${key}`] = { moduleId, resolvedAt: this.now().toISOString() }\n for (const [k, e] of Object.entries(f.entries)) if (!this.fresh(e)) delete f.entries[k]\n await this.save(f)\n }\n\n /** Never throws, like `put`. */\n async drop(origin: string, key: string): Promise<void> {\n const f = await this.load()\n if (!(`${origin}|${key}` in f.entries)) return\n delete f.entries[`${origin}|${key}`]\n await this.save(f)\n }\n\n private async save(f: CacheFile): Promise<void> {\n try { await writeJsonAtomic(this.dir, \"repos.json\", f) } catch { /* cache only */ }\n }\n\n async originsFor(keys: string[]): Promise<string[]> {\n const f = await this.load()\n const hits: { origin: string; at: number }[] = []\n for (const [k, e] of Object.entries(f.entries)) {\n const sep = k.lastIndexOf(\"|\")\n if (keys.includes(k.slice(sep + 1)) && this.fresh(e)) hits.push({ origin: k.slice(0, sep), at: new Date(e.resolvedAt).getTime() })\n }\n hits.sort((a, b) => b.at - a.at)\n return [...new Set(hits.map((h) => h.origin))]\n }\n}\n","import { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\nexport async function readJson<T>(file: string): Promise<T | null> {\n let raw: string\n try { raw = await readFile(file, \"utf8\") } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return null\n throw e\n }\n return JSON.parse(raw) as T\n}\n\nexport async function writeJsonAtomic(dir: string, name: string, data: unknown): Promise<void> {\n await mkdir(dir, { recursive: true, mode: 0o700 })\n const tmp = join(dir, `.${name}.${randomBytes(6).toString(\"hex\")}.tmp`)\n await writeFile(tmp, JSON.stringify(data, null, 2) + \"\\n\", { mode: 0o600 })\n await chmod(tmp, 0o600)\n await rename(tmp, join(dir, name))\n}\n","/** `host/owner/repo`, lowercase — the same normalisation portal-api applies\n * (QDC `services/cli_repo_key.py`), pinned by a shared parity table. */\n\n// scp-like git syntax: [user@]host:path, path not starting with \"/\".\nconst SCP = /^(?:[^@/]+@)?([^:/]+):([^/].*)$/\nconst SCHEMES = new Set([\"https:\", \"http:\", \"ssh:\", \"git:\"])\n// Dot segments, also percent-encoded: WHATWG URL resolves these and Python's urlsplit\n// does not, so the two sides would disagree. Neither is a realistic remote: reject.\nconst DOT_SEGMENTS = new Set([\".\", \"..\", \"%2e\", \"%2e%2e\", \".%2e\", \"%2e.\"])\nconst hasDotSegment = (pieces: string[]) => pieces.some((p) => DOT_SEGMENTS.has(p.toLowerCase()))\n\nexport function repoKey(url: string): string | null {\n let raw = url.trim()\n if (raw.startsWith(\"git+\")) raw = raw.slice(4)\n // A backslash is a separator to WHATWG but a literal to urlsplit: reject it outright.\n if (!raw || raw.includes(\"\\\\\")) return null\n let host: string\n let path: string\n if (raw.includes(\"://\")) {\n if (hasDotSegment(raw.slice(raw.indexOf(\"://\") + 3).split(\"/\").slice(1))) return null\n let u: URL\n try { u = new URL(raw) } catch { return null }\n if (!SCHEMES.has(u.protocol.toLowerCase())) return null\n // WHATWG leaves non-special hosts (ssh:, git:) in their original case.\n host = u.hostname\n path = u.pathname\n } else {\n const m = SCP.exec(raw)\n if (!m) return null\n host = m[1]!\n path = m[2]!\n }\n const segments = path.split(\"/\").filter(Boolean)\n if (!host || segments.length !== 2 || hasDotSegment(segments)) return null\n const owner = segments[0]!\n let repo = segments[1]!\n if (repo.toLowerCase().endsWith(\".git\")) repo = repo.slice(0, -4)\n if (!repo) return null\n return `${host.toLowerCase()}/${owner.toLowerCase()}/${repo.toLowerCase()}`\n}\n","import { realpath } from \"node:fs/promises\"\nimport type { Deps } from \"./deps.js\"\n\n/** Spec §5.4: a safety interlock, not authorization — the server still authorizes. */\nexport function trustKey(root: string, platform: NodeJS.Platform): string {\n return platform === \"win32\" ? root.toLowerCase() : root\n}\n\nasync function keyOf(deps: Deps, root: string): Promise<string> {\n let real = root\n try {\n real = await realpath(root)\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e\n // a vanished dir keeps its literal path\n }\n return trustKey(real, deps.platform)\n}\n\nexport async function isTrusted(deps: Deps, root: string, moduleId: string): Promise<boolean> {\n const cfg = await deps.config.read()\n return (cfg.trustedRepos?.[await keyOf(deps, root)] ?? []).includes(moduleId)\n}\n\nexport async function trust(deps: Deps, root: string, moduleId: string): Promise<void> {\n const key = await keyOf(deps, root)\n await deps.config.update((c) => {\n const repos = (c.trustedRepos ??= {})\n const list = new Set(repos[key] ?? [])\n list.add(moduleId)\n repos[key] = [...list]\n })\n}\n","import { join, relative } from \"node:path\"\nimport type { CliAppModule } from \"../api/types.js\"\nimport { repoKey } from \"../context/repoKey.js\"\nimport { QoreError } from \"../errors.js\"\nimport type { DirInfo } from \"../../platform/git.js\"\n\nexport type ModuleAction = {\n module: CliAppModule\n dir: string\n kind: \"clone\" | \"present\" | \"conflict\" | \"no-repo\" | \"unsupported\"\n reason?: string\n /** For a re-pointed conflict: the URL the directory's `origin` points at (null: no origin). */\n origin?: string | null\n}\n\nconst SEGMENT = /^[A-Za-z0-9_.-]+$/\n\n/** Only `https://<host>/<owner>/<repo>[.git]` — the shape the portal hands out. Anything\n * else (another scheme, credentials, a query, extra path segments, a host or segment that\n * could read as an option) is refused before it reaches `git clone` or the ssh rewrite. */\nexport function isSupportedRepoUrl(repoUrl: string): boolean {\n let u: URL\n try { u = new URL(repoUrl) } catch { return false }\n if (u.protocol !== \"https:\" || !u.hostname || u.hostname.startsWith(\"-\")) return false\n if (u.username || u.password || u.search || u.hash) return false\n const segments = u.pathname.replace(/\\/+$/, \"\").split(\"/\").slice(1)\n return segments.length === 2 && segments.every((s) => SEGMENT.test(s) && !s.startsWith(\"-\") && s !== \".\" && s !== \"..\")\n}\n\nexport function unsupportedRepoUrlError(slug: string, repoUrl: string): QoreError {\n return new QoreError(\"QORE_INTERNAL\", `${slug}: unsupported repository URL ${JSON.stringify(repoUrl)}`, {\n hint: \"This looks like a portal bug — please report it.\",\n })\n}\n\nexport function cloneUrl(repoUrl: string, protocol: \"https\" | \"ssh\"): string {\n if (!isSupportedRepoUrl(repoUrl)) throw unsupportedRepoUrlError(\"module\", repoUrl)\n if (protocol === \"https\") return repoUrl\n const u = new URL(repoUrl)\n return `git@${u.hostname}:${u.pathname.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\").replace(/\\.git$/, \"\")}.git`\n}\n\n/** Spec §14.2: a conflicting module directory names the directory and what it holds, and\n * the remedy — qore itself never moves it. `dir` is shown relative to `cwd`. Shared by\n * `qore sync`'s result and `qore dev`'s missing-module finding. */\nexport function conflictText(cwd: string, action: ModuleAction): { message: string; hint: string } {\n const dir = relative(cwd, action.dir) || \".\"\n const notRepo = action.reason === \"not a git repository\"\n const what = notRepo ? \"it is not a git repository\"\n : action.origin ? `its origin is ${action.origin}, not ${action.module.repoUrl}` : \"it has no origin remote\"\n const message = notRepo ? `${dir} is not a git repository`\n : action.origin ? `${dir} holds another repository (its origin is ${action.origin}, not ${action.module.repoUrl})`\n : `${dir} has no origin remote`\n return { message, hint: `Move ${dir} aside (${what}), then run \\`qore sync\\`.` }\n}\n\n/** Pure (spec §15): what clone/sync would do; it never touches a present directory. A\n * directory is `present` only when its `origin` — the remote `git fetch`/`git pull` use —\n * points at the module's repository; another remote that happens to match does not count,\n * because sync would still fetch from the re-pointed origin. */\nexport function planWorkspace(\n root: string,\n modules: CliAppModule[],\n dirs: Record<string, DirInfo>,\n strayRepos: string[],\n): { actions: ModuleAction[]; removed: string[] } {\n const actions: ModuleAction[] = modules.map((module) => {\n const dir = join(root, module.slug)\n if (!module.repoUrl) return { module, dir, kind: \"no-repo\", reason: \"no repository yet\" }\n if (!isSupportedRepoUrl(module.repoUrl)) return { module, dir, kind: \"unsupported\", reason: \"unsupported repository URL\" }\n const info = dirs[module.slug] ?? { exists: false, empty: false, isRepo: false, remotes: [] }\n if (!info.exists || info.empty) return { module, dir, kind: \"clone\" }\n if (!info.isRepo) return { module, dir, kind: \"conflict\", reason: \"not a git repository\" }\n const want = repoKey(module.repoUrl)\n const origin = info.remotes.find((r) => r.name === \"origin\")\n if (want !== null && origin && repoKey(origin.url) === want) return { module, dir, kind: \"present\" }\n return { module, dir, kind: \"conflict\", reason: `re-pointed: ${origin?.url ?? \"no origin remote\"}`, origin: origin?.url ?? null }\n })\n const slugs = new Set(modules.map((m) => m.slug))\n return { actions, removed: strayRepos.filter((s) => !slugs.has(s)) }\n}\n\n/** The protocol the workspace was cloned with, read from the present modules' `origin`\n * remotes — `qore.workspace.json` does not record it. */\nexport function cloneProtocol(dirs: Record<string, DirInfo>): \"https\" | \"ssh\" {\n const origins = Object.values(dirs).flatMap((d) => d.remotes.filter((r) => r.name === \"origin\").map((r) => r.url))\n return origins.some((u) => /^(git@|ssh:\\/\\/)/.test(u)) ? \"ssh\" : \"https\"\n}\n","import type { CliAppModule, CliAppModules } from \"../api/types.js\"\nimport { repoKey } from \"../context/repoKey.js\"\nimport { QoreError } from \"../errors.js\"\nimport { cloneUrl, isSupportedRepoUrl } from \"./plan.js\"\n\nexport const ACCESS_CODES = new Set([\"QORE_GITHUB_NOT_LINKED\", \"QORE_REPO_NO_ACCESS\", \"QORE_REPO_ACCESS_PENDING\"])\n\nconst lastLines = (s: string, n: number) => s.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean).slice(-n)\n\n/** Spec §14.1/§14.2: git's error combined with what the portal knows, never a bare \"failed\".\n * GitHub says \"Repository not found\" both for a missing repo and for one you may not read. */\nexport function classifyCloneFailure(\n stderr: string,\n m: CliAppModule,\n app: CliAppModules,\n protocol: \"https\" | \"ssh\",\n): QoreError {\n // Never throws from here: an unsupported URL is refused before any git call, but a\n // classifier must not be the place a malformed URL finally escapes as an exception.\n const url = isSupportedRepoUrl(m.repoUrl!) ? cloneUrl(m.repoUrl!, protocol) : m.repoUrl!\n const details = { module: m.slug, protocol, url }\n if (/SAML SSO|single sign-on/i.test(stderr)) {\n const link = /https:\\/\\/\\S+/.exec(stderr)?.[0]\n return new QoreError(\"QORE_GIT_AUTH\", `GitHub wants SSO authorisation for ${m.slug}`, {\n hint: `Authorise your ${protocol === \"ssh\" ? \"SSH key\" : \"token\"} for the organisation${link ? `: ${link}` : \"\"}.`,\n details: { ...details, reason: \"sso\" },\n })\n }\n if (/Host key verification failed/.test(stderr)) {\n const host = /\\bfor ([\\w.-]+) and you have requested strict checking/.exec(stderr)?.[1] ?? \"github.com\"\n return new QoreError(\"QORE_GIT_AUTH\", `ssh could not verify ${host}'s host key (${m.slug})`, {\n hint: `Run \\`ssh -T git@${host}\\` once to accept its host key (or to see why it changed), then run \\`qore sync\\`.`,\n details: { ...details, protocol: \"ssh\", reason: \"host-key\" },\n })\n }\n if (/Permission denied \\(publickey\\)/.test(stderr)) {\n return new QoreError(\"QORE_GIT_AUTH\", `GitHub refused your SSH key for ${m.slug}`, {\n hint: \"Check with `ssh -T git@github.com`, or clone over https: `--protocol https` after `gh auth login`.\",\n details: { ...details, protocol: \"ssh\" },\n })\n }\n if (/could not read Username|Authentication failed|Invalid username or (password|token)/i.test(stderr)) {\n return new QoreError(\"QORE_GIT_AUTH\", `git has no GitHub credentials for ${m.slug}`, {\n hint: \"`gh auth login` sets up git credentials; or use `--protocol ssh`.\",\n details: { ...details, protocol: \"https\" },\n })\n }\n if (/Repository not found|repository '.*' not found/i.test(stderr)) {\n if (!m.githubLinked) {\n return new QoreError(\"QORE_GITHUB_NOT_LINKED\", `Your GitHub account is not linked in Qore (${m.slug})`, {\n hint: `Link your GitHub account at ${app.accountUrl}, then run \\`qore sync\\`.`,\n details,\n })\n }\n if (m.repoAccess === \"none\") {\n // `devTeamIds` names the dev team(s) that actually build this module (a subset of\n // the app's teams). Absent or empty (older server, or a module not yet scoped)\n // falls back to naming every one of the app's dev teams, as before — and so does a\n // non-empty devTeamIds that matches none of app.devTeams (a stale id, a team the\n // caller can't see): an empty filter result is never mistaken for \"no dev team\n // builds this\", which would otherwise drop to the bare \"ask your tenant owner\" text.\n // A partial match narrows to only the ids that did match.\n const filtered = m.devTeamIds?.length ? app.devTeams.filter((t) => m.devTeamIds!.includes(t.id)) : []\n const moduleTeams = filtered.length ? filtered : app.devTeams\n const teams = moduleTeams.map((t) => `\"${t.name}\"`).join(\" or \")\n const emails = [...new Set(moduleTeams.flatMap((t) => t.maintainers))].join(\", \")\n return new QoreError(\"QORE_REPO_NO_ACCESS\", `No repository access to ${m.slug}`, {\n hint: teams\n ? `Ask a maintainer of dev team ${teams} for a seat${emails ? `: ${emails}` : \"\"}.`\n : `Ask your tenant owner which dev team builds ${m.slug}.`,\n details: { ...details, devTeams: moduleTeams.map((t) => t.name) },\n })\n }\n const owner = repoKey(m.repoUrl!)?.split(\"/\")[1]\n const invitation = owner ? ` https://github.com/orgs/${owner}/invitation` : \"\"\n return new QoreError(\"QORE_REPO_ACCESS_PENDING\", `GitHub does not grant ${m.slug} yet`, {\n hint: `Access was granted recently, or your invitation to the GitHub organisation is not accepted yet:${invitation} — then retry in a minute.`,\n details,\n })\n }\n return new QoreError(\"QORE_INTERNAL\", `Cloning ${m.slug} failed`, {\n hint: [...lastLines(stderr, 3), `\\`git clone ${url}\\``].join(\"\\n\"),\n details,\n })\n}\n\nexport function classifyPullFailure(stderr: string): string {\n if (/Not possible to fast-forward/i.test(stderr)) return \"diverged\"\n return lastLines(stderr, 1)[0] ?? \"pull failed\"\n}\n","import { randomBytes } from \"node:crypto\"\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\nimport { TokenStore } from \"../auth/tokenStore.js\"\nimport type { Deps } from \"../deps.js\"\nimport { QoreError } from \"../errors.js\"\nimport { profileHash, resolvePortal, type PortalRef } from \"../profiles.js\"\n\nexport const WORKSPACE_FILE = \"qore.workspace.json\"\nexport type Workspace = { root: string; portal: string; appId: string }\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nconst invalid = (file: string, msg: string) =>\n new QoreError(\"QORE_CONTEXT_INVALID\", `${file}: ${msg}`, { hint: \"Fix or delete the file; `qore clone <app>` writes a fresh one.\" })\n\nasync function readAt(dir: string): Promise<Workspace | null> {\n const file = join(dir, WORKSPACE_FILE)\n let raw: string\n try {\n raw = await readFile(file, \"utf8\")\n } catch (e) {\n const code = (e as NodeJS.ErrnoException).code\n if (code === \"ENOENT\" || code === \"ENOTDIR\") return null\n // Present but unreadable (EACCES, EISDIR, …): a broken workspace file, not \"no workspace\".\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `${file}: cannot be read (${code ?? \"unknown error\"})`, {\n hint: \"Fix its permissions, or remove it; `qore clone <app>` writes a fresh one.\", cause: e,\n })\n }\n let doc: Record<string, unknown>\n try {\n doc = JSON.parse(raw) as Record<string, unknown>\n } catch {\n throw invalid(file, \"not valid JSON\")\n }\n const v = doc?.schemaVersion\n if (!Number.isInteger(v) || (v as number) < 1) throw invalid(file, \"schemaVersion must be a positive integer\")\n if ((v as number) > 1) throw new QoreError(\"QORE_CONTEXT_UNSUPPORTED\", `${file} is newer than this qore`, { hint: \"Run: npm i -g @quatronic/qore\" })\n if (typeof doc.portal !== \"string\" || !/^https?:\\/\\//.test(doc.portal)) throw invalid(file, \"portal must be a portal URL\")\n if (typeof doc.appId !== \"string\" || !UUID.test(doc.appId)) throw invalid(file, \"appId must be an app id\")\n return { root: dir, portal: new URL(doc.portal).origin.toLowerCase(), appId: doc.appId }\n}\n\n/** Reads the workspace file ONLY in `dir` — no walk. Used for the clone conflict check. */\nexport async function readWorkspace(dir: string): Promise<Workspace | null> {\n return readAt(dir)\n}\n\n/** Walks up from `start`; the nearest file wins. The walk stops at `home` (inclusive) or the filesystem root. */\nexport async function findWorkspace(start: string, home: string): Promise<Workspace | null> {\n let dir = resolve(start)\n const stop = resolve(home)\n for (;;) {\n const ws = await readAt(dir)\n if (ws) return ws\n const up = dirname(dir)\n if (dir === stop || up === dir) return null\n dir = up\n }\n}\n\n/** Atomic (temp file + rename) but NOT private: unlike qore's own config/cache files,\n * the workspace is an ordinary code checkout, so the root is created with the default\n * directory mode and the file with 0666 — both minus the umask, i.e. usually 0755/0644. */\nexport async function writeWorkspace(root: string, o: { portal: string; appId: string }): Promise<void> {\n await mkdir(root, { recursive: true })\n const tmp = join(root, `.${WORKSPACE_FILE}.${randomBytes(6).toString(\"hex\")}.tmp`)\n try {\n await writeFile(tmp, JSON.stringify({ schemaVersion: 1, portal: o.portal, appId: o.appId }, null, 2) + \"\\n\", { mode: 0o666 })\n await rename(tmp, join(root, WORKSPACE_FILE))\n } catch (e) {\n await rm(tmp, { force: true }).catch(() => {})\n throw new QoreError(\"QORE_INTERNAL\", `could not write ${join(root, WORKSPACE_FILE)}`, { cause: e })\n }\n}\n\n/** A workspace names one of the user's existing profiles, and never triggers a login. */\nexport async function workspacePortal(deps: Deps, ws: Workspace): Promise<PortalRef> {\n const portal = resolvePortal(ws.portal, undefined)\n const label = portal.builtin ?? portal.apiOrigin\n const profile = (await deps.config.read()).profiles[portal.apiOrigin]\n const loggedIn = profile && (await new TokenStore(deps.keychain, profileHash(profile.apiOrigin, profile.issuer)).getRefresh())\n if (!loggedIn) {\n throw new QoreError(\"QORE_NOT_LOGGED_IN\", `This workspace belongs to ${label}, which you are not logged in to`, {\n hint: `Run \\`qore login --portal ${label}\\`.`,\n })\n }\n return portal\n}\n","import { QoreError } from \"../errors.js\"\n\n/** A single safe path segment: lowercase alphanumeric, starting with a letter or digit,\n * dashes allowed after that. No `.`, `/`, `\\`, leading dot, or anything else. */\nconst SAFE_SEGMENT = /^[a-z0-9][a-z0-9-]*$/\n/** Windows device names: a directory called `con` or `lpt1` cannot be created (or opens\n * the device instead), whatever the case — slugs are lowercase already. */\nconst WINDOWS_RESERVED = /^(con|prn|aux|nul|com[1-9]|lpt[1-9])$/\n\n/** Defence in depth (never the only check — the server is trusted, but a slug going\n * straight into `join(root, slug)` deserves its own guard regardless): rejects anything\n * that is not a single safe path segment, in particular `..`, an absolute path and a\n * Windows reserved device name. */\nexport function isSafeSlug(slug: string): boolean {\n return SAFE_SEGMENT.test(slug) && !WINDOWS_RESERVED.test(slug)\n}\n\nexport function unsafeSlugError(slug: string): QoreError {\n return new QoreError(\"QORE_INTERNAL\", `\"${slug}\" is not a safe directory name`, {\n hint: \"This looks like a portal bug — please report it.\",\n })\n}\n","import type { ModuleResult } from \"../core/workspace/apply.js\"\nimport { ACCESS_CODES } from \"../core/workspace/diagnose.js\"\nimport { QoreError, type QoreErrorCode } from \"../core/errors.js\"\nimport type { Io } from \"./io.js\"\nimport { renderJson } from \"./render.js\"\n\n/** Global Constraints, \"Exit rule\": success needs at least one clone/present/fetched/\n * pulled/skipped module AND every failure to be an access failure. Otherwise the first\n * non-access failure's code wins, or — if nothing succeeded at all — the first failure's. */\nexport function exitFor(results: ModuleResult[]): QoreError | null {\n const failures = results.filter((r) => r.status === \"failed\" || r.status === \"conflict\")\n if (failures.length === 0) return null\n const ok = results.some((r) => [\"cloned\", \"present\", \"fetched\", \"pulled\", \"skipped\"].includes(r.status))\n const code = (r: ModuleResult) => (r.status === \"conflict\" ? \"QORE_WORKSPACE_CONFLICT\" : r.error?.code ?? \"QORE_INTERNAL\")\n const nonAccess = failures.find((r) => !ACCESS_CODES.has(code(r)))\n if (ok && !nonAccess) return null\n const first = nonAccess ?? failures[0]!\n // \"removed\" is a stray directory found on disk, never one of the app's own modules\n // (plan.ts reports it by its .git entry alone, with no git call) — it can never fail,\n // and doesn't count toward the app's module total either.\n const moduleCount = results.filter((r) => r.status !== \"removed\").length\n return new QoreError(code(first) as QoreErrorCode, `${failures.length} of ${moduleCount} modules need attention`, {\n hint: first.error?.hint, details: { results },\n })\n}\n\nconst FAILURE_LABELS: Record<string, string> = {\n QORE_GITHUB_NOT_LINKED: \"GitHub not linked\",\n QORE_REPO_NO_ACCESS: \"no repository access\",\n QORE_REPO_ACCESS_PENDING: \"access pending\",\n QORE_GIT_AUTH: \"git authentication\",\n}\n\n/** The first sentence of a hint, first letter lowercased, to read naturally after a dash.\n * Cutting a hint at the first \". \" can truncate a backtick-quoted URL or path that\n * itself contains \". \" (e.g. `` `https://example.com/a. b` ``). So a cut is only taken\n * at a \". \" that is followed by a non-space character (any ordinary sentence start, not\n * just an uppercase one — a hint may reasonably continue in lowercase, e.g. after a\n * code-quoted term) and that does not fall inside a backtick-quoted span; otherwise the\n * whole hint is kept. */\nfunction firstSentenceLower(hint: string | undefined): string {\n if (!hint) return \"\"\n let sentence = hint\n const re = /\\. (?=\\S)/g\n let m: RegExpExecArray | null\n while ((m = re.exec(hint))) {\n const before = hint.slice(0, m.index)\n const backtickCount = (before.match(/`/g) ?? []).length\n if (backtickCount % 2 === 0) {\n sentence = hint.slice(0, m.index + 1)\n break\n }\n }\n sentence = sentence.trim()\n return sentence.length ? sentence[0]!.toLowerCase() + sentence.slice(1) : sentence\n}\n\nfunction failedLine(r: ModuleResult): string {\n const label = FAILURE_LABELS[r.error?.code ?? \"\"] ?? \"failed\"\n const detail = firstSentenceLower(r.error?.hint)\n return `✗ ${r.slug} ${label}${detail ? ` — ${detail}` : \"\"}`\n}\n\nfunction line(r: ModuleResult, conflictCount: number): string {\n switch (r.status) {\n case \"cloned\":\n return `✓ ${r.slug} cloned${r.dir ? ` → ${r.dir}` : \"\"}`\n case \"pulled\":\n return `✓ ${r.slug} pulled`\n case \"present\":\n return ` ${r.slug} present`\n case \"skipped\":\n return `! ${r.slug} skipped — ${r.reason}`\n case \"no-repo\":\n return ` ${r.slug} ${r.reason ?? \"no repository yet\"}`\n case \"removed\":\n return `! ${r.slug} not a module of this app — left in place`\n case \"conflict\": {\n // The Error hint (`renderError` prints it once on stderr) only ever carries the\n // *first* non-access failure's remedy — `exitFor` picks one. With exactly one\n // conflict that's this module's own remedy, so repeating it on the line would just\n // duplicate it; the line stays short. With more than one conflict, every module\n // past the first would otherwise lose its remedy entirely (it's not the one\n // `exitFor` surfaced), so each line keeps its own.\n const detail = conflictCount > 1 ? firstSentenceLower(r.error?.hint) : \"\"\n return `✗ ${r.slug} ${r.reason ?? \"conflict\"}${detail ? ` — ${detail}` : \"\"}`\n }\n case \"failed\":\n return failedLine(r)\n case \"fetched\":\n return ` ${r.slug} fetched`\n }\n}\n\n/** One line per module. Consecutive `fetched` (or `pulled`) results collapse into a\n * single line, e.g. ` web, api fetched` — the common case of a sync that changed\n * nothing worth calling out module by module. */\nexport function renderResults(io: Io, results: ModuleResult[], json: boolean): void {\n if (json) {\n renderJson(io, { results })\n return\n }\n const conflictCount = results.filter((r) => r.status === \"conflict\").length\n let i = 0\n while (i < results.length) {\n const r = results[i]!\n if (r.status === \"fetched\" || r.status === \"pulled\") {\n const group = [r]\n let j = i + 1\n while (j < results.length && results[j]!.status === r.status) {\n group.push(results[j]!)\n j++\n }\n io.out(` ${group.map((g) => g.slug).join(\", \")} ${r.status}`)\n i = j\n continue\n }\n io.out(line(r, conflictCount))\n i++\n }\n}\n\n/** Shared by `sync` and (Task 9) `clone`: computes the exit rule and renders the report.\n * In human mode the per-module lines are always printed — including on failure, since\n * otherwise a throw before rendering would leave the user with only the one-line summary\n * `renderError` prints on stderr and no idea which module needs attention. In `--json`\n * mode a failure renders nothing here: the single JSON document is `renderError`'s\n * `{ok:false, error: {..., details:{results}}}`, printed once by the program's own\n * error handler — printing a second, successful-looking `{ok:true, ...}` document first\n * would break the \"--json prints exactly one JSON document\" contract. */\nexport function reportWorkspaceRun(io: Io, results: ModuleResult[], json: boolean): QoreError | null {\n const err = exitFor(results)\n if (!err || !json) renderResults(io, results, json)\n return err\n}\n","import { randomBytes } from \"node:crypto\"\nimport { realpath } from \"node:fs/promises\"\nimport { constants } from \"node:os\"\nimport { dirname, join, relative } from \"node:path\"\nimport { StringDecoder } from \"node:string_decoder\"\nimport type { Command } from \"commander\"\nimport { metaFor } from \"../../core/api/capabilities.js\"\nimport type { CliAppModules, CliRef } from \"../../core/api/types.js\"\nimport { readRepoConfig } from \"../../core/context/repoConfig.js\"\nimport { findRepoRoot } from \"../../core/context/repoRoot.js\"\nimport { workspaceRoot, type ModuleContext } from \"../../core/context/resolver.js\"\nimport { exitHint, KEEP_LINES } from \"../../core/diagnostics/node.js\"\nimport { devEnv, type DevEnv } from \"../../core/dev/env.js\"\nimport { providerDown, repoBehind, servicesMissing, type Finding } from \"../../core/dev/findings.js\"\nimport { isOffline, loadLastStart, saveLastStart, type LastModule, type LastStart } from \"../../core/dev/lastStart.js\"\nimport { checkNode, checkPackageManager, installIfNeeded, startServices } from \"../../core/dev/preflight.js\"\nimport { connPorts, deadAliases, hintContext } from \"../../core/dev/providers.js\"\nimport { detectPackageManager, planRecipe, readPackageJson, runArgs } from \"../../core/dev/project.js\"\nimport { leftoverRun, removeRunFile, writeRunFile, type RunRecord } from \"../../core/dev/runFile.js\"\nimport { CancelledError, QoreError } from \"../../core/errors.js\"\nimport { isTrusted } from \"../../core/trust.js\"\nimport { findWorkspace } from \"../../core/workspace/file.js\"\nimport type { OutLine } from \"../../platform/launch.js\"\nimport { appFor, moduleContextFor } from \"../context.js\"\nimport { checkPortOrStopLeftover, dockerRecovery } from \"../devRecover.js\"\nimport { renderFinding } from \"../findings.js\"\nimport type { RawSink } from \"../io.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { progressReporter } from \"../progress.js\"\nimport { inPreflight, type Preflight } from \"../termination.js\"\nimport { ensureTrusted } from \"../trustPrompt.js\"\nimport { workspaceDev } from \"./devWorkspace.js\"\nimport { childRunning } from \"./run.js\"\n\nconst EARLY_EXIT_MS = 10_000\n\n/** Tees the child's stderr straight to `sink` (bytes unchanged), while keeping the\n * last `KEEP_LINES` lines for `earlyExitHint`. Decodes with a streaming decoder since\n * a chunk may end mid-line or mid UTF-8 char. If `sink` errors (e.g. EPIPE — a\n * downstream consumer of qore's own stderr, `qore dev | head`, has gone away), stops\n * forwarding bytes but keeps collecting the tail, so the hint still comes through on\n * qore's own next `err()` call. `dispose()` must be called once the run is over. */\nfunction makeStderrTee(sink: RawSink) {\n const decoder = new StringDecoder(\"utf8\")\n let buf = \"\"\n let forwarding = true\n const tail: string[] = []\n const record = (line: string) => { tail.push(line); if (tail.length > KEEP_LINES) tail.shift() }\n const onError = () => { forwarding = false }\n sink.on(\"error\", onError)\n return {\n push: (chunk: Buffer) => {\n if (forwarding) {\n try { sink.write(chunk) } catch { forwarding = false }\n }\n buf += decoder.write(chunk)\n let i\n while ((i = buf.indexOf(\"\\n\")) >= 0) { record(buf.slice(0, i).replace(/\\r$/, \"\")); buf = buf.slice(i + 1) }\n },\n lines: () => {\n const rest = (buf + decoder.end()).replace(/\\r$/, \"\")\n return rest ? [...tail, rest].slice(-KEEP_LINES) : tail.slice()\n },\n dispose: () => { sink.removeListener(\"error\", onError) },\n }\n}\n\nexport type DevFlags = {\n module?: string; app?: string; only?: string; skip?: string; install: boolean; services: boolean\n killOthers?: boolean; waitTimeout: string; yes?: boolean\n}\n\nexport function registerDev(program: Command, ctx: CommandContext): void {\n program.command(\"dev\")\n .description(\"Start this module's dev server — or, in a workspace root, every module of the app\")\n .option(\"--module <slug|id>\", \"the module (default: from this repository's git remote)\")\n .option(\"--app <slug|id>\", \"the app, when the module is part of several\")\n .option(\"--only <slugs>\", \"workspace: start only these modules (comma-separated)\")\n .option(\"--skip <slugs>\", \"workspace: start all but these modules (comma-separated)\")\n .option(\"--no-install\", \"do not run the package manager's install\")\n .option(\"--no-services\", \"do not start local services (db:up)\")\n .option(\"--kill-others\", \"workspace: the first module to exit stops the rest\")\n .option(\"--wait-timeout <s>\", \"workspace: seconds to wait for a provider's port\", \"60\")\n .option(\"--yes\", \"trust the repositories without asking\")\n .action(async (f: DevFlags) => {\n const waitTimeout = parseWaitTimeout(f.waitTimeout)\n const ws = await workspaceRoot(ctx.deps)\n if (ws && f.module === undefined) return workspaceDev(ctx, ws, f, waitTimeout)\n return moduleDev(ctx, f, waitTimeout)\n })\n}\n\nfunction parseWaitTimeout(raw: string): number {\n const n = /^\\d+$/.test(raw.trim()) ? Number(raw.trim()) : NaN\n if (!Number.isInteger(n) || n < 1 || n > 600) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `--wait-timeout must be a whole number of seconds from 1 to 600, not \"${raw}\"`, {\n hint: \"Pass e.g. --wait-timeout 60.\",\n })\n }\n return n\n}\n\ntype LastModuleStart = Extract<LastStart, { kind: \"module\" }>\ntype DevContext =\n | { online: { mc: ModuleContext; app: CliRef }; module: LastModule | ModuleContext[\"module\"]; offlineCause: null }\n | { online: null; module: LastModule; offlineCause: QoreError }\n\nconst str = (v: unknown): v is string => typeof v === \"string\" && v.length > 0\n\nconst SHELL_SAFE = /^[A-Za-z0-9_./,:@%+=-]*$/\nconst shellQuote = (s: string) => (SHELL_SAFE.test(s) ? s : `'${s.replace(/'/g, \"'\\\\''\")}'`)\n\n/** `cd <dir> && qore dev`, with the home directory as `~` (only at a path boundary) and the\n * path quoted when it holds a space or a shell-special character — `~/` stays unquoted so it expands.\n * A Windows path (`C:\\…`, `\\\\server\\…`) is never shortened and only double-quoted when it holds\n * whitespace: POSIX quoting and `~` mean nothing to cmd.exe. */\nexport function cdAndDev(home: string, dir: string): string {\n if (/^[A-Za-z]:[\\\\/]|^\\\\\\\\/.test(dir)) return `cd ${/\\s/.test(dir) ? `\"${dir}\"` : dir} && qore dev`\n const h = home.length > 1 ? home.replace(/\\/+$/, \"\") : home\n let target = shellQuote(dir)\n if (h && dir === h) target = \"~\"\n else if (h && dir.startsWith(h + \"/\")) target = `~/${shellQuote(dir.slice(h.length + 1))}`\n return `cd ${target} && qore dev`\n}\n\n/** Module mode: warns when a provider this module depends on does not listen. Best effort —\n * an old server, offline, or any failing call skips it silently. */\nasync function providerFindings(ctx: CommandContext, root: string, mc: ModuleContext, app: CliRef, env: Record<string, string>): Promise<Finding | null> {\n const { deps } = ctx\n try {\n if (!(await metaFor(deps, mc.portal.apiOrigin)).capabilities.includes(\"app.modules\")) return null\n const am = await mc.session.api.get<CliAppModules>(`/api/cli/v1/apps/${encodeURIComponent(app.id)}/modules`)\n const self = am.modules.find((m) => m.id === mc.module.id)\n const providers = am.modules.filter((m) => self?.dependsOn.includes(m.id))\n if (providers.length === 0) return null\n const conns = connPorts(env)\n const listening = new Set<number>()\n for (const c of conns) if (await deps.ports.inUse(c.port)) listening.add(c.port)\n const keys = deadAliases(env, listening)\n if (keys.length === 0) return null\n const ws = await findWorkspace(root, deps.home)\n let fix = `qore clone ${app.slug}`\n if (ws && ws.appId === app.id) fix = cdAndDev(deps.home, ws.root)\n else if (providers.length === 1) {\n // a sibling fix is only offered when there is exactly one provider to point at\n const sibling = join(dirname(root), providers[0]!.slug)\n if ((await deps.git.inspect(sibling)).isRepo) fix = cdAndDev(deps.home, sibling)\n }\n return providerDown({ slug: mc.module.slug, providers: providers.map((p) => p.slug), keys,\n ports: new Map(conns.map((c) => [c.key, c.port])), fix })\n } catch (e) {\n if (e instanceof QoreError) return null\n throw e\n }\n}\n\n/** `loadLastStart` checks only `schemaVersion`. */\nfunction usableLast(last: LastStart | null): last is LastModuleStart {\n if (!last || last.kind !== \"module\") return false\n const m = last.module as Partial<LastModule> | undefined\n return str(last.savedAt) && !!m && str(m.id) && str(m.slug) && str(m.type) && !!m.tenant && str(m.tenant.name)\n && !!last.app && str(last.app.id) && str(last.app.slug) && str(last.app.name)\n}\n\n/** Offline (portal unreachable, no --module): the last start, never prompting, trusted only. */\nasync function devContext(ctx: CommandContext, f: DevFlags, root: string): Promise<DevContext> {\n let mc: ModuleContext\n try {\n mc = await moduleContextFor(ctx, f, \"dev\")\n } catch (e) {\n if (!isOffline(e) || f.module) throw e\n const last = await loadLastStart(ctx.deps, root)\n if (!usableLast(last)) throw e\n if (f.app && f.app !== last.app.id && f.app !== last.app.slug) throw e\n if (!(await isTrusted(ctx.deps, root, last.module.id))) throw e\n ctx.io.err(`→ ${last.module.tenant.name} / ${last.app.name} / ${last.module.slug} (offline — last started ${last.savedAt})`)\n return { online: null, module: last.module, offlineCause: e }\n }\n const app = await appFor(ctx, mc, f.app)\n await ensureTrusted(ctx, mc, app, { yes: f.yes })\n return { online: { mc, app }, module: mc.module, offlineCause: null }\n}\n\nasync function moduleDev(ctx: CommandContext, f: DevFlags, waitTimeout: number): Promise<void> {\n const { deps, io } = ctx\n const { root, slug, recipe, env, port, pkg, devEnv } = await inPreflight(deps.signals, ctx.signal, (p) => prepareModule(ctx, f, waitTimeout, p))\n const { cmd, args } = runArgs(recipe.pm, recipe.script)\n io.err(`▶ starting ${slug}${port === null ? \"\" : ` — http://localhost:${port}`}`)\n const startedAt = deps.now()\n await writeRunFile(deps, root, {\n schemaVersion: 1, qorePid: deps.pid, root, startedAt: startedAt.toISOString(),\n children: [{ module: slug, pid: null, port }],\n })\n childRunning.current = true\n const tee = makeStderrTee(io.stderrRaw)\n const spawnEnv = ctx.opts().color !== false && io.stderrTTY && env.FORCE_COLOR === undefined && env.NO_COLOR === undefined\n ? { ...env, FORCE_COLOR: \"1\" } : env\n let exit\n try {\n exit = await deps.spawn.run(cmd, args, spawnEnv, { cwd: root, onStderr: tee.push })\n } finally {\n tee.dispose()\n childRunning.current = false\n await removeRunFile(deps, root)\n }\n const ms = deps.now().getTime() - startedAt.getTime()\n if (exit.code !== 0 && exit.signal === null) {\n io.err(ms < EARLY_EXIT_MS\n ? `✗ ${slug} exited after ${Math.round(ms / 1000)} s with code ${exit.code ?? 1} — its output above says why.`\n : `✗ ${slug} exited with code ${exit.code ?? 1}.`)\n const hint = exitHint(tee.lines(), hintContext(recipe, pkg, devEnv))\n if (hint) io.err(` → ${hint.hint}`)\n }\n if (exit.signal) {\n deps.raise(exit.signal)\n ctx.setExitCode(128 + (constants.signals[exit.signal] ?? 0))\n return\n }\n ctx.setExitCode(exit.code ?? 1)\n}\n\nasync function prepareModule(ctx: CommandContext, f: DevFlags, waitTimeout: number, p: Preflight) {\n const { deps, io } = ctx\n if (ctx.opts().json) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", \"dev in a module repository has no --json; the dev server's output passes through\", {\n hint: \"Drop --json.\",\n })\n }\n for (const [flag, set] of [[\"--only\", f.only !== undefined], [\"--skip\", f.skip !== undefined], [\"--kill-others\", Boolean(f.killOthers)]] as const) {\n if (set) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `${flag} is for a workspace root`, {\n hint: `Drop ${flag}, or run qore dev in the workspace root (where qore.workspace.json is).`,\n })\n }\n }\n const root = await findRepoRoot(deps.cwd)\n if (!root) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"Not inside a module repository\", {\n hint: \"cd into a module repository, or run qore dev in a workspace root.\",\n })\n }\n\n const c = await devContext(ctx, f, root)\n p.arm()\n const slug = c.module.slug\n const cfg = await readRepoConfig(root)\n const pkg = await readPackageJson(root)\n const recipe = planRecipe({\n root, pkg, pm: await detectPackageManager(root, pkg), cfg, slug, flags: { install: f.install, services: f.services },\n })\n const runs = [await leftoverRun(deps, root)].filter((r): r is RunRecord => r !== null)\n\n const onLine = (l: OutLine) => (l.stream === \"stdout\" ? io.out(l.line) : io.err(l.line))\n const report = progressReporter(ctx, { installFlag: f.install, servicesFlag: f.services })\n const pmVersion = await checkPackageManager(deps, recipe, () => {}, p.signal)\n const nodeVersion = await checkNode(deps, recipe, pkg, slug, p.signal)\n report({ module: slug, step: \"pm\", status: \"done\",\n detail: `${recipe.pm.name}${pmVersion ? ` ${pmVersion}` : \"\"}${nodeVersion ? ` · node ${nodeVersion}` : \"\"}` })\n await installIfNeeded(deps, recipe, slug, onLine, report, p.signal)\n\n let dev: DevEnv\n try {\n dev = await devEnv(deps, {\n mc: c.online?.mc ?? null, app: c.online?.app ?? null, root, type: c.module.type, moduleId: c.module.id, cfg,\n random: () => randomBytes(32).toString(\"hex\"),\n })\n } catch (e) {\n // offline context: report the original unreachable error\n if (c.offlineCause && isOffline(e)) throw c.offlineCause\n throw e\n }\n const envFile = relative(await realpath(root), dev.envFile)\n if (dev.offline) io.err(`! The portal is unreachable — starting from ${envFile} as last written; values may be stale.`)\n if (dev.kept.length) {\n io.err(`! ${dev.kept.length} key(s) differ locally and were kept: ${dev.kept.join(\", \")} — qore env pull --use-portal takes the portal's values`)\n }\n report({ module: slug, step: \"env\", status: \"done\", detail: dev.offline ? `${envFile} (as last written — offline)` : envFile })\n\n const env = { ...deps.env, ...dev.env }\n await dockerRecovery(ctx, p.signal)({ cwd: root, env }, () => startServices(deps, recipe, slug, env, dev.dbPort, waitTimeout * 1000, p.signal, onLine, report))\n await checkPortOrStopLeftover(ctx, { slug, port: dev.port, key: \"PORT\", runs }, p.signal)\n if (dev.port !== null) report({ module: slug, step: \"ports\", status: \"done\", detail: String(dev.port) })\n\n if (c.online && !dev.offline) {\n const provider = await providerFindings(ctx, root, c.online.mc, c.online.app, dev.env)\n if (provider) renderFinding(ctx, provider)\n }\n const services = servicesMissing(slug, dev.env, recipe, { servicesFlag: f.services, configured: cfg.dev?.services !== undefined })\n if (services) renderFinding(ctx, services)\n try {\n const behind = repoBehind(slug, await deps.git.status(root), { workspace: false })\n if (behind) renderFinding(ctx, behind)\n } catch { /* a status that cannot be read says nothing about being behind */ }\n\n if (c.online && !dev.offline) {\n const { mc, app } = c.online\n const { id, name, type, access, tenant, apps } = mc.module\n await saveLastStart(deps, root, {\n schemaVersion: 1, kind: \"module\", portal: mc.portal.apiOrigin, savedAt: deps.now().toISOString(),\n module: {\n id, slug, name, type, access, tenant: { id: tenant.id, slug: tenant.slug, name: tenant.name },\n apps: apps.map((a) => ({ id: a.id, slug: a.slug, name: a.name })),\n },\n app: { id: app.id, slug: app.slug, name: app.name }, envFile,\n })\n }\n\n if (p.signal.aborted) throw new CancelledError()\n return { root, slug, recipe, env, port: dev.port, pkg, devEnv: dev.env }\n}\n","import { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { QoreError } from \"../errors.js\"\n\nexport type DevConfig = { install?: boolean; services?: string[]; script?: string }\nexport type RepoConfig = { envFile?: string; localSecrets?: string[]; dev?: DevConfig }\n\n// A field that would pick a resource or a server: refused so a repository cannot\n// steer secrets or tokens (spec §5.2, §10.1 T4/T5). Keep in step with schema/qore.schema.json.\nconst FORBIDDEN = [\"portal\", \"api\", \"apiOrigin\", \"issuer\", \"tenant\", \"tenantId\", \"app\", \"appId\", \"module\", \"moduleId\"]\nconst KEY = /^[A-Za-z_][A-Za-z0-9_]*$/\nconst SCRIPT = /^[A-Za-z0-9:_.-]+$/\n\nconst invalid = (msg: string, details?: Record<string, unknown>) =>\n new QoreError(\"QORE_CONTEXT_INVALID\", `.qore.json: ${msg}`, { hint: \"Fix .qore.json in the repository root; see the $schema it names.\", details })\n\nexport function moduleDefaults(type: string): { envFile: string; localSecrets: string[] } {\n return type === \"frontend\"\n ? { envFile: \".env.local\", localSecrets: [\"SESSION_COOKIE_SECRET\"] }\n : { envFile: \".env\", localSecrets: [] }\n}\n\nexport async function readRepoConfig(root: string): Promise<RepoConfig> {\n let raw: string\n try { raw = await readFile(join(root, \".qore.json\"), \"utf8\") } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return {}\n throw e\n }\n let doc: Record<string, unknown>\n try { doc = JSON.parse(raw) as Record<string, unknown> } catch { throw invalid(\"not valid JSON\") }\n if (!doc || typeof doc !== \"object\" || Array.isArray(doc)) throw invalid(\"must be an object\")\n // M9: `??` would also default an explicit `null` to 1, silently accepting a value the\n // schema (`\"type\": \"integer\"`) rejects. Only a genuinely absent key gets the default.\n const v = doc.schemaVersion === undefined ? 1 : doc.schemaVersion\n if (!Number.isInteger(v) || (v as number) < 1) throw invalid(\"schemaVersion must be a positive integer\")\n if ((v as number) > 1) {\n throw new QoreError(\"QORE_CONTEXT_UNSUPPORTED\", `.qore.json schemaVersion ${v} is newer than this qore`, { hint: \"Run: npm i -g @quatronic/qore\" })\n }\n for (const f of FORBIDDEN) if (f in doc) throw invalid(`\"${f}\" is not allowed — .qore.json never selects a portal or a resource`, { field: f })\n const out: RepoConfig = {}\n if (doc.envFile !== undefined) {\n if (typeof doc.envFile !== \"string\" || !doc.envFile) throw invalid(\"envFile must be a non-empty string\")\n out.envFile = doc.envFile\n }\n if (doc.localSecrets !== undefined) {\n if (!Array.isArray(doc.localSecrets) || !doc.localSecrets.every((k) => typeof k === \"string\" && KEY.test(k))) {\n throw invalid(\"localSecrets must be a list of env key names\")\n }\n // M9: the schema declares `uniqueItems`; reject a duplicate rather than silently\n // deduplicating, for consistency with the schemaVersion fix above (reject, don't coerce).\n if (new Set(doc.localSecrets).size !== doc.localSecrets.length) throw invalid(\"localSecrets must not contain duplicates\")\n out.localSecrets = doc.localSecrets as string[]\n }\n if (doc.dev !== undefined) {\n const d = doc.dev as Record<string, unknown>\n if (!d || typeof d !== \"object\" || Array.isArray(d)) throw invalid(\"dev must be an object\")\n const dev: DevConfig = {}\n if (d.install !== undefined) {\n if (typeof d.install !== \"boolean\") throw invalid(\"dev.install must be true or false\")\n dev.install = d.install\n }\n if (d.services !== undefined) {\n if (!Array.isArray(d.services) || !d.services.every((s) => typeof s === \"string\" && SCRIPT.test(s))) {\n throw invalid(\"dev.services must be a list of script names\")\n }\n if (new Set(d.services).size !== d.services.length) throw invalid(\"dev.services must not contain duplicates\")\n dev.services = d.services as string[]\n }\n if (d.script !== undefined) {\n if (typeof d.script !== \"string\" || !SCRIPT.test(d.script)) throw invalid(\"dev.script must be a script name\")\n dev.script = d.script\n }\n out.dev = dev\n }\n return out\n}\n","import { stat } from \"node:fs/promises\"\nimport { dirname, join, resolve } from \"node:path\"\n\n/** The first directory upwards that holds `.git` — a directory, or a file in a\n * worktree or submodule (spec §5.2 step 1, §15). */\nexport async function findRepoRoot(start: string): Promise<string | null> {\n let dir = resolve(start)\n for (;;) {\n try {\n await stat(join(dir, \".git\"))\n return dir\n } catch { /* not here (or unreadable): keep walking up */ }\n const up = dirname(dir)\n if (up === dir) return null\n dir = up\n }\n}\n","import { isAbsolute, join, relative } from \"node:path\"\nimport { ensureCapability } from \"../api/capabilities.js\"\nimport { TokenStore } from \"../auth/tokenStore.js\"\nimport type { CliAppModules, CliMe, CliModuleDetail, CliRef, CliRepoResolve } from \"../api/types.js\"\nimport type { QoreConfig } from \"../config.js\"\nimport type { Deps } from \"../deps.js\"\nimport { CancelledError, QoreError, type Candidate, type QoreErrorCode } from \"../errors.js\"\nimport { BUILTIN_PORTALS, profileHash, resolvePortal, type PortalRef } from \"../profiles.js\"\nimport { openSession, type Session } from \"../session.js\"\nimport type { Remote } from \"../../platform/git.js\"\nimport { findWorkspace, readWorkspace, workspacePortal, type Workspace } from \"../workspace/file.js\"\nimport { ResolutionCache } from \"./cache.js\"\nimport { repoKey } from \"./repoKey.js\"\nimport { findRepoRoot } from \"./repoRoot.js\"\n\nexport type ContextSource =\n | { kind: \"remote\"; remote: string; url: string }\n | { kind: \"flag\"; overrides?: string } // overrides = the remote whose derived module differs from --module\n | { kind: \"workspace\" } // picked among the workspace's modules in a workspace root\nexport type ModuleContext = {\n portal: PortalRef; session: Session; module: CliModuleDetail; source: ContextSource; repoRoot: string | null\n workspace: Workspace | null\n}\ntype Keyed = Remote & { key: string }\ntype Opts = {\n portal?: string\n module?: string\n choose?: string // module id picked from QORE_CONTEXT_REQUIRED's module candidates\n tenant?: string // tenant id picked from QORE_CONTEXT_REQUIRED's tenant candidates (--module <slug>)\n command: string\n onRequest?: (l: string) => void\n}\ntype Skipped = { profile: string; code: QoreErrorCode; message: string }\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst HINT_FLAG = \"cd into a module repository, or pass --module <slug|id>.\"\nconst RESOLVE = \"/api/cli/v1/repos/resolve\"\n\n/** Errors that make one profile unusable for this walk without saying anything about the\n * repository: the portal is unreachable, or the profile has no usable token (spec §3, §14.2). */\nconst SKIPPABLE = new Set<QoreErrorCode>([\n \"QORE_API_UNREACHABLE\", \"QORE_API_UNAVAILABLE\", \"QORE_AUTH_UNAVAILABLE\",\n \"QORE_NOT_LOGGED_IN\", \"QORE_SESSION_EXPIRED\",\n])\n\nconst label = (p: PortalRef) => p.builtin ?? p.apiOrigin\n\n/** origin first, then upstream, then the rest in git order. */\nfunction byPreference(remotes: Keyed[]): Keyed[] {\n const rank = (r: Keyed) => (r.name === \"origin\" ? 0 : r.name === \"upstream\" ? 1 : 2)\n return [...remotes].sort((a, b) => rank(a) - rank(b)) // stable: git order within a rank\n}\nconst preferred = (remotes: Keyed[]): Keyed => byPreference(remotes)[0]!\n\n/** null outside a repository. A failing `git remote` (a broken or half-initialised\n * repository) counts as \"no remotes\" so it ends in QORE_CONTEXT_REQUIRED rather than\n * QORE_INTERNAL; git missing from PATH stays QORE_GIT_UNAVAILABLE. */\nasync function repoRemotes(deps: Deps): Promise<{ root: string; keyed: Keyed[]; gitError?: QoreError } | null> {\n const root = await findRepoRoot(deps.cwd)\n if (!root) return null\n let remotes: Remote[]\n try {\n remotes = await deps.git.remotes(root)\n } catch (e) {\n if (e instanceof QoreError && e.code !== \"QORE_GIT_UNAVAILABLE\") return { root, keyed: [], gitError: e }\n throw e\n }\n const keyed = remotes.map((r) => ({ ...r, key: repoKey(r.url) })).filter((r): r is Keyed => r.key !== null)\n return { root, keyed }\n}\n\nfunction detail(session: Session, id: string): Promise<CliModuleDetail> {\n return session.api.get<CliModuleDetail>(`/api/cli/v1/modules/${encodeURIComponent(id)}`)\n}\n\n/** Spec §5.3: with --module inside a repository, the remote's own module is derived too\n * (cache first, else one repos/resolve on the same profile) so the context line can say\n * \"--module, overrides <remote>\". Best effort: any failure means \"nothing derived\". */\nasync function flagOverrides(deps: Deps, session: Session, portal: PortalRef, cache: ResolutionCache, moduleId: string) {\n try {\n const keyed = (await repoRemotes(deps))?.keyed ?? []\n const derived = new Map<string, Set<string>>()\n const uncached: string[] = []\n for (const key of new Set(keyed.map((r) => r.key))) {\n const id = await cache.get(portal.apiOrigin, key)\n if (id) derived.set(key, new Set([id]))\n else uncached.push(key)\n }\n if (uncached.length > 0) {\n try {\n const { matches } = await session.api.post<CliRepoResolve>(RESOLVE, { repoKeys: uncached })\n for (const m of matches) derived.set(m.repoKey, (derived.get(m.repoKey) ?? new Set()).add(m.module.id))\n const ids = new Set(matches.map((m) => m.module.id))\n if (ids.size === 1) for (const m of matches) await cache.put(portal.apiOrigin, m.repoKey, m.module.id)\n } catch (e) { if (e instanceof CancelledError) throw e /* else best effort */ }\n }\n return byPreference(keyed).find((r) => [...(derived.get(r.key) ?? [])].some((id) => id !== moduleId))?.name\n } catch (e) {\n if (e instanceof CancelledError) throw e // Ctrl+C is never \"best effort\"\n return undefined\n }\n}\n\n/** Spec §3: `--portal` > workspace `portal` > `defaultProfile`. The workspace portal must be\n * a logged-in profile (QORE_NOT_LOGGED_IN otherwise, no request anywhere). */\nexport async function flagPortal(deps: Deps, portalArg: string | undefined, ws: Workspace | null): Promise<PortalRef> {\n if (!portalArg && ws) return workspacePortal(deps, ws)\n return resolvePortal(portalArg, (await deps.config.read()).defaultProfile)\n}\n\n/** The workspace app's modules. When `--portal` sent the request elsewhere and the app is not\n * there, the hint names the portal the workspace belongs to. */\nexport async function workspaceAppModules(session: Session, portal: PortalRef, ws: Workspace): Promise<CliAppModules> {\n try {\n return await session.api.get<CliAppModules>(`/api/cli/v1/apps/${encodeURIComponent(ws.appId)}/modules`)\n } catch (e) {\n if (e instanceof QoreError && e.code === \"QORE_RESOURCE_NOT_FOUND\" && portal.apiOrigin !== ws.portal) {\n const p = resolvePortal(ws.portal, undefined)\n const name = p.builtin ?? p.apiOrigin\n throw withDetails(e, { workspacePortal: p.apiOrigin }, `This workspace belongs to ${name}; drop --portal, or pass --portal ${name}.`)\n }\n throw e\n }\n}\n\nasync function byFlag(deps: Deps, o: Opts, cache: ResolutionCache, ws: Workspace | null): Promise<ModuleContext> {\n const portal = await flagPortal(deps, o.portal, ws)\n const session = await openSession(deps, portal, o.command, o.onRequest)\n await ensureCapability(deps, portal.apiOrigin, \"repo.resolve\")\n let id = o.module!\n if (!UUID.test(id)) {\n let tenantId = o.tenant ?? session.profile.activeTenant?.id\n if (!tenantId) {\n const me = await session.api.get<CliMe>(\"/api/cli/v1/me\")\n // /me lists only developer (non end_user) memberships.\n if (me.tenants.length === 0) {\n throw new QoreError(\"QORE_NO_DEVELOPER_ACCESS\", \"Your account is not a developer in any organisation\", {\n hint: \"Ask an admin to invite you as a developer.\",\n })\n }\n if (me.tenants.length > 1) {\n const candidates: Candidate[] = me.tenants.map((t) => ({ kind: \"tenant\", id: t.id, slug: t.slug, name: t.name }))\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", `Which tenant is \"${id}\" in?`, {\n hint: \"Run `qore tenant use <slug>`, or pass the module id.\", candidates,\n })\n }\n tenantId = me.tenants[0]!.id\n }\n id = (await session.api.get<{ id: string }>(\n `/api/cli/v1/tenants/${encodeURIComponent(tenantId)}/modules/resolve?slug=${encodeURIComponent(id)}`)).id\n }\n const module = await detail(session, id)\n const overrides = await flagOverrides(deps, session, portal, cache, module.id)\n const repoRoot = await findRepoRoot(deps.cwd)\n return { portal, session, module, source: overrides ? { kind: \"flag\", overrides } : { kind: \"flag\" }, repoRoot, workspace: ws }\n}\n\n/** True when `dir` lies strictly below `root`. */\nconst isBelow = (root: string, dir: string) => {\n const rel = relative(root, dir)\n return rel !== \"\" && !rel.startsWith(\"..\") && !isAbsolute(rel)\n}\n\n/** Spec §5.3: a workspace root is \"in a workspace, not inside one of its repositories\" —\n * no repository at all, or one strictly ABOVE the workspace root (a whole workspace kept in\n * one git repository). A repository whose root is the workspace root or below it resolves\n * by its remote: a committed qore.workspace.json never steers module choice. */\nasync function inWorkspaceRoot(deps: Deps, ws: Workspace | null): Promise<boolean> {\n if (!ws) return false\n const repoRoot = await findRepoRoot(deps.cwd)\n return repoRoot === null || isBelow(repoRoot, ws.root)\n}\n\n/** In a workspace root with no --module: a picked module (`o.choose`) is fetched directly on\n * the workspace session — never through byFlag, which would slug-resolve a non-UUID id —\n * otherwise the workspace's modules come back as QORE_CONTEXT_REQUIRED candidates. */\nasync function inWorkspace(deps: Deps, o: Opts, ws: Workspace, portal: PortalRef): Promise<ModuleContext> {\n const session = await openSession(deps, portal, o.command, o.onRequest)\n if (o.choose) {\n // repoRoot null: a pick in the root never names a repository to write into (an outer\n // repository, or <ws>/<slug> whose remote was never checked).\n return { portal, session, module: await detail(session, o.choose), source: { kind: \"workspace\" }, repoRoot: null, workspace: ws }\n }\n await ensureCapability(deps, portal.apiOrigin, \"app.modules\")\n const app = await workspaceAppModules(session, portal, ws)\n const candidates: Candidate[] = app.modules.map((m) => ({\n kind: \"module\", id: m.id, slug: m.slug, name: m.name, tenant: app.app.tenant.slug, remote: \"workspace\",\n }))\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"In a workspace root — which module?\", {\n hint: \"cd into a module, or pass --module <slug>.\", candidates,\n })\n}\n\n/** The workspace whose file sits in the cwd itself, else null. `status` uses it to show\n * the app-level view instead of asking for a module. The same strict-root rule as\n * `inWorkspaceRoot` applies: a module repository with a committed qore.workspace.json at\n * its own root is that module, not a workspace root. */\nexport async function workspaceRoot(deps: Deps): Promise<Workspace | null> {\n const ws = await readWorkspace(deps.cwd)\n return ws && (await inWorkspaceRoot(deps, ws)) ? ws : null\n}\n\nfunction profileOrder(cfg: QoreConfig, cachedOrigins: string[], portalArg?: string, wsPortal?: PortalRef): PortalRef[] {\n if (portalArg) return [resolvePortal(portalArg, cfg.defaultProfile)]\n const rank = (o: string) => (o === BUILTIN_PORTALS.prod.apiOrigin ? 0 : o === BUILTIN_PORTALS.staging.apiOrigin ? 1 : 2)\n const rest = Object.keys(cfg.profiles).sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))\n // Cached origins are filtered to known profiles *before* parsing: a garbage origin in the\n // cache file must not become QORE_CONTEXT_INVALID (a malformed cache is an empty cache).\n const cached = cachedOrigins.filter((c) => cfg.profiles[c])\n // Spec §3: the workspace portal comes before the cache (already checked to be logged in).\n const origins = [...(wsPortal ? [wsPortal.apiOrigin] : []), ...cached, resolvePortal(undefined, cfg.defaultProfile).apiOrigin, ...rest]\n return [...new Set(origins)].filter((c) => cfg.profiles[c]).map((c) => resolvePortal(c, undefined))\n}\n\n/** Merge extra `details` onto a QoreError, keeping its other fields (status, requestId,\n * candidates, serverCode) and chaining the original as `cause`. An explicit `hint`\n * replaces the original's; omitted, the original's hint carries over. Shared with\n * `core/env/fetch.ts` so both callers wrap an upstream error the same way. */\nexport function withDetails(e: QoreError, extra: Record<string, unknown>, hint?: string): QoreError {\n return new QoreError(e.code, e.message, {\n hint: hint ?? e.hint, status: e.status, requestId: e.requestId, candidates: e.candidates, serverCode: e.serverCode,\n details: { ...e.details, ...extra }, cause: e,\n })\n}\n\n/** One profile of the walk: the module, null for \"no match here\", or a throw. */\nasync function onProfile(deps: Deps, o: Opts, cache: ResolutionCache, portal: PortalRef, keyed: Keyed[], keys: string[],\n repoRoot: string, workspace: Workspace | null, unsupported: (e: QoreError) => void): Promise<ModuleContext | null> {\n const session = await openSession(deps, portal, o.command, o.onRequest)\n try {\n await ensureCapability(deps, portal.apiOrigin, \"repo.resolve\")\n } catch (e) {\n // A transport failure is a skippable profile (rethrown to the walk), not \"unsupported\".\n if (!(e instanceof QoreError) || e.code !== \"QORE_UNSUPPORTED_BY_SERVER\") throw e\n unsupported(e)\n return null\n }\n\n // The cache may answer only when it cannot contradict spec §5.2: every keyed remote is\n // cached to one and the same module, or not cached at all. Remotes cached to different\n // modules go to repos/resolve, which decides (and asks when several match).\n const hits: { remote: Keyed; id: string }[] = []\n for (const r of byPreference(keyed)) {\n const id = await cache.get(portal.apiOrigin, r.key)\n if (id) hits.push({ remote: r, id })\n }\n if (hits.length > 0 && hits.every((h) => h.id === hits[0]!.id)) {\n const { remote: r, id } = hits[0]!\n try {\n return { portal, session, module: await detail(session, id), source: { kind: \"remote\", remote: r.name, url: r.url }, repoRoot, workspace }\n } catch (e) {\n if (!(e instanceof QoreError) || e.code !== \"QORE_RESOURCE_NOT_FOUND\") throw e\n for (const h of hits) await cache.drop(portal.apiOrigin, h.remote.key)\n }\n }\n\n const { matches } = await session.api.post<CliRepoResolve>(RESOLVE, { repoKeys: keys })\n const ids = [...new Set(matches.map((m) => m.module.id))]\n if (ids.length === 0) return null\n let id = ids[0]!\n if (ids.length > 1) {\n if (o.choose && ids.includes(o.choose)) id = o.choose\n else {\n const candidates: Candidate[] = ids.map((mid) => {\n const own = matches.filter((m) => m.module.id === mid)\n const m = own[0]!\n const remote = preferred(keyed.filter((r) => own.some((x) => x.repoKey === r.key))).name\n return { kind: \"module\", id: m.module.id, slug: m.module.slug, name: m.module.name, remote, tenant: m.tenant.slug }\n })\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"This repository's remotes match several modules\", {\n hint: \"Pass --module <slug|id>.\", candidates,\n })\n }\n }\n const matchedKeys = new Set(matches.filter((m) => m.module.id === id).map((m) => m.repoKey))\n // Only an unambiguous match is cached (spec §5.2): a pick among several must be asked again.\n if (ids.length === 1) for (const k of matchedKeys) await cache.put(portal.apiOrigin, k, id)\n const remote = preferred(keyed.filter((r) => matchedKeys.has(r.key)))\n return { portal, session, module: await detail(session, id), source: { kind: \"remote\", remote: remote.name, url: remote.url }, repoRoot, workspace }\n}\n\nasync function anyLoggedIn(deps: Deps, cfg: QoreConfig): Promise<boolean> {\n for (const p of Object.values(cfg.profiles)) {\n if (await new TokenStore(deps.keychain, profileHash(p.apiOrigin, p.issuer)).getRefresh()) return true\n }\n return false\n}\n\nexport async function resolveModuleContext(deps: Deps, o: Opts): Promise<ModuleContext> {\n const cache = new ResolutionCache(join(deps.config.dir, \"cache\"), deps.now)\n const ws = await findWorkspace(deps.cwd, deps.home)\n if (o.module) return byFlag(deps, o, cache, ws)\n\n // Login before repository: a logged-out user cannot pass --module either, so\n // \"log in\" is the more useful first answer (pinned by the E2E test in Task 13).\n const cfg = await deps.config.read()\n const first = resolvePortal(o.portal, cfg.defaultProfile)\n // Based on tokens, not rows: `qore logout` clears the keychain but keeps the profile row.\n // A workspace names its portal: not logged in there is QORE_NOT_LOGGED_IN naming it,\n // before any request to another portal (spec §3).\n const wsPortal = ws && !o.portal ? await workspacePortal(deps, ws) : undefined\n if (o.portal || !(await anyLoggedIn(deps, cfg))) {\n await openSession(deps, first, o.command) // throws QORE_NOT_LOGGED_IN with the right hint\n }\n\n if (ws && (await inWorkspaceRoot(deps, ws))) return inWorkspace(deps, o, ws, wsPortal ?? first)\n const repo = await repoRemotes(deps)\n if (repo === null) throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"Not inside a module repository\", { hint: HINT_FLAG })\n const { root, keyed, gitError } = repo\n if (keyed.length === 0) {\n // git's own last stderr line (e.g. \"detected dubious ownership\") says why there are\n // no remotes; without it the message would claim the opposite of the truth (§14.1).\n const said = gitError?.hint\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"This repository has no remote Qore can match\", {\n hint: said ? `${HINT_FLAG} git said: ${said}` : HINT_FLAG,\n details: gitError ? { git: said ?? gitError.message } : undefined,\n cause: gitError,\n })\n }\n const keys = [...new Set(keyed.map((r) => r.key))]\n\n const tried: string[] = [] // every profile walked, in order\n const answered: string[] = [] // profiles whose repos/resolve answered \"no match\"\n const skipped: Skipped[] = []\n const skipErrors: QoreError[] = []\n let unsupported: QoreError | undefined\n for (const portal of profileOrder(cfg, await cache.originsFor(keys), o.portal, wsPortal)) {\n tried.push(label(portal))\n let capabilityMissing = false\n try {\n const mc = await onProfile(deps, o, cache, portal, keyed, keys, root, ws, (e) => {\n capabilityMissing = true\n unsupported ??= e\n skipped.push({ profile: label(portal), code: e.code, message: e.message })\n })\n if (mc) return mc\n if (!capabilityMissing) answered.push(label(portal))\n } catch (e) {\n if (!(e instanceof QoreError) || !SKIPPABLE.has(e.code)) throw e\n skipped.push({ profile: label(portal), code: e.code, message: e.message })\n skipErrors.push(e)\n }\n }\n\n const details: Record<string, unknown> = { triedProfiles: tried }\n if (skipped.length > 0) details.skippedProfiles = skipped\n if (answered.length === 0) {\n // No profile could say anything about this repository: its own failure is the answer\n // (unreachable → QORE_API_UNREACHABLE, no token → QORE_NOT_LOGGED_IN, too old →\n // QORE_UNSUPPORTED_BY_SERVER), not \"no module selected\".\n const cause = skipErrors[0] ?? unsupported\n if (cause) throw withDetails(cause, details)\n }\n const unchecked = skipped.length ? ` ${skipped.map((s) => s.profile).join(\", \")} could not be checked (${skipped.map((s) => s.code).join(\", \")}).` : \"\"\n // A staging row without a usable token needs the same remedy as no staging row at all.\n const stagingLoggedIn = Boolean(cfg.profiles[BUILTIN_PORTALS.staging.apiOrigin])\n && !skipped.some((s) => s.profile === \"staging\" && (s.code === \"QORE_NOT_LOGGED_IN\" || s.code === \"QORE_SESSION_EXPIRED\"))\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"No module selected\", {\n hint: `This repository's remotes match no module you can access on ${answered.join(\", \")}; pass --module <slug|id>.`\n + unchecked\n + (stagingLoggedIn ? \"\" : \" If it is a staging repository, run `qore login --portal staging`.\"),\n details,\n })\n}\n\nconst appCandidates = (apps: CliRef[]): Candidate[] => apps.map((a) => ({ kind: \"app\", id: a.id, slug: a.slug, name: a.name }))\n\nexport function pickApp(mc: Pick<ModuleContext, \"module\"> & { workspace?: Workspace | null }, app?: string): CliRef {\n const apps = mc.module.apps\n if (app) {\n const found = apps.find((a) => a.id === app || a.slug === app)\n if (!found) {\n throw new QoreError(\"QORE_RESOURCE_NOT_FOUND\", `${mc.module.slug} is not part of an app \"${app}\" you can read`, {\n candidates: appCandidates(apps),\n })\n }\n return found\n }\n if (apps.length === 1) return apps[0]!\n if (apps.length === 0) throw new QoreError(\"QORE_RESOURCE_NOT_FOUND\", `${mc.module.slug} is not part of an app you can read`)\n // Spec §5.2: the workspace's appId disambiguates a shared module.\n const wsApp = mc.workspace && apps.find((a) => a.id === mc.workspace!.appId)\n if (wsApp) return wsApp\n throw new QoreError(\"QORE_APP_AMBIGUOUS\", `${mc.module.slug} is part of several apps`, { hint: \"Pass --app <slug>.\", candidates: appCandidates(apps) })\n}\n","import type { HintContext } from \"../dev/providers.js\"\n\n/** How many trailing lines of a dev server's output are kept for `exitHint`,\n * both at the module-level tee and the workspace supervisor's tail — spec's\n * \"kept output lines\" constant. */\nexport const KEEP_LINES = 50\n\nexport type ExitHint = {\n hint: string\n reason: \"missing-module\" | \"invalid-env\" | \"port-in-use\" | \"conn-refused\" | \"db-auth\" | \"db-schema\" | \"watcher-limit\"\n keys?: string[]\n port?: number\n}\n\n/** Names the cause of a dev-server exit from its own tail output. Checked in a\n * fixed order (missing-module, invalid-env, port-in-use, conn-refused, db-auth,\n * db-schema, watcher-limit); `null` when nothing recognised — the caller keeps\n * its plan-6 error. The gate (non-zero, non-signal exit) is the caller's, and\n * applies equally to an early or a late crash. */\nexport function exitHint(tail: string[], h: HintContext): ExitHint | null {\n const text = tail.join(\"\\n\")\n\n const missing = text.match(/Cannot find (?:module|package) '([^']+)'/)\n if (missing) {\n return { reason: \"missing-module\", hint: `A dependency is missing (${missing[1]}). Run \\`${h.installCommand}\\`, then qore dev again.` }\n }\n\n if (/ZodError:/.test(text)) {\n const keys = [...text.matchAll(/\"path\":\\s*\\[\\s*\"([^\"]+)\"/g)].map((m) => m[1]!)\n if (keys.length > 0) {\n return {\n reason: \"invalid-env\", keys,\n hint: `Missing or invalid environment variables: ${keys.join(\", \")}. Set them in the portal's local secrets (then qore env pull), or in your env file.`,\n }\n }\n }\n\n const addrInUse = text.match(/listen EADDRINUSE: address already in use (?:\\S*:)?(\\d+)/)\n if (addrInUse) {\n const port = Number(addrInUse[1])\n return {\n reason: \"port-in-use\", port,\n hint: `Port ${port} was taken while the server started. Run qore dev again; if it repeats, lsof -iTCP:${port} -sTCP:LISTEN names the holder.`,\n }\n }\n\n if (/ECONNREFUSED/.test(text)) {\n const m = text.match(/ECONNREFUSED\\s+\\S*:(\\d+)/) ?? text.match(/code: 'ECONNREFUSED'[^}]*?port: (\\d+)/)\n if (!m) return { reason: \"conn-refused\", hint: \"A connection was refused (ECONNREFUSED) — a service this module calls is not running.\" }\n const port = Number(m[1])\n const role = h.ports.get(port)\n if (role?.kind === \"database\") {\n const up = h.runCommand(\"db:up\")\n return {\n reason: \"conn-refused\", port, hint: `The database on :${port} is not accepting connections (ECONNREFUSED). `\n + (up ? `Fix: ${up} (docker compose ps shows its state)` : \"docker compose ps shows its state.\"),\n }\n }\n if (role?.kind === \"provider\") {\n return {\n reason: \"conn-refused\", port,\n hint: `${role.key} points at :${port}, where nothing listens (ECONNREFUSED). Start that module — qore dev in the workspace root starts providers first.`,\n }\n }\n return { reason: \"conn-refused\", port, hint: `Nothing listens on :${port} (ECONNREFUSED) — a service this module calls is not running.` }\n }\n\n const auth = text.match(/password authentication failed for user \"([^\"]+)\"/)\n if (auth) {\n const reset = h.runCommand(\"db:reset\")\n // no db:reset script: no reset hint (spec §4.1), the diagnosis alone\n return {\n reason: \"db-auth\", hint: `The local database was created with other credentials than the portal now provides (user ${auth[1]}).`\n + (reset ? ` Fix: ${reset} — this wipes local data.` : \"\"),\n }\n }\n\n const relation = text.match(/relation \"([^\"]+)\" does not exist/)\n if (relation) {\n const reset = h.runCommand(\"db:reset\")\n return {\n reason: \"db-schema\", hint: `The database schema is behind the code (relation ${relation[1]} does not exist). `\n + \"Migrations run when the app starts; if they failed above, that error is the cause.\"\n + (reset ? ` To start clean: ${reset} (wipes local data).` : \"\"),\n }\n }\n\n if (/ENOSPC: System limit for number of file watchers reached/.test(text)) {\n return {\n reason: \"watcher-limit\",\n hint: \"Linux ran out of file watchers. Raise the limit: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p\",\n }\n }\n\n return null\n}\n","import { dirname, join } from \"node:path\"\nimport type { CliRef } from \"../api/types.js\"\nimport { moduleDefaults, type RepoConfig } from \"../context/repoConfig.js\"\nimport type { ModuleContext } from \"../context/resolver.js\"\nimport type { Deps } from \"../deps.js\"\nimport { fetchLocalEnv } from \"../env/fetch.js\"\nimport { parseEnv } from \"../env/merge.js\"\nimport { resolveTarget } from \"../env/pull.js\"\nimport { readOrNull, syncEnvFile } from \"../env/write.js\"\nimport { QoreError } from \"../errors.js\"\nimport { isTrusted } from \"../trust.js\"\nimport { isOffline } from \"./lastStart.js\"\n\nexport type DevEnv = {\n env: Record<string, string>; offline: boolean; envFile: string\n port: number | null; dbPort: number | null; created: boolean; kept: string[]\n}\n\nexport function envPort(env: Record<string, string>, key: \"PORT\" | \"DB_PORT\"): number | null {\n const raw = env[key]\n if (raw === undefined) return null\n // parseEnv keeps surrounding quotes verbatim; strip them before validating digits.\n const v = raw.trim().replace(/^[\"']|[\"']$/g, \"\")\n if (!/^\\d+$/.test(v)) return null\n const n = Number(v)\n return n >= 1024 && n <= 65535 ? n : null\n}\n\n/** Callers pass `mc` and `app` together — both or neither — never one without the other. */\nexport async function devEnv(deps: Deps, o: {\n mc: ModuleContext | null; app: CliRef | null; root: string; type: string; moduleId: string\n cfg: RepoConfig; random: () => string\n}): Promise<DevEnv> {\n const defaults = moduleDefaults(o.type)\n const target = await resolveTarget(o.root, o.cfg.envFile ?? defaults.envFile)\n let cause: QoreError | null = null\n if (o.mc && o.app) {\n try {\n const local = await fetchLocalEnv(deps, o.mc, o.app)\n const example = await readOrNull(join(dirname(target), \".env.example\"))\n const w = await syncEnvFile({\n target, example, fetched: local.env, managed: local.managedKeys,\n localSecrets: o.cfg.localSecrets ?? defaults.localSecrets, random: o.random,\n })\n return {\n env: local.env, offline: false, envFile: target,\n port: envPort(local.env, \"PORT\"), dbPort: envPort(local.env, \"DB_PORT\"), ...w,\n }\n } catch (e) {\n if (!isOffline(e)) throw e\n cause = e\n }\n }\n const text = await readOrNull(target)\n if (text === null || !(await isTrusted(deps, o.root, o.moduleId))) {\n throw cause ?? new QoreError(\"QORE_API_UNREACHABLE\", \"The portal is unreachable\", {\n hint: \"The portal is unreachable and there is no env file to start from yet.\",\n })\n }\n const env = Object.fromEntries(parseEnv(text))\n return { env, offline: true, envFile: target, port: envPort(env, \"PORT\"), dbPort: envPort(env, \"DB_PORT\"), created: false, kept: [] }\n}\n","import { ensureCapability } from \"../api/capabilities.js\"\nimport type { CliLocalEnv, CliRef } from \"../api/types.js\"\nimport { withDetails } from \"../context/resolver.js\"\nimport type { ModuleContext } from \"../context/resolver.js\"\nimport type { Deps } from \"../deps.js\"\nimport { QoreError } from \"../errors.js\"\n\nexport async function fetchLocalEnv(deps: Deps, mc: ModuleContext, app: CliRef): Promise<CliLocalEnv> {\n await ensureCapability(deps, mc.portal.apiOrigin, \"module.local-env\")\n try {\n return await mc.session.api.get<CliLocalEnv>(\n `/api/cli/v1/modules/${encodeURIComponent(mc.module.id)}/local-env?app_id=${encodeURIComponent(app.id)}`)\n } catch (e) {\n if (!(e instanceof QoreError) || e.code !== \"QORE_ACCESS_DENIED\") throw e\n if (e.serverCode === \"app.access.denied\") {\n throw withDetails(e, { required: \"write\", have: mc.module.access },\n `You have ${mc.module.access} on ${mc.module.slug}; local secrets need write. Ask a maintainer of the app's dev team for write access.`)\n }\n // C13: a token minted before qore:local-env existed as a scope.\n if (e.serverCode === \"auth.scope.insufficient\") throw withDetails(e, {}, \"Run `qore login` again.\")\n throw e\n }\n}\n","/** .env merge semantics, ported behaviour-identically from qdc-sdk\n * packages/sdk/src/cli/setup-env-core.ts (spec §11.1). Keep the two in step until\n * the SDK's copy is removed in migration phase 2. */\n\n/** Parse `.env` text into an ordered Map<key,value>. Comments and blank lines\n * are not represented (preserved separately by renderEnv). */\nexport function parseEnv(contents: string): Map<string, string> {\n const map = new Map<string, string>()\n for (const line of contents.split(\"\\n\")) {\n const m = line.replace(/\\r$/, \"\").match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/)\n if (m?.[1] !== undefined && m[2] !== undefined) map.set(m[1], m[2])\n }\n return map\n}\n\n/** Does `key` match one of the portal's managed-key patterns? Exact match, or\n * the single wildcard form `PREFIX_*` used for CONN_*. */\nexport function isManagedKey(key: string, managed: string[]): boolean {\n for (const pattern of managed) {\n if (pattern.endsWith(\"*\")) {\n if (key.startsWith(pattern.slice(0, -1))) return true\n } else if (key === pattern) return true\n }\n return false\n}\n\nexport function planEnvUpdate({\n current,\n fetched,\n choices = {},\n defaultChoice = \"keep\",\n managed = [],\n}: {\n current: Map<string, string>\n fetched: Record<string, string>\n choices?: Record<string, \"keep\" | \"use-portal\">\n defaultChoice?: \"keep\" | \"use-portal\"\n managed?: string[]\n}): {\n merged: Map<string, string>\n conflicts: string[]\n added: string[]\n unchanged: string[]\n overwritten: string[]\n} {\n const merged = new Map(current)\n const conflicts: string[] = []\n const added: string[] = []\n const unchanged: string[] = []\n const overwritten: string[] = []\n\n for (const [key, portalValue] of Object.entries(fetched)) {\n const hasLocal = current.has(key)\n const localValue = current.get(key)\n const localEmpty = !hasLocal || localValue === \"\" || localValue === '\"\"' || localValue === \"''\"\n\n if (localEmpty) {\n merged.set(key, portalValue)\n added.push(key)\n continue\n }\n if (localValue === portalValue) {\n unchanged.push(key)\n continue\n }\n // The portal owns this key: take its value without asking. Anything the\n // developer needs to override permanently belongs in the portal as a\n // `local` secret, not in a hand-edited .env.local.\n if (isManagedKey(key, managed)) {\n merged.set(key, portalValue)\n overwritten.push(key)\n continue\n }\n conflicts.push(key)\n const choice = choices[key] ?? defaultChoice\n merged.set(key, choice === \"use-portal\" ? portalValue : localValue!)\n }\n\n return { merged, conflicts, added, unchanged, overwritten }\n}\n\n/** Render the merged Map back to `.env` text, preserving original comments,\n * blank lines, and key order. New keys are appended at the end. */\nexport function renderEnv(original: string, merged: Map<string, string>): string {\n const seen = new Set<string>()\n const lines = original.split(\"\\n\")\n const out = lines.map((line) => {\n const m = line.replace(/\\r$/, \"\").match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/)\n if (!m?.[1]) return line\n const key: string = m[1]\n if (!merged.has(key)) return line\n seen.add(key)\n return `${key}=${merged.get(key) ?? \"\"}`\n })\n\n const appended: string[] = []\n for (const [key, value] of merged) {\n if (!seen.has(key)) appended.push(`${key}=${value}`)\n }\n\n let text = out.join(\"\\n\")\n if (appended.length) {\n if (text.length && !text.endsWith(\"\\n\")) text += \"\\n\"\n text += appended.join(\"\\n\") + \"\\n\"\n }\n return text\n}\n","import { lstat, realpath } from \"node:fs/promises\"\nimport { basename, dirname, isAbsolute, relative, resolve, sep } from \"node:path\"\nimport { QoreError } from \"../errors.js\"\nimport { parseEnv, planEnvUpdate, renderEnv } from \"./merge.js\"\n\nconst outside = (target: string) => new QoreError(\"QORE_CONTEXT_INVALID\", `The env file must be inside the repository (got ${target})`, {\n hint: \"Use a path inside the repository for --target or .qore.json envFile.\",\n})\n\nconst symlinked = (target: string) => new QoreError(\"QORE_CONTEXT_INVALID\", `The env file target must not be a symlink (got ${target})`, {\n hint: \"Use a path inside the repository for --target or .qore.json envFile.\",\n})\n\nfunction inside(root: string, p: string): boolean {\n const rel = relative(root, p)\n return rel !== \"\" && rel !== \"..\" && !rel.startsWith(\"..\" + sep) && !isAbsolute(rel)\n}\n\n/** Spec §11.1 step 3, carried over from qdc-setup-env — plus a realpath check, so a\n * symlinked directory cannot carry the write out of the repository (review focus 1).\n *\n * `base` is where `target` is resolved from: the cwd for `--target`, the repository root\n * for `.qore.json`'s `envFile` (ruling R11) — both must still land inside `root`. Both sides\n * are compared by realpath(root) so macOS's /var → /private/var symlink cannot make an\n * in-repo path look external (ruling B5). */\nexport async function resolveTarget(root: string, target: string, base: string = root): Promise<string> {\n const realRoot = await realpath(root)\n const realBase = base === root ? realRoot : await realpath(base)\n const abs = resolve(realBase, target)\n // I2: `abs` is not yet realpath'd, so an absolute target spelled through a symlinked\n // directory (e.g. a repo under macOS /var, whose realpath is /private/var) would be\n // falsely rejected here even though it lands inside the repository. Containment is\n // enforced for real below, once the path is realpath'd (`final`, `realFinal`). This is\n // only a cheap pre-filter for the common relative-escape case (`../../etc/passwd`),\n // where realpath'ing an already-inside `abs` is pointless work to skip.\n if (!isAbsolute(target) && !inside(realRoot, abs)) throw outside(target)\n let parent: string\n try { parent = await realpath(dirname(abs)) } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `The directory for ${target} does not exist`, {\n hint: \"Create the parent directory, or point --target / .qore.json envFile at an existing one.\",\n })\n }\n const final = resolve(parent, basename(abs))\n if (!inside(realRoot, final)) throw outside(target)\n\n // Review focus 1: an existing final path component that is itself a symlink is refused\n // outright — its target is never trusted, in or out of the repo — and if somehow not a\n // symlink but its realpath still escapes, that is refused too.\n try {\n const st = await lstat(final)\n if (st.isSymbolicLink()) throw symlinked(target)\n const realFinal = await realpath(final)\n if (!inside(realRoot, realFinal)) throw outside(target)\n } catch (e) {\n if (e instanceof QoreError) throw e\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e\n }\n\n return final\n}\n\nexport type PullPlan = {\n text: string; created: boolean; seededFromExample: boolean\n added: string[]; updated: string[]; kept: string[]; replaced: string[]; unchanged: string[]; generated: string[]\n}\n\nexport function planPull(o: {\n existing: string | null; example: string | null; fetched: Record<string, string>; managed: string[]\n localSecrets: string[]; choices?: Record<string, \"keep\" | \"use-portal\">; defaultChoice: \"keep\" | \"use-portal\"; random: () => string\n}): PullPlan & { conflicts: string[] } {\n const original = o.existing ?? o.example ?? \"\"\n const current = parseEnv(original)\n const r = planEnvUpdate({ current, fetched: o.fetched, choices: o.choices ?? {}, defaultChoice: o.defaultChoice, managed: o.managed })\n const choiceOf = (k: string) => o.choices?.[k] ?? o.defaultChoice\n const generated: string[] = []\n for (const key of o.localSecrets) {\n const v = r.merged.get(key)\n if (v === undefined || v === \"\" || v === '\"\"' || v === \"''\") { r.merged.set(key, o.random()); generated.push(key) }\n }\n return {\n text: renderEnv(original, r.merged),\n created: o.existing === null,\n seededFromExample: o.existing === null && o.example !== null,\n added: r.added, updated: r.overwritten, unchanged: r.unchanged, conflicts: r.conflicts,\n kept: r.conflicts.filter((k) => choiceOf(k) === \"keep\"),\n replaced: r.conflicts.filter((k) => choiceOf(k) === \"use-portal\"),\n generated,\n }\n}\n","import { chmod, readFile, rename, unlink, writeFile } from \"node:fs/promises\"\nimport { randomBytes } from \"node:crypto\"\nimport { basename, dirname, join } from \"node:path\"\nimport { planPull } from \"./pull.js\"\n\nexport async function readOrNull(p: string): Promise<string | null> {\n try { return await readFile(p, \"utf8\") } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return null\n throw e\n }\n}\n\n/** Temp file (\"wx\", 0600) in the target's directory, renamed over the target, so a symlink\n * planted at the target is never written through. A `.local` temp name keeps matching\n * `.env*.local` ignores. */\nexport async function writeSecurely(target: string, text: string): Promise<void> {\n const base = basename(target)\n const tmpName = base.endsWith(\".local\")\n ? `${base.slice(0, -\".local\".length)}.qore-${randomBytes(6).toString(\"hex\")}.local`\n : `${base}.qore-${randomBytes(6).toString(\"hex\")}.tmp`\n const tmp = join(dirname(target), tmpName)\n try {\n await writeFile(tmp, text, { mode: 0o600, flag: \"wx\" })\n await chmod(tmp, 0o600)\n await rename(tmp, target)\n } finally {\n await unlink(tmp).catch(() => {})\n }\n}\n\n/** `env pull` without prompts, so tools that read the file see what the dev server gets. */\nexport async function syncEnvFile(o: { target: string; example: string | null; fetched: Record<string, string>; managed: string[];\n localSecrets: string[]; random: () => string }): Promise<{ created: boolean; kept: string[] }> {\n const existing = await readOrNull(o.target)\n const plan = planPull({ existing, example: existing === null ? o.example : null, fetched: o.fetched, managed: o.managed,\n localSecrets: o.localSecrets, defaultChoice: \"keep\", random: o.random })\n if (existing !== null && plan.text === existing) await chmod(o.target, 0o600)\n else await writeSecurely(o.target, plan.text)\n return { created: plan.created, kept: plan.kept }\n}\n","import { createHash } from \"node:crypto\"\nimport { realpath } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { Deps } from \"../deps.js\"\nimport { QoreError } from \"../errors.js\"\nimport { readJson, writeJsonAtomic } from \"../jsonFile.js\"\nimport { trustKey } from \"../trust.js\"\n\nexport type LastModule = {\n id: string; slug: string; name: string; type: string; access: string\n tenant: { id: string; slug: string; name: string }\n apps: { id: string; slug: string; name: string }[]\n}\n\n// `envFile` is relative to the root.\nexport type LastStart =\n | { schemaVersion: 1; kind: \"module\"; portal: string; savedAt: string; module: LastModule\n app: { id: string; slug: string; name: string }; envFile: string }\n | { schemaVersion: 1; kind: \"workspace\"; portal: string; savedAt: string\n app: { id: string; slug: string; name: string; tenant: { id: string; slug: string; name: string } }\n modules: { id: string; slug: string; name: string; type: string; access: string; repoUrl: string | null; dependsOn: string[]; envFile: string }[] }\n\nconst NETWORK_REASONS = new Set([\"connect\", \"dns\", \"tls\", \"timeout\"])\n\n/** The portal or Keycloak could not be reached at all — not an answer from it. Keycloak's\n * QORE_AUTH_UNAVAILABLE also covers its 4xx answers (e.g. invalid_client), which are not. */\nexport function isOffline(e: unknown): e is QoreError {\n if (!(e instanceof QoreError)) return false\n if (e.code === \"QORE_API_UNREACHABLE\" || e.code === \"QORE_API_UNAVAILABLE\") return true\n if (e.code !== \"QORE_AUTH_UNAVAILABLE\") return false\n return (e.status ?? 0) >= 500 || NETWORK_REASONS.has(String(e.details?.reason))\n}\n\nexport async function stateKey(deps: Deps, root: string): Promise<string> {\n const real = await realpath(root).catch(() => root)\n return createHash(\"sha256\").update(trustKey(real, deps.platform)).digest(\"hex\").slice(0, 16)\n}\n\nexport async function saveLastStart(deps: Deps, root: string, rec: LastStart): Promise<void> {\n await writeJsonAtomic(join(deps.config.dir, \"dev\"), `${await stateKey(deps, root)}.json`, rec)\n}\n\nexport async function loadLastStart(deps: Deps, root: string): Promise<LastStart | null> {\n const rec = await readJson<LastStart>(join(deps.config.dir, \"dev\", `${await stateKey(deps, root)}.json`)).catch(() => null)\n return rec && rec.schemaVersion === 1 ? rec : null\n}\n","import type { CliAppModule, CliAppModules } from \"../api/types.js\"\n\n/** The module's own dev teams; no `devTeamIds` (older server) or no match falls back to all of the app's. */\nfunction devTeamsOf(am: CliAppModules, m: CliAppModule) {\n const own = m.devTeamIds?.length ? am.devTeams.filter((t) => m.devTeamIds!.includes(t.id)) : []\n return own.length ? own : am.devTeams\n}\n\nexport function askMaintainer(am: CliAppModules, m: CliAppModule): { teams: string[]; maintainers: string[]; text: string } {\n const teams = devTeamsOf(am, m)\n const names = teams.map((t) => t.name)\n const maintainers = [...new Set(teams.flatMap((t) => t.maintainers))]\n const who = names.length ? names.join(\", \") : \"the app's dev team\"\n return { teams: names, maintainers, text: `ask a maintainer of ${who}${maintainers.length ? ` (${maintainers.join(\", \")})` : \"\"}` }\n}\n\n/** What follows \"not cloned — \". Without `am` (offline: access unknown) it is always \"run qore sync\". */\nexport function notClonedReason(m: CliAppModule, am?: CliAppModules): string {\n if (am && !m.githubLinked) return `GitHub account not linked (${am.accountUrl})`\n if (am && m.repoAccess === \"none\") {\n const names = devTeamsOf(am, m).map((t) => t.name)\n return names.length ? `no repository access (dev team ${names.join(\", \")})` : \"no repository access (ask your tenant owner)\"\n }\n return \"run qore sync\"\n}\n","import type { CliAppModule, CliAppModules } from \"../api/types.js\"\nimport { askMaintainer, notClonedReason } from \"../workspace/access.js\"\nimport { conflictText, unsupportedRepoUrlError, type ModuleAction } from \"../workspace/plan.js\"\nimport type { RepoStatus } from \"../../platform/git.js\"\nimport { envPort } from \"./env.js\"\nimport type { DevRecipe } from \"./project.js\"\n\n/** Something `qore dev` can continue past, said the same way everywhere: what is the\n * case, why it matters, and the literal fix. Hard stops stay `QoreError`. No terminal I/O. */\nexport type FindingCode = \"dev.modules-missing\" | \"dev.provider-down\" | \"dev.repo-behind\" | \"dev.services-missing\" | \"dev.stray-clone\"\nexport type Finding = {\n code: FindingCode\n severity: \"info\" | \"warn\"\n message: string\n why?: string\n module?: string\n modules?: string[]\n /** `command` is the literal next step; `fix` is set only when qore can run it itself. */\n action?: { command: string; fix?: \"sync\" }\n}\n\nconst plural = (n: number, one: string, many: string) => (n === 1 ? one : many)\n\n/** Not-cloned modules, by what `planWorkspace` plans for each (`actions`). Only a planned\n * `clone` that sync can do is one finding (with `fix: \"sync\"` when online); a module sync\n * cannot help gets its own finding naming the real next step — a directory in the way\n * (conflict), no repository yet, an unsupported repository URL, GitHub not linked, no\n * repository access. `am === null` is offline: access unknown, no fix offered. `cwd` is\n * what a conflicting directory is shown relative to. */\nexport function modulesMissing(o: { missing: CliAppModule[]; actions: ModuleAction[]; cwd: string; consumers: Record<string, string[]>\n am: CliAppModules | null }): { findings: Finding[]; fixable: CliAppModule[]; reasons: Record<string, string> } {\n const actionFor = new Map(o.actions.map((a) => [a.module.slug, a]))\n const findings: Finding[] = []\n const fixable: CliAppModule[] = []\n const blocked: Finding[] = []\n /** Why each module sync cannot clone is not cloned, for the summary's \"Not running\". */\n const reasons: Record<string, string> = {}\n const own = (m: CliAppModule, reason: string, rest: Pick<Finding, \"why\" | \"action\">): Finding => {\n reasons[m.slug] = reason\n return { code: \"dev.modules-missing\", severity: \"warn\", module: m.slug, modules: [m.slug], message: `${m.slug} is not cloned — ${reason}`, ...rest }\n }\n for (const m of o.missing) {\n const a = actionFor.get(m.slug)\n if (a && a.kind !== \"clone\") {\n if (a.kind === \"conflict\") {\n const c = conflictText(o.cwd, a)\n blocked.push(own(m, c.message, { action: { command: c.hint } }))\n } else if (a.kind === \"unsupported\") {\n blocked.push(own(m, \"its repository URL is not supported\", { action: { command: unsupportedRepoUrlError(m.slug, \"\").hint! } }))\n } else {\n blocked.push(own(m, a.reason ?? \"no repository yet\", { why: \"It will not run in this session.\" }))\n }\n } else if (o.am !== null && (!m.githubLinked || m.repoAccess === \"none\")) {\n const am = o.am\n blocked.push(own(m, notClonedReason(m, am), { action: { command: !m.githubLinked ? `Link your GitHub account: ${am.accountUrl}` : askMaintainer(am, m).text } }))\n } else fixable.push(m)\n }\n if (fixable.length > 0) {\n const slugs = fixable.map((m) => m.slug)\n // only the dependency: the missing-provider warning after preflight says what that breaks\n const deps = slugs.flatMap((s) => (o.consumers[s] ?? []).map((c) => `${c} depends on ${s}`))\n findings.push({\n code: \"dev.modules-missing\", severity: \"warn\",\n message: `${fixable.length} ${plural(fixable.length, \"module of this app is\", \"modules of this app are\")} not cloned: ${slugs.join(\", \")}`,\n why: deps.length > 0 ? `${deps.join(\"; \")}.` : `${plural(fixable.length, \"It\", \"They\")} will not run in this session.`,\n modules: slugs, action: o.am ? { command: \"qore sync\", fix: \"sync\" } : { command: \"qore sync\" },\n })\n }\n return { findings: [...findings, ...blocked], fixable, reasons }\n}\n\nexport function strayClone(name: string, appName: string): Finding {\n return { code: \"dev.stray-clone\", severity: \"info\", module: name, message: `${name} is no longer part of ${appName} — you can remove the directory.` }\n}\n\n/** From the last fetch only — qore dev never fetches. Ahead or dirty is not reported. */\nexport function repoBehind(slug: string, s: RepoStatus, o: { workspace: boolean }): Finding | null {\n if (!s.ok || !s.upstream || !s.behind) return null\n return {\n code: \"dev.repo-behind\", severity: \"warn\", module: slug,\n message: `${slug} is ${s.behind} ${plural(s.behind, \"commit\", \"commits\")} behind ${s.upstreamRef ?? \"its upstream\"} (as of your last fetch).`,\n action: { command: o.workspace ? \"qore sync --pull\" : \"git pull\" },\n }\n}\n\n/** Spec §3.3: a DB_PORT from the portal, no `db:up` script and no `dev.services` — `configured`\n * is whether `.qore.json` sets `dev.services` at all (an explicit `[]` is a choice, not a gap). */\nexport function servicesMissing(slug: string, env: Record<string, string>, recipe: Pick<DevRecipe, \"services\">,\n o: { servicesFlag: boolean; configured: boolean }): Finding | null {\n const db = envPort(env, \"DB_PORT\")\n if (db === null || recipe.services.length > 0 || !o.servicesFlag || o.configured) return null\n return {\n code: \"dev.services-missing\", severity: \"warn\", module: slug,\n message: `The portal gives ${slug} a database (DB_PORT=${db}), but ${slug} has no db:up script — no database will be started.`,\n why: \"This repository is probably older than its template.\",\n action: { command: \"add a \\\"db:up\\\" script (see the current app template), or set dev.services in .qore.json\" },\n }\n}\n\n/** A provider this module depends on whose CONN_*_URL port nothing listens on. Names,\n * keys and ports only — never a URL value. `providers` is the module's full set of\n * dependencies; `keys` are the dead CONN_*_URL keys. The two cannot be reliably correlated\n * (a key's alias is a free connection name, not the provider slug), so with more than one\n * of either, the wording stays truthful: it names the dead keys and lists providers only\n * as dependencies, never as down. */\nexport function providerDown(o: { slug: string; providers: string[]; keys: string[]; ports: Map<string, number>; fix: string }): Finding {\n const single = o.providers.length === 1 && o.keys.length === 1\n return {\n code: \"dev.provider-down\", severity: \"warn\", module: o.slug, modules: o.providers,\n message: single\n ? `${o.providers[0]} is not running — ${o.keys[0]} points at :${o.ports.get(o.keys[0]!)}, where nothing listens.`\n : `${o.keys.join(\", \")} ${plural(o.keys.length, \"points\", \"point\")} at ports nothing listens on (depends on: ${o.providers.join(\", \")}).`,\n why: single\n ? `${o.slug} will start, but calls to ${o.providers[0]} will fail. Qore does not fall back to staging.`\n : `${o.slug} will start, but calls through ${o.keys.join(\", \")} will fail. Qore does not fall back to staging.`,\n action: { command: o.fix },\n }\n}\n","import { access, readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { RepoConfig } from \"../context/repoConfig.js\"\nimport { QoreError } from \"../errors.js\"\n\nexport type PackageManager = { name: \"pnpm\" | \"npm\" | \"yarn\"; version: string | null }\nexport type PackageJson = { packageManager?: string; scripts?: Record<string, string>; engines?: { node?: string } }\nexport type DevRecipe = { root: string; pm: PackageManager; install: boolean; services: string[]; script: string; dockerServices: boolean }\n\n/** The old generated backend `dev`: no build, and `--env-file` errors on a missing `.env`. */\nexport const LEGACY_DEV_SCRIPTS: readonly string[] = [\"node --env-file=.env --import ./dist/instrumentation.js dist/index.js\"]\n\nconst LOCKFILES: [string, PackageManager[\"name\"]][] = [[\"pnpm-lock.yaml\", \"pnpm\"], [\"package-lock.json\", \"npm\"], [\"yarn.lock\", \"yarn\"]]\nconst exists = (p: string) => access(p).then(() => true, () => false)\nconst unsupported = (message: string, hint: string, details?: Record<string, unknown>) =>\n new QoreError(\"QORE_DEV_UNSUPPORTED\", message, { hint, details })\n\nexport async function readPackageJson(root: string): Promise<PackageJson> {\n let raw: string\n try { raw = await readFile(join(root, \"package.json\"), \"utf8\") } catch {\n throw unsupported(\"This repository has no package.json\", \"qore dev starts Node repositories through their package.json scripts.\")\n }\n try { return JSON.parse(raw) as PackageJson } catch {\n throw unsupported(\"package.json is not valid JSON\", \"Fix package.json, then run qore dev again.\")\n }\n}\n\nexport async function detectPackageManager(root: string, pkg: PackageJson): Promise<PackageManager> {\n if (typeof pkg.packageManager === \"string\") {\n const m = /^(pnpm|npm|yarn)@(.+)$/.exec(pkg.packageManager.trim())\n if (!m) throw unsupported(`packageManager \"${pkg.packageManager}\" is not pnpm, npm or yarn`, \"qore dev supports pnpm, npm and yarn.\")\n return { name: m[1] as PackageManager[\"name\"], version: m[2]!.split(\"+\")[0]! }\n }\n for (const [file, name] of LOCKFILES) if (await exists(join(root, file))) return { name, version: null }\n throw unsupported(\"No package manager declared and no lockfile found\", 'Add \"packageManager\": \"pnpm@<version>\" to package.json.')\n}\n\nexport function planRecipe(o: { root: string; pkg: PackageJson; pm: PackageManager; cfg: RepoConfig; slug: string;\n flags: { install: boolean; services: boolean } }): DevRecipe {\n const scripts = o.pkg.scripts ?? {}\n const script = o.cfg.dev?.script ?? \"dev\"\n const found = scripts[script]\n if (found === undefined) {\n throw unsupported(`${o.slug} has no \"${script}\" script in package.json`, 'Add a \"dev\" script, or set dev.script in .qore.json.', { script })\n }\n if (LEGACY_DEV_SCRIPTS.includes(found.trim())) {\n throw unsupported(`${o.slug}'s dev script is the old backend one, which needs a build and a .env first`,\n 'Update it to the current template: \"dev\": \"node scripts/dev.mjs\" plus scripts/dev.mjs.', { script, found })\n }\n const configured = o.cfg.dev?.services\n for (const s of configured ?? []) {\n if (scripts[s] === undefined) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `.qore.json: dev.services names \"${s}\", which is not a script in package.json`, {\n hint: \"Fix dev.services in .qore.json.\",\n })\n }\n }\n const services = !o.flags.services ? [] : configured ?? (scripts[\"db:up\"] !== undefined ? [\"db:up\"] : [])\n return {\n root: o.root, pm: o.pm, script, services,\n install: (o.cfg.dev?.install ?? true) && o.flags.install,\n dockerServices: services.some((s) => /\\bdocker\\b/.test(scripts[s] ?? \"\")),\n }\n}\n\nexport function runArgs(pm: PackageManager, script: string) { return { cmd: pm.name, args: [\"run\", script] } }\nexport function installArgs(pm: PackageManager) { return { cmd: pm.name, args: [\"install\"] } }\n","import { stat } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { PackageManager } from \"./project.js\"\n\nconst MARKERS: Record<PackageManager[\"name\"], string[]> = {\n pnpm: [\".modules.yaml\"], npm: [\".package-lock.json\"], yarn: [\".yarn-state.yml\", \".yarn-integrity\"],\n}\nconst LOCK: Record<PackageManager[\"name\"], string> = { pnpm: \"pnpm-lock.yaml\", npm: \"package-lock.json\", yarn: \"yarn.lock\" }\nconst mtime = (p: string) => stat(p).then((s) => s.mtimeMs, () => null)\n\n/** `node_modules` missing, or its install marker older than the lockfile. */\nexport async function needsInstall(root: string, pm: PackageManager): Promise<boolean> {\n if ((await mtime(join(root, \"node_modules\"))) === null) return true\n let marker: number | null = null\n for (const m of MARKERS[pm.name]) marker ??= await mtime(join(root, \"node_modules\", m))\n if (marker === null) return true\n const lock = await mtime(join(root, LOCK[pm.name]))\n return lock !== null && lock > marker\n}\n","import { QoreError } from \"../errors.js\"\n\nexport function dockerInstallUrl(platform: NodeJS.Platform): string {\n if (platform === \"darwin\") return \"https://docs.docker.com/desktop/setup/install/mac-install/\"\n if (platform === \"win32\") return \"https://docs.docker.com/desktop/setup/install/windows-install/\"\n return \"https://docs.docker.com/engine/install/\"\n}\n\nexport function classifyDockerInfo(r: { code: number | null; spawnError?: string; tail: string[] }, platform: NodeJS.Platform): QoreError | null {\n if (r.spawnError === \"ENOENT\") {\n return new QoreError(\"QORE_DOCKER_MISSING\", \"Docker is not installed\", {\n hint: `Install Docker: ${dockerInstallUrl(platform)} — or run qore dev --no-services.`,\n })\n }\n if (r.code === 0) return null\n const hint = \"Start Docker Desktop, then run qore dev again — or qore dev --no-services.\"\n if (/Cannot connect to the Docker daemon|Is the docker daemon running|error during connect/i.test(r.tail.join(\"\\n\"))) {\n return new QoreError(\"QORE_DOCKER_NOT_RUNNING\", \"Docker is not running\", { hint, details: { reason: \"daemon\" } })\n }\n return new QoreError(\"QORE_DOCKER_NOT_RUNNING\", \"Docker is not running\", { hint, details: { stderr: r.tail } })\n}\n\nexport function classifyComposeVersion(r: { code: number | null; tail: string[] }): QoreError | null {\n if (r.code === 0) return null\n const hint = \"Update Docker Desktop (or install the compose plugin). The legacy docker-compose v1 is not supported.\"\n if (/unknown command: docker compose|'compose' is not a docker command/.test(r.tail.join(\"\\n\"))) {\n return new QoreError(\"QORE_DOCKER_COMPOSE_MISSING\", \"Docker Compose v2 is missing\", { hint })\n }\n return new QoreError(\"QORE_DOCKER_COMPOSE_MISSING\", \"Docker Compose v2 is missing\", { hint, details: { stderr: r.tail } })\n}\n","import { QoreError } from \"../errors.js\"\n\nconst INCOMPATIBLE = /database files are incompatible with server|Counter to that, there appears to be PostgreSQL data in|in 18\\+, these Docker images are configured to store database data/\n\nexport function classifyComposeLogs(logs: string[], o: { slug: string; script: string }): QoreError | null {\n const text = logs.join(\"\\n\")\n if (!INCOMPATIBLE.test(text)) return null\n const details: Record<string, unknown> = { reason: \"pg-data-version\" }\n const m = text.match(/initialized by PostgreSQL version (\\d+).*this version (\\d+)/)\n if (m) { details.found = m[1]; details.expected = m[2] }\n return new QoreError(\"QORE_SERVICE_DATA_INCOMPATIBLE\", `The local database volume of ${o.slug} was created by another Postgres version`, {\n hint: \"pnpm db:reset recreates it — this deletes all local data in it. Qore never runs it for you.\",\n details,\n })\n}\n","export type DockerPublisher = { id: string; name: string; project: string | null; workingDir: string | null }\n\nexport function parseDockerPs(stdout: string): DockerPublisher | null {\n const line = stdout.split(/\\r?\\n/).find((l) => l.trim())\n if (!line) return null\n const [id, name, project, workingDir] = line.split(\"\\t\")\n if (!id || !name) return null\n return { id, name, project: project || null, workingDir: workingDir || null }\n}\n\nexport function parseLsofCwd(stdout: string): string | null {\n const m = stdout.match(/^fcwd\\nn(.+)$/m)\n return m ? m[1]! : null\n}\n\nexport function parseEtime(s: string): number | null {\n const m = s.trim().match(/^(?:(\\d+)-)?(?:(\\d+):)?(\\d+):(\\d+)$/)\n if (!m) return null\n const days = m[1] ? Number(m[1]) : 0\n const hours = m[2] ? Number(m[2]) : 0\n const minutes = Number(m[3])\n const seconds = Number(m[4])\n return days * 86400 + hours * 3600 + minutes * 60 + seconds\n}\n\nexport function humanAge(seconds: number): string {\n if (seconds < 60) return `${seconds} s`\n if (seconds < 3600) return `${Math.round(seconds / 60)} min`\n if (seconds < 86400) return `${Math.round(seconds / 3600)} h`\n return `${Math.round(seconds / 86400)} d`\n}\n","import { QoreError } from \"../errors.js\"\nimport type { PackageManager } from \"../dev/project.js\"\n\n/** pnpm >= 9.7 switches itself to the pinned version, so `printed` may already agree. */\nexport function pmVersionMismatch(pm: PackageManager, printed: string): QoreError | null {\n if (pm.version === null) return null\n const lines = printed.split(\"\\n\")\n let found: string | null = null\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!.trim()\n if (/^\\d+\\.\\d+\\.\\d+/.test(line)) { found = line; break }\n }\n if (found === null) return null\n if (found.split(\".\")[0] === pm.version.split(\".\")[0]) return null\n return new QoreError(\"QORE_PACKAGE_MANAGER\", `${pm.name} ${found} does not match the pinned ${pm.name}@${pm.version}`, {\n hint: `Install the pinned major: npm i -g ${pm.name}@${pm.version.split(\".\")[0]}. (pnpm ≥ 9.7 switches to the pinned version by itself.)`,\n details: { found, pinned: pm.version },\n })\n}\n\nexport function classifyInstall(tail: string[], command: string, root: string): QoreError {\n const joined = tail.join(\"\\n\")\n if (/ERR_PNPM_OUTDATED_LOCKFILE/.test(joined)) {\n return new QoreError(\"QORE_INSTALL_FAILED\", \"The lockfile does not match package.json\", {\n hint: `Someone committed one without the other. Run \\`${command} --no-frozen-lockfile\\` in ${root} and commit the lockfile.`,\n details: { reason: \"outdated-lockfile\", command, stderr: tail },\n })\n }\n return new QoreError(\"QORE_INSTALL_FAILED\", `${command} failed`, {\n hint: `Run \\`${command}\\` in ${root} to see the full output.`,\n details: { command, stderr: tail },\n })\n}\n","import semver from \"semver\"\nimport { QoreError } from \"../errors.js\"\n\n/** null = unparsable range (never fail on it). */\nexport function nodeSatisfies(found: string, range: string): boolean | null {\n if (semver.validRange(range) === null) return null\n return semver.satisfies(found, range)\n}\n\nexport function nodeVersionError(found: string, range: string, slug: string): QoreError {\n const min = semver.minVersion(range)\n const major = min ? min.major : range\n return new QoreError(\"QORE_NODE_VERSION\", `${slug} needs Node ${range}, found ${found}`, {\n hint: `nvm install ${major} / fnm use ${major}, then run qore dev again.`,\n details: { found, required: range },\n })\n}\n","import type { Deps } from \"../deps.js\"\nimport { CancelledError, QoreError } from \"../errors.js\"\nimport type { OutLine } from \"../../platform/launch.js\"\nimport { installArgs, runArgs, type DevRecipe, type PackageJson } from \"./project.js\"\nimport { needsInstall } from \"./install.js\"\nimport type { RunRecord } from \"./runFile.js\"\nimport { classifyComposeVersion, classifyDockerInfo } from \"../diagnostics/docker.js\"\nimport { classifyComposeLogs } from \"../diagnostics/postgres.js\"\nimport { humanAge } from \"../diagnostics/ports.js\"\nimport { classifyInstall, pmVersionMismatch } from \"../diagnostics/pm.js\"\nimport { nodeSatisfies, nodeVersionError } from \"../diagnostics/versions.js\"\n\nexport type StepReport = (e: { module: string; step: \"pm\" | \"install\" | \"env\" | \"services\" | \"ports\"; status: \"start\" | \"done\" | \"skip\"; detail?: string }) => void\n\nconst pmMajor = (v: string | null) => (v ? v.split(\".\")[0]! : \"latest\")\nconst GRACE_MS = 10_000\nconst secs = (ms: number) => `${Math.round(ms / 1000)} s`\n\n/** On abort the tool is stopped (SIGTERM, SIGKILL after the grace) and awaited, then CancelledError. */\nexport async function runTool(deps: Deps, cmd: string, args: string[],\n o: { cwd: string; env: NodeJS.ProcessEnv; onLine: (l: OutLine) => void; signal: AbortSignal }):\n Promise<{ code: number | null; spawnError?: string; tail: string[] }> {\n if (o.signal.aborted) throw new CancelledError()\n const tail: string[] = []\n const c = deps.launch.launch(cmd, args, { cwd: o.cwd, env: { ...o.env, LC_ALL: \"C\" }, onLine: (l) => {\n tail.push(l.line); if (tail.length > 50) tail.shift()\n o.onLine(l)\n } })\n let kill: ReturnType<typeof setTimeout> | undefined\n const onAbort = () => {\n c.stop(\"SIGTERM\")\n kill = setTimeout(() => c.stop(\"SIGKILL\"), GRACE_MS)\n }\n o.signal.addEventListener(\"abort\", onAbort, { once: true })\n let exit\n try {\n exit = await c.exited\n } finally {\n o.signal.removeEventListener(\"abort\", onAbort)\n clearTimeout(kill)\n }\n if (o.signal.aborted) throw new CancelledError()\n return { code: exit.code, spawnError: exit.spawnError, tail }\n}\n\n/** Returns the version the repository's `<pm> --version` printed (null if none recognised). */\nexport async function checkPackageManager(deps: Deps, r: Pick<DevRecipe, \"root\" | \"pm\">, onLine: (l: OutLine) => void,\n signal: AbortSignal): Promise<string | null> {\n const res = await runTool(deps, r.pm.name, [\"--version\"], { cwd: r.root, env: deps.env, onLine, signal })\n const hint = `Install it: npm i -g ${r.pm.name}@${pmMajor(r.pm.version)}`\n if (res.spawnError === \"ENOENT\") {\n throw new QoreError(\"QORE_PACKAGE_MANAGER\", `${r.pm.name} is not installed`, { hint, details: { packageManager: r.pm } })\n }\n if (res.code !== 0) {\n throw new QoreError(\"QORE_PACKAGE_MANAGER\", `${r.pm.name} is not installed`, { hint, details: { packageManager: r.pm, stderr: res.tail } })\n }\n const mismatch = pmVersionMismatch(r.pm, res.tail.join(\"\\n\"))\n if (mismatch) throw mismatch\n return res.tail.map((l) => l.trim()).findLast((l) => /^\\d+\\.\\d+\\.\\d+/.test(l)) ?? null\n}\n\n/** The `node` the child gets from PATH, not necessarily qore's own. Skipped when engines.node is unset. */\nexport async function checkNode(deps: Deps, r: Pick<DevRecipe, \"root\">, pkg: PackageJson, slug: string, signal: AbortSignal):\n Promise<string | null> {\n const range = pkg.engines?.node\n if (!range) return null\n const res = await runTool(deps, \"node\", [\"--version\"], { cwd: r.root, env: deps.env, onLine: () => {}, signal })\n if (res.spawnError === \"ENOENT\") {\n throw new QoreError(\"QORE_NODE_VERSION\", \"node is not on PATH\", {\n hint: \"Install Node (https://nodejs.org) or run nvm use, then reinstall qore.\", details: { required: range } })\n }\n if (res.spawnError || res.code !== 0) {\n throw new QoreError(\"QORE_NODE_VERSION\", \"node --version failed\", { details: { required: range, stderr: res.tail } })\n }\n const found = (res.tail.at(-1) ?? \"\").trim().replace(/^v/, \"\")\n if (nodeSatisfies(found, range) === false) throw nodeVersionError(found, range, slug)\n return found\n}\n\nexport async function installIfNeeded(deps: Deps, r: DevRecipe, slug: string, onLine: (l: OutLine) => void, report: StepReport,\n signal: AbortSignal): Promise<void> {\n if (!r.install) { report({ module: slug, step: \"install\", status: \"skip\", detail: \"disabled\" }); return }\n if (!(await needsInstall(r.root, r.pm))) { report({ module: slug, step: \"install\", status: \"skip\", detail: \"up to date\" }); return }\n report({ module: slug, step: \"install\", status: \"start\" })\n const began = deps.now().getTime()\n const { cmd, args } = installArgs(r.pm)\n const res = await runTool(deps, cmd, args, { cwd: r.root, env: deps.env, onLine, signal })\n if (res.code !== 0) {\n const command = [cmd, ...args].join(\" \")\n const err = classifyInstall(res.tail, command, r.root)\n if (err.details?.reason === \"outdated-lockfile\") throw err\n throw new QoreError(\"QORE_INSTALL_FAILED\", `${command} failed in ${slug}`, { hint: err.hint, details: err.details })\n }\n report({ module: slug, step: \"install\", status: \"done\", detail: secs(deps.now().getTime() - began) })\n}\n\nexport async function portInUseError(deps: Deps, o: { slug: string; port: number; key: \"PORT\" | \"DB_PORT\"; runs?: RunRecord[] }): Promise<QoreError> {\n const owner = await deps.ports.owner(o.port)\n // the listener is a grandchild (pnpm → node), so the recorded port is what identifies a qore dev\n const qoreRun = (o.runs ?? []).find((r) => r.children.some((c) => c.port === o.port)\n || (owner !== null && (r.qorePid === owner.pid || r.children.some((c) => c.pid === owner.pid))))\n if (qoreRun) {\n return new QoreError(\"QORE_PORT_IN_USE\", `A previous qore dev is still running (pid ${qoreRun.qorePid})`, {\n hint: `Stop it (Ctrl+C in its terminal, or kill ${qoreRun.qorePid}), then run qore dev again.`,\n details: { port: o.port, module: o.slug, key: o.key, owner: \"qore\", pid: qoreRun.qorePid },\n })\n }\n if (owner) {\n if (/^(com\\.docker\\.backend|com\\.docker\\.vpnkit|docker-proxy|vpnkit|dockerd)$/.test(owner.command)) {\n const pub = await deps.ports.dockerPublisher(o.port)\n if (pub) {\n return new QoreError(\"QORE_PORT_IN_USE\", `Port ${o.port} is held by the Docker container ${pub.name} (needed by ${o.slug})`, {\n hint: `It belongs to compose project ${pub.project} in ${pub.workingDir} — typically another module's or tenant's database. `\n + `Stop it there with docker compose down, or docker stop ${pub.name}.`,\n details: { port: o.port, module: o.slug, key: o.key, owner: \"docker\", ...pub },\n })\n }\n }\n const detail = await deps.ports.ownerDetail(owner.pid)\n const extras: string[] = []\n if (detail.ageSeconds !== null) extras.push(`started ${humanAge(detail.ageSeconds)} ago`)\n if (detail.cwd !== null) {\n const cwd = deps.home && detail.cwd.startsWith(deps.home) ? `~${detail.cwd.slice(deps.home.length)}` : detail.cwd\n extras.push(`in ${cwd}`)\n }\n const suffix = extras.length ? `, ${extras.join(\" \")}` : \"\"\n return new QoreError(\"QORE_PORT_IN_USE\", `Port ${o.port} is already in use (needed by ${o.slug})`, {\n hint: `Held by: ${owner.command} (pid ${owner.pid})${suffix}. Stop that process. Qore never moves a port: other modules and the local login rely on ${o.port}.`,\n details: { port: o.port, module: o.slug, key: o.key, owner: \"process\", pid: owner.pid, command: owner.command,\n ...(detail.cwd !== null ? { cwd: detail.cwd } : {}), ...(detail.ageSeconds !== null ? { ageSeconds: detail.ageSeconds } : {}) },\n })\n }\n const findHint = deps.platform === \"win32\" ? `netstat -ano | findstr :${o.port}` : `lsof -iTCP:${o.port} -sTCP:LISTEN`\n return new QoreError(\"QORE_PORT_IN_USE\", `Port ${o.port} is already in use (needed by ${o.slug})`, {\n hint: `Find it with: ${findHint}`,\n details: { port: o.port, module: o.slug, key: o.key },\n })\n}\n\nasync function composeFailure(deps: Deps, r: DevRecipe, slug: string, env: NodeJS.ProcessEnv, signal: AbortSignal,\n message: string, command: string | undefined, stderr: string[]): Promise<QoreError> {\n if (!r.dockerServices) {\n return new QoreError(\"QORE_SERVICE_UNHEALTHY\", message, { details: { command, stderr } })\n }\n const logs = await runTool(deps, \"docker\", [\"compose\", \"logs\", \"--no-color\", \"--tail\", \"50\"], { cwd: r.root, env, onLine: () => {}, signal })\n const dataErr = classifyComposeLogs(logs.tail, { slug, script: \"db:up\" })\n if (dataErr) return dataErr\n return new QoreError(\"QORE_SERVICE_UNHEALTHY\", message, {\n hint: `The last lines of docker compose logs are in details.logs; run \\`docker compose logs\\` in ${r.root} for all of them.`,\n details: { command, stderr, logs: logs.tail.slice(-20) },\n })\n}\n\nexport async function startServices(deps: Deps, r: DevRecipe, slug: string, env: NodeJS.ProcessEnv, dbPort: number | null, waitMs: number,\n signal: AbortSignal, onLine: (l: OutLine) => void, report: StepReport): Promise<void> {\n if (r.services.length === 0) { report({ module: slug, step: \"services\", status: \"skip\" }); return }\n report({ module: slug, step: \"services\", status: \"start\", ...(dbPort !== null ? { detail: `:${dbPort}` } : {}) })\n const began = deps.now().getTime()\n if (r.dockerServices) {\n const res = await runTool(deps, \"docker\", [\"info\", \"--format\", \"{{.ServerVersion}}\"], { cwd: r.root, env, onLine, signal })\n const dockerErr = classifyDockerInfo(res, deps.platform)\n if (dockerErr) throw dockerErr\n const compose = await runTool(deps, \"docker\", [\"compose\", \"version\"], { cwd: r.root, env, onLine: () => {}, signal })\n const composeErr = classifyComposeVersion(compose)\n if (composeErr) throw composeErr\n }\n for (const script of r.services) {\n const { cmd, args } = runArgs(r.pm, script)\n const res = await runTool(deps, cmd, args, { cwd: r.root, env, onLine, signal })\n if (res.code !== 0) {\n if (dbPort !== null && /port is already allocated|address already in use/i.test(res.tail.join(\"\\n\"))) {\n throw await portInUseError(deps, { slug, port: dbPort, key: \"DB_PORT\" })\n }\n throw await composeFailure(deps, r, slug, env, signal, `${script} failed in ${slug}`, `${cmd} ${args.join(\" \")}`, res.tail)\n }\n }\n if (dbPort !== null) {\n const ok = await deps.ports.waitFor(dbPort, waitMs, signal)\n if (signal.aborted) throw new CancelledError()\n if (!ok) {\n throw await composeFailure(deps, r, slug, env, signal,\n `The database for ${slug} did not accept connections on port ${dbPort} within ${waitMs / 1000} s`, undefined, [])\n }\n }\n const took = secs(deps.now().getTime() - began)\n report({ module: slug, step: \"services\", status: \"done\", detail: dbPort !== null ? `:${dbPort} (${took})` : `(${took})` })\n}\n\nexport async function checkPort(deps: Deps, o: { slug: string; port: number | null; key: \"PORT\"; runs: RunRecord[] }): Promise<void> {\n if (o.port === null) return\n if (!(await deps.ports.inUse(o.port))) return\n throw await portInUseError(deps, { slug: o.slug, port: o.port, key: o.key, runs: o.runs })\n}\n\nfunction abortableDelay(signal: AbortSignal): (ms: number) => Promise<void> {\n return (ms) => new Promise((resolve) => {\n const done = () => { clearTimeout(t); signal.removeEventListener(\"abort\", done); resolve() }\n const t = setTimeout(done, ms)\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\n/** Polls `docker info` until it succeeds (true) or the wall-clock `timeoutMs` has passed (false).\n * A `docker info` that hangs (Docker Desktop starting) is stopped at the deadline. */\nexport async function waitForDocker(deps: Deps, o: { cwd: string; env?: NodeJS.ProcessEnv; signal: AbortSignal; timeoutMs: number; pollMs: number;\n delay?: (ms: number) => Promise<void>; now?: () => number }): Promise<boolean> {\n const delay = o.delay ?? abortableDelay(o.signal)\n const now = o.now ?? Date.now\n const deadline = now() + o.timeoutMs\n for (;;) {\n await delay(Math.min(o.pollMs, Math.max(0, deadline - now())))\n if (o.signal.aborted) throw new CancelledError()\n const remaining = deadline - now()\n if (remaining <= 0) return false\n const poll = AbortSignal.any([o.signal, AbortSignal.timeout(remaining)])\n let res\n try {\n res = await runTool(deps, \"docker\", [\"info\", \"--format\", \"{{.ServerVersion}}\"], { cwd: o.cwd, env: o.env ?? deps.env, onLine: () => {}, signal: poll })\n } catch (e) {\n if (e instanceof CancelledError && !o.signal.aborted) return false\n throw e\n }\n if (classifyDockerInfo(res, deps.platform) === null) return true\n }\n}\n\nconst MAX_PARENT_HOPS = 10\nconst AGE_SLACK_S = 5\n\n/** Whether `port` is held by `run`'s own process tree, so stopping `run.qorePid` frees it.\n * Pids get reused, so the recorded qore must be ours to signal and at least as old as its\n * run record (a reused pid started after the old qore died, so it is younger). Never on win32. */\nexport async function leftoverOwnsPort(deps: Deps, run: RunRecord, port: number): Promise<boolean> {\n if (deps.platform === \"win32\" || !deps.launch.signal(run.qorePid, 0)) return false\n const { ageSeconds } = await deps.ports.ownerDetail(run.qorePid)\n const recordAge = (deps.now().getTime() - Date.parse(run.startedAt)) / 1000\n if (ageSeconds === null || !Number.isFinite(recordAge) || ageSeconds < recordAge - AGE_SLACK_S) return false\n const ours = new Set([run.qorePid, ...run.children.map((c) => c.pid).filter((p): p is number => p !== null)])\n let pid: number | null = (await deps.ports.owner(port))?.pid ?? null\n for (let hop = 0; pid !== null && pid > 1 && hop <= MAX_PARENT_HOPS; hop++) {\n if (ours.has(pid)) return true\n pid = await deps.ports.parentPid(pid)\n }\n return false\n}\n","import { envPort } from \"./env.js\"\nimport { installArgs, runArgs, type DevRecipe, type PackageJson } from \"./project.js\"\n\nexport type ConnPort = { key: string; alias: string; port: number }\nexport type PortRole = { kind: \"database\" } | { kind: \"provider\"; key: string }\n/** What an exit hint may know about a module: its commands and which port is what. Key names and ports only. */\nexport type HintContext = { installCommand: string; runCommand: (script: string) => string | null; ports: Map<number, PortRole> }\n\n/** Only a port on this machine can be checked for a listener. `URL` lowercases the host and keeps IPv6 brackets. */\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"])\n\n/** CONN_<ALIAS>_URL keys whose value is a URL on a local host with an explicit port. Names and ports only, never values. */\nexport function connPorts(env: Record<string, string>): ConnPort[] {\n const out: ConnPort[] = []\n for (const key of Object.keys(env).sort()) {\n const m = /^CONN_(.+)_URL$/.exec(key)\n if (!m) continue\n let url: URL\n try { url = new URL(env[key]!.trim().replace(/^[\"']|[\"']$/g, \"\")) } catch { continue }\n const port = Number(url.port)\n if (port > 0 && LOCAL_HOSTS.has(url.hostname)) out.push({ key, alias: m[1]!, port })\n }\n return out\n}\n\n/** CONN_<ALIAS>_URL keys whose URL port no module listens on. */\nexport function deadAliases(env: Record<string, string>, listening: Set<number>): string[] {\n return connPorts(env).filter((c) => !listening.has(c.port)).map((c) => c.key)\n}\n\nexport function hintContext(recipe: Pick<DevRecipe, \"pm\">, pkg: PackageJson, env: Record<string, string>): HintContext {\n const { cmd, args } = installArgs(recipe.pm)\n const ports = new Map<number, PortRole>()\n for (const c of connPorts(env)) ports.set(c.port, { kind: \"provider\", key: c.key })\n const db = envPort(env, \"DB_PORT\")\n if (db !== null) ports.set(db, { kind: \"database\" })\n return {\n installCommand: [cmd, ...args].join(\" \"),\n runCommand: (script) => {\n if (pkg.scripts?.[script] === undefined) return null\n const r = runArgs(recipe.pm, script)\n return [r.cmd, ...r.args].join(\" \")\n },\n ports,\n }\n}\n","import { unlink } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { Deps } from \"../deps.js\"\nimport { readJson, writeJsonAtomic } from \"../jsonFile.js\"\nimport { stateKey } from \"./lastStart.js\"\n\nexport type RunRecord = {\n schemaVersion: 1\n qorePid: number\n root: string\n startedAt: string\n children: { module: string; pid: number | null; port: number | null }[]\n}\n\nasync function runFilePath(deps: Deps, root: string): Promise<{ dir: string; name: string; path: string }> {\n const dir = join(deps.config.dir, \"run\")\n const name = `${await stateKey(deps, root)}.json`\n return { dir, name, path: join(dir, name) }\n}\n\nexport async function writeRunFile(deps: Deps, root: string, rec: RunRecord): Promise<void> {\n const { dir, name } = await runFilePath(deps, root)\n await writeJsonAtomic(dir, name, rec)\n}\n\nexport async function removeRunFile(deps: Deps, root: string): Promise<void> {\n const { path } = await runFilePath(deps, root)\n await unlink(path).catch(() => {})\n}\n\n/** A run file whose qore pid is alive; a dead one is deleted (unless `prune: false`) and null returned. */\nexport async function leftoverRun(deps: Deps, root: string, o: { prune?: boolean } = {}): Promise<RunRecord | null> {\n const { path } = await runFilePath(deps, root)\n const rec = await readJson<RunRecord>(path).catch(() => null)\n if (!rec || rec.schemaVersion !== 1) return null\n if (deps.launch.isAlive(rec.qorePid)) return rec\n if (o.prune !== false) await unlink(path).catch(() => {})\n return null\n}\n","import type { CliRef } from \"../core/api/types.js\"\nimport { QoreError, type Candidate } from \"../core/errors.js\"\nimport { pickApp, resolveModuleContext, type ModuleContext } from \"../core/context/resolver.js\"\nimport { WORKSPACE_FILE } from \"../core/workspace/file.js\"\nimport type { CommandContext } from \"./program.js\"\n\nconst allOfKind = (c: Candidate[] | undefined, kind: Candidate[\"kind\"]): c is (Candidate & { id: string })[] =>\n !!c && c.length > 0 && c.every((x) => x.kind === kind && typeof x.id === \"string\")\n\nexport async function moduleContextFor(ctx: CommandContext, flags: { module?: string }, command: string): Promise<ModuleContext> {\n const g = ctx.opts()\n const onRequest = g.verbose ? (l: string) => ctx.io.err(l) : undefined\n const base = { portal: g.portal, module: flags.module, command, onRequest }\n try {\n return await resolveModuleContext(ctx.deps, base)\n } catch (e) {\n if (!(e instanceof QoreError) || e.code !== \"QORE_CONTEXT_REQUIRED\" || !ctx.io.interactive) throw e\n // core/ never prompts (R5): it names the candidates, and only here do they become a picker.\n if (allOfKind(e.candidates, \"module\")) {\n const choose = await ctx.io.select(\"Select a module\",\n e.candidates.map((c) => ({ name: `${c.tenant ? `${c.tenant} / ` : \"\"}${c.slug} (${c.remote})`, value: c.id })))\n return resolveModuleContext(ctx.deps, { ...base, choose })\n }\n if (allOfKind(e.candidates, \"tenant\")) {\n const tenant = await ctx.io.select(\"Select a tenant\", e.candidates.map((c) => ({ name: c.name ?? c.slug, value: c.id })))\n return resolveModuleContext(ctx.deps, { ...base, tenant })\n }\n throw e\n }\n}\n\nexport async function appFor(ctx: CommandContext, mc: ModuleContext, app?: string): Promise<CliRef> {\n try {\n return pickApp(mc, app)\n } catch (e) {\n if (!(e instanceof QoreError) || e.code !== \"QORE_APP_AMBIGUOUS\" || !ctx.io.interactive) throw e\n const id = await ctx.io.select(\"Select an app\", mc.module.apps.map((a) => ({ name: a.name, value: a.id })))\n return pickApp(mc, id)\n }\n}\n\nfunction sourceText(mc: ModuleContext): string {\n if (mc.source.kind === \"remote\") return mc.source.remote\n if (mc.source.kind === \"workspace\") return WORKSPACE_FILE\n return mc.source.overrides ? `--module, overrides ${mc.source.overrides}` : \"--module\"\n}\n\nexport function contextLine(mc: ModuleContext, app?: CliRef): string {\n const parts = [mc.module.tenant.name, ...(app ? [app.name] : []), mc.module.slug]\n return `→ ${parts.join(\" / \")} (${sourceText(mc)})`\n}\n\nexport function contextJson(mc: ModuleContext, app?: CliRef) {\n const { id, slug, name, type, access } = mc.module\n return {\n portal: mc.portal.builtin ?? mc.portal.apiOrigin,\n tenant: mc.module.tenant,\n app: app ?? null,\n module: { id, slug, name, type, access },\n source: mc.source.kind === \"remote\" ? mc.source.remote : mc.source.kind === \"workspace\" ? WORKSPACE_FILE : \"--module\",\n ...(mc.source.kind === \"flag\" && mc.source.overrides ? { overrides: mc.source.overrides } : {}),\n }\n}\n","import type { Finding } from \"../core/dev/findings.js\"\nimport type { CommandContext } from \"./program.js\"\n\n/** Prompts happen only in a TTY, never with --json or --no-input. */\nexport function canOffer(ctx: CommandContext): boolean {\n const g = ctx.opts()\n return ctx.io.interactive && !g.json && g.input !== false\n}\n\n/** The NDJSON shape: the existing `warning` event, extended with optional fields; `info` is new. */\nexport function findingEvent(f: Finding): Record<string, unknown> {\n const { severity, ...rest } = f\n return { type: severity === \"info\" ? \"info\" : \"warning\", ...rest }\n}\n\nexport function renderFinding(ctx: CommandContext, f: Finding): void {\n if (ctx.opts().json) { ctx.io.out(JSON.stringify(findingEvent(f))); return }\n ctx.io.err(`${f.severity === \"info\" ? \"→\" : \"!\"} ${f.message}`)\n if (f.why) ctx.io.err(` ${f.why}`)\n if (f.action) ctx.io.err(` Fix: ${f.action.command}`)\n}\n\n/** Asks `question` when a prompt is possible; otherwise false without asking. Ctrl+C is a cancel. */\nexport async function offerFix(ctx: CommandContext, question: string, o: { default: boolean; signal?: AbortSignal }): Promise<boolean> {\n if (!canOffer(ctx)) return false\n return ctx.io.confirm(question, o.signal, { default: o.default })\n}\n","import { checkPort, leftoverOwnsPort, waitForDocker } from \"../core/dev/preflight.js\"\nimport type { RunRecord } from \"../core/dev/runFile.js\"\nimport { CancelledError, QoreError } from \"../core/errors.js\"\nimport { canOffer, offerFix } from \"./findings.js\"\nimport type { CommandContext } from \"./program.js\"\n\n/** Mutable so tests can shorten the wait. */\nexport const DOCKER_WAIT = { timeoutMs: 120_000, pollMs: 2_000 }\nconst STOP_WAIT_MS = 10_000\n\n/** Recovery prompts go through offerFix: a TTY only, never with --json or --no-input. */\n\nconst daemonDown = (e: unknown): e is QoreError =>\n e instanceof QoreError && e.code === \"QORE_DOCKER_NOT_RUNNING\" && e.details?.reason === \"daemon\"\n\n/** Wraps `startServices`: on an unreachable Docker daemon, waits for it and retries once.\n * The first wait decides for every later call of the same wrapper. */\nexport function dockerRecovery(ctx: CommandContext, signal: AbortSignal) {\n let answer: Promise<boolean> | undefined\n return async (at: { cwd: string; env: NodeJS.ProcessEnv }, fn: () => Promise<void>): Promise<void> => {\n try {\n await fn()\n } catch (e) {\n if (!daemonDown(e) || !canOffer(ctx)) throw e\n answer ??= (async () => {\n if (!(await offerFix(ctx, \"Docker is not running. Wait for it to start?\", { default: true, signal }))) return false\n ctx.io.err(\"Waiting for Docker… (Ctrl+C to stop)\")\n const ok = await waitForDocker(ctx.deps, { ...at, signal, ...DOCKER_WAIT })\n if (ok) ctx.io.err(\"✓ Docker is running\")\n return ok\n })()\n if (!(await answer)) throw e\n await fn()\n }\n }\n}\n\nasync function stopLeftover(ctx: CommandContext, e: QoreError, runs: RunRecord[], signal: AbortSignal): Promise<boolean> {\n const { deps, io } = ctx\n const port = e.details?.port\n const run = runs.find((r) => r.qorePid === e.details?.pid)\n if (!run || typeof port !== \"number\" || !(await leftoverOwnsPort(deps, run, port))) return false\n if (!(await offerFix(ctx, `Stop the previous qore dev (pid ${run.qorePid})?`, { default: false, signal }))) return false\n // the old qore forwards SIGTERM to its dev server(s) and exits cleanly\n if (!deps.launch.signal(run.qorePid, \"SIGTERM\")) {\n io.err(`! pid ${run.qorePid} could not be signalled`)\n return false\n }\n if (await deps.ports.waitFree(port, STOP_WAIT_MS, signal)) return true\n if (!signal.aborted) io.err(`! pid ${run.qorePid} did not exit within ${STOP_WAIT_MS / 1000} s`)\n return false\n}\n\n/** `checkPort`, but a port held by a leftover `qore dev` can be freed by stopping it (on a yes). */\nexport async function checkPortOrStopLeftover(ctx: CommandContext, o: Parameters<typeof checkPort>[1], signal: AbortSignal): Promise<void> {\n try {\n await checkPort(ctx.deps, o)\n } catch (e) {\n if (!(e instanceof QoreError) || e.code !== \"QORE_PORT_IN_USE\" || e.details?.owner !== \"qore\" || !canOffer(ctx)) throw e\n const freed = await stopLeftover(ctx, e, o.runs, signal)\n if (signal.aborted) throw new CancelledError()\n if (!freed) throw e\n await checkPort(ctx.deps, o)\n }\n}\n","import type { StepReport } from \"../core/dev/preflight.js\"\nimport type { CommandContext } from \"./program.js\"\n\ntype Step = Parameters<StepReport>[0]\n\nfunction text(e: Step, o: { installFlag: boolean; servicesFlag: boolean }): string | null {\n switch (`${e.step}:${e.status}`) {\n case \"pm:done\": return `✓ ${e.detail}`\n case \"install:skip\": return e.detail === \"up to date\" ? \"✓ dependencies up to date\"\n : `- install skipped (${o.installFlag ? \"dev.install is false in .qore.json\" : \"--no-install\"})`\n case \"install:start\": return \"⋯ installing dependencies…\"\n case \"install:done\": return `✓ dependencies installed (${e.detail})`\n case \"env:done\": return `✓ env ${e.detail}`\n case \"services:skip\": return o.servicesFlag ? null : \"- services skipped (--no-services)\"\n case \"services:start\": return e.detail ? `⋯ database waiting for ${e.detail}…` : \"⋯ starting services…\"\n case \"services:done\": return e.detail?.startsWith(\":\") ? `✓ database ready on ${e.detail}` : `✓ services up ${e.detail}`\n case \"ports:done\": return `✓ port ${e.detail} free`\n default: return null\n }\n}\n\n/** The preflight's steps: one human line on stderr (prefixed in a workspace), or a `step` event with --json. */\nexport function progressReporter(ctx: CommandContext, o: { prefix?: (slug: string, line: string) => string; installFlag: boolean; servicesFlag: boolean }): StepReport {\n return (e) => {\n if (ctx.opts().json) { ctx.io.out(JSON.stringify({ type: \"step\", ...e })); return }\n const line = text(e, o)\n if (line !== null) ctx.io.err(o.prefix ? o.prefix(e.module, line) : line)\n }\n}\n","import type { ProcessSignals } from \"../platform/spawn.js\"\n\n/** Set by cli.ts: remembers the signal so qore still dies of it after the cancel. */\nexport const preflightHook: { onSignal?: (sig: NodeJS.Signals) => void } = {}\n\nexport type Preflight = { signal: AbortSignal; arm: () => void }\n\n/** cli.ts: a signal that cancelled a preflight aborts the run; `reRaise` (after run() returned,\n * no lock held, no prompt open) flushes the output, then kills qore with it through `raise`. */\nexport function preflightTermination(abort: () => void, raise: (sig: NodeJS.Signals) => void):\n { reRaise: (flush: () => Promise<void>) => Promise<void> } {\n let by: NodeJS.Signals | undefined\n preflightHook.onSignal = (sig) => { by ??= sig; abort() }\n return { reRaise: async (flush) => { if (!by) return; await flush(); raise(by) } }\n}\n\n/** A dev preflight runs its tools detached, so once armed (after any prompt) SIGTERM/SIGHUP\n * cancel them like Ctrl+C. The listeners exist only while armed, so everywhere else\n * qore keeps its normal signal disposition (signal-exit cleanup included). */\nexport async function inPreflight<T>(signals: ProcessSignals, outer: AbortSignal, fn: (p: Preflight) => Promise<T>): Promise<T> {\n const ac = new AbortController()\n const onOuter = () => ac.abort()\n outer.addEventListener(\"abort\", onOuter)\n if (outer.aborted) ac.abort()\n const handlers = ([\"SIGTERM\", \"SIGHUP\"] as const).map((sig) => [sig, () => { preflightHook.onSignal?.(sig); ac.abort() }] as const)\n let armed = false\n const arm = () => {\n if (armed) return\n armed = true\n for (const [sig, h] of handlers) signals.on(sig, h)\n }\n try {\n return await fn({ signal: ac.signal, arm })\n } finally {\n if (armed) for (const [sig, h] of handlers) signals.off(sig, h)\n outer.removeEventListener(\"abort\", onOuter)\n }\n}\n","import type { CliRef } from \"../core/api/types.js\"\nimport { repoKey } from \"../core/context/repoKey.js\"\nimport type { ModuleContext } from \"../core/context/resolver.js\"\nimport { CancelledError, QoreError } from \"../core/errors.js\"\nimport { isTrusted, trust } from \"../core/trust.js\"\nimport { contextLine } from \"./context.js\"\nimport type { CommandContext } from \"./program.js\"\n\n/** Task 10: the trust interlock (spec §5.4) as a first-use prompt. Trust is a safety\n * interlock, not authorization — the server still authorizes every fetch.\n *\n * Ruling C8: the context line prints exactly once, here — before the trust prompt, and\n * also before the untrusted non-TTY error — so the caller (env.ts) must not print it\n * again after calling this. */\nexport async function ensureTrusted(ctx: CommandContext, mc: ModuleContext, app: CliRef, o: { yes?: boolean }): Promise<void> {\n const root = mc.repoRoot ?? ctx.deps.cwd\n if (!ctx.opts().json) ctx.io.err(contextLine(mc, app))\n if (await isTrusted(ctx.deps, root, mc.module.id)) return\n if (o.yes) { await trust(ctx.deps, root, mc.module.id); return }\n if (!ctx.io.interactive) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", `This repository is not trusted for ${mc.module.slug} yet`, {\n hint: \"Run interactively once, or pass --yes.\", details: { reason: \"untrusted\", repository: root },\n })\n }\n if (mc.source.kind === \"remote\") {\n // I1: never print the raw remote URL — it may embed credentials (e.g. an\n // https x-access-token PAT). Print the normalised repo key instead.\n const key = repoKey(mc.source.url)\n ctx.io.err(` from remote ${mc.source.remote}: ${key ?? \"(unparsable remote URL)\"}`)\n }\n if (!(await ctx.io.confirm(\"Pull local secrets for this module into this repository?\"))) throw new CancelledError()\n await trust(ctx.deps, root, mc.module.id)\n}\n","import { randomBytes } from \"node:crypto\"\nimport { realpath } from \"node:fs/promises\"\nimport { join, relative } from \"node:path\"\nimport { ensureCapability } from \"../../core/api/capabilities.js\"\nimport type { CliAppModule, CliAppModules, CliRef } from \"../../core/api/types.js\"\nimport { moduleDefaults, readRepoConfig, type RepoConfig } from \"../../core/context/repoConfig.js\"\nimport { flagPortal, withDetails, workspaceAppModules, type ModuleContext } from \"../../core/context/resolver.js\"\nimport { devEnv, type DevEnv } from \"../../core/dev/env.js\"\nimport { modulesMissing, repoBehind, servicesMissing, strayClone } from \"../../core/dev/findings.js\"\nimport { isOffline, loadLastStart, saveLastStart, type LastStart } from \"../../core/dev/lastStart.js\"\nimport { planDev } from \"../../core/dev/order.js\"\nimport { deadAliases, hintContext } from \"../../core/dev/providers.js\"\nimport { checkNode, checkPackageManager, installIfNeeded, startServices } from \"../../core/dev/preflight.js\"\nimport { detectPackageManager, planRecipe, readPackageJson, runArgs, type DevRecipe, type PackageJson } from \"../../core/dev/project.js\"\nimport { leftoverRun, removeRunFile, writeRunFile, type RunRecord } from \"../../core/dev/runFile.js\"\nimport { supervise, type Supervisor, type SupervisorEvent } from \"../../core/dev/supervisor.js\"\nimport { humanAge } from \"../../core/diagnostics/ports.js\"\nimport { CancelledError, QoreError } from \"../../core/errors.js\"\nimport { openSession, type Session } from \"../../core/session.js\"\nimport { isTrusted, trust } from \"../../core/trust.js\"\nimport { askMaintainer } from \"../../core/workspace/access.js\"\nimport { applyActions } from \"../../core/workspace/apply.js\"\nimport type { Workspace } from \"../../core/workspace/file.js\"\nimport { cloneProtocol, planWorkspace } from \"../../core/workspace/plan.js\"\nimport { isSafeSlug } from \"../../core/workspace/safety.js\"\nimport { strayRepos } from \"../../core/workspace/stray.js\"\nimport type { DirInfo } from \"../../platform/git.js\"\nimport type { OutLine } from \"../../platform/launch.js\"\nimport { combineProblems, prefixer, renderProblems } from \"../devOutput.js\"\nimport { checkPortOrStopLeftover, dockerRecovery } from \"../devRecover.js\"\nimport { offerFix, renderFinding } from \"../findings.js\"\nimport { requestLog, withProxyHint, type CommandContext } from \"../program.js\"\nimport { progressReporter } from \"../progress.js\"\nimport { inPreflight, type Preflight } from \"../termination.js\"\nimport { renderResults } from \"../workspaceReport.js\"\nimport type { DevFlags } from \"./dev.js\"\nimport { childRunning } from \"./run.js\"\n\nconst INSTALL_PARALLELISM = 4\n\ntype Online = { portal: Awaited<ReturnType<typeof flagPortal>>; session: Session }\ntype WsContext = { am: CliAppModules; online: Online | null; offlineCause: QoreError | null }\ntype LastWorkspace = Extract<LastStart, { kind: \"workspace\" }>\ntype Unit = { m: CliAppModule; dir: string; cfg?: RepoConfig; pkg?: PackageJson; recipe?: DevRecipe; trusted?: boolean; pmOk?: boolean;\n installed?: boolean; dev?: DevEnv; pmVersion?: string | null; node?: string | null }\n\nconst str = (v: unknown): v is string => typeof v === \"string\" && v.length > 0\nconst slugList = (raw?: string) => raw?.split(\",\").map((s) => s.trim()).filter(Boolean)\n\n/** `loadLastStart` checks only `schemaVersion`. */\nfunction usableLast(last: LastStart | null, appId: string): last is LastWorkspace {\n if (!last || last.kind !== \"workspace\") return false\n const a = last.app as Partial<LastWorkspace[\"app\"]> | undefined\n return str(last.savedAt) && !!a && a.id === appId && str(a.slug) && str(a.name) && !!a.tenant && str(a.tenant.name)\n && Array.isArray(last.modules) && last.modules.every((m) => !!m && str(m.id) && str(m.slug) && str(m.type) && str(m.access)\n && Array.isArray(m.dependsOn))\n}\n\nasync function workspaceContext(ctx: CommandContext, ws: Workspace): Promise<WsContext> {\n const { deps } = ctx\n try {\n const portal = await flagPortal(deps, ctx.opts().portal, ws)\n const session = await openSession(deps, portal, \"dev\", requestLog(ctx))\n await ensureCapability(deps, portal.apiOrigin, \"app.modules\")\n await ensureCapability(deps, portal.apiOrigin, \"module.local-env\")\n return { am: await workspaceAppModules(session, portal, ws), online: { portal, session }, offlineCause: null }\n } catch (e) {\n if (!isOffline(e)) throw e\n const last = await loadLastStart(deps, ws.root)\n if (!usableLast(last, ws.appId)) throw e\n const modules = last.modules.map((m) => ({ id: m.id, slug: m.slug, name: m.name, type: m.type, access: m.access,\n repoUrl: m.repoUrl, repoAccess: \"none\" as const, githubLinked: false, dependsOn: m.dependsOn }))\n if (!ctx.opts().json) ctx.io.err(`→ ${last.app.tenant.name} / ${last.app.name} (offline — last started ${last.savedAt})`)\n return { am: { app: last.app, accountUrl: \"\", devTeams: [], modules }, online: null, offlineCause: e }\n }\n}\n\n/** Waits for every worker, so a cancel leaves no install running. */\nasync function pool<T>(items: T[], n: number, fn: (t: T) => Promise<void>): Promise<void> {\n let next = 0\n const results = await Promise.allSettled(Array.from({ length: Math.min(n, items.length) }, async () => {\n while (next < items.length) await fn(items[next++]!)\n }))\n const failed = results.find((r) => r.status === \"rejected\")\n if (failed) throw failed.reason\n}\n\nexport async function workspaceDev(ctx: CommandContext, ws: Workspace, f: DevFlags, waitTimeout: number): Promise<void> {\n const ready = await inPreflight(ctx.deps.signals, ctx.signal, (p) => prepareWorkspace(ctx, ws, f, waitTimeout, p))\n await superviseAll(ctx, ws, ready.units, ready.waitFor, ready.o, ready.notRunning)\n}\n\nasync function prepareWorkspace(ctx: CommandContext, ws: Workspace, f: DevFlags, waitTimeout: number, p: Preflight) {\n const { deps, io } = ctx\n const g = ctx.opts()\n const json = Boolean(g.json)\n if (f.app !== undefined) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", \"--app is for a module repository\", {\n hint: \"Drop --app; a workspace root starts the modules of its own app.\",\n })\n }\n const note = (human: string, event: Record<string, unknown>) => (json ? io.out(JSON.stringify(event)) : io.err(human))\n const warn = (message: string, extra: Record<string, unknown> = {}) => note(`! ${message}`, { type: \"warning\", ...extra, message })\n\n const { am, online, offlineCause } = await workspaceContext(ctx, ws)\n if (online && !json) io.err(`→ ${am.app.tenant.name} / ${am.app.name} (qore.workspace.json)`)\n if (!online) warn(\"The portal is unreachable — starting every module from its env file as last written; values may be stale.\")\n\n const color = !json && g.color !== false && !deps.env.NO_COLOR\n const problems: QoreError[] = []\n /** True when `fn` succeeded; a QoreError is collected for `slug`. */\n const attempt = async (slug: string, fn: () => Promise<unknown>): Promise<boolean> => {\n try { await fn(); return true } catch (e) {\n if (!(e instanceof QoreError)) throw e\n problems.push(withDetails(e, { module: slug }))\n return false\n }\n }\n const fail = async (last?: QoreError): Promise<never> => {\n const all = last ? [...problems, last] : problems\n const enriched = (await Promise.all(all.map((p) => withProxyHint(deps, p)))) as QoreError[]\n if (!json && enriched.length > 1) {\n renderProblems(io, enriched, color)\n io.err(\"\")\n }\n throw combineProblems(enriched)\n }\n\n const dirs: Record<string, DirInfo> = {}\n const safe: CliAppModule[] = []\n for (const m of am.modules) {\n if (!isSafeSlug(m.slug)) { warn(`${JSON.stringify(m.slug)} is not a safe directory name — skipped`, { module: m.slug }); continue }\n try {\n dirs[m.slug] = await deps.git.inspect(join(ws.root, m.slug))\n safe.push(m)\n } catch (e) {\n if (!(e instanceof QoreError) || e.code === \"QORE_GIT_UNAVAILABLE\") throw e\n problems.push(withDetails(e, { module: m.slug }))\n }\n }\n const bySlug = new Map(safe.map((m) => [m.slug, m]))\n const computePlan = () => {\n const present = new Map(planWorkspace(ws.root, safe, dirs, []).actions.filter((a) => a.kind === \"present\").map((a) => [a.module.slug, a.dir]))\n const plan = planDev(safe.map((m) => ({ id: m.id, slug: m.slug, present: present.has(m.slug),\n canWrite: m.access === \"write\" || m.access === \"maintain\", dependsOn: m.dependsOn })), { only: slugList(f.only), skip: slugList(f.skip) })\n return { present, plan }\n }\n let { present, plan } = computePlan()\n\n const missingFindings = () => {\n const missing = plan.skipped.filter((s) => s.reason === \"not-cloned\").map((s) => bySlug.get(s.slug)!)\n const consumers: Record<string, string[]> = {}\n for (const [consumer, providers] of Object.entries(plan.missingProviders)) {\n for (const p of providers) (consumers[p] ??= []).push(consumer)\n }\n // what sync would do for each: only a planned clone is offered\n const actions = planWorkspace(ws.root, missing, dirs, []).actions\n return modulesMissing({ missing, actions, cwd: deps.cwd, consumers, am: online ? am : null })\n }\n const missing = missingFindings()\n for (const finding of missing.findings) renderFinding(ctx, finding)\n const canSync = online !== null && missing.findings.some((x) => x.action?.fix === \"sync\")\n if (canSync && (await offerFix(ctx, `Clone ${missing.fixable.map((m) => m.slug).join(\", \")} now with qore sync?`, { default: true, signal: ctx.signal }))) {\n const actions = planWorkspace(ws.root, missing.fixable, dirs, []).actions\n const results = await applyActions(deps, { portal: online!.portal, app: am, actions, protocol: cloneProtocol(dirs), onResult: () => {} })\n renderResults(io, results, false)\n for (const r of results) if (r.status === \"cloned\") dirs[r.slug] = await deps.git.inspect(join(ws.root, r.slug))\n ;({ present, plan } = computePlan())\n }\n for (const name of await strayRepos(ws.root, new Set(am.modules.map((m) => m.slug)))) renderFinding(ctx, strayClone(name, am.app.name))\n if (ctx.signal.aborted) throw new CancelledError()\n\n for (const s of plan.skipped) {\n const m = bySlug.get(s.slug)!\n if (s.reason === \"no-write\") {\n const ask = askMaintainer(am, m)\n note(`- ${s.slug} no write access — local secrets need write; ${ask.text}`,\n { type: \"skip\", module: s.slug, reason: s.reason, devTeams: ask.teams, maintainers: ask.maintainers })\n } else if (s.reason === \"not-cloned\") {\n if (json) io.out(JSON.stringify({ type: \"skip\", module: s.slug, reason: s.reason }))\n } else {\n note(`- ${s.slug} excluded`, { type: \"skip\", module: s.slug, reason: s.reason })\n }\n }\n for (const c of plan.cycles) warn(`${c.join(\", \")} depend on each other — they start together, without waiting`, { modules: c })\n if (plan.start.length === 0) {\n await fail(new QoreError(\"QORE_CONTEXT_REQUIRED\", \"No module of this workspace can be started\", {\n hint: \"Clone the modules with qore sync, or change --only / --skip.\", details: { skipped: plan.skipped },\n }))\n }\n const units: Unit[] = plan.start.map((slug) => ({ m: bySlug.get(slug)!, dir: present.get(slug)! }))\n\n if (online) {\n const untrusted: Unit[] = []\n for (const u of units) if (!(await isTrusted(deps, u.dir, u.m.id))) untrusted.push(u)\n if (untrusted.length > 0) {\n const names = untrusted.map((u) => u.m.slug).join(\", \")\n if (!f.yes) {\n if (!io.interactive) {\n await fail(new QoreError(\"QORE_CONTEXT_REQUIRED\", `These repositories are not trusted yet: ${names}`, {\n hint: \"Run interactively once, or pass --yes.\", details: { reason: \"untrusted\", modules: untrusted.map((u) => u.m.slug) },\n }))\n }\n if (!(await io.confirm(`Pull local secrets for ${names} into their repositories?`))) throw new CancelledError()\n }\n for (const u of untrusted) await trust(deps, u.dir, u.m.id)\n }\n }\n p.arm()\n\n // Preflight: every check for every module before anything starts; problems are collected.\n const prefix = prefixer(plan.start, color)\n const onLine = (slug: string) => (l: OutLine) => {\n if (json) io.out(JSON.stringify({ type: \"line\", module: slug, stream: l.stream, line: l.line }))\n else if (l.stream === \"stdout\") io.out(prefix(slug, l.line))\n else io.err(prefix(slug, l.line))\n }\n const report = progressReporter(ctx, { prefix: json ? undefined : prefix, installFlag: f.install, servicesFlag: f.services })\n\n for (const u of units) {\n await attempt(u.m.slug, async () => {\n u.cfg = await readRepoConfig(u.dir)\n u.pkg = await readPackageJson(u.dir)\n u.recipe = planRecipe({ root: u.dir, pkg: u.pkg, pm: await detectPackageManager(u.dir, u.pkg), cfg: u.cfg, slug: u.m.slug,\n flags: { install: f.install, services: f.services } })\n })\n }\n // Each step runs when its own prerequisites hold, so one failure hides no other problem.\n for (const u of units) {\n u.trusted = !offlineCause || (await isTrusted(deps, u.dir, u.m.id))\n if (!u.trusted) problems.push(withDetails(offlineCause!, { module: u.m.slug }))\n }\n // `<pm> --version` can run repository code (yarnPath, pnpm-managed versions): trusted only\n const withRecipe = units.filter((u) => u.recipe && u.trusted)\n for (const name of [...new Set(withRecipe.map((u) => u.recipe!.pm.name))]) {\n const users = withRecipe.filter((u) => u.recipe!.pm.name === name)\n let version: string | null = null\n const pmOk = await attempt(users[0]!.m.slug, async () => { version = await checkPackageManager(deps, users[0]!.recipe!, () => {}, p.signal) })\n for (const u of users) { u.pmOk = pmOk; u.pmVersion = version }\n }\n for (const u of withRecipe) {\n const nodeOk = await attempt(u.m.slug, async () => { u.node = await checkNode(deps, u.recipe!, u.pkg!, u.m.slug, p.signal) })\n u.pmOk = u.pmOk && nodeOk\n if (u.pmOk) report({ module: u.m.slug, step: \"pm\", status: \"done\",\n detail: `${u.recipe!.pm.name}${u.pmVersion ? ` ${u.pmVersion}` : \"\"}${u.node ? ` · node ${u.node}` : \"\"}` })\n }\n await pool(units.filter((u) => u.pmOk && u.trusted), INSTALL_PARALLELISM, async (u) => {\n u.installed = await attempt(u.m.slug, () => installIfNeeded(deps, u.recipe!, u.m.slug, onLine(u.m.slug), report, p.signal))\n })\n\n const runs = [await leftoverRun(deps, ws.root)].filter((r): r is RunRecord => r !== null)\n const appRef: CliRef = { id: am.app.id, slug: am.app.slug, name: am.app.name }\n const mcFor = (u: Unit): ModuleContext => ({\n portal: online!.portal, session: online!.session, source: { kind: \"workspace\" }, repoRoot: u.dir, workspace: ws,\n module: { id: u.m.id, slug: u.m.slug, name: u.m.name, type: u.m.type, access: u.m.access, tenant: am.app.tenant, apps: [appRef] },\n })\n const rootReal = await realpath(ws.root)\n const withDocker = dockerRecovery(ctx, p.signal)\n for (const u of units.filter((x) => x.recipe && x.trusted)) {\n const slug = u.m.slug\n await attempt(slug, async () => {\n try {\n u.dev = await devEnv(deps, { mc: online ? mcFor(u) : null, app: online ? appRef : null, root: u.dir, type: u.m.type,\n moduleId: u.m.id, cfg: u.cfg!, random: () => randomBytes(32).toString(\"hex\") })\n } catch (e) {\n // offline context: report the original unreachable error\n if (offlineCause && isOffline(e)) throw offlineCause\n throw e\n }\n })\n const dev = u.dev\n if (!dev) continue\n if (online && dev.offline) {\n warn(`${slug}: the portal is unreachable — starting from ${relative(rootReal, dev.envFile)} as last written; values may be stale.`, { module: slug })\n }\n if (dev.kept.length) {\n warn(`${slug}: ${dev.kept.length} key(s) differ locally and were kept: ${dev.kept.join(\", \")} — qore env pull --use-portal takes the portal's values`,\n { module: slug, keys: dev.kept })\n }\n report({ module: slug, step: \"env\", status: \"done\", detail: relative(rootReal, dev.envFile) })\n const services = servicesMissing(slug, dev.env, u.recipe!, { servicesFlag: f.services, configured: u.cfg!.dev?.services !== undefined })\n if (services) renderFinding(ctx, services)\n try {\n const behind = repoBehind(slug, await deps.git.status(u.dir), { workspace: true })\n if (behind) renderFinding(ctx, behind)\n } catch { /* a status that cannot be read says nothing about being behind */ }\n // db:up runs through the package manager, so it needs the install\n if (u.installed) {\n const env = { ...deps.env, ...dev.env }\n await attempt(slug, () => withDocker({ cwd: u.dir, env }, () =>\n startServices(deps, u.recipe!, slug, env, dev.dbPort, waitTimeout * 1000, p.signal, onLine(slug), report)))\n }\n if (await attempt(slug, () => checkPortOrStopLeftover(ctx, { slug, port: dev.port, key: \"PORT\", runs }, p.signal)) && dev.port !== null) {\n report({ module: slug, step: \"ports\", status: \"done\", detail: String(dev.port) })\n }\n }\n // a Ctrl+C during preflight is a cancel, not a service that failed to come up\n if (p.signal.aborted) throw new CancelledError()\n const byPort = new Map<number, string[]>()\n for (const u of units) if (u.dev?.port != null) byPort.set(u.dev.port, [...(byPort.get(u.dev.port) ?? []), u.m.slug])\n for (const [port, slugs] of byPort) {\n if (slugs.length < 2) continue\n problems.push(new QoreError(\"QORE_PORT_IN_USE\", `${slugs.slice(0, -1).join(\", \")} and ${slugs.at(-1)} both have port ${port}`, {\n hint: \"Ports are unique per organisation; a module from another organisation can share one. Run one of them (--only / --skip).\",\n details: { port, module: slugs[0], modules: slugs },\n }))\n }\n if (problems.length > 0) await fail()\n\n const listening = new Set(units.map((u) => u.dev!.port).filter((p): p is number => p !== null))\n for (const [consumer, providers] of Object.entries(plan.missingProviders)) {\n const env = units.find((u) => u.m.slug === consumer)!.dev!.env\n const aliases = providers.length === 1 ? deadAliases(env, listening) : []\n for (const provider of providers) {\n const what = aliases.length ? `${aliases.join(\", \")} ${aliases.length === 1 ? \"points\" : \"point\"}` : \"its CONN_*_URL points\"\n warn(`${consumer}: ${provider} will not run — ${what} at a port nothing listens on. Qore does not fall back to staging.`,\n { module: consumer, provider, aliases })\n }\n }\n\n if (online && units.every((u) => !u.dev!.offline)) {\n const envFile = (m: CliAppModule) => {\n const u = units.find((x) => x.m.id === m.id)\n return u ? relative(rootReal, u.dev!.envFile) : join(m.slug, moduleDefaults(m.type).envFile)\n }\n await saveLastStart(deps, ws.root, {\n schemaVersion: 1, kind: \"workspace\", portal: online.portal.apiOrigin, savedAt: deps.now().toISOString(),\n app: { ...appRef, tenant: { id: am.app.tenant.id, slug: am.app.tenant.slug, name: am.app.tenant.name } },\n modules: safe.map((m) => ({ id: m.id, slug: m.slug, name: m.name, type: m.type, access: m.access, repoUrl: m.repoUrl,\n dependsOn: m.dependsOn, envFile: envFile(m) })),\n })\n }\n\n if (p.signal.aborted) throw new CancelledError()\n const { reasons } = missingFindings()\n const notRunning = plan.skipped.filter((s) => s.reason !== \"excluded\").map((s) => {\n const m = bySlug.get(s.slug)!\n return { slug: s.slug, reason: s.reason === \"no-write\" ? `no write access — ${askMaintainer(am, m).text}`\n : `not cloned — ${reasons[s.slug] ?? \"Fix: qore sync\"}` }\n })\n return { units, waitFor: plan.waitFor, notRunning, o: { waitTimeout, killOthers: Boolean(f.killOthers), json, color, prefix } }\n}\n\nasync function superviseAll(ctx: CommandContext, ws: Workspace, units: Unit[], waitFor: Record<string, string[]>,\n o: { waitTimeout: number; killOthers: boolean; json: boolean; color: boolean; prefix: (slug: string, line: string) => string },\n notRunning: { slug: string; reason: string }[]): Promise<void> {\n const { deps, io } = ctx\n const startedAt = deps.now().toISOString()\n const began = new Map<string, number>()\n const ref: { sup?: Supervisor } = {}\n let stopping = false\n let runWrite: Promise<void> = Promise.resolve()\n const writeRun = () => {\n runWrite = runWrite.then(() => writeRunFile(deps, ws.root, {\n schemaVersion: 1, qorePid: deps.pid, root: ws.root, startedAt, children: ref.sup?.children() ?? [],\n })).catch(() => {})\n }\n\n const render = (e: SupervisorEvent) => {\n switch (e.type) {\n case \"line\": return e.stream === \"stdout\" ? io.out(o.prefix(e.module, e.line)) : io.err(o.prefix(e.module, e.line))\n case \"start\": return io.err(`▶ starting ${e.module}${e.pid === null ? \"\" : ` (pid ${e.pid})`}`)\n case \"ready\": return io.err(`✓ ${e.module} ready`)\n case \"provider-missing\":\n return io.err(`! ${e.provider} did not come up within ${o.waitTimeout} s (or exited); starting ${e.module} anyway — see its output above`)\n case \"stopping\": return io.err(\"■ stopping\")\n case \"exit\": {\n // children we stopped ourselves are not failures\n if (stopping) return io.err(`■ ${e.module} stopped`)\n if (e.code === null && e.signal === null) return io.err(`✗ ${e.module} could not be started`)\n const after = e.early ? ` after ${Math.round((deps.now().getTime() - (began.get(e.module) ?? deps.now().getTime())) / 1000)} s` : \"\"\n const how = e.signal ? `was ended by ${e.signal}` : `exited with code ${e.code}`\n io.err(`${e.code === 0 ? \"■\" : \"✗\"} ${e.module} ${how}${after}`)\n if (e.hint) io.err(` → ${e.hint.hint}`)\n if (e.code !== 0 && !o.killOthers && (ref.sup?.children().length ?? 0) > 0) {\n io.err(` Restart it on its own: qore dev --only ${e.module} (in another terminal; the others keep running)`)\n }\n return\n }\n }\n }\n const withPort = new Set(units.filter((u) => u.dev!.port !== null).map((u) => u.m.slug))\n const readyPorts = new Map<string, number>()\n let summarized = false\n const summarize = () => {\n if (summarized || o.json || readyPorts.size < withPort.size) return\n summarized = true\n const width = Math.max(0, ...[...readyPorts.keys(), ...notRunning.map((n) => n.slug)].map((s) => s.length))\n io.err(notRunning.length === 0 ? \"✔ All modules running:\" : \"✔ Running:\")\n for (const slug of [...readyPorts.keys()].sort()) io.err(` ${slug.padEnd(width)} http://localhost:${readyPorts.get(slug)}`)\n if (notRunning.length > 0) {\n io.err(\"! Not running:\")\n for (const n of notRunning) io.err(` ${n.slug.padEnd(width)} ${n.reason}`)\n }\n }\n const crashed = new Map<string, { code: number | null; signal: string | null; ms: number }>()\n const onEvent = (e: SupervisorEvent) => {\n if (e.type === \"start\") { began.set(e.module, deps.now().getTime()); writeRun() }\n if (e.type === \"stopping\") stopping = true\n if (e.type === \"ready\") readyPorts.set(e.module, e.port)\n if (e.type === \"exit\" && !stopping && (e.code !== 0 || e.signal !== null)) {\n crashed.set(e.module, { code: e.code, signal: e.signal, ms: deps.now().getTime() - (began.get(e.module) ?? deps.now().getTime()) })\n }\n if (o.json) io.out(JSON.stringify(e))\n else render(e)\n if (e.type === \"ready\") summarize()\n }\n\n const s = ref.sup = supervise({\n modules: units.map((u) => {\n const { cmd, args } = runArgs(u.recipe!.pm, u.recipe!.script)\n return { slug: u.m.slug, cmd, args, cwd: u.dir, port: u.dev!.port, waitFor: waitFor[u.m.slug] ?? [],\n hint: hintContext(u.recipe!, u.pkg!, u.dev!.env),\n env: { ...deps.env, ...u.dev!.env, ...(o.color ? { FORCE_COLOR: \"1\" } : {}) } }\n }),\n launcher: deps.launch, ports: deps.ports, waitMs: o.waitTimeout * 1000, killOthers: o.killOthers, onEvent,\n })\n const onTerm = () => s.stop(\"SIGTERM\")\n const onHup = () => s.stop(\"SIGHUP\")\n const onAbort = () => s.stop(\"interrupt\")\n deps.signals.on(\"SIGTERM\", onTerm)\n deps.signals.on(\"SIGHUP\", onHup)\n ctx.signal.addEventListener(\"abort\", onAbort)\n childRunning.current = true\n childRunning.onInterrupt = () => s.escalate()\n try {\n if (ctx.signal.aborted) onAbort()\n writeRun()\n ctx.setExitCode(await s.done)\n if (!o.json && crashed.size > 0) {\n const stopped = units.map((u) => u.m.slug).filter((s) => !crashed.has(s)).sort()\n // code and signal both null: a spawn error, the child never ran\n const what = [...crashed].map(([s, c]) => `${s} (${c.code === null && c.signal === null ? \"could not be started\"\n : `${c.signal ?? `code ${c.code}`}, after ${humanAge(Math.round(c.ms / 1000))}`})`).join(\", \")\n io.err(`${stopped.length ? `■ stopped: ${stopped.join(\", \")} ` : \"\"}✗ crashed: ${what}`)\n }\n } finally {\n deps.signals.off(\"SIGTERM\", onTerm)\n deps.signals.off(\"SIGHUP\", onHup)\n ctx.signal.removeEventListener(\"abort\", onAbort)\n childRunning.current = false\n childRunning.onInterrupt = undefined\n await runWrite\n await removeRunFile(deps, ws.root)\n }\n}\n","import { QoreError } from \"../errors.js\"\n\nexport type PlanModule = { id: string; slug: string; present: boolean; canWrite: boolean; dependsOn: string[] }\nexport type Skip = { slug: string; reason: \"not-cloned\" | \"no-write\" | \"excluded\" }\nexport type WorkspacePlan = {\n start: string[]\n waitFor: Record<string, string[]>\n cycles: string[][]\n skipped: Skip[]\n missingProviders: Record<string, string[]>\n}\n\nfunction selectSkips(modules: PlanModule[], sel: { only?: string[]; skip?: string[] }): Map<string, Skip[\"reason\"]> {\n if (sel.only && sel.skip) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", \"--only and --skip cannot be used together\", {\n hint: \"Pass either --only or --skip, not both.\",\n })\n }\n const slugs = modules.map((m) => m.slug).sort()\n const known = new Set(slugs)\n for (const s of [...(sel.only ?? []), ...(sel.skip ?? [])]) {\n if (!known.has(s)) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `Unknown module: ${s}`, {\n hint: `Valid slugs: ${slugs.join(\", \")}`,\n })\n }\n }\n const onlySet = sel.only ? new Set(sel.only) : null\n const skipSet = sel.skip ? new Set(sel.skip) : null\n const reasons = new Map<string, Skip[\"reason\"]>()\n for (const m of modules) {\n if ((onlySet && !onlySet.has(m.slug)) || (skipSet && skipSet.has(m.slug))) {\n reasons.set(m.slug, \"excluded\")\n } else if (!m.present) {\n reasons.set(m.slug, \"not-cloned\")\n } else if (!m.canWrite) {\n reasons.set(m.slug, \"no-write\")\n }\n }\n return reasons\n}\n\n// Tarjan's SCC over the starting set only.\nfunction tarjanSccs(starting: PlanModule[], byId: Map<string, PlanModule>, startingIds: Set<string>): string[][] {\n let index = 0\n const indices = new Map<string, number>()\n const lowlink = new Map<string, number>()\n const onStack = new Map<string, boolean>()\n const stack: string[] = []\n const sccs: string[][] = []\n\n function strongconnect(id: string): void {\n indices.set(id, index)\n lowlink.set(id, index)\n index++\n stack.push(id)\n onStack.set(id, true)\n\n const m = byId.get(id)!\n for (const dep of m.dependsOn) {\n if (!startingIds.has(dep)) continue\n if (!indices.has(dep)) {\n strongconnect(dep)\n lowlink.set(id, Math.min(lowlink.get(id)!, lowlink.get(dep)!))\n } else if (onStack.get(dep)) {\n lowlink.set(id, Math.min(lowlink.get(id)!, indices.get(dep)!))\n }\n }\n\n if (lowlink.get(id) === indices.get(id)) {\n const comp: string[] = []\n let w: string\n do {\n w = stack.pop()!\n onStack.set(w, false)\n comp.push(w)\n } while (w !== id)\n sccs.push(comp)\n }\n }\n\n for (const m of starting) {\n if (!indices.has(m.id)) strongconnect(m.id)\n }\n return sccs\n}\n\nexport function planDev(modules: PlanModule[], sel: { only?: string[]; skip?: string[] }): WorkspacePlan {\n const reasons = selectSkips(modules, sel)\n const byId = new Map(modules.map((m) => [m.id, m]))\n const starting = modules.filter((m) => !reasons.has(m.slug))\n const startingIds = new Set(starting.map((m) => m.id))\n\n const sccs = tarjanSccs(starting, byId, startingIds)\n // sccId per module id, and each SCC's sorted slugs\n const sccOf = new Map<string, number>()\n const sccSlugs: string[][] = sccs.map((comp) => comp.map((id) => byId.get(id)!.slug).sort())\n sccs.forEach((comp, i) => comp.forEach((id) => sccOf.set(id, i)))\n\n const cycles = sccSlugs\n .filter((slugs, i) => slugs.length > 1 || sccs[i]!.some((id) => byId.get(id)!.dependsOn.includes(id)))\n .map((slugs) => slugs)\n\n // SCC DAG edges: scc -> providers (deps)\n const providerSccsOf = new Map<number, Set<number>>()\n sccs.forEach((comp, i) => {\n const set = new Set<number>()\n for (const id of comp) {\n for (const dep of byId.get(id)!.dependsOn) {\n if (!startingIds.has(dep)) continue\n const j = sccOf.get(dep)!\n if (j !== i) set.add(j)\n }\n }\n providerSccsOf.set(i, set)\n })\n\n // Topological order of SCC DAG, providers first, ties broken by slug (min slug of the SCC).\n const minSlug = sccSlugs.map((slugs) => slugs[0]!)\n const visited = new Array(sccs.length).fill(false) as boolean[]\n const orderedSccIndices: number[] = []\n function visit(i: number): void {\n if (visited[i]) return\n visited[i] = true\n const providers = [...providerSccsOf.get(i)!].sort((a, b) => minSlug[a]!.localeCompare(minSlug[b]!))\n for (const p of providers) visit(p)\n orderedSccIndices.push(i)\n }\n const order = sccs.map((_, i) => i).sort((a, b) => minSlug[a]!.localeCompare(minSlug[b]!))\n for (const i of order) visit(i)\n\n const start: string[] = []\n for (const i of orderedSccIndices) start.push(...sccSlugs[i]!)\n\n const waitFor: Record<string, string[]> = {}\n for (const m of starting) {\n const mySccId = sccOf.get(m.id)!\n const providers = m.dependsOn\n .filter((d) => startingIds.has(d) && sccOf.get(d) !== mySccId)\n .map((d) => byId.get(d)!.slug)\n waitFor[m.slug] = [...new Set(providers)].sort()\n }\n\n const skipped: Skip[] = [...reasons.entries()].map(([slug, reason]) => ({ slug, reason })).sort((a, b) => a.slug.localeCompare(b.slug))\n\n const missingProviders: Record<string, string[]> = {}\n for (const m of starting) {\n const missing = m.dependsOn\n .map((d) => byId.get(d))\n .filter((dep): dep is PlanModule => dep !== undefined && reasons.has(dep.slug))\n .map((dep) => dep.slug)\n if (missing.length > 0) {\n missingProviders[m.slug] = [...new Set(missing)].sort()\n }\n }\n\n return { start, waitFor, cycles, skipped, missingProviders }\n}\n","import { constants } from \"node:os\"\nimport { exitHint, KEEP_LINES, type ExitHint } from \"../diagnostics/node.js\"\nimport type { HintContext } from \"./providers.js\"\nimport type { Launched, LaunchExit, Launcher } from \"../../platform/launch.js\"\nimport type { Ports } from \"../../platform/ports.js\"\n\nexport type SupervisedModule = {\n slug: string; cmd: string; args: string[]; cwd: string; env: NodeJS.ProcessEnv; port: number | null; waitFor: string[]\n /** What `exitHint` may know about this module (commands, which port is what). */\n hint: HintContext\n}\nexport type SupervisorEvent =\n | { type: \"line\"; module: string; stream: \"stdout\" | \"stderr\"; line: string }\n | { type: \"start\"; module: string; pid: number | null }\n | { type: \"ready\"; module: string; port: number }\n | { type: \"provider-missing\"; module: string; provider: string; why: \"timeout\" | \"exited\" }\n | { type: \"exit\"; module: string; code: number | null; signal: string | null; early: boolean; hint?: ExitHint }\n | { type: \"stopping\"; reason: \"interrupt\" | \"signal\" | \"kill-others\" }\nexport type Supervisor = { done: Promise<number>; stop(reason: \"interrupt\" | \"SIGTERM\" | \"SIGHUP\"): void; escalate(): void; children(): { module: string; pid: number | null; port: number | null }[] }\n\ntype Readiness = \"ready\" | \"exited\" | \"timeout\"\ntype Child = { mod: SupervisedModule; launched: Launched; alive: boolean }\n\nconst EARLY_MS = 10_000\nconst GRACE_MS = 10_000\n\nfunction exitCode(e: LaunchExit): number {\n if (e.spawnError) return 1\n if (e.code !== null) return e.code\n const n = e.signal ? constants.signals[e.signal] : undefined\n return n === undefined ? 1 : 128 + n\n}\n\nexport function supervise(o: { modules: SupervisedModule[]; launcher: Launcher; ports: Ports; waitMs: number; killOthers: boolean;\n onEvent: (e: SupervisorEvent) => void; now?: () => number; delay?: (ms: number) => Promise<void> }): Supervisor {\n const now = o.now ?? Date.now\n // unref: the grace timer alone must not keep qore alive once every child has exited\n const delay = o.delay ?? ((ms: number) => new Promise<void>((r) => { setTimeout(r, ms).unref() }))\n const abort = new AbortController()\n // a throwing renderer must not stop the supervisor or leave `done` hanging\n const emit = (e: SupervisorEvent) => { try { o.onEvent(e) } catch { /* ignored */ } }\n const running: Child[] = []\n const tails = new Map<string, string[]>()\n let unlaunched = o.modules.length\n let stopCode: number | null = null\n let firstFailure: number | null = null\n let resolveDone!: (code: number) => void\n const done = new Promise<number>((r) => { resolveDone = r })\n\n const readiness = new Map<string, { promise: Promise<Readiness>; settle: (r: Readiness) => boolean }>()\n for (const m of o.modules) {\n let resolve!: (r: Readiness) => void\n let settled = false\n const promise = new Promise<Readiness>((r) => { resolve = r })\n readiness.set(m.slug, { promise, settle: (r) => { if (settled) return false; settled = true; resolve(r); return true } })\n }\n\n const live = () => running.filter((c) => c.alive)\n\n const checkDone = () => {\n if (live().length > 0) return\n if (stopCode !== null) resolveDone(stopCode)\n else if (unlaunched === 0) resolveDone(firstFailure ?? 0)\n }\n\n const beginStop = (reason: \"interrupt\" | \"signal\" | \"kill-others\", code: number) => {\n if (stopCode !== null) return\n stopCode = code\n abort.abort()\n for (const r of readiness.values()) r.settle(\"timeout\")\n emit({ type: \"stopping\", reason })\n const targets = live().reverse()\n for (const c of targets) c.launched.stop(\"SIGTERM\")\n if (targets.length > 0) {\n void delay(GRACE_MS).then(() => { for (const c of live().reverse()) c.launched.stop(\"SIGKILL\") })\n }\n checkDone()\n }\n\n const launch = (m: SupervisedModule) => {\n unlaunched--\n const ready = readiness.get(m.slug)!\n const startedAt = now()\n const launched = o.launcher.launch(m.cmd, m.args, {\n cwd: m.cwd, env: m.env,\n onLine: (l) => {\n const tail = tails.get(m.slug) ?? []\n tail.push(l.line)\n if (tail.length > KEEP_LINES) tail.shift()\n tails.set(m.slug, tail)\n emit({ type: \"line\", module: m.slug, stream: l.stream, line: l.line })\n },\n })\n const child: Child = { mod: m, launched, alive: true }\n running.push(child)\n emit({ type: \"start\", module: m.slug, pid: launched.pid })\n\n if (m.port === null) ready.settle(\"ready\")\n else {\n const port = m.port\n void o.ports.waitFor(port, o.waitMs, abort.signal).then((ok) => {\n if (ready.settle(ok ? \"ready\" : \"timeout\") && ok) emit({ type: \"ready\", module: m.slug, port })\n })\n }\n\n void launched.exited.then((e) => {\n child.alive = false\n ready.settle(\"exited\")\n const code = exitCode(e)\n const early = !!e.spawnError || now() - startedAt < EARLY_MS\n const rawCode = e.spawnError ? null : e.code\n const rawSignal = e.spawnError ? null : e.signal\n // A hint is only meaningful for a real crash: a non-zero exit, no signal (not one\n // qore or the terminal ended it with), and not while qore is stopping the children\n // (a dev server may exit 1 on qore's SIGTERM). Early or late — the tail is the last lines.\n const hint = stopCode === null && rawSignal === null && rawCode !== null && rawCode !== 0\n ? exitHint(tails.get(m.slug) ?? [], m.hint) ?? undefined\n : undefined\n emit({ type: \"exit\", module: m.slug, code: rawCode, signal: rawSignal, early, hint })\n if (code !== 0 && firstFailure === null) firstFailure = code\n if (o.killOthers) beginStop(\"kill-others\", code)\n checkDone()\n })\n }\n\n const start = async (m: SupervisedModule) => {\n const providers = m.waitFor.filter((p) => readiness.has(p))\n const results = await Promise.all(providers.map((p) => readiness.get(p)!.promise))\n if (stopCode !== null) return\n providers.forEach((p, i) => {\n const why = results[i]\n if (why !== \"ready\") emit({ type: \"provider-missing\", module: m.slug, provider: p, why: why! })\n })\n launch(m)\n }\n\n for (const m of o.modules) void start(m)\n checkDone()\n\n return {\n done,\n stop(reason) {\n if (reason === \"interrupt\") beginStop(\"interrupt\", 130)\n else beginStop(\"signal\", 128 + constants.signals[reason])\n },\n escalate() {\n beginStop(\"interrupt\", 130)\n for (const c of live().reverse()) c.launched.stop(\"SIGKILL\")\n },\n children: () => live().map((c) => ({ module: c.mod.slug, pid: c.launched.pid, port: c.mod.port })),\n }\n}\n","import { lstat, readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\n/** Directories directly under `root`, minus the module slugs, holding a `.git` entry.\n * These are what `planWorkspace` reports as `removed`: a module that left the app but whose\n * clone is still on disk. Only the `.git` entry is looked at — no git call runs in a\n * directory that is not one of the app's modules — and a directory that cannot be read is\n * simply not reported: a stray is informational and never makes the run fail. */\nexport async function strayRepos(root: string, slugs: Set<string>): Promise<string[]> {\n let entries: string[]\n try {\n entries = (await readdir(root, { withFileTypes: true })).filter((e) => e.isDirectory()).map((e) => e.name)\n } catch {\n return []\n }\n const names: string[] = []\n for (const name of entries) {\n if (slugs.has(name)) continue\n try {\n await lstat(join(root, name, \".git\"))\n names.push(name)\n } catch { /* no .git (or unreadable): not a stray repository */ }\n }\n return names.sort()\n}\n","import { createColors } from \"picocolors\"\nimport { QoreError, toJsonError } from \"../core/errors.js\"\nimport type { Io } from \"./io.js\"\nimport { renderError } from \"./render.js\"\n\nexport function renderProblems(io: Io, problems: QoreError[], color: boolean): void {\n problems.forEach((p, i) => {\n if (i > 0) io.err(\"\")\n renderError(io, p, false, color)\n })\n}\n\nexport function combineProblems(problems: QoreError[]): QoreError {\n if (problems.length === 0) throw new Error(\"combineProblems needs at least one problem\")\n if (problems.length === 1) return problems[0]!\n const first = problems[0]!\n return new QoreError(first.code, `${problems.length} problems before starting`, {\n details: { problems: problems.map((p) => toJsonError(p)) },\n })\n}\n\nexport function prefixer(slugs: string[], color: boolean): (slug: string, line: string) => string {\n const c = createColors(color)\n const palette = [c.cyan, c.magenta, c.yellow, c.green, c.blue, c.red]\n const sorted = [...new Set(slugs)].sort()\n const width = Math.max(0, ...sorted.map((s) => s.length))\n return (slug, line) => {\n const i = sorted.indexOf(slug)\n const paint = i === -1 ? (s: string) => s : palette[i % palette.length]!\n return `${paint(slug.padEnd(width))} │ ${line}`\n }\n}\n","import { constants } from \"node:os\"\nimport type { Command } from \"commander\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { fetchLocalEnv } from \"../../core/env/fetch.js\"\nimport { appFor, moduleContextFor } from \"../context.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { ensureTrusted } from \"../trustPrompt.js\"\n\n/** Ruling R3: while the child runs, cli.ts's own SIGINT handler must not force `exit(130)`\n * — the terminal already delivers Ctrl+C to the whole foreground process group (see\n * platform/spawn.ts), so the child's own exit (code or re-raised signal) is what decides\n * qore's exit code. This flag is the narrow hook cli.ts checks; it brackets exactly the\n * `deps.spawn.run` call, nothing more. */\nexport const childRunning: { current: boolean; onInterrupt?: () => void } = { current: false }\n\nexport function registerRun(program: Command, ctx: CommandContext): void {\n program\n .command(\"run\")\n .description(\"Run a command with this module's local secrets in its environment\")\n .option(\"--module <slug|id>\", \"the module (default: from this repository's git remote)\")\n .option(\"--app <slug|id>\", \"the app, when the module is part of several\")\n .option(\"--yes\", \"trust this repository without asking\")\n .argument(\"<command>\", \"the command to run (after --)\")\n .argument(\"[args...]\", \"its arguments, passed verbatim\")\n .action(async (cmd: string, args: string[], f: { module?: string; app?: string; yes?: boolean }) => {\n const { deps } = ctx\n if (ctx.opts().json) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", \"run has no --json output\", {\n hint: \"Drop --json; the child's own output passes through.\",\n })\n }\n const mc = await moduleContextFor(ctx, f, \"run\")\n const app = await appFor(ctx, mc, f.app)\n // C8: ensureTrusted prints the context line exactly once — do not print it again here.\n await ensureTrusted(ctx, mc, app, { yes: f.yes })\n const local = await fetchLocalEnv(deps, mc, app) // fetched on every run, never cached (§11.2)\n childRunning.current = true\n let exit\n try {\n exit = await deps.spawn.run(cmd, args, { ...deps.env, ...local.env })\n } finally {\n childRunning.current = false\n }\n if (exit.signal) {\n deps.raise(exit.signal)\n ctx.setExitCode(128 + (constants.signals[exit.signal] ?? 0))\n return\n }\n ctx.setExitCode(exit.code ?? 1)\n })\n}\n","import type { Command } from \"commander\"\nimport pc from \"picocolors\"\nimport { runDoctor } from \"../../core/doctor/checks.js\"\nimport { requestLog, type CommandContext } from \"../program.js\"\nimport { renderDoctorHuman, renderDoctorJson } from \"../render.js\"\n\n/** The same checks `qore` runs before other commands, run on demand (spec §14.3). Exit 0\n * only when every check passes; `!` warnings never fail it. */\nexport function registerDoctor(program: Command, ctx: CommandContext): void {\n program.command(\"doctor\").description(\"Check qore's own health: tools, session, and this workspace or module\")\n .action(async () => {\n const { deps, io, signal } = ctx\n const g = ctx.opts()\n const report = await runDoctor(deps, { portal: g.portal, onRequest: requestLog(ctx), signal })\n const failed = report.results.some((r) => r.status === \"fail\")\n if (g.json) {\n renderDoctorJson(io, report)\n } else {\n renderDoctorHuman(io, report, pc.isColorSupported && g.color !== false)\n }\n ctx.setExitCode(failed ? 1 : 0)\n })\n}\n","import { realpath } from \"node:fs/promises\"\nimport { basename, join } from \"node:path\"\nimport { requireCapability } from \"../api/capabilities.js\"\nimport { compareVersions, fetchMetaWithDate } from \"../api/meta.js\"\nimport type { CliAppModule, CliAppModules, CliMe, CliMeta, CliModuleDetail, CliRepoResolve } from \"../api/types.js\"\nimport { TokenStore, type StoredRefresh } from \"../auth/tokenStore.js\"\nimport { moduleDefaults, readRepoConfig } from \"../context/repoConfig.js\"\nimport { repoKey } from \"../context/repoKey.js\"\nimport { findRepoRoot } from \"../context/repoRoot.js\"\nimport { workspaceAppModules, workspaceRoot } from \"../context/resolver.js\"\nimport type { QoreConfig } from \"../config.js\"\nimport type { Deps } from \"../deps.js\"\nimport { envPort } from \"../dev/env.js\"\nimport { checkNode, checkPackageManager, portInUseError, runTool } from \"../dev/preflight.js\"\nimport { detectPackageManager, planRecipe, readPackageJson, type DevRecipe, type PackageJson } from \"../dev/project.js\"\nimport { leftoverRun, type RunRecord } from \"../dev/runFile.js\"\nimport { classifyComposeVersion, classifyDockerInfo } from \"../diagnostics/docker.js\"\nimport { classifySshTest, SSH_TEST_ARGS } from \"../diagnostics/ssh.js\"\nimport { nodeSatisfies } from \"../diagnostics/versions.js\"\nimport { parseEnv } from \"../env/merge.js\"\nimport { resolveTarget } from \"../env/pull.js\"\nimport { readOrNull } from \"../env/write.js\"\nimport { CancelledError, QoreError, toJsonError } from \"../errors.js\"\nimport { BUILTIN_PORTALS, profileHash, resolvePortal, type PortalRef } from \"../profiles.js\"\nimport { openSession, type Session } from \"../session.js\"\nimport { isTrusted } from \"../trust.js\"\nimport { notClonedReason } from \"../workspace/access.js\"\nimport { findWorkspace, type Workspace } from \"../workspace/file.js\"\nimport { planWorkspace } from \"../workspace/plan.js\"\nimport { isSafeSlug } from \"../workspace/safety.js\"\n\nexport type CheckStatus = \"ok\" | \"warn\" | \"fail\"\nexport type CheckResult = { id: string; group: \"tools\" | \"session\" | \"workspace\"; status: CheckStatus; label: string\n module?: string; error?: ReturnType<typeof toJsonError>; details?: Record<string, unknown> }\nexport type DoctorReport = { results: CheckResult[]; context: { kind: \"workspace\" | \"module\" | \"none\"; label?: string } }\n\ntype Body = Omit<CheckResult, \"id\" | \"group\" | \"module\">\ntype Part = { status: CheckStatus; label: string; error?: unknown }\ntype Meta = { ok: true; meta: CliMeta; date: Date | null; fetchedAt: Date } | { ok: false; error: unknown }\n\nconst NODE_RANGE = \">=22\"\nconst SKEW_S = 60\nconst TOOL_TIMEOUT_MS = 10_000\nconst IDLE_DAYS = 30\nconst DAY_MS = 86_400_000\nconst UPGRADE = \"npm i -g @quatronic/qore\"\nconst RANK: Record<CheckStatus, number> = { ok: 0, warn: 1, fail: 2 }\nconst noop = () => {}\n\nconst ok = (label: string, details?: Record<string, unknown>): Body => ({ status: \"ok\", label, ...(details ? { details } : {}) })\nconst withError = (status: CheckStatus, label: string, e: unknown): Body => ({ status, label, error: toJsonError(e) })\nconst isCancel = (e: unknown, signal: AbortSignal) => e instanceof CancelledError || signal.aborted\nconst portalLabel = (p: PortalRef) => p.builtin ?? p.apiOrigin\n\n/** A tool that outlived its per-check bound; becomes a warning, never a failure. */\nclass ToolTimeout extends Error {\n constructor(readonly tool: string, readonly ms: number) { super(`${tool} did not answer within ${Math.round(ms / 1000)} s`) }\n}\n\n/** runTool throws CancelledError for both, so the user's cancel is told apart by the outer signal. */\nasync function timed<T>(tool: string, signal: AbortSignal, ms: number, fn: (s: AbortSignal) => Promise<T>): Promise<T> {\n try { return await fn(AbortSignal.any([signal, AbortSignal.timeout(ms)])) } catch (e) {\n if (e instanceof CancelledError && !signal.aborted) throw new ToolTimeout(tool, ms)\n throw e\n }\n}\n\nfunction errorLabel(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n\nfunction checkQore(deps: Deps, meta: Meta): Body {\n const v = deps.version\n if (!meta.ok) return withError(\"warn\", `qore ${v} — could not check for updates`, meta.error)\n const { minCliVersion: min, latestCliVersion: latest } = meta.meta\n if (!v.endsWith(\"-dev\") && compareVersions(v, min) < 0) {\n const e = new QoreError(\"QORE_UPGRADE_REQUIRED\", `qore ${v} is too old for this portal (needs ${min})`, { hint: `Run: ${UPGRADE}` })\n return withError(\"fail\", `qore ${v} is too old for this portal (needs ${min}) — ${UPGRADE}`, e)\n }\n if (!v.endsWith(\"-dev\") && compareVersions(v, latest) < 0) {\n return { status: \"warn\", label: `qore ${v} — ${latest} is available (${UPGRADE})`, details: { latest } }\n }\n return ok(`qore ${v} (latest)`)\n}\n\nfunction checkOwnNode(deps: Deps): Body {\n const v = deps.nodeVersion\n if (nodeSatisfies(v, NODE_RANGE) === false) {\n const e = new QoreError(\"QORE_NODE_VERSION\", `qore needs Node ${NODE_RANGE}, found ${v}`, {\n hint: \"nvm install 22 / fnm use 22, then reinstall qore.\", details: { found: v, required: NODE_RANGE },\n })\n return withError(\"fail\", e.message, e)\n }\n return ok(`Node ${v} (≥22 required)`)\n}\n\nasync function checkGit(deps: Deps, signal: AbortSignal, ms: number): Promise<Body> {\n const res = await timed(\"git\", signal, ms, (s) => runTool(deps, \"git\", [\"--version\"], { cwd: deps.home, env: deps.env, onLine: noop, signal: s }))\n if (res.spawnError === \"ENOENT\") {\n const e = new QoreError(\"QORE_GIT_UNAVAILABLE\", \"git is not installed or not on PATH\", {\n hint: \"Install git (https://git-scm.com/downloads) and open a new terminal.\" })\n return withError(\"fail\", e.message, e)\n }\n if (res.code !== 0) {\n const e = new QoreError(\"QORE_GIT_UNAVAILABLE\", \"git --version failed\", { details: { stderr: res.tail } })\n return withError(\"fail\", e.message, e)\n }\n const m = /git version (\\d+)\\.(\\d+)/.exec(res.tail.join(\"\\n\"))\n return ok(m ? `git ${m[1]}.${m[2]}` : \"git\")\n}\n\n/** Only `qore sync --protocol ssh` needs this, so a failure is a warning. */\nasync function checkGithubSsh(deps: Deps, signal: AbortSignal, ms: number): Promise<Body> {\n const res = await timed(\"ssh\", signal, ms, (s) => runTool(deps, \"ssh\", SSH_TEST_ARGS, { cwd: deps.home, env: deps.env, onLine: noop, signal: s }))\n const r = classifySshTest(res)\n if (r.ok) return ok(`GitHub SSH ok (${r.user})`, { user: r.user })\n return withError(\"warn\", `GitHub SSH: ${r.error.message} (https still works)`, r.error)\n}\n\n/** Docker is only needed for `db:up`: missing or stopped is a warning; a broken install fails. */\nasync function checkDocker(deps: Deps, signal: AbortSignal, ms: number): Promise<Body> {\n // Docker Desktop that is still starting can hold `docker info` for minutes\n return timed(\"docker\", signal, ms, async (s) => {\n const o = { cwd: deps.home, env: deps.env, onLine: noop, signal: s }\n const info = await runTool(deps, \"docker\", [\"info\", \"--format\", \"{{.ServerVersion}}\"], o)\n const infoErr = classifyDockerInfo(info, deps.platform)\n if (infoErr) return withError(\"warn\", `${infoErr.message} (only needed for db:up)`, infoErr)\n const compose = await runTool(deps, \"docker\", [\"compose\", \"version\"], o)\n return dockerBody(info.tail, compose)\n })\n}\n\nfunction dockerBody(infoTail: string[], compose: { code: number | null; tail: string[] }): Body {\n const composeErr = classifyComposeVersion(compose)\n if (composeErr) return withError(\"fail\", composeErr.message, composeErr)\n const version = infoTail.map((l) => l.trim()).findLast(Boolean) ?? \"\"\n const major = /v?(\\d+)\\.\\d+/.exec(compose.tail.join(\"\\n\"))?.[1]\n return ok(`Docker ${version} running · compose ${major ? `v${major}` : \"ok\"}`)\n}\n\nfunction jwtExp(token: string): number | null {\n const payload = token.split(\".\")[1]\n if (!payload) return null\n try {\n const exp = (JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as { exp?: unknown }).exp\n return typeof exp === \"number\" && exp > 0 ? exp : null\n } catch { return null }\n}\n\n/** `obtainedAt` resets on every refresh, so the 90-day maximum is only known from the token's own `exp`. */\nfunction validDays(rt: StoredRefresh, now: Date): number | null {\n const exp = jwtExp(rt.rt)\n const end = exp !== null ? exp * 1000 : Date.parse(rt.obtainedAt) + IDLE_DAYS * DAY_MS\n if (Number.isNaN(end)) return null\n return Math.max(0, Math.floor((end - now.getTime()) / DAY_MS))\n}\n\n/** A session problem on a portal other than the one this run actually uses is only a warning:\n * it can't block anything doctor is about to check. */\nasync function checkSession(deps: Deps, portal: PortalRef, onRequest: ((l: string) => void) | undefined,\n sessions: Map<string, Session>, selected: boolean, signal: AbortSignal): Promise<Body> {\n try {\n const session = await openSession(deps, portal, \"doctor\", onRequest)\n const me = await session.api.get<CliMe>(\"/api/cli/v1/me\")\n sessions.set(portal.apiOrigin, session)\n const rt = await session.tokens.getRefresh()\n const days = rt ? validDays(rt, deps.now()) : null\n const valid = days === null ? \"\" : ` · session valid ${days} ${days === 1 ? \"day\" : \"days\"}`\n return ok(`Logged in to ${portalLabel(portal)} as ${me.email}${valid}`, { email: me.email, ...(days !== null ? { validDays: days } : {}) })\n } catch (e) {\n if (isCancel(e, signal) || selected) throw e\n return withError(\"warn\", `${portalLabel(portal)}: ${errorLabel(e)}`, e)\n }\n}\n\nfunction checkClock(meta: Meta): Body {\n if (!meta.ok) return withError(\"warn\", \"Clock — could not check (the portal did not answer)\", meta.error)\n if (!meta.date) return { status: \"warn\", label: \"Clock — could not check (no Date header)\" }\n const skew = Math.round((meta.date.getTime() - meta.fetchedAt.getTime()) / 1000)\n if (Math.abs(skew) > SKEW_S) {\n const minutes = Math.max(1, Math.round(Math.abs(skew) / 60))\n const e = new QoreError(\"QORE_CLOCK_SKEW\", `Your clock is off by ${minutes} min`, {\n hint: \"Turn on automatic date and time.\", details: { skewSeconds: skew } })\n return withError(\"fail\", e.message, e)\n }\n return ok(\"Clock in sync\", { skewSeconds: skew })\n}\n\nfunction ownerText(e: QoreError): string {\n const d = e.details ?? {}\n if (d.owner === \"process\") return ` by ${String(d.command)} (pid ${String(d.pid)})`\n if (d.owner === \"docker\") return ` by the Docker container ${String(d.name)}`\n if (d.owner === \"qore\") return ` by a previous qore dev (pid ${String(d.pid)})`\n return \"\"\n}\n\nconst sameDir = async (a: string, b: string) => (await realpath(a).catch(() => a)) === (await realpath(b).catch(() => b))\n\ntype Mod = { root: string; slug: string; type: string; id: string; access: string }\ntype Prepared = { body: Body; recipe?: DevRecipe; pkg?: PackageJson }\n\n/** port · access · db, read from files on disk and the port table; nothing is run in the repository. */\nasync function moduleBody(deps: Deps, m: Mod, runs: () => Promise<RunRecord[]>, signal: AbortSignal): Promise<Prepared> {\n const parts: Part[] = []\n const part = async (fn: () => Promise<Part> | Part) => {\n try { parts.push(await fn()) } catch (e) {\n if (isCancel(e, signal)) throw e\n parts.push({ status: \"fail\", label: errorLabel(e), error: e })\n }\n }\n const cfg = await readRepoConfig(m.root)\n let env: Record<string, string> | null = null\n await part(async () => {\n const target = await resolveTarget(m.root, cfg.envFile ?? moduleDefaults(m.type).envFile)\n const text = await readOrNull(target)\n if (text === null) return { status: \"warn\", label: \"port unknown (run qore env pull)\" }\n env = Object.fromEntries(parseEnv(text))\n const port = envPort(env, \"PORT\")\n if (port === null) return { status: \"warn\", label: `port unknown (no PORT in ${basename(target)})` }\n if (!(await deps.ports.inUse(port))) return { status: \"ok\", label: `port ${port} free` }\n const e = await portInUseError(deps, { slug: m.slug, port, key: \"PORT\", runs: await runs() })\n return { status: \"fail\", label: `port ${port} in use${ownerText(e)}`, error: e }\n })\n await part(() => (m.access === \"write\" || m.access === \"maintain\" ? { status: \"ok\", label: \"write\" }\n : { status: \"warn\", label: m.access === \"read\" ? \"read only — qore dev needs write\" : `${m.access} access — qore dev needs write` }))\n\n let recipe: DevRecipe | undefined\n let pkg: PackageJson | undefined\n await part(async () => {\n pkg = await readPackageJson(m.root)\n recipe = planRecipe({ root: m.root, pkg, pm: await detectPackageManager(m.root, pkg), cfg, slug: m.slug,\n flags: { install: true, services: true } })\n if (recipe.services.length === 0) return { status: \"ok\", label: \"db none\" }\n const dbPort = env ? envPort(env, \"DB_PORT\") : null\n if (dbPort === null) return { status: \"warn\", label: \"db port unknown (run qore env pull)\" }\n if (!(await deps.ports.inUse(dbPort))) return { status: \"ok\", label: `db:up (DB_PORT ${dbPort} free)` }\n const pub = await deps.ports.dockerPublisher(dbPort)\n if (pub?.workingDir && (await sameDir(pub.workingDir, m.root))) return { status: \"ok\", label: \"db running\" }\n const e = await portInUseError(deps, { slug: m.slug, port: dbPort, key: \"DB_PORT\" })\n return { status: \"fail\", label: `DB_PORT ${dbPort} in use${ownerText(e)}`, error: e }\n })\n\n const status = parts.reduce<CheckStatus>((w, p) => (RANK[p.status] > RANK[w] ? p.status : w), \"ok\")\n const shown = parts.filter((p) => p.status !== \"ok\")\n const first = parts.find((p) => p.status === \"fail\" && p.error) ?? parts.find((p) => p.error)\n return {\n recipe, pkg,\n body: {\n status, label: (shown.length ? shown : parts).map((p) => p.label).join(\" · \"),\n ...(first ? { error: toJsonError(first.error) } : {}),\n details: { parts: parts.map((p) => ({ status: p.status, label: p.label, ...(p.error ? { error: toJsonError(p.error) } : {}) })) },\n },\n }\n}\n\n/** Read on first need, inside a pushed check, and never pruned (doctor writes nothing). */\nfunction runsAt(deps: Deps, root: string): () => Promise<RunRecord[]> {\n let p: Promise<RunRecord[]> | undefined\n return () => (p ??= leftoverRun(deps, root, { prune: false }).then((r) => (r ? [r] : [])))\n}\n\nconst UNTRUSTED: Body = { status: \"warn\", label: \"not checked (repository not trusted)\" }\n\n/** `<pm> --version` and `node --version` in the repository can run its code: trusted repositories only. */\nasync function checkRepoPm(deps: Deps, m: Mod, recipe: DevRecipe, signal: AbortSignal, ms: number): Promise<Body> {\n if (!(await isTrusted(deps, m.root, m.id))) return UNTRUSTED\n const found = await timed(recipe.pm.name, signal, ms, (s) => checkPackageManager(deps, recipe, noop, s))\n const { name, version } = recipe.pm\n if (found === null) return ok(`${name} (version unknown)`)\n return ok(version ? `${name} ${found} (matches)` : `${name} ${found}`, { found, ...(version ? { pinned: version } : {}) })\n}\n\nasync function checkRepoNode(deps: Deps, m: Mod, recipe: DevRecipe, pkg: PackageJson, signal: AbortSignal, ms: number): Promise<Body> {\n if (!(await isTrusted(deps, m.root, m.id))) return UNTRUSTED\n const found = await timed(\"node\", signal, ms, (s) => checkNode(deps, recipe, pkg, m.slug, s))\n return ok(`Node ${found ?? \"?\"} (engines ${pkg.engines!.node})`)\n}\n\n/** prod, staging, then the rest; only profiles holding a refresh token. */\nasync function loggedInPortals(deps: Deps, profiles: QoreConfig[\"profiles\"]): Promise<PortalRef[]> {\n const rank = (o: string) => (o === BUILTIN_PORTALS.prod.apiOrigin ? 0 : o === BUILTIN_PORTALS.staging.apiOrigin ? 1 : 2)\n const out: PortalRef[] = []\n for (const origin of Object.keys(profiles).sort((a, b) => rank(a) - rank(b) || a.localeCompare(b))) {\n const p = profiles[origin]!\n if (await new TokenStore(deps.keychain, profileHash(p.apiOrigin, p.issuer)).getRefresh()) out.push(resolvePortal(origin, undefined))\n }\n return out\n}\n\n/** Read-only: unlike resolveModuleContext it neither caches the resolution nor refreshes the meta cache. */\nasync function resolveRepoModule(deps: Deps, session: Session, portal: PortalRef, meta: Meta, root: string): Promise<CliModuleDetail | Body> {\n if (meta.ok) requireCapability(meta.meta, \"repo.resolve\", portal.apiOrigin)\n const keys = [...new Set((await deps.git.remotes(root)).map((r) => repoKey(r.url)).filter((k): k is string => k !== null))]\n if (keys.length === 0) return { status: \"warn\", label: \"this repository has no remote Qore can match\" }\n const { matches } = await session.api.post<CliRepoResolve>(\"/api/cli/v1/repos/resolve\", { repoKeys: keys })\n const ids = [...new Set(matches.map((x) => x.module.id))]\n if (ids.length === 0) return { status: \"warn\", label: `this repository matches no module on ${portalLabel(portal)}` }\n if (ids.length > 1) {\n return { status: \"warn\", label: `this repository matches several modules (${[...new Set(matches.map((x) => x.module.slug))].join(\", \")})` }\n }\n return session.api.get<CliModuleDetail>(`/api/cli/v1/modules/${encodeURIComponent(ids[0]!)}`)\n}\n\n/** Every check as data (spec §14.3). Never fetches the local env, never installs or starts\n * anything, and writes no file; a token refresh during GET /me is the only side effect. */\nexport async function runDoctor(deps: Deps, o: { portal?: string; onRequest?: (l: string) => void; signal?: AbortSignal\n toolTimeoutMs?: number } = {}): Promise<DoctorReport> {\n const signal = o.signal ?? new AbortController().signal\n const toolMs = o.toolTimeoutMs ?? TOOL_TIMEOUT_MS\n const results: CheckResult[] = []\n const context: DoctorReport[\"context\"] = { kind: \"none\" }\n const push = async (id: string, group: CheckResult[\"group\"], fn: () => Promise<Body> | Body, module?: string) => {\n let body: Body\n try { body = await fn() } catch (e) {\n if (e instanceof ToolTimeout) body = { status: \"warn\", label: e.message, details: { timeoutMs: e.ms } }\n else if (isCancel(e, signal)) throw e\n else body = withError(\"fail\", errorLabel(e), e)\n }\n const r: CheckResult = { id, group, ...(module ? { module } : {}), ...body }\n results.push(r)\n return r\n }\n\n let cfg: QoreConfig\n try { cfg = await deps.config.read() } catch (e) {\n if (isCancel(e, signal)) throw e\n await push(\"config\", \"tools\", () => withError(\"fail\", errorLabel(e), e))\n cfg = { schemaVersion: 1, profiles: {} }\n }\n let ws: Workspace | null = null\n let wsError: unknown = null\n try { ws = await findWorkspace(deps.cwd, deps.home) } catch (e) { wsError = e }\n const portal = o.portal ? resolvePortal(o.portal, cfg.defaultProfile)\n : ws ? resolvePortal(ws.portal, undefined) : resolvePortal(undefined, cfg.defaultProfile)\n\n let meta: Meta\n try { meta = { ok: true, ...(await fetchMetaWithDate(deps.fetch, portal.apiOrigin)), fetchedAt: deps.now() } } catch (e) {\n if (isCancel(e, signal)) throw e\n meta = { ok: false, error: e }\n }\n\n await push(\"qore\", \"tools\", () => checkQore(deps, meta))\n await push(\"node\", \"tools\", () => checkOwnNode(deps))\n await push(\"git\", \"tools\", () => checkGit(deps, signal, toolMs))\n await push(\"github-ssh\", \"tools\", () => checkGithubSsh(deps, signal, toolMs))\n await push(\"docker\", \"tools\", () => checkDocker(deps, signal, toolMs))\n\n const sessions = new Map<string, Session>()\n let loggedIn: PortalRef[] = []\n try {\n loggedIn = await loggedInPortals(deps, cfg.profiles)\n if (loggedIn.length === 0) await push(\"session\", \"session\", () => ({ status: \"warn\", label: \"not logged in — qore login\" }))\n } catch (e) {\n if (isCancel(e, signal)) throw e\n await push(\"session\", \"session\", () => { throw e })\n }\n for (const p of loggedIn) {\n await push(`session:${portalLabel(p)}`, \"session\",\n () => checkSession(deps, p, o.onRequest, sessions, p.apiOrigin === portal.apiOrigin, signal))\n }\n\n await push(\"clock\", \"tools\", () => checkClock(meta))\n\n const session = sessions.get(portal.apiOrigin)\n const notChecked = () => push(\"modules\", \"workspace\",\n () => ({ status: \"warn\", label: `modules not checked — no working session for ${portalLabel(portal)}` }))\n const perModule = async (m: Mod, prepared: Prepared | null) => {\n if (!prepared?.recipe) return\n const { recipe, pkg } = prepared\n await push(`pm:${m.slug}`, \"workspace\", () => checkRepoPm(deps, m, recipe, signal, toolMs), m.slug)\n if (pkg?.engines?.node) await push(`node:${m.slug}`, \"workspace\", () => checkRepoNode(deps, m, recipe, pkg, signal, toolMs), m.slug)\n }\n\n if (wsError) {\n await push(\"context\", \"workspace\", () => { throw wsError })\n return { results, context }\n }\n const wsRoot = ws ? await workspaceRoot(deps).catch(() => null) : null\n const repoRoot = wsRoot ? null : await findRepoRoot(deps.cwd)\n\n if (wsRoot) {\n context.kind = \"workspace\"\n context.label = basename(wsRoot.root)\n if (!session) { await notChecked(); return { results, context } }\n let am: CliAppModules\n try {\n if (meta.ok) requireCapability(meta.meta, \"app.modules\", portal.apiOrigin)\n am = await workspaceAppModules(session, portal, wsRoot)\n } catch (e) {\n await push(\"modules\", \"workspace\", () => { throw e })\n return { results, context }\n }\n context.label = `${am.app.slug} (${am.app.tenant.name} / ${am.app.name})`\n const runs = runsAt(deps, wsRoot.root)\n for (const m of am.modules) await workspaceModule(deps, wsRoot, am, m, runs, signal, push, perModule)\n } else if (repoRoot) {\n context.kind = \"module\"\n context.label = basename(repoRoot)\n if (!session) { await notChecked(); return { results, context } }\n let d: CliModuleDetail | null = null\n try {\n const resolved = await resolveRepoModule(deps, session, portal, meta, repoRoot)\n if (\"status\" in resolved) await push(\"module\", \"workspace\", () => resolved)\n else d = resolved\n } catch (e) {\n if (isCancel(e, signal)) throw e\n await push(\"module\", \"workspace\", () => { throw e })\n }\n if (!d) return { results, context }\n context.label = `${d.tenant.name} / ${d.slug}`\n const m: Mod = { root: repoRoot, slug: d.slug, type: d.type, id: d.id, access: d.access }\n const runs = runsAt(deps, repoRoot)\n let prepared: Prepared | null = null\n await push(`module:${m.slug}`, \"workspace\", async () => (prepared = await moduleBody(deps, m, runs, signal)).body, m.slug)\n await perModule(m, prepared)\n }\n return { results, context }\n}\n\ntype PushFn = (id: string, group: CheckResult[\"group\"], fn: () => Promise<Body> | Body, module?: string) => Promise<CheckResult>\n\nasync function workspaceModule(deps: Deps, ws: Workspace, am: CliAppModules, m: CliAppModule, runs: () => Promise<RunRecord[]>, signal: AbortSignal,\n push: PushFn, perModule: (m: Mod, p: Prepared | null) => Promise<void>): Promise<void> {\n if (!isSafeSlug(m.slug)) {\n await push(`module:${m.slug}`, \"workspace\", () => ({ status: \"warn\", label: \"not a safe directory name — skipped\" }), m.slug)\n return\n }\n const mod: Mod = { root: join(ws.root, m.slug), slug: m.slug, type: m.type, id: m.id, access: m.access }\n let prepared: Prepared | null = null\n await push(`module:${m.slug}`, \"workspace\", async () => {\n const info = await deps.git.inspect(mod.root)\n const action = planWorkspace(ws.root, [m], { [m.slug]: info }, []).actions[0]!\n if (action.kind === \"clone\") return { status: \"warn\", label: `not cloned — ${notClonedReason(m, am)}` }\n if (action.kind !== \"present\") return { status: \"warn\", label: action.reason ?? action.kind }\n prepared = await moduleBody(deps, mod, runs, signal)\n return prepared.body\n }, m.slug)\n await perModule(mod, prepared)\n}\n","import { QoreError } from \"../errors.js\"\n\nexport const SSH_TEST_ARGS = [\"-T\", \"-o\", \"BatchMode=yes\", \"-o\", \"ConnectTimeout=5\", \"git@github.com\"]\nconst COMMAND = \"ssh -T git@github.com\"\n\n/** GitHub answers a working key with exit 1 and a greeting, so the greeting decides, not the code. */\nexport function classifySshTest(r: { code: number | null; spawnError?: string; tail: string[] }):\n { ok: true; user: string } | { ok: false; error: QoreError } {\n const text = r.tail.join(\"\\n\")\n const hi = /Hi ([^!\\s]+)! You've successfully authenticated/.exec(text)\n if (hi) return { ok: true, user: hi[1]! }\n const details = { protocol: \"ssh\" }\n if (r.spawnError) {\n return { ok: false, error: new QoreError(\"QORE_GIT_AUTH\", \"ssh is not installed or not on PATH\", {\n hint: \"Clone over https instead (the default for qore clone and qore sync).\", details: { ...details, reason: \"ssh-missing\" } }) }\n }\n if (/Permission denied \\(publickey\\)/.test(text)) {\n return { ok: false, error: new QoreError(\"QORE_GIT_AUTH\", \"GitHub refused your SSH key\", {\n hint: \"Add your key to GitHub (https://github.com/settings/keys) and your ssh agent, or keep cloning over https.\", details }) }\n }\n if (/Host key verification failed/.test(text)) {\n return { ok: false, error: new QoreError(\"QORE_GIT_AUTH\", \"ssh could not verify github.com's host key\", {\n hint: `Run \\`${COMMAND}\\` once to accept its host key (or to see why it changed).`, details: { ...details, reason: \"host-key\" } }) }\n }\n const last = r.tail.map((l) => l.trim()).filter(Boolean).slice(-3)\n return { ok: false, error: new QoreError(\"QORE_GIT_AUTH\", \"GitHub SSH did not answer as expected\", {\n hint: [...last, `\\`${COMMAND}\\``].join(\"\\n\"), details: { ...details, stderr: r.tail } }) }\n}\n","import { randomBytes } from \"node:crypto\"\nimport { chmod, realpath } from \"node:fs/promises\"\nimport { dirname, join, relative } from \"node:path\"\nimport type { Command } from \"commander\"\nimport { moduleDefaults, readRepoConfig } from \"../../core/context/repoConfig.js\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { fetchLocalEnv } from \"../../core/env/fetch.js\"\nimport { parseEnv } from \"../../core/env/merge.js\"\nimport { planPull, resolveTarget, type PullPlan } from \"../../core/env/pull.js\"\nimport { readOrNull, writeSecurely } from \"../../core/env/write.js\"\nimport { appFor, contextJson, moduleContextFor } from \"../context.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\nimport { ensureTrusted } from \"../trustPrompt.js\"\n\n/** Ruling T10-I1: spec §11.1 (\"values masked\") plus T8 (\"qore never prints values\")\n * override the brief's SDK maskSecret rule — every value in the conflict prompt is\n * masked, showing only its length, never its content (even for a non-sensitive key). */\nconst maskLen = (v: string | undefined) => (v === undefined ? \"(unset)\" : `•••• (${v.length} chars)`)\n\ntype Flags = { module?: string; app?: string; target?: string; usePortal?: boolean; yes?: boolean }\n\nexport function registerEnv(program: Command, ctx: CommandContext): void {\n const env = program.command(\"env\").description(\"Local environment\")\n env.command(\"pull\").description(\"Write this module's local secrets into its env file\")\n .option(\"--module <slug|id>\", \"the module (default: from this repository's git remote)\")\n .option(\"--app <slug|id>\", \"the app, when the module is part of several\")\n .option(\"--target <path>\", \"env file to write (inside the repository)\")\n .option(\"--use-portal\", \"take the portal's value for keys that differ locally\")\n .option(\"--yes\", \"trust this repository without asking\")\n .action(async (f: Flags) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const mc = await moduleContextFor(ctx, f, \"env pull\")\n if (!mc.repoRoot) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"env pull writes into a module repository\", { hint: \"cd into the module's repository.\" })\n }\n const app = await appFor(ctx, mc, f.app)\n const cfg = await readRepoConfig(mc.repoRoot)\n const defaults = moduleDefaults(mc.module.type)\n // R11: --target resolves against the cwd; .qore.json's envFile resolves against the\n // repository root. Both must still land inside the repository.\n // Ruling T10-ORDER: target → trust → fetch, so --yes never saves trust for a pull\n // whose target is then rejected.\n const target = f.target\n ? await resolveTarget(mc.repoRoot, f.target, deps.cwd)\n : await resolveTarget(mc.repoRoot, cfg.envFile ?? defaults.envFile)\n await ensureTrusted(ctx, mc, app, { yes: f.yes })\n const existing = await readOrNull(target)\n const example = existing === null ? await readOrNull(join(dirname(target), \".env.example\")) : null\n const local = await fetchLocalEnv(deps, mc, app)\n const inputs = {\n existing, example, fetched: local.env, managed: local.managedKeys,\n localSecrets: cfg.localSecrets ?? defaults.localSecrets,\n defaultChoice: f.usePortal ? \"use-portal\" as const : \"keep\" as const,\n random: () => randomBytes(32).toString(\"hex\"),\n }\n let plan = planPull(inputs)\n if (plan.conflicts.length && io.interactive && !f.usePortal) {\n const current = parseEnv(existing ?? example ?? \"\")\n const choices: Record<string, \"keep\" | \"use-portal\"> = {}\n let bulk: \"keep\" | \"use-portal\" | undefined\n for (const key of plan.conflicts) {\n if (bulk) { choices[key] = bulk; continue }\n const pick = await io.select<\"keep\" | \"portal\" | \"all\" | \"skip\">(\n `${key} differs (local ${maskLen(current.get(key))}, portal ${maskLen(local.env[key])})`,\n [{ name: \"keep local\", value: \"keep\" }, { name: \"use portal\", value: \"portal\" },\n { name: \"use portal for all\", value: \"all\" }, { name: \"keep local for all\", value: \"skip\" }])\n if (pick === \"all\") bulk = \"use-portal\"\n if (pick === \"skip\") bulk = \"keep\"\n choices[key] = pick === \"portal\" || pick === \"all\" ? \"use-portal\" : \"keep\"\n }\n plan = planPull({ ...inputs, choices })\n }\n // M5: when nothing changed, skip the write (and its rename/mtime bump — Next's dev\n // server reloads env on mtime change) and only enforce the 0600 mode.\n if (existing !== null && plan.text === existing) {\n await chmod(target, 0o600)\n } else {\n await writeSecurely(target, plan.text)\n }\n // resolveTarget resolved through realpath (e.g. macOS's /var → /private/var), so the\n // relative path must be computed against the repo root's realpath too.\n const rel = relative(await realpath(mc.repoRoot), target)\n if (g.json) {\n const names: Omit<PullPlan, \"text\"> = {\n created: plan.created, seededFromExample: plan.seededFromExample, added: plan.added,\n updated: plan.updated, kept: plan.kept, replaced: plan.replaced, unchanged: plan.unchanged, generated: plan.generated,\n }\n renderJson(io, { context: contextJson(mc, app), target: rel, ...names })\n return\n }\n if (plan.kept.length && !io.interactive) {\n io.err(`! ${plan.kept.length} key(s) differ locally and were kept: ${plan.kept.join(\", \")} — --use-portal takes the portal's values`)\n }\n const parts = [\n plan.added.length && `${plan.added.length} added`,\n plan.updated.length && `${plan.updated.length} updated (managed)`,\n plan.replaced.length && `${plan.replaced.length} replaced`,\n plan.kept.length && `${plan.kept.length} kept (differs locally; --use-portal to overwrite)`,\n plan.generated.length && `${plan.generated.length} generated`,\n ].filter(Boolean)\n io.out(`✓ ${rel}${plan.seededFromExample ? \" (created from .env.example)\" : \"\"} — ${parts.length ? parts.join(\", \") : \"up to date\"}`)\n })\n}\n","import * as oc from \"openid-client\"\nimport { CancelledError, QoreError } from \"../errors.js\"\nimport type { Fetch } from \"../api/http.js\"\nimport { isAbortError, networkError } from \"../api/http.js\"\n\nexport type DeviceStart = { userCode: string; verificationUri: string; verificationUriComplete?: string; expiresIn: number; handle: unknown }\nexport type TokenSet = { accessToken: string; refreshToken: string; expiresIn: number; scope: string; sub: string; email?: string }\n\nexport interface Oidc {\n startDevice(scope: string): Promise<DeviceStart>\n pollDevice(start: DeviceStart, signal: AbortSignal): Promise<TokenSet>\n refresh(rt: string, scope?: string): Promise<TokenSet>\n revoke(rt: string): Promise<void>\n}\n\nexport const LOGIN_SCOPE = \"openid profile email offline_access qore:read qore:local-env\"\n\nfunction decodeSub(accessToken: string): { sub: string; email?: string } {\n const part = accessToken.split(\".\")[1] ?? \"\"\n const claims = JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")) as { sub: string; email?: string }\n return { sub: claims.sub, email: claims.email }\n}\n\nfunction toTokenSet(t: oc.TokenEndpointResponse, fallbackRt?: string): TokenSet {\n const rt = t.refresh_token ?? fallbackRt\n if (!rt) throw new QoreError(\"QORE_INTERNAL\", \"Keycloak returned no refresh token\")\n return { accessToken: t.access_token, refreshToken: rt, expiresIn: t.expires_in ?? 600,\n scope: t.scope ?? \"\", ...decodeSub(t.access_token) }\n}\n\n/** Keycloak unreachable is QORE_AUTH_UNAVAILABLE (spec §7, §14; R19), not the portal's\n * QORE_API_UNREACHABLE — with the same network diagnosis (hint, reason, host). */\nfunction unreachable(e: unknown, host: string): QoreError {\n const n = networkError(e, host)\n return new QoreError(\"QORE_AUTH_UNAVAILABLE\", n.message, { hint: n.hint, details: n.details, cause: e })\n}\n\nexport function mapOidcError(e: unknown, host: string): Error {\n if (e instanceof QoreError || e instanceof CancelledError) return e\n // Ctrl+C aborts the request's signal; openid-client wraps that DOMException as\n // ClientError { code: \"OAUTH_ABORT\", cause }.\n if (isAbortError(e) || (e as { code?: unknown })?.code === \"OAUTH_ABORT\" || isAbortError((e as { cause?: unknown })?.cause)) {\n return new CancelledError()\n }\n const err = (e as { error?: string }).error\n if (err === \"access_denied\") return new QoreError(\"QORE_LOGIN_DENIED\", \"The login was denied in the browser\")\n if (err === \"expired_token\") return new QoreError(\"QORE_LOGIN_EXPIRED\", \"The login code expired\", { hint: \"Run `qore login` again.\" })\n if (err === \"invalid_grant\") return new QoreError(\"QORE_SESSION_EXPIRED\", \"Your session has ended\", { hint: \"Run `qore login`.\" })\n // a 5xx is not a ResponseBodyError: it arrives as OAUTH_RESPONSE_IS_NOT_CONFORM with the Response as cause\n const res = (e as { code?: unknown; cause?: unknown }).code === \"OAUTH_RESPONSE_IS_NOT_CONFORM\" ? (e as { cause?: unknown }).cause : undefined\n const status = (e as { status?: number }).status ?? (res instanceof Response ? res.status : undefined)\n if (status && status >= 500) return new QoreError(\"QORE_AUTH_UNAVAILABLE\", \"Keycloak is unavailable\", { status, cause: e })\n if (e instanceof TypeError) return unreachable(e, host)\n // openid-client sometimes wraps the raw fetch TypeError (DNS/TLS/connect/timeout) one\n // level deep, e.g. `new ClientError(\"something went wrong\", { cause: err })`.\n const cause = (e as { cause?: unknown })?.cause\n if (cause instanceof TypeError) return unreachable(cause, host)\n return new QoreError(\"QORE_AUTH_UNAVAILABLE\", \"Login failed\", { cause: e })\n}\n\nexport async function createOidc(opts: { issuer: string; clientId: string; fetch: Fetch }): Promise<Oidc> {\n const host = new URL(opts.issuer).host\n const execute = new URL(opts.issuer).protocol === \"http:\" ? [oc.allowInsecureRequests] : []\n let config: oc.Configuration\n try {\n config = await oc.discovery(new URL(opts.issuer), opts.clientId, undefined, oc.None(), {\n execute, [oc.customFetch]: opts.fetch as unknown as oc.CustomFetch,\n })\n } catch (e) { throw mapOidcError(e, host) }\n\n return {\n async startDevice(scope) {\n try {\n const r = await oc.initiateDeviceAuthorization(config, { scope })\n return { userCode: r.user_code, verificationUri: r.verification_uri,\n verificationUriComplete: r.verification_uri_complete, expiresIn: r.expires_in, handle: r }\n } catch (e) { throw mapOidcError(e, host) }\n },\n async pollDevice(start, signal) {\n try {\n const t = await oc.pollDeviceAuthorizationGrant(config, start.handle as oc.DeviceAuthorizationResponse, undefined, { signal })\n return toTokenSet(t)\n } catch (e) { throw mapOidcError(e, host) }\n },\n async refresh(rt, scope) {\n try {\n const t = await oc.refreshTokenGrant(config, rt, scope ? { scope } : undefined)\n return toTokenSet(t, rt)\n } catch (e) { throw mapOidcError(e, host) }\n },\n async revoke(rt) {\n try { await oc.tokenRevocation(config, rt, { token_type_hint: \"refresh_token\" }) }\n catch (e) { throw mapOidcError(e, host) }\n },\n }\n}\n","import type { WithLock } from \"../../platform/lock.js\"\nimport type { DeviceStart, Oidc, TokenSet } from \"./oidc.js\"\nimport { LOGIN_SCOPE } from \"./oidc.js\"\nimport type { TokenStore } from \"./tokenStore.js\"\n\nexport async function deviceLogin(opts: {\n oidc: Oidc\n store: TokenStore\n now: () => Date\n /** Shows the code. Polling already runs meanwhile; `settled` aborts once it succeeds or\n * fails, so a prompt waiting on the user (who may have opened the URL themselves) can end. */\n onCode: (s: DeviceStart, settled: AbortSignal) => void | Promise<void>\n signal: AbortSignal\n withLock?: WithLock\n lockName?: string\n}): Promise<TokenSet> {\n // Probe the keychain first: an unusable or denied keychain must fail before the user\n // approves anything in the browser (Review Focus #4), not after.\n await opts.store.getRefresh()\n const start = await opts.oidc.startDevice(LOGIN_SCOPE)\n const stopPoll = new AbortController()\n const settled = new AbortController()\n const poll = opts.oidc.pollDevice(start, AbortSignal.any([opts.signal, stopPoll.signal]))\n .finally(() => settled.abort())\n // Awaited below; this only keeps a poll that fails while onCode runs from counting as unhandled.\n poll.catch(() => {})\n try {\n await opts.onCode(start, settled.signal)\n } catch (e) {\n stopPoll.abort()\n // Approved just before onCode failed: that session is never stored, so end it server-side.\n const late = await poll.catch(() => null)\n if (late) await opts.oidc.revoke(late.refreshToken).catch(() => {})\n throw e\n }\n const t = await poll\n const at = opts.now()\n const write = async () => {\n // Refresh first: a crash between the two writes then leaves a usable session.\n await opts.store.setRefresh({ rt: t.refreshToken, sub: t.sub, scope: t.scope, obtainedAt: at.toISOString() })\n await opts.store.setAccess({ at: t.accessToken, expiresAt: new Date(at.getTime() + t.expiresIn * 1000).toISOString() })\n }\n try {\n if (opts.withLock && opts.lockName) await opts.withLock(opts.lockName, write)\n else await write()\n } catch (e) {\n // The new session cannot be kept: end it server-side and drop any half-written entry.\n // Both best-effort; the original (keychain) error is what the user needs to see.\n await opts.oidc.revoke(t.refreshToken).catch(() => {})\n await opts.store.clear().catch(() => {})\n throw e\n }\n return t\n}\n","import type { Command } from \"commander\"\nimport { fetchMeta, negotiate } from \"../../core/api/meta.js\"\nimport type { CliMe, CliMeta } from \"../../core/api/types.js\"\nimport { deviceLogin } from \"../../core/auth/login.js\"\nimport { TokenStore } from \"../../core/auth/tokenStore.js\"\nimport { profileHash, resolvePortal } from \"../../core/profiles.js\"\nimport { openSession } from \"../../core/session.js\"\nimport { requestLog, type CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\nexport function registerLogin(program: Command, ctx: CommandContext): void {\n program.command(\"login\").description(\"Log in with your Qore account\")\n .option(\"--no-browser\", \"only print the URL\")\n .action(async (cmd: { browser: boolean }) => {\n const { deps, io, signal } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n const meta: CliMeta = await fetchMeta(deps.fetch, portal.apiOrigin)\n const known = cfg.profiles[portal.apiOrigin]?.issuer\n const pinned = { ...portal, pinnedIssuer: portal.pinnedIssuer ?? known ?? null }\n if (!pinned.pinnedIssuer && portal.builtin === null) {\n io.err(`! Logging in to ${portal.apiOrigin}, identity provider ${meta.auth.issuer}`)\n }\n negotiate(meta, pinned, deps.version)\n const issuer = pinned.pinnedIssuer ?? meta.auth.issuer\n const hash = profileHash(portal.apiOrigin, issuer)\n const store = new TokenStore(deps.keychain, hash)\n const t = await deviceLogin({\n oidc: await deps.oidcFor(issuer), store, now: deps.now, signal,\n withLock: deps.withLock, lockName: hash,\n onCode: async (s, settled) => {\n const url = s.verificationUriComplete ?? s.verificationUri\n io.err(`! First copy your one-time code: ${s.userCode}`)\n if (io.interactive && cmd.browser) {\n try {\n await io.waitForEnter(` Press Enter to open ${url} (or open it yourself)`, AbortSignal.any([signal, settled]))\n } catch (e) {\n // Approved (or denied) in a browser the user opened themselves: nothing left to open.\n if (settled.aborted && !signal.aborted) return\n throw e\n }\n if (settled.aborted) return\n if (!(await io.openUrl(url))) io.err(` Open ${url} in a browser`)\n } else {\n io.err(` Open ${url} in a browser`)\n }\n },\n })\n await deps.config.update((c) => {\n c.profiles[portal.apiOrigin] = { ...c.profiles[portal.apiOrigin], apiOrigin: portal.apiOrigin, issuer,\n sub: t.sub, email: t.email, meta: { fetchedAt: deps.now().toISOString(), doc: meta } }\n if (g.portal || !c.defaultProfile) c.defaultProfile = portal.apiOrigin\n })\n const { api } = await openSession(deps, { ...portal, pinnedIssuer: issuer }, \"login\", requestLog(ctx))\n const me = await api.get<CliMe>(\"/api/cli/v1/me\")\n const prev = cfg.profiles[portal.apiOrigin]\n let active: { id: string; slug: string } | undefined =\n prev?.sub === t.sub && prev.activeTenant && me.tenants.some((x) => x.id === prev.activeTenant!.id)\n ? prev.activeTenant\n : undefined\n if (active) {\n // A previous session's active tenant is still valid for this sub: keep it, no re-selection.\n } else if (me.tenants.length === 0) {\n io.err(\"! Your account is not a developer in any organisation. Ask an admin to invite you as developer.\")\n } else if (me.tenants.length === 1) {\n active = { id: me.tenants[0]!.id, slug: me.tenants[0]!.slug }\n io.err(`✓ Using tenant ${me.tenants[0]!.name}`)\n } else if (io.interactive) {\n active = await io.select(\"Select a tenant\", me.tenants.map((x) => ({ name: `${x.name} ${x.role}`, value: { id: x.id, slug: x.slug } })))\n } else {\n io.err(`! You belong to ${me.tenants.length} tenants; choose one with \\`qore tenant use <slug>\\``)\n }\n await deps.config.update((c) => { c.profiles[portal.apiOrigin]!.activeTenant = active })\n const label = portal.builtin ?? portal.apiOrigin\n if (g.json) renderJson(io, { portal: label, email: me.email, activeTenant: active ?? null })\n else io.out(`✓ Logged in as ${me.email} (${label})`)\n })\n}\n","import type { Command } from \"commander\"\nimport { TokenStore } from \"../../core/auth/tokenStore.js\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { profileHash, resolvePortal } from \"../../core/profiles.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\nexport function registerLogout(program: Command, ctx: CommandContext): void {\n program.command(\"logout\").description(\"End the CLI session\")\n .option(\"--all\", \"log out of every portal\")\n .action(async (cmd: { all?: boolean }) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const targets = cmd.all ? Object.values(cfg.profiles)\n : [cfg.profiles[resolvePortal(g.portal, cfg.defaultProfile).apiOrigin]].filter((p) => p !== undefined)\n const done: string[] = []\n for (const p of targets) {\n const hash = profileHash(p.apiOrigin, p.issuer)\n const store = new TokenStore(deps.keychain, hash)\n const host = new URL(p.issuer).host\n // Read, revoke and clear under one lock, so a concurrent refresh cannot rotate the\n // RT between our read and the revoke (we would revoke a stale one) or resurrect it.\n await deps.withLock(hash, async () => {\n const rt = await store.getRefresh()\n if (rt) {\n try { await (await deps.oidcFor(p.issuer)).revoke(rt.rt) }\n catch (e) {\n const network = e instanceof QoreError && e.details?.reason !== undefined\n io.err(network\n ? `! Could not reach ${host}; the server session may persist until it expires.`\n : `! Could not revoke the session at ${host} (${e instanceof Error ? e.message : String(e)}); the server session may persist until it expires.`)\n }\n }\n await store.clear()\n })\n done.push(p.apiOrigin)\n }\n if (g.json) renderJson(io, { loggedOut: done })\n else if (done.length === 0) io.out(\"Not logged in\")\n else io.out(`✓ Logged out of ${done.map((o) => resolvePortal(o, undefined).builtin ?? o).join(\", \")}`)\n })\n}\n","import type { CliHealth } from \"../core/api/types.js\"\n\nexport function ago(iso: string | null, now: Date): string {\n if (!iso) return \"–\"\n const s = Math.max(0, Math.round((now.getTime() - new Date(iso).getTime()) / 1000))\n if (s < 60) return \"just now\"\n if (s < 3600) return `${Math.floor(s / 60)}m ago`\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`\n return `${Math.floor(s / 86400)}d ago`\n}\n\nconst pct = (f: number) => String(Number((f * 100).toFixed(2)))\n\nexport function uptime(h: CliHealth | null): string {\n if (!h) return \"–\"\n const kind = h.cause && h.kind !== \"up\" ? `${h.kind}: ${h.cause}` : h.kind\n return h.uptime24h === null ? kind : `${kind} (${pct(h.uptime24h)}% 24h)`\n}\n\nexport function table(rows: string[][]): string[] {\n const widths = rows[0]!.map((_, i) => Math.max(...rows.map((r) => (r[i] ?? \"\").length)))\n return rows.map((r) => \" \" + r.map((c, i) => (i === r.length - 1 ? c : c.padEnd(widths[i]!))).join(\" \"))\n}\n","import type { Command } from \"commander\"\nimport { ensureCapability } from \"../../core/api/capabilities.js\"\nimport type { CliModuleStatus } from \"../../core/api/types.js\"\nimport { flagPortal, workspaceAppModules, workspaceRoot } from \"../../core/context/resolver.js\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { openSession } from \"../../core/session.js\"\nimport { WORKSPACE_FILE, type Workspace } from \"../../core/workspace/file.js\"\nimport { appFor, contextJson, contextLine, moduleContextFor } from \"../context.js\"\nimport { ago, table, uptime } from \"../format.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\ntype Env = CliModuleStatus[\"environments\"][number]\nconst HEAD = [\"ENV\", \"DEPLOY\", \"COMMIT\", \"DEPLOYED\", \"APP HEALTH\"]\nconst envRow = (e: Env, now: Date) =>\n [e.name, e.paused ? \"paused\" : e.status, e.commit?.sha ?? \"–\", ago(e.commit?.deployedAt ?? null, now), uptime(e.health)]\n\n/** Spec §5.3: in a workspace root `status` is app-level — every module of the workspace app\n * that has a repository, in one table with a leading MODULE column. */\nasync function appStatus(ctx: CommandContext, ws: Workspace, appFlag?: string): Promise<void> {\n const { deps, io } = ctx\n const g = ctx.opts()\n const portal = await flagPortal(deps, g.portal, ws) // spec §3: --portal wins over the workspace\n const onRequest = g.verbose ? (l: string) => io.err(l) : undefined\n const session = await openSession(deps, portal, \"status\", onRequest)\n await ensureCapability(deps, portal.apiOrigin, \"app.modules\")\n await ensureCapability(deps, portal.apiOrigin, \"module.status\")\n const am = await workspaceAppModules(session, portal, ws)\n const { tenant, ...app } = am.app\n if (appFlag && appFlag !== app.id && appFlag !== app.slug) {\n throw new QoreError(\"QORE_RESOURCE_NOT_FOUND\", `This workspace is for ${app.slug}, not \"${appFlag}\"`, {\n hint: \"Pass --module <slug> --app <slug>.\",\n })\n }\n if (!g.json) io.err(`→ ${tenant.name} / ${app.name} (${WORKSPACE_FILE})`)\n const modules: { module: { id: string; slug: string; name: string; type: string }; environments: Env[] }[] = []\n for (const m of am.modules.filter((x) => x.repoUrl !== null)) {\n const st = await session.api.get<CliModuleStatus>(\n `/api/cli/v1/modules/${encodeURIComponent(m.id)}/status?app_id=${encodeURIComponent(app.id)}`)\n modules.push({ module: { id: m.id, slug: m.slug, name: m.name, type: m.type }, environments: st.environments })\n }\n if (g.json) {\n renderJson(io, { context: { portal: portal.builtin ?? portal.apiOrigin, tenant, app, source: WORKSPACE_FILE }, modules })\n return\n }\n if (modules.length === 0) { io.out(\"No modules with a repository yet.\"); return }\n const now = deps.now()\n const rows = [[\"MODULE\", ...HEAD], ...modules.flatMap(({ module, environments }) => environments.length === 0\n ? [[module.slug, \"–\", \"no environments yet\", \"–\", \"–\", \"–\"]]\n : environments.map((e) => [module.slug, ...envRow(e, now)]))]\n for (const line of table(rows)) io.out(line)\n}\n\nexport function registerStatus(program: Command, ctx: CommandContext): void {\n program.command(\"status\").description(\"Deployment and health per environment for this module (or, in a workspace root, the app)\")\n .option(\"--module <slug|id>\", \"the module (default: from this repository's git remote)\")\n .option(\"--app <slug|id>\", \"the app, when the module is part of several\")\n .action(async (flags: { module?: string; app?: string }) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n if (!flags.module) {\n const ws = await workspaceRoot(deps)\n if (ws) { await appStatus(ctx, ws, flags.app); return }\n }\n const mc = await moduleContextFor(ctx, flags, \"status\")\n await ensureCapability(deps, mc.portal.apiOrigin, \"module.status\")\n const app = await appFor(ctx, mc, flags.app)\n if (!g.json) io.err(contextLine(mc, app))\n const st = await mc.session.api.get<CliModuleStatus>(\n `/api/cli/v1/modules/${encodeURIComponent(mc.module.id)}/status?app_id=${encodeURIComponent(app.id)}`)\n if (g.json) { renderJson(io, { context: contextJson(mc, app), environments: st.environments }); return }\n if (st.environments.length === 0) { io.out(\"No environments yet.\"); return }\n const now = deps.now()\n const rows = [HEAD, ...st.environments.map((e) => envRow(e, now))]\n for (const line of table(rows)) io.out(line)\n })\n}\n","import { join, relative } from \"node:path\"\nimport { Option, type Command } from \"commander\"\nimport { ensureCapability } from \"../../core/api/capabilities.js\"\nimport type { CliAppModule } from \"../../core/api/types.js\"\nimport type { DirInfo } from \"../../platform/git.js\"\nimport { QoreError } from \"../../core/errors.js\"\nimport { openSession } from \"../../core/session.js\"\nimport { applyActions, syncPresent, type ModuleResult } from \"../../core/workspace/apply.js\"\nimport { findWorkspace } from \"../../core/workspace/file.js\"\nimport { flagPortal, workspaceAppModules } from \"../../core/context/resolver.js\"\nimport { planWorkspace } from \"../../core/workspace/plan.js\"\nimport { isSafeSlug, unsafeSlugError } from \"../../core/workspace/safety.js\"\nimport { strayRepos } from \"../../core/workspace/stray.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { reportWorkspaceRun } from \"../workspaceReport.js\"\n\n/** A `QoreError` thrown for one module/directory is that module's own failed result —\n * the caller keeps going with the rest (controller ruling: per-module isolation). */\nfunction asFailure(slug: string, e: unknown): ModuleResult {\n // Mirrors apply.ts's toFailure: git missing from PATH aborts the run once rather than\n // being reported once per module/directory.\n if (e instanceof QoreError && e.code !== \"QORE_GIT_UNAVAILABLE\") {\n return { slug, status: \"failed\", error: { code: e.code, message: e.message, hint: e.hint } }\n }\n throw e\n}\n\ntype Flags = { pull?: boolean; protocol: \"https\" | \"ssh\" }\n\nexport function registerSync(program: Command, ctx: CommandContext): void {\n program.command(\"sync\")\n .description(\"Clone new modules, fetch present ones, report removed and re-pointed ones\")\n .option(\"--pull\", \"fast-forward every clean present repository with an upstream\")\n .addOption(new Option(\"--protocol <https|ssh>\", \"clone URL protocol\").choices([\"https\", \"ssh\"]).default(\"https\"))\n .action(async (flags: Flags) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const ws = await findWorkspace(deps.cwd, deps.home)\n if (!ws) {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"Not inside a workspace\", { hint: \"Run `qore clone <app>` first.\" })\n }\n const portal = await flagPortal(deps, g.portal, ws) // spec §3: --portal wins over the workspace\n const onRequest = g.verbose ? (l: string) => io.err(l) : undefined\n const session = await openSession(deps, portal, \"sync\", onRequest)\n await ensureCapability(deps, portal.apiOrigin, \"app.modules\")\n const app = await workspaceAppModules(session, portal, ws)\n if (!g.json) io.err(`→ ${app.app.tenant.name} / ${app.app.name} (qore.workspace.json)`)\n\n const slugs = new Set(app.modules.map((m) => m.slug))\n const dirs: Record<string, DirInfo> = {}\n const earlyFailures: ModuleResult[] = []\n const modulesForPlan: CliAppModule[] = []\n for (const m of app.modules) {\n if (!isSafeSlug(m.slug)) {\n earlyFailures.push(asFailure(m.slug, unsafeSlugError(m.slug)))\n continue\n }\n try {\n dirs[m.slug] = await deps.git.inspect(join(ws.root, m.slug))\n modulesForPlan.push(m)\n } catch (e) {\n earlyFailures.push(asFailure(m.slug, e))\n }\n }\n const strays = await strayRepos(ws.root, slugs)\n\n const { actions, removed } = planWorkspace(ws.root, modulesForPlan, dirs, strays)\n const applied = await applyActions(deps, { portal, app, actions, protocol: flags.protocol, onResult: () => {} })\n await syncPresent(deps, applied, actions, Boolean(flags.pull), { app, protocol: flags.protocol })\n for (const r of applied) {\n if (r.status === \"cloned\" && r.dir) r.dir = relative(deps.cwd, r.dir) || \".\"\n }\n const removedResults: ModuleResult[] = removed.map((slug) => ({ slug, status: \"removed\", reason: \"not a module of this app — left in place\" }))\n const results = [...earlyFailures, ...applied, ...removedResults]\n\n const err = reportWorkspaceRun(io, results, Boolean(g.json))\n if (err) throw err\n })\n}\n","import type { Command } from \"commander\"\nimport type { CliMe } from \"../../core/api/types.js\"\nimport { QoreError, type Candidate } from \"../../core/errors.js\"\nimport { resolvePortal } from \"../../core/profiles.js\"\nimport { openSession } from \"../../core/session.js\"\nimport { requestLog, type CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\nexport function registerTenant(program: Command, ctx: CommandContext): void {\n const tenant = program.command(\"tenant\").description(\"Manage the active tenant\")\n\n tenant.command(\"list\").description(\"List tenants you have access to\")\n .action(async () => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n const { profile, api } = await openSession(deps, portal, \"tenant list\", requestLog(ctx))\n const me = await api.get<CliMe>(\"/api/cli/v1/me\")\n const activeId = profile.activeTenant?.id\n if (g.json) {\n renderJson(io, { tenants: me.tenants.map((t) => ({ ...t, active: t.id === activeId })) })\n return\n }\n for (const t of me.tenants) {\n const mark = t.id === activeId ? \"*\" : \" \"\n io.out(`${mark} ${t.name} ${t.role}`)\n }\n })\n\n tenant.command(\"use\").description(\"Set the active tenant\").argument(\"[slug]\", \"tenant slug\")\n .action(async (slug: string | undefined) => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n const { api } = await openSession(deps, portal, \"tenant use\", requestLog(ctx))\n const me = await api.get<CliMe>(\"/api/cli/v1/me\")\n const candidates: Candidate[] = me.tenants.map((t) => ({ kind: \"tenant\", id: t.id, slug: t.slug, name: t.name }))\n let chosen: { id: string; slug: string }\n if (slug) {\n const found = me.tenants.find((t) => t.slug === slug)\n if (!found) throw new QoreError(\"QORE_RESOURCE_NOT_FOUND\", `No tenant \"${slug}\" for this account`, { candidates })\n chosen = { id: found.id, slug: found.slug }\n } else if (io.interactive) {\n chosen = await io.select(\"Select a tenant\", me.tenants.map((t) => ({ name: `${t.name} ${t.role}`, value: { id: t.id, slug: t.slug } })))\n } else {\n throw new QoreError(\"QORE_CONTEXT_REQUIRED\", \"Which tenant? Pass a slug or run interactively.\", { candidates })\n }\n await deps.config.update((c) => { c.profiles[portal.apiOrigin]!.activeTenant = chosen })\n if (g.json) renderJson(io, { activeTenant: chosen })\n else io.out(`✓ Using tenant ${chosen.slug}`)\n })\n}\n","import type { Command } from \"commander\"\nimport { fetchMeta } from \"../../core/api/meta.js\"\nimport { CancelledError } from \"../../core/errors.js\"\nimport { resolvePortal } from \"../../core/profiles.js\"\nimport type { CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\nexport function registerVersion(program: Command, ctx: CommandContext): void {\n program.command(\"version\").description(\"Show the CLI and portal version\")\n .action(async () => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n let portalInfo: { apiVersions: string[]; minCliVersion: string; latestCliVersion: string; capabilities: string[] } | null = null\n try {\n const meta = await fetchMeta(deps.fetch, portal.apiOrigin)\n portalInfo = { apiVersions: meta.apiVersions, minCliVersion: meta.minCliVersion, latestCliVersion: meta.latestCliVersion, capabilities: meta.capabilities }\n } catch (e) {\n // A cancel is not \"unreachable\": Ctrl+C still exits 130.\n if (e instanceof CancelledError) throw e\n /* portal unreachable; report null below */\n }\n if (g.json) {\n renderJson(io, { cli: deps.version, portal: portalInfo })\n return\n }\n io.out(`qore ${deps.version}`)\n const label = portal.builtin ?? portal.apiOrigin\n if (portalInfo) {\n io.out(`portal ${label}: api ${portalInfo.apiVersions.join(\",\")}, min ${portalInfo.minCliVersion}, latest ${portalInfo.latestCliVersion}`)\n } else {\n io.out(`portal ${label}: unreachable`)\n }\n })\n}\n","import type { Command } from \"commander\"\nimport type { CliMe } from \"../../core/api/types.js\"\nimport { resolvePortal } from \"../../core/profiles.js\"\nimport { openSession } from \"../../core/session.js\"\nimport { requestLog, type CommandContext } from \"../program.js\"\nimport { renderJson } from \"../render.js\"\n\nexport function registerWhoami(program: Command, ctx: CommandContext): void {\n program.command(\"whoami\").description(\"Show who you're logged in as\")\n .action(async () => {\n const { deps, io } = ctx\n const g = ctx.opts()\n const cfg = await deps.config.read()\n const portal = resolvePortal(g.portal, cfg.defaultProfile)\n const { profile, api } = await openSession(deps, portal, \"whoami\", requestLog(ctx))\n const me = await api.get<CliMe>(\"/api/cli/v1/me\")\n const activeTenant = profile.activeTenant\n if (activeTenant && !me.tenants.some((t) => t.id === activeTenant.id)) {\n io.err(`! You no longer have developer access to ${activeTenant.slug}`)\n }\n const label = portal.builtin ?? portal.apiOrigin\n if (g.json) {\n renderJson(io, { portal: label, activeTenant: activeTenant ?? null, me })\n return\n }\n io.out(`${me.email} (${label})`)\n for (const t of me.tenants) {\n const mark = activeTenant?.id === t.id ? \"*\" : \" \"\n io.out(`${mark} ${t.name} ${t.role}`)\n for (const a of t.apps) {\n io.out(` ${a.slug} ${a.access}`)\n for (const m of a.modules) {\n io.out(` ${m.slug} ${m.type} ${m.access}`)\n }\n }\n }\n })\n}\n","import type { Register } from \"../program.js\"\nimport { registerClone } from \"./clone.js\"\nimport { registerDev } from \"./dev.js\"\nimport { registerDoctor } from \"./doctor.js\"\nimport { registerEnv } from \"./env.js\"\nimport { registerLogin } from \"./login.js\"\nimport { registerLogout } from \"./logout.js\"\nimport { registerRun } from \"./run.js\"\nimport { registerStatus } from \"./status.js\"\nimport { registerSync } from \"./sync.js\"\nimport { registerTenant } from \"./tenant.js\"\nimport { registerVersion } from \"./version.js\"\nimport { registerWhoami } from \"./whoami.js\"\n\nexport const COMMANDS: Register[] = [\n registerLogin, registerLogout, registerWhoami, registerTenant, registerStatus, registerEnv, registerRun, registerDev, registerClone, registerSync,\n registerVersion, registerDoctor,\n]\n","import { compareVersions } from \"../core/api/meta.js\"\nimport type { Deps } from \"../core/deps.js\"\nimport type { Io } from \"./io.js\"\n\nconst REGISTRY_URL = \"https://registry.npmjs.org/@quatronic%2Fqore/latest\"\nconst DAY_MS = 24 * 60 * 60 * 1000\nconst DEFAULT_TIMEOUT_MS = 1500\n\nexport async function maybeNotifyUpdate(deps: Deps, io: Io, o: { json: boolean }, timeoutMs = DEFAULT_TIMEOUT_MS): Promise<void> {\n if (o.json || deps.env.CI || deps.env.QORE_NO_UPDATE_CHECK === \"1\" || !io.interactive) return\n const cfg = await deps.config.read()\n const last = cfg.updateCheck?.lastCheckedAt\n if (last && deps.now().getTime() - new Date(last).getTime() < DAY_MS) return\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n let latest: string | undefined\n try {\n const res = await deps.fetch(REGISTRY_URL, { signal: controller.signal })\n if (res.ok) latest = ((await res.json()) as { version?: string }).version\n } catch { /* silent: an update check never affects the run */ }\n finally { clearTimeout(timer) }\n try {\n // Recorded after a failed, non-OK or timed-out check too, so an offline user does not\n // pay the timeout on every command; the last known latest version is kept then.\n await deps.config.update((c) => {\n c.updateCheck = { lastCheckedAt: deps.now().toISOString(), latest: latest ?? c.updateCheck?.latest ?? deps.version }\n })\n } catch { return }\n if (latest && compareVersions(latest, deps.version) > 0) {\n io.err(`A new qore is available: ${deps.version} → ${latest} npm i -g @quatronic/qore`)\n }\n}\n","import { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { QoreError } from \"./errors.js\"\nimport { writeJsonAtomic } from \"./jsonFile.js\"\n\nexport type ProfileRecord = {\n apiOrigin: string\n issuer: string\n sub?: string\n email?: string\n activeTenant?: { id: string; slug: string }\n meta?: { fetchedAt: string; doc: unknown }\n}\n\nexport type QoreConfig = {\n schemaVersion: 1\n defaultProfile?: string\n profiles: Record<string, ProfileRecord>\n updateCheck?: { lastCheckedAt: string; latest: string }\n trustedRepos?: Record<string, string[]>\n}\n\nconst empty = (): QoreConfig => ({ schemaVersion: 1, profiles: {} })\n\nexport class ConfigStore {\n constructor(readonly dir: string) {}\n\n private get file() { return join(this.dir, \"config.json\") }\n\n async read(): Promise<QoreConfig> {\n let raw: string\n try {\n raw = await readFile(this.file, \"utf8\")\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return empty()\n throw e\n }\n try {\n const parsed = JSON.parse(raw) as QoreConfig\n if (parsed.schemaVersion !== 1 || typeof parsed.profiles !== \"object\") throw new Error(\"shape\")\n return parsed\n } catch (cause) {\n throw new QoreError(\"QORE_CONTEXT_INVALID\", `Qore config is malformed: ${this.file}`, {\n hint: \"Fix or delete the file, then run `qore login` again\", cause,\n })\n }\n }\n\n async update(fn: (c: QoreConfig) => QoreConfig | void): Promise<QoreConfig> {\n const current = await this.read()\n const next = fn(current) ?? current\n await writeJsonAtomic(this.dir, \"config.json\", next)\n return next\n }\n}\n","import { execFile, execFileSync, type ExecFileOptions } from \"node:child_process\"\nimport { mkdir, readdir, stat } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { QoreError } from \"../core/errors.js\"\n\nexport type Remote = { name: string; url: string }\nexport type GitResult = { ok: true } | { ok: false; stderr: string; command: string }\nexport type RepoStatus =\n | { ok: true; dirty: boolean; branch: string | null; upstream: boolean; upstreamRef?: string; ahead?: number; behind?: number }\n | { ok: false; stderr: string; command: string }\nexport type DirInfo = { exists: boolean; empty: boolean; isRepo: boolean; remotes: Remote[] }\n\nexport interface Git {\n remotes(repoRoot: string): Promise<Remote[]>\n clone(url: string, dir: string): Promise<GitResult>\n fetch(repoRoot: string): Promise<GitResult>\n pullFfOnly(repoRoot: string): Promise<GitResult>\n status(repoRoot: string): Promise<RepoStatus>\n inspect(dir: string): Promise<DirInfo>\n}\n\nexport function parseRemotes(stdout: string): Remote[] {\n const seen = new Set<string>()\n const out: Remote[] = []\n for (const line of stdout.split(/\\r?\\n/)) {\n const m = /^(\\S+)\\t(.+) \\(fetch\\)$/.exec(line)\n if (!m || seen.has(m[1]!)) continue\n seen.add(m[1]!)\n out.push({ name: m[1]!, url: m[2]! })\n }\n return out\n}\n\n/** Parses `git status --porcelain=v2 --branch`. `ahead`/`behind` come from `# branch.ab`,\n * which git prints only with an upstream — they reflect the last fetch, never the remote now. */\nexport function parseStatus(stdout: string): Extract<RepoStatus, { ok: true }> {\n const s: Extract<RepoStatus, { ok: true }> = { ok: true, dirty: false, branch: null, upstream: false }\n for (const raw of stdout.split(\"\\n\")) {\n const line = raw.replace(/\\r$/, \"\")\n if (line.startsWith(\"# branch.head \")) {\n const name = line.slice(\"# branch.head \".length).trim()\n s.branch = name === \"(detached)\" ? null : name\n } else if (line.startsWith(\"# branch.upstream \")) {\n s.upstream = true\n s.upstreamRef = line.slice(\"# branch.upstream \".length).trim()\n } else if (line.startsWith(\"# branch.ab \")) {\n const m = /^# branch\\.ab \\+(\\d+) -(\\d+)$/.exec(line.trim())\n if (m) { s.ahead = Number(m[1]); s.behind = Number(m[2]) }\n } else if (line.startsWith(\"#\")) {\n continue\n } else if (line.trim().length > 0) {\n s.dirty = true\n }\n }\n return s\n}\n\n/** Whether the developer configured `core.sshCommand` themselves, keyed by the directory\n * git was asked about (\"\" = no repository: global/system config only). Cached for the\n * life of the process — it only decides whether `gitExecOptions()` injects its own\n * non-interactive default, so a value edited mid-process is not worth a git call on every\n * single invocation.\n *\n * For a repository command (fetch, pull, status, remote) the question is asked of THAT\n * repository — `git -C <repo> config --get core.sshCommand` — so a repo-local value and an\n * `includeIf \"gitdir:…\"`-scoped one are seen exactly as git itself would see them; an\n * injected `GIT_SSH_COMMAND` would otherwise override them (the environment variable beats\n * config). For `clone` there is no repository yet, so only global/system config is read:\n * a `core.sshCommand` that only an `includeIf \"gitdir:…\"` block would select for the\n * destination is NOT seen, and there `ssh -o BatchMode=yes` is injected. Known gap; the\n * remedy for such a setup is exporting `GIT_SSH_COMMAND` (which always wins). */\nconst configuredSshCommand = new Map<string, boolean>()\nexport function __resetSshCommandCacheForTests(): void { configuredSshCommand.clear() }\n\nfunction hasConfiguredSshCommand(repoDir?: string): boolean {\n const key = repoDir ?? \"\"\n let v = configuredSshCommand.get(key)\n if (v === undefined) {\n const args = repoDir ? [\"-C\", repoDir, \"config\", \"--get\", \"core.sshCommand\"] : [\"config\", \"--get\", \"core.sshCommand\"]\n try {\n v = execFileSync(\"git\", args, {\n cwd: homedir(),\n env: { ...process.env, LC_ALL: \"C\", GIT_TERMINAL_PROMPT: \"0\" },\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n windowsHide: true,\n timeout: 5000,\n })\n .toString().trim().length > 0\n } catch {\n v = false // unset (exit 1), not a repository, git missing: nothing of theirs to respect\n }\n configuredSshCommand.set(key, v)\n }\n return v\n}\n\n/** Options for every git child. `cwd` is pinned to the home directory because on\n * Windows a bare \"git\" is looked up in the child's cwd before PATH: running from a\n * cloned repo would execute a git.exe planted at its top level. `-C <root>` only\n * steers git after it has started, so the repo stays the directory git works in.\n * `LC_ALL=C` keeps output stable across locales; `GIT_TERMINAL_PROMPT=0` means git\n * never hangs on a credential prompt; `GIT_HTTP_LOW_SPEED_LIMIT/TIME` (unless the\n * developer set their own) make a stalled https transfer fail after a minute instead of\n * hanging forever. A non-interactive `GIT_SSH_COMMAND` is added only when the environment\n * (`GIT_SSH_COMMAND`/`GIT_SSH`) and the developer's own git config (`core.sshCommand`, as\n * seen from `repoDir` when given) are all silent on the matter — otherwise their choice\n * (an SSH agent wrapper, a jump host, ProxyCommand, …) wins untouched. */\nexport function gitExecOptions(repoDir?: string): ExecFileOptions {\n const env: NodeJS.ProcessEnv = { ...process.env, LC_ALL: \"C\", GIT_TERMINAL_PROMPT: \"0\" }\n if (!env.GIT_HTTP_LOW_SPEED_LIMIT) env.GIT_HTTP_LOW_SPEED_LIMIT = \"1000\"\n if (!env.GIT_HTTP_LOW_SPEED_TIME) env.GIT_HTTP_LOW_SPEED_TIME = \"60\"\n if (!env.GIT_SSH_COMMAND && !env.GIT_SSH && !hasConfiguredSshCommand(repoDir)) {\n env.GIT_SSH_COMMAND = \"ssh -o BatchMode=yes\"\n }\n return { cwd: homedir(), env, windowsHide: true, maxBuffer: 8 * 1024 * 1024 }\n}\n\n/** `repoDir` names the repository the command runs in (the `-C` argument), so the\n * `core.sshCommand` check is asked of that repository; omitted for `clone`. */\nfunction runGit(args: string[], repoDir?: string): Promise<{ code: number; stdout: string; stderr: string; err?: Error }> {\n return new Promise((resolve, reject) => {\n execFile(\"git\", args, gitExecOptions(repoDir), (err, stdout, stderr) => {\n if (err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n reject(new QoreError(\"QORE_GIT_UNAVAILABLE\", \"git is not installed or not on PATH\", {\n hint: \"Install git (https://git-scm.com/downloads) and open a new terminal.\" }))\n return\n }\n const code = err ? (typeof (err as { code?: unknown }).code === \"number\" ? (err as { code: number }).code : 1) : 0\n resolve({ code, stdout: String(stdout), stderr: String(stderr), err: err ?? undefined })\n })\n })\n}\n\nconst toResult = (r: { code: number; stderr: string }, command: string): GitResult =>\n r.code === 0 ? { ok: true } : { ok: false, stderr: r.stderr, command }\n\nasync function remotes(repoRoot: string): Promise<Remote[]> {\n const r = await runGit([\"-C\", repoRoot, \"remote\", \"-v\"], repoRoot)\n if (r.code !== 0) {\n const last = r.stderr.trim().split(/\\r?\\n/).pop() ?? \"\"\n throw new QoreError(\"QORE_INTERNAL\", `git remote -v failed in ${repoRoot}`, {\n hint: last || undefined, details: { command: \"git remote -v\", cwd: repoRoot }, cause: r.err })\n }\n return parseRemotes(r.stdout)\n}\n\n/** `-- <url> <dir>` so neither a URL nor a destination beginning with `-` can ever be\n * read as an option — `--` ends option parsing for the rest of the command line. */\nasync function clone(url: string, dir: string): Promise<GitResult> {\n await mkdir(dirname(dir), { recursive: true })\n const r = await runGit([\"clone\", \"--\", url, dir])\n return toResult(r, \"git clone\")\n}\n\n/** Plain `git fetch` — no `--prune`: sync never deletes anything, remote-tracking refs\n * included. */\nasync function fetch(repoRoot: string): Promise<GitResult> {\n const r = await runGit([\"-C\", repoRoot, \"fetch\"], repoRoot)\n return toResult(r, \"git fetch\")\n}\n\nasync function pullFfOnly(repoRoot: string): Promise<GitResult> {\n const r = await runGit([\"-C\", repoRoot, \"pull\", \"--no-rebase\", \"--ff-only\"], repoRoot)\n return toResult(r, \"git pull --no-rebase --ff-only\")\n}\n\n/** One call, `status --porcelain=v2 --branch`, so branch/upstream/dirty come from a\n * single consistent snapshot instead of three separate `rev-parse`s that can each\n * fail their own way. `--no-optional-locks` keeps a concurrent status read from\n * taking the index lock. A non-zero exit (not a repo, dubious ownership, …) is\n * reported as unmeasured — never folded into `dirty:false` — so the caller can\n * classify it instead of the platform layer guessing. */\nasync function status(repoRoot: string): Promise<RepoStatus> {\n const command = \"git status --porcelain=v2 --branch\"\n const r = await runGit([\"--no-optional-locks\", \"-C\", repoRoot, \"status\", \"--porcelain=v2\", \"--branch\"], repoRoot)\n if (r.code !== 0) return { ok: false, stderr: r.stderr, command }\n return parseStatus(r.stdout)\n}\n\nasync function statOrThrow(path: string): Promise<Awaited<ReturnType<typeof stat>> | undefined> {\n try {\n return await stat(path)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined\n throw new QoreError(\"QORE_INTERNAL\", `could not stat ${path}`, { cause: err })\n }\n}\n\nasync function inspect(dir: string): Promise<DirInfo> {\n const st = await statOrThrow(dir)\n if (!st) return { exists: false, empty: false, isRepo: false, remotes: [] }\n if (!st.isDirectory()) return { exists: true, empty: false, isRepo: false, remotes: [] }\n let entries: string[]\n try {\n entries = await readdir(dir)\n } catch (err) {\n throw new QoreError(\"QORE_INTERNAL\", `could not read ${dir}`, { cause: err })\n }\n const empty = entries.length === 0\n const isRepo = (await statOrThrow(join(dir, \".git\"))) !== undefined\n const dirRemotes = isRepo ? await remotes(dir) : []\n return { exists: true, empty, isRepo, remotes: dirRemotes }\n}\n\n/** Reading through git (not .git/config) means insteadOf rewrites and worktrees\n * behave exactly as git sees them (spec §2). */\nexport const systemGit: Git = { remotes, clone, fetch, pullFfOnly, status, inspect }\n","import { Entry } from \"@napi-rs/keyring\"\nimport { QoreError } from \"../core/errors.js\"\n\nexport interface Keychain {\n get(account: string): Promise<string | null>\n set(account: string, value: string): Promise<void>\n delete(account: string): Promise<void>\n}\n\nconst SERVICE = \"qore\"\nconst HINTS: Partial<Record<NodeJS.Platform, string>> = {\n linux: \"Install and unlock a Secret Service provider (gnome-keyring or KWallet); headless machines and containers have none.\",\n darwin: \"Unlock your login keychain in Keychain Access.\",\n win32: \"Windows Credential Manager must be available for your user.\",\n}\n\nexport function classifyKeychainError(e: unknown, platform: NodeJS.Platform): QoreError {\n const msg = e instanceof Error ? e.message : String(e)\n // keyring-rs Error::TooLong (\"… is longer than the platform limit of N chars\"): Windows\n // Credential Manager caps a credential blob (R18). Still UNAVAILABLE, but say what it is.\n if (/TooLong|longer than the platform limit/i.test(msg)) {\n return new QoreError(\"QORE_KEYCHAIN_UNAVAILABLE\", \"The session token is too large for the OS keychain\", {\n hint: platform === \"win32\"\n ? \"The token exceeds the Windows Credential Manager size limit. Report this to the Qore team.\"\n : \"The token exceeds the keychain's size limit. Report this to the Qore team.\",\n cause: e,\n })\n }\n if (/cancel|denied|errSecAuthFailed|user interaction/i.test(msg)) {\n return new QoreError(\"QORE_KEYCHAIN_DENIED\", \"Access to the OS keychain was denied\", {\n hint: \"Allow qore to use the keychain when your OS asks, then retry.\", cause: e,\n })\n }\n return new QoreError(\"QORE_KEYCHAIN_UNAVAILABLE\", \"No usable OS keychain\", {\n hint: HINTS[platform] ?? \"qore stores tokens only in the OS keychain.\", cause: e,\n })\n}\n\nexport class OsKeychain implements Keychain {\n constructor(private readonly platform: NodeJS.Platform = process.platform) {}\n\n private wrap<T>(fn: () => T): Promise<T> {\n try { return Promise.resolve(fn()) } catch (e) { return Promise.reject(classifyKeychainError(e, this.platform)) }\n }\n\n get(account: string) { return this.wrap(() => new Entry(SERVICE, account).getPassword() ?? null) }\n set(account: string, value: string) { return this.wrap(() => { new Entry(SERVICE, account).setPassword(value) }) }\n delete(account: string) {\n // deletePassword() returns false (rather than throwing) when there is no entry.\n return this.wrap(() => { new Entry(SERVICE, account).deletePassword() })\n }\n}\n","import { mkdir, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport lockfile from \"proper-lockfile\"\nimport { QoreError } from \"../core/errors.js\"\n\nexport type WithLock = <T>(name: string, fn: () => Promise<T>) => Promise<T>\n\nexport function fileLock(dir: string): WithLock {\n return async (name, fn) => {\n const locks = join(dir, \"locks\")\n await mkdir(locks, { recursive: true, mode: 0o700 })\n const target = join(locks, `${name}.lock`)\n await writeFile(target, \"\", { flag: \"a\" })\n let release: () => Promise<void>\n // proper-lockfile's default onCompromised throws from a timer (an uncaught crash). A\n // compromised lock (mtime update failed, or another process took it as stale) is only\n // recorded: the keychain writes under it are idempotent, and refresh re-reads the RT.\n let compromised: Error | undefined\n try {\n release = await lockfile.lock(target, {\n stale: 30_000,\n retries: { retries: 30, minTimeout: 100, maxTimeout: 1000, randomize: true },\n onCompromised: (err) => { compromised = err },\n })\n } catch (cause) {\n throw new QoreError(\"QORE_AUTH_BUSY\", \"Another qore process is refreshing the session\", { hint: \"Retry in a moment.\", cause })\n }\n try { return await fn() } finally {\n // After a compromise release() rejects (ERELEASED); that must not replace fn's outcome.\n await release().catch((e: unknown) => { if (!compromised) throw e })\n }\n }\n}\n","import { posix, win32 } from \"node:path\"\n\nexport function configDir(env: NodeJS.ProcessEnv, platform: NodeJS.Platform, home: string): string {\n if (platform === \"win32\") return win32.join(env.APPDATA ?? win32.join(home, \"AppData\", \"Roaming\"), \"qore\")\n // posix.join, not the host's join: the result is for the target platform, whatever the host\n // (tests run on Windows CI too).\n if (platform === \"darwin\") return posix.join(home, \"Library\", \"Application Support\", \"qore\")\n // XDG Base Directory spec: a relative $XDG_CONFIG_HOME is invalid and must be ignored.\n const xdg = env.XDG_CONFIG_HOME && posix.isAbsolute(env.XDG_CONFIG_HOME) ? env.XDG_CONFIG_HOME : undefined\n return posix.join(xdg ?? posix.join(home, \".config\"), \"qore\")\n}\n","import spawn from \"cross-spawn\"\nimport type { ChildProcess } from \"node:child_process\"\nimport { QoreError } from \"../core/errors.js\"\n\nexport type ChildExit = { code: number | null; signal: NodeJS.Signals | null }\nexport interface Spawner { run(cmd: string, args: string[], env: NodeJS.ProcessEnv, o?: { cwd?: string; onStderr?: (chunk: Buffer) => void }): Promise<ChildExit> }\n\n/** Which signals `crossSpawner` ignores (left to the terminal's own process-group\n * delivery) vs. forwards to the child, per platform. Exported so tests can derive\n * the expected lists for the platform they run on instead of hard-coding POSIX's. */\nexport function signalsFor(platform: NodeJS.Platform): { ignore: NodeJS.Signals[]; forward: NodeJS.Signals[] } {\n return platform === \"win32\"\n ? { ignore: [\"SIGINT\", \"SIGBREAK\"], forward: [] }\n : { ignore: [\"SIGINT\", \"SIGQUIT\"], forward: [\"SIGTERM\", \"SIGHUP\"] }\n}\n\nconst { ignore: IGNORE, forward: FORWARD } = signalsFor(process.platform)\n\n/** Node docs: stdio streams may still be open when `\"exit\"` fires. Bounded so a\n * surviving grandchild holding the pipe open can't hang `run` forever. */\nconst STDERR_DRAIN_MS = 500\n\n/** The slice of `process` that `crossSpawner` touches: signal handler registration.\n * Injectable so tests can drive signal ignore/forward behaviour with a fake child and\n * a fake signal source, without sending real signals to the test runner's own process. */\nexport interface ProcessSignals {\n on(signal: NodeJS.Signals, listener: () => void): void\n off(signal: NodeJS.Signals, listener: () => void): void\n}\n\ntype SpawnFn = (cmd: string, args: string[], opts: { stdio: \"inherit\" | [\"inherit\", \"inherit\", \"pipe\"]; shell: false; env: NodeJS.ProcessEnv; windowsHide: true; cwd?: string }) => ChildProcess\n\n/** Spec §11.2. The terminal delivers Ctrl+C / Ctrl+\\ to the whole foreground process\n * group, so forwarding them would double-signal the child: the parent only ignores\n * them and waits. SIGTERM/SIGHUP come to the parent alone and are passed on. */\nexport function makeSpawner(spawnFn: SpawnFn, proc: ProcessSignals): Spawner {\n return {\n run(cmd, args, env, o) {\n return new Promise((resolve, reject) => {\n let child: ChildProcess\n try {\n child = spawnFn(cmd, args, {\n stdio: o?.onStderr ? [\"inherit\", \"inherit\", \"pipe\"] : \"inherit\",\n shell: false, env, windowsHide: true, cwd: o?.cwd,\n })\n } catch (e) {\n // Node validates `options.env` synchronously (e.g. ERR_INVALID_ARG_VALUE for a\n // NUL byte in a value) and embeds the offending value in its message — never\n // pass that message through, only the error code, same as the \"error\" path below.\n reject(new QoreError(\"QORE_INTERNAL\", `Could not start ${cmd}: ${(e as NodeJS.ErrnoException).code ?? \"error\"}`))\n return\n }\n if (o?.onStderr) child.stderr?.on(\"data\", o.onStderr)\n const ignore = () => {}\n const forwarders = FORWARD.map((sig) => [sig, () => { child.kill(sig) }] as const)\n for (const sig of IGNORE) proc.on(sig, ignore)\n for (const [sig, fn] of forwarders) proc.on(sig, fn)\n const cleanup = () => {\n for (const sig of IGNORE) proc.off(sig, ignore)\n for (const [sig, fn] of forwarders) proc.off(sig, fn)\n }\n child.once(\"error\", (e: NodeJS.ErrnoException) => {\n cleanup()\n reject(e.code === \"ENOENT\"\n ? new QoreError(\"QORE_INTERNAL\", `Command not found: ${cmd}`, { hint: \"Check the command after --; it runs without a shell.\" })\n : new QoreError(\"QORE_INTERNAL\", `Could not start ${cmd}: ${e.code ?? \"error\"}`))\n })\n child.once(\"exit\", (code, signal) => {\n cleanup()\n const stderr = child.stderr\n if (!o?.onStderr || !stderr || stderr.readableEnded) { resolve({ code, signal }); return }\n let settled = false\n const finish = () => { if (settled) return; settled = true; clearTimeout(timer); resolve({ code, signal }) }\n const timer = setTimeout(finish, STDERR_DRAIN_MS)\n timer.unref?.()\n stderr.once(\"end\", finish)\n stderr.once(\"close\", finish)\n })\n })\n },\n }\n}\n\nexport const crossSpawner: Spawner = makeSpawner(spawn, process)\n","import spawn from \"cross-spawn\"\nimport type { ChildProcess } from \"node:child_process\"\n\nexport type OutLine = { stream: \"stdout\" | \"stderr\"; line: string }\nexport type LaunchExit = { code: number | null; signal: NodeJS.Signals | null; spawnError?: string }\nexport type Launched = { pid: number | null; exited: Promise<LaunchExit>; stop(signal: \"SIGTERM\" | \"SIGKILL\"): void }\nexport interface Launcher {\n launch(cmd: string, args: string[], o: { cwd: string; env: NodeJS.ProcessEnv; onLine: (l: OutLine) => void }): Launched\n isAlive(pid: number): boolean\n /** False when the process is gone or not ours to signal; `0` only probes. */\n signal(pid: number, sig: \"SIGTERM\" | 0): boolean\n}\n\n/** A child sharing the terminal with other modules' prefixed lines must not wipe the\n * whole screen or scrollback for output it doesn't own — strips `ESC c` (full reset)\n * and `ESC [2J`/`ESC [3J` (clear screen / clear scrollback) from each line. */\n// eslint-disable-next-line no-control-regex -- matching the literal ESC byte a terminal reset/clear sends\nconst RESET_OR_CLEAR = /\\x1Bc|\\x1B\\[[23]J/g\nfunction stripScreenClears(line: string): string {\n return line.includes(\"\\x1B\") ? line.replace(RESET_OR_CLEAR, \"\") : line\n}\n\nfunction lineSplitter(stream: OutLine[\"stream\"], onLine: (l: OutLine) => void) {\n let buf = \"\"\n return {\n push(chunk: string) {\n buf += chunk\n let i\n while ((i = buf.indexOf(\"\\n\")) >= 0) {\n onLine({ stream, line: stripScreenClears(buf.slice(0, i).replace(/\\r$/, \"\")) })\n buf = buf.slice(i + 1)\n }\n },\n flush() { if (buf) { onLine({ stream, line: stripScreenClears(buf.replace(/\\r$/, \"\")) }); buf = \"\" } },\n }\n}\n\n/** Each child leads its own process group (POSIX) or tree (Windows), and `stop` ends all of it. */\nexport const systemLauncher: Launcher = {\n launch(cmd, args, o) {\n const posix = process.platform !== \"win32\"\n let child: ChildProcess\n try {\n child = spawn(cmd, args, { cwd: o.cwd, env: o.env, stdio: [\"ignore\", \"pipe\", \"pipe\"], shell: false, detached: posix, windowsHide: true })\n } catch (e) {\n return { pid: null, exited: Promise.resolve({ code: null, signal: null, spawnError: (e as NodeJS.ErrnoException).code ?? \"error\" }), stop() {} }\n }\n const out = lineSplitter(\"stdout\", o.onLine)\n const err = lineSplitter(\"stderr\", o.onLine)\n child.stdout?.setEncoding(\"utf8\")\n child.stderr?.setEncoding(\"utf8\")\n child.stdout?.on(\"data\", (c: string) => out.push(c))\n child.stderr?.on(\"data\", (c: string) => err.push(c))\n let closed = false\n const exited = new Promise<LaunchExit>((resolve) => {\n child.once(\"error\", (e: NodeJS.ErrnoException) => resolve({ code: null, signal: null, spawnError: e.code ?? \"error\" }))\n child.once(\"close\", (code, signal) => { closed = true; out.flush(); err.flush(); resolve({ code, signal }) })\n })\n return {\n pid: child.pid ?? null,\n exited,\n stop(signal) {\n if (child.pid === undefined || closed) return\n if (posix) {\n // gated on `close`, not the leader's exit: a surviving grandchild must still get the SIGKILL\n try { process.kill(-child.pid, signal) } catch { /* group already gone */ }\n } else {\n // known gap: once the root has exited, taskkill /T can no longer reach an orphaned grandchild\n spawn(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", ...(signal === \"SIGKILL\" ? [\"/F\"] : [])],\n { stdio: \"ignore\", windowsHide: true }).on(\"error\", () => {})\n }\n },\n }\n },\n isAlive(pid) {\n try { process.kill(pid, 0); return true } catch (e) { return (e as NodeJS.ErrnoException).code === \"EPERM\" }\n },\n signal(pid, sig) {\n try { process.kill(pid, sig); return true } catch { return false }\n },\n}\n","import { execFile } from \"node:child_process\"\nimport { connect } from \"node:net\"\nimport { parseDockerPs, parseEtime, parseLsofCwd, type DockerPublisher } from \"../core/diagnostics/ports.js\"\n\nexport type PortOwner = { pid: number; command: string }\nexport interface Ports {\n inUse(port: number): Promise<boolean>\n waitFor(port: number, timeoutMs: number, signal: AbortSignal): Promise<boolean>\n waitFree(port: number, timeoutMs: number, signal: AbortSignal): Promise<boolean>\n owner(port: number): Promise<PortOwner | null>\n ownerDetail(pid: number): Promise<{ cwd: string | null; ageSeconds: number | null }>\n dockerPublisher(port: number): Promise<DockerPublisher | null>\n /** Null on win32, or when the process is gone. */\n parentPid(pid: number): Promise<number | null>\n}\n\nfunction accepts(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const s = connect({ host, port })\n const done = (v: boolean) => { s.destroy(); resolve(v) }\n s.setTimeout(500, () => done(false))\n s.once(\"connect\", () => done(true))\n s.once(\"error\", () => done(false))\n })\n}\n\nfunction run(cmd: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n execFile(cmd, args, { timeout: 2000, env: { ...process.env, LC_ALL: \"C\" }, windowsHide: true },\n (e, stdout) => resolve(e && !stdout ? null : String(stdout)))\n })\n}\n\n/** \"In use\" = something accepts a TCP connection on loopback (v4 or v6). A connect\n * probe never binds, so it cannot race the dev server it is checking for. */\nexport const systemPorts: Ports = {\n async inUse(port) {\n return (await accepts(\"127.0.0.1\", port)) || (await accepts(\"::1\", port))\n },\n async waitFor(port, timeoutMs, signal) {\n const until = Date.now() + timeoutMs\n while (!signal.aborted) {\n if (await this.inUse(port)) return true\n if (Date.now() >= until) return false\n await new Promise((r) => setTimeout(r, 250))\n }\n return false\n },\n async waitFree(port, timeoutMs, signal) {\n const until = Date.now() + timeoutMs\n while (!signal.aborted) {\n if (!(await this.inUse(port))) return true\n if (Date.now() >= until) return false\n await new Promise((r) => setTimeout(r, 250))\n }\n return false\n },\n async owner(port) {\n if (process.platform === \"win32\") {\n const out = await run(\"netstat\", [\"-ano\", \"-p\", \"TCP\"])\n const line = out?.split(/\\r?\\n/).find((l) => /LISTENING/.test(l) && new RegExp(`[:.]${port}\\\\s`).test(l))\n const pid = line ? Number(line.trim().split(/\\s+/).pop()) : NaN\n if (!Number.isInteger(pid) || pid <= 0) return null\n const task = await run(\"tasklist\", [\"/FI\", `PID eq ${pid}`, \"/FO\", \"CSV\", \"/NH\"])\n return { pid, command: task?.split(\",\")[0]?.replace(/\"/g, \"\").trim() || \"unknown\" }\n }\n const out = await run(\"lsof\", [\"-nP\", `-iTCP:${port}`, \"-sTCP:LISTEN\", \"-Fpc\"])\n const pid = Number(out?.match(/^p(\\d+)$/m)?.[1])\n if (!Number.isInteger(pid) || pid <= 0) return null\n return { pid, command: out?.match(/^c(.+)$/m)?.[1] ?? \"unknown\" }\n },\n async ownerDetail(pid) {\n if (process.platform === \"win32\") return { cwd: null, ageSeconds: null }\n const lsof = await run(\"lsof\", [\"-a\", \"-p\", String(pid), \"-d\", \"cwd\", \"-Fn\"])\n const ps = await run(\"ps\", [\"-o\", \"etime=\", \"-p\", String(pid)])\n return { cwd: lsof ? parseLsofCwd(lsof) : null, ageSeconds: ps ? parseEtime(ps.trim()) : null }\n },\n async dockerPublisher(port) {\n const out = await run(\"docker\", [\"ps\", \"--filter\", `publish=${port}`, \"--format\",\n '{{.ID}}\\t{{.Names}}\\t{{.Label \"com.docker.compose.project\"}}\\t{{.Label \"com.docker.compose.project.working_dir\"}}'])\n return out ? parseDockerPs(out) : null\n },\n async parentPid(pid) {\n if (process.platform === \"win32\") return null\n const n = Number((await run(\"ps\", [\"-o\", \"ppid=\", \"-p\", String(pid)]))?.trim())\n return Number.isInteger(n) && n > 0 ? n : null\n },\n}\n","import { execFile } from \"node:child_process\"\nimport { parseRegProxy, parseScutilProxy } from \"../core/diagnostics/proxy.js\"\n\nfunction run(cmd: string, args: string[]): Promise<string | null> {\n return new Promise((resolve) => {\n execFile(cmd, args, { timeout: 2000, env: { ...process.env, LC_ALL: \"C\" }, windowsHide: true },\n (e, stdout) => resolve(e && !stdout ? null : String(stdout)))\n })\n}\n\nasync function detect(platform: NodeJS.Platform): Promise<string | null> {\n try {\n if (platform === \"darwin\") {\n const out = await run(\"scutil\", [\"--proxy\"])\n return out ? parseScutilProxy(out) : null\n }\n if (platform === \"win32\") {\n const key = \"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\"\n const [enable, server] = await Promise.all([\n run(\"reg\", [\"query\", key, \"/v\", \"ProxyEnable\"]),\n run(\"reg\", [\"query\", key, \"/v\", \"ProxyServer\"]),\n ])\n const combined = [enable, server].filter(Boolean).join(\"\\n\")\n return combined ? parseRegProxy(combined) : null\n }\n return null\n } catch {\n return null\n }\n}\n\n/** Cached for the process lifetime: this only decides a hint's wording. */\nlet cached: Promise<string | null> | undefined\n\nexport function systemProxy(platform: NodeJS.Platform = process.platform): Promise<string | null> {\n if (!cached) cached = detect(platform).catch(() => null)\n return cached\n}\n\nexport function __resetSystemProxyCacheForTests(): void {\n cached = undefined\n}\n","/** \"HTTPS\" wins over \"HTTP\" when both are enabled (matches how browsers pick). */\nexport function parseScutilProxy(stdout: string): string | null {\n const value = (key: string) => stdout.match(new RegExp(`^\\\\s*${key}\\\\s*:\\\\s*(.+)$`, \"m\"))?.[1]?.trim()\n if (value(\"HTTPSEnable\") === \"1\") {\n const host = value(\"HTTPSProxy\")\n const port = value(\"HTTPSPort\")\n if (host && port) return `${host}:${port}`\n }\n if (value(\"HTTPEnable\") === \"1\") {\n const host = value(\"HTTPProxy\")\n const port = value(\"HTTPPort\")\n if (host && port) return `${host}:${port}`\n }\n return null\n}\n\n/** Combined output of the two `reg query ... /v ProxyEnable` and `... /v ProxyServer` calls. */\nexport function parseRegProxy(stdout: string): string | null {\n const enabled = /ProxyEnable\\s+REG_DWORD\\s+(0x[0-9a-fA-F]+)/.exec(stdout)?.[1]\n if (enabled?.toLowerCase() !== \"0x1\") return null\n return /ProxyServer\\s+REG_SZ\\s+(\\S+)/.exec(stdout)?.[1] ?? null\n}\n","declare const __QORE_VERSION__: string | undefined\n// tsup replaces __QORE_VERSION__ at build time; tests run from source and see \"0.0.0-dev\".\nexport const VERSION: string = typeof __QORE_VERSION__ === \"string\" ? __QORE_VERSION__ : \"0.0.0-dev\"\n"],"mappings":"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","names":["homedir","resolve","fetch","systemProxy","status","detail","pc","io","json","status","r","argv","line","deps","io","json","pc","join","relative","resolve","fetch","deps","cached","deps","deps","join","join","dir","TTL_MS","dir","join","sep","deps","join","dir","strayRepos","join","deps","join","randomBytes","mkdir","readFile","rename","writeFile","join","UUID","dir","join","readFile","mkdir","randomBytes","writeFile","rename","deps","label","ok","label","detail","io","json","deps","io","resolve","join","relative","randomBytes","realpath","constants","dirname","join","relative","readFile","join","invalid","readFile","join","dirname","join","resolve","dir","join","relative","UUID","remotes","deps","dir","relative","cached","unsupported","id","m","remote","join","pickApp","text","dirname","join","deps","line","text","realpath","dirname","isAbsolute","relative","resolve","relative","isAbsolute","realpath","resolve","dirname","chmod","readFile","rename","writeFile","randomBytes","basename","dirname","join","readFile","text","basename","randomBytes","join","dirname","writeFile","chmod","rename","createHash","realpath","join","deps","realpath","createHash","join","deps","join","dirname","text","deps","readFile","join","readFile","join","stat","join","text","line","line","deps","detail","ok","resolve","run","unlink","join","deps","dir","join","unlink","pickApp","access","ok","deps","io","run","line","ac","randomBytes","realpath","join","relative","GRACE_MS","resolve","ok","lstat","join","createColors","io","createColors","line","constants","deps","constants","deps","io","json","p","join","present","plan","missing","realpath","randomBytes","relative","s","line","str","dir","deps","join","dirname","usableLast","io","devEnv","constants","randomBytes","relative","realpath","access","pc","realpath","basename","join","text","label","status","deps","realpath","text","basename","join","deps","io","pc","randomBytes","chmod","realpath","dirname","join","relative","deps","io","join","dirname","randomBytes","chmod","relative","realpath","status","deps","io","label","deps","io","deps","io","line","join","relative","Option","asFailure","Option","deps","io","join","relative","deps","io","deps","io","label","deps","io","label","DAY_MS","deps","io","readFile","join","dir","join","readFile","mkdir","readdir","stat","dirname","join","line","resolve","dir","mkdir","dirname","stat","readdir","empty","join","mkdir","writeFile","join","dir","join","mkdir","writeFile","resolve","spawn","line","posix","resolve","execFile","resolve","run","execFile","out","line","pid","execFile","run","resolve","execFile","homedir","fetch"]}