@zleap-ai/sag-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +3109 -0
- package/dist/cli.js.map +1 -0
- package/package.json +78 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/agents/claude-code.ts","../src/core/errors.ts","../src/agents/adapter.ts","../src/agents/codex.ts","../src/agents/state.ts","../src/config/store.ts","../src/config/resolve.ts","../src/config/schema.ts","../src/config/paths.ts","../src/credentials/memory.ts","../src/credentials/keychain.ts","../src/docker/schemas.ts","../src/docker/client.ts","../src/mcp/verifier.ts","../src/mcp/failure.ts","../src/process/runner.ts","../src/program.ts","../src/api/schemas.ts","../src/api/client.ts","../src/agents/orchestrator.ts","../src/mcp/docker-stdio-provider.ts","../src/docker/discovery.ts","../src/commands/agent.ts","../src/commands/auth.ts","../src/commands/document.ts","../src/commands/mcp.ts","../src/commands/search.ts","../src/commands/source.ts","../src/core/context.ts","../src/core/result.ts","../src/diagnostics/doctor.ts","../src/output/human.ts","../src/output/redaction.ts","../src/output/json.ts"],"sourcesContent":["import { confirm, password, select } from \"@inquirer/prompts\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport { ClaudeCodeAdapter } from \"./agents/claude-code.js\";\nimport { CodexAdapter } from \"./agents/codex.js\";\nimport { ManagedConnectionStore } from \"./agents/state.js\";\nimport { ConfigStore } from \"./config/store.js\";\nimport { defaultConfigPath, defaultManagedConnectionsPath } from \"./config/paths.js\";\nimport { createCredentialStore } from \"./credentials/keychain.js\";\nimport { DockerClient } from \"./docker/client.js\";\nimport { McpVerifier } from \"./mcp/verifier.js\";\nimport { NodeProcessRunner } from \"./process/runner.js\";\nimport { defaultClientFactory, runCli, type CliDependencies } from \"./program.js\";\n\nconst credentialSelection = await createCredentialStore();\nif (credentialSelection.warning) {\n process.stderr.write(`Warning: ${credentialSelection.warning}\\n`);\n}\nconst processRunner = new NodeProcessRunner();\n\nconst dependencies: CliDependencies = {\n version: packageJson.version,\n environment: process.env,\n configStore: new ConfigStore(defaultConfigPath()),\n credentialStore: credentialSelection.store,\n createClient: defaultClientFactory,\n promptToken: () =>\n password({\n message: \"SAG Token\",\n mask: \"*\",\n }),\n confirm: (message) => confirm({ message, default: false }),\n writeStdout: (value) => process.stdout.write(value),\n writeStderr: (value) => process.stderr.write(value),\n localMcp: {\n docker: new DockerClient(processRunner),\n verifier: new McpVerifier(packageJson.version),\n state: new ManagedConnectionStore(defaultManagedConnectionsPath()),\n adapters: {\n codex: new CodexAdapter(processRunner),\n \"claude-code\": new ClaudeCodeAdapter(processRunner),\n },\n interactive: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n selectContainer: (candidates) =>\n select({\n message: \"Select the SAG API container\",\n choices: candidates.map((candidate) => ({\n name: `${candidate.name} (${candidate.composeProject ?? \"no Compose project\"})`,\n value: candidate.id,\n })),\n }),\n },\n};\n\nprocess.exitCode = await runCli(process.argv, dependencies);\n","{\n \"name\": \"@zleap-ai/sag-cli\",\n \"version\": \"0.2.0\",\n \"description\": \"Command-line client and diagnostics for SAG knowledge bases\",\n \"type\": \"module\",\n \"bin\": {\n \"sag\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsx src/cli.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint .\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"check\": \"npm run format:check && npm run lint && npm run typecheck && npm test && npm run build\",\n \"prepare\": \"husky\",\n \"commitlint\": \"commitlint\",\n \"changeset\": \"changeset\",\n \"version-packages\": \"changeset version\",\n \"release:check\": \"bash scripts/release.sh\",\n \"release\": \"bash scripts/release.sh --publish\"\n },\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.5.2\",\n \"@modelcontextprotocol/client\": \"^2.0.0\",\n \"commander\": \"^14.0.3\",\n \"proper-lockfile\": \"^4.1.2\",\n \"yaml\": \"^2.9.0\",\n \"zod\": \"^4.4.3\"\n },\n \"optionalDependencies\": {\n \"@napi-rs/keyring\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.31.1\",\n \"@commitlint/cli\": \"^20.0.0\",\n \"@commitlint/config-conventional\": \"^20.0.0\",\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^20.19.43\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"@typescript-eslint/eslint-plugin\": \"^8.65.0\",\n \"@typescript-eslint/parser\": \"^8.65.0\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^10.8.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^16.2.7\",\n \"prettier\": \"^3.9.6\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.23.1\",\n \"typescript\": \"^6.0.3\",\n \"vitest\": \"^4.1.10\"\n },\n \"lint-staged\": {\n \"*.{ts,js,mjs,cjs}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\nimport type { ProcessResult, ProcessRunner } from \"../process/runner.js\";\nimport {\n fingerprintConnection,\n type AgentAdapter,\n type AgentConnection,\n type AgentInstallation,\n type AgentScope,\n} from \"./adapter.js\";\n\nconst claudeConfigSchema = z.object({\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst claudeEntrySchema = z.object({\n type: z.literal(\"stdio\").optional(),\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\nexport interface ClaudeCodeAdapterOptions {\n configPath?: string;\n readConfig?(): Promise<string>;\n}\n\nfunction invalidSpec(): CliError {\n return new CliError(\n \"INVALID_ARGUMENT\",\n \"Claude Code v0.2 supports Docker stdio MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction hostFailure(message: string, cause?: unknown): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n ...(cause ? { cause } : {}),\n hint: \"Run `claude mcp list` to inspect the current Claude Code MCP configuration.\",\n });\n}\n\nfunction ensureSuccess(result: ProcessResult, action: string): void {\n if (result.exitCode !== 0) {\n throw hostFailure(`Claude Code failed to ${action}`);\n }\n}\n\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly id = \"claude-code\" as const;\n private readonly readConfig: () => Promise<string>;\n\n constructor(\n private readonly runner: ProcessRunner,\n options: ClaudeCodeAdapterOptions = {},\n ) {\n const configPath = options.configPath ?? path.join(os.homedir(), \".claude.json\");\n this.readConfig =\n options.readConfig ??\n (() =>\n readFile(configPath, \"utf8\").catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return \"{}\";\n throw error;\n }));\n }\n\n async detect(): Promise<AgentInstallation> {\n try {\n const result = await this.runner.run({\n command: \"claude\",\n args: [\"--version\"],\n timeoutMs: 5_000,\n });\n if (result.exitCode !== 0) {\n throw new Error(\"Claude Code returned an error\");\n }\n return { id: this.id, version: result.stdout.trim() };\n } catch (cause) {\n throw new CliError(\"HOST_NOT_FOUND\", \"Claude Code CLI was not found\", {\n exitCode: exitCodes.hostNotFound,\n cause,\n hint: \"Install Claude Code and ensure `claude` is available on PATH.\",\n });\n }\n }\n\n async read(name: string, scope: AgentScope): Promise<AgentConnection | null> {\n try {\n const config = claudeConfigSchema.parse(JSON.parse(await this.readConfig()));\n const rawEntry = config.mcpServers?.[name];\n if (!rawEntry) return null;\n const entry = claudeEntrySchema.parse(rawEntry);\n const spec: McpConnectionSpec = {\n transport: \"stdio\",\n command: entry.command,\n args: entry.args ?? [],\n env: entry.env ?? {},\n };\n return {\n agent: this.id,\n name,\n scope,\n spec,\n fingerprint: fingerprintConnection(spec),\n };\n } catch (cause) {\n throw hostFailure(\"Claude Code user MCP configuration is invalid\", cause);\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (spec.transport !== \"stdio\" || Object.keys(spec.env).length) {\n throw invalidSpec();\n }\n ensureSuccess(\n await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"add\", \"--scope\", scope, name, \"--\", spec.command, ...spec.args],\n timeoutMs: 15_000,\n }),\n \"add the MCP server\",\n );\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n ensureSuccess(\n await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"remove\", \"--scope\", scope, name],\n timeoutMs: 15_000,\n }),\n \"remove the MCP server\",\n );\n }\n}\n","export type CliErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"NETWORK_UNREACHABLE\"\n | \"SERVICE_NOT_READY\"\n | \"AUTH_REQUIRED\"\n | \"PERMISSION_DENIED\"\n | \"RESOURCE_NOT_FOUND\"\n | \"DOCUMENT_NOT_READY\"\n | \"MCP_FAILED\"\n | \"HOST_NOT_FOUND\"\n | \"HOST_CONFIG_FAILED\"\n | \"CONFIG_CONFLICT\"\n | \"DEPENDENCY_MISSING\"\n | \"INVALID_RESPONSE\"\n | \"INTERNAL_ERROR\";\n\nexport interface CliErrorShape {\n code: CliErrorCode;\n message: string;\n hint?: string;\n}\n\nexport interface CliErrorOptions {\n exitCode: number;\n hint?: string;\n cause?: unknown;\n}\n\nexport class CliError extends Error {\n readonly code: CliErrorCode;\n readonly exitCode: number;\n readonly hint: string | undefined;\n override readonly cause: unknown;\n\n constructor(code: CliErrorCode, message: string, options: CliErrorOptions) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = options.exitCode;\n this.hint = options.hint;\n this.cause = options.cause;\n }\n\n toShape(): CliErrorShape {\n return {\n code: this.code,\n message: this.message,\n ...(this.hint ? { hint: this.hint } : {}),\n };\n }\n}\n\nexport const exitCodes = {\n success: 0,\n invalidArgument: 2,\n networkUnreachable: 10,\n serviceNotReady: 11,\n authRequired: 20,\n permissionDenied: 21,\n resourceNotFound: 30,\n documentNotReady: 31,\n mcpFailed: 40,\n hostNotFound: 41,\n hostConfigFailed: 42,\n configConflict: 50,\n dependencyMissing: 60,\n internalError: 70,\n} as const;\n\nexport function toCliError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n return new CliError(\"INTERNAL_ERROR\", \"Unexpected internal error\", {\n exitCode: exitCodes.internalError,\n cause: error,\n hint: \"Run again with SAG_DEBUG=1 for technical details.\",\n });\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\n\nexport type AgentId = \"codex\" | \"claude-code\";\nexport type AgentScope = \"user\";\n\nexport interface AgentInstallation {\n id: AgentId;\n version: string;\n}\n\nexport interface AgentConnection {\n agent: AgentId;\n name: string;\n scope: AgentScope;\n spec: McpConnectionSpec;\n fingerprint: string;\n}\n\nexport interface AgentAdapter {\n readonly id: AgentId;\n detect(): Promise<AgentInstallation>;\n read(name: string, scope: AgentScope): Promise<AgentConnection | null>;\n add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void>;\n remove(name: string, scope: AgentScope): Promise<void>;\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(canonicalize);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, canonicalize(nested)]),\n );\n }\n return value;\n}\n\nexport function fingerprintValue(value: unknown): string {\n const canonical = JSON.stringify(canonicalize(value));\n return `sha256:${createHash(\"sha256\").update(canonical).digest(\"hex\")}`;\n}\n\nexport function fingerprintConnection(spec: McpConnectionSpec): string {\n return fingerprintValue(spec);\n}\n\nexport function connectionKey(\n agent: AgentId,\n scope: AgentScope,\n serverName: string,\n): string {\n return `${agent}:${scope}:${serverName}`;\n}\n","import { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\nimport type { ProcessResult, ProcessRunner } from \"../process/runner.js\";\nimport {\n fingerprintValue,\n type AgentAdapter,\n type AgentConnection,\n type AgentInstallation,\n type AgentScope,\n} from \"./adapter.js\";\n\nconst codexEntrySchema = z\n .object({\n name: z.string().optional(),\n enabled: z.boolean(),\n disabled_reason: z.unknown().optional(),\n transport: z\n .object({\n type: z.literal(\"stdio\"),\n command: z.string().min(1),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).nullish(),\n })\n .passthrough(),\n startup_timeout_sec: z.number().nullish(),\n tool_timeout_sec: z.number().nullish(),\n auth_status: z.unknown().optional(),\n })\n .passthrough();\n\nconst CODEX_STATUS_FIELDS = new Set([\"name\", \"disabled_reason\", \"auth_status\"]);\n\nfunction invalidSpec(): CliError {\n return new CliError(\n \"INVALID_ARGUMENT\",\n \"Codex v0.2 supports Docker stdio MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction hostFailure(message: string, cause?: unknown): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n ...(cause ? { cause } : {}),\n hint: \"Run `codex mcp list` to inspect the current Codex MCP configuration.\",\n });\n}\n\nfunction ensureSuccess(result: ProcessResult, action: string): void {\n if (result.exitCode !== 0) {\n throw hostFailure(`Codex failed to ${action}`);\n }\n}\n\nexport class CodexAdapter implements AgentAdapter {\n readonly id = \"codex\" as const;\n\n constructor(private readonly runner: ProcessRunner) {}\n\n async detect(): Promise<AgentInstallation> {\n try {\n const result = await this.runner.run({\n command: \"codex\",\n args: [\"--version\"],\n timeoutMs: 5_000,\n });\n if (result.exitCode !== 0) throw new Error(\"Codex returned an error\");\n return { id: this.id, version: result.stdout.trim() };\n } catch (cause) {\n throw new CliError(\"HOST_NOT_FOUND\", \"Codex CLI was not found\", {\n exitCode: exitCodes.hostNotFound,\n cause,\n hint: \"Install Codex CLI and ensure `codex` is available on PATH.\",\n });\n }\n }\n\n async read(name: string, scope: AgentScope): Promise<AgentConnection | null> {\n const result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"get\", name, \"--json\"],\n timeoutMs: 15_000,\n });\n if (result.exitCode !== 0) {\n if (/not found|does not exist|no mcp server/iu.test(result.stderr)) {\n return null;\n }\n throw hostFailure(\"Codex failed to read the MCP configuration\");\n }\n try {\n const entry = codexEntrySchema.parse(JSON.parse(result.stdout));\n const spec: McpConnectionSpec = {\n transport: \"stdio\",\n command: entry.transport.command,\n args: entry.transport.args ?? [],\n env: entry.transport.env ?? {},\n };\n const configuration = Object.fromEntries(\n Object.entries(entry).filter(([key]) => !CODEX_STATUS_FIELDS.has(key)),\n );\n return {\n agent: this.id,\n name,\n scope,\n spec,\n fingerprint: fingerprintValue(configuration),\n };\n } catch (cause) {\n throw hostFailure(\"Codex returned an invalid MCP configuration\", cause);\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (\n scope !== \"user\" ||\n spec.transport !== \"stdio\" ||\n Object.keys(spec.env).length\n ) {\n throw invalidSpec();\n }\n ensureSuccess(\n await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"add\", name, \"--\", spec.command, ...spec.args],\n timeoutMs: 15_000,\n }),\n \"add the MCP server\",\n );\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n ensureSuccess(\n await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"remove\", name],\n timeoutMs: 15_000,\n }),\n \"remove the MCP server\",\n );\n }\n}\n","import { chmod, mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { parse, stringify } from \"yaml\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport { connectionKey, type AgentId, type AgentScope } from \"./adapter.js\";\n\nconst managedConnectionSchema = z.strictObject({\n agent: z.enum([\"codex\", \"claude-code\"]),\n provider: z.literal(\"docker-stdio\"),\n profile: z.string().min(1),\n serverName: z.string().min(1),\n docker: z.strictObject({\n composeProject: z.string().min(1).optional(),\n composeService: z.string().min(1).optional(),\n containerName: z.string().min(1),\n }),\n sourceId: z.string().min(1).nullable(),\n scope: z.literal(\"user\"),\n fingerprint: z.string().regex(/^sha256:[a-f0-9]{64}$/u),\n createdAt: z.string().min(1),\n});\n\nconst managedConnectionsSchema = z.strictObject({\n version: z.literal(1),\n connections: z.record(z.string(), managedConnectionSchema),\n});\n\nexport type ManagedConnection = z.infer<typeof managedConnectionSchema>;\n\nexport interface ManagedConnections {\n version: 1;\n connections: Record<string, ManagedConnection>;\n}\n\nfunction emptyState(): ManagedConnections {\n return { version: 1, connections: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"Managed connection state is invalid\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `Review or restore ${filePath}.`,\n });\n}\n\nexport class ManagedConnectionStore {\n constructor(readonly filePath: string) {}\n\n async #withLock<T>(operation: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(this.filePath, {\n realpath: false,\n stale: 10_000,\n update: 2_000,\n retries: {\n retries: 40,\n factor: 1,\n minTimeout: 25,\n maxTimeout: 100,\n },\n });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"Managed connection state is busy\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"Wait for the other SAG CLI Agent command to finish and retry.\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<ManagedConnections> {\n let raw: string;\n try {\n raw = await readFile(this.filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return emptyState();\n }\n throw error;\n }\n try {\n return managedConnectionsSchema.parse(parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #saveUnlocked(state: ManagedConnections): Promise<void> {\n let validated: ManagedConnections;\n try {\n validated = managedConnectionsSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n\n const directory = path.dirname(this.filePath);\n await mkdir(directory, { recursive: true });\n const temporaryPath = path.join(\n directory,\n `.${path.basename(this.filePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, stringify(validated), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, this.filePath);\n await chmod(this.filePath, 0o600);\n } catch (error) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n\n async save(state: ManagedConnections): Promise<void> {\n await this.#withLock(() => this.#saveUnlocked(state));\n }\n\n async get(key: string): Promise<ManagedConnection | null> {\n return (await this.load()).connections[key] ?? null;\n }\n\n async set(connection: ManagedConnection): Promise<void> {\n const validated = (() => {\n try {\n return managedConnectionSchema.parse(connection);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n })();\n await this.#withLock(async () => {\n const state = await this.load();\n const key = connectionKey(validated.agent, validated.scope, validated.serverName);\n state.connections[key] = validated;\n await this.#saveUnlocked(state);\n });\n }\n\n async delete(key: string): Promise<void> {\n await this.#withLock(async () => {\n const state = await this.load();\n delete state.connections[key];\n await this.#saveUnlocked(state);\n });\n }\n\n async list(input?: {\n agent?: AgentId;\n scope?: AgentScope;\n }): Promise<ManagedConnection[]> {\n return Object.values((await this.load()).connections).filter(\n (connection) =>\n (!input?.agent || connection.agent === input.agent) &&\n (!input?.scope || connection.scope === input.scope),\n );\n }\n}\n","import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { parse, stringify } from \"yaml\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport { normalizeOrigin, validateProfileName } from \"./resolve.js\";\nimport {\n cliConfigSchema,\n emptyConfig,\n type CliConfig,\n type Profile,\n} from \"./schema.js\";\n\nexport interface ProfileSummary extends Profile {\n name: string;\n current: boolean;\n}\n\nexport class ConfigStore {\n constructor(readonly filePath: string) {}\n\n async load(): Promise<CliConfig> {\n let raw: string;\n try {\n raw = await readFile(this.filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return emptyConfig();\n }\n throw error;\n }\n\n try {\n return cliConfigSchema.parse(parse(raw));\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"CLI config is invalid\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `Review or restore ${this.filePath}.`,\n });\n }\n }\n\n async save(config: CliConfig): Promise<void> {\n const validated = cliConfigSchema.parse(config);\n const directory = path.dirname(this.filePath);\n await mkdir(directory, { recursive: true });\n const temporaryPath = path.join(\n directory,\n `.${path.basename(this.filePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, stringify(validated), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n\n async addProfile(name: string, url: string): Promise<ProfileSummary> {\n validateProfileName(name);\n const normalizedUrl = normalizeOrigin(url);\n const config = await this.load();\n const existing = config.profiles[name];\n if (existing && existing.url !== normalizedUrl) {\n throw new CliError(\n \"CONFIG_CONFLICT\",\n `Profile already points to a different SAG origin: ${name}`,\n {\n exitCode: exitCodes.configConflict,\n hint: \"Remove the profile first or choose another name.\",\n },\n );\n }\n const profile: Profile = existing ?? {\n url: normalizedUrl,\n credentialRef: `sag-cli/${name}`,\n };\n config.profiles[name] = profile;\n config.currentProfile ??= name;\n await this.save(config);\n return {\n name,\n current: config.currentProfile === name,\n ...profile,\n };\n }\n\n async listProfiles(): Promise<ProfileSummary[]> {\n const config = await this.load();\n return Object.entries(config.profiles)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, profile]) => ({\n name,\n current: config.currentProfile === name,\n ...profile,\n }));\n }\n\n async getProfile(name?: string): Promise<ProfileSummary> {\n const config = await this.load();\n const selectedName = name ?? config.currentProfile;\n if (!selectedName || !config.profiles[selectedName]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", \"Profile not found\", {\n exitCode: exitCodes.resourceNotFound,\n hint: \"Run `sag profile add <name> <url>` first.\",\n });\n }\n return {\n name: selectedName,\n current: config.currentProfile === selectedName,\n ...config.profiles[selectedName],\n };\n }\n\n async useProfile(name: string): Promise<ProfileSummary> {\n const config = await this.load();\n validateProfileName(name);\n const profile = config.profiles[name];\n if (!profile) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `Profile not found: ${name}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n config.currentProfile = name;\n await this.save(config);\n return { name, current: true, ...profile };\n }\n\n async removeProfile(name: string): Promise<void> {\n const config = await this.load();\n validateProfileName(name);\n if (!config.profiles[name]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `Profile not found: ${name}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n delete config.profiles[name];\n if (config.currentProfile === name) {\n config.currentProfile = Object.keys(config.profiles).sort()[0];\n if (!config.currentProfile) {\n delete config.currentProfile;\n }\n }\n await this.save(config);\n }\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { CliConfig, Profile } from \"./schema.js\";\n\nconst PROFILE_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/u;\nconst STRIPPED_PATHS = new Set([\"/\", \"/api/v1\", \"/api/v1/\", \"/mcp\", \"/mcp/\"]);\n\nexport type ConnectionSource =\n | \"explicit-url\"\n | \"explicit-profile\"\n | \"environment-url\"\n | \"environment-profile\"\n | \"current-profile\"\n | \"local-probe\";\n\nexport interface ConnectionOptions {\n url?: string;\n profile?: string;\n}\n\nexport interface ResolvedConnection {\n url: string;\n profileName?: string;\n credentialRef?: string;\n environmentToken?: string;\n source: ConnectionSource;\n}\n\nexport function validateProfileName(name: string): string {\n if (!PROFILE_NAME.test(name)) {\n throw new CliError(\"INVALID_ARGUMENT\", `Invalid profile name: ${name}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"Use 1-64 letters, numbers, hyphens, or underscores.\",\n });\n }\n return name;\n}\n\nexport function normalizeOrigin(input: string): string {\n let url: URL;\n try {\n url = new URL(input);\n } catch (cause) {\n throw new CliError(\"INVALID_ARGUMENT\", `Invalid SAG URL: ${input}`, {\n exitCode: exitCodes.invalidArgument,\n cause,\n hint: \"Use an absolute HTTP or HTTPS URL such as http://localhost:8000.\",\n });\n }\n\n if (![\"http:\", \"https:\"].includes(url.protocol)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"SAG URL must use HTTP or HTTPS\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (url.username || url.password) {\n throw new CliError(\"INVALID_ARGUMENT\", \"SAG URL must not contain credentials\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (url.search || url.hash) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"SAG URL must not contain a query string or fragment\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n if (!STRIPPED_PATHS.has(url.pathname)) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `Unsupported path in SAG URL: ${url.pathname}`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"Store only the SAG origin; /api/v1 and /mcp/ are added automatically.\",\n },\n );\n }\n return url.origin;\n}\n\nfunction profileOrThrow(config: CliConfig, name: string): Profile {\n validateProfileName(name);\n const profile = config.profiles[name];\n if (!profile) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `Profile not found: ${name}`, {\n exitCode: exitCodes.resourceNotFound,\n hint: \"Run `sag profile list` to view configured profiles.\",\n });\n }\n return profile;\n}\n\nfunction withOptionalFields(\n base: Pick<ResolvedConnection, \"url\" | \"source\">,\n profileName: string | undefined,\n profile: Profile | undefined,\n environmentToken: string | undefined,\n): ResolvedConnection {\n return {\n ...base,\n ...(profileName ? { profileName } : {}),\n ...(profile ? { credentialRef: profile.credentialRef } : {}),\n ...(environmentToken ? { environmentToken } : {}),\n };\n}\n\nexport function resolveConnection(\n options: ConnectionOptions,\n environment: NodeJS.ProcessEnv,\n config: CliConfig,\n): ResolvedConnection {\n const environmentToken = environment.SAG_TOKEN?.trim() || undefined;\n\n if (options.url) {\n const profileName = options.profile\n ? validateProfileName(options.profile)\n : undefined;\n const profile = profileName ? profileOrThrow(config, profileName) : undefined;\n return withOptionalFields(\n { url: normalizeOrigin(options.url), source: \"explicit-url\" },\n profileName,\n profile,\n environmentToken,\n );\n }\n\n if (options.profile) {\n const profileName = validateProfileName(options.profile);\n const profile = profileOrThrow(config, profileName);\n return withOptionalFields(\n { url: normalizeOrigin(profile.url), source: \"explicit-profile\" },\n profileName,\n profile,\n environmentToken,\n );\n }\n\n if (environment.SAG_URL) {\n return withOptionalFields(\n {\n url: normalizeOrigin(environment.SAG_URL),\n source: \"environment-url\",\n },\n undefined,\n undefined,\n environmentToken,\n );\n }\n\n if (environment.SAG_PROFILE) {\n const profileName = validateProfileName(environment.SAG_PROFILE);\n const profile = profileOrThrow(config, profileName);\n return withOptionalFields(\n { url: normalizeOrigin(profile.url), source: \"environment-profile\" },\n profileName,\n profile,\n environmentToken,\n );\n }\n\n if (config.currentProfile) {\n const profileName = config.currentProfile;\n const profile = profileOrThrow(config, profileName);\n return withOptionalFields(\n { url: normalizeOrigin(profile.url), source: \"current-profile\" },\n profileName,\n profile,\n environmentToken,\n );\n }\n\n return withOptionalFields(\n { url: \"http://127.0.0.1:8000\", source: \"local-probe\" },\n undefined,\n undefined,\n environmentToken,\n );\n}\n","import { z } from \"zod\";\n\nexport const profileSchema = z.object({\n url: z.string(),\n credentialRef: z.string().min(1),\n defaults: z\n .object({\n output: z.enum([\"human\", \"json\"]).optional(),\n })\n .optional(),\n});\n\nexport const cliConfigSchema = z.object({\n version: z.literal(1),\n currentProfile: z.string().optional(),\n profiles: z.record(z.string(), profileSchema),\n});\n\nexport type Profile = z.infer<typeof profileSchema>;\nexport type CliConfig = z.infer<typeof cliConfigSchema>;\n\nexport const emptyConfig = (): CliConfig => ({\n version: 1,\n profiles: {},\n});\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ConfigPathOptions {\n platform?: NodeJS.Platform;\n homeDirectory?: string;\n environment?: NodeJS.ProcessEnv;\n}\n\nexport function defaultConfigPath(options: ConfigPathOptions = {}): string {\n const platform = options.platform ?? process.platform;\n const homeDirectory = options.homeDirectory ?? os.homedir();\n const environment = options.environment ?? process.env;\n\n if (platform === \"darwin\") {\n return path.join(\n homeDirectory,\n \"Library\",\n \"Application Support\",\n \"sag-cli\",\n \"config.yaml\",\n );\n }\n if (platform === \"win32\") {\n const appData = environment.APPDATA;\n return path.join(\n appData || path.join(homeDirectory, \"AppData\", \"Roaming\"),\n \"sag-cli\",\n \"config.yaml\",\n );\n }\n const xdgConfig = environment.XDG_CONFIG_HOME;\n return path.join(\n xdgConfig || path.join(homeDirectory, \".config\"),\n \"sag-cli\",\n \"config.yaml\",\n );\n}\n\nexport function defaultManagedConnectionsPath(options: ConfigPathOptions = {}): string {\n return path.join(\n path.dirname(defaultConfigPath(options)),\n \"managed-connections.yaml\",\n );\n}\n","import type { CredentialStore } from \"./store.js\";\n\nexport class MemoryCredentialStore implements CredentialStore {\n readonly kind = \"memory\" as const;\n readonly #values = new Map<string, string>();\n\n async get(reference: string): Promise<string | null> {\n return this.#values.get(reference) ?? null;\n }\n\n async set(reference: string, value: string): Promise<void> {\n this.#values.set(reference, value);\n }\n\n async delete(reference: string): Promise<void> {\n this.#values.delete(reference);\n }\n}\n","import type { CredentialStore } from \"./store.js\";\nimport { MemoryCredentialStore } from \"./memory.js\";\n\nconst SERVICE_NAME = \"@zleap-ai/sag-cli\";\n\nexport interface KeyringEntry {\n getPassword(): string | null;\n setPassword(value: string): void;\n deletePassword(): boolean;\n}\n\nexport type KeyringEntryFactory = (service: string, account: string) => KeyringEntry;\n\nexport class KeychainCredentialStore implements CredentialStore {\n readonly kind = \"keychain\" as const;\n\n constructor(private readonly entryFactory: KeyringEntryFactory) {}\n\n async get(reference: string): Promise<string | null> {\n return this.entryFactory(SERVICE_NAME, reference).getPassword();\n }\n\n async set(reference: string, value: string): Promise<void> {\n this.entryFactory(SERVICE_NAME, reference).setPassword(value);\n }\n\n async delete(reference: string): Promise<void> {\n this.entryFactory(SERVICE_NAME, reference).deletePassword();\n }\n}\n\nexport async function createKeychainCredentialStore(): Promise<KeychainCredentialStore> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n return new KeychainCredentialStore((service, account) => new Entry(service, account));\n}\n\nexport interface CredentialStoreSelection {\n store: CredentialStore;\n warning?: string;\n}\n\nexport async function createCredentialStore(\n loadKeychain: () => Promise<CredentialStore> = createKeychainCredentialStore,\n): Promise<CredentialStoreSelection> {\n try {\n return { store: await loadKeychain() };\n } catch {\n return {\n store: new MemoryCredentialStore(),\n warning:\n \"System Keychain is unavailable; credentials will remain in memory only and must be provided again next time.\",\n };\n }\n}\n","import { z } from \"zod\";\n\nexport interface DockerContainerSummary {\n id: string;\n name: string;\n image: string;\n labels: Record<string, string>;\n}\n\nexport interface DockerContainerInspection {\n id: string;\n name: string;\n running: boolean;\n health: \"healthy\" | \"unhealthy\" | \"starting\" | \"none\";\n labels: Record<string, string>;\n}\n\nexport const dockerVersionSchema = z.object({\n Platform: z.object({\n Name: z.string().min(1),\n }),\n});\n\nexport const dockerPsLineSchema = z.object({\n ID: z.string().min(1),\n Names: z.string().min(1),\n Image: z.string(),\n Labels: z.string(),\n});\n\nexport const dockerInspectSchema = z\n .array(\n z.object({\n Id: z.string().min(1),\n Name: z.string().min(1),\n Config: z.object({\n Labels: z.record(z.string(), z.string()).nullish(),\n }),\n State: z.object({\n Running: z.boolean(),\n Health: z\n .object({\n Status: z.enum([\"healthy\", \"unhealthy\", \"starting\"]),\n })\n .optional(),\n }),\n }),\n )\n .length(1);\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { ProcessRunner } from \"../process/runner.js\";\nimport {\n dockerInspectSchema,\n dockerPsLineSchema,\n dockerVersionSchema,\n type DockerContainerInspection,\n type DockerContainerSummary,\n} from \"./schemas.js\";\n\nconst DOCKER_TIMEOUT_MS = 5_000;\n\nfunction dependencyFailure(message: string, cause?: unknown): CliError {\n return new CliError(\"DEPENDENCY_MISSING\", message, {\n exitCode: exitCodes.dependencyMissing,\n ...(cause ? { cause } : {}),\n hint: \"Check that Docker Desktop or Docker Engine is running and accessible.\",\n });\n}\n\nfunction invalidDockerResponse(cause: unknown): CliError {\n return new CliError(\"INVALID_RESPONSE\", \"Docker returned an invalid response\", {\n exitCode: exitCodes.internalError,\n cause,\n hint: \"Check the installed Docker CLI version and try again.\",\n });\n}\n\nfunction parseLabels(value: string): Record<string, string> {\n const labels: Record<string, string> = {};\n for (const pair of value.split(\",\")) {\n if (!pair) continue;\n const separator = pair.indexOf(\"=\");\n if (separator === -1) continue;\n labels[pair.slice(0, separator)] = pair.slice(separator + 1);\n }\n return labels;\n}\n\nexport class DockerClient {\n constructor(private readonly runner: ProcessRunner) {}\n\n async version(): Promise<{ platformName: string }> {\n const result = await this.runner.run({\n command: \"docker\",\n args: [\"version\", \"--format\", \"{{json .Server}}\"],\n timeoutMs: DOCKER_TIMEOUT_MS,\n });\n if (result.exitCode !== 0) {\n throw dependencyFailure(\"Docker daemon is unavailable\");\n }\n try {\n const parsed = dockerVersionSchema.parse(JSON.parse(result.stdout));\n return { platformName: parsed.Platform.Name };\n } catch (cause) {\n throw invalidDockerResponse(cause);\n }\n }\n\n async listRunningContainers(): Promise<DockerContainerSummary[]> {\n const result = await this.runner.run({\n command: \"docker\",\n args: [\"ps\", \"--format\", \"{{json .}}\"],\n timeoutMs: DOCKER_TIMEOUT_MS,\n });\n if (result.exitCode !== 0) {\n throw dependencyFailure(\"Unable to list Docker containers\");\n }\n if (!result.stdout.trim()) return [];\n try {\n return result.stdout\n .trim()\n .split(/\\r?\\n/u)\n .map((line) => dockerPsLineSchema.parse(JSON.parse(line)))\n .map((container) => ({\n id: container.ID,\n name: container.Names,\n image: container.Image,\n labels: parseLabels(container.Labels),\n }));\n } catch (cause) {\n throw invalidDockerResponse(cause);\n }\n }\n\n async inspect(container: string): Promise<DockerContainerInspection> {\n const result = await this.runner.run({\n command: \"docker\",\n args: [\"inspect\", container],\n timeoutMs: DOCKER_TIMEOUT_MS,\n });\n if (result.exitCode !== 0) {\n if (/no such (?:object|container)/iu.test(result.stderr)) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", \"Docker container was not found\", {\n exitCode: exitCodes.resourceNotFound,\n hint: \"Check the container name or omit `--container` to auto-discover SAG.\",\n });\n }\n throw dependencyFailure(\"Unable to inspect the Docker container\");\n }\n try {\n const inspection = dockerInspectSchema.parse(JSON.parse(result.stdout))[0]!;\n return {\n id: inspection.Id,\n name: inspection.Name.replace(/^\\/+/u, \"\"),\n running: inspection.State.Running,\n health: inspection.State.Health?.Status ?? \"none\",\n labels: inspection.Config.Labels ?? {},\n };\n } catch (cause) {\n throw invalidDockerResponse(cause);\n }\n }\n\n async canImportMcp(container: string): Promise<boolean> {\n const result = await this.runner.run({\n command: \"docker\",\n args: [\"exec\", container, \"python\", \"-c\", \"import sag_api.mcp.server\"],\n timeoutMs: DOCKER_TIMEOUT_MS,\n });\n return result.exitCode === 0;\n }\n}\n","import { Client } from \"@modelcontextprotocol/client\";\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from \"@modelcontextprotocol/client/stdio\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { McpConnectionSpec } from \"./connection.js\";\nimport { localMcpFailure } from \"./failure.js\";\n\nexport const REQUIRED_SAG_TOOLS = [\n \"list_sources\",\n \"list_documents\",\n \"outline\",\n \"search\",\n \"grep\",\n \"get_chunk\",\n \"read\",\n \"get_entity\",\n] as const;\n\nexport interface McpVerificationReport {\n transport: \"stdio\" | \"http\";\n era: \"modern\" | \"legacy\";\n protocolVersion: string;\n server?: {\n name: string;\n version: string;\n };\n tools: string[];\n missingTools: string[];\n listSourcesCallable: boolean;\n}\n\nexport interface McpVerifyOptions {\n timeoutMs: number;\n}\n\nexport class McpVerifier {\n constructor(private readonly cliVersion: string) {}\n\n async verify(\n spec: McpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport> {\n if (spec.transport !== \"stdio\") {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"HTTP MCP is not supported in SAG CLI v0.2\",\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"Use a local Docker stdio connection.\",\n },\n );\n }\n\n const client = new Client(\n {\n name: \"@zleap-ai/sag-cli\",\n version: this.cliVersion,\n },\n {\n versionNegotiation: {\n mode: \"auto\",\n probe: {\n timeoutMs: Math.min(options.timeoutMs, 250),\n maxRetries: 0,\n },\n },\n },\n );\n const transport = new StdioClientTransport({\n command: spec.command,\n args: spec.args,\n env: {\n ...getDefaultEnvironment(),\n ...spec.env,\n },\n stderr: \"pipe\",\n });\n transport.stderr?.on(\"data\", () => undefined);\n\n try {\n await client.connect(transport, { timeout: options.timeoutMs });\n const era = client.getProtocolEra();\n const protocolVersion = client.getNegotiatedProtocolVersion();\n if (!era || !protocolVersion) {\n throw localMcpFailure(\n \"protocol\",\n \"MCP protocol negotiation returned no version\",\n );\n }\n\n const listed = await client\n .listTools(undefined, {\n timeout: options.timeoutMs,\n cacheMode: \"refresh\",\n })\n .catch((cause: unknown) => {\n throw localMcpFailure(\"tools\", \"Unable to list SAG MCP tools\", {\n cause,\n });\n });\n const tools = listed.tools.map((tool) => tool.name);\n const missingTools = REQUIRED_SAG_TOOLS.filter(\n (required) => !tools.includes(required),\n );\n if (missingTools.length) {\n throw localMcpFailure(\n \"tools\",\n `SAG MCP is missing required tools: ${missingTools.join(\", \")}`,\n );\n }\n\n const listSources = await client\n .callTool(\n {\n name: \"list_sources\",\n arguments: {},\n },\n { timeout: options.timeoutMs },\n )\n .catch((cause: unknown) => {\n throw localMcpFailure(\"knowledge\", \"Unable to call SAG MCP list_sources\", {\n cause,\n });\n });\n if (listSources.isError) {\n throw localMcpFailure(\"knowledge\", \"SAG MCP list_sources returned an error\");\n }\n\n const server = client.getServerVersion();\n return {\n transport: \"stdio\",\n era,\n protocolVersion,\n ...(server ? { server } : {}),\n tools,\n missingTools,\n listSourcesCallable: true,\n };\n } catch (cause) {\n if (cause instanceof CliError) {\n throw cause;\n }\n throw localMcpFailure(\"protocol\", \"Unable to verify SAG MCP\", { cause });\n } finally {\n await client.close().catch(() => undefined);\n }\n }\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\n\nexport type LocalMcpFailureStage = \"entrypoint\" | \"protocol\" | \"tools\" | \"knowledge\";\n\ninterface LocalMcpFailureCause {\n stage: LocalMcpFailureStage;\n cause?: unknown;\n}\n\nexport function localMcpFailure(\n stage: LocalMcpFailureStage,\n message: string,\n options: { cause?: unknown; hint?: string } = {},\n): CliError {\n const failureCause: LocalMcpFailureCause = {\n stage,\n ...(options.cause ? { cause: options.cause } : {}),\n };\n return new CliError(\"MCP_FAILED\", message, {\n exitCode: exitCodes.mcpFailed,\n cause: failureCause,\n hint: options.hint ?? \"Check the SAG API container logs and retry `sag mcp test`.\",\n });\n}\n\nexport function localMcpFailureStage(\n error: CliError,\n): LocalMcpFailureStage | undefined {\n if (error.code !== \"MCP_FAILED\" || typeof error.cause !== \"object\") {\n return undefined;\n }\n const stage = (error.cause as { stage?: unknown } | null)?.stage;\n return stage === \"entrypoint\" ||\n stage === \"protocol\" ||\n stage === \"tools\" ||\n stage === \"knowledge\"\n ? stage\n : undefined;\n}\n","import { spawn } from \"node:child_process\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nexport interface ProcessInput {\n command: string;\n args: string[];\n timeoutMs: number;\n env?: NodeJS.ProcessEnv;\n stdin?: \"ignore\" | \"pipe\";\n}\n\nexport interface ProcessResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface ProcessRunner {\n run(input: ProcessInput): Promise<ProcessResult>;\n}\n\nexport class NodeProcessRunner implements ProcessRunner {\n async run(input: ProcessInput): Promise<ProcessResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(input.command, input.args, {\n shell: false,\n env: input.env ?? process.env,\n stdio: [input.stdin === \"pipe\" ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n });\n const childStdout = child.stdout;\n const childStderr = child.stderr;\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let forceKill: NodeJS.Timeout | undefined;\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n forceKill = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, 250);\n }, input.timeoutMs);\n\n childStdout?.setEncoding(\"utf8\");\n childStderr?.setEncoding(\"utf8\");\n childStdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n childStderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", (cause) => {\n clearTimeout(timeout);\n if (forceKill) clearTimeout(forceKill);\n reject(\n new CliError(\"DEPENDENCY_MISSING\", `Unable to start ${input.command}`, {\n exitCode: exitCodes.dependencyMissing,\n cause,\n hint: `Install ${input.command} and ensure it is available on PATH.`,\n }),\n );\n });\n child.on(\"close\", (exitCode) => {\n clearTimeout(timeout);\n if (forceKill) clearTimeout(forceKill);\n if (timedOut) {\n reject(\n new CliError(\"DEPENDENCY_MISSING\", `${input.command} timed out`, {\n exitCode: exitCodes.dependencyMissing,\n hint: `Check that ${input.command} is responsive and try again.`,\n }),\n );\n return;\n }\n resolve({\n exitCode: exitCode ?? 1,\n stdout,\n stderr,\n });\n });\n });\n }\n}\n","import { Command, CommanderError, Option } from \"commander\";\n\nimport { SagClient, type SagClientOptions, type SearchInput } from \"./api/client.js\";\nimport type {\n SagCapabilities,\n SagDocument,\n SagMcpDescriptor,\n SagReady,\n SagRoot,\n SagSearchResponse,\n SagSource,\n SagUser,\n} from \"./api/schemas.js\";\nimport {\n connectLocalAgent,\n disconnectLocalAgent,\n listAgentHosts,\n statusLocalAgents,\n type AgentRuntime,\n} from \"./commands/agent.js\";\nimport { login, logout, status } from \"./commands/auth.js\";\nimport { documentStatus, getDocument, listDocuments } from \"./commands/document.js\";\nimport { localMcpDoctorChecks, testLocalMcp } from \"./commands/mcp.js\";\nimport { searchKnowledge } from \"./commands/search.js\";\nimport { getSource, listSources, sourceStatus } from \"./commands/source.js\";\nimport type { ConfigStore } from \"./config/store.js\";\nimport { createRuntimeContext } from \"./core/context.js\";\nimport { CliError, exitCodes, toCliError } from \"./core/errors.js\";\nimport { failure, success } from \"./core/result.js\";\nimport type { CredentialStore } from \"./credentials/store.js\";\nimport { runDoctor } from \"./diagnostics/doctor.js\";\nimport { renderHuman } from \"./output/human.js\";\nimport { renderJson } from \"./output/json.js\";\nimport type { AgentId } from \"./agents/adapter.js\";\n\nexport interface CliSagClient {\n root(): Promise<SagRoot>;\n ready(): Promise<SagReady>;\n capabilities(): Promise<SagCapabilities>;\n me(): Promise<SagUser>;\n mcpDescriptor(): Promise<SagMcpDescriptor>;\n listSources(): Promise<SagSource[]>;\n getSource(sourceId: string): Promise<SagSource>;\n listDocuments(sourceId: string): Promise<SagDocument[]>;\n getDocument(sourceId: string, documentId: string): Promise<SagDocument>;\n search(input: SearchInput): Promise<SagSearchResponse>;\n}\n\nexport interface CliDependencies {\n version: string;\n environment: NodeJS.ProcessEnv;\n configStore: ConfigStore;\n credentialStore: CredentialStore;\n createClient(options: SagClientOptions): CliSagClient;\n promptToken(): Promise<string>;\n confirm(message: string): Promise<boolean>;\n writeStdout(value: string): void;\n writeStderr(value: string): void;\n localMcp?: LocalMcpCliDependencies;\n}\n\nexport type LocalMcpCliDependencies = AgentRuntime;\n\ninterface GlobalOptions {\n json?: boolean;\n quiet?: boolean;\n yes?: boolean;\n profile?: string;\n url?: string;\n}\n\nfunction parseInteger(value: string): number {\n return Number.parseInt(value, 10);\n}\n\nfunction parsePositiveInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Expected a positive integer\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed;\n}\n\nfunction parseAgent(value: string): AgentId {\n if (value === \"codex\" || value === \"claude-code\") {\n return value;\n }\n throw new CliError(\"INVALID_ARGUMENT\", `Unsupported Agent: ${value}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"Choose codex or claude-code.\",\n });\n}\n\nfunction commandOptions(program: Command): GlobalOptions {\n return program.opts<GlobalOptions>();\n}\n\nfunction emit(program: Command, dependencies: CliDependencies, data: unknown): void {\n const options = commandOptions(program);\n dependencies.writeStdout(\n options.json\n ? renderJson(success(data))\n : renderHuman(data, options.quiet ?? false),\n );\n}\n\nasync function runtime(program: Command, dependencies: CliDependencies) {\n const options = commandOptions(program);\n return createRuntimeContext({\n options: {\n ...(options.url ? { url: options.url } : {}),\n ...(options.profile ? { profile: options.profile } : {}),\n },\n environment: dependencies.environment,\n configStore: dependencies.configStore,\n credentialStore: dependencies.credentialStore,\n createClient: dependencies.createClient,\n });\n}\n\nfunction localMcpRuntime(dependencies: CliDependencies): LocalMcpCliDependencies {\n if (!dependencies.localMcp) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"Local MCP runtime is unavailable\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.localMcp;\n}\n\nasync function selectedProfileName(\n program: Command,\n dependencies: CliDependencies,\n): Promise<string> {\n const options = commandOptions(program);\n if (options.profile) {\n await dependencies.configStore.getProfile(options.profile);\n return options.profile;\n }\n return (await dependencies.configStore.load()).currentProfile ?? \"local\";\n}\n\nasync function selectedServerName(\n program: Command,\n dependencies: CliDependencies,\n explicitName?: string,\n): Promise<{ profile: string; serverName: string }> {\n const profile = await selectedProfileName(program, dependencies);\n return {\n profile,\n serverName: explicitName ?? `sag-knowledge-${profile}`,\n };\n}\n\nfunction addProfileCommands(program: Command, dependencies: CliDependencies): void {\n const profile = program.command(\"profile\").description(\"Manage SAG profiles\");\n\n profile\n .command(\"add\")\n .argument(\"<name>\")\n .argument(\"<url>\")\n .action(async (name: string, url: string) => {\n emit(program, dependencies, await dependencies.configStore.addProfile(name, url));\n });\n\n profile.command(\"list\").action(async () => {\n emit(program, dependencies, await dependencies.configStore.listProfiles());\n });\n\n profile\n .command(\"use\")\n .argument(\"<name>\")\n .action(async (name: string) => {\n emit(program, dependencies, await dependencies.configStore.useProfile(name));\n });\n\n profile\n .command(\"show\")\n .argument(\"[name]\")\n .action(async (name?: string) => {\n emit(program, dependencies, await dependencies.configStore.getProfile(name));\n });\n\n profile\n .command(\"remove\")\n .argument(\"<name>\")\n .action(async (name: string) => {\n if (\n !commandOptions(program).yes &&\n !(await dependencies.confirm(`Remove profile ${name}?`))\n ) {\n emit(program, dependencies, { removed: null, cancelled: true });\n return;\n }\n await dependencies.configStore.removeProfile(name);\n emit(program, dependencies, { removed: name });\n });\n}\n\nfunction addAuthCommands(program: Command, dependencies: CliDependencies): void {\n const auth = program.command(\"auth\").description(\"Manage SAG credentials\");\n\n auth.command(\"login\").action(async () => {\n const context = await runtime(program, dependencies);\n const result = await login({\n credentialRef: context.credentialRef,\n ...(context.connection.environmentToken\n ? { environmentToken: context.connection.environmentToken }\n : {}),\n promptToken: dependencies.promptToken,\n validate: async (token) =>\n dependencies.createClient({ origin: context.connection.url, token }).me(),\n store: dependencies.credentialStore,\n });\n emit(program, dependencies, result);\n });\n\n auth.command(\"status\").action(async () => {\n const context = await runtime(program, dependencies);\n const result = await status({\n credentialRef: context.credentialRef,\n ...(context.connection.environmentToken\n ? { environmentToken: context.connection.environmentToken }\n : {}),\n validate: async (token) =>\n dependencies.createClient({ origin: context.connection.url, token }).me(),\n store: dependencies.credentialStore,\n });\n emit(program, dependencies, result);\n });\n\n auth.command(\"logout\").action(async () => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await logout({\n credentialRef: context.credentialRef,\n store: dependencies.credentialStore,\n }),\n );\n });\n}\n\nfunction addKnowledgeCommands(program: Command, dependencies: CliDependencies): void {\n program.command(\"doctor\").action(async () => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await runDoctor(\n context.client,\n {\n url: context.connection.url,\n ...(context.connection.profileName\n ? { profileName: context.connection.profileName }\n : {}),\n },\n dependencies.localMcp\n ? () =>\n localMcpDoctorChecks(dependencies.localMcp!, {\n timeoutMs: 15_000,\n })\n : undefined,\n ),\n );\n });\n\n const source = program.command(\"source\").description(\"Inspect SAG sources\");\n source.command(\"list\").action(async () => {\n const context = await runtime(program, dependencies);\n emit(program, dependencies, await listSources(context.client));\n });\n source\n .command(\"get\")\n .argument(\"<source-id>\")\n .action(async (sourceId: string) => {\n const context = await runtime(program, dependencies);\n emit(program, dependencies, await getSource(context.client, sourceId));\n });\n source\n .command(\"status\")\n .argument(\"[source-id]\")\n .action(async (sourceId: string | undefined) => {\n const context = await runtime(program, dependencies);\n emit(program, dependencies, await sourceStatus(context.client, sourceId));\n });\n\n const document = program.command(\"document\").description(\"Inspect SAG documents\");\n document\n .command(\"list\")\n .requiredOption(\"--source <source-id>\")\n .action(async (options: { source: string }) => {\n const context = await runtime(program, dependencies);\n emit(program, dependencies, await listDocuments(context.client, options.source));\n });\n document\n .command(\"get\")\n .argument(\"<document-id>\")\n .requiredOption(\"--source <source-id>\")\n .action(async (documentId: string, options: { source: string }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await getDocument(context.client, options.source, documentId),\n );\n });\n document\n .command(\"status\")\n .argument(\"[document-id]\")\n .requiredOption(\"--source <source-id>\")\n .action(async (documentId: string | undefined, options: { source: string }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await documentStatus(context.client, options.source, documentId),\n );\n });\n\n program\n .command(\"search\")\n .argument(\"<query>\")\n .option(\"--source <source-id...>\")\n .option(\"--top-k <number>\", \"Maximum result count\", parseInteger)\n .addOption(new Option(\"--strategy <strategy>\").choices([\"vector\", \"multi\"]))\n .action(\n async (\n query: string,\n options: {\n source?: string[];\n topK?: number;\n strategy?: \"vector\" | \"multi\";\n },\n ) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await searchKnowledge(context.client, query, {\n ...(options.source ? { sourceIds: options.source } : {}),\n ...(options.topK !== undefined ? { topK: options.topK } : {}),\n ...(options.strategy ? { strategy: options.strategy } : {}),\n }),\n );\n },\n );\n}\n\nfunction addLocalMcpCommands(program: Command, dependencies: CliDependencies): void {\n const mcp = program.command(\"mcp\").description(\"Verify local SAG MCP\");\n mcp\n .command(\"test\")\n .option(\"--source-id <source-id>\")\n .option(\"--container <name-or-id>\")\n .option(\"--timeout <milliseconds>\", \"MCP timeout\", parsePositiveInteger, 15_000)\n .action(\n async (options: { sourceId?: string; container?: string; timeout: number }) => {\n emit(\n program,\n dependencies,\n await testLocalMcp(localMcpRuntime(dependencies), {\n ...(options.sourceId ? { sourceId: options.sourceId } : {}),\n ...(options.container ? { container: options.container } : {}),\n timeoutMs: options.timeout,\n }),\n );\n },\n );\n}\n\nfunction addAgentCommands(program: Command, dependencies: CliDependencies): void {\n const agent = program.command(\"agent\").description(\"Manage Agent MCP connections\");\n\n agent.command(\"list\").action(async () => {\n emit(program, dependencies, await listAgentHosts(localMcpRuntime(dependencies)));\n });\n\n agent\n .command(\"connect\")\n .argument(\"<agent>\", \"codex or claude-code\", parseAgent)\n .option(\"--source-id <source-id>\")\n .option(\"--container <name-or-id>\")\n .option(\"--name <server-name>\")\n .option(\"--timeout <milliseconds>\", \"MCP timeout\", parsePositiveInteger, 15_000)\n .option(\"--dry-run\", \"Show the plan without changing configuration\")\n .action(\n async (\n agentId: AgentId,\n options: {\n sourceId?: string;\n container?: string;\n name?: string;\n timeout: number;\n dryRun?: boolean;\n },\n ) => {\n const selection = await selectedServerName(program, dependencies, options.name);\n emit(\n program,\n dependencies,\n await connectLocalAgent(localMcpRuntime(dependencies), {\n agent: agentId,\n serverName: selection.serverName,\n profile: selection.profile,\n ...(options.sourceId ? { sourceId: options.sourceId } : {}),\n ...(options.container ? { container: options.container } : {}),\n timeoutMs: options.timeout,\n dryRun: options.dryRun ?? false,\n yes: commandOptions(program).yes ?? false,\n confirm: dependencies.confirm,\n now: () => new Date(),\n }),\n );\n },\n );\n\n agent\n .command(\"status\")\n .argument(\"[agent]\", \"codex or claude-code\", parseAgent)\n .option(\"--name <server-name>\")\n .action(async (agentId: AgentId | undefined, options: { name?: string }) => {\n const selection = await selectedServerName(program, dependencies, options.name);\n emit(\n program,\n dependencies,\n await statusLocalAgents(localMcpRuntime(dependencies), {\n ...(agentId ? { agent: agentId } : {}),\n serverName: selection.serverName,\n }),\n );\n });\n\n agent\n .command(\"disconnect\")\n .argument(\"<agent>\", \"codex or claude-code\", parseAgent)\n .option(\"--name <server-name>\")\n .action(async (agentId: AgentId, options: { name?: string }) => {\n const selection = await selectedServerName(program, dependencies, options.name);\n emit(\n program,\n dependencies,\n await disconnectLocalAgent(localMcpRuntime(dependencies), {\n agent: agentId,\n serverName: selection.serverName,\n yes: commandOptions(program).yes ?? false,\n confirm: dependencies.confirm,\n }),\n );\n });\n}\n\nexport function createProgram(dependencies: CliDependencies): Command {\n const program = new Command();\n program\n .name(\"sag\")\n .description(\"Command-line client and diagnostics for SAG\")\n .showHelpAfterError()\n .exitOverride()\n .option(\"--json\", \"Output a stable JSON envelope\")\n .option(\"--quiet\", \"Output only essential values\")\n .option(\"--profile <name>\", \"Use a configured SAG profile\")\n .option(\"--url <origin>\", \"Use a SAG origin without saving it\")\n .option(\"--yes\", \"Confirm safe local configuration changes\")\n .configureOutput({\n writeOut: dependencies.writeStdout,\n writeErr: dependencies.writeStderr,\n });\n\n program.command(\"version\").action(() => {\n const options = commandOptions(program);\n if (options.json) {\n dependencies.writeStdout(\n renderJson(success({ name: \"sag\", version: dependencies.version })),\n );\n } else {\n dependencies.writeStdout(`sag ${dependencies.version}\\n`);\n }\n });\n\n addProfileCommands(program, dependencies);\n addAuthCommands(program, dependencies);\n addKnowledgeCommands(program, dependencies);\n addLocalMcpCommands(program, dependencies);\n addAgentCommands(program, dependencies);\n return program;\n}\n\nexport async function runCli(\n arguments_: string[],\n dependencies: CliDependencies,\n): Promise<number> {\n const json = arguments_.includes(\"--json\");\n try {\n await createProgram(dependencies).parseAsync(arguments_);\n return exitCodes.success;\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) {\n return 0;\n }\n const cliError =\n error instanceof CommanderError\n ? new CliError(\"INVALID_ARGUMENT\", error.message, {\n exitCode: exitCodes.invalidArgument,\n })\n : toCliError(error);\n if (json) {\n dependencies.writeStdout(renderJson(failure(cliError)));\n } else {\n dependencies.writeStderr(\n `Error [${cliError.code}]: ${cliError.message}${\n cliError.hint ? `\\nHint: ${cliError.hint}` : \"\"\n }\\n`,\n );\n if (\n dependencies.environment.SAG_DEBUG === \"1\" &&\n cliError.cause instanceof Error\n ) {\n dependencies.writeStderr(`${cliError.cause.stack ?? cliError.cause.message}\\n`);\n }\n }\n return cliError.exitCode;\n }\n}\n\nexport const defaultClientFactory = (options: SagClientOptions): CliSagClient =>\n new SagClient(options);\n","import { z } from \"zod\";\n\nconst dateTime = z.string().min(1);\n\nexport const rootSchema = z\n .object({\n name: z.string().min(1),\n version: z.string().min(1),\n docs: z.string(),\n })\n .passthrough();\n\nexport const readySchema = z\n .object({\n status: z.string(),\n db: z.boolean(),\n })\n .passthrough();\n\nexport const capabilitiesSchema = z.record(z.string(), z.unknown());\n\nexport const userSchema = z\n .object({\n id: z.string().min(1),\n email: z.string(),\n name: z.string(),\n created_at: dateTime.optional(),\n })\n .passthrough();\n\nexport const sourceSchema = z\n .object({\n id: z.string().min(1),\n name: z.string(),\n description: z.string(),\n source_type: z.enum([\"document\", \"web\", \"message\", \"audio\"]),\n connector_kind: z.string(),\n status: z.enum([\"active\", \"paused\", \"error\"]),\n document_count: z.number().int().nonnegative(),\n chunk_count: z.number().int().nonnegative(),\n event_count: z.number().int().nonnegative(),\n created_at: dateTime,\n updated_at: dateTime,\n })\n .passthrough();\n\nexport const documentStatusSchema = z.enum([\n \"pending\",\n \"loading\",\n \"extracting\",\n \"paused\",\n \"ready\",\n \"failed\",\n]);\n\nexport const documentSchema = z\n .object({\n id: z.string().min(1),\n source_id: z.string().min(1),\n filename: z.string(),\n content_type: z.string(),\n size_bytes: z.number().int().nonnegative(),\n status: documentStatusSchema,\n chunk_count: z.number().int().nonnegative(),\n event_count: z.number().int().nonnegative(),\n progress: z.number().int().min(0).max(100),\n token_usage: z.number().int().nonnegative(),\n error: z.string().nullable(),\n created_at: dateTime,\n updated_at: dateTime,\n })\n .passthrough();\n\nconst searchSectionSchema = z\n .object({\n chunk_id: z.string().nullable(),\n heading: z.string(),\n content: z.string(),\n score: z.number(),\n rank: z.number().int(),\n source_id: z.string().nullable(),\n source_name: z.string().nullable().optional(),\n })\n .passthrough();\n\nconst searchEventSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n summary: z.string(),\n rank: z.number().int(),\n score: z.number(),\n })\n .passthrough();\n\nconst sourceHitSchema = z\n .object({\n source_id: z.string(),\n source_name: z.string().nullable().optional(),\n event_hits: z.number().int(),\n max_score: z.number(),\n latest_event_time: z.string().nullable().optional(),\n })\n .passthrough();\n\nexport const searchResponseSchema = z\n .object({\n query: z.string(),\n sections: z.array(searchSectionSchema),\n events: z.array(searchEventSchema),\n entities: z.array(z.record(z.string(), z.unknown())),\n relations: z.array(z.record(z.string(), z.unknown())),\n source_hits: z.array(sourceHitSchema),\n summary: z.string(),\n exploration_id: z.string().nullable(),\n stats: z.record(z.string(), z.unknown()),\n })\n .passthrough();\n\nexport const mcpDescriptorSchema = z\n .object({\n name: z.string(),\n scope: z.string(),\n source_count: z.number().int().nonnegative(),\n tools: z.array(z.string()),\n http: z\n .object({\n transport: z.string(),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type SagRoot = z.infer<typeof rootSchema>;\nexport type SagReady = z.infer<typeof readySchema>;\nexport type SagCapabilities = z.infer<typeof capabilitiesSchema>;\nexport type SagUser = z.infer<typeof userSchema>;\nexport type SagSource = z.infer<typeof sourceSchema>;\nexport type SagDocument = z.infer<typeof documentSchema>;\nexport type SagDocumentStatus = z.infer<typeof documentStatusSchema>;\nexport type SagSearchResponse = z.infer<typeof searchResponseSchema>;\nexport type SagMcpDescriptor = z.infer<typeof mcpDescriptorSchema>;\n","import type { z } from \"zod\";\n\nimport { normalizeOrigin } from \"../config/resolve.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport {\n capabilitiesSchema,\n documentSchema,\n mcpDescriptorSchema,\n readySchema,\n rootSchema,\n searchResponseSchema,\n sourceSchema,\n userSchema,\n type SagCapabilities,\n type SagDocument,\n type SagMcpDescriptor,\n type SagReady,\n type SagRoot,\n type SagSearchResponse,\n type SagSource,\n type SagUser,\n} from \"./schemas.js\";\n\nexport interface SearchInput {\n query: string;\n source_ids?: string[];\n top_k?: number;\n strategy?: \"vector\" | \"multi\";\n save_exploration: false;\n}\n\nexport interface SagClientOptions {\n origin: string;\n token?: string;\n timeoutMs?: number;\n locale?: string;\n fetchImplementation?: typeof fetch;\n}\n\ninterface RequestOptions {\n authenticated?: boolean;\n method?: \"GET\" | \"POST\";\n body?: unknown;\n}\n\nexport class SagClient {\n readonly #origin: string;\n readonly #token: string | undefined;\n readonly #timeoutMs: number;\n readonly #locale: string;\n readonly #fetch: typeof fetch;\n\n constructor(options: SagClientOptions) {\n this.#origin = normalizeOrigin(options.origin);\n this.#token = options.token;\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n this.#locale = options.locale ?? \"zh-CN\";\n this.#fetch = options.fetchImplementation ?? fetch;\n }\n\n root(): Promise<SagRoot> {\n return this.#request(\"/\", rootSchema, { authenticated: false });\n }\n\n ready(): Promise<SagReady> {\n return this.#request(\"/api/v1/system/ready\", readySchema, {\n authenticated: false,\n });\n }\n\n capabilities(): Promise<SagCapabilities> {\n return this.#request(\"/api/v1/system/capabilities\", capabilitiesSchema, {\n authenticated: false,\n });\n }\n\n me(): Promise<SagUser> {\n return this.#request(\"/api/v1/auth/me\", userSchema);\n }\n\n mcpDescriptor(): Promise<SagMcpDescriptor> {\n return this.#request(\"/api/v1/system/mcp\", mcpDescriptorSchema);\n }\n\n listSources(): Promise<SagSource[]> {\n return this.#request(\"/api/v1/sources\", sourceSchema.array());\n }\n\n getSource(sourceId: string): Promise<SagSource> {\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}`,\n sourceSchema,\n );\n }\n\n listDocuments(sourceId: string): Promise<SagDocument[]> {\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/documents`,\n documentSchema.array(),\n );\n }\n\n getDocument(sourceId: string, documentId: string): Promise<SagDocument> {\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}`,\n documentSchema,\n );\n }\n\n search(input: SearchInput): Promise<SagSearchResponse> {\n return this.#request(\"/api/v1/search\", searchResponseSchema, {\n method: \"POST\",\n body: input,\n });\n }\n\n async #request<TSchema extends z.ZodType>(\n path: string,\n schema: TSchema,\n options: RequestOptions = {},\n ): Promise<z.output<TSchema>> {\n const authenticated = options.authenticated ?? true;\n if (authenticated && !this.#token) {\n throw new CliError(\"AUTH_REQUIRED\", \"No SAG token is configured\", {\n exitCode: exitCodes.authRequired,\n hint: \"Run `sag auth login` or set SAG_TOKEN.\",\n });\n }\n\n const headers = new Headers({\n Accept: \"application/json\",\n \"Accept-Language\": this.#locale,\n });\n if (authenticated && this.#token) {\n headers.set(\"Authorization\", `Bearer ${this.#token}`);\n }\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n let response: Response;\n try {\n response = await this.#fetch(new URL(path, `${this.#origin}/`), {\n method: options.method ?? \"GET\",\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal: AbortSignal.timeout(this.#timeoutMs),\n });\n } catch (cause) {\n throw new CliError(\"NETWORK_UNREACHABLE\", `Cannot reach SAG at ${this.#origin}`, {\n exitCode: exitCodes.networkUnreachable,\n cause,\n hint: \"Check that SAG is running and the URL is reachable.\",\n });\n }\n\n const payload = await this.#readPayload(response);\n if (!response.ok) {\n throw this.#httpError(response.status, payload);\n }\n\n const parsed = schema.safeParse(payload);\n if (!parsed.success) {\n throw new CliError(\"INVALID_RESPONSE\", \"SAG returned an incompatible response\", {\n exitCode: exitCodes.internalError,\n cause: parsed.error,\n hint: \"Check the SAG/CLI compatibility matrix.\",\n });\n }\n return parsed.data;\n }\n\n async #readPayload(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch (cause) {\n throw new CliError(\"INVALID_RESPONSE\", \"SAG returned invalid JSON\", {\n exitCode: exitCodes.internalError,\n cause,\n });\n }\n }\n\n #httpError(status: number, payload: unknown): CliError {\n const serverMessage =\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n payload.error &&\n typeof payload.error === \"object\" &&\n \"message\" in payload.error &&\n typeof payload.error.message === \"string\"\n ? payload.error.message\n : `SAG request failed with HTTP ${status}`;\n\n if (status === 401) {\n return new CliError(\"AUTH_REQUIRED\", serverMessage, {\n exitCode: exitCodes.authRequired,\n hint: \"Run `sag auth login` to refresh the token.\",\n });\n }\n if (status === 403) {\n return new CliError(\"PERMISSION_DENIED\", serverMessage, {\n exitCode: exitCodes.permissionDenied,\n });\n }\n if (status === 404) {\n return new CliError(\"RESOURCE_NOT_FOUND\", serverMessage, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n if (status === 409) {\n return new CliError(\"DOCUMENT_NOT_READY\", serverMessage, {\n exitCode: exitCodes.documentNotReady,\n });\n }\n if (status >= 500) {\n return new CliError(\"SERVICE_NOT_READY\", serverMessage, {\n exitCode: exitCodes.serviceNotReady,\n });\n }\n return new CliError(\"INVALID_RESPONSE\", serverMessage, {\n exitCode: exitCodes.internalError,\n });\n }\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { SagDockerTarget } from \"../docker/discovery.js\";\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\nimport type { McpVerificationReport, McpVerifyOptions } from \"../mcp/verifier.js\";\nimport {\n connectionKey,\n fingerprintConnection,\n type AgentAdapter,\n type AgentId,\n type AgentScope,\n} from \"./adapter.js\";\nimport type { ManagedConnection } from \"./state.js\";\n\nexport interface AgentConnectionState {\n get(key: string): Promise<ManagedConnection | null>;\n set(connection: ManagedConnection): Promise<void>;\n delete(key: string): Promise<void>;\n}\n\nexport interface AgentMcpVerifier {\n verify(\n spec: McpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport>;\n}\n\nexport interface ResolvedAgentConnection {\n target: SagDockerTarget;\n spec: McpConnectionSpec;\n}\n\nexport type AgentPlanAction = \"create\" | \"update\" | \"unchanged\";\n\nexport interface AgentConnectionPlan {\n action: AgentPlanAction;\n agent: AgentId;\n serverName: string;\n scope: AgentScope;\n provider: \"docker-stdio\";\n target: string;\n sourceId: string | null;\n currentFingerprint?: string;\n desiredFingerprint: string;\n}\n\nexport interface AgentOperationReport {\n agent: AgentId;\n serverName: string;\n scope: AgentScope;\n action: AgentPlanAction | \"disconnect\" | \"cancelled\";\n changed: boolean;\n verified: boolean;\n dryRun: boolean;\n plan: AgentConnectionPlan;\n}\n\nexport interface ConnectAgentInput {\n agent: AgentId;\n serverName: string;\n scope: AgentScope;\n profile: string;\n sourceId?: string | undefined;\n timeoutMs: number;\n dryRun: boolean;\n yes: boolean;\n resolveConnection(): Promise<ResolvedAgentConnection>;\n verifier: AgentMcpVerifier;\n adapter: AgentAdapter;\n state: AgentConnectionState;\n confirm(message: string): Promise<boolean>;\n now(): Date;\n}\n\nexport interface DisconnectAgentInput {\n agent: AgentId;\n serverName: string;\n scope: AgentScope;\n adapter: AgentAdapter;\n state: AgentConnectionState;\n yes: boolean;\n confirm(message: string): Promise<boolean>;\n}\n\nconst SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/u;\n\nfunction validateServerName(serverName: string): void {\n if (!SERVER_NAME_PATTERN.test(serverName)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Invalid MCP server name\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"Use 1-64 letters, numbers, dots, underscores, or dashes.\",\n });\n }\n}\n\nfunction conflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"Choose another `--name` or restore the SAG CLI managed entry.\",\n });\n}\n\nfunction hostFailure(message: string, cause?: unknown, hint?: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n ...(cause ? { cause } : {}),\n hint: hint ?? \"Inspect the Agent MCP configuration and run the command again.\",\n });\n}\n\nfunction determinePlan(input: {\n agent: AgentId;\n serverName: string;\n scope: AgentScope;\n target: SagDockerTarget;\n sourceId?: string;\n desiredFingerprint: string;\n hostFingerprint?: string;\n hostSpecFingerprint?: string;\n managed: ManagedConnection | null;\n}): AgentConnectionPlan {\n let action: AgentPlanAction;\n if (!input.hostFingerprint || !input.hostSpecFingerprint) {\n if (input.managed) {\n throw conflict(\"Managed state exists but the Agent MCP entry is missing\");\n }\n action = \"create\";\n } else if (!input.managed) {\n throw conflict(\"The Agent MCP name is already owned by the user\");\n } else if (input.managed.fingerprint !== input.hostFingerprint) {\n throw conflict(\"The managed Agent MCP entry was changed outside SAG CLI\");\n } else if (input.hostSpecFingerprint === input.desiredFingerprint) {\n action = \"unchanged\";\n } else {\n action = \"update\";\n }\n\n return {\n action,\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n provider: \"docker-stdio\",\n target: input.target.name,\n sourceId: input.sourceId ?? null,\n ...(input.hostSpecFingerprint\n ? { currentFingerprint: input.hostSpecFingerprint }\n : {}),\n desiredFingerprint: input.desiredFingerprint,\n };\n}\n\nfunction managedConnection(\n input: ConnectAgentInput,\n resolved: ResolvedAgentConnection,\n fingerprint: string,\n existing: ManagedConnection | null,\n): ManagedConnection {\n return {\n agent: input.agent,\n provider: \"docker-stdio\",\n profile: input.profile,\n serverName: input.serverName,\n docker: {\n ...(resolved.target.composeProject\n ? { composeProject: resolved.target.composeProject }\n : {}),\n ...(resolved.target.composeService\n ? { composeService: resolved.target.composeService }\n : {}),\n containerName: resolved.target.name,\n },\n sourceId: input.sourceId ?? null,\n scope: input.scope,\n fingerprint,\n createdAt: existing?.createdAt ?? input.now().toISOString(),\n };\n}\n\nasync function rollbackHost(input: {\n adapter: AgentAdapter;\n serverName: string;\n scope: AgentScope;\n previousSpec?: McpConnectionSpec;\n previousFingerprint?: string;\n}): Promise<void> {\n if (input.previousSpec) {\n try {\n await input.adapter.remove(input.serverName, input.scope);\n } catch {\n // The failed update may already have removed the replacement entry.\n }\n await input.adapter.add(input.serverName, input.scope, input.previousSpec);\n const restored = await input.adapter.read(input.serverName, input.scope);\n if (\n !restored ||\n restored.fingerprint !==\n (input.previousFingerprint ?? fingerprintConnection(input.previousSpec))\n ) {\n throw new Error(\"Previous Agent MCP entry was not restored\");\n }\n return;\n }\n await input.adapter.remove(input.serverName, input.scope);\n}\n\nexport async function connectAgent(\n input: ConnectAgentInput,\n): Promise<AgentOperationReport> {\n validateServerName(input.serverName);\n const resolved = await input.resolveConnection();\n await input.verifier.verify(resolved.spec, { timeoutMs: input.timeoutMs });\n await input.adapter.detect();\n const host = await input.adapter.read(input.serverName, input.scope);\n const key = connectionKey(input.agent, input.scope, input.serverName);\n const managed = await input.state.get(key);\n const desiredFingerprint = fingerprintConnection(resolved.spec);\n const plan = determinePlan({\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n target: resolved.target,\n ...(input.sourceId ? { sourceId: input.sourceId } : {}),\n desiredFingerprint,\n ...(host ? { hostFingerprint: host.fingerprint } : {}),\n ...(host ? { hostSpecFingerprint: fingerprintConnection(host.spec) } : {}),\n managed,\n });\n\n if (plan.action === \"unchanged\") {\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: \"unchanged\",\n changed: false,\n verified: true,\n dryRun: false,\n plan,\n };\n }\n if (input.dryRun) {\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: plan.action,\n changed: false,\n verified: true,\n dryRun: true,\n plan,\n };\n }\n if (\n !input.yes &&\n !(await input.confirm(\n `${plan.action === \"create\" ? \"Add\" : \"Update\"} ${input.serverName} in ${input.agent}?`,\n ))\n ) {\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: \"cancelled\",\n changed: false,\n verified: true,\n dryRun: false,\n plan,\n };\n }\n\n try {\n if (plan.action === \"update\") {\n await input.adapter.remove(input.serverName, input.scope);\n }\n await input.adapter.add(input.serverName, input.scope, resolved.spec);\n const readBack = await input.adapter.read(input.serverName, input.scope);\n if (!readBack || fingerprintConnection(readBack.spec) !== desiredFingerprint) {\n throw hostFailure(\"Agent MCP read-back did not match the requested connection\");\n }\n await input.verifier.verify(readBack.spec, { timeoutMs: input.timeoutMs });\n await input.state.set(\n managedConnection(input, resolved, readBack.fingerprint, managed),\n );\n } catch (cause) {\n try {\n await rollbackHost({\n adapter: input.adapter,\n serverName: input.serverName,\n scope: input.scope,\n ...(host ? { previousSpec: host.spec } : {}),\n ...(host ? { previousFingerprint: host.fingerprint } : {}),\n });\n } catch {\n throw hostFailure(\n \"Agent MCP configuration failed and rollback also failed\",\n cause,\n `Inspect the ${input.agent} MCP entry \\`${input.serverName}\\` before retrying.`,\n );\n }\n throw hostFailure(\n \"Agent MCP configuration failed; changes were rolled back\",\n cause,\n );\n }\n\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: plan.action,\n changed: true,\n verified: true,\n dryRun: false,\n plan,\n };\n}\n\nexport async function disconnectAgent(\n input: DisconnectAgentInput,\n): Promise<AgentOperationReport> {\n validateServerName(input.serverName);\n await input.adapter.detect();\n const key = connectionKey(input.agent, input.scope, input.serverName);\n const managed = await input.state.get(key);\n if (!managed) {\n throw conflict(\"The Agent MCP entry is not managed by SAG CLI\");\n }\n const host = await input.adapter.read(input.serverName, input.scope);\n if (!host) {\n throw conflict(\"Managed state exists but the Agent MCP entry is missing\");\n }\n if (host.fingerprint !== managed.fingerprint) {\n throw conflict(\"The managed Agent MCP entry was changed outside SAG CLI\");\n }\n const plan: AgentConnectionPlan = {\n action: \"unchanged\",\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n provider: \"docker-stdio\",\n target: managed.docker.containerName,\n sourceId: managed.sourceId,\n currentFingerprint: host.fingerprint,\n desiredFingerprint: host.fingerprint,\n };\n if (\n !input.yes &&\n !(await input.confirm(`Remove ${input.serverName} from ${input.agent}?`))\n ) {\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: \"cancelled\",\n changed: false,\n verified: true,\n dryRun: false,\n plan,\n };\n }\n\n await input.adapter.remove(input.serverName, input.scope);\n try {\n await input.state.delete(key);\n } catch (cause) {\n try {\n await input.adapter.add(input.serverName, input.scope, host.spec);\n } catch {\n throw hostFailure(\n \"Managed state cleanup failed and the Agent entry could not be restored\",\n cause,\n );\n }\n throw hostFailure(\n \"Managed state cleanup failed; the Agent entry was restored\",\n cause,\n );\n }\n\n return {\n agent: input.agent,\n serverName: input.serverName,\n scope: input.scope,\n action: \"disconnect\",\n changed: true,\n verified: true,\n dryRun: false,\n plan,\n };\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { SagDockerTarget } from \"../docker/discovery.js\";\nimport type {\n McpConnectionProvider,\n McpConnectionSpec,\n ProviderReport,\n} from \"./connection.js\";\n\nexport interface DockerProviderInput {\n target: SagDockerTarget;\n sourceId?: string;\n}\n\nconst SOURCE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;\n\nexport class DockerStdioProvider implements McpConnectionProvider<\n DockerProviderInput,\n DockerProviderInput\n> {\n readonly id = \"docker-stdio\";\n\n async inspect(input: DockerProviderInput): Promise<ProviderReport> {\n return {\n provider: this.id,\n ready: true,\n target: input.target.name,\n };\n }\n\n async createSpec(input: DockerProviderInput): Promise<McpConnectionSpec> {\n if (input.sourceId && !SOURCE_ID_PATTERN.test(input.sourceId)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Invalid SAG source id\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"Use 1-128 letters, numbers, underscores, or dashes.\",\n });\n }\n const sourceArguments = input.sourceId\n ? [\"-e\", `SAG_MCP_SOURCE_ID=${input.sourceId}`]\n : [];\n return {\n transport: \"stdio\",\n command: \"docker\",\n args: [\n \"exec\",\n \"-i\",\n ...sourceArguments,\n input.target.name,\n \"python\",\n \"-m\",\n \"sag_api.mcp.server\",\n ],\n env: {},\n };\n }\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport { localMcpFailure } from \"../mcp/failure.js\";\nimport type { DockerContainerInspection, DockerContainerSummary } from \"./schemas.js\";\n\nexport interface DockerDiscoveryClient {\n version(): Promise<{ platformName: string }>;\n listRunningContainers(): Promise<DockerContainerSummary[]>;\n inspect(container: string): Promise<DockerContainerInspection>;\n canImportMcp(container: string): Promise<boolean>;\n}\n\nexport interface SagDockerTarget {\n id: string;\n name: string;\n composeProject?: string;\n composeService?: string;\n health: DockerContainerInspection[\"health\"];\n}\n\nexport interface DiscoverSagContainerInput {\n docker: DockerDiscoveryClient;\n container?: string;\n interactive: boolean;\n select?(candidates: SagDockerTarget[]): Promise<string>;\n}\n\nconst CONTAINER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/u;\n\nfunction validateContainer(value: string): void {\n if (!CONTAINER_PATTERN.test(value)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Invalid Docker container name or id\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"Use 1-128 letters, numbers, dots, underscores, or dashes.\",\n });\n }\n}\n\nfunction toTarget(inspection: DockerContainerInspection): SagDockerTarget {\n const composeProject = inspection.labels[\"com.docker.compose.project\"] || undefined;\n const composeService = inspection.labels[\"com.docker.compose.service\"] || undefined;\n return {\n id: inspection.id,\n name: inspection.name,\n ...(composeProject ? { composeProject } : {}),\n ...(composeService ? { composeService } : {}),\n health: inspection.health,\n };\n}\n\nasync function validateTarget(\n docker: DockerDiscoveryClient,\n container: string,\n): Promise<SagDockerTarget> {\n const inspection = await docker.inspect(container);\n if (\n !inspection.running ||\n inspection.health === \"unhealthy\" ||\n inspection.health === \"starting\"\n ) {\n throw new CliError(\"SERVICE_NOT_READY\", \"SAG API container is not ready\", {\n exitCode: exitCodes.serviceNotReady,\n hint: \"Check the SAG API container health and logs.\",\n });\n }\n if (!(await docker.canImportMcp(inspection.name))) {\n throw localMcpFailure(\n \"entrypoint\",\n \"SAG API container does not provide the stdio MCP entrypoint\",\n {\n hint: \"Use a compatible SAG image that includes sag_api.mcp.server.\",\n },\n );\n }\n return toTarget(inspection);\n}\n\nexport async function discoverSagContainer(\n input: DiscoverSagContainerInput,\n): Promise<SagDockerTarget> {\n await input.docker.version();\n\n if (input.container) {\n validateContainer(input.container);\n return validateTarget(input.docker, input.container);\n }\n\n const containers = await input.docker.listRunningContainers();\n const apiCandidates = containers.filter(\n (container) => container.labels[\"com.docker.compose.service\"] === \"api\",\n );\n if (!apiCandidates.length) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", \"No SAG API container was found\", {\n exitCode: exitCodes.resourceNotFound,\n hint: \"Start SAG Docker or pass `--container <name-or-id>`.\",\n });\n }\n\n const targets: SagDockerTarget[] = [];\n let firstFailure: unknown;\n let preferredFailure: unknown;\n for (const candidate of apiCandidates) {\n try {\n targets.push(await validateTarget(input.docker, candidate.id));\n } catch (error) {\n firstFailure ??= error;\n if (candidate.labels[\"com.docker.compose.project\"] === \"sag\") {\n preferredFailure ??= error;\n }\n }\n }\n if (!targets.length) {\n throw preferredFailure ?? firstFailure;\n }\n const preferredTargets = targets.filter((target) => target.composeProject === \"sag\");\n const rankedTargets = preferredTargets.length ? preferredTargets : targets;\n if (rankedTargets.length === 1) {\n return rankedTargets[0]!;\n }\n if (!input.interactive || !input.select) {\n throw new CliError(\"CONFIG_CONFLICT\", \"Multiple SAG API containers were found\", {\n exitCode: exitCodes.configConflict,\n hint: \"Pass `--container <name-or-id>` to select one.\",\n });\n }\n\n const selectedId = await input.select(rankedTargets);\n const selected = rankedTargets.find(\n (target) => target.id === selectedId || target.name === selectedId,\n );\n if (!selected) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Invalid Docker container selection\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return selected;\n}\n","import {\n connectionKey,\n type AgentAdapter,\n type AgentId,\n type AgentScope,\n} from \"../agents/adapter.js\";\nimport {\n connectAgent,\n disconnectAgent,\n type AgentConnectionState,\n type AgentMcpVerifier,\n type AgentOperationReport,\n} from \"../agents/orchestrator.js\";\nimport type { ManagedConnection } from \"../agents/state.js\";\nimport { DockerStdioProvider } from \"../mcp/docker-stdio-provider.js\";\nimport { discoverSagContainer, type SagDockerTarget } from \"../docker/discovery.js\";\nimport type { LocalMcpRuntime } from \"./mcp.js\";\n\nexport interface AgentRuntime extends LocalMcpRuntime {\n state: AgentConnectionState & {\n list(input?: { agent?: AgentId; scope?: AgentScope }): Promise<ManagedConnection[]>;\n };\n adapters: Record<AgentId, AgentAdapter>;\n verifier: AgentMcpVerifier;\n}\n\nexport interface ConnectLocalAgentInput {\n agent: AgentId;\n serverName: string;\n profile: string;\n sourceId?: string;\n container?: string;\n timeoutMs: number;\n dryRun: boolean;\n yes: boolean;\n confirm(message: string): Promise<boolean>;\n now(): Date;\n}\n\nexport interface AgentStatusReport {\n agent: AgentId;\n installed: boolean;\n version?: string;\n serverName: string;\n status: \"connected\" | \"disconnected\" | \"unmanaged\" | \"drifted\" | \"unavailable\";\n managed: boolean;\n verified: boolean;\n}\n\nexport async function connectLocalAgent(\n runtime: AgentRuntime,\n input: ConnectLocalAgentInput,\n): Promise<AgentOperationReport> {\n return connectAgent({\n agent: input.agent,\n serverName: input.serverName,\n scope: \"user\",\n profile: input.profile,\n ...(input.sourceId ? { sourceId: input.sourceId } : {}),\n timeoutMs: input.timeoutMs,\n dryRun: input.dryRun,\n yes: input.yes,\n resolveConnection: async () => {\n const target = await discoverSagContainer({\n docker: runtime.docker,\n ...(input.container ? { container: input.container } : {}),\n interactive: runtime.interactive,\n select: runtime.selectContainer,\n });\n const spec = await new DockerStdioProvider().createSpec({\n target,\n ...(input.sourceId ? { sourceId: input.sourceId } : {}),\n });\n return { target, spec };\n },\n verifier: runtime.verifier,\n adapter: runtime.adapters[input.agent],\n state: runtime.state,\n confirm: input.confirm,\n now: input.now,\n });\n}\n\nasync function agentStatus(\n runtime: AgentRuntime,\n agent: AgentId,\n serverName: string,\n): Promise<AgentStatusReport> {\n const adapter = runtime.adapters[agent];\n let version: string;\n try {\n version = (await adapter.detect()).version;\n } catch {\n return {\n agent,\n installed: false,\n serverName,\n status: \"unavailable\",\n managed: false,\n verified: false,\n };\n }\n const key = connectionKey(agent, \"user\", serverName);\n const [managed, host] = await Promise.all([\n runtime.state.get(key),\n adapter.read(serverName, \"user\"),\n ]);\n if (!host) {\n return {\n agent,\n installed: true,\n version,\n serverName,\n status: managed ? \"drifted\" : \"disconnected\",\n managed: Boolean(managed),\n verified: false,\n };\n }\n if (!managed) {\n return {\n agent,\n installed: true,\n version,\n serverName,\n status: \"unmanaged\",\n managed: false,\n verified: false,\n };\n }\n if (host.fingerprint !== managed.fingerprint) {\n return {\n agent,\n installed: true,\n version,\n serverName,\n status: \"drifted\",\n managed: true,\n verified: false,\n };\n }\n try {\n await runtime.verifier.verify(host.spec, { timeoutMs: 15_000 });\n return {\n agent,\n installed: true,\n version,\n serverName,\n status: \"connected\",\n managed: true,\n verified: true,\n };\n } catch {\n return {\n agent,\n installed: true,\n version,\n serverName,\n status: \"unavailable\",\n managed: true,\n verified: false,\n };\n }\n}\n\nexport async function statusLocalAgents(\n runtime: AgentRuntime,\n input: {\n agent?: AgentId;\n serverName: string;\n },\n): Promise<AgentStatusReport[]> {\n const agents: AgentId[] = input.agent ? [input.agent] : [\"codex\", \"claude-code\"];\n return Promise.all(\n agents.map((agent) => agentStatus(runtime, agent, input.serverName)),\n );\n}\n\nexport async function listAgentHosts(runtime: AgentRuntime): Promise<\n Array<{\n agent: AgentId;\n installed: boolean;\n version?: string;\n managedConnections: number;\n }>\n> {\n return Promise.all(\n ([\"codex\", \"claude-code\"] as const).map(async (agent) => {\n const managedConnections = (await runtime.state.list({ agent })).length;\n try {\n const installation = await runtime.adapters[agent].detect();\n return {\n agent,\n installed: true,\n version: installation.version,\n managedConnections,\n };\n } catch {\n return { agent, installed: false, managedConnections };\n }\n }),\n );\n}\n\nexport async function disconnectLocalAgent(\n runtime: AgentRuntime,\n input: {\n agent: AgentId;\n serverName: string;\n yes: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<AgentOperationReport> {\n return disconnectAgent({\n agent: input.agent,\n serverName: input.serverName,\n scope: \"user\",\n adapter: runtime.adapters[input.agent],\n state: runtime.state,\n yes: input.yes,\n confirm: input.confirm,\n });\n}\n\nexport type { SagDockerTarget };\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { CredentialStore } from \"../credentials/store.js\";\n\nexport interface AuthUser {\n id: string;\n name: string;\n email: string;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n credentialRef: string;\n credentialStore?: CredentialStore[\"kind\"];\n user?: AuthUser;\n}\n\ninterface LoginInput {\n credentialRef: string;\n environmentToken?: string;\n promptToken(): Promise<string>;\n validate(token: string): Promise<AuthUser>;\n store: CredentialStore;\n}\n\ninterface StatusInput {\n credentialRef: string;\n environmentToken?: string;\n validate(token: string): Promise<AuthUser>;\n store: CredentialStore;\n}\n\ninterface LogoutInput {\n credentialRef: string;\n store: CredentialStore;\n}\n\nexport async function login(input: LoginInput): Promise<AuthStatus> {\n const token = input.environmentToken?.trim() || (await input.promptToken());\n if (!token.trim()) {\n throw new CliError(\"AUTH_REQUIRED\", \"A SAG token is required\", {\n exitCode: exitCodes.authRequired,\n hint: \"Paste a token when prompted or set SAG_TOKEN.\",\n });\n }\n const user = await input.validate(token);\n await input.store.set(input.credentialRef, token);\n return {\n authenticated: true,\n credentialRef: input.credentialRef,\n credentialStore: input.store.kind,\n user,\n };\n}\n\nexport async function status(input: StatusInput): Promise<AuthStatus> {\n const token =\n input.environmentToken?.trim() || (await input.store.get(input.credentialRef));\n if (!token) {\n return {\n authenticated: false,\n credentialRef: input.credentialRef,\n credentialStore: input.store.kind,\n };\n }\n const user = await input.validate(token);\n return {\n authenticated: true,\n credentialRef: input.credentialRef,\n credentialStore: input.store.kind,\n user,\n };\n}\n\nexport async function logout(input: LogoutInput): Promise<AuthStatus> {\n await input.store.delete(input.credentialRef);\n return {\n authenticated: false,\n credentialRef: input.credentialRef,\n };\n}\n","import type { SagDocument } from \"../api/schemas.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nexport interface DocumentClient {\n listDocuments(sourceId: string): Promise<SagDocument[]>;\n getDocument(sourceId: string, documentId: string): Promise<SagDocument>;\n}\n\nexport interface DocumentStatusTotals {\n pending: number;\n loading: number;\n extracting: number;\n paused: number;\n ready: number;\n failed: number;\n}\n\nfunction requiredIdentifier(value: string, label: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new CliError(\"INVALID_ARGUMENT\", `${label} is required`, {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return normalized;\n}\n\nexport function summarizeDocuments(documents: SagDocument[]): {\n total: number;\n statuses: DocumentStatusTotals;\n searchable: boolean;\n} {\n const statuses: DocumentStatusTotals = {\n pending: 0,\n loading: 0,\n extracting: 0,\n paused: 0,\n ready: 0,\n failed: 0,\n };\n for (const document of documents) {\n statuses[document.status] += 1;\n }\n return {\n total: documents.length,\n statuses,\n searchable: documents.length > 0 && statuses.ready === documents.length,\n };\n}\n\nexport async function listDocuments(\n client: DocumentClient,\n sourceId: string,\n): Promise<SagDocument[]> {\n return client.listDocuments(requiredIdentifier(sourceId, \"Source ID\"));\n}\n\nexport async function getDocument(\n client: DocumentClient,\n sourceId: string,\n documentId: string,\n): Promise<SagDocument> {\n return client.getDocument(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(documentId, \"Document ID\"),\n );\n}\n\nexport async function documentStatus(\n client: DocumentClient,\n sourceId: string,\n documentId?: string,\n): Promise<\n | { mode: \"document\"; document: SagDocument; searchable: boolean }\n | {\n mode: \"source\";\n sourceId: string;\n total: number;\n statuses: DocumentStatusTotals;\n searchable: boolean;\n }\n> {\n const normalizedSourceId = requiredIdentifier(sourceId, \"Source ID\");\n if (documentId !== undefined) {\n const document = await getDocument(client, normalizedSourceId, documentId);\n return {\n mode: \"document\",\n document,\n searchable: document.status === \"ready\",\n };\n }\n\n const summary = summarizeDocuments(await client.listDocuments(normalizedSourceId));\n return {\n mode: \"source\",\n sourceId: normalizedSourceId,\n total: summary.total,\n statuses: summary.statuses,\n searchable: summary.searchable,\n };\n}\n","import type { DoctorCheck } from \"../diagnostics/doctor.js\";\nimport {\n discoverSagContainer,\n type DockerDiscoveryClient,\n type SagDockerTarget,\n} from \"../docker/discovery.js\";\nimport { toCliError } from \"../core/errors.js\";\nimport { DockerStdioProvider } from \"../mcp/docker-stdio-provider.js\";\nimport { localMcpFailureStage } from \"../mcp/failure.js\";\nimport type { McpVerificationReport, McpVerifyOptions } from \"../mcp/verifier.js\";\n\nexport interface LocalMcpVerifier {\n verify(\n spec: Awaited<ReturnType<DockerStdioProvider[\"createSpec\"]>>,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport>;\n}\n\nexport interface LocalMcpRuntime {\n docker: DockerDiscoveryClient;\n verifier: LocalMcpVerifier;\n interactive: boolean;\n selectContainer(candidates: SagDockerTarget[]): Promise<string>;\n}\n\nexport interface LocalMcpTestInput {\n container?: string;\n sourceId?: string;\n timeoutMs: number;\n}\n\nexport interface LocalMcpTestReport extends McpVerificationReport {\n provider: \"docker-stdio\";\n container: SagDockerTarget;\n sourceId: string | null;\n}\n\nexport async function testLocalMcp(\n runtime: LocalMcpRuntime,\n input: LocalMcpTestInput,\n): Promise<LocalMcpTestReport> {\n const container = await discoverSagContainer({\n docker: runtime.docker,\n ...(input.container ? { container: input.container } : {}),\n interactive: runtime.interactive,\n select: runtime.selectContainer,\n });\n const spec = await new DockerStdioProvider().createSpec({\n target: container,\n ...(input.sourceId ? { sourceId: input.sourceId } : {}),\n });\n const verification = await runtime.verifier.verify(spec, {\n timeoutMs: input.timeoutMs,\n });\n return {\n provider: \"docker-stdio\",\n container,\n sourceId: input.sourceId ?? null,\n ...verification,\n };\n}\n\nfunction skipped(name: DoctorCheck[\"name\"], detail: string): DoctorCheck {\n return {\n name,\n status: \"warn\",\n code: \"CHECK_SKIPPED\",\n detail,\n };\n}\n\nexport async function localMcpDoctorChecks(\n runtime: LocalMcpRuntime,\n input: LocalMcpTestInput,\n): Promise<DoctorCheck[]> {\n try {\n const report = await testLocalMcp(runtime, input);\n return [\n {\n name: \"docker\",\n status: \"pass\",\n code: \"DOCKER_READY\",\n detail: \"Docker daemon is available\",\n },\n {\n name: \"sagContainer\",\n status: \"pass\",\n code: \"SAG_CONTAINER_READY\",\n detail: `${report.container.name} is ${report.container.health}`,\n },\n {\n name: \"mcpEntrypoint\",\n status: \"pass\",\n code: \"MCP_ENTRYPOINT_READY\",\n detail: \"sag_api.mcp.server is importable\",\n },\n {\n name: \"mcpProtocol\",\n status: \"pass\",\n code: \"MCP_PROTOCOL_READY\",\n detail: `${report.protocolVersion} ${report.era}`,\n },\n {\n name: \"mcpTools\",\n status: \"pass\",\n code: \"MCP_TOOLS_READY\",\n detail: `${report.tools.length} tools`,\n },\n {\n name: \"mcpKnowledge\",\n status: \"pass\",\n code: \"MCP_KNOWLEDGE_READY\",\n detail: \"list_sources callable\",\n },\n ];\n } catch (error) {\n const cliError = toCliError(error);\n const mcpStage = localMcpFailureStage(cliError);\n const failedName: DoctorCheck[\"name\"] =\n cliError.code === \"DEPENDENCY_MISSING\"\n ? \"docker\"\n : cliError.code === \"RESOURCE_NOT_FOUND\" ||\n cliError.code === \"SERVICE_NOT_READY\"\n ? \"sagContainer\"\n : mcpStage === \"entrypoint\"\n ? \"mcpEntrypoint\"\n : mcpStage === \"tools\"\n ? \"mcpTools\"\n : mcpStage === \"knowledge\"\n ? \"mcpKnowledge\"\n : \"mcpProtocol\";\n const names: DoctorCheck[\"name\"][] = [\n \"docker\",\n \"sagContainer\",\n \"mcpEntrypoint\",\n \"mcpProtocol\",\n \"mcpTools\",\n \"mcpKnowledge\",\n ];\n const failedIndex = names.indexOf(failedName);\n return names.map((name, index) => {\n if (index < failedIndex) {\n return {\n name,\n status: \"pass\",\n code: \"CHECK_COMPLETED\",\n detail: \"Prerequisite check passed\",\n };\n }\n if (index === failedIndex) {\n return {\n name,\n status: \"fail\",\n code: cliError.code,\n detail: cliError.message,\n ...(cliError.hint ? { hint: cliError.hint } : {}),\n };\n }\n return skipped(name, `Skipped because ${failedName} failed`);\n });\n }\n}\n","import type { SearchInput } from \"../api/client.js\";\nimport type { SagSearchResponse } from \"../api/schemas.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nexport interface SearchClient {\n search(input: SearchInput): Promise<SagSearchResponse>;\n}\n\nexport interface SearchOptions {\n sourceIds?: string[];\n topK?: number;\n strategy?: \"vector\" | \"multi\";\n}\n\nfunction invalid(message: string): never {\n throw new CliError(\"INVALID_ARGUMENT\", message, {\n exitCode: exitCodes.invalidArgument,\n });\n}\n\nexport async function searchKnowledge(\n client: SearchClient,\n query: string,\n options: SearchOptions = {},\n): Promise<SagSearchResponse> {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n invalid(\"Query is required\");\n }\n if (normalizedQuery.length > 4000) {\n invalid(\"Query must not exceed 4000 characters\");\n }\n if (\n options.topK !== undefined &&\n (!Number.isInteger(options.topK) || options.topK < 1 || options.topK > 50)\n ) {\n invalid(\"top-k must be between 1 and 50\");\n }\n if (\n options.strategy !== undefined &&\n ![\"vector\", \"multi\"].includes(options.strategy)\n ) {\n invalid(\"strategy must be vector or multi\");\n }\n\n const sourceIds = [\n ...new Set(\n (options.sourceIds ?? []).map((sourceId) => sourceId.trim()).filter(Boolean),\n ),\n ];\n return client.search({\n query: normalizedQuery,\n ...(sourceIds.length ? { source_ids: sourceIds } : {}),\n ...(options.topK !== undefined ? { top_k: options.topK } : {}),\n ...(options.strategy !== undefined ? { strategy: options.strategy } : {}),\n save_exploration: false,\n });\n}\n","import type { SagDocument, SagSource } from \"../api/schemas.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport { summarizeDocuments } from \"./document.js\";\n\nexport interface SourceClient {\n listSources(): Promise<SagSource[]>;\n getSource(sourceId: string): Promise<SagSource>;\n listDocuments(sourceId: string): Promise<SagDocument[]>;\n}\n\nfunction requiredSourceId(sourceId: string): string {\n const normalized = sourceId.trim();\n if (!normalized) {\n throw new CliError(\"INVALID_ARGUMENT\", \"Source ID is required\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return normalized;\n}\n\nexport function listSources(client: SourceClient): Promise<SagSource[]> {\n return client.listSources();\n}\n\nexport async function getSource(\n client: SourceClient,\n sourceId: string,\n): Promise<SagSource> {\n return client.getSource(requiredSourceId(sourceId));\n}\n\nexport async function sourceStatus(\n client: SourceClient,\n sourceId?: string,\n): Promise<\n | {\n source: SagSource;\n documents: {\n total: number;\n ready: number;\n pending: number;\n loading: number;\n extracting: number;\n paused: number;\n failed: number;\n searchable: boolean;\n };\n }\n | {\n total: number;\n statuses: Record<SagSource[\"status\"], number>;\n documents: {\n total: number;\n ready: number;\n pending: number;\n loading: number;\n extracting: number;\n paused: number;\n failed: number;\n };\n searchableSources: number;\n }\n> {\n if (sourceId === undefined) {\n const sources = await client.listSources();\n const documentSummaries = await Promise.all(\n sources.map(async (source) =>\n summarizeDocuments(await client.listDocuments(source.id)),\n ),\n );\n return {\n total: sources.length,\n statuses: {\n active: sources.filter(({ status }) => status === \"active\").length,\n paused: sources.filter(({ status }) => status === \"paused\").length,\n error: sources.filter(({ status }) => status === \"error\").length,\n },\n documents: {\n total: documentSummaries.reduce((total, summary) => total + summary.total, 0),\n ready: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.ready,\n 0,\n ),\n pending: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.pending,\n 0,\n ),\n loading: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.loading,\n 0,\n ),\n extracting: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.extracting,\n 0,\n ),\n paused: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.paused,\n 0,\n ),\n failed: documentSummaries.reduce(\n (total, summary) => total + summary.statuses.failed,\n 0,\n ),\n },\n searchableSources: documentSummaries.filter(({ searchable }) => searchable)\n .length,\n };\n }\n\n const normalizedSourceId = requiredSourceId(sourceId);\n const [source, documents] = await Promise.all([\n client.getSource(normalizedSourceId),\n client.listDocuments(normalizedSourceId),\n ]);\n const summary = summarizeDocuments(documents);\n return {\n source,\n documents: {\n total: summary.total,\n ready: summary.statuses.ready,\n pending: summary.statuses.pending,\n loading: summary.statuses.loading,\n extracting: summary.statuses.extracting,\n paused: summary.statuses.paused,\n failed: summary.statuses.failed,\n searchable: summary.searchable,\n },\n };\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { SagClientOptions } from \"../api/client.js\";\nimport type { ConfigStore } from \"../config/store.js\";\nimport {\n resolveConnection,\n type ConnectionOptions,\n type ResolvedConnection,\n} from \"../config/resolve.js\";\nimport type { CredentialStore } from \"../credentials/store.js\";\n\nexport interface RuntimeContext<TClient> {\n connection: ResolvedConnection;\n credentialRef: string;\n token?: string;\n client: TClient;\n}\n\nfunction directCredentialRef(url: string): string {\n const fingerprint = createHash(\"sha256\").update(url).digest(\"hex\").slice(0, 16);\n return `sag-cli/direct-${fingerprint}`;\n}\n\nexport async function createRuntimeContext<TClient>(input: {\n options: ConnectionOptions;\n environment: NodeJS.ProcessEnv;\n configStore: ConfigStore;\n credentialStore: CredentialStore;\n createClient(options: SagClientOptions): TClient;\n}): Promise<RuntimeContext<TClient>> {\n const config = await input.configStore.load();\n const connection = resolveConnection(input.options, input.environment, config);\n const credentialRef = connection.credentialRef ?? directCredentialRef(connection.url);\n const token =\n connection.environmentToken ??\n (await input.credentialStore.get(credentialRef)) ??\n undefined;\n return {\n connection,\n credentialRef,\n ...(token ? { token } : {}),\n client: input.createClient({\n origin: connection.url,\n ...(token ? { token } : {}),\n }),\n };\n}\n","import type { CliError, CliErrorShape } from \"./errors.js\";\n\nexport const OUTPUT_SCHEMA = \"sag.cli.v1\" as const;\n\nexport type ResultEnvelope<T> =\n | {\n schema: typeof OUTPUT_SCHEMA;\n ok: true;\n data: T;\n }\n | {\n schema: typeof OUTPUT_SCHEMA;\n ok: false;\n error: CliErrorShape;\n };\n\nexport function success<T>(data: T): ResultEnvelope<T> {\n return {\n schema: OUTPUT_SCHEMA,\n ok: true,\n data,\n };\n}\n\nexport function failure(error: CliError): ResultEnvelope<never> {\n return {\n schema: OUTPUT_SCHEMA,\n ok: false,\n error: error.toShape(),\n };\n}\n","import type {\n SagDocument,\n SagMcpDescriptor,\n SagReady,\n SagRoot,\n SagSource,\n SagUser,\n} from \"../api/schemas.js\";\nimport { toCliError } from \"../core/errors.js\";\n\nexport interface DoctorClient {\n root(): Promise<SagRoot>;\n ready(): Promise<SagReady>;\n me(): Promise<SagUser>;\n listSources(): Promise<SagSource[]>;\n listDocuments(sourceId: string): Promise<SagDocument[]>;\n mcpDescriptor(): Promise<SagMcpDescriptor>;\n}\n\nexport type CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\nexport interface DoctorCheck {\n name:\n | \"service\"\n | \"readiness\"\n | \"authentication\"\n | \"sources\"\n | \"documents\"\n | \"mcp\"\n | \"docker\"\n | \"sagContainer\"\n | \"mcpEntrypoint\"\n | \"mcpProtocol\"\n | \"mcpTools\"\n | \"mcpKnowledge\";\n status: CheckStatus;\n code: string;\n detail: string;\n hint?: string;\n}\n\ntype DocumentStatusTotals = Record<SagDocument[\"status\"], number>;\n\nexport interface DoctorReport {\n status: CheckStatus;\n url: string;\n profileName?: string;\n sagVersion?: string;\n checks: DoctorCheck[];\n summary: {\n sources: number;\n documents: number;\n documentStatuses: DocumentStatusTotals;\n mcpTools: number;\n };\n}\n\nfunction emptyDocumentStatuses(): DocumentStatusTotals {\n return {\n pending: 0,\n loading: 0,\n extracting: 0,\n paused: 0,\n ready: 0,\n failed: 0,\n };\n}\n\nfunction errorCheck(\n name: DoctorCheck[\"name\"],\n error: unknown,\n fallbackHint?: string,\n): DoctorCheck {\n const cliError = toCliError(error);\n const hint = cliError.hint ?? fallbackHint;\n return {\n name,\n status: \"fail\",\n code: cliError.code,\n detail: cliError.message,\n ...(hint ? { hint } : {}),\n };\n}\n\nfunction skippedCheck(name: DoctorCheck[\"name\"], reason: string): DoctorCheck {\n return {\n name,\n status: \"warn\",\n code: \"CHECK_SKIPPED\",\n detail: reason,\n };\n}\n\nfunction overallStatus(checks: DoctorCheck[]): CheckStatus {\n if (checks.some((check) => check.status === \"fail\")) {\n return \"fail\";\n }\n if (checks.some((check) => check.status === \"warn\")) {\n return \"warn\";\n }\n return \"pass\";\n}\n\nfunction sagVersionCheck(name: string, version: string): DoctorCheck {\n const match = /^(\\d+)\\.(\\d+)(?:\\.|$)/u.exec(version);\n if (!match) {\n return {\n name: \"service\",\n status: \"warn\",\n code: \"SAG_VERSION_UNVERIFIED\",\n detail: `${name} ${version}`,\n hint: \"This SAG version could not be checked against >=1.4.0 <2.0.0.\",\n };\n }\n const major = Number(match[1]);\n const minor = Number(match[2]);\n if (major !== 1 || minor < 4) {\n return {\n name: \"service\",\n status: \"fail\",\n code: \"SAG_VERSION_INCOMPATIBLE\",\n detail: `${name} ${version} is outside the supported range >=1.4.0 <2.0.0`,\n hint: \"Use a compatible SAG version or upgrade SAG CLI.\",\n };\n }\n return {\n name: \"service\",\n status: \"pass\",\n code: \"SAG_REACHABLE\",\n detail: `${name} ${version}`,\n };\n}\n\nfunction documentDetail(total: number, statuses: DocumentStatusTotals): string {\n const displayOrder = [\n \"ready\",\n \"pending\",\n \"loading\",\n \"extracting\",\n \"paused\",\n \"failed\",\n ] as const;\n const parts = displayOrder\n .filter((status) => statuses[status] > 0)\n .map((status) => `${statuses[status]} ${status}`);\n return `${total} ${total === 1 ? \"document\" : \"documents\"}${\n parts.length ? `: ${parts.join(\", \")}` : \"\"\n }`;\n}\n\nexport async function runDoctor(\n client: DoctorClient,\n input: { url: string; profileName?: string },\n localMcpChecks?: () => Promise<DoctorCheck[]>,\n): Promise<DoctorReport> {\n const checks: DoctorCheck[] = [];\n let sagVersion: string | undefined;\n let authenticated = false;\n let sources: SagSource[] | undefined;\n const documentStatuses = emptyDocumentStatuses();\n let documentCount = 0;\n let mcpTools = 0;\n\n try {\n const root = await client.root();\n sagVersion = root.version;\n checks.push(sagVersionCheck(root.name, root.version));\n } catch (error) {\n checks.push(errorCheck(\"service\", error));\n }\n\n try {\n const ready = await client.ready();\n if (!ready.db || ready.status !== \"ready\") {\n checks.push({\n name: \"readiness\",\n status: \"fail\",\n code: \"SERVICE_NOT_READY\",\n detail: \"SAG database is not ready\",\n hint: \"Check SAG API and database logs.\",\n });\n } else {\n checks.push({\n name: \"readiness\",\n status: \"pass\",\n code: \"SAG_READY\",\n detail: \"Database is ready\",\n });\n }\n } catch (error) {\n checks.push(errorCheck(\"readiness\", error));\n }\n\n try {\n const user = await client.me();\n authenticated = true;\n checks.push({\n name: \"authentication\",\n status: \"pass\",\n code: \"AUTH_VALID\",\n detail: `${user.name} <${user.email}>`,\n });\n } catch (error) {\n checks.push(\n errorCheck(\"authentication\", error, \"Run `sag auth login` or set SAG_TOKEN.\"),\n );\n }\n\n if (!authenticated) {\n const reason = \"Skipped because authentication failed\";\n checks.push(skippedCheck(\"sources\", reason));\n checks.push(skippedCheck(\"documents\", reason));\n checks.push(skippedCheck(\"mcp\", reason));\n } else {\n try {\n sources = await client.listSources();\n checks.push({\n name: \"sources\",\n status: sources.length ? \"pass\" : \"warn\",\n code: sources.length ? \"SOURCES_AVAILABLE\" : \"NO_SOURCES\",\n detail: `${sources.length} ${sources.length === 1 ? \"source\" : \"sources\"}`,\n ...(!sources.length\n ? { hint: \"Create and populate a knowledge source in SAG.\" }\n : {}),\n });\n } catch (error) {\n checks.push(errorCheck(\"sources\", error));\n }\n\n if (!sources) {\n checks.push(\n skippedCheck(\"documents\", \"Skipped because sources could not be listed\"),\n );\n } else {\n try {\n const documents = (\n await Promise.all(sources.map((source) => client.listDocuments(source.id)))\n ).flat();\n documentCount = documents.length;\n for (const document of documents) {\n documentStatuses[document.status] += 1;\n }\n const hasUnready =\n documentStatuses.pending +\n documentStatuses.loading +\n documentStatuses.extracting +\n documentStatuses.paused +\n documentStatuses.failed >\n 0;\n checks.push({\n name: \"documents\",\n status: hasUnready || !documents.length ? \"warn\" : \"pass\",\n code: !documents.length\n ? \"NO_DOCUMENTS\"\n : hasUnready\n ? \"DOCUMENTS_PROCESSING\"\n : \"DOCUMENTS_READY\",\n detail: documentDetail(documentCount, documentStatuses),\n ...(hasUnready\n ? {\n hint: `Run \\`sag document status --source ${sources[0]?.id ?? \"<source-id>\"}\\` for details.`,\n }\n : {}),\n });\n } catch (error) {\n checks.push(errorCheck(\"documents\", error));\n }\n }\n\n try {\n const descriptor = await client.mcpDescriptor();\n mcpTools = descriptor.tools.length;\n checks.push({\n name: \"mcp\",\n status: \"pass\",\n code: \"MCP_DESCRIPTOR_READY\",\n detail: `${mcpTools} tools via ${descriptor.http.transport}`,\n });\n } catch (error) {\n checks.push(errorCheck(\"mcp\", error));\n }\n }\n\n if (localMcpChecks) {\n try {\n checks.push(...(await localMcpChecks()));\n } catch (error) {\n checks.push(errorCheck(\"docker\", error));\n }\n }\n\n return {\n status: overallStatus(checks),\n url: input.url,\n ...(input.profileName ? { profileName: input.profileName } : {}),\n ...(sagVersion ? { sagVersion } : {}),\n checks,\n summary: {\n sources: sources?.length ?? 0,\n documents: documentCount,\n documentStatuses,\n mcpTools,\n },\n };\n}\n","import type { DoctorReport } from \"../diagnostics/doctor.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction renderRows(rows: Record<string, unknown>[]): string {\n if (!rows.length) return \"No results.\\n\";\n const preferredColumns = [\n \"current\",\n \"agent\",\n \"installed\",\n \"version\",\n \"serverName\",\n \"managed\",\n \"verified\",\n \"managedConnections\",\n \"id\",\n \"name\",\n \"filename\",\n \"status\",\n \"url\",\n \"document_count\",\n \"chunk_count\",\n \"progress\",\n ];\n const available = new Set(rows.flatMap((row) => Object.keys(row)));\n const columns = preferredColumns.filter((column) => available.has(column));\n const selected = columns.length ? columns : Object.keys(rows[0] ?? {});\n const widths = selected.map((column) =>\n Math.max(column.length, ...rows.map((row) => String(row[column] ?? \"\").length)),\n );\n const line = (values: unknown[]) =>\n values\n .map((value, index) => String(value ?? \"\").padEnd(widths[index] ?? 0))\n .join(\" \")\n .trimEnd();\n return `${[\n line(selected),\n line(widths.map((width) => \"-\".repeat(width))),\n ...rows.map((row) => line(selected.map((column) => row[column]))),\n ].join(\"\\n\")}\\n`;\n}\n\nfunction renderDoctor(report: DoctorReport): string {\n const lines = [\n `SAG doctor: ${report.status.toUpperCase()}`,\n `URL: ${report.url}`,\n ...report.checks.map(\n (check) =>\n `${check.status === \"pass\" ? \"✓\" : check.status === \"warn\" ? \"!\" : \"✗\"} ${check.name}: ${check.detail}${check.hint ? ` — ${check.hint}` : \"\"}`,\n ),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderSearch(value: Record<string, unknown>): string {\n const summary = typeof value.summary === \"string\" ? value.summary : \"\";\n const sections = Array.isArray(value.sections) ? value.sections.filter(isRecord) : [];\n const lines = [\n summary,\n ...sections.map((section) => {\n const source = section.source_name || section.source_id || \"Unknown source\";\n const heading = section.heading || \"Result\";\n const content = section.content || \"\";\n return `[${source}] ${heading}\\n${content}`;\n }),\n ].filter(Boolean);\n return `${lines.join(\"\\n\\n\")}\\n`;\n}\n\nfunction renderLocalMcp(value: Record<string, unknown>): string {\n const container = isRecord(value.container) ? value.container : {};\n const tools = Array.isArray(value.tools) ? value.tools : [];\n return `${[\n \"SAG MCP: PASS\",\n `Container: ${String(container.name ?? \"unknown\")}`,\n `Health: ${String(container.health ?? \"unknown\")}`,\n `Protocol: ${String(value.protocolVersion ?? \"unknown\")} (${String(value.era ?? \"unknown\")})`,\n `Tools: ${tools.length}`,\n `Knowledge: ${value.listSourcesCallable ? \"list_sources callable\" : \"unavailable\"}`,\n ].join(\"\\n\")}\\n`;\n}\n\nexport function renderHuman(value: unknown, quiet = false): string {\n if (quiet) {\n if (Array.isArray(value)) {\n return `${value\n .map((item) =>\n isRecord(item) ? (item.id ?? item.name ?? JSON.stringify(item)) : item,\n )\n .join(\"\\n\")}\\n`;\n }\n if (isRecord(value) && typeof value.summary === \"string\") {\n return `${value.summary}\\n`;\n }\n }\n\n if (Array.isArray(value) && value.every(isRecord)) {\n return renderRows(value);\n }\n if (isRecord(value) && Array.isArray(value.checks) && \"summary\" in value) {\n return renderDoctor(value as unknown as DoctorReport);\n }\n if (isRecord(value) && Array.isArray(value.sections) && \"query\" in value) {\n return renderSearch(value);\n }\n if (\n isRecord(value) &&\n value.provider === \"docker-stdio\" &&\n \"protocolVersion\" in value &&\n \"container\" in value\n ) {\n return renderLocalMcp(value);\n }\n if (typeof value === \"string\") {\n return `${value}\\n`;\n }\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n","const SENSITIVE_KEYS = new Set([\n \"authorization\",\n \"token\",\n \"access_token\",\n \"password\",\n \"secret\",\n \"secretkey\",\n \"secret_key\",\n]);\n\nconst BEARER_TOKEN = /\\bBearer\\s+[^\\s\"',}\\]]+/giu;\n\nfunction redactString(value: string): string {\n return value.replace(BEARER_TOKEN, \"Bearer [REDACTED]\");\n}\n\nexport function redact(value: unknown): unknown {\n if (typeof value === \"string\") {\n return redactString(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => redact(item));\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => {\n const normalizedKey = key.toLowerCase();\n if (normalizedKey === \"authorization\" && typeof item === \"string\") {\n return [key, redactString(item)];\n }\n return [key, SENSITIVE_KEYS.has(normalizedKey) ? \"[REDACTED]\" : redact(item)];\n }),\n );\n }\n return value;\n}\n","import type { ResultEnvelope } from \"../core/result.js\";\nimport { redact } from \"./redaction.js\";\n\nexport function renderJson<T>(result: ResultEnvelope<T>): string {\n return `${JSON.stringify(redact(result))}\\n`;\n}\n"],"mappings":"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","names":["z","z","invalidSpec","hostFailure","ensureSuccess","readFile","path","z","z","path","readFile","mkdir","readFile","rename","unlink","writeFile","path","parse","stringify","z","readFile","parse","path","mkdir","writeFile","stringify","rename","unlink","os","path","z","listSources","z","path","status","hostFailure","runtime","runtime","source","status","summary","createHash","createHash","status","dependencies"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zleap-ai/sag-cli",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Command-line client and diagnostics for SAG knowledge bases",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sag": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsup",
|
|
16
|
+
"dev": "tsx src/cli.ts",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"test:coverage": "vitest run --coverage",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"lint": "eslint .",
|
|
22
|
+
"format": "prettier --write .",
|
|
23
|
+
"format:check": "prettier --check .",
|
|
24
|
+
"check": "npm run format:check && npm run lint && npm run typecheck && npm test && npm run build",
|
|
25
|
+
"prepare": "husky",
|
|
26
|
+
"commitlint": "commitlint",
|
|
27
|
+
"changeset": "changeset",
|
|
28
|
+
"version-packages": "changeset version",
|
|
29
|
+
"release:check": "bash scripts/release.sh",
|
|
30
|
+
"release": "bash scripts/release.sh --publish"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.19.0"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@inquirer/prompts": "^8.5.2",
|
|
41
|
+
"@modelcontextprotocol/client": "^2.0.0",
|
|
42
|
+
"commander": "^14.0.3",
|
|
43
|
+
"proper-lockfile": "^4.1.2",
|
|
44
|
+
"yaml": "^2.9.0",
|
|
45
|
+
"zod": "^4.4.3"
|
|
46
|
+
},
|
|
47
|
+
"optionalDependencies": {
|
|
48
|
+
"@napi-rs/keyring": "^1.3.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@changesets/cli": "^2.31.1",
|
|
52
|
+
"@commitlint/cli": "^20.0.0",
|
|
53
|
+
"@commitlint/config-conventional": "^20.0.0",
|
|
54
|
+
"@eslint/js": "^10.0.1",
|
|
55
|
+
"@types/node": "^20.19.43",
|
|
56
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^8.65.0",
|
|
58
|
+
"@typescript-eslint/parser": "^8.65.0",
|
|
59
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
60
|
+
"eslint": "^10.8.0",
|
|
61
|
+
"husky": "^9.1.7",
|
|
62
|
+
"lint-staged": "^16.2.7",
|
|
63
|
+
"prettier": "^3.9.6",
|
|
64
|
+
"tsup": "^8.5.1",
|
|
65
|
+
"tsx": "^4.23.1",
|
|
66
|
+
"typescript": "^6.0.3",
|
|
67
|
+
"vitest": "^4.1.10"
|
|
68
|
+
},
|
|
69
|
+
"lint-staged": {
|
|
70
|
+
"*.{ts,js,mjs,cjs}": [
|
|
71
|
+
"eslint --fix",
|
|
72
|
+
"prettier --write"
|
|
73
|
+
],
|
|
74
|
+
"*.{json,md,yml,yaml}": [
|
|
75
|
+
"prettier --write"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|