@zleap-ai/sag-cli 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +115 -26
- package/dist/cli.js.map +1 -1
- package/dist/sag-knowledge.zip +0 -0
- package/dist/skill-cli.cjs +3 -3
- package/package.json +1 -1
- package/skill/SKILL.md +13 -3
- package/skill/manifest.json +2 -2
- package/skill/references/cli-reference.md +4 -2
- package/skill/scripts/sag-knowledge.cjs +3 -3
package/dist/cli.js.map
CHANGED
|
@@ -1 +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/workbuddy.ts","../src/agents/state.ts","../src/config/store.ts","../src/config/resolve.ts","../src/config/schema.ts","../src/config/paths.ts","../src/credentials/file.ts","../src/credentials/memory.ts","../src/credentials/namespaces.ts","../src/credentials/keychain.ts","../src/docker/schemas.ts","../src/docker/client.ts","../src/mcp/interactive-input.ts","../src/mcp/enterprise/managed-state.ts","../src/mcp/enterprise/store.ts","../src/mcp/verifier.ts","../src/mcp/failure.ts","../src/mcp/commands.ts","../src/mcp/enterprise/model.ts","../src/mcp/enterprise/risk.ts","../src/process/runner.ts","../src/skill/state-store.ts","../src/skill/account-auth-client.ts","../src/skill/account-config.ts","../src/skill/model.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/knowledge.ts","../src/commands/mcp.ts","../src/mcp/enterprise/credentials.ts","../src/mcp/enterprise/import.ts","../src/mcp/enterprise/runtime.ts","../src/mcp/enterprise/service.ts","../src/mcp/enterprise/agent-service.ts","../src/mcp/enterprise/skill-service.ts","../src/commands/enterprise-mcp.ts","../src/commands/search.ts","../src/commands/source.ts","../src/core/context.ts","../src/core/result.ts","../src/diagnostics/doctor.ts","../src/output/redaction.ts","../src/output/human.ts","../src/output/json.ts","../src/output/ndjson.ts","../src/skill/installer.ts","../src/skill/account-auth.ts","../src/skill/account-knowledge.ts","../src/skill/account-upload.ts","../src/skill/knowledge-client.ts"],"sourcesContent":["import { mkdtemp, rm } from \"node:fs/promises\";\nimport os, { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nimport { checkbox, confirm, input, 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 { WorkBuddyAdapter } from \"./agents/workbuddy.js\";\nimport { isAgentInstalled } from \"./agents/adapter.js\";\nimport { ManagedConnectionStore } from \"./agents/state.js\";\nimport { ConfigStore } from \"./config/store.js\";\nimport {\n defaultConfigPath,\n defaultEnterpriseMcpConnectionsPath,\n defaultEnterpriseMcpCredentialsPath,\n defaultEnterpriseMcpManagedStatePath,\n defaultManagedConnectionsPath,\n defaultSkillAccountConfigPath,\n defaultSkillStatePath,\n} from \"./config/paths.js\";\nimport { CliError, exitCodes } from \"./core/errors.js\";\nimport { FileCredentialStore } from \"./credentials/file.js\";\nimport {\n createCredentialStore,\n createEnterpriseKeychainCredentialStore,\n} from \"./credentials/keychain.js\";\nimport type { CredentialStore } from \"./credentials/store.js\";\nimport { DockerClient } from \"./docker/client.js\";\nimport { readInteractiveMcpJson } from \"./mcp/interactive-input.js\";\nimport { EnterpriseMcpManagedStateStore } from \"./mcp/enterprise/managed-state.js\";\nimport { EnterpriseMcpConnectionStore } from \"./mcp/enterprise/store.js\";\nimport { McpVerifier } from \"./mcp/verifier.js\";\nimport { NodeProcessRunner } from \"./process/runner.js\";\nimport { SkillStateStore } from \"./skill/state-store.js\";\nimport { SkillAccountAuthHttpClient } from \"./skill/account-auth-client.js\";\nimport { SkillAccountConfigStore } from \"./skill/account-config.js\";\nimport { defaultClientFactory, runCli, type CliDependencies } from \"./program.js\";\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let input = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk: string) => {\n input += chunk;\n });\n process.stdin.once(\"end\", () => resolve(input));\n process.stdin.once(\"error\", reject);\n });\n}\n\nasync function resolveLatestSkillBundle(processRunner: NodeProcessRunner): Promise<{\n bundlePath: string;\n cleanup(): Promise<void>;\n}> {\n const directory = await mkdtemp(path.join(tmpdir(), \"sag-skill-latest-\"));\n const cleanup = () => rm(directory, { recursive: true, force: true });\n try {\n const packed = await processRunner.run({\n command: \"npm\",\n args: [\n \"pack\",\n \"@zleap-ai/sag-cli@latest\",\n \"--ignore-scripts\",\n \"--json\",\n \"--pack-destination\",\n directory,\n \"--cache\",\n path.join(directory, \"npm-cache\"),\n \"--prefer-online\",\n ],\n timeoutMs: 60_000,\n });\n if (packed.exitCode !== 0) throw new Error(\"npm pack failed\");\n const result: unknown = JSON.parse(packed.stdout);\n const filename =\n Array.isArray(result) &&\n typeof result[0] === \"object\" &&\n result[0] !== null &&\n typeof (result[0] as { filename?: unknown }).filename === \"string\"\n ? (result[0] as { filename: string }).filename\n : null;\n if (!filename || path.basename(filename) !== filename) {\n throw new Error(\"npm pack returned an invalid filename\");\n }\n const extracted = await processRunner.run({\n command: \"tar\",\n args: [\"-xzf\", path.join(directory, filename), \"-C\", directory],\n timeoutMs: 30_000,\n });\n if (extracted.exitCode !== 0) throw new Error(\"tar extraction failed\");\n return { bundlePath: path.join(directory, \"package\", \"skill\"), cleanup };\n } catch (cause) {\n await cleanup();\n throw new CliError(\n \"NETWORK_UNREACHABLE\",\n \"Unable to resolve @latest Skill package\",\n {\n exitCode: exitCodes.networkUnreachable,\n cause,\n hint: \"Check npm network access and retry; the installed Skill was not changed.\",\n },\n );\n }\n}\n\nconst credentialSelection = await createCredentialStore();\nif (credentialSelection.warning) {\n process.stderr.write(`Warning: ${credentialSelection.warning}\\n`);\n}\nconst processRunner = new NodeProcessRunner();\nconst verifier = new McpVerifier(packageJson.version);\nconst adapters = {\n codex: new CodexAdapter(processRunner),\n \"claude-code\": new ClaudeCodeAdapter(processRunner),\n workbuddy: new WorkBuddyAdapter(),\n} as const;\nconst enterpriseManaged = new EnterpriseMcpManagedStateStore(\n defaultEnterpriseMcpManagedStatePath(),\n);\nconst skillState = new SkillStateStore(defaultSkillStatePath());\nconst skillAccountConfig = new SkillAccountConfigStore(defaultSkillAccountConfigPath());\n\nasync function openSkillAuthorizationBrowser(\n processRunner: NodeProcessRunner,\n verificationUrl: string,\n): Promise<void> {\n const command =\n process.platform === \"darwin\"\n ? { command: \"open\", args: [verificationUrl] }\n : process.platform === \"win32\"\n ? { command: \"cmd\", args: [\"/c\", \"start\", \"\", verificationUrl] }\n : { command: \"xdg-open\", args: [verificationUrl] };\n const result = await processRunner.run({\n ...command,\n timeoutMs: 10_000,\n });\n if (result.exitCode !== 0) throw new Error(\"browser opener failed\");\n}\n\nfunction unavailableEnterpriseKeychain(): CredentialStore {\n const unavailable = () => {\n throw new CliError(\"DEPENDENCY_MISSING\", \"系统凭据库不可用\", {\n exitCode: exitCodes.dependencyMissing,\n hint: \"请恢复系统凭据库,或明确使用 --credential-store file。\",\n });\n };\n return {\n kind: \"keychain\",\n get: async () => unavailable(),\n set: async () => unavailable(),\n delete: async () => unavailable(),\n };\n}\n\nconst enterpriseKeychain = await createEnterpriseKeychainCredentialStore().catch(() =>\n unavailableEnterpriseKeychain(),\n);\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 promptName: () => input({ message: \"SAG user name\" }),\n promptSkillOrigin: () => input({ message: \"SAG address\" }),\n confirm: (message) => confirm({ message, default: false }),\n readStdin,\n stdinIsTty: Boolean(process.stdin.isTTY),\n promptMcpJson: () =>\n readInteractiveMcpJson({\n input: process.stdin,\n writeStderr: (value) => process.stderr.write(value),\n }),\n selectMcpServers: (servers) =>\n checkbox({\n message: \"请选择要连接的 MCP Server(默认不选择)\",\n choices: servers.map((server) => ({\n name: server.serverKey,\n value: server.serverKey,\n checked: false,\n })),\n }),\n selectAgents: async (installed) => {\n const selected = await checkbox({\n message: \"请选择要接入的 Agent(默认不选择)\",\n choices: [\n {\n name: \"全选已安装 Agent\",\n value: \"all\" as const,\n checked: false,\n },\n ...installed.map((agent) => ({\n name: agent,\n value: agent,\n checked: false,\n })),\n ],\n });\n return selected.includes(\"all\")\n ? installed\n : selected.filter((agent) => agent !== \"all\");\n },\n selectCollisionAction: (collision) =>\n select({\n message: `MCP Server ${collision.serverKey} 已指向其他地址,请选择处理方式`,\n choices: [\n { name: \"替换原连接\", value: \"replace\" as const },\n { name: \"保留两个连接\", value: \"keep-both\" as const },\n ],\n }),\n writeStdout: (value) => process.stdout.write(value),\n writeStderr: (value) => process.stderr.write(value),\n localMcp: {\n docker: new DockerClient(processRunner),\n verifier,\n state: new ManagedConnectionStore(defaultManagedConnectionsPath()),\n adapters,\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 enterpriseMcp: {\n store: new EnterpriseMcpConnectionStore(defaultEnterpriseMcpConnectionsPath()),\n credentials: {\n keychain: enterpriseKeychain,\n file: new FileCredentialStore(defaultEnterpriseMcpCredentialsPath()),\n },\n verifier,\n agents: {\n adapters,\n managed: enterpriseManaged,\n verifier,\n confirm: (message) => confirm({ message, default: false }),\n now: () => new Date(),\n },\n skill: {\n home: os.homedir(),\n environment: { CODEX_HOME: process.env.CODEX_HOME },\n managed: enterpriseManaged,\n now: () => new Date(),\n },\n now: () => new Date(),\n },\n skill: {\n home: os.homedir(),\n environment: { CODEX_HOME: process.env.CODEX_HOME },\n state: skillState,\n agents: {\n codex: { id: \"codex\", installed: () => isAgentInstalled(adapters.codex) },\n \"claude-code\": {\n id: \"claude-code\",\n installed: () => isAgentInstalled(adapters[\"claude-code\"]),\n },\n workbuddy: {\n id: \"workbuddy\",\n installed: () => isAgentInstalled(adapters.workbuddy),\n },\n },\n now: () => new Date(),\n confirm: (message) => confirm({ message, default: false }),\n resolveLatestBundle: () => resolveLatestSkillBundle(processRunner),\n },\n skillAccount: {\n client: new SkillAccountAuthHttpClient(),\n config: skillAccountConfig,\n now: () => new Date(),\n openBrowser: (verificationUrl) =>\n openSkillAuthorizationBrowser(processRunner, verificationUrl),\n },\n};\n\nprocess.exitCode = await runCli(process.argv, dependencies);\n","{\n \"name\": \"@zleap-ai/sag-cli\",\n \"version\": \"0.6.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 \"README.en.md\",\n \"LICENSE\",\n \"skill\",\n \"skills/sag-mcp\"\n ],\n \"scripts\": {\n \"build\": \"tsup && node scripts/sync-skill-runtime.mjs\",\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.union([\n 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 z.object({\n type: z.literal(\"http\"),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()),\n }),\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 \"The Claude Code adapter supports user-scoped stdio and HTTP MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"Run `claude mcp list` to inspect the current Claude Code MCP configuration.\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"The Claude Code MCP entry is already owned by a different configuration\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"Choose another MCP server name or remove the existing user-owned entry.\",\n },\n );\n}\n\nfunction sameSpec(left: McpConnectionSpec, right: McpConnectionSpec): boolean {\n return fingerprintConnection(left) === fingerprintConnection(right);\n}\n\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly id = \"claude-code\" as const;\n readonly capabilities = {\n transports: [\"stdio\", \"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } 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 entry.type === \"http\"\n ? {\n transport: \"streamable-http\",\n url: entry.url,\n headers: entry.headers,\n }\n : {\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 {\n throw hostFailure(\"Claude Code user MCP configuration is invalid\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (spec.transport === \"stdio\" && Object.keys(spec.env).length) {\n throw invalidSpec();\n }\n const existing = await this.read(name, scope);\n if (existing) {\n if (sameSpec(existing.spec, spec)) return;\n throw conflict();\n }\n const args =\n spec.transport === \"streamable-http\"\n ? [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"http\",\n \"--scope\",\n \"user\",\n name,\n spec.url,\n ...Object.entries(spec.headers).flatMap(([key, value]) => [\n \"--header\",\n `${key}: ${value}`,\n ]),\n ]\n : [\"mcp\", \"add\", \"--scope\", scope, name, \"--\", spec.command, ...spec.args];\n let result: ProcessResult | undefined;\n try {\n result = await this.runner.run({ command: \"claude\", args, timeoutMs: 15_000 });\n } catch {\n // A failed invocation does not prove that Claude Code created an entry.\n }\n if (result?.exitCode === 0) return;\n const afterFailure = await this.read(name, scope);\n if (afterFailure && sameSpec(afterFailure.spec, spec)) {\n let rollback: ProcessResult | undefined;\n try {\n rollback = await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"remove\", \"--scope\", \"user\", name],\n timeoutMs: 15_000,\n });\n } catch {\n // Report an incomplete rollback without carrying a potentially sensitive cause.\n }\n if (!rollback || rollback.exitCode !== 0) {\n throw hostFailure(\"Claude Code add failed and rollback did not complete\");\n }\n }\n throw hostFailure(\"Claude Code failed to add the MCP server\");\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") throw invalidSpec();\n if (!(await this.read(name, scope))) return;\n let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"remove\", \"--scope\", scope, name],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Claude Code failed to remove the MCP server\");\n }\n if (\n result.exitCode !== 0 &&\n !/not found|does not exist|no mcp server/iu.test(result.stderr)\n ) {\n throw hostFailure(\"Claude Code failed to 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 | \"EXTERNAL_DEPENDENCY_MISSING\"\n | \"INVALID_RESPONSE\"\n | \"INTERNAL_ERROR\";\n\nexport type SkillErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"AUTH_REQUIRED\"\n | \"AUTH_EXPIRED\"\n | \"PERMISSION_DENIED\"\n | \"FILE_NOT_FOUND\"\n | \"FILE_TOO_LARGE\"\n | \"UNSUPPORTED_FILE_TYPE\"\n | \"DOCUMENT_IMPORT_DUPLICATE\"\n | \"DOCUMENT_TITLE_CONFLICT\"\n | \"DOCUMENT_NOT_FOUND\"\n | \"STALE_VERSION\"\n | \"NETWORK_UNREACHABLE\"\n | \"RATE_LIMITED\"\n | \"UPLOAD_FAILED\"\n | \"PROCESSING_FAILED\"\n | \"INSTALL_TICKET_EXPIRED\"\n | \"INSTALL_TARGET_CONFLICT\"\n | \"CLIENT_UPDATE_REQUIRED\"\n | \"PLATFORM_UNAVAILABLE\"\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 function toSkillErrorCode(code: CliErrorCode): SkillErrorCode {\n switch (code) {\n case \"AUTH_REQUIRED\":\n case \"PERMISSION_DENIED\":\n case \"NETWORK_UNREACHABLE\":\n case \"INVALID_ARGUMENT\":\n case \"MCP_FAILED\":\n case \"HOST_NOT_FOUND\":\n case \"HOST_CONFIG_FAILED\":\n case \"CONFIG_CONFLICT\":\n case \"DEPENDENCY_MISSING\":\n case \"INVALID_RESPONSE\":\n case \"INTERNAL_ERROR\":\n return code;\n case \"EXTERNAL_DEPENDENCY_MISSING\":\n return \"DEPENDENCY_MISSING\";\n case \"SERVICE_NOT_READY\":\n return \"PLATFORM_UNAVAILABLE\";\n case \"RESOURCE_NOT_FOUND\":\n return \"DOCUMENT_NOT_FOUND\";\n case \"DOCUMENT_NOT_READY\":\n return \"PROCESSING_FAILED\";\n default:\n return \"INTERNAL_ERROR\";\n }\n}\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 externalDependencyMissing: 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\" | \"workbuddy\";\nexport type PersonalAgentId = Exclude<AgentId, \"workbuddy\">;\nexport type AgentScope = \"user\";\n\nexport interface AgentCapabilities {\n transports: ReadonlyArray<McpConnectionSpec[\"transport\"]>;\n scopes: ReadonlyArray<AgentScope>;\n structuredRead: boolean;\n projectApproval: boolean;\n}\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 readonly capabilities: AgentCapabilities;\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\n/**\n * Host detection is deliberately best-effort: a missing Agent is not an\n * installation failure for the other user-level Skill targets.\n */\nexport async function isAgentInstalled(adapter: AgentAdapter): Promise<boolean> {\n try {\n await adapter.detect();\n return true;\n } catch {\n return false;\n }\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 {\n chmod,\n mkdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile,\n} 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 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.union([\n 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 z\n .object({\n type: z.enum([\"http\", \"streamable-http\", \"streamable_http\"]),\n url: z.string().url(),\n })\n .passthrough(),\n ]),\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\nexport interface CodexAdapterOptions {\n configPath?: string;\n}\n\nfunction invalidSpec(): CliError {\n return new CliError(\n \"INVALID_ARGUMENT\",\n \"The Codex adapter supports user-scoped stdio and HTTP MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction headerTable(name: string): string {\n return `[mcp_servers.${tomlString(name)}.http_headers]`;\n}\n\nfunction skipTomlWhitespace(input: string, index: number): number {\n let cursor = index;\n while (input[cursor] === \" \" || input[cursor] === \"\\t\") cursor += 1;\n return cursor;\n}\n\nfunction parseTomlBasicKey(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n let cursor = start + 1;\n let value = \"\";\n while (cursor < input.length) {\n const current = input[cursor];\n if (current === '\"') return { value, next: cursor + 1 };\n if (current !== \"\\\\\") {\n if (current === undefined) return null;\n value += current;\n cursor += 1;\n continue;\n }\n const escaped = input[cursor + 1];\n const simple =\n escaped &&\n { b: \"\\b\", t: \"\\t\", n: \"\\n\", f: \"\\f\", r: \"\\r\", '\"': '\"', \"\\\\\": \"\\\\\" }[escaped];\n if (simple !== undefined) {\n value += simple;\n cursor += 2;\n continue;\n }\n const digits = escaped === \"u\" ? 4 : escaped === \"U\" ? 8 : 0;\n const encoded = input.slice(cursor + 2, cursor + 2 + digits);\n if (!digits || !/^[0-9A-Fa-f]+$/u.test(encoded)) return null;\n const codePoint = Number.parseInt(encoded, 16);\n if (codePoint > 0x10ffff) return null;\n value += String.fromCodePoint(codePoint);\n cursor += 2 + digits;\n }\n return null;\n}\n\nfunction parseTomlLiteralKey(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n const end = input.indexOf(\"'\", start + 1);\n return end === -1 ? null : { value: input.slice(start + 1, end), next: end + 1 };\n}\n\nfunction parseTomlString(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n if (input[start] === '\"') return parseTomlBasicKey(input, start);\n if (input[start] === \"'\") return parseTomlLiteralKey(input, start);\n return null;\n}\n\nfunction parseTomlHeaderAssignment(\n line: string,\n): { key: string; value: string } | null {\n let cursor = skipTomlWhitespace(line, 0);\n const key = parseTomlString(line, cursor);\n const bareKey = /^[A-Za-z0-9_-]+/u.exec(line.slice(cursor));\n const parsedKey =\n key ?? (bareKey ? { value: bareKey[0], next: cursor + bareKey[0].length } : null);\n if (!parsedKey) return null;\n cursor = skipTomlWhitespace(line, parsedKey.next);\n if (line[cursor] !== \"=\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n const value = parseTomlString(line, cursor);\n if (!value) return null;\n cursor = skipTomlWhitespace(line, value.next);\n if (cursor !== line.length && line[cursor] !== \"#\") return null;\n return { key: parsedKey.value, value: value.value };\n}\n\nfunction parseTomlTablePath(line: string): string[] | null {\n let cursor = skipTomlWhitespace(line, 0);\n if (line[cursor] !== \"[\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n const segments: string[] = [];\n while (cursor < line.length) {\n const current = line[cursor];\n const quoted = parseTomlString(line, cursor);\n const bareKey = /^[A-Za-z0-9_-]+/u.exec(line.slice(cursor));\n const parsed =\n quoted ??\n (current === '\"' || current === \"'\" || !bareKey\n ? null\n : { value: bareKey[0], next: cursor + bareKey[0].length });\n if (!parsed) return null;\n segments.push(parsed.value);\n cursor = skipTomlWhitespace(line, parsed.next);\n if (line[cursor] === \"]\") {\n cursor = skipTomlWhitespace(line, cursor + 1);\n return cursor === line.length || line[cursor] === \"#\" ? segments : null;\n }\n if (line[cursor] !== \".\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n }\n return null;\n}\n\nfunction findHeaderTables(config: string, name: string): number[] {\n const target = [\"mcp_servers\", name, \"http_headers\"];\n return config.split(/\\r?\\n/u).flatMap((line, index) => {\n const path = parseTomlTablePath(line);\n return path &&\n path.length === target.length &&\n path.every((part, partIndex) => part === target[partIndex])\n ? [index]\n : [];\n });\n}\n\nfunction readHttpHeaders(config: string, name: string): Record<string, string> {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n const tableIndex = tables[0];\n if (tableIndex === undefined) return {};\n\n const lines = config.split(/\\r?\\n/u);\n const headers: Record<string, string> = {};\n const seenHeaderNames = new Set<string>();\n for (let index = tableIndex + 1; index < lines.length; index += 1) {\n const line = lines[index];\n if (line === undefined) break;\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n if (trimmed.startsWith(\"[\")) break;\n const assignment = parseTomlHeaderAssignment(trimmed);\n if (!assignment) {\n throw new Error(\"The targeted Codex HTTP header table is invalid\");\n }\n const normalizedKey = assignment.key.toLowerCase();\n if (seenHeaderNames.has(normalizedKey)) {\n throw new Error(\"The targeted Codex HTTP header table has duplicate headers\");\n }\n seenHeaderNames.add(normalizedKey);\n headers[assignment.key] = assignment.value;\n }\n return headers;\n}\n\nfunction sameHeaders(\n left: Record<string, string>,\n right: Record<string, string>,\n): boolean {\n const leftEntries = Object.entries(left).sort(([leftKey], [rightKey]) =>\n leftKey.localeCompare(rightKey),\n );\n const rightEntries = Object.entries(right).sort(([leftKey], [rightKey]) =>\n leftKey.localeCompare(rightKey),\n );\n return JSON.stringify(leftEntries) === JSON.stringify(rightEntries);\n}\n\nfunction appendHeaderTable(\n config: string,\n name: string,\n headers: Record<string, string>,\n): string {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n if (tables.length === 1) {\n if (!sameHeaders(readHttpHeaders(config, name), headers)) {\n throw new Error(\n \"The targeted Codex HTTP header table already has different values\",\n );\n }\n return config;\n }\n const entries = Object.entries(headers)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${tomlString(key)} = ${tomlString(value)}`);\n return `${config}${config.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\"}${headerTable(name)}\\n${entries.join(\"\\n\")}\\n`;\n}\n\nfunction removeHeaderTable(config: string, name: string): string {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n const tableIndex = tables[0];\n if (tableIndex === undefined) return config;\n\n const lines = config.split(/\\r?\\n/u);\n let end = tableIndex + 1;\n while (end < lines.length && !lines[end]?.trimStart().startsWith(\"[\")) end += 1;\n lines.splice(tableIndex, end - tableIndex);\n return lines.join(\"\\n\");\n}\n\nasync function atomicWrite(filePath: string, contents: string): Promise<void> {\n const directory = path.dirname(filePath);\n let mode = 0o600;\n try {\n mode = (await stat(filePath)).mode & 0o600;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"ENOENT\") throw cause;\n }\n await mkdir(directory, { recursive: true });\n const temporaryPath = path.join(\n directory,\n `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, contents, { encoding: \"utf8\", mode: 0o600 });\n await rename(temporaryPath, filePath);\n await chmod(filePath, mode);\n } catch (cause) {\n await unlink(temporaryPath).catch(() => undefined);\n throw cause;\n }\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"Run `codex mcp list` to inspect the current Codex MCP configuration.\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"The Codex MCP entry is already owned by a different configuration\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"Choose another MCP server name or remove the existing user-owned entry.\",\n },\n );\n}\n\nfunction sameSpec(left: McpConnectionSpec, right: McpConnectionSpec): boolean {\n return fingerprintValue(left) === fingerprintValue(right);\n}\n\nfunction matchesCreatedHttpEntry(\n connection: AgentConnection | null,\n spec: McpConnectionSpec,\n): boolean {\n return (\n connection?.spec.transport === \"streamable-http\" &&\n spec.transport === \"streamable-http\" &&\n connection.spec.url === spec.url\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 readonly capabilities = {\n transports: [\"stdio\", \"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } as const;\n\n private readonly configPath: string;\n\n constructor(\n private readonly runner: ProcessRunner,\n options: CodexAdapterOptions = {},\n ) {\n this.configPath =\n options.configPath ?? path.join(os.homedir(), \".codex\", \"config.toml\");\n }\n\n async #readConfig(): Promise<string> {\n try {\n return await readFile(this.configPath, \"utf8\");\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") return \"\";\n throw cause;\n }\n }\n\n async #rollbackAddedHttpEntry(name: string): Promise<void> {\n try {\n const result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"remove\", name],\n timeoutMs: 15_000,\n });\n if (result.exitCode !== 0) {\n throw hostFailure(\"Codex rollback did not complete\");\n }\n } catch {\n throw hostFailure(\"Codex rollback did not complete\");\n }\n }\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 let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"get\", name, \"--json\"],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Codex failed to read the MCP configuration\");\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 entry.transport.type === \"stdio\"\n ? {\n transport: \"stdio\",\n command: entry.transport.command,\n args: entry.transport.args ?? [],\n env: entry.transport.env ?? {},\n }\n : {\n transport: \"streamable-http\",\n url: entry.transport.url,\n headers: readHttpHeaders(await this.#readConfig(), name),\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(\n spec.transport === \"streamable-http\"\n ? { ...configuration, http_headers: spec.headers }\n : configuration,\n ),\n };\n } catch {\n throw hostFailure(\"Codex returned an invalid MCP configuration\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (spec.transport === \"stdio\" && Object.keys(spec.env).length) {\n throw invalidSpec();\n }\n const existing = await this.read(name, scope);\n if (existing) {\n if (sameSpec(existing.spec, spec)) return;\n throw conflict();\n }\n if (spec.transport === \"stdio\") {\n try {\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 } catch {\n throw hostFailure(\"Codex failed to add the MCP server\");\n }\n return;\n }\n\n let result: ProcessResult | undefined;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"add\", name, \"--url\", spec.url],\n timeoutMs: 15_000,\n });\n } catch {\n // A failed invocation does not prove that Codex created an entry.\n }\n if (!result || result.exitCode !== 0) {\n const afterFailure = await this.read(name, scope);\n if (matchesCreatedHttpEntry(afterFailure, spec)) {\n try {\n await this.#rollbackAddedHttpEntry(name);\n } catch {\n throw hostFailure(\"Codex add failed and rollback did not complete\");\n }\n }\n throw hostFailure(\"Codex failed to add the MCP server\");\n }\n try {\n await atomicWrite(\n this.configPath,\n appendHeaderTable(await this.#readConfig(), name, spec.headers),\n );\n } catch {\n try {\n await this.#rollbackAddedHttpEntry(name);\n } catch {\n throw hostFailure(\n \"Codex HTTP header persistence failed and rollback did not complete\",\n );\n }\n throw hostFailure(\n \"Codex HTTP header persistence failed; changes were rolled back\",\n );\n }\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (!(await this.read(name, scope))) return;\n let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"remove\", name],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Codex failed to remove the MCP server\");\n }\n if (\n result.exitCode !== 0 &&\n !/not found|does not exist|no mcp server/iu.test(result.stderr)\n ) {\n throw hostFailure(\"Codex failed to remove the MCP server\");\n }\n try {\n const config = await this.#readConfig();\n const next = removeHeaderTable(config, name);\n if (next !== config) await atomicWrite(this.configPath, next);\n } catch {\n throw hostFailure(\"Codex MCP removal left an unresolved HTTP header table\");\n }\n }\n}\n","import { chmod, readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\nimport {\n fingerprintConnection,\n type AgentAdapter,\n type AgentConnection,\n type AgentInstallation,\n type AgentScope,\n} from \"./adapter.js\";\n\nconst workBuddyConfigSchema = z\n .object({ mcpServers: z.record(z.string(), z.unknown()).optional() })\n .passthrough();\n\nconst workBuddyHttpEntrySchema = z.object({\n type: z.literal(\"http\"),\n transport: z.literal(\"streamable_http\"),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()),\n});\n\nexport interface WorkBuddyAdapterOptions {\n configDir?: string;\n}\n\nfunction invalidSpec(): CliError {\n return new CliError(\"INVALID_ARGUMENT\", \"WorkBuddy 仅支持用户级 HTTP MCP 连接\", {\n exitCode: exitCodes.invalidArgument,\n });\n}\n\nfunction hostNotFound(cause?: unknown): CliError {\n return new CliError(\"HOST_NOT_FOUND\", \"找不到 WorkBuddy 用户配置\", {\n exitCode: exitCodes.hostNotFound,\n ...(cause ? { cause } : {}),\n hint: \"请先启动一次 WorkBuddy,以创建用户配置目录。\",\n });\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"请检查 WorkBuddy 用户 MCP 配置后重新执行命令。\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"同名 WorkBuddy MCP 已由其他配置管理\", {\n exitCode: exitCodes.configConflict,\n hint: \"请选择其他 MCP 名称,或先移除现有的用户配置。\",\n });\n}\n\nfunction changedConfigConflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"WorkBuddy MCP 配置在本次操作期间已被其他程序修改\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"请检查 WorkBuddy 的 mcp.json,并重新执行命令。\",\n },\n );\n}\n\nexport class WorkBuddyAdapter implements AgentAdapter {\n readonly id = \"workbuddy\" as const;\n readonly capabilities = {\n transports: [\"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } as const;\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor(options: WorkBuddyAdapterOptions = {}) {\n this.configDir = options.configDir ?? path.join(os.homedir(), \".workbuddy\");\n this.configPath = path.join(this.configDir, \"mcp.json\");\n }\n\n async #ensureConfigDirectory(): Promise<void> {\n try {\n if (!(await stat(this.configDir)).isDirectory())\n throw new Error(\"not a directory\");\n } catch (cause) {\n throw hostNotFound(cause);\n }\n }\n\n async #readConfig(): Promise<{\n config: Record<string, unknown>;\n raw: string;\n }> {\n await this.#ensureConfigDirectory();\n let raw: string;\n try {\n raw = await readFile(this.configPath, \"utf8\");\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") throw hostNotFound(cause);\n throw hostFailure(\"无法读取 WorkBuddy 用户 MCP 配置\");\n }\n try {\n return { config: workBuddyConfigSchema.parse(JSON.parse(raw)), raw };\n } catch {\n throw hostFailure(\"WorkBuddy 用户 MCP 配置无效\");\n }\n }\n\n async #writeConfig(\n config: Record<string, unknown>,\n originalRaw: string,\n ): Promise<void> {\n await this.#ensureConfigDirectory();\n const temporaryPath = path.join(\n this.configDir,\n `.${path.basename(this.configPath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(this.configPath, {\n realpath: false,\n retries: { retries: 40, factor: 1, minTimeout: 10, maxTimeout: 25 },\n });\n if ((await readFile(this.configPath, \"utf8\")) !== originalRaw) {\n throw changedConfigConflict();\n }\n await writeFile(temporaryPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, this.configPath);\n await chmod(this.configPath, 0o600);\n } catch (cause) {\n await unlink(temporaryPath).catch(() => undefined);\n if (cause instanceof CliError) throw cause;\n throw hostFailure(\"无法写入 WorkBuddy 用户 MCP 配置\");\n } finally {\n await release?.().catch(() => undefined);\n }\n }\n\n async detect(): Promise<AgentInstallation> {\n await this.#readConfig();\n return { id: this.id, version: \"configured\" };\n }\n\n async read(name: string, scope: AgentScope): Promise<AgentConnection | null> {\n if (scope !== \"user\") throw invalidSpec();\n const { config } = await this.#readConfig();\n const mcpServers = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n const rawEntry = mcpServers[name];\n if (!rawEntry) return null;\n try {\n const entry = workBuddyHttpEntrySchema.parse(rawEntry);\n const spec: McpConnectionSpec = {\n transport: \"streamable-http\",\n url: entry.url,\n headers: entry.headers,\n };\n return {\n agent: this.id,\n name,\n scope,\n spec,\n fingerprint: fingerprintConnection(spec),\n };\n } catch {\n throw hostFailure(\"WorkBuddy MCP 配置项无效\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\" || spec.transport !== \"streamable-http\") throw invalidSpec();\n const { config, raw } = await this.#readConfig();\n const current = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n const nextEntry = {\n type: \"http\" as const,\n transport: \"streamable_http\" as const,\n url: spec.url,\n headers: spec.headers,\n };\n if (name in current) {\n try {\n const existing = workBuddyHttpEntrySchema.parse(current[name]);\n const existingSpec: McpConnectionSpec = {\n transport: \"streamable-http\",\n url: existing.url,\n headers: existing.headers,\n };\n if (fingerprintConnection(existingSpec) === fingerprintConnection(spec)) return;\n } catch {\n // A non-HTTP or unrecognized same-name entry is user-owned too.\n }\n throw conflict();\n }\n await this.#writeConfig(\n {\n ...config,\n mcpServers: { ...current, [name]: nextEntry },\n },\n raw,\n );\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") throw invalidSpec();\n const { config, raw } = await this.#readConfig();\n const current = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n if (!(name in current)) return;\n const remaining = Object.fromEntries(\n Object.entries(current).filter(([serverName]) => serverName !== name),\n );\n await this.#writeConfig({ ...config, mcpServers: remaining }, raw);\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\nexport const defaultEnterpriseMcpConnectionsPath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-connections.yaml\");\n\nexport const defaultEnterpriseMcpManagedStatePath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-managed-state.yaml\");\n\nexport const defaultEnterpriseMcpCredentialsPath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-credentials.json\");\n\nexport const defaultSkillStatePath = (options: ConfigPathOptions = {}): string =>\n path.join(options.homeDirectory ?? os.homedir(), \".sag\", \"skill\", \"state.json\");\n\nexport const defaultSkillAccountConfigPath = (\n options: ConfigPathOptions = {},\n): string => path.join(options.homeDirectory ?? os.homedir(), \".sag\", \"config.json\");\n","import { randomUUID } from \"node:crypto\";\nimport { chmod, lstat, mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { CredentialStore } from \"./store.js\";\n\nconst credentialStateSchema = z.strictObject({\n version: z.literal(1),\n credentials: z.record(z.string().min(1), z.string()),\n});\n\ntype FileCredentialState = z.infer<typeof credentialStateSchema>;\n\nfunction emptyState(): FileCredentialState {\n return { version: 1, credentials: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 凭据状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction busyState(cause: unknown): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 凭据状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n}\n\nexport class FileCredentialStore implements CredentialStore {\n readonly kind = \"file\" as const;\n\n constructor(readonly filePath: string) {}\n\n async #secureExistingFile(): Promise<void> {\n try {\n const target = await lstat(this.filePath);\n if (!target.isFile() || target.isSymbolicLink()) {\n throw invalidState(new Error(\"凭据目标不是普通文件\"), this.filePath);\n }\n await chmod(this.filePath, 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async #withLock<T>(operation: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let release: () => Promise<void>;\n try {\n release = await lock(this.filePath, { realpath: false, retries: 0 });\n } catch (cause) {\n throw busyState(cause);\n }\n try {\n await this.#secureExistingFile();\n return await operation();\n } finally {\n await release();\n }\n }\n\n async #load(): Promise<FileCredentialState> {\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 credentialStateSchema.parse(JSON.parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #save(state: FileCredentialState): Promise<void> {\n let validated: FileCredentialState;\n try {\n validated = credentialStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n const directory = path.dirname(this.filePath);\n const temporaryPath = path.join(\n directory,\n `.${path.basename(this.filePath)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw busyState(error);\n }\n throw error;\n }\n }\n\n async get(reference: string): Promise<string | null> {\n return this.#withLock(\n async () => (await this.#load()).credentials[reference] ?? null,\n );\n }\n\n async set(reference: string, value: string): Promise<void> {\n await this.#withLock(async () => {\n const state = await this.#load();\n state.credentials[reference] = value;\n await this.#save(state);\n });\n }\n\n async delete(reference: string): Promise<boolean> {\n return this.#withLock(async () => {\n const state = await this.#load();\n if (!(reference in state.credentials)) {\n return false;\n }\n delete state.credentials[reference];\n await this.#save(state);\n return true;\n });\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<boolean> {\n return this.#values.delete(reference);\n }\n}\n","export const PERSONAL_SERVICE_NAME = \"@zleap-ai/sag-cli\";\nexport const ENTERPRISE_MCP_SERVICE_NAME = \"@zleap-ai/sag-cli/enterprise-mcp\";\n","import type { CredentialStore } from \"./store.js\";\nimport { MemoryCredentialStore } from \"./memory.js\";\nimport { ENTERPRISE_MCP_SERVICE_NAME, PERSONAL_SERVICE_NAME } from \"./namespaces.js\";\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(\n private readonly entryFactory: KeyringEntryFactory,\n readonly serviceName = PERSONAL_SERVICE_NAME,\n ) {}\n\n async get(reference: string): Promise<string | null> {\n return this.entryFactory(this.serviceName, reference).getPassword();\n }\n\n async set(reference: string, value: string): Promise<void> {\n this.entryFactory(this.serviceName, reference).setPassword(value);\n }\n\n async delete(reference: string): Promise<boolean> {\n return this.entryFactory(this.serviceName, 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 async function createEnterpriseKeychainCredentialStore(): Promise<KeychainCredentialStore> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n return new KeychainCredentialStore(\n (service, account) => new Entry(service, account),\n ENTERPRISE_MCP_SERVICE_NAME,\n );\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 { CliError, exitCodes } from \"../core/errors.js\";\n\ninterface RawTtyInput {\n isTTY?: boolean;\n isRaw?: boolean;\n setEncoding(encoding: BufferEncoding): void;\n setRawMode(value: boolean): unknown;\n pause(): unknown;\n resume(): unknown;\n on(event: \"data\", listener: (chunk: string) => void): unknown;\n on(event: \"error\", listener: (cause: Error) => void): unknown;\n removeListener(event: \"data\", listener: (chunk: string) => void): unknown;\n removeListener(event: \"error\", listener: (cause: Error) => void): unknown;\n}\n\nexport interface InteractiveMcpJsonInput {\n input: RawTtyInput;\n writeStderr(value: string): void;\n}\n\nfunction inputFailure(message: string, hint: string): CliError {\n return new CliError(\"INVALID_ARGUMENT\", message, {\n exitCode: exitCodes.invalidArgument,\n hint,\n });\n}\n\nexport function readInteractiveMcpJson(\n options: InteractiveMcpJsonInput,\n): Promise<string> {\n if (!options.input.isTTY) {\n throw inputFailure(\n \"交互式输入 MCP 连接信息需要终端支持\",\n \"请通过管道传入平台生成的 JSON,并使用 `sag mcp connect --from-stdin`。\",\n );\n }\n\n const previousRawMode = options.input.isRaw ?? false;\n options.input.setEncoding(\"utf8\");\n options.input.setRawMode(true);\n options.input.resume();\n options.writeStderr(\n \"请粘贴完整的 mcpServers JSON。输入内容不会显示;JSON 完整后 sag 会自动继续。如需提交格式不完整的内容以查看错误,请按 Ctrl-D;取消请按 Ctrl-C。\\n\",\n );\n\n return new Promise((resolve, reject) => {\n let buffer = \"\";\n let settled = false;\n\n const cleanup = () => {\n options.input.removeListener(\"data\", onData);\n options.input.removeListener(\"error\", onError);\n options.input.setRawMode(previousRawMode);\n options.input.pause();\n };\n const finish = (value: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n options.writeStderr(\"已收到连接 JSON,正在验证 MCP……\\n\");\n resolve(value);\n };\n const fail = (cause: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(cause);\n };\n const onError = (cause: unknown) => fail(cause);\n const onData = (chunk: string) => {\n if (chunk.includes(\"\\u0003\")) {\n fail(\n inputFailure(\n \"已取消输入企业版 MCP 连接信息\",\n \"准备好后,请重新运行 `sag mcp connect`。\",\n ),\n );\n return;\n }\n const submitAt = chunk.indexOf(\"\\u0004\");\n buffer += submitAt >= 0 ? chunk.slice(0, submitAt) : chunk;\n if (submitAt >= 0) {\n finish(buffer);\n return;\n }\n try {\n JSON.parse(buffer);\n finish(buffer);\n } catch {\n // A pasted multi-line JSON document is incomplete until its final chunk.\n }\n };\n\n options.input.on(\"data\", onData);\n options.input.on(\"error\", onError);\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 type { EnterpriseMcpMutationReceipt } from \"./store.js\";\n\nconst agentManagedStateSchema = z.strictObject({\n id: z.string().min(1),\n connectionId: z.string().min(1),\n fingerprint: z.string().min(1),\n updatedAt: z.string().min(1),\n});\n\nconst skillManagedStateSchema = z.strictObject({\n id: z.string().min(1),\n fingerprint: z.string().min(1),\n backupPath: z.string().min(1),\n updatedAt: z.string().min(1),\n});\n\nconst enterpriseMcpManagedStateSchema = z.strictObject({\n version: z.literal(1),\n agents: z.record(z.string().min(1), agentManagedStateSchema),\n skills: z.record(z.string().min(1), skillManagedStateSchema),\n});\n\nexport type EnterpriseMcpAgentManagedState = z.infer<typeof agentManagedStateSchema>;\nexport type EnterpriseMcpSkillManagedState = z.infer<typeof skillManagedStateSchema>;\nexport type EnterpriseMcpManagedState = z.infer<typeof enterpriseMcpManagedStateSchema>;\n\nfunction emptyState(): EnterpriseMcpManagedState {\n return { version: 1, agents: {}, skills: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 受管状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction receiptFor(\n state: EnterpriseMcpManagedState,\n): EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState> {\n return { previous: structuredClone(state) };\n}\n\nexport class EnterpriseMcpManagedStateStore {\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, { realpath: false, retries: 0 });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 受管状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<EnterpriseMcpManagedState> {\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 enterpriseMcpManagedStateSchema.parse(parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #saveUnlocked(state: EnterpriseMcpManagedState): Promise<void> {\n let validated: EnterpriseMcpManagedState;\n try {\n validated = enterpriseMcpManagedStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\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 getAgent(id: string): Promise<EnterpriseMcpAgentManagedState | null> {\n return (await this.load()).agents[id] ?? null;\n }\n\n async setAgent(\n agent: EnterpriseMcpAgentManagedState,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n let validated: EnterpriseMcpAgentManagedState;\n try {\n validated = agentManagedStateSchema.parse(agent);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.agents[validated.id] = validated;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async deleteAgent(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n delete state.agents[id];\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async listAgents(): Promise<EnterpriseMcpAgentManagedState[]> {\n return Object.values((await this.load()).agents).sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n async getSkill(id: string): Promise<EnterpriseMcpSkillManagedState | null> {\n return (await this.load()).skills[id] ?? null;\n }\n\n async setSkill(\n skill: EnterpriseMcpSkillManagedState,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n let validated: EnterpriseMcpSkillManagedState;\n try {\n validated = skillManagedStateSchema.parse(skill);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.skills[validated.id] = validated;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async deleteSkill(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n delete state.skills[id];\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async listSkills(): Promise<EnterpriseMcpSkillManagedState[]> {\n return Object.values((await this.load()).skills).sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n async restore(\n receipt: EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const currentState = await this.load();\n const restoreReceipt = receiptFor(currentState);\n await this.#saveUnlocked(receipt.previous);\n return restoreReceipt;\n });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } 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 type { EnterpriseMcpConnection } from \"./model.js\";\n\nconst toolRiskSummarySchema = z.strictObject({\n readOnly: z.number().int().nonnegative(),\n write: z.number().int().nonnegative(),\n destructive: z.number().int().nonnegative(),\n unknown: z.number().int().nonnegative(),\n hasWarning: z.boolean(),\n});\n\nconst enterpriseMcpConnectionSchema = z\n .strictObject({\n id: z.string().min(1),\n serverKey: z.string().min(1),\n preferredId: z.string().min(1),\n transport: z.literal(\"streamable-http\"),\n url: z.string().url(),\n headerNames: z.array(z.string().min(1)),\n credentialStore: z.enum([\"keychain\", \"file\"]),\n credentialRef: z.string().min(1),\n toolSnapshot: z.strictObject({\n count: z.number().int().nonnegative(),\n fingerprint: z.string().min(1),\n risk: toolRiskSummarySchema,\n observedAt: z.string().min(1),\n }),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n lastVerifiedAt: z.string().min(1).optional(),\n })\n .superRefine((connection, context) => {\n if (connection.credentialRef !== `enterprise-mcp/${connection.id}`) {\n context.addIssue({\n code: \"custom\",\n message: \"企业 MCP 凭据引用与连接名称不一致。\",\n path: [\"credentialRef\"],\n });\n }\n });\n\nconst enterpriseMcpConnectionStateSchema = z\n .strictObject({\n version: z.literal(1),\n activeId: z.string().min(1).optional(),\n connections: z.record(z.string().min(1), enterpriseMcpConnectionSchema),\n })\n .superRefine((state, context) => {\n if (state.activeId && !state.connections[state.activeId]) {\n context.addIssue({\n code: \"custom\",\n message: \"当前使用的企业 MCP 连接不存在。\",\n path: [\"activeId\"],\n });\n }\n });\n\nexport type EnterpriseMcpConnectionState = z.infer<\n typeof enterpriseMcpConnectionStateSchema\n>;\n\nexport interface EnterpriseMcpMutationReceipt<State> {\n previous: State;\n}\n\nfunction emptyState(): EnterpriseMcpConnectionState {\n return { version: 1, connections: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 连接状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction receiptFor(\n state: EnterpriseMcpConnectionState,\n): EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState> {\n return { previous: structuredClone(state) };\n}\n\nfunction toConnection(\n connection: z.infer<typeof enterpriseMcpConnectionSchema>,\n): EnterpriseMcpConnection {\n return {\n id: connection.id,\n serverKey: connection.serverKey,\n preferredId: connection.preferredId,\n transport: connection.transport,\n url: connection.url,\n headerNames: connection.headerNames,\n credentialStore: connection.credentialStore,\n credentialRef: connection.credentialRef,\n toolSnapshot: connection.toolSnapshot,\n createdAt: connection.createdAt,\n updatedAt: connection.updatedAt,\n ...(connection.lastVerifiedAt === undefined\n ? {}\n : { lastVerifiedAt: connection.lastVerifiedAt }),\n };\n}\n\nexport class EnterpriseMcpConnectionStore {\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>;\n try {\n release = await lock(this.filePath, { realpath: false, retries: 0 });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 连接状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async withPersistenceLock<T>(operation: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(this.filePath), { recursive: true });\n const operationPath = `${this.filePath}.operation`;\n let release: () => Promise<void>;\n try {\n release = await lock(operationPath, {\n realpath: false,\n retries: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 持久化操作正忙\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<EnterpriseMcpConnectionState> {\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 enterpriseMcpConnectionStateSchema.parse(parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #saveUnlocked(state: EnterpriseMcpConnectionState): Promise<void> {\n let validated: EnterpriseMcpConnectionState;\n try {\n validated = enterpriseMcpConnectionStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async list(): Promise<EnterpriseMcpConnection[]> {\n return Object.values((await this.load()).connections)\n .sort((left, right) => left.id.localeCompare(right.id))\n .map(toConnection);\n }\n\n async get(id: string): Promise<EnterpriseMcpConnection | null> {\n const connection = (await this.load()).connections[id];\n return connection ? toConnection(connection) : null;\n }\n\n async active(): Promise<EnterpriseMcpConnection | null> {\n const state = await this.load();\n const connection = state.activeId ? state.connections[state.activeId] : undefined;\n return connection ? toConnection(connection) : null;\n }\n\n async upsert(\n connection: EnterpriseMcpConnection,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n let validated: z.infer<typeof enterpriseMcpConnectionSchema>;\n try {\n validated = enterpriseMcpConnectionSchema.parse(connection);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.connections[validated.id] = validated;\n state.activeId ??= validated.id;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async restore(\n receipt: EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const currentState = await this.load();\n const restoreReceipt = receiptFor(currentState);\n await this.#saveUnlocked(receipt.previous);\n return restoreReceipt;\n });\n }\n\n async use(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n if (!state.connections[id]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n const receipt = receiptFor(state);\n state.activeId = id;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async remove(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n if (!state.connections[id]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n const receipt = receiptFor(state);\n delete state.connections[id];\n if (state.activeId === id) {\n state.activeId = Object.keys(state.connections).sort()[0];\n if (!state.activeId) {\n delete state.activeId;\n }\n }\n await this.#saveUnlocked(state);\n return receipt;\n });\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 {\n HttpMcpConnectionSpec,\n McpConnectionSpec,\n StdioMcpConnectionSpec,\n} from \"./connection.js\";\nimport { localMcpFailure } from \"./failure.js\";\nimport {\n closeHttpMcpClient,\n createHttpMcpTransport,\n sessionCleanupTimeoutMs,\n} from \"./commands.js\";\nimport {\n toMcpToolSummary,\n type McpToolSummary,\n type ToolRiskSummary,\n} from \"./enterprise/model.js\";\nimport { classifyTools } from \"./enterprise/risk.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\ninterface McpVerificationBase {\n era: \"modern\" | \"legacy\";\n protocolVersion: string;\n server?: {\n name: string;\n version: string;\n };\n}\n\nexport type McpVerificationReport =\n | (McpVerificationBase & {\n transport: \"stdio\";\n tools: string[];\n missingTools: string[];\n listSourcesCallable: boolean;\n })\n | (McpVerificationBase & {\n transport: \"streamable-http\";\n url: string;\n tools: McpToolSummary[];\n toolCount: number;\n risk: ToolRiskSummary;\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 === \"streamable-http\") {\n return this.verifyHttp(spec, options);\n }\n return this.verifyStdio(spec, options);\n }\n\n private createClient(probeTimeoutMs: number): Client {\n return new Client(\n {\n name: \"@zleap-ai/sag-cli\",\n version: this.cliVersion,\n },\n {\n versionNegotiation: {\n mode: \"auto\",\n probe: {\n timeoutMs: probeTimeoutMs,\n maxRetries: 0,\n },\n },\n },\n );\n }\n\n private async verifyStdio(\n spec: StdioMcpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport> {\n const client = this.createClient(Math.min(options.timeoutMs, 250));\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 private async verifyHttp(\n spec: HttpMcpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport> {\n const client = this.createClient(Math.min(options.timeoutMs, 250));\n const transport = createHttpMcpTransport(\n spec,\n sessionCleanupTimeoutMs(options.timeoutMs),\n );\n let report: McpVerificationReport | undefined;\n let primaryFailure = false;\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 new Error(\"MCP protocol negotiation returned no version\");\n }\n const listed = await client.listTools(undefined, {\n timeout: options.timeoutMs,\n cacheMode: \"refresh\",\n });\n const tools: McpToolSummary[] = listed.tools.map(toMcpToolSummary);\n const server = client.getServerVersion();\n report = {\n transport: \"streamable-http\",\n url: spec.url,\n era,\n protocolVersion,\n ...(server ? { server } : {}),\n tools,\n toolCount: tools.length,\n risk: classifyTools(tools),\n };\n } catch {\n primaryFailure = true;\n }\n let cleanupFailure: unknown;\n try {\n await closeHttpMcpClient(client, transport);\n } catch (cause) {\n cleanupFailure = cause;\n }\n if (primaryFailure) {\n throw new CliError(\"MCP_FAILED\", \"无法验证企业版 HTTP MCP\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查 MCP 地址和 AccessKey 后重试。\",\n });\n }\n if (cleanupFailure) {\n throw cleanupFailure;\n }\n return report as McpVerificationReport;\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 { Client, StreamableHTTPClientTransport } from \"@modelcontextprotocol/client\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"./connection.js\";\n\nexport interface HttpMcpCommandOptions {\n cliVersion: string;\n timeoutMs: number;\n}\n\nexport interface HttpMcpToolCallInput extends HttpMcpCommandOptions {\n spec: HttpMcpConnectionSpec;\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n}\n\nconst MIN_SESSION_CLEANUP_TIMEOUT_MS = 50;\nconst MAX_SESSION_CLEANUP_TIMEOUT_MS = 250;\n\nfunction mcpFailure(): CliError {\n return new CliError(\"MCP_FAILED\", \"无法与企业 HTTP MCP 通信\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查已导入的 MCP 地址和访问密钥后重试。\",\n });\n}\n\nfunction createClient(cliVersion: string): Client {\n return new Client(\n { name: \"@zleap-ai/sag-cli\", version: cliVersion },\n {\n versionNegotiation: {\n mode: \"auto\",\n probe: { timeoutMs: 250, maxRetries: 0 },\n },\n },\n );\n}\n\nexport function createHttpMcpTransport(\n spec: HttpMcpConnectionSpec,\n cleanupTimeoutMs = MAX_SESSION_CLEANUP_TIMEOUT_MS,\n): StreamableHTTPClientTransport {\n return new StreamableHTTPClientTransport(new URL(spec.url), {\n fetch: async (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, name) => headers.set(name, value));\n for (const [name, value] of Object.entries(spec.headers)) {\n headers.set(name, value);\n }\n const method = init?.method ?? (input instanceof Request ? input.method : \"GET\");\n return fetch(input, {\n ...init,\n headers,\n ...(method.toUpperCase() === \"DELETE\"\n ? { signal: AbortSignal.timeout(cleanupTimeoutMs) }\n : {}),\n });\n },\n });\n}\n\nexport function sessionCleanupTimeoutMs(operationTimeoutMs: number): number {\n return Math.min(\n Math.max(operationTimeoutMs, MIN_SESSION_CLEANUP_TIMEOUT_MS),\n MAX_SESSION_CLEANUP_TIMEOUT_MS,\n );\n}\n\nexport async function closeHttpMcpClient(\n client: Client,\n transport: StreamableHTTPClientTransport,\n): Promise<void> {\n if (transport.sessionId) {\n await transport.terminateSession().catch(() => undefined);\n }\n await client.close().catch(() => undefined);\n}\n\nasync function withHttpMcpClient<T>(\n spec: HttpMcpConnectionSpec,\n options: HttpMcpCommandOptions,\n action: (client: Client) => Promise<T>,\n): Promise<T> {\n const client = createClient(options.cliVersion);\n const transport = createHttpMcpTransport(\n spec,\n sessionCleanupTimeoutMs(options.timeoutMs),\n );\n let result: T | undefined;\n let primaryFailure: unknown;\n let hasPrimaryFailure = false;\n try {\n await client.connect(transport, { timeout: options.timeoutMs });\n result = await action(client);\n } catch (cause) {\n hasPrimaryFailure = true;\n primaryFailure = cause;\n }\n let cleanupFailure: unknown;\n try {\n await closeHttpMcpClient(client, transport);\n } catch (cause) {\n cleanupFailure = cause;\n }\n if (hasPrimaryFailure) {\n if (primaryFailure instanceof CliError) {\n throw primaryFailure;\n }\n throw mcpFailure();\n }\n if (cleanupFailure) {\n throw cleanupFailure;\n }\n return result as T;\n}\n\nexport async function listHttpMcpTools(\n spec: HttpMcpConnectionSpec,\n options: HttpMcpCommandOptions,\n) {\n return withHttpMcpClient(spec, options, (client) =>\n client.listTools(undefined, { timeout: options.timeoutMs, cacheMode: \"refresh\" }),\n );\n}\n\nexport async function callHttpMcpTool(input: HttpMcpToolCallInput) {\n return withHttpMcpClient(input.spec, input, async (client) => {\n const listed = await client.listTools(undefined, {\n timeout: input.timeoutMs,\n cacheMode: \"refresh\",\n });\n const tool = listed.tools.find((candidate) => candidate.name === input.tool);\n if (!tool) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到 MCP 工具:${input.tool}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n if (tool.annotations?.readOnlyHint !== true && !input.yes) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `MCP 工具 ${input.tool} 可能会修改数据,需使用 --yes 确认`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"请检查工具参数,并使用 --yes 重新执行以确认。\",\n },\n );\n }\n const result = await client.callTool(\n { name: input.tool, arguments: input.arguments_ },\n { timeout: input.timeoutMs },\n );\n return { tool: input.tool, result };\n });\n}\n\nexport function parseMcpToolArguments(value: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CliError(\"INVALID_ARGUMENT\", \"工具参数必须是有效的 JSON\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"工具参数必须是 JSON 对象\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed as Record<string, unknown>;\n}\n","import type { HttpMcpConnectionSpec } from \"../connection.js\";\n\nexport interface ParsedEnterpriseServer {\n serverKey: string;\n preferredId: string;\n connection: HttpMcpConnectionSpec;\n}\n\nexport interface ParseEnterpriseMcpOptions {\n allowInsecureHttp: boolean;\n}\n\nexport interface McpToolAnnotations {\n title?: string | undefined;\n readOnlyHint?: boolean | undefined;\n destructiveHint?: boolean | undefined;\n idempotentHint?: boolean | undefined;\n openWorldHint?: boolean | undefined;\n}\n\nexport interface McpToolSummary {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n annotations?: McpToolAnnotations;\n}\n\nexport function toMcpToolSummary(input: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n annotations?: McpToolAnnotations | undefined;\n}): McpToolSummary {\n const annotations = {\n ...(input.annotations?.title === undefined\n ? {}\n : { title: input.annotations.title }),\n ...(input.annotations?.readOnlyHint === undefined\n ? {}\n : { readOnlyHint: input.annotations.readOnlyHint }),\n ...(input.annotations?.destructiveHint === undefined\n ? {}\n : { destructiveHint: input.annotations.destructiveHint }),\n ...(input.annotations?.idempotentHint === undefined\n ? {}\n : { idempotentHint: input.annotations.idempotentHint }),\n ...(input.annotations?.openWorldHint === undefined\n ? {}\n : { openWorldHint: input.annotations.openWorldHint }),\n };\n return {\n name: input.name,\n ...(input.description === undefined ? {} : { description: input.description }),\n inputSchema: input.inputSchema as Record<string, unknown>,\n ...(Object.keys(annotations).length ? { annotations } : {}),\n };\n}\n\nexport interface ToolRiskSummary {\n readOnly: number;\n write: number;\n destructive: number;\n unknown: number;\n hasWarning: boolean;\n}\n\nexport interface EnterpriseMcpToolSnapshot {\n count: number;\n fingerprint: string;\n risk: ToolRiskSummary;\n observedAt: string;\n}\n\nexport interface EnterpriseMcpConnection {\n id: string;\n serverKey: string;\n preferredId: string;\n transport: \"streamable-http\";\n url: string;\n headerNames: string[];\n credentialStore: \"keychain\" | \"file\";\n credentialRef: string;\n toolSnapshot: EnterpriseMcpToolSnapshot;\n createdAt: string;\n updatedAt: string;\n lastVerifiedAt?: string;\n}\n\nexport interface StageResult {\n stage: \"parse\" | \"verify\" | \"persist\" | \"agent\" | \"skill\" | \"reverify\";\n target: string;\n ok: boolean;\n status: \"created\" | \"updated\" | \"skipped\" | \"failed\";\n code?: string;\n message: string;\n}\n","import type { McpToolSummary, ToolRiskSummary } from \"./model.js\";\n\ntype ToolAnnotations = Pick<McpToolSummary, \"name\" | \"annotations\">;\n\nexport function classifyTools(tools: readonly ToolAnnotations[]): ToolRiskSummary {\n const summary: ToolRiskSummary = {\n readOnly: 0,\n write: 0,\n destructive: 0,\n unknown: 0,\n hasWarning: false,\n };\n\n for (const tool of tools) {\n if (tool.annotations?.destructiveHint === true) {\n summary.destructive += 1;\n } else if (tool.annotations?.readOnlyHint === true) {\n summary.readOnly += 1;\n } else if (tool.annotations?.readOnlyHint === false) {\n summary.write += 1;\n } else {\n summary.unknown += 1;\n }\n }\n\n summary.hasWarning =\n summary.write > 0 || summary.destructive > 0 || summary.unknown > 0;\n return summary;\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 { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport type { AgentId } from \"../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nconst agentSchema = z.enum([\"codex\", \"claude-code\", \"workbuddy\"]);\nconst digestSchema = z.string().regex(/^sha256:[a-f0-9]{64}$/u);\nconst managedSkillSchema = z.strictObject({\n agent: agentSchema,\n backupPath: z.string().min(1).optional(),\n fingerprint: digestSchema,\n target: z.string().min(1),\n version: z.string().min(1),\n});\nconst skillStateSchema = z.strictObject({\n schema: z.literal(2),\n managedSkills: z.record(z.string(), managedSkillSchema),\n});\n\nexport type ManagedSkill = z.infer<typeof managedSkillSchema>;\nexport type SkillState = z.infer<typeof skillStateSchema>;\n\nfunction emptyState(): SkillState {\n return { schema: 2, managedSkills: {} };\n}\n\nfunction invalidState(filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"Skill installation state is invalid\", {\n exitCode: exitCodes.configConflict,\n hint: `Remove the unpublished legacy state at ${filePath}, then reinstall the Skill.`,\n });\n}\n\nfunction managedSkillKey(agent: AgentId, target: string): string {\n return `${agent}:${target}`;\n}\n\nexport class SkillStateStore {\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: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"Skill installation state is busy\", {\n exitCode: exitCodes.configConflict,\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<SkillState> {\n try {\n return skillStateSchema.parse(JSON.parse(await readFile(this.filePath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptyState();\n throw invalidState(this.filePath);\n }\n }\n\n async #saveUnlocked(state: SkillState): Promise<void> {\n const validated = skillStateSchema.parse(state);\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n\n async getManagedSkill(agent: AgentId, target: string): Promise<ManagedSkill | null> {\n return (await this.load()).managedSkills[managedSkillKey(agent, target)] ?? null;\n }\n\n async saveManagedSkill(managedSkill: ManagedSkill): Promise<void> {\n const validated = managedSkillSchema.parse(managedSkill);\n await this.#withLock(async () => {\n const state = await this.load();\n state.managedSkills[managedSkillKey(validated.agent, validated.target)] =\n validated;\n await this.#saveUnlocked(state);\n });\n }\n\n async deleteManagedSkill(agent: AgentId, target: string): Promise<void> {\n await this.#withLock(async () => {\n const state = await this.load();\n delete state.managedSkills[managedSkillKey(agent, target)];\n await this.#saveUnlocked(state);\n });\n }\n}\n","import { z } from \"zod\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin, type SkillAccount } from \"./account-config.js\";\nimport { SkillError } from \"./model.js\";\n\nconst dateTimeSchema = z.string().datetime({ offset: true });\nconst sessionIdSchema = z.uuid();\nconst createSessionSchema = z.strictObject({\n session_id: sessionIdSchema,\n verification_url: z.url(),\n expires_at: dateTimeSchema,\n});\nconst loginSessionSchema = z.strictObject({\n session_id: sessionIdSchema,\n status: z.enum([\"pending\", \"approved\", \"denied\", \"consumed\"]),\n expires_at: dateTimeSchema,\n});\nconst accountSchema = z.strictObject({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n access_expires_at: dateTimeSchema,\n refresh_expires_at: dateTimeSchema,\n user: z.strictObject({ id: z.string().min(1), name: z.string().min(1) }),\n});\nconst problemSchema = z.object({ code: z.string().min(1) }).passthrough();\n\nexport interface SkillAccountAuthClientOptions {\n readonly fetchImplementation?: typeof fetch;\n readonly timeoutMs?: number;\n}\n\nexport interface SkillLoginSession {\n readonly sessionId: string;\n readonly status?: \"pending\" | \"approved\" | \"denied\" | \"consumed\";\n readonly verificationUrl?: string;\n readonly expiresAt: string;\n}\n\nexport class SkillAccountAuthHttpClient {\n readonly #fetch: typeof fetch;\n readonly #timeoutMs: number;\n\n constructor(options: SkillAccountAuthClientOptions = {}) {\n this.#fetch = options.fetchImplementation ?? fetch;\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n }\n\n async createLoginSession(\n origin: string,\n pkceChallenge: string,\n ): Promise<SkillLoginSession> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const response = await this.#request(\n normalizedOrigin,\n \"/api/v1/integrations/skill-account-logins\",\n { method: \"POST\", body: { pkce_challenge: pkceChallenge } },\n );\n const parsed = await this.#parse(response, createSessionSchema);\n if (\n normalizeSkillOrigin(new URL(parsed.verification_url).origin) !== normalizedOrigin\n ) {\n throw invalidResponse();\n }\n return {\n sessionId: parsed.session_id,\n verificationUrl: parsed.verification_url,\n expiresAt: parsed.expires_at,\n };\n }\n\n async getLoginSession(origin: string, sessionId: string): Promise<SkillLoginSession> {\n const validatedId = this.#sessionId(sessionId);\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n `/api/v1/integrations/skill-account-logins/${encodeURIComponent(validatedId)}`,\n { method: \"GET\" },\n );\n const parsed = await this.#parse(response, loginSessionSchema);\n if (parsed.session_id !== validatedId) throw invalidResponse();\n return {\n sessionId: parsed.session_id,\n status: parsed.status,\n expiresAt: parsed.expires_at,\n };\n }\n\n async exchange(\n origin: string,\n input: { sessionId: string; pkceVerifier: string },\n ): Promise<SkillAccount> {\n const sessionId = this.#sessionId(input.sessionId);\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n `/api/v1/integrations/skill-account-logins/${encodeURIComponent(sessionId)}/exchange`,\n { method: \"POST\", body: { pkce_verifier: input.pkceVerifier } },\n );\n return asAccount(await this.#parse(response, accountSchema));\n }\n\n async refresh(origin: string, refreshToken: string): Promise<SkillAccount> {\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n \"/api/v1/integrations/skill-account-sessions/refresh\",\n { method: \"POST\", body: { refresh_token: refreshToken } },\n );\n return asAccount(await this.#parse(response, accountSchema));\n }\n\n async logout(\n origin: string,\n accessToken: string,\n refreshToken: string,\n ): Promise<void> {\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n \"/api/v1/integrations/skill-account-sessions/current\",\n {\n method: \"DELETE\",\n body: { refresh_token: refreshToken },\n authorization: `Bearer ${accessToken}`,\n },\n );\n if (response.status !== 204) throw invalidResponse();\n }\n\n #sessionId(value: string): string {\n const parsed = sessionIdSchema.safeParse(value);\n if (!parsed.success) {\n throw new SkillError(\"INVALID_ARGUMENT\", \"Skill login session is invalid\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed.data;\n }\n\n async #request(\n origin: string,\n requestPath: string,\n options: {\n method: \"GET\" | \"POST\" | \"DELETE\";\n body?: Record<string, unknown>;\n authorization?: string;\n },\n ): Promise<Response> {\n let response: Response;\n try {\n response = await this.#fetch(new URL(requestPath, origin), {\n headers: {\n Accept: \"application/json\",\n \"Cache-Control\": \"no-store\",\n ...(options.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(options.authorization ? { Authorization: options.authorization } : {}),\n },\n method: options.method,\n redirect: \"error\",\n signal: AbortSignal.timeout(this.#timeoutMs),\n ...(options.body ? { body: JSON.stringify(options.body) } : {}),\n });\n } catch {\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the SAG account authorization service\",\n { exitCode: exitCodes.networkUnreachable },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw invalidResponse();\n }\n if (!response.ok) {\n let code = \"unknown\";\n try {\n const problem = problemSchema.safeParse(await response.json());\n if (problem.success) code = problem.data.code;\n } catch {\n // The stable error mapping below intentionally ignores the response body.\n }\n throw problemError(code, response.status);\n }\n return response;\n }\n\n async #parse<TSchema extends z.ZodType>(\n response: Response,\n schema: TSchema,\n ): Promise<z.output<TSchema>> {\n try {\n const parsed = schema.safeParse(await response.json());\n if (parsed.success) return parsed.data;\n } catch {\n // Fall through to the same non-secret contract error.\n }\n throw invalidResponse();\n }\n}\n\nfunction asAccount(value: z.output<typeof accountSchema>): SkillAccount {\n return {\n accessToken: value.access_token,\n refreshToken: value.refresh_token,\n accessExpiresAt: value.access_expires_at,\n refreshExpiresAt: value.refresh_expires_at,\n user: value.user,\n };\n}\n\nfunction invalidResponse(): SkillError {\n return new SkillError(\n \"INVALID_RESPONSE\",\n \"SAG account authorization returned an incompatible response\",\n { exitCode: exitCodes.internalError },\n );\n}\n\nfunction problemError(code: string, status: number): SkillError {\n if (code === \"access_denied\" || status === 403) {\n return new SkillError(\"PERMISSION_DENIED\", \"SAG account authorization was denied\", {\n exitCode: exitCodes.permissionDenied,\n problemCode: \"access_denied\",\n });\n }\n if (code === \"login_session_expired\" || code === \"invalid_grant\" || status === 410) {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n problemCode: code,\n });\n }\n if (status === 401) {\n return new SkillError(\"AUTH_REQUIRED\", \"SAG account authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n }\n if (status === 429 || code === \"rate_limited\") {\n return new SkillError(\"RATE_LIMITED\", \"SAG account authorization is rate limited\", {\n exitCode: exitCodes.networkUnreachable,\n problemCode: \"rate_limited\",\n });\n }\n return invalidResponse();\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nconst recentKnowledgeBaseSchema = z.strictObject({\n id: z.string().min(1),\n name: z.string().min(1),\n});\n\nconst skillAccountSchema = z.strictObject({\n accessToken: z.string().min(1),\n refreshToken: z.string().min(1),\n accessExpiresAt: z.string().datetime({ offset: true }),\n refreshExpiresAt: z.string().datetime({ offset: true }),\n user: z.strictObject({ id: z.string().min(1), name: z.string().min(1) }),\n recentKnowledgeBase: recentKnowledgeBaseSchema.optional(),\n});\n\nconst skillAccountConfigSchema = z\n .object({\n version: z.literal(1),\n currentOrigin: z.string().optional(),\n accounts: z.record(z.string(), skillAccountSchema),\n })\n .passthrough();\n\nexport type SkillAccount = z.infer<typeof skillAccountSchema>;\nexport type SkillAccountConfig = z.infer<typeof skillAccountConfigSchema>;\n\nfunction configurationConflict(message: string, filePath?: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: filePath ? `Review or restore ${filePath}.` : \"Provide a pure SAG Origin.\",\n });\n}\n\nexport function normalizeSkillOrigin(input: string): string {\n try {\n const parsed = new URL(input);\n if (\n ![\"http:\", \"https:\"].includes(parsed.protocol) ||\n !parsed.hostname ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash\n ) {\n throw new Error(\"not a pure HTTP Origin\");\n }\n return parsed.origin;\n } catch {\n throw configurationConflict(\"SAG address must be a pure HTTP or HTTPS Origin\");\n }\n}\n\nexport class SkillAccountConfigStore {\n constructor(readonly filePath: string) {}\n\n async load(): Promise<SkillAccountConfig> {\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 { version: 1, accounts: {} };\n }\n throw error;\n }\n try {\n return skillAccountConfigSchema.parse(JSON.parse(raw));\n } catch {\n throw configurationConflict(\n \"SAG account configuration is invalid\",\n this.filePath,\n );\n }\n }\n\n async saveAccount(origin: string, account: SkillAccount): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n let validated: SkillAccount;\n try {\n validated = skillAccountSchema.parse(account);\n } catch {\n throw configurationConflict(\"SAG account is invalid\", this.filePath);\n }\n await this.#withLock(async () => {\n const config = await this.load();\n config.accounts[normalizedOrigin] = validated;\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async removeAccount(origin: string): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n await this.#withLock(async () => {\n const config = await this.load();\n delete config.accounts[normalizedOrigin];\n if (config.currentOrigin === normalizedOrigin) {\n config.currentOrigin = Object.keys(config.accounts).sort()[0];\n }\n await this.#saveUnlocked(config);\n });\n }\n\n async setCurrentOrigin(origin: string): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n await this.#withLock(async () => {\n const config = await this.load();\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async getAccount(origin: string): Promise<SkillAccount | null> {\n return (await this.load()).accounts[normalizeSkillOrigin(origin)] ?? null;\n }\n\n async saveRecentKnowledgeBase(\n origin: string,\n knowledgeBase: Readonly<{ id: string; name: string }>,\n ): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const validated = recentKnowledgeBaseSchema.parse(knowledgeBase);\n await this.#withLock(async () => {\n const config = await this.load();\n const account = config.accounts[normalizedOrigin];\n if (!account) {\n throw configurationConflict(\n \"SAG account authorization is required\",\n this.filePath,\n );\n }\n config.accounts[normalizedOrigin] = {\n ...account,\n recentKnowledgeBase: validated,\n };\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async withRefreshLock<T>(origin: string, operation: () => Promise<T>): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const digest = createHash(\"sha256\").update(normalizedOrigin).digest(\"hex\");\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(`${this.filePath}.refresh-${digest}`, {\n realpath: false,\n stale: 10_000,\n update: 2_000,\n retries: { retries: 300, factor: 1, minTimeout: 100, maxTimeout: 100 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"SAG account refresh is busy\", {\n exitCode: exitCodes.configConflict,\n hint: \"Wait for the other SAG Skill refresh to finish and retry.\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\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: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"SAG account configuration is busy\", {\n exitCode: exitCodes.configConflict,\n hint: \"Wait for the other SAG Skill operation to finish and retry.\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async #saveUnlocked(config: SkillAccountConfig): Promise<void> {\n let validated: SkillAccountConfig;\n try {\n validated = skillAccountConfigSchema.parse(config);\n } catch {\n throw configurationConflict(\n \"SAG account configuration is invalid\",\n this.filePath,\n );\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600).catch(() => undefined);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n}\n","import type { SkillErrorCode } from \"../core/errors.js\";\n\nexport interface SkillErrorOptions {\n readonly details?: Record<string, unknown>;\n readonly exitCode: number;\n readonly problemCode?: string;\n}\n\nexport class SkillError extends Error {\n readonly code: SkillErrorCode;\n readonly details: Record<string, unknown> | undefined;\n readonly exitCode: number;\n readonly problemCode: string | undefined;\n\n constructor(code: SkillErrorCode, message: string, options: SkillErrorOptions) {\n super(message);\n this.name = \"SkillError\";\n this.code = code;\n this.details = options.details;\n this.exitCode = options.exitCode;\n this.problemCode = options.problemCode;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { Command, CommanderError, Option } from \"commander\";\n\nimport { SagClient, type SagClientOptions, type SearchInput } from \"./api/client.js\";\nimport type {\n SagCapabilities,\n SagDocument,\n SagEntityContext,\n SagGrepResponse,\n SagMcpDescriptor,\n SagOutline,\n SagReadResponse,\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 { getEntityContext, grep, outline, read } from \"./commands/knowledge.js\";\nimport { localMcpDoctorChecks, testLocalMcp } from \"./commands/mcp.js\";\nimport {\n attachConnection,\n callConnectionTool,\n connectEnterpriseMcpCommand,\n detachConnection,\n disconnectConnection,\n inspectConnectionStatus,\n installSkill,\n listConnections,\n listConnectionTools,\n skillStatus,\n uninstallSkill,\n useConnection,\n type EnterpriseMcpLifecycleCommandRuntime,\n} from \"./commands/enterprise-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, toSkillErrorCode } 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 { redact } from \"./output/redaction.js\";\nimport { SkillEventWriter, type SkillEvent } from \"./output/ndjson.js\";\nimport { type AgentId, type PersonalAgentId } from \"./agents/adapter.js\";\nimport type {\n EnterpriseMcpCollisionAction,\n EnterpriseMcpCollisionChoice,\n EnterpriseMcpConnectRuntime,\n EnterpriseMcpServerChoice,\n} from \"./mcp/enterprise/service.js\";\nimport {\n installSkillTargets,\n inspectSkillTargets,\n uninstallSkillTargets,\n type SkillInstallerRuntime,\n type SkillTargetsReport,\n} from \"./skill/installer.js\";\nimport {\n authorizeSkillAccount,\n logoutSkillAccount,\n type SkillAccountAuthRuntime,\n} from \"./skill/account-auth.js\";\nimport type { SkillAccountAuthHttpClient } from \"./skill/account-auth-client.js\";\nimport {\n normalizeSkillOrigin,\n type SkillAccountConfigStore,\n} from \"./skill/account-config.js\";\nimport {\n askSkillAccountKnowledge,\n deleteSkillAccountDocument,\n listSkillAccountDocuments,\n listSkillAccountKnowledgeBases,\n renameSkillAccountDocument,\n type SkillAccountKnowledgeRuntime,\n} from \"./skill/account-knowledge.js\";\nimport {\n inspectSkillAccountUpload,\n uploadSkillAccountFile,\n type SkillAccountUploadEvent,\n type SkillAccountUploadRuntime,\n} from \"./skill/account-upload.js\";\nimport {\n SkillKnowledgeHttpClient,\n type SkillKnowledgeClient,\n type SkillKnowledgeClientOptions,\n} from \"./skill/knowledge-client.js\";\nimport { SkillError } from \"./skill/model.js\";\n\nexport interface CliSagClient {\n root(): Promise<SagRoot>;\n ready(): Promise<SagReady>;\n capabilities(): Promise<SagCapabilities>;\n me(): Promise<SagUser>;\n login(name: string): Promise<{ accessToken: string; user: 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 outline(sourceId: string, documentId: string): Promise<SagOutline>;\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse>;\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse>;\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext>;\n}\n\nexport interface CliDependencies {\n version: string;\n environment: NodeJS.ProcessEnv;\n configStore: ConfigStore;\n credentialStore: CredentialStore;\n createClient(options: SagClientOptions): CliSagClient;\n promptName(): Promise<string>;\n confirm(message: string): Promise<boolean>;\n readStdin(): Promise<string>;\n stdinIsTty?: boolean;\n promptMcpJson?(): Promise<string>;\n selectMcpServers?(\n servers: readonly EnterpriseMcpServerChoice[],\n ): Promise<readonly string[]>;\n selectAgents?(agents: readonly AgentId[]): Promise<readonly AgentId[]>;\n selectCollisionAction?(\n collision: EnterpriseMcpCollisionChoice,\n ): Promise<EnterpriseMcpCollisionAction>;\n writeStdout(value: string): void;\n writeStderr(value: string): void;\n localMcp?: LocalMcpCliDependencies;\n enterpriseMcp?: EnterpriseMcpConnectRuntime;\n skill?: SkillInstallerRuntime;\n skillAccount?: Readonly<{\n client: SkillAccountAuthHttpClient;\n config: SkillAccountConfigStore;\n now: () => Date;\n openBrowser: (url: string) => Promise<void>;\n }>;\n promptSkillOrigin?(): Promise<string>;\n createSkillKnowledgeClient?(\n options: SkillKnowledgeClientOptions,\n ): SkillKnowledgeClient;\n}\n\nexport type LocalMcpCliDependencies = AgentRuntime;\n\ninterface GlobalOptions {\n json?: boolean;\n output?: \"human\" | \"ndjson\";\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\", \"参数必须是正整数\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed;\n}\n\nfunction parseNonNegativeInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new CliError(\"INVALID_ARGUMENT\", \"参数必须是非负整数\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed;\n}\n\nfunction parseAgent(value: string): PersonalAgentId {\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 parseEnterpriseAgent(value: string): AgentId {\n if (value === \"codex\" || value === \"claude-code\" || value === \"workbuddy\") {\n return value;\n }\n throw new CliError(\"INVALID_ARGUMENT\", `不支持的 Agent:${value}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 codex、claude-code 或 workbuddy。\",\n });\n}\n\nfunction parseCredentialStore(value: string): \"keychain\" | \"file\" {\n if (value === \"keychain\" || value === \"file\") return value;\n throw new CliError(\"INVALID_ARGUMENT\", `不支持的凭据存储:${value}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 keychain 或 file。\",\n });\n}\n\nfunction resolveEnterpriseSkillAgent(\n positional: AgentId | undefined,\n option: AgentId | undefined,\n): AgentId {\n if (positional && option && positional !== option) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"位置参数 Agent 与 --agent 指定的 Agent 不一致\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n const agent = option ?? positional;\n if (!agent) {\n throw new CliError(\"INVALID_ARGUMENT\", \"请使用 --agent 指定 Agent\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 codex、claude-code 或 workbuddy。\",\n });\n }\n return agent;\n}\n\nfunction parseMcpToolArguments(value: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"not an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (cause) {\n throw new CliError(\"INVALID_ARGUMENT\", \"--arguments-json 必须是一个 JSON 对象\", {\n exitCode: exitCodes.invalidArgument,\n cause,\n });\n }\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction commandOptions(program: Command): GlobalOptions {\n return program.opts<GlobalOptions>();\n}\n\nconst skillWriters = new WeakMap<Command, SkillEventWriter>();\n\nfunction skillOperation(program: Command): SkillEvent[\"operation\"] {\n const [command, subcommand, action] = program.args;\n if (command === \"auth\" || (command === \"skill\" && subcommand === \"auth\")) {\n return \"auth\";\n }\n if (command === \"skill\" && subcommand === \"knowledge\") {\n if (action === \"upload\" || action === \"upload-status\") return \"upload\";\n if (action === \"ask\") return \"search\";\n return \"document\";\n }\n if (command === \"search\") return \"search\";\n if (\n command === \"document\" &&\n (subcommand === \"upload\" || subcommand === \"upload-status\")\n ) {\n return \"upload\";\n }\n if (command === \"mcp\" || command === \"agent\") return \"install\";\n if (command === \"document\" || command === \"knowledge\") return \"document\";\n return \"install\";\n}\n\nfunction skillData(program: Command, data: unknown): Record<string, unknown> {\n const base =\n data && typeof data === \"object\" && !Array.isArray(data)\n ? (data as Record<string, unknown>)\n : Array.isArray(data)\n ? { items: data }\n : { value: data };\n if (program.args[0] === \"knowledge\") {\n return { resource: \"knowledge_base\", ...base };\n }\n return base;\n}\n\nfunction commandOutputIsNdjson(arguments_: string[]): boolean {\n return arguments_.some(\n (argument, index) =>\n argument === \"--output=ndjson\" ||\n (argument === \"--output\" && arguments_[index + 1] === \"ndjson\"),\n );\n}\n\nfunction skillOperationId(): string {\n return `cli-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction skillEvent(\n program: Command,\n event: string,\n data?: Record<string, unknown>,\n error?: SkillEvent[\"error\"],\n operationId = skillOperationId(),\n): SkillEvent {\n return {\n schema: \"sag.skill.ndjson.v1\",\n operation: skillOperation(program),\n event,\n operation_id: operationId,\n timestamp: new Date().toISOString(),\n ...(data ? { data } : {}),\n ...(error ? { error } : {}),\n };\n}\n\nfunction emit(program: Command, dependencies: CliDependencies, data: unknown): void {\n const options = commandOptions(program);\n if (options.output === \"ndjson\") {\n skillWriters\n .get(program)\n ?.complete(skillEvent(program, \"completed\", skillData(program, data)));\n return;\n }\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\nfunction enterpriseMcpRuntime(\n dependencies: CliDependencies,\n): EnterpriseMcpConnectRuntime {\n if (!dependencies.enterpriseMcp) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"企业 MCP 运行环境不可用\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.enterpriseMcp;\n}\n\nfunction enterpriseMcpCommandRuntime(\n dependencies: CliDependencies,\n timeoutMs: number,\n): EnterpriseMcpLifecycleCommandRuntime {\n return {\n ...enterpriseMcpRuntime(dependencies),\n cliVersion: dependencies.version,\n timeoutMs,\n };\n}\n\nfunction skillInstallerRuntime(dependencies: CliDependencies): SkillInstallerRuntime {\n if (!dependencies.skill) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG Knowledge Skill runtime is unavailable\",\n {\n exitCode: exitCodes.dependencyMissing,\n },\n );\n }\n return dependencies.skill;\n}\n\nfunction skillAccountAuthRuntime(\n dependencies: CliDependencies,\n): SkillAccountAuthRuntime {\n const runtime = dependencies.skillAccount;\n if (!runtime) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account authorization runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n return runtime;\n}\n\nfunction skillAccountKnowledgeRuntime(\n dependencies: CliDependencies,\n): SkillAccountKnowledgeRuntime {\n const account = dependencies.skillAccount;\n if (!account) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account Knowledge runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n return {\n auth: skillAccountAuthRuntime(dependencies),\n createId: randomUUID,\n config: account.config,\n createClient:\n dependencies.createSkillKnowledgeClient ??\n ((options) => new SkillKnowledgeHttpClient(options)),\n };\n}\n\nfunction skillAccountUploadRuntime(\n dependencies: CliDependencies,\n): SkillAccountUploadRuntime {\n return {\n ...skillAccountKnowledgeRuntime(dependencies),\n now: () => new Date(),\n sleep: async (milliseconds) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds)),\n };\n}\n\nfunction emitSkillAccountUpload(\n program: Command,\n dependencies: CliDependencies,\n events: readonly SkillAccountUploadEvent[],\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emit(program, dependencies, { events });\n return;\n }\n const operationId = skillOperationId();\n const writer = skillWriters.get(program);\n events.forEach((event, index) => {\n const data = {\n import_id: event.importId,\n ...(event.documentId ? { document_id: event.documentId } : {}),\n ...(event.jobId ? { job_id: event.jobId } : {}),\n ...(event.failure ? { failure: event.failure } : {}),\n };\n const frame = skillEvent(program, event.event, data, undefined, operationId);\n if (index === events.length - 1) writer?.complete(frame);\n else writer?.emit(frame);\n });\n}\n\nfunction emitSkillAccountUploadStatus(\n program: Command,\n dependencies: CliDependencies,\n status: SkillAccountUploadEvent,\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emitSkillAccountUpload(program, dependencies, [status]);\n return;\n }\n skillWriters.get(program)?.complete(\n skillEvent(program, \"completed\", {\n import_id: status.importId,\n state: status.event,\n ...(status.documentId ? { document_id: status.documentId } : {}),\n ...(status.jobId ? { job_id: status.jobId } : {}),\n ...(status.failure ? { failure: status.failure } : {}),\n }),\n );\n}\n\nasync function resolveSkillOrigin(\n dependencies: CliDependencies,\n explicitOrigin?: string,\n promptWhenMissing = false,\n): Promise<string> {\n if (explicitOrigin) return normalizeSkillOrigin(explicitOrigin);\n const runtime = dependencies.skillAccount;\n if (!runtime) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account authorization runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n const current = (await runtime.config.load()).currentOrigin;\n if (current) return normalizeSkillOrigin(current);\n if (promptWhenMissing && dependencies.promptSkillOrigin) {\n return normalizeSkillOrigin(await dependencies.promptSkillOrigin());\n }\n throw new SkillError(\"AUTH_REQUIRED\", \"SAG address is required\", {\n exitCode: exitCodes.authRequired,\n details: { required_option: \"--origin\" },\n });\n}\n\nclass ReportedSkillTargetFailure extends Error {\n constructor(readonly exitCode: number) {\n super(\"Skill target operation completed with errors\");\n }\n}\n\ninterface SkillTargetEmissionOptions {\n readonly operationId?: string;\n readonly terminal?: boolean;\n readonly terminalData?: Record<string, unknown>;\n readonly progressData?: Record<string, unknown>;\n readonly progressEvent?: string;\n readonly progressOnErrors?: boolean;\n}\n\nfunction emitSkillTargets(\n program: Command,\n dependencies: CliDependencies,\n report: SkillTargetsReport,\n options: SkillTargetEmissionOptions = {},\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emit(program, dependencies, report);\n return;\n }\n const writer = skillWriters.get(program);\n const operationId = options.operationId ?? skillOperationId();\n for (const target of report.targets) {\n const failed = target.status === \"failed\" || target.status === \"conflict\";\n writer?.emit(\n skillEvent(\n program,\n failed ? \"target_failed\" : \"target_completed\",\n {\n agent: target.agent,\n target: target.target,\n status: target.status,\n ...(target.version ? { version: target.version } : {}),\n ...(target.package ? { package: target.package } : {}),\n ...(target.code ? { code: target.code } : {}),\n },\n undefined,\n operationId,\n ),\n );\n }\n const terminal = options.terminal ?? true;\n const summary = {\n package: report.package,\n version: report.version,\n target_count: report.targets.length,\n };\n if (!terminal && (!report.completedWithErrors || options.progressOnErrors)) {\n writer?.emit(\n skillEvent(\n program,\n options.progressEvent ?? \"installation_completed\",\n options.progressData ?? summary,\n undefined,\n operationId,\n ),\n );\n return;\n }\n writer?.complete(\n skillEvent(\n program,\n report.completedWithErrors ? \"completed_with_errors\" : \"completed\",\n options.terminalData ?? summary,\n undefined,\n operationId,\n ),\n );\n}\n\nasync function executeSkillTargets(\n program: Command,\n dependencies: CliDependencies,\n report: Promise<SkillTargetsReport>,\n): Promise<void> {\n const resolved = await report;\n emitSkillTargets(program, dependencies, resolved);\n if (resolved.completedWithErrors) {\n const conflict = resolved.targets.some((target) => target.status === \"conflict\");\n throw new ReportedSkillTargetFailure(\n conflict ? exitCodes.configConflict : exitCodes.internalError,\n );\n }\n}\n\nfunction rejectEnterpriseProfile(program: Command): void {\n if (!commandOptions(program).profile) return;\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 命令不使用 Profile\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"请移除 --profile;个人 Profile 只用于 sag mcp test 和 sag agent。\",\n });\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\n .command(\"login\")\n .option(\"--name <name>\", \"SAG user name for the existing local login\")\n .action(async (options: { name?: string }) => {\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 ...(options.name ? { name: options.name } : {}),\n promptName: dependencies.promptName,\n authenticate: (name) =>\n dependencies.createClient({ origin: context.connection.url }).login(name),\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 program\n .command(\"outline\")\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 outline(context.client, options.source, documentId),\n );\n });\n\n program\n .command(\"grep\")\n .argument(\"<pattern>\")\n .requiredOption(\"--source <source-id>\")\n .option(\"--limit <number>\", \"Maximum result count\", parseInteger)\n .action(async (pattern: string, options: { source: string; limit?: number }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await grep(context.client, options.source, pattern, options.limit),\n );\n });\n\n program\n .command(\"read\")\n .argument(\"<document-id>\")\n .requiredOption(\"--source <source-id>\")\n .option(\"--offset <number>\", \"Starting line (1-based)\", parseInteger)\n .option(\"--limit <number>\", \"Lines to read\", parseInteger)\n .action(\n async (\n documentId: string,\n options: { source: string; offset?: number; limit?: number },\n ) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await read(\n context.client,\n options.source,\n documentId,\n options.offset,\n options.limit,\n ),\n );\n },\n );\n\n program\n .command(\"get-entity\")\n .argument(\"<name>\")\n .requiredOption(\"--source <source-id>\")\n .action(async (name: string, options: { source: string }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await getEntityContext(context.client, options.source, name),\n );\n });\n}\n\nfunction addLocalMcpCommands(program: Command, dependencies: CliDependencies): void {\n const mcp = program\n .command(\"mcp\")\n .description(\"验证本机 SAG MCP,并管理企业 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 mcp\n .command(\"list\")\n .description(\"列出企业 MCP 连接\")\n .action(async () => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await listConnections(enterpriseMcpCommandRuntime(dependencies, 15_000)),\n );\n });\n\n mcp\n .command(\"use\")\n .description(\"选择当前企业 MCP 连接\")\n .argument(\"<server>\", \"企业 MCP 连接名称\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改当前连接\")\n .action(async (server: string, options: { dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await useConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n server,\n dryRun: options.dryRun ?? false,\n }),\n );\n });\n\n mcp\n .command(\"status\")\n .description(\"检查企业 MCP、Agent 和 Skill 状态\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(async (options: { server?: string; timeout: number }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await inspectConnectionStatus(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n options.server === undefined ? {} : { server: options.server },\n ),\n );\n });\n\n mcp\n .command(\"tools\")\n .description(\"列出企业 MCP 工具及风险分类\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(async (options: { server?: string; timeout: number }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await listConnectionTools(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n options.server === undefined ? {} : { server: options.server },\n ),\n );\n });\n\n mcp\n .command(\"call\")\n .description(\"调用企业 MCP 工具\")\n .argument(\"<tool>\", \"工具名称\")\n .requiredOption(\"--arguments-json <json>\", \"传给工具的 JSON 对象\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(\n async (\n tool: string,\n options: { argumentsJson: string; server?: string; timeout: number },\n ) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await callConnectionTool(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n {\n ...(options.server === undefined ? {} : { server: options.server }),\n tool,\n arguments_: parseMcpToolArguments(options.argumentsJson),\n yes: commandOptions(program).yes ?? false,\n },\n ),\n );\n },\n );\n\n mcp\n .command(\"attach\")\n .description(\"把企业 MCP 接入一个 Agent\")\n .argument(\"<agent>\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .option(\"--no-skill\", \"不安装企业 SAG MCP Skill\")\n .action(\n async (\n agent: AgentId,\n options: {\n server?: string;\n timeout: number;\n dryRun?: boolean;\n skill: boolean;\n },\n ) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await attachConnection(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n {\n ...(options.server === undefined ? {} : { server: options.server }),\n agent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n noSkill: !options.skill,\n confirm: dependencies.confirm,\n },\n ),\n );\n },\n );\n\n mcp\n .command(\"detach\")\n .description(\"从一个 Agent 移除受管企业 MCP\")\n .argument(\"<agent>\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(async (agent: AgentId, options: { server?: string; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await detachConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n ...(options.server === undefined ? {} : { server: options.server }),\n agent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n });\n\n mcp\n .command(\"disconnect\")\n .description(\"断开并删除企业 MCP 连接\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(async (options: { server?: string; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await disconnectConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n ...(options.server === undefined ? {} : { server: options.server }),\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n });\n\n const skill = mcp.command(\"skill\").description(\"管理企业 SAG MCP Skill\");\n skill\n .command(\"install\")\n .description(\"安装企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(\n async (agent?: AgentId, options?: { agent?: AgentId; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n emit(\n program,\n dependencies,\n await installSkill(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n agent: selectedAgent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options?.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n },\n );\n skill\n .command(\"status\")\n .description(\"检查企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .action(async (agent?: AgentId, options?: { agent?: AgentId }) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n const statuses = await skillStatus(\n enterpriseMcpCommandRuntime(dependencies, 15_000),\n {\n agents: [selectedAgent],\n },\n );\n emit(program, dependencies, statuses[0]);\n });\n skill\n .command(\"uninstall\")\n .description(\"卸载企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .option(\"--force\", \"先备份,再强制卸载已变更的 Skill\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(\n async (\n agent?: AgentId,\n options?: { agent?: AgentId; force?: boolean; dryRun?: boolean },\n ) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n emit(\n program,\n dependencies,\n await uninstallSkill(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n agent: selectedAgent,\n yes: commandOptions(program).yes ?? false,\n force: options?.force ?? false,\n dryRun: options?.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n },\n );\n\n mcp\n .command(\"connect\")\n .description(\"粘贴并接入企业 MCP 连接\")\n .option(\"--from-stdin\", \"从标准输入读取 mcpServers JSON\")\n .option(\"--server <server-key>\", \"选择一个 MCP Server,可重复\", collect, [])\n .option(\n \"--agent <agent>\",\n \"接入 codex、claude-code 或 workbuddy,可重复\",\n (value: string, previous: AgentId[]) => [\n ...previous,\n parseEnterpriseAgent(value),\n ],\n [],\n )\n .option(\"--replace\", \"同名不同 URL 时替换原连接\")\n .option(\"--keep-both\", \"同名不同 URL 时保留两个连接\")\n .option(\"--no-skill\", \"不安装企业 SAG MCP Skill\")\n .option(\n \"--credential-store <keychain|file>\",\n \"凭据保存位置\",\n parseCredentialStore,\n \"keychain\",\n )\n .option(\"--allow-insecure-http\", \"允许非本机地址使用明文 HTTP\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .option(\"--dry-run\", \"只验证并展示计划,不修改本机状态\")\n .action(\n async (options: {\n fromStdin?: boolean;\n server: string[];\n agent: AgentId[];\n replace?: boolean;\n keepBoth?: boolean;\n skill: boolean;\n credentialStore: \"keychain\" | \"file\";\n allowInsecureHttp?: boolean;\n timeout: number;\n dryRun?: boolean;\n }) => {\n rejectEnterpriseProfile(program);\n if (options.replace && options.keepBoth) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"--replace 与 --keep-both 不能同时使用\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n\n const interactive = !options.fromStdin && (dependencies.stdinIsTty ?? false);\n let raw: string;\n if (options.fromStdin) {\n raw = await dependencies.readStdin();\n } else if (dependencies.promptMcpJson) {\n raw = await dependencies.promptMcpJson();\n } else {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法读取企业 MCP 连接 JSON\", {\n exitCode: exitCodes.dependencyMissing,\n hint: \"请使用 `sag mcp connect --from-stdin` 从标准输入传入 JSON。\",\n });\n }\n\n emit(\n program,\n dependencies,\n await connectEnterpriseMcpCommand({\n runtime: enterpriseMcpRuntime(dependencies),\n raw,\n requestedServers: options.server,\n requestedAgents: options.agent,\n credentialStore: options.credentialStore,\n ...(options.replace\n ? { collisionAction: \"replace\" as const }\n : options.keepBoth\n ? { collisionAction: \"keep-both\" as const }\n : {}),\n allowInsecureHttp: options.allowInsecureHttp ?? false,\n timeoutMs: options.timeout,\n yes: commandOptions(program).yes ?? false,\n noSkill: !options.skill,\n dryRun: options.dryRun ?? false,\n interactive,\n selectMcpServers: async (servers) => {\n if (!dependencies.selectMcpServers) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法选择 MCP Server\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.selectMcpServers(servers);\n },\n selectAgents: async (agents) =>\n dependencies.selectAgents ? dependencies.selectAgents(agents) : [],\n selectCollisionAction: async (collision) => {\n if (!dependencies.selectCollisionAction) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法处理同名 MCP 连接\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.selectCollisionAction(collision);\n },\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: PersonalAgentId,\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(\n async (agentId: PersonalAgentId | 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\n agent\n .command(\"disconnect\")\n .argument(\"<agent>\", \"codex or claude-code\", parseAgent)\n .option(\"--name <server-name>\")\n .action(async (agentId: PersonalAgentId, 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\nfunction addSkillCommands(program: Command, dependencies: CliDependencies): void {\n const skill = program\n .command(\"skill\")\n .description(\"Install and manage the SAG Knowledge Skill\");\n const selectedAgents = (value: string, previous: AgentId[]): AgentId[] => [\n ...previous,\n parseEnterpriseAgent(value),\n ];\n const addInstall = (name: \"install\" | \"update\", description: string) => {\n const command = skill\n .command(name)\n .description(description)\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n );\n command.option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\");\n command.action(async (options: { agent: AgentId[]; origin?: string }) => {\n if (options.origin) {\n const account = dependencies.skillAccount;\n if (!account) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account configuration is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n await account.config.setCurrentOrigin(options.origin);\n }\n await executeSkillTargets(\n program,\n dependencies,\n installSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n yes: commandOptions(program).yes ?? false,\n update: name === \"update\",\n }),\n );\n });\n };\n addInstall(\"install\", \"Install SAG Knowledge for every detected Agent\");\n addInstall(\"update\", \"Resolve the running @latest package and update managed Skills\");\n\n const auth = skill.command(\"auth\").description(\"Authorize one SAG account Origin\");\n auth\n .command(\"login\")\n .description(\"Open browser approval and authorize the current SAG account\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin, true);\n emit(\n program,\n dependencies,\n await authorizeSkillAccount(skillAccountAuthRuntime(dependencies), origin),\n );\n });\n\n auth\n .command(\"status\")\n .description(\"Inspect the saved SAG account authorization\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const account =\n await skillAccountAuthRuntime(dependencies).config.getAccount(origin);\n emit(program, dependencies, {\n authenticated: Boolean(account),\n origin,\n ...(account ? { user: account.user } : {}),\n });\n });\n\n auth\n .command(\"logout\")\n .description(\"Revoke and remove the saved SAG account authorization\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const removed = await logoutSkillAccount(\n skillAccountAuthRuntime(dependencies),\n origin,\n );\n emit(program, dependencies, { origin, removed });\n });\n\n const accountKnowledge = skill\n .command(\"knowledge\")\n .description(\"Use Knowledge Bases available to the authorized SAG account\");\n accountKnowledge\n .command(\"list\")\n .description(\"List Knowledge Bases available to the current SAG account\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await listSkillAccountKnowledgeBases(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n ),\n );\n });\n accountKnowledge\n .command(\"documents\")\n .description(\"List documents in one exact Knowledge Base\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Exact Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string; knowledgeBase: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await listSkillAccountDocuments(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n options.knowledgeBase,\n ),\n );\n });\n accountKnowledge\n .command(\"ask\")\n .description(\"Ask SAG and relay its answer and citations\")\n .argument(\"<question>\", \"Question for SAG\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .option(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Optional exact Knowledge Base scope; omit for SAG global search\",\n )\n .action(\n async (\n question: string,\n options: { origin?: string; knowledgeBase?: string },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await askSkillAccountKnowledge(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n question,\n options.knowledgeBase,\n ),\n );\n },\n );\n accountKnowledge\n .command(\"upload\")\n .description(\"Upload one regular file to an exact Knowledge Base\")\n .argument(\"<file>\", \"One regular file\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .option(\n \"--wait <milliseconds>\",\n \"Use 0 to detach after acceptance\",\n parseNonNegativeInteger,\n )\n .option(\n \"--overwrite-document-id <document-id>\",\n \"Existing document ID returned by a duplicate upload conflict\",\n )\n .action(\n async (\n filePath: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n wait?: number;\n overwriteDocumentId?: string;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const events = await uploadSkillAccountFile(\n skillAccountUploadRuntime(dependencies),\n origin,\n filePath,\n options.knowledgeBase,\n options.wait,\n options.overwriteDocumentId,\n );\n emitSkillAccountUpload(program, dependencies, events);\n },\n );\n accountKnowledge\n .command(\"upload-status\")\n .description(\"Read upload progress using the returned import ID\")\n .argument(\"<import-id>\", \"Import ID returned by upload\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Exact Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (importId: string, options: { origin?: string; knowledgeBase: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emitSkillAccountUploadStatus(\n program,\n dependencies,\n await inspectSkillAccountUpload(\n skillAccountUploadRuntime(dependencies),\n origin,\n importId,\n options.knowledgeBase,\n ),\n );\n },\n );\n accountKnowledge\n .command(\"rename\")\n .description(\"Rename one exact document version\")\n .argument(\"<document-id>\", \"Exact document ID\")\n .requiredOption(\"--title <title>\", \"New document title\")\n .requiredOption(\n \"--expected-version <version>\",\n \"Current document version\",\n parsePositiveInteger,\n )\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (\n documentId: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n expectedVersion: number;\n title: string;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await renameSkillAccountDocument(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n {\n knowledgeBase: options.knowledgeBase,\n documentId,\n expectedVersion: options.expectedVersion,\n title: options.title,\n },\n ),\n );\n },\n );\n accountKnowledge\n .command(\"delete\")\n .description(\"Move one exact document version to the recoverable recycle bin\")\n .argument(\"<document-id>\", \"Exact document ID\")\n .requiredOption(\n \"--expected-version <version>\",\n \"Current document version\",\n parsePositiveInteger,\n )\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (\n documentId: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n expectedVersion: number;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await deleteSkillAccountDocument(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n {\n knowledgeBase: options.knowledgeBase,\n documentId,\n expectedVersion: options.expectedVersion,\n },\n ),\n );\n },\n );\n\n skill\n .command(\"status\")\n .description(\"Inspect managed SAG Knowledge Skill targets\")\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n )\n .action(async (options: { agent: AgentId[] }) => {\n emitSkillTargets(\n program,\n dependencies,\n await inspectSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n }),\n );\n });\n\n skill\n .command(\"uninstall\")\n .description(\"Remove unchanged SAG CLI-managed Skills\")\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n )\n .action(async (options: { agent: AgentId[] }) => {\n await executeSkillTargets(\n program,\n dependencies,\n uninstallSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n yes: commandOptions(program).yes ?? false,\n }),\n );\n });\n}\n\nexport function createProgram(dependencies: CliDependencies): Command {\n const program = new Command();\n skillWriters.set(program, new SkillEventWriter(dependencies.writeStdout));\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 .addOption(\n new Option(\"--output <format>\", \"Output format\")\n .choices([\"human\", \"ndjson\"])\n .conflicts(\"json\"),\n )\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.output === \"ndjson\") {\n skillWriters.get(program)?.complete(\n skillEvent(program, \"completed\", {\n name: \"sag\",\n version: dependencies.version,\n }),\n );\n } else 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 addSkillCommands(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 const program = createProgram(\n commandOutputIsNdjson(arguments_)\n ? { ...dependencies, writeStderr: () => undefined }\n : dependencies,\n );\n try {\n await program.parseAsync(arguments_);\n return exitCodes.success;\n } catch (error) {\n if (error instanceof ReportedSkillTargetFailure) return error.exitCode;\n if (error instanceof CommanderError && error.exitCode === 0) {\n return 0;\n }\n if (error instanceof SkillError) {\n if (json) {\n dependencies.writeStdout(\n renderJson({\n schema: \"sag.cli.v1\",\n ok: false,\n error: {\n code: error.code,\n message: error.message,\n ...(error.details ? { details: error.details } : {}),\n },\n } as never),\n );\n } else if (commandOutputIsNdjson(arguments_)) {\n const event = skillEvent(program, \"failed\", undefined, {\n code: error.code,\n message: error.message,\n retryable: error.code === \"NETWORK_UNREACHABLE\",\n ...(error.details ? { details: error.details } : {}),\n });\n const operationId = error.details?.operation_id;\n skillWriters.get(program)?.complete({\n ...event,\n ...(typeof operationId === \"string\" ? { operation_id: operationId } : {}),\n });\n } else {\n const operationId = error.details?.operation_id;\n dependencies.writeStderr(\n `Error [${error.code}]: ${error.message}${\n typeof operationId === \"string\" ? `\\nOperation ID: ${operationId}` : \"\"\n }\\n`,\n );\n }\n return error.exitCode;\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 if (commandOutputIsNdjson(arguments_)) {\n skillWriters.get(program)?.complete(\n skillEvent(program, \"failed\", undefined, {\n code: toSkillErrorCode(cliError.code),\n message: cliError.message,\n retryable: cliError.code === \"NETWORK_UNREACHABLE\",\n }),\n );\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(\n `${String(redact(cliError.cause.stack ?? cliError.cause.message))}\\n`,\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 loginResponseSchema = z\n .object({\n access_token: z.string().min(1),\n user: userSchema,\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 const outlineItemSchema = z\n .object({\n rank: z.number().int(),\n heading: z.string(),\n chunk_id: z.string(),\n })\n .passthrough();\n\nexport const outlineSchema = z\n .object({\n document_id: z.string(),\n filename: z.string(),\n outline: z.array(outlineItemSchema),\n })\n .passthrough();\n\nexport const grepMatchSchema = z\n .object({\n chunk_id: z.string(),\n heading: z.string(),\n snippet: z.string(),\n })\n .passthrough();\n\nexport const grepResponseSchema = z\n .object({\n pattern: z.string(),\n matches: z.array(grepMatchSchema),\n count: z.number().int().nonnegative(),\n })\n .passthrough();\n\nexport const readResponseSchema = z\n .object({\n document_id: z.string(),\n filename: z.string(),\n total_lines: z.number().int().nonnegative(),\n offset: z.number().int().positive(),\n limit: z.number().int().positive(),\n lines: z.array(z.string()),\n })\n .passthrough();\n\nexport const entityContextSchema = z\n .object({\n entity_id: z.string(),\n name: z.string(),\n type: z.string(),\n description: z.string(),\n context: z.string(),\n source_id: z.string(),\n source_name: z.string(),\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>;\nexport type SagOutline = z.infer<typeof outlineSchema>;\nexport type SagOutlineItem = z.infer<typeof outlineItemSchema>;\nexport type SagGrepResponse = z.infer<typeof grepResponseSchema>;\nexport type SagReadResponse = z.infer<typeof readResponseSchema>;\nexport type SagEntityContext = z.infer<typeof entityContextSchema>;\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 entityContextSchema,\n grepResponseSchema,\n loginResponseSchema,\n mcpDescriptorSchema,\n outlineSchema,\n readResponseSchema,\n readySchema,\n rootSchema,\n searchResponseSchema,\n sourceSchema,\n userSchema,\n type SagCapabilities,\n type SagDocument,\n type SagEntityContext,\n type SagGrepResponse,\n type SagMcpDescriptor,\n type SagOutline,\n type SagReadResponse,\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 timeoutMs?: number;\n}\n\nconst searchTimeoutMs = 15_000;\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 async login(name: string): Promise<{ accessToken: string; user: SagUser }> {\n const response = await this.#request(\"/api/v1/auth/login\", loginResponseSchema, {\n authenticated: false,\n method: \"POST\",\n body: { name },\n });\n return { accessToken: response.access_token, user: response.user };\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 timeoutMs: searchTimeoutMs,\n });\n }\n\n outline(sourceId: string, documentId: string): Promise<SagOutline> {\n const params = new URLSearchParams({ document_id: documentId });\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/outline?${params}`,\n outlineSchema,\n );\n }\n\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse> {\n const params = new URLSearchParams({ pattern });\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/grep?${params}`,\n grepResponseSchema,\n );\n }\n\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse> {\n const params = new URLSearchParams();\n if (offset !== undefined) {\n params.set(\"offset\", String(offset));\n }\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}/read?${params}`,\n readResponseSchema,\n );\n }\n\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext> {\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/entities/${encodeURIComponent(name)}/context`,\n entityContextSchema,\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(options.timeoutMs ?? 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, StdioMcpConnectionSpec } from \"../mcp/connection.js\";\nimport type { McpVerificationReport, McpVerifyOptions } from \"../mcp/verifier.js\";\nimport {\n connectionKey,\n fingerprintConnection,\n type AgentAdapter,\n type PersonalAgentId,\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: StdioMcpConnectionSpec;\n}\n\nexport type AgentPlanAction = \"create\" | \"update\" | \"unchanged\";\n\nexport interface AgentConnectionPlan {\n action: AgentPlanAction;\n agent: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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 if (!input.adapter.capabilities.transports.includes(resolved.spec.transport)) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `${input.agent} adapter does not support ${resolved.spec.transport} MCP connections`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"Choose a provider supported by the installed Agent adapter.\",\n },\n );\n }\n if (!input.adapter.capabilities.scopes.includes(input.scope)) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `${input.agent} adapter does not support ${input.scope} scope`,\n { exitCode: exitCodes.invalidArgument },\n );\n }\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 ProviderReport,\n StdioMcpConnectionSpec,\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<StdioMcpConnectionSpec> {\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 PersonalAgentId,\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?: {\n agent?: PersonalAgentId;\n scope?: AgentScope;\n }): Promise<ManagedConnection[]>;\n };\n adapters: Record<PersonalAgentId, AgentAdapter>;\n verifier: AgentMcpVerifier;\n}\n\nexport interface ConnectLocalAgentInput {\n agent: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId,\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?: PersonalAgentId;\n serverName: string;\n },\n): Promise<AgentStatusReport[]> {\n const agents: PersonalAgentId[] = input.agent\n ? [input.agent]\n : [\"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: PersonalAgentId;\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: PersonalAgentId;\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 name?: string;\n promptName(): Promise<string>;\n authenticate(name: string): Promise<{ accessToken: string; user: AuthUser }>;\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 environmentToken = input.environmentToken?.trim();\n if (environmentToken) {\n const user = await input.validate(environmentToken);\n await input.store.set(input.credentialRef, environmentToken);\n return {\n authenticated: true,\n credentialRef: input.credentialRef,\n credentialStore: input.store.kind,\n user,\n };\n }\n const name = (input.name ?? (await input.promptName())).trim();\n if (!name) {\n throw new CliError(\"INVALID_ARGUMENT\", \"A SAG user name is required\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"Pass `--name <name>` or enter a name when prompted.\",\n });\n }\n const { accessToken, user } = await input.authenticate(name);\n await input.store.set(input.credentialRef, accessToken);\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 { CliError, exitCodes } from \"../core/errors.js\";\nimport type {\n SagEntityContext,\n SagGrepResponse,\n SagOutline,\n SagReadResponse,\n} from \"../api/schemas.js\";\n\nexport interface KnowledgeClient {\n outline(sourceId: string, documentId: string): Promise<SagOutline>;\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse>;\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse>;\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext>;\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 async function outline(\n client: KnowledgeClient,\n sourceId: string,\n documentId: string,\n): Promise<SagOutline> {\n return client.outline(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(documentId, \"Document ID\"),\n );\n}\n\nexport async function grep(\n client: KnowledgeClient,\n sourceId: string,\n pattern: string,\n limit?: number,\n): Promise<SagGrepResponse> {\n return client.grep(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(pattern, \"Pattern\"),\n limit,\n );\n}\n\nexport async function read(\n client: KnowledgeClient,\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n): Promise<SagReadResponse> {\n return client.readDocument(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(documentId, \"Document ID\"),\n offset,\n limit,\n );\n}\n\nexport async function getEntityContext(\n client: KnowledgeClient,\n sourceId: string,\n name: string,\n): Promise<SagEntityContext> {\n return client.getEntityContext(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(name, \"Entity name\"),\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 type LocalMcpTestReport = 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 { CredentialStore } from \"../../credentials/store.js\";\nimport type { EnterpriseMcpConnection } from \"./model.js\";\n\nexport type EnterpriseMcpCredentialStores = Readonly<\n Record<EnterpriseMcpConnection[\"credentialStore\"], CredentialStore>\n>;\n\nexport function credentialStoreForEnterpriseMcpConnection(\n connection: EnterpriseMcpConnection,\n stores: EnterpriseMcpCredentialStores,\n): CredentialStore {\n return stores[connection.credentialStore];\n}\n","import { createHash } from \"node:crypto\";\n\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport type { ParsedEnterpriseServer, ParseEnterpriseMcpOptions } from \"./model.js\";\n\ninterface RawServer {\n transport?: unknown;\n type?: unknown;\n url?: unknown;\n headers?: unknown;\n}\n\nexport interface EnterpriseMcpServerCandidate {\n serverKey: string;\n raw: unknown;\n}\n\nfunction invalidImport(message: string, cause?: unknown): CliError {\n return new CliError(\"INVALID_ARGUMENT\", message, {\n exitCode: exitCodes.invalidArgument,\n ...(cause ? { cause } : {}),\n });\n}\n\nfunction parseDocument(input: string): Record<string, RawServer> {\n let decoded: unknown;\n try {\n decoded = JSON.parse(input);\n } catch (cause) {\n throw invalidImport(\"MCP 连接信息必须是有效的 JSON\", cause);\n }\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) {\n throw invalidImport(\"MCP 连接信息必须是 JSON 对象\");\n }\n\n const root = decoded as Record<string, unknown>;\n if (Object.keys(root).length !== 1 || !(\"mcpServers\" in root)) {\n throw invalidImport(\"MCP 连接信息的根字段必须且只能使用 mcpServers\");\n }\n const servers = root.mcpServers;\n if (!servers || typeof servers !== \"object\" || Array.isArray(servers)) {\n throw invalidImport(\"MCP 连接信息必须包含服务器配置\");\n }\n const parsedServers = servers as Record<string, RawServer>;\n if (!Object.keys(parsedServers).length) {\n throw invalidImport(\"MCP 连接信息中没有服务器\");\n }\n return parsedServers;\n}\n\nfunction hasForbiddenRawUrlDelimiter(value: string): boolean {\n const schemeEnd = value.indexOf(\"://\");\n const authorityAndPath = schemeEnd < 0 ? \"\" : value.slice(schemeEnd + 3);\n const authorityEnd = authorityAndPath.search(/[/?#]/u);\n const authority =\n authorityEnd < 0 ? authorityAndPath : authorityAndPath.slice(0, authorityEnd);\n return authority.includes(\"@\") || value.includes(\"#\");\n}\n\nfunction parseUrl(value: unknown, options: ParseEnterpriseMcpOptions): string {\n if (typeof value !== \"string\") {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n if (hasForbiddenRawUrlDelimiter(value)) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch (cause) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\", cause);\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n !url.hostname ||\n url.username ||\n url.password\n ) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n\n const localHosts = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n if (\n url.protocol === \"http:\" &&\n !options.allowInsecureHttp &&\n !localHosts.has(url.hostname)\n ) {\n throw invalidImport(\"远程 MCP 服务器 URL 必须使用 HTTPS\");\n }\n return url.toString();\n}\n\nexport function parseEnterpriseMcpHeaders(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw invalidImport(\"MCP 服务器配置必须包含 Authorization 请求头\");\n }\n\n const entries = Object.entries(value as Record<string, unknown>);\n let authorizationCount = 0;\n for (const [name, headerValue] of entries) {\n if (typeof headerValue !== \"string\") {\n throw invalidImport(\"MCP 服务器请求头的值必须是字符串\");\n }\n try {\n new Headers({ [name]: headerValue });\n } catch {\n throw invalidImport(\"MCP 服务器请求头无效\");\n }\n if (name.toLowerCase() === \"authorization\") {\n authorizationCount += 1;\n if (!headerValue.trim().startsWith(\"Bearer \")) {\n throw invalidImport(\"MCP Authorization 请求头必须使用 Bearer Token\");\n }\n }\n }\n if (authorizationCount !== 1) {\n throw invalidImport(\"MCP 服务器配置必须包含且只能包含一个 Authorization 请求头\");\n }\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction parseServer(\n serverKey: string,\n raw: unknown,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw invalidImport(\"MCP 服务器配置必须是对象\");\n }\n const server = raw as RawServer;\n if (server.type !== undefined && server.type !== \"http\") {\n throw invalidImport(\"MCP 服务器 type 必须是 http\");\n }\n if (\n server.transport !== undefined &&\n server.transport !== \"streamable_http\" &&\n server.transport !== \"streamable-http\"\n ) {\n throw invalidImport(\"MCP 服务器 transport 必须是 streamable_http\");\n }\n\n const connection: HttpMcpConnectionSpec = {\n transport: \"streamable-http\",\n url: parseUrl(server.url, options),\n headers: parseEnterpriseMcpHeaders(server.headers),\n };\n return { serverKey, preferredId: serverKey, connection };\n}\n\nexport function parseEnterpriseMcpDocument(\n raw: string,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer[] {\n return parseEnterpriseMcpCandidates(raw).map((candidate) =>\n validateEnterpriseMcpServer(candidate, options),\n );\n}\n\nexport function parseEnterpriseMcpCandidates(\n raw: string,\n): EnterpriseMcpServerCandidate[] {\n return Object.entries(parseDocument(raw)).map(([serverKey, server]) => ({\n serverKey,\n raw: server,\n }));\n}\n\nexport function validateEnterpriseMcpServer(\n candidate: EnterpriseMcpServerCandidate,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer {\n return parseServer(candidate.serverKey, candidate.raw, options);\n}\n\nfunction selectByServerKey<T extends { serverKey: string }>(\n servers: readonly T[],\n requested: readonly string[] = [],\n): T[] {\n if (!requested.length) return [...servers];\n\n const serversByKey = new Map(servers.map((server) => [server.serverKey, server]));\n return requested.map((serverKey) => {\n const server = serversByKey.get(serverKey);\n if (!server) {\n throw invalidImport(`找不到 MCP 服务器:${serverKey}`);\n }\n return server;\n });\n}\n\nexport function selectEnterpriseMcpCandidates(\n servers: readonly EnterpriseMcpServerCandidate[],\n requested: readonly string[] = [],\n): EnterpriseMcpServerCandidate[] {\n return selectByServerKey(servers, requested);\n}\n\nexport function selectEnterpriseServers(\n servers: readonly ParsedEnterpriseServer[],\n requested: readonly string[] = [],\n): ParsedEnterpriseServer[] {\n return selectByServerKey(servers, requested);\n}\n\nexport function connectionIdForCollision(serverKey: string, url: string): string {\n return `${serverKey}-${createHash(\"sha256\").update(new URL(url).toString()).digest(\"hex\").slice(0, 8)}`;\n}\n","import { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport {\n credentialStoreForEnterpriseMcpConnection,\n type EnterpriseMcpCredentialStores,\n} from \"./credentials.js\";\nimport { parseEnterpriseMcpHeaders } from \"./import.js\";\nimport type { EnterpriseMcpConnection } from \"./model.js\";\n\nfunction credentialFailure(): CliError {\n return new CliError(\"MCP_FAILED\", \"企业 MCP 凭据不可用或无效\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查企业 MCP 凭据存储,必要时重新连接。\",\n });\n}\n\nexport async function resolveEnterpriseMcpSpec(\n connection: EnterpriseMcpConnection,\n stores: EnterpriseMcpCredentialStores,\n): Promise<HttpMcpConnectionSpec> {\n const store = credentialStoreForEnterpriseMcpConnection(connection, stores);\n let encodedCredential: string | null;\n try {\n encodedCredential = await store.get(connection.credentialRef);\n } catch {\n throw credentialFailure();\n }\n if (!encodedCredential) {\n throw credentialFailure();\n }\n\n try {\n return {\n transport: connection.transport,\n url: connection.url,\n headers: parseEnterpriseMcpHeaders(JSON.parse(encodedCredential)),\n };\n } catch {\n throw credentialFailure();\n }\n}\n","import { isDeepStrictEqual } from \"node:util\";\n\nimport { connectionKey, fingerprintValue, type AgentId } from \"../../agents/adapter.js\";\nimport type { AgentMcpVerifier } from \"../../agents/orchestrator.js\";\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { CredentialStore } from \"../../credentials/store.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport {\n attachEnterpriseMcp,\n detachEnterpriseMcp,\n inspectEnterpriseAgent,\n refreshManagedAgents,\n type EnterpriseMcpAgentRuntime,\n} from \"./agent-service.js\";\nimport type { EnterpriseMcpCredentialStores } from \"./credentials.js\";\nimport {\n connectionIdForCollision,\n parseEnterpriseMcpCandidates,\n selectEnterpriseMcpCandidates,\n validateEnterpriseMcpServer,\n type EnterpriseMcpServerCandidate,\n} from \"./import.js\";\nimport type {\n EnterpriseMcpConnection,\n McpToolSummary,\n ParsedEnterpriseServer,\n StageResult,\n ToolRiskSummary,\n} from \"./model.js\";\nimport { classifyTools } from \"./risk.js\";\nimport {\n inspectEnterpriseSkill,\n installEnterpriseSkill,\n uninstallEnterpriseSkill,\n type EnterpriseMcpSkillRuntime,\n} from \"./skill-service.js\";\nimport { resolveEnterpriseMcpSpec } from \"./runtime.js\";\nimport type {\n EnterpriseMcpConnectionState,\n EnterpriseMcpConnectionStore,\n} from \"./store.js\";\n\nexport type EnterpriseMcpCollisionAction = \"replace\" | \"keep-both\";\n\nexport interface EnterpriseMcpServerChoice {\n serverKey: string;\n}\n\nexport interface EnterpriseMcpCollisionChoice {\n serverKey: string;\n existingUrl: string;\n incomingUrl: string;\n}\n\nexport interface EnterpriseMcpConnectRuntime {\n store: EnterpriseMcpConnectionStore;\n credentials: EnterpriseMcpCredentialStores;\n verifier: AgentMcpVerifier;\n agents: EnterpriseMcpAgentRuntime;\n skill: EnterpriseMcpSkillRuntime;\n client?: EnterpriseMcpLifecycleHttpClient;\n now(): Date;\n}\n\nexport interface EnterpriseMcpLifecycleHttpClient {\n listTools(\n spec: HttpMcpConnectionSpec,\n options: { cliVersion: string; timeoutMs: number },\n ): Promise<{ tools: readonly McpToolSummary[] }>;\n callTool(input: {\n spec: HttpMcpConnectionSpec;\n cliVersion: string;\n timeoutMs: number;\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n }): Promise<{ tool: string; result: unknown }>;\n}\n\nexport interface EnterpriseConnectConnectionReport {\n serverKey: string;\n id: string;\n url: string;\n toolCount: number;\n risk: ToolRiskSummary;\n persisted: boolean;\n}\n\nexport interface EnterpriseConnectReport {\n kind: \"enterprise-mcp-stages\";\n dryRun: boolean;\n activeId: string | null;\n plannedActiveId?: string;\n connections: EnterpriseConnectConnectionReport[];\n stages: StageResult[];\n}\n\nexport interface ConnectEnterpriseMcpInput {\n runtime: EnterpriseMcpConnectRuntime;\n raw: string;\n requestedServers: readonly string[];\n requestedAgents: readonly AgentId[];\n credentialStore: EnterpriseMcpConnection[\"credentialStore\"];\n collisionAction?: EnterpriseMcpCollisionAction;\n allowInsecureHttp: boolean;\n timeoutMs: number;\n yes: boolean;\n noSkill: boolean;\n dryRun: boolean;\n interactive: boolean;\n selectMcpServers(\n servers: readonly EnterpriseMcpServerChoice[],\n ): Promise<readonly string[]>;\n selectAgents(agents: readonly AgentId[]): Promise<readonly AgentId[]>;\n selectCollisionAction(\n collision: EnterpriseMcpCollisionChoice,\n ): Promise<EnterpriseMcpCollisionAction>;\n}\n\ninterface VerifiedServer {\n parsed: ParsedEnterpriseServer;\n tools: McpToolSummary[];\n risk: ToolRiskSummary;\n observedAt: string;\n}\n\nconst supportedAgents = [\"codex\", \"claude-code\", \"workbuddy\"] as const;\n\nexport async function resolveEnterpriseMcpConnection(input: {\n store: EnterpriseMcpConnectionStore;\n server?: string;\n}): Promise<EnterpriseMcpConnection> {\n if (input.server !== undefined) {\n const id = input.server.trim();\n if (!id) {\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 连接名称不能为空\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n const connection = await input.store.get(id);\n if (connection) {\n return connection;\n }\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n\n const connection = await input.store.active();\n if (connection) {\n return connection;\n }\n throw new CliError(\"RESOURCE_NOT_FOUND\", \"当前没有正在使用的企业 MCP 连接\", {\n exitCode: exitCodes.resourceNotFound,\n hint: \"请先选择或导入一个企业 MCP 连接。\",\n });\n}\n\nasync function restoreCredential(\n credentials: CredentialStore,\n reference: string,\n previous: string | null,\n): Promise<void> {\n if (previous === null) {\n await credentials.delete(reference);\n return;\n }\n await credentials.set(reference, previous);\n}\n\nfunction assertCredentialRef(connection: EnterpriseMcpConnection): void {\n if (connection.credentialRef !== `enterprise-mcp/${connection.id}`) {\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 凭据引用无效\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n}\n\nasync function restoreAndVerifyPersistence(input: {\n credentials: CredentialStore;\n store: EnterpriseMcpConnectionStore;\n reference: string;\n previousCredential: string | null;\n previousState: EnterpriseMcpConnectionState;\n failure: unknown;\n restoreConnection: boolean;\n}): Promise<void> {\n const {\n credentials,\n failure,\n previousCredential,\n previousState,\n reference,\n restoreConnection,\n store,\n } = input;\n const recoveryFailures: unknown[] = [];\n const operations = await Promise.allSettled([\n ...(restoreConnection ? [store.restore({ previous: previousState })] : []),\n restoreCredential(credentials, reference, previousCredential),\n ]);\n if (restoreConnection && operations[0]?.status === \"rejected\") {\n recoveryFailures.push(operations[0].reason);\n }\n const credentialRestore = operations.at(-1);\n if (credentialRestore?.status === \"rejected\") {\n recoveryFailures.push(credentialRestore.reason);\n }\n\n const [stateReadback, credentialReadback] = await Promise.allSettled([\n store.load(),\n credentials.get(reference),\n ]);\n if (\n stateReadback.status === \"rejected\" ||\n !isDeepStrictEqual(stateReadback.value, previousState)\n ) {\n recoveryFailures.push(new Error(\"无法验证企业 MCP 连接是否已回滚\"));\n }\n if (\n credentialReadback.status === \"rejected\" ||\n credentialReadback.value !== previousCredential\n ) {\n recoveryFailures.push(new Error(\"无法验证企业 MCP 凭据是否已回滚\"));\n }\n\n if (recoveryFailures.length) {\n throw new AggregateError(\n [failure, ...recoveryFailures],\n \"企业 MCP 持久化恢复过程中出现其他失败\",\n { cause: failure },\n );\n }\n}\n\nasync function recover(input: {\n credentials: CredentialStore;\n store: EnterpriseMcpConnectionStore;\n reference: string;\n previousCredential: string | null;\n previousState: EnterpriseMcpConnectionState;\n failure: unknown;\n restoreConnection: boolean;\n}): Promise<never> {\n await restoreAndVerifyPersistence(input);\n throw input.failure;\n}\n\nexport async function persistVerifiedConnection(input: {\n store: EnterpriseMcpConnectionStore;\n credentials: CredentialStore;\n connection: EnterpriseMcpConnection;\n encodedCredential: string;\n}): Promise<void> {\n const { connection, credentials, encodedCredential, store } = input;\n assertCredentialRef(connection);\n\n await store.withPersistenceLock(async () => {\n const previousState = await store.load();\n const previousCredential = await credentials.get(connection.credentialRef);\n\n try {\n await credentials.set(connection.credentialRef, encodedCredential);\n } catch (failure) {\n return recover({\n credentials,\n store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure,\n restoreConnection: false,\n });\n }\n\n try {\n await store.upsert(connection);\n const [persistedConnection, persistedCredential] = await Promise.all([\n store.get(connection.id),\n credentials.get(connection.credentialRef),\n ]);\n if (!isDeepStrictEqual(persistedConnection, connection)) {\n throw new Error(\"企业 MCP 连接未能持久化\");\n }\n if (persistedCredential !== encodedCredential) {\n throw new Error(\"企业 MCP 凭据未能持久化\");\n }\n } catch (failure) {\n return recover({\n credentials,\n store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure,\n restoreConnection: true,\n });\n }\n });\n}\n\nfunction stageSuccess(\n stage: StageResult[\"stage\"],\n target: string,\n status: Exclude<StageResult[\"status\"], \"failed\">,\n message: string,\n): StageResult {\n return { stage, target, ok: true, status, message };\n}\n\nfunction stageFailure(\n stage: StageResult[\"stage\"],\n target: string,\n cause: unknown,\n message: string,\n): StageResult {\n const code =\n cause instanceof CliError\n ? cause.code\n : stage === \"verify\" || stage === \"reverify\"\n ? \"MCP_FAILED\"\n : stage === \"agent\"\n ? \"HOST_CONFIG_FAILED\"\n : \"INTERNAL_ERROR\";\n return { stage, target, ok: false, status: \"failed\", code, message };\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nasync function selectServers(\n input: ConnectEnterpriseMcpInput,\n servers: readonly EnterpriseMcpServerCandidate[],\n): Promise<EnterpriseMcpServerCandidate[]> {\n if (input.requestedServers.length) {\n return unique(\n selectEnterpriseMcpCandidates(servers, unique(input.requestedServers)).map(\n (server) => server.serverKey,\n ),\n ).map(\n (serverKey) =>\n servers.find(\n (server) => server.serverKey === serverKey,\n ) as EnterpriseMcpServerCandidate,\n );\n }\n if (!input.interactive) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"请至少使用一次 --server 明确选择 MCP Server\",\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"可重复使用 --server 选择多个 Server;--yes 不会自动选择目标。\",\n },\n );\n }\n const requested = await input.selectMcpServers(\n servers.map((server) => ({\n serverKey: server.serverKey,\n })),\n );\n if (!requested.length) return [];\n return selectEnterpriseMcpCandidates(servers, unique(requested));\n}\n\nasync function selectInstalledAgents(\n input: ConnectEnterpriseMcpInput,\n): Promise<AgentId[]> {\n if (input.requestedAgents.length) return unique(input.requestedAgents);\n if (!input.interactive) return [];\n\n const detected = await Promise.all(\n supportedAgents.map(async (agent) => {\n try {\n await input.runtime.agents.adapters[agent].detect();\n return agent;\n } catch {\n return null;\n }\n }),\n );\n const installed = detected.filter((agent): agent is AgentId => agent !== null);\n return unique(await input.selectAgents(installed));\n}\n\nasync function verifyServer(\n runtime: EnterpriseMcpConnectRuntime,\n server: ParsedEnterpriseServer,\n timeoutMs: number,\n): Promise<VerifiedServer> {\n const report = await runtime.verifier.verify(server.connection, { timeoutMs });\n if (report.transport !== \"streamable-http\") {\n throw new CliError(\"MCP_FAILED\", \"企业 MCP 返回了不支持的传输类型\", {\n exitCode: exitCodes.mcpFailed,\n });\n }\n const tools = [...report.tools];\n return {\n parsed: server,\n tools,\n risk: classifyTools(tools),\n observedAt: runtime.now().toISOString(),\n };\n}\n\nasync function connectionIdentity(input: {\n connect: ConnectEnterpriseMcpInput;\n server: ParsedEnterpriseServer;\n}): Promise<{ id: string; previous: EnterpriseMcpConnection | null }> {\n const preferred = await input.connect.runtime.store.get(input.server.preferredId);\n if (!preferred || preferred.url === input.server.connection.url) {\n return { id: input.server.preferredId, previous: preferred };\n }\n\n let action = input.connect.collisionAction;\n if (!action) {\n if (!input.connect.interactive) {\n throw new CliError(\n \"CONFIG_CONFLICT\",\n `MCP Server ${input.server.serverKey} 已保存为其他 URL`,\n {\n exitCode: exitCodes.configConflict,\n hint: \"自动化请明确使用 --replace 或 --keep-both。\",\n },\n );\n }\n action = await input.connect.selectCollisionAction({\n serverKey: input.server.serverKey,\n existingUrl: preferred.url,\n incomingUrl: input.server.connection.url,\n });\n }\n if (action === \"replace\") {\n return { id: input.server.preferredId, previous: preferred };\n }\n\n const id = connectionIdForCollision(\n input.server.serverKey,\n input.server.connection.url,\n );\n return { id, previous: await input.connect.runtime.store.get(id) };\n}\n\nfunction buildConnection(input: {\n verified: VerifiedServer;\n id: string;\n previous: EnterpriseMcpConnection | null;\n credentialStore: EnterpriseMcpConnection[\"credentialStore\"];\n now: string;\n}): EnterpriseMcpConnection {\n const { id, previous, verified } = input;\n return {\n id,\n serverKey: verified.parsed.serverKey,\n preferredId: verified.parsed.preferredId,\n transport: \"streamable-http\",\n url: verified.parsed.connection.url,\n headerNames: Object.keys(verified.parsed.connection.headers).sort((left, right) =>\n left.localeCompare(right),\n ),\n credentialStore: input.credentialStore,\n credentialRef: `enterprise-mcp/${id}`,\n toolSnapshot: {\n count: verified.tools.length,\n fingerprint: fingerprintValue(verified.tools),\n risk: verified.risk,\n observedAt: verified.observedAt,\n },\n createdAt: previous?.createdAt ?? input.now,\n updatedAt: input.now,\n lastVerifiedAt: input.now,\n };\n}\n\nfunction translatedAgentStage(result: StageResult): StageResult {\n return {\n ...result,\n message: result.ok\n ? result.status === \"skipped\"\n ? \"Agent 中的企业 MCP 配置已经是最新状态。\"\n : \"Agent 中的企业 MCP 配置已完成并通过验证。\"\n : \"Agent 中的企业 MCP 配置未能更新,请检查该 Agent 后重试。\",\n };\n}\n\nasync function reverifyAgent(\n input: ConnectEnterpriseMcpInput,\n agent: AgentId,\n connectionId: string,\n spec: HttpMcpConnectionSpec,\n): Promise<StageResult> {\n const target = `${agent}:${connectionId}`;\n try {\n await input.runtime.verifier.verify(spec, { timeoutMs: input.timeoutMs });\n return stageSuccess(\n \"reverify\",\n target,\n \"updated\",\n input.dryRun ? \"已完成只读的最终验证计划。\" : \"Agent 接入后的 MCP 已再次验证。\",\n );\n } catch (cause) {\n return stageFailure(\n \"reverify\",\n target,\n cause,\n \"Agent 接入后的 MCP 最终验证失败,请检查该 Agent 后重试。\",\n );\n }\n}\n\nasync function attachSelectedAgent(input: {\n connect: ConnectEnterpriseMcpInput;\n connection: EnterpriseMcpConnection;\n spec: HttpMcpConnectionSpec;\n agent: AgentId;\n}): Promise<{ stage: StageResult; connected: boolean }> {\n let confirmed = true;\n const runtime: EnterpriseMcpAgentRuntime = {\n ...input.connect.runtime.agents,\n confirm: async () => {\n confirmed = await input.connect.runtime.agents.confirm(\n `Agent ${input.agent} 中已有同名 MCP,是否由 sag-cli 接管并替换?`,\n );\n return confirmed;\n },\n };\n try {\n const result = await attachEnterpriseMcp(runtime, {\n connection: input.connection,\n spec: input.spec,\n agent: input.agent,\n yes: input.connect.yes,\n timeoutMs: input.connect.timeoutMs,\n dryRun: input.connect.dryRun,\n });\n return { stage: translatedAgentStage(result), connected: confirmed };\n } catch (cause) {\n return {\n stage: stageFailure(\n \"agent\",\n input.agent,\n cause,\n \"Agent 中的企业 MCP 配置失败;已保存的连接不受影响。\",\n ),\n connected: false,\n };\n }\n}\n\nfunction skippedAgentStage(agent: AgentId): StageResult {\n return stageSuccess(\n \"agent\",\n agent,\n \"skipped\",\n \"MCP 未返回可用工具,已跳过新的 Agent 配置。\",\n );\n}\n\nfunction skippedSkillStage(agent: AgentId): StageResult {\n return stageSuccess(\n \"skill\",\n agent,\n \"skipped\",\n \"MCP 未返回可用工具,已跳过 Skill 安装。\",\n );\n}\n\nasync function installSkillForAgent(\n input: ConnectEnterpriseMcpInput,\n agent: AgentId,\n): Promise<StageResult> {\n if (input.noSkill) {\n return stageSuccess(\"skill\", agent, \"skipped\", \"已按 --no-skill 跳过 Skill 安装。\");\n }\n if (input.dryRun) {\n return stageSuccess(\n \"skill\",\n agent,\n \"created\",\n \"已生成 Skill 安装计划,未写入文件或备份。\",\n );\n }\n const result = await installEnterpriseSkill({ ...input.runtime.skill, agent });\n return {\n ...result,\n message: result.ok\n ? \"企业 SAG MCP Skill 已安装。\"\n : \"Skill 安装失败;连接和 Agent MCP 配置保持不变。\",\n };\n}\n\nexport async function connectEnterpriseMcp(\n input: ConnectEnterpriseMcpInput,\n): Promise<EnterpriseConnectReport> {\n const candidates = parseEnterpriseMcpCandidates(input.raw);\n const selected = await selectServers(input, candidates);\n const stages: StageResult[] = [];\n const verified: VerifiedServer[] = [];\n\n for (const candidate of selected) {\n let server: ParsedEnterpriseServer;\n try {\n server = validateEnterpriseMcpServer(candidate, {\n allowInsecureHttp: input.allowInsecureHttp,\n });\n stages.push(\n stageSuccess(\n \"parse\",\n candidate.serverKey,\n \"created\",\n \"MCP Server 输入校验通过。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"parse\",\n candidate.serverKey,\n cause,\n \"MCP Server 输入校验失败,其他已选 Server 将继续处理。\",\n ),\n );\n continue;\n }\n try {\n const result = await verifyServer(input.runtime, server, input.timeoutMs);\n verified.push(result);\n stages.push(\n stageSuccess(\n \"verify\",\n server.serverKey,\n \"updated\",\n \"MCP 初始化和工具列表验证通过。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"verify\",\n server.serverKey,\n cause,\n \"MCP 验证失败,请检查该 Server 的地址和凭据。\",\n ),\n );\n }\n }\n\n const agents = verified.length ? await selectInstalledAgents(input) : [];\n const initialActive = await input.runtime.store.active();\n const connections: EnterpriseConnectConnectionReport[] = [];\n const skillEligibleAgents = new Set<AgentId>();\n const zeroToolSkillAgents = new Set<AgentId>();\n const reverifications: Array<{\n agent: AgentId;\n connectionId: string;\n spec: HttpMcpConnectionSpec;\n }> = [];\n let plannedActiveId: string | undefined;\n\n for (const item of verified) {\n let connection: EnterpriseMcpConnection;\n let previous: EnterpriseMcpConnection | null;\n try {\n const identity = await connectionIdentity({\n connect: input,\n server: item.parsed,\n });\n previous = identity.previous;\n if (previous && previous.credentialStore !== input.credentialStore) {\n throw new CliError(\n \"CONFIG_CONFLICT\",\n \"不能直接切换企业 MCP 的凭据存储;请先断开连接,再使用所需存储重新连接。\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"先运行 sag mcp disconnect,再重新运行 sag mcp connect。\",\n },\n );\n }\n connection = buildConnection({\n verified: item,\n id: identity.id,\n previous,\n credentialStore: input.credentialStore,\n now: input.runtime.now().toISOString(),\n });\n if (!input.dryRun) {\n await persistVerifiedConnection({\n store: input.runtime.store,\n credentials: input.runtime.credentials[input.credentialStore],\n connection,\n encodedCredential: JSON.stringify(item.parsed.connection.headers),\n });\n await input.runtime.store.use(connection.id);\n }\n plannedActiveId = connection.id;\n connections.push({\n serverKey: item.parsed.serverKey,\n id: connection.id,\n url: connection.url,\n toolCount: item.tools.length,\n risk: item.risk,\n persisted: !input.dryRun,\n });\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n previous ? \"updated\" : \"created\",\n input.dryRun\n ? \"已生成连接和凭据保存计划,未写入本机状态。\"\n : \"连接元数据和凭据已保存。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"persist\",\n item.parsed.serverKey,\n cause,\n cause instanceof CliError && cause.code === \"CONFIG_CONFLICT\"\n ? cause.message\n : \"连接未能保存;其他 Server 不受影响。\",\n ),\n );\n continue;\n }\n\n const successfulAgents = new Set<AgentId>();\n const refreshedAgents = new Set<AgentId>();\n if (previous) {\n try {\n const refreshed = await refreshManagedAgents(input.runtime.agents, {\n connection,\n spec: item.parsed.connection,\n timeoutMs: input.timeoutMs,\n dryRun: input.dryRun,\n });\n for (const result of refreshed) {\n const translated = translatedAgentStage(result);\n stages.push(translated);\n if (supportedAgents.includes(result.target as AgentId)) {\n const agent = result.target as AgentId;\n refreshedAgents.add(agent);\n if (result.ok) successfulAgents.add(agent);\n }\n }\n } catch (cause) {\n stages.push(\n stageFailure(\n \"agent\",\n connection.id,\n cause,\n \"无法读取受管 Agent 状态;已保存的连接保持有效,其他 Server 将继续处理。\",\n ),\n );\n }\n }\n\n if (item.tools.length === 0) {\n for (const agent of successfulAgents) {\n reverifications.push({\n agent,\n connectionId: connection.id,\n spec: item.parsed.connection,\n });\n }\n for (const agent of agents) {\n stages.push(skippedAgentStage(agent));\n zeroToolSkillAgents.add(agent);\n }\n continue;\n }\n\n let riskAccepted = input.yes || input.dryRun || !item.risk.hasWarning;\n if (!riskAccepted && agents.length) {\n riskAccepted = await input.runtime.agents.confirm(\n `MCP ${connection.id} 含有写入、删除或风险未知的工具,是否继续接入所选 Agent?`,\n );\n }\n\n for (const agent of agents) {\n if (!riskAccepted) {\n stages.push(\n stageSuccess(\n \"agent\",\n agent,\n \"skipped\",\n \"用户取消了风险确认,未修改 Agent 配置。\",\n ),\n );\n continue;\n }\n if (refreshedAgents.has(agent)) continue;\n const attached = await attachSelectedAgent({\n connect: input,\n connection,\n spec: item.parsed.connection,\n agent,\n });\n stages.push(attached.stage);\n if (attached.stage.ok && attached.connected) successfulAgents.add(agent);\n }\n\n for (const agent of successfulAgents) {\n if (agents.includes(agent)) skillEligibleAgents.add(agent);\n reverifications.push({\n agent,\n connectionId: connection.id,\n spec: item.parsed.connection,\n });\n }\n }\n\n for (const agent of agents) {\n if (skillEligibleAgents.has(agent)) {\n stages.push(await installSkillForAgent(input, agent));\n } else if (zeroToolSkillAgents.has(agent)) {\n stages.push(skippedSkillStage(agent));\n }\n }\n for (const reverify of reverifications) {\n stages.push(\n await reverifyAgent(input, reverify.agent, reverify.connectionId, reverify.spec),\n );\n }\n\n const active = input.dryRun ? initialActive : await input.runtime.store.active();\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n activeId: active?.id ?? null,\n ...(plannedActiveId === undefined ? {} : { plannedActiveId }),\n connections,\n stages,\n };\n}\n\nexport interface EnterpriseMcpStagesReport {\n kind: \"enterprise-mcp-stages\";\n dryRun: boolean;\n connection?: { id: string; endpoint: string };\n stages: StageResult[];\n nextActions: string[];\n}\n\nexport interface EnterpriseMcpAgentStatus {\n agent: AgentId;\n mcp: \"connected\" | \"disconnected\" | \"drifted\" | \"unavailable\";\n skill: \"valid\" | \"missing\" | \"drifted\" | \"unmanaged\" | \"unavailable\";\n nextActions: string[];\n}\n\nexport interface EnterpriseMcpStatusReport {\n kind: \"enterprise-mcp-status\";\n connection: { id: string; active: boolean; endpoint: string };\n health: \"ready\" | \"unavailable\";\n toolCount: number;\n risk: ToolRiskSummary;\n agents: EnterpriseMcpAgentStatus[];\n nextActions: string[];\n}\n\ninterface EnterpriseMcpMutationInput {\n runtime: EnterpriseMcpConnectRuntime;\n server?: string;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n}\n\nfunction publicConnection(connection: EnterpriseMcpConnection): {\n id: string;\n endpoint: string;\n} {\n return { id: connection.id, endpoint: connection.url };\n}\n\nfunction cancelledStage(\n stage: Extract<StageResult[\"stage\"], \"agent\" | \"skill\" | \"persist\">,\n target: string,\n): StageResult {\n return stageSuccess(stage, target, \"skipped\", \"用户取消了操作,未修改本机状态。\");\n}\n\nasync function mutationConfirmed(\n input: Pick<EnterpriseMcpMutationInput, \"dryRun\" | \"yes\" | \"confirm\">,\n message: string,\n): Promise<boolean> {\n return input.dryRun || input.yes || input.confirm(message);\n}\n\nfunction lifecycleAgentStage(\n target: AgentId,\n cause: unknown,\n message: string,\n): StageResult {\n return stageFailure(\"agent\", target, cause, message);\n}\n\nfunction skillConflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请先检查该 Agent 的 sag-mcp Skill,再重试。\",\n });\n}\n\nexport async function attachEnterpriseMcpConnection(\n input: EnterpriseMcpMutationInput & {\n agent: AgentId;\n timeoutMs: number;\n noSkill: boolean;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (connection.toolSnapshot.count === 0) {\n throw new CliError(\"MCP_FAILED\", \"该企业 MCP 没有可用工具,不能接入 Agent。\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查平台权限或服务状态,确认 tools/list 返回工具后再重试。\",\n });\n }\n const spec = await resolveEnterpriseMcpSpec(connection, input.runtime.credentials);\n if (\n !(await mutationConfirmed(\n input,\n `将企业 MCP ${connection.id} 接入 ${input.agent}?`,\n ))\n ) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"agent\", input.agent)],\n nextActions: [],\n };\n }\n const stage = await attachEnterpriseMcp(input.runtime.agents, {\n connection,\n spec,\n agent: input.agent,\n yes: true,\n timeoutMs: input.timeoutMs,\n dryRun: input.dryRun,\n });\n const skillStage = input.noSkill\n ? stageSuccess(\"skill\", input.agent, \"skipped\", \"已按 --no-skill 跳过 Skill 安装。\")\n : input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n \"created\",\n \"已生成 Skill 安装计划,未写入文件或备份。\",\n )\n : await installEnterpriseSkill({ ...input.runtime.skill, agent: input.agent });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages: [translatedAgentStage(stage), skillStage],\n nextActions: [\n ...(skillStage.ok ? [] : [`sag mcp skill install --agent ${input.agent}`]),\n `sag mcp status --server ${connection.id}`,\n ],\n };\n}\n\nexport async function detachEnterpriseMcpConnection(\n input: EnterpriseMcpMutationInput & { agent: AgentId },\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (\n !(await mutationConfirmed(\n input,\n `从 ${input.agent} 移除企业 MCP ${connection.id}?`,\n ))\n ) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"agent\", input.agent)],\n nextActions: [],\n };\n }\n const stage = await detachEnterpriseMcp(input.runtime.agents, {\n connection,\n agent: input.agent,\n yes: true,\n dryRun: input.dryRun,\n });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages: [\n {\n ...stage,\n message: input.dryRun\n ? \"已检查受管 Agent 配置,将只移除指纹匹配的 MCP 项。\"\n : \"已从 Agent 移除受管企业 MCP 配置。\",\n },\n ],\n nextActions: [`sag mcp status --server ${connection.id}`],\n };\n}\n\nexport async function disconnectEnterpriseMcp(\n input: EnterpriseMcpMutationInput,\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (!(await mutationConfirmed(input, `断开并删除企业 MCP ${connection.id}?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"persist\", connection.id)],\n nextActions: [],\n };\n }\n\n const stages: StageResult[] = [];\n for (const agent of supportedAgents) {\n const managed = await input.runtime.agents.managed.getAgent(\n connectionKey(agent, \"user\", connection.id),\n );\n if (!managed) continue;\n try {\n await inspectEnterpriseAgent(input.runtime.agents, {\n connection,\n agent,\n });\n } catch (cause) {\n stages.push(\n lifecycleAgentStage(\n agent,\n cause,\n \"无法检查 Agent 中的受管 MCP;连接和凭据保持不变。\",\n ),\n );\n continue;\n }\n try {\n const detached = await detachEnterpriseMcp(input.runtime.agents, {\n connection,\n agent,\n yes: true,\n dryRun: input.dryRun,\n });\n stages.push({\n ...detached,\n message: input.dryRun\n ? \"已检查受管 Agent 配置,将移除指纹匹配的 MCP 项。\"\n : \"已从 Agent 移除受管企业 MCP 配置。\",\n });\n } catch (cause) {\n stages.push(\n lifecycleAgentStage(agent, cause, \"Agent MCP 移除失败;连接和凭据保持不变。\"),\n );\n }\n }\n\n if (stages.some((stage) => !stage.ok)) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages,\n nextActions: [`sag mcp status --server ${connection.id}`],\n };\n }\n\n if (input.dryRun) {\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n \"updated\",\n \"将先删除凭据,再删除连接记录;不会卸载共享 Skill。\",\n ),\n );\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: true,\n connection: publicConnection(connection),\n stages,\n nextActions: [\"sag mcp list\"],\n };\n }\n\n const credentialStore = input.runtime.credentials[connection.credentialStore];\n const previousState = await input.runtime.store.load();\n const previousCredential = await credentialStore.get(connection.credentialRef);\n const remaining = (await input.runtime.store.list())\n .filter((candidate) => candidate.id !== connection.id)\n .sort((left, right) => {\n const byUpdated = right.updatedAt.localeCompare(left.updatedAt);\n return byUpdated || left.id.localeCompare(right.id);\n });\n try {\n await credentialStore.delete(connection.credentialRef);\n await input.runtime.store.remove(connection.id);\n const next = remaining[0];\n if (next) await input.runtime.store.use(next.id);\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n \"updated\",\n \"凭据和连接记录已删除;共享 Skill 保持安装。\",\n ),\n );\n } catch (cause) {\n try {\n await restoreAndVerifyPersistence({\n credentials: credentialStore,\n store: input.runtime.store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure: cause,\n restoreConnection: true,\n });\n } catch (recoveryFailure) {\n throw new CliError(\n \"INTERNAL_ERROR\",\n \"企业 MCP 删除失败,且连接、凭据或当前选择的恢复无法确认。\",\n {\n exitCode: exitCodes.internalError,\n cause: recoveryFailure,\n hint: \"请运行 `sag mcp list` 检查当前状态,并手动核对凭据存储。\",\n },\n );\n }\n stages.push(\n stageFailure(\n \"persist\",\n connection.id,\n cause,\n \"连接删除失败;连接、凭据和当前选择已恢复并验证。\",\n ),\n );\n }\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages,\n nextActions: stages.every((stage) => stage.ok)\n ? [\"sag mcp list\"]\n : [`sag mcp status --server ${connection.id}`],\n };\n}\n\nfunction mcpState(input: {\n connected: boolean;\n managed: boolean;\n drifted: boolean;\n}): EnterpriseMcpAgentStatus[\"mcp\"] {\n if (input.drifted) return \"drifted\";\n return input.connected && input.managed ? \"connected\" : \"disconnected\";\n}\n\nfunction skillState(input: {\n installed: boolean;\n managed: boolean;\n drifted: boolean;\n}): EnterpriseMcpAgentStatus[\"skill\"] {\n if (input.drifted) return \"drifted\";\n if (!input.installed) return \"missing\";\n return input.managed ? \"valid\" : \"unmanaged\";\n}\n\nexport async function inspectEnterpriseMcpStatus(input: {\n runtime: EnterpriseMcpConnectRuntime;\n server?: string;\n timeoutMs: number;\n}): Promise<EnterpriseMcpStatusReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n const active = await input.runtime.store.active();\n let health: EnterpriseMcpStatusReport[\"health\"];\n let toolCount = connection.toolSnapshot.count;\n let risk = connection.toolSnapshot.risk;\n let resolvedSpec: HttpMcpConnectionSpec | undefined;\n try {\n resolvedSpec = await resolveEnterpriseMcpSpec(\n connection,\n input.runtime.credentials,\n );\n const verified = await input.runtime.verifier.verify(resolvedSpec, {\n timeoutMs: input.timeoutMs,\n });\n if (verified.transport !== \"streamable-http\") {\n throw new Error(\"unexpected enterprise MCP transport\");\n }\n const verifiedTools = [...verified.tools];\n toolCount = verifiedTools.length;\n risk = classifyTools(verifiedTools);\n health = \"ready\";\n } catch {\n health = \"unavailable\";\n }\n\n const agents = await Promise.all(\n supportedAgents.map(async (agent): Promise<EnterpriseMcpAgentStatus> => {\n const [mcpInspection, skillInspection] = await Promise.allSettled([\n inspectEnterpriseAgent(input.runtime.agents, {\n connection,\n agent,\n ...(resolvedSpec === undefined ? {} : { spec: resolvedSpec }),\n }),\n inspectEnterpriseSkill({ ...input.runtime.skill, agent }),\n ]);\n const mcp =\n mcpInspection.status === \"fulfilled\"\n ? mcpState(mcpInspection.value)\n : \"unavailable\";\n const skill =\n skillInspection.status === \"fulfilled\"\n ? skillState(skillInspection.value)\n : \"unavailable\";\n const nextActions: string[] = [];\n if (mcp === \"disconnected\") {\n nextActions.push(`sag mcp attach ${agent} --server ${connection.id}`);\n } else if (mcp === \"drifted\") {\n nextActions.push(`检查 ${agent} 中名为 ${connection.id} 的 MCP 配置`);\n } else if (mcp === \"unavailable\") {\n nextActions.push(`检查 ${agent} 的 MCP 配置是否可读`);\n }\n if (skill !== \"valid\" && skill !== \"unavailable\") {\n nextActions.push(`sag mcp skill install --agent ${agent}`);\n } else if (skill === \"unavailable\") {\n nextActions.push(`检查 ${agent} 的 Skill 目录是否可读`);\n }\n return { agent, mcp, skill, nextActions };\n }),\n );\n const nextActions = agents.flatMap((agent) => agent.nextActions);\n if (health !== \"ready\") {\n nextActions.unshift(`检查企业 MCP ${connection.id} 的网络和凭据`);\n }\n return {\n kind: \"enterprise-mcp-status\",\n connection: {\n id: connection.id,\n active: active?.id === connection.id,\n endpoint: connection.url,\n },\n health,\n toolCount,\n risk,\n agents,\n nextActions,\n };\n}\n\nexport async function installEnterpriseMcpSkill(\n input: Pick<EnterpriseMcpMutationInput, \"runtime\" | \"yes\" | \"dryRun\" | \"confirm\"> & {\n agent: AgentId;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n });\n if (!(await mutationConfirmed(input, `为 ${input.agent} 安装企业 SAG MCP Skill?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n stages: [cancelledStage(\"skill\", input.agent)],\n nextActions: [],\n };\n }\n const stage = input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n inspection.installed ? \"updated\" : \"created\",\n \"已检查现有 Skill,将安装并保留被替换版本的备份。\",\n )\n : await installEnterpriseSkill({ ...input.runtime.skill, agent: input.agent });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n stages: [stage],\n nextActions: [`sag mcp skill status --agent ${input.agent}`],\n };\n}\n\nexport async function inspectEnterpriseMcpSkillStatus(input: {\n runtime: EnterpriseMcpConnectRuntime;\n agents: readonly AgentId[];\n}): Promise<\n Array<{\n agent: AgentId;\n status: EnterpriseMcpAgentStatus[\"skill\"];\n nextAction: string;\n }>\n> {\n return Promise.all(\n input.agents.map(async (agent) => {\n try {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent,\n });\n const status = skillState(inspection);\n return {\n agent,\n status,\n nextAction:\n status === \"valid\"\n ? `sag mcp status`\n : `sag mcp skill install --agent ${agent}`,\n };\n } catch {\n return {\n agent,\n status: \"unavailable\" as const,\n nextAction: `检查 ${agent} 的 Skill 目录是否可读`,\n };\n }\n }),\n );\n}\n\nexport async function uninstallEnterpriseMcpSkill(\n input: Pick<EnterpriseMcpMutationInput, \"runtime\" | \"yes\" | \"dryRun\" | \"confirm\"> & {\n agent: AgentId;\n force: boolean;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n });\n if (\n !input.force &&\n (!inspection.installed || !inspection.managed || inspection.drifted)\n ) {\n throw skillConflict(\"受管 SAG MCP Skill 已被修改或不完整,普通卸载已停止。\");\n }\n if (input.force && !inspection.installed) {\n throw skillConflict(\"找不到可卸载的 SAG MCP Skill。\");\n }\n if (!(await mutationConfirmed(input, `从 ${input.agent} 卸载企业 SAG MCP Skill?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n stages: [cancelledStage(\"skill\", input.agent)],\n nextActions: [],\n };\n }\n const stage = input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n \"updated\",\n input.force\n ? \"已检查 Skill;强制卸载前会先创建备份。\"\n : \"已核对受管 Skill 指纹,将安全卸载。\",\n )\n : await uninstallEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n force: input.force,\n });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n stages: [stage],\n nextActions: [`sag mcp skill status --agent ${input.agent}`],\n };\n}\n","import { CliError, exitCodes } from \"../../core/errors.js\";\nimport {\n connectionKey,\n fingerprintConnection,\n type AgentAdapter,\n type AgentConnection,\n type AgentId,\n} from \"../../agents/adapter.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport type { AgentMcpVerifier } from \"../../agents/orchestrator.js\";\nimport type { EnterpriseMcpAgentManagedState } from \"./managed-state.js\";\nimport type { EnterpriseMcpConnection, StageResult } from \"./model.js\";\n\nexport type EnterpriseAgentAction =\n \"create\" | \"unchanged\" | \"update-managed\" | \"takeover-unmanaged\" | \"blocked-drift\";\n\ninterface EnterpriseManagedAgentStore {\n getAgent(id: string): Promise<EnterpriseMcpAgentManagedState | null>;\n setAgent(agent: EnterpriseMcpAgentManagedState): Promise<unknown>;\n deleteAgent(id: string): Promise<unknown>;\n listAgents(): Promise<EnterpriseMcpAgentManagedState[]>;\n}\n\nexport interface EnterpriseMcpAgentRuntime {\n adapters: Record<AgentId, AgentAdapter>;\n managed: EnterpriseManagedAgentStore;\n verifier: AgentMcpVerifier;\n confirm(message: string): Promise<boolean>;\n now(): Date;\n}\n\nexport interface AttachEnterpriseMcpInput {\n connection: EnterpriseMcpConnection;\n spec: HttpMcpConnectionSpec;\n agent: AgentId;\n yes: boolean;\n timeoutMs: number;\n dryRun?: boolean;\n installSkill?: boolean;\n}\n\nexport interface DetachEnterpriseMcpInput {\n connection: EnterpriseMcpConnection;\n agent: AgentId;\n yes: boolean;\n dryRun?: boolean;\n}\n\nexport interface InspectEnterpriseAgentInput {\n connection: EnterpriseMcpConnection;\n agent: AgentId;\n spec?: HttpMcpConnectionSpec;\n}\n\nexport interface EnterpriseAgentInspection {\n agent: AgentId;\n connectionId: string;\n managed: boolean;\n drifted: boolean;\n connected: boolean;\n}\n\nfunction stateId(agent: AgentId, connectionId: string): string {\n return connectionKey(agent, \"user\", connectionId);\n}\n\nfunction configurationConflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请检查该 Agent 的同名 MCP 配置后重试。\",\n });\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"请检查并修正该 Agent 的同名 MCP 配置后重试。\",\n });\n}\n\nfunction ensureSupported(adapter: AgentAdapter, spec: HttpMcpConnectionSpec): void {\n if (!adapter.capabilities.scopes.includes(\"user\")) {\n throw new CliError(\"INVALID_ARGUMENT\", \"该 Agent 不支持用户级 MCP 配置\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!adapter.capabilities.transports.includes(spec.transport)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"该 Agent 不支持 HTTP MCP 连接\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n}\n\nfunction determineAction(input: {\n host: AgentConnection | null;\n managed: EnterpriseMcpAgentManagedState | null;\n desired: HttpMcpConnectionSpec;\n connectionId: string;\n}): EnterpriseAgentAction {\n const { connectionId, desired, host, managed } = input;\n if (!managed && !host) return \"create\";\n if (!managed && host) return \"takeover-unmanaged\";\n if (!managed) return \"create\";\n if (\n managed.connectionId !== connectionId ||\n !host ||\n host.fingerprint !== managed.fingerprint\n ) {\n return \"blocked-drift\";\n }\n return fingerprintConnection(host.spec) === fingerprintConnection(desired)\n ? \"unchanged\"\n : \"update-managed\";\n}\n\nfunction success(\n target: AgentId,\n status: Extract<StageResult[\"status\"], \"created\" | \"updated\" | \"skipped\">,\n message: string,\n): StageResult {\n return { stage: \"agent\", target, ok: true, status, message };\n}\n\nfunction failed(target: string, cause: unknown): StageResult {\n return {\n stage: \"agent\",\n target,\n ok: false,\n status: \"failed\",\n ...(cause instanceof CliError\n ? { code: cause.code }\n : { code: \"HOST_CONFIG_FAILED\" }),\n message: \"企业 MCP 在 Agent 中刷新失败,请检查同名配置后重试。\",\n };\n}\n\nasync function restoreHost(\n adapter: AgentAdapter,\n name: string,\n backup: AgentConnection | null,\n): Promise<void> {\n try {\n await adapter.remove(name, \"user\");\n if (backup) await adapter.add(name, \"user\", backup.spec);\n } catch {\n throw hostFailure(\n \"企业 MCP 更新失败且无法恢复原有 Agent 配置,请检查同名配置后重试。\",\n );\n }\n}\n\nfunction managedRecord(input: {\n agent: AgentId;\n connectionId: string;\n fingerprint: string;\n now: Date;\n}): EnterpriseMcpAgentManagedState {\n return {\n id: stateId(input.agent, input.connectionId),\n connectionId: input.connectionId,\n fingerprint: input.fingerprint,\n updatedAt: input.now.toISOString(),\n };\n}\n\nexport async function attachEnterpriseMcp(\n runtime: EnterpriseMcpAgentRuntime,\n input: AttachEnterpriseMcpInput,\n): Promise<StageResult> {\n const adapter = runtime.adapters[input.agent];\n ensureSupported(adapter, input.spec);\n await adapter.detect();\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n const action = determineAction({\n host,\n managed,\n desired: input.spec,\n connectionId: input.connection.id,\n });\n\n if (action === \"blocked-drift\") {\n throw configurationConflict(\"受管 Agent MCP 配置已在 SAG CLI 之外被修改\");\n }\n if (action === \"unchanged\") {\n return success(input.agent, \"skipped\", \"Agent 中的企业 MCP 配置已经是最新状态。\");\n }\n if (input.dryRun) {\n return success(\n input.agent,\n action === \"create\" ? \"created\" : \"updated\",\n \"已生成企业 MCP 接入计划,未写入 Agent 配置。\",\n );\n }\n if (\n action === \"takeover-unmanaged\" &&\n !input.yes &&\n !(await runtime.confirm(\n `是否替换 ${input.agent} 中现有的 ${input.connection.id} MCP?`,\n ))\n ) {\n return success(input.agent, \"skipped\", \"已取消接管 Agent 中的企业 MCP 配置。\");\n }\n\n try {\n if (host) await adapter.remove(input.connection.id, \"user\");\n await adapter.add(input.connection.id, \"user\", input.spec);\n const readBack = await adapter.read(input.connection.id, \"user\");\n if (\n !readBack ||\n fingerprintConnection(readBack.spec) !== fingerprintConnection(input.spec)\n ) {\n throw configurationConflict(\"Agent MCP 回读结果与请求的连接不一致\");\n }\n await runtime.verifier.verify(readBack.spec, { timeoutMs: input.timeoutMs });\n await runtime.managed.setAgent(\n managedRecord({\n agent: input.agent,\n connectionId: input.connection.id,\n fingerprint: readBack.fingerprint,\n now: runtime.now(),\n }),\n );\n } catch {\n await restoreHost(adapter, input.connection.id, host);\n throw hostFailure(\"企业 MCP 更新失败,已恢复 Agent 中原有的配置。\");\n }\n\n return success(\n input.agent,\n action === \"create\" ? \"created\" : \"updated\",\n \"企业 MCP 已接入 Agent 并通过验证。\",\n );\n}\n\nexport async function inspectEnterpriseAgent(\n runtime: EnterpriseMcpAgentRuntime,\n input: InspectEnterpriseAgentInput,\n): Promise<EnterpriseAgentInspection> {\n const adapter = runtime.adapters[input.agent];\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n return {\n agent: input.agent,\n connectionId: input.connection.id,\n managed: Boolean(managed),\n connected: Boolean(host),\n drifted: Boolean(\n managed &&\n (managed.connectionId !== input.connection.id ||\n !host ||\n host.fingerprint !== managed.fingerprint ||\n (input.spec !== undefined &&\n fingerprintConnection(host.spec) !== fingerprintConnection(input.spec))),\n ),\n };\n}\n\nexport async function detachEnterpriseMcp(\n runtime: EnterpriseMcpAgentRuntime,\n input: DetachEnterpriseMcpInput,\n): Promise<StageResult> {\n const adapter = runtime.adapters[input.agent];\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n if (!managed || managed.connectionId !== input.connection.id || !host) {\n throw configurationConflict(\"该 Agent MCP 配置不受当前企业连接管理\");\n }\n if (host.fingerprint !== managed.fingerprint) {\n throw configurationConflict(\"受管 Agent MCP 配置已在 SAG CLI 之外被修改\");\n }\n if (input.dryRun) {\n return success(\n input.agent,\n \"updated\",\n \"已生成企业 MCP 移除计划,未修改 Agent 配置。\",\n );\n }\n if (\n !input.yes &&\n !(await runtime.confirm(`是否从 ${input.agent} 移除 ${input.connection.id}?`))\n ) {\n return success(input.agent, \"skipped\", \"已取消移除 Agent 中的企业 MCP 配置。\");\n }\n\n try {\n await adapter.remove(input.connection.id, \"user\");\n await runtime.managed.deleteAgent(id);\n } catch {\n try {\n await adapter.add(input.connection.id, \"user\", host.spec);\n } catch {\n throw hostFailure(\"企业 MCP 移除失败,且无法恢复 Agent 中原有的配置。\");\n }\n throw hostFailure(\"企业 MCP 移除失败,已恢复 Agent 中原有的配置。\");\n }\n return success(input.agent, \"updated\", \"已从 Agent 移除企业 MCP 配置。\");\n}\n\nfunction agentForState(\n state: EnterpriseMcpAgentManagedState,\n connectionId: string,\n): AgentId | null {\n return (\n ([\"codex\", \"claude-code\", \"workbuddy\"] as const).find(\n (agent) => state.id === stateId(agent, connectionId),\n ) ?? null\n );\n}\n\nexport async function refreshManagedAgents(\n runtime: EnterpriseMcpAgentRuntime,\n input: Omit<AttachEnterpriseMcpInput, \"agent\" | \"yes\">,\n): Promise<StageResult[]> {\n const managed = await runtime.managed.listAgents();\n const matching = managed.filter(\n (state) => state.connectionId === input.connection.id,\n );\n return Promise.all(\n matching.map(async (state) => {\n const agent = agentForState(state, input.connection.id);\n if (!agent) return failed(state.id, configurationConflict(\"受管 Agent 状态无效\"));\n try {\n return await attachEnterpriseMcp(runtime, { ...input, agent, yes: true });\n } catch (cause) {\n return failed(agent, cause);\n }\n }),\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { cp, lstat, mkdir, readFile, readdir, rename, rm } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\n\nimport type { AgentId } from \"../../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { StageResult } from \"./model.js\";\n\nconst skillName = \"sag-mcp\";\nconst skillDescription =\n \"Use connected enterprise SAG MCP servers to search, read, and manage authorized knowledge.\";\nconst requiredReferences = [\n \"references/cli-reference.md\",\n \"references/tool-safety.md\",\n] as const;\n\nexport interface SkillPathOptions {\n home: string;\n CODEX_HOME?: string | undefined;\n}\n\nexport interface EnterpriseMcpSkillManagedState {\n id: string;\n fingerprint: string;\n backupPath: string;\n updatedAt: string;\n}\n\nexport interface EnterpriseMcpSkillManagedStateStore {\n getSkill(id: string): Promise<EnterpriseMcpSkillManagedState | null>;\n setSkill(skill: EnterpriseMcpSkillManagedState): Promise<unknown>;\n deleteSkill(id: string): Promise<unknown>;\n}\n\nexport interface EnterpriseMcpSkillRuntime {\n home: string;\n environment: { CODEX_HOME?: string | undefined };\n managed: EnterpriseMcpSkillManagedStateStore;\n now: () => Date;\n bundlePath?: string | undefined;\n}\n\nexport interface EnterpriseMcpSkillInput extends EnterpriseMcpSkillRuntime {\n agent: AgentId;\n}\n\nexport interface UninstallEnterpriseSkillInput extends EnterpriseMcpSkillInput {\n force: boolean;\n}\n\nexport interface EnterpriseMcpSkillInspection {\n agent: AgentId;\n target: string;\n managed: boolean;\n installed: boolean;\n drifted: boolean;\n}\n\nexport function skillTarget(agent: AgentId, options: SkillPathOptions): string {\n switch (agent) {\n case \"codex\":\n return path.join(\n options.CODEX_HOME || path.join(options.home, \".codex\"),\n \"skills\",\n skillName,\n );\n case \"claude-code\":\n return path.join(options.home, \".claude\", \"skills\", skillName);\n case \"workbuddy\":\n return path.join(options.home, \".workbuddy\", \"skills\", skillName);\n }\n}\n\nfunction managedSkillId(agent: AgentId): string {\n return `${agent}:${skillName}`;\n}\n\nfunction bundledSkillPath(): string {\n const moduleDirectory = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot =\n path.basename(moduleDirectory) === \"dist\"\n ? path.dirname(moduleDirectory)\n : path.resolve(moduleDirectory, \"../../..\");\n return path.join(packageRoot, \"skills\", skillName);\n}\n\nfunction timestamp(now: Date): string {\n return now.toISOString().replace(/[-:.]/gu, \"\");\n}\n\nfunction siblingPath(\n target: string,\n prefix: \"tmp\" | \"backup\" | \"remove\",\n now: Date,\n): string {\n return path.join(\n path.dirname(target),\n `${path.basename(target)}.${prefix}-${timestamp(now)}-${process.pid}`,\n );\n}\n\nasync function exists(target: string): Promise<boolean> {\n try {\n await lstat(target);\n return true;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw cause;\n }\n}\n\nasync function validateSkillBundle(bundlePath: string): Promise<void> {\n const skill = await readFile(path.join(bundlePath, \"SKILL.md\"), \"utf8\");\n const lines = skill.split(/\\r?\\n/u);\n const lineCount = skill.endsWith(\"\\n\") ? lines.length - 1 : lines.length;\n if (\n lineCount >= 100 ||\n lines[0] !== \"---\" ||\n lines[1] !== `name: ${skillName}` ||\n lines[2] !== `description: ${skillDescription}` ||\n lines[3] !== \"---\"\n ) {\n throw new Error(\"随包发布的 SAG MCP Skill frontmatter 无效。\");\n }\n for (const reference of requiredReferences) {\n await readFile(path.join(bundlePath, reference), \"utf8\");\n if (!skill.includes(`(${reference})`)) {\n throw new Error(`随包发布的 SAG MCP Skill 未引用 ${reference}。`);\n }\n }\n}\n\nasync function updateDirectoryFingerprint(\n hash: ReturnType<typeof createHash>,\n root: string,\n relative = \"\",\n): Promise<void> {\n const current = path.join(root, relative);\n const entries = await readdir(current, { withFileTypes: true });\n for (const entry of entries.sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const entryRelative = path.join(relative, entry.name);\n if (entry.isDirectory()) {\n hash.update(`directory:${entryRelative}\\n`);\n await updateDirectoryFingerprint(hash, root, entryRelative);\n continue;\n }\n if (!entry.isFile()) {\n throw new Error(\"SAG MCP Skill 包含不支持的文件。\");\n }\n hash.update(`file:${entryRelative}\\n`);\n hash.update(await readFile(path.join(root, entryRelative)));\n }\n}\n\nasync function fingerprintSkillBundle(bundlePath: string): Promise<string> {\n await validateSkillBundle(bundlePath);\n const hash = createHash(\"sha256\");\n await updateDirectoryFingerprint(hash, bundlePath);\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction success(\n target: AgentId,\n status: Extract<StageResult[\"status\"], \"created\" | \"updated\">,\n): StageResult {\n return {\n stage: \"skill\",\n target,\n ok: true,\n status,\n message: \"企业 SAG MCP Skill 已安装。\",\n };\n}\n\nfunction failed(target: AgentId): StageResult {\n return {\n stage: \"skill\",\n target,\n ok: false,\n status: \"failed\",\n code: \"INTERNAL_ERROR\",\n message: \"企业 SAG MCP Skill 安装失败,已恢复原有 Skill。\",\n };\n}\n\nfunction conflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请检查 SAG MCP Skill 后重试。\",\n });\n}\n\nasync function restoreTarget(input: {\n target: string;\n hadTarget: boolean;\n targetMutated: boolean;\n backupPath: string | null;\n temporaryPath: string;\n}): Promise<void> {\n await rm(input.temporaryPath, { recursive: true, force: true }).catch(\n () => undefined,\n );\n if (!input.targetMutated) return;\n if (input.hadTarget && input.backupPath && (await exists(input.backupPath))) {\n await rm(input.target, { recursive: true, force: true });\n await rename(input.backupPath, input.target);\n return;\n }\n if (!input.hadTarget) {\n await rm(input.target, { recursive: true, force: true });\n }\n}\n\nexport async function installEnterpriseSkill(\n input: EnterpriseMcpSkillInput,\n): Promise<StageResult> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const bundlePath = input.bundlePath ?? bundledSkillPath();\n const temporaryPath = siblingPath(target, \"tmp\", input.now());\n let backupPath: string | null = null;\n let hadTarget = false;\n let targetMutated = false;\n\n try {\n hadTarget = await exists(target);\n await validateSkillBundle(bundlePath);\n await mkdir(path.dirname(target), { recursive: true });\n await cp(bundlePath, temporaryPath, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await validateSkillBundle(temporaryPath);\n if (hadTarget) {\n backupPath = siblingPath(target, \"backup\", input.now());\n await rename(target, backupPath);\n targetMutated = true;\n }\n await rename(temporaryPath, target);\n targetMutated = true;\n const fingerprint = await fingerprintSkillBundle(target);\n await input.managed.setSkill({\n id: managedSkillId(input.agent),\n fingerprint,\n backupPath: backupPath ?? siblingPath(target, \"backup\", input.now()),\n updatedAt: input.now().toISOString(),\n });\n return success(input.agent, hadTarget ? \"updated\" : \"created\");\n } catch {\n await restoreTarget({\n target,\n hadTarget,\n targetMutated,\n backupPath,\n temporaryPath,\n }).catch(() => undefined);\n return failed(input.agent);\n }\n}\n\nexport async function inspectEnterpriseSkill(\n input: EnterpriseMcpSkillInput,\n): Promise<EnterpriseMcpSkillInspection> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const [managed, installed] = await Promise.all([\n input.managed.getSkill(managedSkillId(input.agent)),\n exists(target),\n ]);\n let fingerprint: string | null = null;\n if (installed) {\n fingerprint = await fingerprintSkillBundle(target).catch(() => null);\n }\n return {\n agent: input.agent,\n target,\n managed: Boolean(managed),\n installed,\n drifted: Boolean(managed && (!fingerprint || managed.fingerprint !== fingerprint)),\n };\n}\n\nexport async function uninstallEnterpriseSkill(\n input: UninstallEnterpriseSkillInput,\n): Promise<StageResult> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const state = await input.managed.getSkill(managedSkillId(input.agent));\n const installed = await exists(target);\n const fingerprint = installed\n ? await fingerprintSkillBundle(target).catch(() => null)\n : null;\n\n if (!input.force) {\n if (!state || !fingerprint || state.fingerprint !== fingerprint) {\n throw conflict(\"受 SAG CLI 管理的 SAG MCP Skill 已被外部修改。\");\n }\n const removedPath = siblingPath(target, \"remove\", input.now());\n await rename(target, removedPath);\n try {\n await input.managed.deleteSkill(state.id);\n } catch (cause) {\n await rename(removedPath, target);\n throw cause;\n }\n await rm(removedPath, { recursive: true, force: true }).catch(() => undefined);\n return {\n stage: \"skill\",\n target: input.agent,\n ok: true,\n status: \"updated\",\n message: \"企业 SAG MCP Skill 已移除。\",\n };\n }\n\n if (!installed) {\n throw conflict(\"没有可移除的 SAG MCP Skill。\");\n }\n const backupPath = siblingPath(target, \"backup\", input.now());\n await rename(target, backupPath);\n try {\n await input.managed.deleteSkill(managedSkillId(input.agent));\n } catch (cause) {\n await rename(backupPath, target).catch(() => undefined);\n throw cause;\n }\n return {\n stage: \"skill\",\n target: input.agent,\n ok: true,\n status: \"updated\",\n message: \"企业 SAG MCP Skill 已备份后强制移除。\",\n };\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { AgentId } from \"../agents/adapter.js\";\nimport type { HttpMcpCommandOptions } from \"../mcp/commands.js\";\nimport { callHttpMcpTool, listHttpMcpTools } from \"../mcp/commands.js\";\nimport type { HttpMcpConnectionSpec } from \"../mcp/connection.js\";\nimport type { EnterpriseMcpCredentialStores } from \"../mcp/enterprise/credentials.js\";\nimport {\n type EnterpriseMcpConnection,\n type McpToolSummary,\n toMcpToolSummary,\n} from \"../mcp/enterprise/model.js\";\nimport { classifyTools } from \"../mcp/enterprise/risk.js\";\nimport { resolveEnterpriseMcpSpec } from \"../mcp/enterprise/runtime.js\";\nimport {\n attachEnterpriseMcpConnection,\n connectEnterpriseMcp,\n detachEnterpriseMcpConnection,\n disconnectEnterpriseMcp,\n inspectEnterpriseMcpSkillStatus,\n inspectEnterpriseMcpStatus,\n installEnterpriseMcpSkill,\n resolveEnterpriseMcpConnection,\n uninstallEnterpriseMcpSkill,\n type ConnectEnterpriseMcpInput,\n type EnterpriseConnectReport,\n type EnterpriseMcpConnectRuntime,\n type EnterpriseMcpLifecycleHttpClient,\n type EnterpriseMcpStagesReport,\n} from \"../mcp/enterprise/service.js\";\nimport type { EnterpriseMcpConnectionStore } from \"../mcp/enterprise/store.js\";\n\nexport type EnterpriseMcpHttpClient = EnterpriseMcpLifecycleHttpClient;\n\nconst httpClient: EnterpriseMcpHttpClient = {\n async listTools(spec, options) {\n const listed = await listHttpMcpTools(spec, options);\n return { tools: listed.tools.map(toMcpToolSummary) };\n },\n callTool: callHttpMcpTool,\n};\n\nexport interface EnterpriseMcpCommandRuntime {\n store: EnterpriseMcpConnectionStore;\n credentials: EnterpriseMcpCredentialStores;\n cliVersion: string;\n timeoutMs: number;\n client?: EnterpriseMcpHttpClient;\n}\n\nexport interface EnterpriseMcpConnectionSelection {\n server?: string;\n}\n\nexport type EnterpriseMcpLifecycleCommandRuntime = EnterpriseMcpConnectRuntime & {\n cliVersion: string;\n timeoutMs: number;\n};\n\nfunction connectionSummary(connection: EnterpriseMcpConnection, active?: boolean) {\n return {\n id: connection.id,\n endpoint: connection.url,\n toolCount: connection.toolSnapshot.count,\n risk: connection.toolSnapshot.risk,\n updatedAt: connection.updatedAt,\n ...(active === undefined ? {} : { active }),\n };\n}\n\nexport async function connectEnterpriseMcpCommand(\n input: ConnectEnterpriseMcpInput,\n): Promise<EnterpriseConnectReport> {\n return connectEnterpriseMcp(input);\n}\n\nasync function resolveConnectionRuntime(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{ connection: EnterpriseMcpConnection; spec: HttpMcpConnectionSpec }> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n return {\n connection,\n spec: await resolveEnterpriseMcpSpec(connection, runtime.credentials),\n };\n}\n\nfunction clientFor(runtime: EnterpriseMcpCommandRuntime): EnterpriseMcpHttpClient {\n return runtime.client ?? httpClient;\n}\n\nfunction commandOptions(runtime: EnterpriseMcpCommandRuntime): HttpMcpCommandOptions {\n return { cliVersion: runtime.cliVersion, timeoutMs: runtime.timeoutMs };\n}\n\nexport async function listConnections(runtime: EnterpriseMcpCommandRuntime): Promise<{\n activeId: string | null;\n connections: ReturnType<typeof connectionSummary>[];\n}> {\n const [state, connections] = await Promise.all([\n runtime.store.load(),\n runtime.store.list(),\n ]);\n return {\n activeId: state.activeId ?? null,\n connections: connections.map((connection) =>\n connectionSummary(connection, state.activeId === connection.id),\n ),\n };\n}\n\nexport async function useConnection(\n runtime: EnterpriseMcpCommandRuntime,\n input: { server: string; dryRun: boolean },\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n dryRun: boolean;\n plannedActiveId: string;\n}> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n server: input.server,\n });\n if (!input.dryRun) await runtime.store.use(connection.id);\n const active = await runtime.store.active();\n return {\n connection: connectionSummary(connection, active?.id === connection.id),\n dryRun: input.dryRun,\n plannedActiveId: connection.id,\n };\n}\n\nexport async function statusConnection(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n active: boolean;\n}> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n const active = await runtime.store.active();\n const isActive = active?.id === connection.id;\n return { connection: connectionSummary(connection, isActive), active: isActive };\n}\n\nexport async function listConnectionTools(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n tools: McpToolSummary[];\n toolCount: number;\n risk: ReturnType<typeof classifyTools>;\n}> {\n const { connection, spec } = await resolveConnectionRuntime(runtime, input);\n const tools = [\n ...(await clientFor(runtime).listTools(spec, commandOptions(runtime))).tools,\n ];\n return {\n connection: connectionSummary(connection),\n tools,\n toolCount: tools.length,\n risk: classifyTools(tools),\n };\n}\n\nexport async function callConnectionTool(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n },\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n tool: string;\n result: unknown;\n}> {\n const { connection, spec } = await resolveConnectionRuntime(runtime, input);\n const tools = await clientFor(runtime).listTools(spec, commandOptions(runtime));\n const tool = tools.tools.find((candidate) => candidate.name === input.tool);\n if (!tool) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到 MCP 工具:${input.tool}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n if (tool.annotations?.readOnlyHint !== true && !input.yes) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `MCP 工具 ${input.tool} 可能会修改数据,需使用 --yes 确认`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"请检查工具参数,并使用 --yes 重新执行以确认。\",\n },\n );\n }\n const result = await clientFor(runtime).callTool({\n spec,\n tool: input.tool,\n arguments_: input.arguments_,\n yes: input.yes,\n ...commandOptions(runtime),\n });\n return { connection: connectionSummary(connection), ...result };\n}\n\nexport async function inspectConnectionStatus(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n) {\n return inspectEnterpriseMcpStatus({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n timeoutMs: runtime.timeoutMs,\n });\n}\n\nexport async function attachConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n noSkill: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return attachEnterpriseMcpConnection({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n agent: input.agent,\n yes: input.yes,\n dryRun: input.dryRun,\n noSkill: input.noSkill,\n confirm: input.confirm,\n timeoutMs: runtime.timeoutMs,\n });\n}\n\nexport async function detachConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return detachEnterpriseMcpConnection({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n agent: input.agent,\n yes: input.yes,\n dryRun: input.dryRun,\n confirm: input.confirm,\n });\n}\n\nexport async function disconnectConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return disconnectEnterpriseMcp({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n yes: input.yes,\n dryRun: input.dryRun,\n confirm: input.confirm,\n });\n}\n\nexport async function installSkill(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return installEnterpriseMcpSkill({ runtime, ...input });\n}\n\nexport async function skillStatus(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: { agents: readonly AgentId[] },\n) {\n return inspectEnterpriseMcpSkillStatus({ runtime, agents: input.agents });\n}\n\nexport async function uninstallSkill(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n force: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return uninstallEnterpriseMcpSkill({ runtime, ...input });\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","const SENSITIVE_KEYS = new Set([\n \"authorization\",\n \"authorization_code\",\n \"token\",\n \"access_token\",\n \"password\",\n \"secret\",\n \"secretkey\",\n \"secret_key\",\n \"ticket\",\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 { DoctorReport } from \"../diagnostics/doctor.js\";\nimport { redact } from \"./redaction.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 \"active\",\n \"id\",\n \"name\",\n \"filename\",\n \"status\",\n \"url\",\n \"endpoint\",\n \"toolCount\",\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\nconst enterpriseStageOrder = [\n \"parse\",\n \"verify\",\n \"persist\",\n \"agent\",\n \"skill\",\n \"reverify\",\n] as const;\n\nfunction renderEnterpriseMcpStages(value: Record<string, unknown>): string {\n const stages = Array.isArray(value.stages) ? value.stages.filter(isRecord) : [];\n const ordered = stages\n .map((stage, index) => ({ stage, index }))\n .sort((left, right) => {\n const leftOrder = enterpriseStageOrder.indexOf(\n left.stage.stage as (typeof enterpriseStageOrder)[number],\n );\n const rightOrder = enterpriseStageOrder.indexOf(\n right.stage.stage as (typeof enterpriseStageOrder)[number],\n );\n return (\n (leftOrder < 0 ? 99 : leftOrder) - (rightOrder < 0 ? 99 : rightOrder) ||\n left.index - right.index\n );\n })\n .map(({ stage }) => stage);\n const connection = isRecord(value.connection) ? value.connection : null;\n const nextActions = Array.isArray(value.nextActions)\n ? value.nextActions.map(String)\n : [];\n const lines = [\n value.dryRun ? \"企业 MCP 变更计划(未写入)\" : \"企业 MCP 操作结果\",\n ...(connection\n ? [\n `连接:${String(connection.id ?? \"unknown\")}`,\n `端点:${String(connection.endpoint ?? \"unknown\")}`,\n ]\n : []),\n ...ordered.map((stage) => {\n const marker = stage.ok ? (stage.status === \"skipped\" ? \"-\" : \"✓\") : \"✗\";\n return `${marker} ${String(stage.stage)} · ${String(stage.target)}:${String(stage.message ?? stage.status ?? \"\")}`;\n }),\n ...(nextActions.length\n ? [\"下一步:\", ...nextActions.map((action) => ` ${action}`)]\n : []),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderEnterpriseMcpStatus(value: Record<string, unknown>): string {\n const connection = isRecord(value.connection) ? value.connection : {};\n const risk = isRecord(value.risk) ? value.risk : {};\n const agents = Array.isArray(value.agents) ? value.agents.filter(isRecord) : [];\n const nextActions = Array.isArray(value.nextActions)\n ? value.nextActions.map(String)\n : [];\n const lines = [\n `连接:${String(connection.id ?? \"unknown\")}${connection.active ? \"(当前)\" : \"\"}`,\n `端点:${String(connection.endpoint ?? \"unknown\")}`,\n `健康:${String(value.health ?? \"unknown\")}`,\n `工具:${String(value.toolCount ?? 0)}`,\n `风险:只读 ${String(risk.readOnly ?? 0)},写入 ${String(risk.write ?? 0)},删除 ${String(risk.destructive ?? 0)},未知 ${String(risk.unknown ?? 0)}`,\n ...agents.map(\n (agent) =>\n `Agent ${String(agent.agent ?? \"unknown\")}:MCP ${String(agent.mcp ?? \"unknown\")},Skill ${String(agent.skill ?? \"unknown\")}`,\n ),\n ...(nextActions.length\n ? [\"下一步:\", ...nextActions.map((action) => ` ${action}`)]\n : []),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderOutline(value: Record<string, unknown>): string {\n const filename = typeof value.filename === \"string\" ? value.filename : \"Unknown\";\n const items = Array.isArray(value.outline) ? value.outline.filter(isRecord) : [];\n const lines = items.map(\n (item) =>\n `${String(item.rank ?? 0).padStart(3)}. ${item.heading || \"(untitled)\"} (chunk_id=${item.chunk_id})`,\n );\n return `${filename}\\n${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderGrep(value: Record<string, unknown>): string {\n const matches = Array.isArray(value.matches) ? value.matches.filter(isRecord) : [];\n const lines = matches.map(\n (match, index) => `[${index + 1}] ${match.heading || \"Match\"}\\n${match.snippet}`,\n );\n return lines.length ? `${lines.join(\"\\n\\n\")}\\n` : \"No matches.\\n\";\n}\n\nfunction renderRead(value: Record<string, unknown>): string {\n const filename = typeof value.filename === \"string\" ? value.filename : \"Unknown\";\n const total = typeof value.total_lines === \"number\" ? value.total_lines : 0;\n const offset = typeof value.offset === \"number\" ? value.offset : 1;\n const lines = Array.isArray(value.lines) ? value.lines.map(String) : [];\n const header = `${filename} · lines ${offset}-${offset + lines.length - 1} / ${total}`;\n return `${header}\\n${lines.join(\"\")}`;\n}\n\nfunction renderEntityContext(value: Record<string, unknown>): string {\n const name = typeof value.name === \"string\" ? value.name : \"Unknown\";\n const type = typeof value.type === \"string\" ? value.type : \"\";\n const source = typeof value.source_name === \"string\" ? value.source_name : \"\";\n const context = typeof value.context === \"string\" ? value.context : \"\";\n return `Entity: ${name}${type ? ` (${type})` : \"\"}\\nSource: ${source}\\n\\n${context}\\n`;\n}\n\nexport function renderHuman(value: unknown, quiet = false): string {\n value = redact(value);\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) && value.kind === \"enterprise-mcp-stages\") {\n return renderEnterpriseMcpStages(value);\n }\n if (isRecord(value) && value.kind === \"enterprise-mcp-status\") {\n return renderEnterpriseMcpStatus(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 (isRecord(value) && Array.isArray(value.outline) && \"filename\" in value) {\n return renderOutline(value);\n }\n if (isRecord(value) && Array.isArray(value.matches) && \"pattern\" in value) {\n return renderGrep(value);\n }\n if (isRecord(value) && Array.isArray(value.lines) && \"total_lines\" in value) {\n return renderRead(value);\n }\n if (isRecord(value) && \"entity_id\" in value && \"context\" in value) {\n return renderEntityContext(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","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","import { type SkillErrorCode } from \"../core/errors.js\";\nimport { redact } from \"./redaction.js\";\n\nexport interface SkillEvent {\n schema: \"sag.skill.ndjson.v1\";\n operation: \"install\" | \"auth\" | \"upload\" | \"search\" | \"document\";\n event: string;\n operation_id: string;\n timestamp: string;\n data?: Record<string, unknown>;\n error?: {\n code: SkillErrorCode;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n}\n\nconst terminalEvents = new Set([\n \"completed\",\n \"failed\",\n \"detached\",\n \"completed_with_errors\",\n]);\n\nexport class SkillEventWriter {\n private terminal = false;\n\n constructor(private readonly write: (value: string) => void) {}\n\n emit(event: SkillEvent): void {\n if (this.terminal) throw new Error(\"Cannot emit after terminal event\");\n if (terminalEvents.has(event.event)) {\n throw new Error(\"terminal event must be sent with complete\");\n }\n this.write(`${JSON.stringify(redact(event))}\\n`);\n }\n\n complete(event: SkillEvent): void {\n if (!terminalEvents.has(event.event)) {\n throw new Error(\"A terminal event is required\");\n }\n if (this.terminal) throw new Error(\"Cannot emit a second terminal event\");\n this.terminal = true;\n this.write(`${JSON.stringify(redact(event))}\\n`);\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n cp,\n lstat,\n mkdir,\n readFile,\n readdir,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\n\nimport type { AgentId } from \"../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { ManagedSkill, SkillStateStore } from \"./state-store.js\";\n\nconst skillName = \"sag-knowledge\";\nconst packageName = \"@zleap-ai/sag-cli\";\nconst agents: readonly AgentId[] = [\"codex\", \"claude-code\", \"workbuddy\"];\nconst requiredFiles = [\n \"SKILL.md\",\n \"references/cli-reference.md\",\n \"references/ndjson-contract.md\",\n \"references/safety.md\",\n \"scripts/sag-knowledge.cjs\",\n] as const;\n\nexport interface SkillTargetAgent {\n readonly id: AgentId;\n installed(): Promise<boolean>;\n installSkill?(): Promise<void>;\n}\n\nexport interface SkillInstallerFilesystem {\n rename(from: string, to: string): Promise<void>;\n remove(target: string): Promise<void>;\n}\n\nexport interface SkillInstallerRuntime {\n readonly home: string;\n readonly environment: { CODEX_HOME?: string | undefined };\n readonly bundlePath?: string | undefined;\n readonly filesystem?: Partial<SkillInstallerFilesystem> | undefined;\n resolveLatestBundle?:\n (() => Promise<{ bundlePath: string; cleanup(): Promise<void> }>) | undefined;\n state: Pick<\n SkillStateStore,\n \"getManagedSkill\" | \"saveManagedSkill\" | \"deleteManagedSkill\"\n >;\n readonly agents: Record<AgentId, SkillTargetAgent>;\n readonly now: () => Date;\n readonly confirm?: (message: string) => Promise<boolean>;\n}\n\nexport type SkillTargetStatus =\n | \"created\"\n | \"updated\"\n | \"skipped\"\n | \"failed\"\n | \"conflict\"\n | \"removed\"\n | \"missing\"\n | \"installed\"\n | \"unavailable\"\n | \"unmanaged\"\n | \"drifted\";\n\nexport interface SkillTargetReport {\n readonly agent: AgentId;\n readonly target: string;\n readonly status: SkillTargetStatus;\n readonly code?: \"INSTALL_TARGET_CONFLICT\";\n readonly version?: string;\n readonly package?: string;\n readonly message: string;\n}\n\nexport interface SkillTargetsReport {\n readonly package: string;\n readonly version: string;\n readonly targets: readonly SkillTargetReport[];\n readonly completedWithErrors: boolean;\n}\n\nexport interface SkillTargetSelection {\n readonly agents?: readonly AgentId[];\n readonly yes: boolean;\n readonly update?: boolean;\n}\n\ninterface SkillManifest {\n readonly schema: 1;\n readonly name: typeof skillName;\n readonly package: typeof packageName;\n readonly packageVersion: string;\n readonly agent: AgentId | \"template\";\n readonly bundleDigest: string;\n}\n\nfunction bundledSkillPath(): string {\n const directory = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot =\n path.basename(directory) === \"dist\"\n ? path.dirname(directory)\n : path.resolve(directory, \"../..\");\n return path.join(packageRoot, \"skill\");\n}\n\nfunction uniqueAgents(selected: readonly AgentId[] | undefined): readonly AgentId[] {\n return [...new Set(selected ?? agents)];\n}\n\nexport function skillTargetPath(\n agent: AgentId,\n input: Pick<SkillInstallerRuntime, \"home\" | \"environment\">,\n): string {\n const home = path.resolve(input.home);\n const codexHome = input.environment.CODEX_HOME\n ? path.resolve(input.environment.CODEX_HOME)\n : path.join(home, \".codex\");\n switch (agent) {\n case \"codex\":\n return path.join(codexHome, \"skills\", skillName);\n case \"claude-code\":\n return path.join(home, \".claude\", \"skills\", skillName);\n case \"workbuddy\":\n return path.join(home, \".workbuddy\", \"skills\", skillName);\n }\n}\n\nfunction sourceTargetError(): never {\n throw new Error(\"Skill target is outside the configured user-level Agent directory\");\n}\n\nfunction assertUserTarget(\n target: string,\n agent: AgentId,\n runtime: SkillInstallerRuntime,\n): void {\n const parent =\n agent === \"codex\"\n ? path.resolve(\n runtime.environment.CODEX_HOME ?? path.join(runtime.home, \".codex\"),\n \"skills\",\n )\n : path.resolve(\n runtime.home,\n agent === \"claude-code\" ? \".claude/skills\" : \".workbuddy/skills\",\n );\n if (path.dirname(target) !== parent || path.basename(target) !== skillName)\n sourceTargetError();\n}\n\nclass SkillTargetLeaseError extends Error {}\n\nasync function withTargetLease<T>(\n target: string,\n operation: () => Promise<T>,\n): Promise<T> {\n await mkdir(path.dirname(target), { recursive: true });\n let release: () => Promise<void>;\n try {\n release = await lock(path.join(path.dirname(target), `.${skillName}.lease`), {\n realpath: false,\n stale: 10_000,\n update: 2_000,\n retries: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new SkillTargetLeaseError();\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n}\n\nasync function exists(location: string): Promise<boolean> {\n try {\n await lstat(location);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function moveTarget(\n runtime: SkillInstallerRuntime,\n from: string,\n to: string,\n): Promise<void> {\n if (runtime.filesystem?.rename) return runtime.filesystem.rename(from, to);\n await rename(from, to);\n}\n\nasync function removeTarget(\n runtime: SkillInstallerRuntime,\n target: string,\n): Promise<void> {\n if (runtime.filesystem?.remove) return runtime.filesystem.remove(target);\n await rm(target, { recursive: true, force: true });\n}\n\nfunction sameManagedSkill(left: ManagedSkill | null, right: ManagedSkill): boolean {\n return (\n left?.agent === right.agent &&\n left.target === right.target &&\n left.fingerprint === right.fingerprint &&\n left.version === right.version &&\n left.backupPath === right.backupPath\n );\n}\n\ntype UninstallRecovery = \"restored\" | \"incomplete\" | \"active-unmanaged\";\n\nasync function deactivateUnmanagedTarget(input: {\n runtime: SkillInstallerRuntime;\n target: string;\n removed: string;\n}): Promise<Exclude<UninstallRecovery, \"restored\">> {\n try {\n await moveTarget(input.runtime, input.target, input.removed);\n } catch {\n return \"active-unmanaged\";\n }\n return (await exists(input.target)) ? \"active-unmanaged\" : \"incomplete\";\n}\n\nasync function recoverUninstall(input: {\n runtime: SkillInstallerRuntime;\n agent: AgentId;\n target: string;\n removed: string;\n managed: ManagedSkill;\n}): Promise<UninstallRecovery> {\n try {\n await moveTarget(input.runtime, input.removed, input.target);\n } catch {\n return \"incomplete\";\n }\n if (!(await exists(input.target))) return \"incomplete\";\n try {\n await validateBundle(input.target, input.agent);\n if ((await fingerprintDirectory(input.target)) !== input.managed.fingerprint) {\n return deactivateUnmanagedTarget(input);\n }\n } catch {\n return deactivateUnmanagedTarget(input);\n }\n try {\n const current = await input.runtime.state.getManagedSkill(\n input.agent,\n input.target,\n );\n if (sameManagedSkill(current, input.managed)) return \"restored\";\n await input.runtime.state.saveManagedSkill(input.managed);\n const restored = await input.runtime.state.getManagedSkill(\n input.agent,\n input.target,\n );\n if (sameManagedSkill(restored, input.managed)) return \"restored\";\n } catch {\n // Keep the state from pointing to an active target when persistence recovery fails.\n }\n return deactivateUnmanagedTarget(input);\n}\n\nfunction digest(value: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(value).digest(\"hex\")}`;\n}\n\nfunction parseManifest(raw: string): SkillManifest {\n const value: unknown = JSON.parse(raw);\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"invalid manifest\");\n const manifest = value as Record<string, unknown>;\n if (\n manifest.schema !== 1 ||\n manifest.name !== skillName ||\n manifest.package !== packageName ||\n typeof manifest.packageVersion !== \"string\" ||\n !manifest.packageVersion ||\n typeof manifest.bundleDigest !== \"string\" ||\n !/^sha256:[a-f0-9]{64}$/u.test(manifest.bundleDigest) ||\n (!agents.includes(manifest.agent as AgentId) && manifest.agent !== \"template\")\n ) {\n throw new Error(\"invalid manifest\");\n }\n return manifest as unknown as SkillManifest;\n}\n\nasync function validateBundle(\n bundle: string,\n expectedAgent: AgentId | \"template\",\n): Promise<SkillManifest> {\n const [rawManifest, runtime] = await Promise.all([\n readFile(path.join(bundle, \"manifest.json\"), \"utf8\"),\n readFile(path.join(bundle, \"scripts\", \"sag-knowledge.cjs\")),\n ]);\n const manifest = parseManifest(rawManifest);\n if (manifest.agent !== expectedAgent || manifest.bundleDigest !== digest(runtime)) {\n throw new Error(\"invalid Skill bundle\");\n }\n await Promise.all(requiredFiles.map((file) => readFile(path.join(bundle, file))));\n return manifest;\n}\n\nasync function fingerprintDirectory(root: string, relative = \"\"): Promise<string> {\n const hash = createHash(\"sha256\");\n async function visit(nested = \"\"): Promise<void> {\n const entries = await readdir(path.join(root, nested), { withFileTypes: true });\n for (const entry of entries.sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const entryPath = path.join(nested, entry.name);\n if (entry.isDirectory()) {\n hash.update(`directory:${entryPath}\\n`);\n await visit(entryPath);\n } else if (entry.isFile()) {\n hash.update(`file:${entryPath}\\n`);\n hash.update(await readFile(path.join(root, entryPath)));\n } else {\n throw new Error(\"unsupported Skill file\");\n }\n }\n }\n await visit(relative);\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction sibling(target: string, suffix: \"tmp\" | \"backup\" | \"remove\"): string {\n return path.join(path.dirname(target), `.${skillName}.${suffix}-${randomUUID()}`);\n}\n\nasync function restore(input: {\n readonly runtime: SkillInstallerRuntime;\n readonly target: string;\n readonly temporary: string;\n readonly backup?: string;\n readonly hadTarget: boolean;\n readonly replacementFingerprint?: string;\n}): Promise<boolean> {\n let recovered = true;\n try {\n await removeTarget(input.runtime, input.temporary);\n } catch {\n recovered = false;\n }\n const targetMatchesReplacement = async (): Promise<boolean> => {\n if (!input.replacementFingerprint || !(await exists(input.target))) return false;\n try {\n return (\n (await fingerprintDirectory(input.target)) === input.replacementFingerprint\n );\n } catch {\n return false;\n }\n };\n if (input.backup && (await exists(input.backup))) {\n if (await exists(input.target)) {\n if (!(await targetMatchesReplacement())) return false;\n try {\n await removeTarget(input.runtime, input.target);\n } catch {\n return false;\n }\n }\n try {\n await moveTarget(input.runtime, input.backup, input.target);\n } catch {\n return false;\n }\n } else if (!input.hadTarget && (await exists(input.target))) {\n if (!(await targetMatchesReplacement())) return false;\n try {\n await removeTarget(input.runtime, input.target);\n } catch {\n return false;\n }\n }\n return recovered;\n}\n\nasync function inspectOne(\n runtime: SkillInstallerRuntime,\n agent: AgentId,\n inspectExplicitTarget = false,\n): Promise<SkillTargetReport> {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n if (!inspectExplicitTarget && !(await runtime.agents[agent].installed())) {\n return { agent, target, status: \"unavailable\", message: \"Agent is not installed.\" };\n }\n const managed = await runtime.state.getManagedSkill(agent, target);\n if (!(await exists(target))) {\n return managed\n ? {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory is missing.\",\n }\n : { agent, target, status: \"missing\", message: \"Skill is not installed.\" };\n }\n if (!managed) {\n return {\n agent,\n target,\n status: \"unmanaged\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Existing Skill directory is not managed by SAG CLI.\",\n };\n }\n try {\n const manifest = await validateBundle(target, agent);\n const fingerprint = await fingerprintDirectory(target);\n if (\n managed.fingerprint !== fingerprint ||\n managed.version !== manifest.packageVersion\n ) {\n return {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory has changed outside SAG CLI.\",\n };\n }\n return {\n agent,\n target,\n status: \"installed\",\n version: manifest.packageVersion,\n package: manifest.package,\n message: \"Managed Skill is installed.\",\n };\n } catch {\n return {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory has changed outside SAG CLI.\",\n };\n }\n}\n\nasync function activeAgents(\n runtime: SkillInstallerRuntime,\n selected: readonly AgentId[] | undefined,\n): Promise<readonly AgentId[]> {\n const choices = uniqueAgents(selected);\n if (selected) return choices;\n const installed = await Promise.all(\n choices.map(async (agent) => ({\n agent,\n installed: await runtime.agents[agent].installed(),\n })),\n );\n return installed.filter((choice) => choice.installed).map((choice) => choice.agent);\n}\n\nasync function requireConfirmation(\n runtime: SkillInstallerRuntime,\n selection: SkillTargetSelection,\n action: string,\n): Promise<boolean> {\n if (selection.yes) return true;\n return (await runtime.confirm?.(`${action} SAG Knowledge Skill?`)) ?? false;\n}\n\nexport async function inspectSkillTargets(\n runtime: SkillInstallerRuntime,\n input: Pick<SkillTargetSelection, \"agents\">,\n): Promise<SkillTargetsReport> {\n const source = await validateBundle(\n runtime.bundlePath ?? bundledSkillPath(),\n \"template\",\n );\n const selected = input.agents ? uniqueAgents(input.agents) : agents;\n const targets = await Promise.all(\n selected.map((agent) => inspectOne(runtime, agent, input.agents !== undefined)),\n );\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) => target.status === \"drifted\"),\n };\n}\n\nexport async function installSkillTargets(\n runtime: SkillInstallerRuntime,\n input: SkillTargetSelection,\n): Promise<SkillTargetsReport> {\n if (input.update && !runtime.resolveLatestBundle) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"Unable to resolve @latest Skill package\",\n {\n exitCode: exitCodes.dependencyMissing,\n hint: \"Run this update through `npx @zleap-ai/sag-cli@latest` or restore npm access.\",\n },\n );\n }\n const resolved = input.update ? await runtime.resolveLatestBundle?.() : undefined;\n const sourcePath = resolved?.bundlePath ?? runtime.bundlePath ?? bundledSkillPath();\n const source = await validateBundle(sourcePath, \"template\");\n const selected = await activeAgents(runtime, input.agents);\n if (selected.length === 0) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: agents.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"unavailable\" as const,\n message: \"No supported Agent was detected on this device.\",\n })),\n completedWithErrors: true,\n };\n }\n if (!(await requireConfirmation(runtime, input, \"Install\"))) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: selected.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"skipped\",\n message: \"Installation was not confirmed.\",\n })),\n completedWithErrors: false,\n };\n }\n\n const targets: SkillTargetReport[] = [];\n try {\n for (const agent of selected) {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n try {\n targets.push(\n await withTargetLease(target, async () => {\n const inspection = await inspectOne(\n runtime,\n agent,\n input.agents !== undefined,\n );\n if (\n inspection.status === \"installed\" &&\n inspection.version === source.packageVersion\n ) {\n return {\n ...inspection,\n status: \"skipped\" as const,\n message: \"Managed Skill is already current.\",\n };\n }\n if (inspection.status === \"unmanaged\" || inspection.status === \"drifted\") {\n return { ...inspection, status: \"conflict\" as const };\n }\n if (inspection.status === \"unavailable\") return inspection;\n\n const temporary = sibling(target, \"tmp\");\n const hadTarget = inspection.status === \"installed\";\n let backup: string | undefined;\n let replacementFingerprint: string | undefined;\n try {\n await cp(sourcePath, temporary, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n const temporaryManifestPath = path.join(temporary, \"manifest.json\");\n const temporaryManifest = await validateBundle(temporary, \"template\");\n await writeFile(\n temporaryManifestPath,\n `${JSON.stringify({ ...temporaryManifest, agent }, null, 2)}\\n`,\n \"utf8\",\n );\n await validateBundle(temporary, agent);\n replacementFingerprint = await fingerprintDirectory(temporary);\n await runtime.agents[agent].installSkill?.();\n if (hadTarget) {\n backup = sibling(target, \"backup\");\n await moveTarget(runtime, target, backup);\n }\n await moveTarget(runtime, temporary, target);\n if ((await fingerprintDirectory(target)) !== replacementFingerprint) {\n throw new Error(\"Skill target changed during installation\");\n }\n const managed: ManagedSkill = {\n agent,\n target,\n version: source.packageVersion,\n fingerprint: replacementFingerprint,\n ...(backup ? { backupPath: backup } : {}),\n };\n await runtime.state.saveManagedSkill(managed);\n return {\n agent,\n target,\n status: hadTarget ? \"updated\" : \"created\",\n version: source.packageVersion,\n package: source.package,\n message: \"Skill installed.\",\n };\n } catch {\n const restored = await restore({\n runtime,\n target,\n temporary,\n ...(backup ? { backup } : {}),\n hadTarget,\n ...(replacementFingerprint ? { replacementFingerprint } : {}),\n }).catch(() => false);\n return {\n agent,\n target,\n status: \"failed\",\n message: restored\n ? \"Skill installation failed and this target was restored.\"\n : \"Skill installation failed and recovery was incomplete.\",\n };\n }\n }),\n );\n } catch (error) {\n if (!(error instanceof SkillTargetLeaseError)) throw error;\n targets.push({\n agent,\n target,\n status: \"conflict\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message:\n \"Skill target is busy; wait for the active SAG CLI operation and retry.\",\n });\n }\n }\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) =>\n [\"failed\", \"conflict\"].includes(target.status),\n ),\n };\n } finally {\n await resolved?.cleanup();\n }\n}\n\nexport async function uninstallSkillTargets(\n runtime: SkillInstallerRuntime,\n input: SkillTargetSelection,\n): Promise<SkillTargetsReport> {\n const source = await validateBundle(\n runtime.bundlePath ?? bundledSkillPath(),\n \"template\",\n );\n const selected = await activeAgents(runtime, input.agents);\n if (!(await requireConfirmation(runtime, input, \"Uninstall\"))) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: selected.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"skipped\",\n message: \"Uninstall was not confirmed.\",\n })),\n completedWithErrors: false,\n };\n }\n const targets: SkillTargetReport[] = [];\n for (const agent of selected) {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n try {\n targets.push(\n await withTargetLease(target, async () => {\n const inspection = await inspectOne(\n runtime,\n agent,\n input.agents !== undefined,\n );\n if (inspection.status === \"missing\") return inspection;\n if (inspection.status !== \"installed\") {\n return {\n ...inspection,\n status: \"conflict\" as const,\n code: \"INSTALL_TARGET_CONFLICT\" as const,\n };\n }\n const removed = sibling(inspection.target, \"remove\");\n const managed = await runtime.state.getManagedSkill(agent, inspection.target);\n try {\n await moveTarget(runtime, inspection.target, removed);\n await runtime.state.deleteManagedSkill(agent, inspection.target);\n await removeTarget(runtime, removed);\n return {\n agent,\n target: inspection.target,\n status: \"removed\" as const,\n ...(inspection.version ? { version: inspection.version } : {}),\n package: source.package,\n message: \"Managed Skill was removed.\",\n };\n } catch {\n const recovery =\n managed && (await exists(removed))\n ? await recoverUninstall({\n runtime,\n agent,\n target: inspection.target,\n removed,\n managed,\n })\n : \"incomplete\";\n return {\n agent,\n target: inspection.target,\n status: \"failed\" as const,\n message:\n recovery === \"restored\"\n ? \"Skill uninstall failed; target and managed state were restored.\"\n : recovery === \"active-unmanaged\"\n ? \"Skill uninstall failed; recovery is incomplete and the active target is unmanaged.\"\n : \"Skill uninstall failed and recovery was incomplete.\",\n };\n }\n }),\n );\n } catch (error) {\n if (!(error instanceof SkillTargetLeaseError)) throw error;\n targets.push({\n agent,\n target,\n status: \"conflict\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message:\n \"Skill target is busy; wait for the active SAG CLI operation and retry.\",\n });\n }\n }\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) =>\n [\"failed\", \"conflict\"].includes(target.status),\n ),\n };\n}\n\nexport const skillInstallerExitCode = exitCodes.configConflict;\n","import { createHash, randomBytes as nodeRandomBytes } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport type { SkillAccount } from \"./account-config.js\";\nimport type {\n SkillAccountAuthHttpClient,\n SkillLoginSession,\n} from \"./account-auth-client.js\";\nimport { SkillError } from \"./model.js\";\n\ninterface SkillAccountStore {\n getAccount(origin: string): Promise<SkillAccount | null>;\n saveAccount(origin: string, account: SkillAccount): Promise<void>;\n removeAccount(origin: string): Promise<void>;\n withRefreshLock<T>(origin: string, operation: () => Promise<T>): Promise<T>;\n}\n\nexport interface SkillAccountAuthRuntime {\n readonly client: Pick<\n SkillAccountAuthHttpClient,\n \"createLoginSession\" | \"getLoginSession\" | \"exchange\" | \"refresh\" | \"logout\"\n >;\n readonly config: SkillAccountStore;\n readonly now: () => Date;\n readonly openBrowser: (url: string) => Promise<void>;\n readonly randomBytes?: (size: number) => Buffer;\n readonly sleep?: (milliseconds: number) => Promise<void>;\n}\n\nexport interface SkillAccountAuthorizationResult {\n readonly origin: string;\n readonly account: SkillAccount;\n readonly browserOpened: boolean;\n}\n\nexport async function authorizeSkillAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<SkillAccountAuthorizationResult> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const random = runtime.randomBytes ?? nodeRandomBytes;\n const verifier = random(32).toString(\"base64url\");\n const challenge = createHash(\"sha256\").update(verifier).digest(\"base64url\");\n const session = await runtime.client.createLoginSession(normalizedOrigin, challenge);\n await runtime.openBrowser(session.verificationUrl as string);\n const sleep = runtime.sleep ?? delay;\n\n for (;;) {\n if (runtime.now().getTime() >= new Date(session.expiresAt).getTime()) {\n throw expiredAuthorization();\n }\n const current = await runtime.client.getLoginSession(\n normalizedOrigin,\n session.sessionId,\n );\n if (current.status === \"denied\") {\n throw new SkillError(\n \"PERMISSION_DENIED\",\n \"SAG account authorization was denied\",\n { exitCode: exitCodes.permissionDenied },\n );\n }\n if (current.status === \"consumed\") throw expiredAuthorization();\n if (current.status === \"approved\") {\n const account = await runtime.client.exchange(normalizedOrigin, {\n sessionId: session.sessionId,\n pkceVerifier: verifier,\n });\n await runtime.config.saveAccount(normalizedOrigin, account);\n return { origin: normalizedOrigin, account, browserOpened: true };\n }\n await sleep(1_000);\n }\n}\n\nexport async function withFreshSkillAccount<T>(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n operation: (accessToken: string) => Promise<T>,\n): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const current = await requireAccount(runtime, normalizedOrigin);\n if (isFuture(current.accessExpiresAt, runtime.now())) {\n return operation(current.accessToken);\n }\n\n const accessToken = await runtime.config.withRefreshLock(\n normalizedOrigin,\n async () => {\n const latest = await requireAccount(runtime, normalizedOrigin);\n if (isFuture(latest.accessExpiresAt, runtime.now())) return latest.accessToken;\n if (!isFuture(latest.refreshExpiresAt, runtime.now())) {\n await runtime.config.removeAccount(normalizedOrigin);\n throw expiredAuthorization();\n }\n try {\n const rotated = await runtime.client.refresh(\n normalizedOrigin,\n latest.refreshToken,\n );\n const next = {\n ...rotated,\n ...(latest.recentKnowledgeBase && !rotated.recentKnowledgeBase\n ? { recentKnowledgeBase: latest.recentKnowledgeBase }\n : {}),\n };\n await runtime.config.saveAccount(normalizedOrigin, next);\n return next.accessToken;\n } catch (error) {\n if (\n error instanceof SkillError &&\n (error.code === \"AUTH_EXPIRED\" || error.code === \"AUTH_REQUIRED\")\n ) {\n await runtime.config.removeAccount(normalizedOrigin);\n }\n throw error;\n }\n },\n );\n return operation(accessToken);\n}\n\nexport async function logoutSkillAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<boolean> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const account = await runtime.config.getAccount(normalizedOrigin);\n if (!account) return false;\n await runtime.client.logout(\n normalizedOrigin,\n account.accessToken,\n account.refreshToken,\n );\n await runtime.config.removeAccount(normalizedOrigin);\n return true;\n}\n\nexport type { SkillLoginSession };\n\nasync function requireAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<SkillAccount> {\n const account = await runtime.config.getAccount(origin);\n if (account) return account;\n throw new SkillError(\"AUTH_REQUIRED\", \"SAG account authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n}\n\nfunction isFuture(value: string, now: Date): boolean {\n return new Date(value).getTime() > now.getTime();\n}\n\nfunction expiredAuthorization(): SkillError {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n });\n}\n","import { exitCodes } from \"../core/errors.js\";\nimport { withFreshSkillAccount, type SkillAccountAuthRuntime } from \"./account-auth.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport type {\n SkillDocumentUploadClient,\n SkillKnowledgeAnswer,\n SkillKnowledgeBase,\n SkillKnowledgeClient,\n SkillKnowledgeClientOptions,\n} from \"./knowledge-client.js\";\nimport { SkillError } from \"./model.js\";\n\nexport interface SkillAccountKnowledgeRuntime {\n readonly auth: SkillAccountAuthRuntime;\n readonly createId: () => string;\n readonly config: Readonly<{\n saveRecentKnowledgeBase(\n origin: string,\n knowledgeBase: Readonly<{ id: string; name: string }>,\n ): Promise<void>;\n }>;\n readonly createClient: (\n options: SkillKnowledgeClientOptions,\n ) => SkillKnowledgeClient & Partial<SkillDocumentUploadClient>;\n}\n\nexport async function renameSkillAccountDocument(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n input: Readonly<{\n knowledgeBase: string;\n documentId: string;\n expectedVersion: number;\n title: string;\n }>,\n) {\n const knowledgeBase = await selectedKnowledgeBase(\n runtime,\n origin,\n input.knowledgeBase,\n );\n const renamed = await withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.renameDocument({\n knowledgeBaseId: knowledgeBase.id,\n documentId: input.documentId,\n expectedVersion: input.expectedVersion,\n idempotencyKey: runtime.createId(),\n title: input.title,\n }),\n );\n await remember(runtime, origin, knowledgeBase);\n return renamed;\n}\n\nexport async function deleteSkillAccountDocument(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n input: Readonly<{\n knowledgeBase: string;\n documentId: string;\n expectedVersion: number;\n }>,\n) {\n const knowledgeBase = await selectedKnowledgeBase(\n runtime,\n origin,\n input.knowledgeBase,\n );\n const deleted = await withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.deleteDocument({\n knowledgeBaseId: knowledgeBase.id,\n documentId: input.documentId,\n expectedVersion: input.expectedVersion,\n idempotencyKey: runtime.createId(),\n }),\n );\n await remember(runtime, origin, knowledgeBase);\n return deleted;\n}\n\nexport async function listSkillAccountKnowledgeBases(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n): Promise<readonly SkillKnowledgeBase[]> {\n return withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.listKnowledgeBases(),\n );\n}\n\nexport async function listSkillAccountDocuments(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n selector: string,\n) {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const knowledgeBases = await listSkillAccountKnowledgeBases(\n runtime,\n normalizedOrigin,\n );\n const knowledgeBase = resolveKnowledgeBase(knowledgeBases, selector);\n const documents = await withSkillAccountKnowledgeClient(\n runtime,\n normalizedOrigin,\n (client) => client.listDocuments(knowledgeBase.id),\n );\n await runtime.config.saveRecentKnowledgeBase(normalizedOrigin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n return { knowledgeBase, documents };\n}\n\nexport async function askSkillAccountKnowledge(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n question: string,\n selector?: string,\n): Promise<SkillKnowledgeAnswer> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n let knowledgeBase: SkillKnowledgeBase | undefined;\n if (selector) {\n knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, normalizedOrigin),\n selector,\n );\n }\n const answer = await withSkillAccountKnowledgeClient(\n runtime,\n normalizedOrigin,\n (client) => {\n if (!client.ask) {\n throw new SkillError(\n \"PLATFORM_UNAVAILABLE\",\n \"SAG account question answering is unavailable\",\n { exitCode: exitCodes.serviceNotReady },\n );\n }\n return client.ask(question, knowledgeBase?.id);\n },\n );\n if (knowledgeBase) {\n await runtime.config.saveRecentKnowledgeBase(normalizedOrigin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n }\n return answer;\n}\n\nexport function resolveKnowledgeBase(\n knowledgeBases: readonly SkillKnowledgeBase[],\n selector: string,\n): SkillKnowledgeBase {\n const exactId = knowledgeBases.find((item) => item.id === selector);\n if (exactId) return exactId;\n const exactAlias = knowledgeBases.filter((item) => item.alias === selector);\n if (exactAlias.length === 1) return exactAlias[0] as SkillKnowledgeBase;\n const normalized = selector.trim().toLocaleLowerCase();\n const names = knowledgeBases.filter(\n (item) => item.name.toLocaleLowerCase() === normalized,\n );\n if (names.length === 1) return names[0] as SkillKnowledgeBase;\n throw new SkillError(\n \"INVALID_ARGUMENT\",\n names.length > 1\n ? \"Knowledge Base name is ambiguous\"\n : \"Knowledge Base was not found\",\n {\n details: { selector },\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nasync function selectedKnowledgeBase(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n selector: string,\n): Promise<SkillKnowledgeBase> {\n return resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n selector,\n );\n}\n\nasync function remember(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n knowledgeBase: SkillKnowledgeBase,\n): Promise<void> {\n await runtime.config.saveRecentKnowledgeBase(origin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n}\n\nexport async function withSkillAccountKnowledgeClient<T>(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n operation: (\n client: SkillKnowledgeClient & Partial<SkillDocumentUploadClient>,\n ) => Promise<T>,\n): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n return withFreshSkillAccount(runtime.auth, normalizedOrigin, (accessToken) =>\n operation(runtime.createClient({ accessToken, origin: normalizedOrigin })),\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport {\n listSkillAccountKnowledgeBases,\n resolveKnowledgeBase,\n withSkillAccountKnowledgeClient,\n type SkillAccountKnowledgeRuntime,\n} from \"./account-knowledge.js\";\nimport { SkillError } from \"./model.js\";\n\nconst DEFAULT_MAX_UPLOAD_BYTES = 25 * 1024 * 1024;\n\nexport type SkillAccountUploadEvent = Readonly<{\n event: \"accepted\" | \"processing\" | \"completed\" | \"failed\" | \"detached\";\n importId: string;\n documentId?: string;\n jobId?: string;\n failure?: string;\n}>;\n\nexport interface SkillAccountUploadRuntime extends SkillAccountKnowledgeRuntime {\n readonly now: () => Date;\n readonly sleep: (milliseconds: number) => Promise<void>;\n readonly onEvent?: (event: SkillAccountUploadEvent) => void | Promise<void>;\n}\n\nexport async function uploadSkillAccountFile(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n filePath: string,\n knowledgeBaseSelector: string,\n waitMs = 30 * 60 * 1000,\n overwriteDocumentId?: string,\n): Promise<readonly SkillAccountUploadEvent[]> {\n const file = await inspectFile(filePath);\n const knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n knowledgeBaseSelector,\n );\n const serverLimit = await withSkillAccountKnowledgeClient(\n runtime,\n origin,\n (client) => {\n if (!client.getServerLimit) return Promise.resolve(undefined);\n return client.getServerLimit(knowledgeBase.id);\n },\n );\n const limit = Math.min(\n DEFAULT_MAX_UPLOAD_BYTES,\n serverLimit ?? DEFAULT_MAX_UPLOAD_BYTES,\n );\n if (file.size > limit) {\n throw new SkillError(\n \"FILE_TOO_LARGE\",\n `This file exceeds the ${limit}-byte Knowledge Base upload limit.`,\n {\n details: { limit_bytes: limit, size_bytes: file.size },\n exitCode: exitCodes.invalidArgument,\n },\n );\n }\n const digest = await sha256(filePath);\n const receipt = await withSkillAccountKnowledgeClient(runtime, origin, (client) => {\n if (!client.upload) return unavailableUpload();\n return client.upload({\n fileDigest: digest,\n fileName: file.name,\n filePath,\n fileSize: file.size,\n idempotencyKey: runtime.createId(),\n knowledgeBaseId: knowledgeBase.id,\n ...(overwriteDocumentId ? { overwriteDocumentId } : {}),\n });\n });\n const accepted: SkillAccountUploadEvent = {\n event: \"accepted\",\n importId: receipt.importId,\n documentId: receipt.documentId,\n jobId: receipt.jobId,\n };\n await runtime.onEvent?.(accepted);\n if (waitMs === 0) {\n const detached = { ...accepted, event: \"detached\" as const };\n await runtime.onEvent?.(detached);\n return [accepted, detached];\n }\n const terminal = await poll(\n runtime,\n origin,\n knowledgeBase.id,\n receipt.importId,\n waitMs,\n );\n return [accepted, terminal];\n}\n\nexport async function inspectSkillAccountUpload(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n importId: string,\n knowledgeBaseSelector: string,\n): Promise<SkillAccountUploadEvent> {\n const knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n knowledgeBaseSelector,\n );\n return readStatus(runtime, origin, knowledgeBase.id, importId);\n}\n\nasync function poll(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n knowledgeBaseId: string,\n importId: string,\n waitMs: number,\n): Promise<SkillAccountUploadEvent> {\n const startedAt = runtime.now().getTime();\n for (;;) {\n const event = await readStatus(runtime, origin, knowledgeBaseId, importId);\n await runtime.onEvent?.(event);\n if (event.event !== \"processing\") return event;\n if (runtime.now().getTime() - startedAt >= waitMs) {\n const detached = { event: \"detached\" as const, importId };\n await runtime.onEvent?.(detached);\n return detached;\n }\n await runtime.sleep(2_000);\n }\n}\n\nasync function readStatus(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n knowledgeBaseId: string,\n importId: string,\n): Promise<SkillAccountUploadEvent> {\n const current = await withSkillAccountKnowledgeClient(runtime, origin, (client) => {\n if (!client.getImportStatus) return unavailableUpload();\n return client.getImportStatus(knowledgeBaseId, importId);\n });\n return {\n event: current.searchable\n ? \"completed\"\n : current.state === \"failed\"\n ? \"failed\"\n : \"processing\",\n importId,\n ...(current.failure ? { failure: current.failure } : {}),\n };\n}\n\nasync function inspectFile(filePath: string): Promise<{ name: string; size: number }> {\n let metadata;\n try {\n metadata = await stat(filePath);\n } catch {\n throw new SkillError(\"FILE_NOT_FOUND\", \"The upload file could not be found.\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!metadata.isFile()) {\n throw new SkillError(\n \"UNSUPPORTED_FILE_TYPE\",\n \"Upload accepts one regular file, not a directory or batch.\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n return { name: path.basename(filePath), size: metadata.size };\n}\n\nasync function sha256(filePath: string): Promise<string> {\n const digest = createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) digest.update(chunk);\n return `sha256:${digest.digest(\"hex\")}`;\n}\n\nfunction unavailableUpload(): never {\n throw new SkillError(\"PLATFORM_UNAVAILABLE\", \"SAG upload is unavailable\", {\n exitCode: exitCodes.serviceNotReady,\n });\n}\n","import { z } from \"zod\";\nimport { openAsBlob } from \"node:fs\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport { SkillError } from \"./model.js\";\n\nconst knowledgeBaseSchema = z.strictObject({\n alias: z.string().min(1).optional(),\n id: z.string().min(1),\n name: z.string().min(1),\n});\nconst knowledgeBaseDirectorySchema = z.strictObject({\n items: z.array(knowledgeBaseSchema),\n});\nconst documentSchema = z.strictObject({\n id: z.string().min(1),\n knowledge_base_id: z.string().min(1),\n title: z.string().min(1),\n version: z.number().int().positive(),\n});\nconst documentDirectorySchema = z.strictObject({\n items: z.array(documentSchema),\n});\nconst deletedDocumentSchema = z.strictObject({\n deleted_at: z.string().datetime({ offset: true }),\n document_id: z.string().min(1),\n recoverable: z.literal(true),\n version: z.number().int().positive(),\n});\nconst uploadStateSchema = z.enum([\n \"queued\",\n \"accepted\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nconst uploadResponseSchema = z.strictObject({\n document_id: z.string().min(1),\n import_id: z.string().min(1),\n job_id: z.string().min(1),\n state: uploadStateSchema,\n});\nconst uploadLimitSchema = z.strictObject({\n max_upload_bytes: z.number().int().positive(),\n});\nconst importStatusSchema = z.strictObject({\n failure: z.string().min(1).optional(),\n searchable: z.boolean(),\n state: uploadStateSchema,\n});\nconst answerSchema = z.strictObject({\n answer: z.string().min(1),\n citations: z.array(\n z.strictObject({\n number: z.number().int().positive(),\n knowledge_base_id: z.string().min(1),\n document_id: z.string().min(1),\n document_version_id: z.string().min(1),\n excerpt: z.string(),\n location: z.string().min(1).optional(),\n }),\n ),\n search_completeness: z.enum([\"complete\", \"partial\"]),\n search_partial_reasons: z.array(z.string().min(1)),\n});\nconst problemSchema = z\n .object({\n code: z.string().min(1),\n data: z.unknown().optional(),\n })\n .passthrough();\nconst duplicateImportDetailsSchema = z.object({\n conflict_type: z.enum([\n \"same_filename_same_checksum\",\n \"same_filename_changed_checksum\",\n ]),\n existing_document_id: z.string().min(1),\n existing_import_id: z.string().min(1),\n existing_filename: z.string().min(1),\n current_filename: z.string().min(1),\n checksum_sha256: z.string().min(1),\n existing_state: z.string().min(1),\n overwrite_allowed: z.boolean(),\n});\n\nexport type SkillKnowledgeBase = Readonly<{\n alias?: string;\n id: string;\n name: string;\n}>;\n\nexport type SkillDocument = Readonly<{\n id: string;\n knowledgeBaseId: string;\n title: string;\n version: number;\n}>;\n\nexport type SkillDeletedDocument = Readonly<{\n deletedAt: string;\n documentId: string;\n recoverable: true;\n version: number;\n}>;\n\nexport type SkillDocumentUploadReceipt = Readonly<{\n documentId: string;\n importId: string;\n jobId: string;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n}>;\n\nexport type SkillKnowledgeAnswer = Readonly<{\n answer: string;\n citations: readonly Readonly<{\n number: number;\n knowledgeBaseId: string;\n documentId: string;\n documentVersionId: string;\n excerpt: string;\n location?: string;\n }>[];\n completeness: \"complete\" | \"partial\";\n partialReasons: readonly string[];\n}>;\n\nexport interface SkillKnowledgeClient {\n ask?(question: string, knowledgeBaseId?: string): Promise<SkillKnowledgeAnswer>;\n listKnowledgeBases(): Promise<readonly SkillKnowledgeBase[]>;\n listDocuments(knowledgeBaseId: string): Promise<readonly SkillDocument[]>;\n renameDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n title: string;\n }): Promise<SkillDocument>;\n deleteDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): Promise<SkillDeletedDocument>;\n}\n\nexport interface SkillDocumentUploadClient {\n getServerLimit(knowledgeBaseId: string, signal?: AbortSignal): Promise<number>;\n getImportStatus(\n knowledgeBaseId: string,\n importId: string,\n signal?: AbortSignal,\n ): Promise<{\n failure?: string;\n searchable: boolean;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n }>;\n upload(\n input: {\n fileDigest: string;\n fileName: string;\n filePath: string;\n fileSize: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n overwriteDocumentId?: string;\n },\n signal?: AbortSignal,\n ): Promise<SkillDocumentUploadReceipt>;\n}\n\nexport interface SkillKnowledgeClientOptions {\n readonly accessToken: string;\n readonly fetchImplementation?: typeof fetch;\n readonly origin: string;\n readonly timeoutMs?: number;\n}\n\nfunction httpError(\n status: number,\n problemCode: string,\n problemData?: unknown,\n): SkillError {\n const normalizedProblemCode = problemCode.toLowerCase();\n const details = { problemCode };\n if (\n normalizedProblemCode === \"invalid_grant\" ||\n normalizedProblemCode === \"expired_token\"\n ) {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n ...details,\n });\n }\n if (normalizedProblemCode === \"document_title_conflict\") {\n return new SkillError(\"DOCUMENT_TITLE_CONFLICT\", \"The document title conflicts\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (normalizedProblemCode === \"document_import_duplicate\") {\n const details = duplicateImportDetailsSchema.safeParse(problemData);\n return new SkillError(\n \"DOCUMENT_IMPORT_DUPLICATE\",\n \"A file with the same name already exists in this Knowledge Base\",\n {\n ...(details.success ? { details: details.data } : {}),\n exitCode: exitCodes.configConflict,\n problemCode,\n },\n );\n }\n if (normalizedProblemCode === \"stale_version\") {\n return new SkillError(\"STALE_VERSION\", \"The document version is stale\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (status === 401) {\n return new SkillError(\"AUTH_REQUIRED\", \"Skill authorization is required\", {\n exitCode: exitCodes.authRequired,\n ...details,\n });\n }\n if (status === 403) {\n return new SkillError(\"PERMISSION_DENIED\", \"Skill authorization was denied\", {\n exitCode: exitCodes.permissionDenied,\n ...details,\n });\n }\n if (status === 404) {\n return new SkillError(\n \"DOCUMENT_NOT_FOUND\",\n \"Skill Knowledge resource was not found\",\n {\n exitCode: exitCodes.resourceNotFound,\n ...details,\n },\n );\n }\n if (status === 409) {\n return new SkillError(\"CONFIG_CONFLICT\", \"Skill Knowledge request conflicts\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (status === 429) {\n return new SkillError(\n \"RATE_LIMITED\",\n \"Skill Knowledge service rate limit reached\",\n {\n exitCode: exitCodes.networkUnreachable,\n ...details,\n },\n );\n }\n if (status >= 500) {\n return new SkillError(\n \"PLATFORM_UNAVAILABLE\",\n \"Skill Knowledge service is unavailable\",\n {\n exitCode: exitCodes.serviceNotReady,\n ...details,\n },\n );\n }\n return new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned an incompatible response\",\n {\n exitCode: exitCodes.internalError,\n ...details,\n },\n );\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"The request was interrupted.\", \"AbortError\");\n}\n\nexport class SkillKnowledgeHttpClient\n implements SkillKnowledgeClient, SkillDocumentUploadClient\n{\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n readonly #origin: string;\n readonly #timeoutMs: number;\n\n constructor(options: SkillKnowledgeClientOptions) {\n try {\n this.#origin = normalizeSkillOrigin(options.origin);\n } catch {\n throw new SkillError(\"CONFIG_CONFLICT\", \"SAG address is invalid\", {\n exitCode: exitCodes.configConflict,\n });\n }\n if (!options.accessToken) {\n throw new SkillError(\"AUTH_REQUIRED\", \"Skill authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n }\n this.#accessToken = options.accessToken;\n this.#fetch = options.fetchImplementation ?? fetch;\n this.#timeoutMs = options.timeoutMs ?? 15_000;\n }\n\n async ask(question: string, knowledgeBaseId?: string): Promise<SkillKnowledgeAnswer> {\n const answer = this.#parse(\n answerSchema,\n await this.#request(\"/api/v1/integrations/skill/v1/questions\", {\n body: {\n question,\n ...(knowledgeBaseId ? { knowledge_base_id: knowledgeBaseId } : {}),\n },\n method: \"POST\",\n }),\n );\n return {\n answer: answer.answer,\n citations: answer.citations.map((citation) => ({\n number: citation.number,\n knowledgeBaseId: citation.knowledge_base_id,\n documentId: citation.document_id,\n documentVersionId: citation.document_version_id,\n excerpt: citation.excerpt,\n ...(citation.location ? { location: citation.location } : {}),\n })),\n completeness: answer.search_completeness,\n partialReasons: answer.search_partial_reasons,\n };\n }\n\n async listKnowledgeBases(): Promise<readonly SkillKnowledgeBase[]> {\n const parsed = await this.#request(\n \"/api/v1/integrations/skill/v1/knowledge-bases\",\n {\n method: \"GET\",\n },\n );\n return this.#parse(knowledgeBaseDirectorySchema, parsed).items.map(\n (knowledgeBase) => ({\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n ...(knowledgeBase.alias ? { alias: knowledgeBase.alias } : {}),\n }),\n );\n }\n\n async listDocuments(knowledgeBaseId: string): Promise<readonly SkillDocument[]> {\n const parsed = await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/documents`,\n { method: \"GET\" },\n );\n return this.#parse(documentDirectorySchema, parsed).items.map((document) => ({\n id: document.id,\n knowledgeBaseId: document.knowledge_base_id,\n title: document.title,\n version: document.version,\n }));\n }\n\n async renameDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n title: string;\n }): Promise<SkillDocument> {\n const document = this.#parse(\n documentSchema,\n await this.#request(this.#mutationPath(input), {\n body: { title: input.title },\n headers: this.#mutationHeaders(input),\n method: \"PATCH\",\n }),\n );\n if (\n document.id !== input.documentId ||\n document.knowledge_base_id !== input.knowledgeBaseId\n ) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned a different document\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n return {\n id: document.id,\n knowledgeBaseId: document.knowledge_base_id,\n title: document.title,\n version: document.version,\n };\n }\n\n async deleteDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): Promise<SkillDeletedDocument> {\n const deleted = this.#parse(\n deletedDocumentSchema,\n await this.#request(this.#mutationPath(input), {\n headers: this.#mutationHeaders(input),\n method: \"DELETE\",\n }),\n );\n if (deleted.document_id !== input.documentId) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned a different document\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n return {\n deletedAt: deleted.deleted_at,\n documentId: deleted.document_id,\n recoverable: deleted.recoverable,\n version: deleted.version,\n };\n }\n\n async getServerLimit(knowledgeBaseId: string, signal?: AbortSignal): Promise<number> {\n return this.#parse(\n uploadLimitSchema,\n await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/upload-limit`,\n { method: \"GET\", ...(signal ? { signal } : {}) },\n ),\n ).max_upload_bytes;\n }\n\n async upload(\n input: {\n fileDigest: string;\n fileName: string;\n filePath: string;\n fileSize: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n overwriteDocumentId?: string;\n },\n signal?: AbortSignal,\n ): Promise<SkillDocumentUploadReceipt> {\n throwIfAborted(signal);\n const form = new FormData();\n form.set(\"file\", await openAsBlob(input.filePath), input.fileName);\n if (input.overwriteDocumentId) {\n form.set(\"overwrite_document_id\", input.overwriteDocumentId);\n }\n const payload = await this.#multipartRequest(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents`,\n form,\n input.idempotencyKey,\n signal,\n );\n const response = this.#parse(uploadResponseSchema, payload);\n return {\n documentId: response.document_id,\n importId: response.import_id,\n jobId: response.job_id,\n state: response.state,\n };\n }\n\n async getImportStatus(\n knowledgeBaseId: string,\n importId: string,\n signal?: AbortSignal,\n ): Promise<{\n failure?: string;\n searchable: boolean;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n }> {\n const status = this.#parse(\n importStatusSchema,\n await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/imports/${encodeURIComponent(importId)}`,\n { method: \"GET\", ...(signal ? { signal } : {}) },\n ),\n );\n return {\n searchable: status.searchable,\n state: status.state,\n ...(status.failure ? { failure: status.failure } : {}),\n };\n }\n\n async #request(\n path: string,\n options: {\n readonly body?: Record<string, unknown>;\n readonly headers?: Record<string, string>;\n readonly method: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\";\n readonly signal?: AbortSignal;\n },\n ): Promise<unknown> {\n let response: Response;\n try {\n throwIfAborted(options.signal);\n response = await this.#fetch(new URL(path, this.#origin), {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n \"Cache-Control\": \"no-store\",\n ...options.headers,\n ...(options.body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n },\n method: options.method,\n redirect: \"error\",\n signal: this.#requestSignal(options.signal),\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n });\n } catch (error) {\n if (options.signal?.aborted) throw error;\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the Skill Knowledge service\",\n {\n exitCode: exitCodes.networkUnreachable,\n },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service redirect was rejected\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const problem = problemSchema.safeParse(payload);\n throw httpError(\n response.status,\n problem.success ? problem.data.code : \"unknown\",\n problem.success ? problem.data.data : undefined,\n );\n }\n return payload;\n }\n\n #mutationPath(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): string {\n return `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents/${encodeURIComponent(input.documentId)}`;\n }\n\n #mutationHeaders(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n }): Record<string, string> {\n return {\n \"Idempotency-Key\": input.idempotencyKey,\n \"If-Match\": `\"document.${input.documentId}.v${input.expectedVersion}\"`,\n };\n }\n\n async #multipartRequest(\n path: string,\n body: FormData,\n idempotencyKey: string,\n signal?: AbortSignal,\n ): Promise<unknown> {\n let response: Response;\n try {\n throwIfAborted(signal);\n response = await this.#fetch(new URL(path, this.#origin), {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n \"Cache-Control\": \"no-store\",\n \"Idempotency-Key\": idempotencyKey,\n },\n method: \"POST\",\n redirect: \"error\",\n signal: this.#requestSignal(signal),\n body,\n });\n } catch (error) {\n if (signal?.aborted) throw error;\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the Skill Knowledge service\",\n {\n exitCode: exitCodes.networkUnreachable,\n },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service redirect was rejected\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const problem = problemSchema.safeParse(payload);\n throw httpError(\n response.status,\n problem.success ? problem.data.code : \"unknown\",\n problem.success ? problem.data.data : undefined,\n );\n }\n return payload;\n }\n\n #requestSignal(signal: AbortSignal | undefined): AbortSignal {\n const timeout = AbortSignal.timeout(this.#timeoutMs);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n }\n\n #parse<TSchema extends z.ZodType>(\n schema: TSchema,\n payload: unknown,\n ): z.output<TSchema> {\n const parsed = schema.safeParse(payload);\n if (parsed.success) return parsed.data;\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned an incompatible response\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n}\n"],"mappings":"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","names":["rm","os","path","readFile","os","path","z","z","invalidSpec","input","path","hostFailure","conflict","sameSpec","os","readFile","chmod","readFile","rename","stat","unlink","writeFile","os","path","z","z","invalidSpec","hostFailure","conflict","path","os","stat","readFile","writeFile","rename","chmod","unlink","chmod","mkdir","readFile","rename","unlink","writeFile","path","lock","z","z","mkdir","path","lock","readFile","writeFile","rename","chmod","unlink","input","mkdir","readFile","rename","unlink","writeFile","path","parse","stringify","input","z","readFile","parse","path","mkdir","writeFile","stringify","rename","unlink","os","path","randomUUID","chmod","mkdir","readFile","rename","unlink","path","lock","z","z","emptyState","invalidState","chmod","mkdir","path","lock","readFile","randomUUID","rename","unlink","z","chmod","mkdir","readFile","rename","unlink","writeFile","path","lock","parse","stringify","z","z","emptyState","invalidState","mkdir","path","lock","readFile","parse","writeFile","stringify","rename","chmod","unlink","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","parse","stringify","z","z","emptyState","invalidState","receiptFor","mkdir","path","lock","readFile","parse","randomUUID","open","stringify","rename","unlink","Client","input","input","Client","listSources","input","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","z","z","emptyState","invalidState","mkdir","path","lock","readFile","randomUUID","open","rename","unlink","z","createHash","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","z","z","input","readFile","digest","createHash","mkdir","path","lock","randomUUID","open","rename","unlink","z","input","status","randomUUID","z","input","path","status","conflict","hostFailure","input","input","input","runtime","input","agents","input","user","requiredIdentifier","runtime","input","createHash","input","createHash","configurationConflict","hostFailure","input","status","runtime","createHash","lstat","mkdir","readFile","rename","path","path","lstat","readFile","createHash","success","status","failed","conflict","input","rename","mkdir","input","connection","failure","status","runtime","agents","nextActions","input","runtime","runtime","input","source","status","summary","createHash","createHash","input","success","status","input","agents","createHash","randomUUID","cp","lstat","mkdir","readFile","readdir","rename","rm","writeFile","fileURLToPath","path","lock","skillName","bundledSkillPath","path","fileURLToPath","input","runtime","mkdir","lock","exists","lstat","rename","rm","createHash","readFile","readdir","randomUUID","cp","writeFile","createHash","runtime","verifier","createHash","runtime","input","createHash","stat","path","runtime","digest","stat","path","createHash","z","z","documentSchema","problemSchema","status","details","input","path","commandOptions","dependencies","success","runtime","randomUUID","status","failed","conflict","agents","input","processRunner","path","rm","skillState","os"]}
|
|
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/workbuddy.ts","../src/agents/state.ts","../src/config/store.ts","../src/config/resolve.ts","../src/config/schema.ts","../src/config/paths.ts","../src/credentials/file.ts","../src/credentials/memory.ts","../src/credentials/namespaces.ts","../src/credentials/keychain.ts","../src/docker/schemas.ts","../src/docker/client.ts","../src/mcp/interactive-input.ts","../src/mcp/enterprise/managed-state.ts","../src/mcp/enterprise/store.ts","../src/mcp/verifier.ts","../src/mcp/failure.ts","../src/mcp/commands.ts","../src/mcp/enterprise/model.ts","../src/mcp/enterprise/risk.ts","../src/process/runner.ts","../src/skill/state-store.ts","../src/skill/account-auth-client.ts","../src/skill/account-config.ts","../src/skill/model.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/knowledge.ts","../src/commands/mcp.ts","../src/mcp/enterprise/credentials.ts","../src/mcp/enterprise/import.ts","../src/mcp/enterprise/runtime.ts","../src/mcp/enterprise/service.ts","../src/mcp/enterprise/agent-service.ts","../src/mcp/enterprise/skill-service.ts","../src/commands/enterprise-mcp.ts","../src/commands/search.ts","../src/commands/source.ts","../src/core/context.ts","../src/core/result.ts","../src/diagnostics/doctor.ts","../src/output/redaction.ts","../src/output/human.ts","../src/output/json.ts","../src/output/ndjson.ts","../src/skill/installer.ts","../src/skill/account-auth.ts","../src/skill/account-knowledge.ts","../src/skill/account-upload.ts","../src/skill/knowledge-client.ts"],"sourcesContent":["import { mkdtemp, rm } from \"node:fs/promises\";\nimport os, { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nimport { checkbox, confirm, input, 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 { WorkBuddyAdapter } from \"./agents/workbuddy.js\";\nimport { isAgentInstalled } from \"./agents/adapter.js\";\nimport { ManagedConnectionStore } from \"./agents/state.js\";\nimport { ConfigStore } from \"./config/store.js\";\nimport {\n defaultConfigPath,\n defaultEnterpriseMcpConnectionsPath,\n defaultEnterpriseMcpCredentialsPath,\n defaultEnterpriseMcpManagedStatePath,\n defaultManagedConnectionsPath,\n defaultSkillAccountConfigPath,\n defaultSkillStatePath,\n} from \"./config/paths.js\";\nimport { CliError, exitCodes } from \"./core/errors.js\";\nimport { FileCredentialStore } from \"./credentials/file.js\";\nimport {\n createCredentialStore,\n createEnterpriseKeychainCredentialStore,\n} from \"./credentials/keychain.js\";\nimport type { CredentialStore } from \"./credentials/store.js\";\nimport { DockerClient } from \"./docker/client.js\";\nimport { readInteractiveMcpJson } from \"./mcp/interactive-input.js\";\nimport { EnterpriseMcpManagedStateStore } from \"./mcp/enterprise/managed-state.js\";\nimport { EnterpriseMcpConnectionStore } from \"./mcp/enterprise/store.js\";\nimport { McpVerifier } from \"./mcp/verifier.js\";\nimport { NodeProcessRunner } from \"./process/runner.js\";\nimport { SkillStateStore } from \"./skill/state-store.js\";\nimport { SkillAccountAuthHttpClient } from \"./skill/account-auth-client.js\";\nimport { SkillAccountConfigStore } from \"./skill/account-config.js\";\nimport { defaultClientFactory, runCli, type CliDependencies } from \"./program.js\";\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let input = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk: string) => {\n input += chunk;\n });\n process.stdin.once(\"end\", () => resolve(input));\n process.stdin.once(\"error\", reject);\n });\n}\n\nasync function resolveLatestSkillBundle(processRunner: NodeProcessRunner): Promise<{\n bundlePath: string;\n cleanup(): Promise<void>;\n}> {\n const directory = await mkdtemp(path.join(tmpdir(), \"sag-skill-latest-\"));\n const cleanup = () => rm(directory, { recursive: true, force: true });\n try {\n const packed = await processRunner.run({\n command: \"npm\",\n args: [\n \"pack\",\n \"@zleap-ai/sag-cli@latest\",\n \"--ignore-scripts\",\n \"--json\",\n \"--pack-destination\",\n directory,\n \"--cache\",\n path.join(directory, \"npm-cache\"),\n \"--prefer-online\",\n ],\n timeoutMs: 60_000,\n });\n if (packed.exitCode !== 0) throw new Error(\"npm pack failed\");\n const result: unknown = JSON.parse(packed.stdout);\n const filename =\n Array.isArray(result) &&\n typeof result[0] === \"object\" &&\n result[0] !== null &&\n typeof (result[0] as { filename?: unknown }).filename === \"string\"\n ? (result[0] as { filename: string }).filename\n : null;\n if (!filename || path.basename(filename) !== filename) {\n throw new Error(\"npm pack returned an invalid filename\");\n }\n const extracted = await processRunner.run({\n command: \"tar\",\n args: [\"-xzf\", path.join(directory, filename), \"-C\", directory],\n timeoutMs: 30_000,\n });\n if (extracted.exitCode !== 0) throw new Error(\"tar extraction failed\");\n return { bundlePath: path.join(directory, \"package\", \"skill\"), cleanup };\n } catch (cause) {\n await cleanup();\n throw new CliError(\n \"NETWORK_UNREACHABLE\",\n \"Unable to resolve @latest Skill package\",\n {\n exitCode: exitCodes.networkUnreachable,\n cause,\n hint: \"Check npm network access and retry; the installed Skill was not changed.\",\n },\n );\n }\n}\n\nconst credentialSelection = await createCredentialStore();\nif (credentialSelection.warning) {\n process.stderr.write(`Warning: ${credentialSelection.warning}\\n`);\n}\nconst processRunner = new NodeProcessRunner();\nconst verifier = new McpVerifier(packageJson.version);\nconst adapters = {\n codex: new CodexAdapter(processRunner),\n \"claude-code\": new ClaudeCodeAdapter(processRunner),\n workbuddy: new WorkBuddyAdapter(),\n} as const;\nconst enterpriseManaged = new EnterpriseMcpManagedStateStore(\n defaultEnterpriseMcpManagedStatePath(),\n);\nconst skillState = new SkillStateStore(defaultSkillStatePath());\nconst skillAccountConfig = new SkillAccountConfigStore(defaultSkillAccountConfigPath());\n\nasync function openSkillAuthorizationBrowser(\n processRunner: NodeProcessRunner,\n verificationUrl: string,\n): Promise<void> {\n const command =\n process.platform === \"darwin\"\n ? { command: \"open\", args: [verificationUrl] }\n : process.platform === \"win32\"\n ? { command: \"cmd\", args: [\"/c\", \"start\", \"\", verificationUrl] }\n : { command: \"xdg-open\", args: [verificationUrl] };\n const result = await processRunner.run({\n ...command,\n timeoutMs: 10_000,\n });\n if (result.exitCode !== 0) throw new Error(\"browser opener failed\");\n}\n\nfunction unavailableEnterpriseKeychain(): CredentialStore {\n const unavailable = () => {\n throw new CliError(\"DEPENDENCY_MISSING\", \"系统凭据库不可用\", {\n exitCode: exitCodes.dependencyMissing,\n hint: \"请恢复系统凭据库,或明确使用 --credential-store file。\",\n });\n };\n return {\n kind: \"keychain\",\n get: async () => unavailable(),\n set: async () => unavailable(),\n delete: async () => unavailable(),\n };\n}\n\nconst enterpriseKeychain = await createEnterpriseKeychainCredentialStore().catch(() =>\n unavailableEnterpriseKeychain(),\n);\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 promptName: () => input({ message: \"SAG user name\" }),\n promptSkillOrigin: () => input({ message: \"SAG address\" }),\n confirm: (message) => confirm({ message, default: false }),\n readStdin,\n stdinIsTty: Boolean(process.stdin.isTTY),\n promptMcpJson: () =>\n readInteractiveMcpJson({\n input: process.stdin,\n writeStderr: (value) => process.stderr.write(value),\n }),\n selectMcpServers: (servers) =>\n checkbox({\n message: \"请选择要连接的 MCP Server(默认不选择)\",\n choices: servers.map((server) => ({\n name: server.serverKey,\n value: server.serverKey,\n checked: false,\n })),\n }),\n selectAgents: async (installed) => {\n const selected = await checkbox({\n message: \"请选择要接入的 Agent(默认不选择)\",\n choices: [\n {\n name: \"全选已安装 Agent\",\n value: \"all\" as const,\n checked: false,\n },\n ...installed.map((agent) => ({\n name: agent,\n value: agent,\n checked: false,\n })),\n ],\n });\n return selected.includes(\"all\")\n ? installed\n : selected.filter((agent) => agent !== \"all\");\n },\n selectCollisionAction: (collision) =>\n select({\n message: `MCP Server ${collision.serverKey} 已指向其他地址,请选择处理方式`,\n choices: [\n { name: \"替换原连接\", value: \"replace\" as const },\n { name: \"保留两个连接\", value: \"keep-both\" as const },\n ],\n }),\n writeStdout: (value) => process.stdout.write(value),\n writeStderr: (value) => process.stderr.write(value),\n localMcp: {\n docker: new DockerClient(processRunner),\n verifier,\n state: new ManagedConnectionStore(defaultManagedConnectionsPath()),\n adapters,\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 enterpriseMcp: {\n store: new EnterpriseMcpConnectionStore(defaultEnterpriseMcpConnectionsPath()),\n credentials: {\n keychain: enterpriseKeychain,\n file: new FileCredentialStore(defaultEnterpriseMcpCredentialsPath()),\n },\n verifier,\n agents: {\n adapters,\n managed: enterpriseManaged,\n verifier,\n confirm: (message) => confirm({ message, default: false }),\n now: () => new Date(),\n },\n skill: {\n home: os.homedir(),\n environment: { CODEX_HOME: process.env.CODEX_HOME },\n managed: enterpriseManaged,\n now: () => new Date(),\n },\n now: () => new Date(),\n },\n skill: {\n home: os.homedir(),\n environment: { CODEX_HOME: process.env.CODEX_HOME },\n state: skillState,\n agents: {\n codex: { id: \"codex\", installed: () => isAgentInstalled(adapters.codex) },\n \"claude-code\": {\n id: \"claude-code\",\n installed: () => isAgentInstalled(adapters[\"claude-code\"]),\n },\n workbuddy: {\n id: \"workbuddy\",\n installed: () => isAgentInstalled(adapters.workbuddy),\n },\n },\n now: () => new Date(),\n confirm: (message) => confirm({ message, default: false }),\n resolveLatestBundle: () => resolveLatestSkillBundle(processRunner),\n },\n skillAccount: {\n client: new SkillAccountAuthHttpClient(),\n config: skillAccountConfig,\n now: () => new Date(),\n openBrowser: (verificationUrl) =>\n openSkillAuthorizationBrowser(processRunner, verificationUrl),\n },\n};\n\nprocess.exitCode = await runCli(process.argv, dependencies);\n","{\n \"name\": \"@zleap-ai/sag-cli\",\n \"version\": \"0.6.1\",\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 \"README.en.md\",\n \"LICENSE\",\n \"skill\",\n \"skills/sag-mcp\"\n ],\n \"scripts\": {\n \"build\": \"tsup && node scripts/sync-skill-runtime.mjs\",\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.union([\n 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 z.object({\n type: z.literal(\"http\"),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()),\n }),\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 \"The Claude Code adapter supports user-scoped stdio and HTTP MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"Run `claude mcp list` to inspect the current Claude Code MCP configuration.\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"The Claude Code MCP entry is already owned by a different configuration\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"Choose another MCP server name or remove the existing user-owned entry.\",\n },\n );\n}\n\nfunction sameSpec(left: McpConnectionSpec, right: McpConnectionSpec): boolean {\n return fingerprintConnection(left) === fingerprintConnection(right);\n}\n\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly id = \"claude-code\" as const;\n readonly capabilities = {\n transports: [\"stdio\", \"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } 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 entry.type === \"http\"\n ? {\n transport: \"streamable-http\",\n url: entry.url,\n headers: entry.headers,\n }\n : {\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 {\n throw hostFailure(\"Claude Code user MCP configuration is invalid\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (spec.transport === \"stdio\" && Object.keys(spec.env).length) {\n throw invalidSpec();\n }\n const existing = await this.read(name, scope);\n if (existing) {\n if (sameSpec(existing.spec, spec)) return;\n throw conflict();\n }\n const args =\n spec.transport === \"streamable-http\"\n ? [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"http\",\n \"--scope\",\n \"user\",\n name,\n spec.url,\n ...Object.entries(spec.headers).flatMap(([key, value]) => [\n \"--header\",\n `${key}: ${value}`,\n ]),\n ]\n : [\"mcp\", \"add\", \"--scope\", scope, name, \"--\", spec.command, ...spec.args];\n let result: ProcessResult | undefined;\n try {\n result = await this.runner.run({ command: \"claude\", args, timeoutMs: 15_000 });\n } catch {\n // A failed invocation does not prove that Claude Code created an entry.\n }\n if (result?.exitCode === 0) return;\n const afterFailure = await this.read(name, scope);\n if (afterFailure && sameSpec(afterFailure.spec, spec)) {\n let rollback: ProcessResult | undefined;\n try {\n rollback = await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"remove\", \"--scope\", \"user\", name],\n timeoutMs: 15_000,\n });\n } catch {\n // Report an incomplete rollback without carrying a potentially sensitive cause.\n }\n if (!rollback || rollback.exitCode !== 0) {\n throw hostFailure(\"Claude Code add failed and rollback did not complete\");\n }\n }\n throw hostFailure(\"Claude Code failed to add the MCP server\");\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") throw invalidSpec();\n if (!(await this.read(name, scope))) return;\n let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"claude\",\n args: [\"mcp\", \"remove\", \"--scope\", scope, name],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Claude Code failed to remove the MCP server\");\n }\n if (\n result.exitCode !== 0 &&\n !/not found|does not exist|no mcp server/iu.test(result.stderr)\n ) {\n throw hostFailure(\"Claude Code failed to 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 | \"EXTERNAL_DEPENDENCY_MISSING\"\n | \"INVALID_RESPONSE\"\n | \"INTERNAL_ERROR\";\n\nexport type SkillErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"AUTH_REQUIRED\"\n | \"AUTH_EXPIRED\"\n | \"PERMISSION_DENIED\"\n | \"FILE_NOT_FOUND\"\n | \"FILE_TOO_LARGE\"\n | \"UNSUPPORTED_FILE_TYPE\"\n | \"DOCUMENT_IMPORT_DUPLICATE\"\n | \"DOCUMENT_TITLE_CONFLICT\"\n | \"DOCUMENT_NOT_FOUND\"\n | \"STALE_VERSION\"\n | \"NETWORK_UNREACHABLE\"\n | \"RATE_LIMITED\"\n | \"UPLOAD_FAILED\"\n | \"PROCESSING_FAILED\"\n | \"INSTALL_TICKET_EXPIRED\"\n | \"INSTALL_TARGET_CONFLICT\"\n | \"CLIENT_UPDATE_REQUIRED\"\n | \"PLATFORM_UNAVAILABLE\"\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 function toSkillErrorCode(code: CliErrorCode): SkillErrorCode {\n switch (code) {\n case \"AUTH_REQUIRED\":\n case \"PERMISSION_DENIED\":\n case \"NETWORK_UNREACHABLE\":\n case \"INVALID_ARGUMENT\":\n case \"MCP_FAILED\":\n case \"HOST_NOT_FOUND\":\n case \"HOST_CONFIG_FAILED\":\n case \"CONFIG_CONFLICT\":\n case \"DEPENDENCY_MISSING\":\n case \"INVALID_RESPONSE\":\n case \"INTERNAL_ERROR\":\n return code;\n case \"EXTERNAL_DEPENDENCY_MISSING\":\n return \"DEPENDENCY_MISSING\";\n case \"SERVICE_NOT_READY\":\n return \"PLATFORM_UNAVAILABLE\";\n case \"RESOURCE_NOT_FOUND\":\n return \"DOCUMENT_NOT_FOUND\";\n case \"DOCUMENT_NOT_READY\":\n return \"PROCESSING_FAILED\";\n default:\n return \"INTERNAL_ERROR\";\n }\n}\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 externalDependencyMissing: 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\" | \"workbuddy\";\nexport type PersonalAgentId = Exclude<AgentId, \"workbuddy\">;\nexport type AgentScope = \"user\";\n\nexport interface AgentCapabilities {\n transports: ReadonlyArray<McpConnectionSpec[\"transport\"]>;\n scopes: ReadonlyArray<AgentScope>;\n structuredRead: boolean;\n projectApproval: boolean;\n}\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 readonly capabilities: AgentCapabilities;\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\n/**\n * Host detection is deliberately best-effort: a missing Agent is not an\n * installation failure for the other user-level Skill targets.\n */\nexport async function isAgentInstalled(adapter: AgentAdapter): Promise<boolean> {\n try {\n await adapter.detect();\n return true;\n } catch {\n return false;\n }\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 {\n chmod,\n mkdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile,\n} 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 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.union([\n 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 z\n .object({\n type: z.enum([\"http\", \"streamable-http\", \"streamable_http\"]),\n url: z.string().url(),\n })\n .passthrough(),\n ]),\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\nexport interface CodexAdapterOptions {\n configPath?: string;\n}\n\nfunction invalidSpec(): CliError {\n return new CliError(\n \"INVALID_ARGUMENT\",\n \"The Codex adapter supports user-scoped stdio and HTTP MCP connections only\",\n {\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction headerTable(name: string): string {\n return `[mcp_servers.${tomlString(name)}.http_headers]`;\n}\n\nfunction skipTomlWhitespace(input: string, index: number): number {\n let cursor = index;\n while (input[cursor] === \" \" || input[cursor] === \"\\t\") cursor += 1;\n return cursor;\n}\n\nfunction parseTomlBasicKey(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n let cursor = start + 1;\n let value = \"\";\n while (cursor < input.length) {\n const current = input[cursor];\n if (current === '\"') return { value, next: cursor + 1 };\n if (current !== \"\\\\\") {\n if (current === undefined) return null;\n value += current;\n cursor += 1;\n continue;\n }\n const escaped = input[cursor + 1];\n const simple =\n escaped &&\n { b: \"\\b\", t: \"\\t\", n: \"\\n\", f: \"\\f\", r: \"\\r\", '\"': '\"', \"\\\\\": \"\\\\\" }[escaped];\n if (simple !== undefined) {\n value += simple;\n cursor += 2;\n continue;\n }\n const digits = escaped === \"u\" ? 4 : escaped === \"U\" ? 8 : 0;\n const encoded = input.slice(cursor + 2, cursor + 2 + digits);\n if (!digits || !/^[0-9A-Fa-f]+$/u.test(encoded)) return null;\n const codePoint = Number.parseInt(encoded, 16);\n if (codePoint > 0x10ffff) return null;\n value += String.fromCodePoint(codePoint);\n cursor += 2 + digits;\n }\n return null;\n}\n\nfunction parseTomlLiteralKey(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n const end = input.indexOf(\"'\", start + 1);\n return end === -1 ? null : { value: input.slice(start + 1, end), next: end + 1 };\n}\n\nfunction parseTomlString(\n input: string,\n start: number,\n): { value: string; next: number } | null {\n if (input[start] === '\"') return parseTomlBasicKey(input, start);\n if (input[start] === \"'\") return parseTomlLiteralKey(input, start);\n return null;\n}\n\nfunction parseTomlHeaderAssignment(\n line: string,\n): { key: string; value: string } | null {\n let cursor = skipTomlWhitespace(line, 0);\n const key = parseTomlString(line, cursor);\n const bareKey = /^[A-Za-z0-9_-]+/u.exec(line.slice(cursor));\n const parsedKey =\n key ?? (bareKey ? { value: bareKey[0], next: cursor + bareKey[0].length } : null);\n if (!parsedKey) return null;\n cursor = skipTomlWhitespace(line, parsedKey.next);\n if (line[cursor] !== \"=\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n const value = parseTomlString(line, cursor);\n if (!value) return null;\n cursor = skipTomlWhitespace(line, value.next);\n if (cursor !== line.length && line[cursor] !== \"#\") return null;\n return { key: parsedKey.value, value: value.value };\n}\n\nfunction parseTomlTablePath(line: string): string[] | null {\n let cursor = skipTomlWhitespace(line, 0);\n if (line[cursor] !== \"[\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n const segments: string[] = [];\n while (cursor < line.length) {\n const current = line[cursor];\n const quoted = parseTomlString(line, cursor);\n const bareKey = /^[A-Za-z0-9_-]+/u.exec(line.slice(cursor));\n const parsed =\n quoted ??\n (current === '\"' || current === \"'\" || !bareKey\n ? null\n : { value: bareKey[0], next: cursor + bareKey[0].length });\n if (!parsed) return null;\n segments.push(parsed.value);\n cursor = skipTomlWhitespace(line, parsed.next);\n if (line[cursor] === \"]\") {\n cursor = skipTomlWhitespace(line, cursor + 1);\n return cursor === line.length || line[cursor] === \"#\" ? segments : null;\n }\n if (line[cursor] !== \".\") return null;\n cursor = skipTomlWhitespace(line, cursor + 1);\n }\n return null;\n}\n\nfunction findHeaderTables(config: string, name: string): number[] {\n const target = [\"mcp_servers\", name, \"http_headers\"];\n return config.split(/\\r?\\n/u).flatMap((line, index) => {\n const path = parseTomlTablePath(line);\n return path &&\n path.length === target.length &&\n path.every((part, partIndex) => part === target[partIndex])\n ? [index]\n : [];\n });\n}\n\nfunction readHttpHeaders(config: string, name: string): Record<string, string> {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n const tableIndex = tables[0];\n if (tableIndex === undefined) return {};\n\n const lines = config.split(/\\r?\\n/u);\n const headers: Record<string, string> = {};\n const seenHeaderNames = new Set<string>();\n for (let index = tableIndex + 1; index < lines.length; index += 1) {\n const line = lines[index];\n if (line === undefined) break;\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n if (trimmed.startsWith(\"[\")) break;\n const assignment = parseTomlHeaderAssignment(trimmed);\n if (!assignment) {\n throw new Error(\"The targeted Codex HTTP header table is invalid\");\n }\n const normalizedKey = assignment.key.toLowerCase();\n if (seenHeaderNames.has(normalizedKey)) {\n throw new Error(\"The targeted Codex HTTP header table has duplicate headers\");\n }\n seenHeaderNames.add(normalizedKey);\n headers[assignment.key] = assignment.value;\n }\n return headers;\n}\n\nfunction sameHeaders(\n left: Record<string, string>,\n right: Record<string, string>,\n): boolean {\n const leftEntries = Object.entries(left).sort(([leftKey], [rightKey]) =>\n leftKey.localeCompare(rightKey),\n );\n const rightEntries = Object.entries(right).sort(([leftKey], [rightKey]) =>\n leftKey.localeCompare(rightKey),\n );\n return JSON.stringify(leftEntries) === JSON.stringify(rightEntries);\n}\n\nfunction appendHeaderTable(\n config: string,\n name: string,\n headers: Record<string, string>,\n): string {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n if (tables.length === 1) {\n if (!sameHeaders(readHttpHeaders(config, name), headers)) {\n throw new Error(\n \"The targeted Codex HTTP header table already has different values\",\n );\n }\n return config;\n }\n const entries = Object.entries(headers)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${tomlString(key)} = ${tomlString(value)}`);\n return `${config}${config.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\"}${headerTable(name)}\\n${entries.join(\"\\n\")}\\n`;\n}\n\nfunction removeHeaderTable(config: string, name: string): string {\n const tables = findHeaderTables(config, name);\n if (tables.length > 1) {\n throw new Error(\"The targeted Codex HTTP header table is ambiguous\");\n }\n const tableIndex = tables[0];\n if (tableIndex === undefined) return config;\n\n const lines = config.split(/\\r?\\n/u);\n let end = tableIndex + 1;\n while (end < lines.length && !lines[end]?.trimStart().startsWith(\"[\")) end += 1;\n lines.splice(tableIndex, end - tableIndex);\n return lines.join(\"\\n\");\n}\n\nasync function atomicWrite(filePath: string, contents: string): Promise<void> {\n const directory = path.dirname(filePath);\n let mode = 0o600;\n try {\n mode = (await stat(filePath)).mode & 0o600;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"ENOENT\") throw cause;\n }\n await mkdir(directory, { recursive: true });\n const temporaryPath = path.join(\n directory,\n `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, contents, { encoding: \"utf8\", mode: 0o600 });\n await rename(temporaryPath, filePath);\n await chmod(filePath, mode);\n } catch (cause) {\n await unlink(temporaryPath).catch(() => undefined);\n throw cause;\n }\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"Run `codex mcp list` to inspect the current Codex MCP configuration.\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"The Codex MCP entry is already owned by a different configuration\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"Choose another MCP server name or remove the existing user-owned entry.\",\n },\n );\n}\n\nfunction sameSpec(left: McpConnectionSpec, right: McpConnectionSpec): boolean {\n return fingerprintValue(left) === fingerprintValue(right);\n}\n\nfunction matchesCreatedHttpEntry(\n connection: AgentConnection | null,\n spec: McpConnectionSpec,\n): boolean {\n return (\n connection?.spec.transport === \"streamable-http\" &&\n spec.transport === \"streamable-http\" &&\n connection.spec.url === spec.url\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 readonly capabilities = {\n transports: [\"stdio\", \"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } as const;\n\n private readonly configPath: string;\n\n constructor(\n private readonly runner: ProcessRunner,\n options: CodexAdapterOptions = {},\n ) {\n this.configPath =\n options.configPath ?? path.join(os.homedir(), \".codex\", \"config.toml\");\n }\n\n async #readConfig(): Promise<string> {\n try {\n return await readFile(this.configPath, \"utf8\");\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") return \"\";\n throw cause;\n }\n }\n\n async #rollbackAddedHttpEntry(name: string): Promise<void> {\n try {\n const result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"remove\", name],\n timeoutMs: 15_000,\n });\n if (result.exitCode !== 0) {\n throw hostFailure(\"Codex rollback did not complete\");\n }\n } catch {\n throw hostFailure(\"Codex rollback did not complete\");\n }\n }\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 let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"get\", name, \"--json\"],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Codex failed to read the MCP configuration\");\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 entry.transport.type === \"stdio\"\n ? {\n transport: \"stdio\",\n command: entry.transport.command,\n args: entry.transport.args ?? [],\n env: entry.transport.env ?? {},\n }\n : {\n transport: \"streamable-http\",\n url: entry.transport.url,\n headers: readHttpHeaders(await this.#readConfig(), name),\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(\n spec.transport === \"streamable-http\"\n ? { ...configuration, http_headers: spec.headers }\n : configuration,\n ),\n };\n } catch {\n throw hostFailure(\"Codex returned an invalid MCP configuration\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (spec.transport === \"stdio\" && Object.keys(spec.env).length) {\n throw invalidSpec();\n }\n const existing = await this.read(name, scope);\n if (existing) {\n if (sameSpec(existing.spec, spec)) return;\n throw conflict();\n }\n if (spec.transport === \"stdio\") {\n try {\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 } catch {\n throw hostFailure(\"Codex failed to add the MCP server\");\n }\n return;\n }\n\n let result: ProcessResult | undefined;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"add\", name, \"--url\", spec.url],\n timeoutMs: 15_000,\n });\n } catch {\n // A failed invocation does not prove that Codex created an entry.\n }\n if (!result || result.exitCode !== 0) {\n const afterFailure = await this.read(name, scope);\n if (matchesCreatedHttpEntry(afterFailure, spec)) {\n try {\n await this.#rollbackAddedHttpEntry(name);\n } catch {\n throw hostFailure(\"Codex add failed and rollback did not complete\");\n }\n }\n throw hostFailure(\"Codex failed to add the MCP server\");\n }\n try {\n await atomicWrite(\n this.configPath,\n appendHeaderTable(await this.#readConfig(), name, spec.headers),\n );\n } catch {\n try {\n await this.#rollbackAddedHttpEntry(name);\n } catch {\n throw hostFailure(\n \"Codex HTTP header persistence failed and rollback did not complete\",\n );\n }\n throw hostFailure(\n \"Codex HTTP header persistence failed; changes were rolled back\",\n );\n }\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") {\n throw invalidSpec();\n }\n if (!(await this.read(name, scope))) return;\n let result: ProcessResult;\n try {\n result = await this.runner.run({\n command: \"codex\",\n args: [\"mcp\", \"remove\", name],\n timeoutMs: 15_000,\n });\n } catch {\n throw hostFailure(\"Codex failed to remove the MCP server\");\n }\n if (\n result.exitCode !== 0 &&\n !/not found|does not exist|no mcp server/iu.test(result.stderr)\n ) {\n throw hostFailure(\"Codex failed to remove the MCP server\");\n }\n try {\n const config = await this.#readConfig();\n const next = removeHeaderTable(config, name);\n if (next !== config) await atomicWrite(this.configPath, next);\n } catch {\n throw hostFailure(\"Codex MCP removal left an unresolved HTTP header table\");\n }\n }\n}\n","import { chmod, readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { McpConnectionSpec } from \"../mcp/connection.js\";\nimport {\n fingerprintConnection,\n type AgentAdapter,\n type AgentConnection,\n type AgentInstallation,\n type AgentScope,\n} from \"./adapter.js\";\n\nconst workBuddyConfigSchema = z\n .object({ mcpServers: z.record(z.string(), z.unknown()).optional() })\n .passthrough();\n\nconst workBuddyHttpEntrySchema = z.object({\n type: z.literal(\"http\"),\n transport: z.literal(\"streamable_http\"),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()),\n});\n\nexport interface WorkBuddyAdapterOptions {\n configDir?: string;\n}\n\nfunction invalidSpec(): CliError {\n return new CliError(\"INVALID_ARGUMENT\", \"WorkBuddy 仅支持用户级 HTTP MCP 连接\", {\n exitCode: exitCodes.invalidArgument,\n });\n}\n\nfunction hostNotFound(cause?: unknown): CliError {\n return new CliError(\"HOST_NOT_FOUND\", \"找不到 WorkBuddy 用户配置\", {\n exitCode: exitCodes.hostNotFound,\n ...(cause ? { cause } : {}),\n hint: \"请先启动一次 WorkBuddy,以创建用户配置目录。\",\n });\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"请检查 WorkBuddy 用户 MCP 配置后重新执行命令。\",\n });\n}\n\nfunction conflict(): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"同名 WorkBuddy MCP 已由其他配置管理\", {\n exitCode: exitCodes.configConflict,\n hint: \"请选择其他 MCP 名称,或先移除现有的用户配置。\",\n });\n}\n\nfunction changedConfigConflict(): CliError {\n return new CliError(\n \"CONFIG_CONFLICT\",\n \"WorkBuddy MCP 配置在本次操作期间已被其他程序修改\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"请检查 WorkBuddy 的 mcp.json,并重新执行命令。\",\n },\n );\n}\n\nexport class WorkBuddyAdapter implements AgentAdapter {\n readonly id = \"workbuddy\" as const;\n readonly capabilities = {\n transports: [\"streamable-http\"],\n scopes: [\"user\"],\n structuredRead: true,\n projectApproval: false,\n } as const;\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor(options: WorkBuddyAdapterOptions = {}) {\n this.configDir = options.configDir ?? path.join(os.homedir(), \".workbuddy\");\n this.configPath = path.join(this.configDir, \"mcp.json\");\n }\n\n async #ensureConfigDirectory(): Promise<void> {\n try {\n if (!(await stat(this.configDir)).isDirectory())\n throw new Error(\"not a directory\");\n } catch (cause) {\n throw hostNotFound(cause);\n }\n }\n\n async #readConfig(): Promise<{\n config: Record<string, unknown>;\n raw: string;\n }> {\n await this.#ensureConfigDirectory();\n let raw: string;\n try {\n raw = await readFile(this.configPath, \"utf8\");\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") throw hostNotFound(cause);\n throw hostFailure(\"无法读取 WorkBuddy 用户 MCP 配置\");\n }\n try {\n return { config: workBuddyConfigSchema.parse(JSON.parse(raw)), raw };\n } catch {\n throw hostFailure(\"WorkBuddy 用户 MCP 配置无效\");\n }\n }\n\n async #writeConfig(\n config: Record<string, unknown>,\n originalRaw: string,\n ): Promise<void> {\n await this.#ensureConfigDirectory();\n const temporaryPath = path.join(\n this.configDir,\n `.${path.basename(this.configPath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(this.configPath, {\n realpath: false,\n retries: { retries: 40, factor: 1, minTimeout: 10, maxTimeout: 25 },\n });\n if ((await readFile(this.configPath, \"utf8\")) !== originalRaw) {\n throw changedConfigConflict();\n }\n await writeFile(temporaryPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await rename(temporaryPath, this.configPath);\n await chmod(this.configPath, 0o600);\n } catch (cause) {\n await unlink(temporaryPath).catch(() => undefined);\n if (cause instanceof CliError) throw cause;\n throw hostFailure(\"无法写入 WorkBuddy 用户 MCP 配置\");\n } finally {\n await release?.().catch(() => undefined);\n }\n }\n\n async detect(): Promise<AgentInstallation> {\n await this.#readConfig();\n return { id: this.id, version: \"configured\" };\n }\n\n async read(name: string, scope: AgentScope): Promise<AgentConnection | null> {\n if (scope !== \"user\") throw invalidSpec();\n const { config } = await this.#readConfig();\n const mcpServers = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n const rawEntry = mcpServers[name];\n if (!rawEntry) return null;\n try {\n const entry = workBuddyHttpEntrySchema.parse(rawEntry);\n const spec: McpConnectionSpec = {\n transport: \"streamable-http\",\n url: entry.url,\n headers: entry.headers,\n };\n return {\n agent: this.id,\n name,\n scope,\n spec,\n fingerprint: fingerprintConnection(spec),\n };\n } catch {\n throw hostFailure(\"WorkBuddy MCP 配置项无效\");\n }\n }\n\n async add(name: string, scope: AgentScope, spec: McpConnectionSpec): Promise<void> {\n if (scope !== \"user\" || spec.transport !== \"streamable-http\") throw invalidSpec();\n const { config, raw } = await this.#readConfig();\n const current = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n const nextEntry = {\n type: \"http\" as const,\n transport: \"streamable_http\" as const,\n url: spec.url,\n headers: spec.headers,\n };\n if (name in current) {\n try {\n const existing = workBuddyHttpEntrySchema.parse(current[name]);\n const existingSpec: McpConnectionSpec = {\n transport: \"streamable-http\",\n url: existing.url,\n headers: existing.headers,\n };\n if (fingerprintConnection(existingSpec) === fingerprintConnection(spec)) return;\n } catch {\n // A non-HTTP or unrecognized same-name entry is user-owned too.\n }\n throw conflict();\n }\n await this.#writeConfig(\n {\n ...config,\n mcpServers: { ...current, [name]: nextEntry },\n },\n raw,\n );\n }\n\n async remove(name: string, scope: AgentScope): Promise<void> {\n if (scope !== \"user\") throw invalidSpec();\n const { config, raw } = await this.#readConfig();\n const current = workBuddyConfigSchema.parse(config).mcpServers ?? {};\n if (!(name in current)) return;\n const remaining = Object.fromEntries(\n Object.entries(current).filter(([serverName]) => serverName !== name),\n );\n await this.#writeConfig({ ...config, mcpServers: remaining }, raw);\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\nexport const defaultEnterpriseMcpConnectionsPath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-connections.yaml\");\n\nexport const defaultEnterpriseMcpManagedStatePath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-managed-state.yaml\");\n\nexport const defaultEnterpriseMcpCredentialsPath = (\n options: ConfigPathOptions = {},\n): string =>\n path.join(path.dirname(defaultConfigPath(options)), \"mcp-credentials.json\");\n\nexport const defaultSkillStatePath = (options: ConfigPathOptions = {}): string =>\n path.join(options.homeDirectory ?? os.homedir(), \".sag\", \"skill\", \"state.json\");\n\nexport const defaultSkillAccountConfigPath = (\n options: ConfigPathOptions = {},\n): string => path.join(options.homeDirectory ?? os.homedir(), \".sag\", \"config.json\");\n","import { randomUUID } from \"node:crypto\";\nimport { chmod, lstat, mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { CredentialStore } from \"./store.js\";\n\nconst credentialStateSchema = z.strictObject({\n version: z.literal(1),\n credentials: z.record(z.string().min(1), z.string()),\n});\n\ntype FileCredentialState = z.infer<typeof credentialStateSchema>;\n\nfunction emptyState(): FileCredentialState {\n return { version: 1, credentials: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 凭据状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction busyState(cause: unknown): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 凭据状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n}\n\nexport class FileCredentialStore implements CredentialStore {\n readonly kind = \"file\" as const;\n\n constructor(readonly filePath: string) {}\n\n async #secureExistingFile(): Promise<void> {\n try {\n const target = await lstat(this.filePath);\n if (!target.isFile() || target.isSymbolicLink()) {\n throw invalidState(new Error(\"凭据目标不是普通文件\"), this.filePath);\n }\n await chmod(this.filePath, 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async #withLock<T>(operation: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let release: () => Promise<void>;\n try {\n release = await lock(this.filePath, { realpath: false, retries: 0 });\n } catch (cause) {\n throw busyState(cause);\n }\n try {\n await this.#secureExistingFile();\n return await operation();\n } finally {\n await release();\n }\n }\n\n async #load(): Promise<FileCredentialState> {\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 credentialStateSchema.parse(JSON.parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #save(state: FileCredentialState): Promise<void> {\n let validated: FileCredentialState;\n try {\n validated = credentialStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n const directory = path.dirname(this.filePath);\n const temporaryPath = path.join(\n directory,\n `.${path.basename(this.filePath)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw busyState(error);\n }\n throw error;\n }\n }\n\n async get(reference: string): Promise<string | null> {\n return this.#withLock(\n async () => (await this.#load()).credentials[reference] ?? null,\n );\n }\n\n async set(reference: string, value: string): Promise<void> {\n await this.#withLock(async () => {\n const state = await this.#load();\n state.credentials[reference] = value;\n await this.#save(state);\n });\n }\n\n async delete(reference: string): Promise<boolean> {\n return this.#withLock(async () => {\n const state = await this.#load();\n if (!(reference in state.credentials)) {\n return false;\n }\n delete state.credentials[reference];\n await this.#save(state);\n return true;\n });\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<boolean> {\n return this.#values.delete(reference);\n }\n}\n","export const PERSONAL_SERVICE_NAME = \"@zleap-ai/sag-cli\";\nexport const ENTERPRISE_MCP_SERVICE_NAME = \"@zleap-ai/sag-cli/enterprise-mcp\";\n","import type { CredentialStore } from \"./store.js\";\nimport { MemoryCredentialStore } from \"./memory.js\";\nimport { ENTERPRISE_MCP_SERVICE_NAME, PERSONAL_SERVICE_NAME } from \"./namespaces.js\";\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(\n private readonly entryFactory: KeyringEntryFactory,\n readonly serviceName = PERSONAL_SERVICE_NAME,\n ) {}\n\n async get(reference: string): Promise<string | null> {\n return this.entryFactory(this.serviceName, reference).getPassword();\n }\n\n async set(reference: string, value: string): Promise<void> {\n this.entryFactory(this.serviceName, reference).setPassword(value);\n }\n\n async delete(reference: string): Promise<boolean> {\n return this.entryFactory(this.serviceName, 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 async function createEnterpriseKeychainCredentialStore(): Promise<KeychainCredentialStore> {\n const { Entry } = await import(\"@napi-rs/keyring\");\n return new KeychainCredentialStore(\n (service, account) => new Entry(service, account),\n ENTERPRISE_MCP_SERVICE_NAME,\n );\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 { CliError, exitCodes } from \"../core/errors.js\";\n\ninterface RawTtyInput {\n isTTY?: boolean;\n isRaw?: boolean;\n setEncoding(encoding: BufferEncoding): void;\n setRawMode(value: boolean): unknown;\n pause(): unknown;\n resume(): unknown;\n on(event: \"data\", listener: (chunk: string) => void): unknown;\n on(event: \"error\", listener: (cause: Error) => void): unknown;\n removeListener(event: \"data\", listener: (chunk: string) => void): unknown;\n removeListener(event: \"error\", listener: (cause: Error) => void): unknown;\n}\n\nexport interface InteractiveMcpJsonInput {\n input: RawTtyInput;\n writeStderr(value: string): void;\n}\n\nfunction inputFailure(message: string, hint: string): CliError {\n return new CliError(\"INVALID_ARGUMENT\", message, {\n exitCode: exitCodes.invalidArgument,\n hint,\n });\n}\n\nexport function readInteractiveMcpJson(\n options: InteractiveMcpJsonInput,\n): Promise<string> {\n if (!options.input.isTTY) {\n throw inputFailure(\n \"交互式输入 MCP 连接信息需要终端支持\",\n \"请通过管道传入平台生成的 JSON,并使用 `sag mcp connect --from-stdin`。\",\n );\n }\n\n const previousRawMode = options.input.isRaw ?? false;\n options.input.setEncoding(\"utf8\");\n options.input.setRawMode(true);\n options.input.resume();\n options.writeStderr(\n \"请粘贴完整的 mcpServers JSON。输入内容不会显示;JSON 完整后 sag 会自动继续。如需提交格式不完整的内容以查看错误,请按 Ctrl-D;取消请按 Ctrl-C。\\n\",\n );\n\n return new Promise((resolve, reject) => {\n let buffer = \"\";\n let settled = false;\n\n const cleanup = () => {\n options.input.removeListener(\"data\", onData);\n options.input.removeListener(\"error\", onError);\n options.input.setRawMode(previousRawMode);\n options.input.pause();\n };\n const finish = (value: string) => {\n if (settled) return;\n settled = true;\n cleanup();\n options.writeStderr(\"已收到连接 JSON,正在验证 MCP……\\n\");\n resolve(value);\n };\n const fail = (cause: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(cause);\n };\n const onError = (cause: unknown) => fail(cause);\n const onData = (chunk: string) => {\n if (chunk.includes(\"\\u0003\")) {\n fail(\n inputFailure(\n \"已取消输入企业版 MCP 连接信息\",\n \"准备好后,请重新运行 `sag mcp connect`。\",\n ),\n );\n return;\n }\n const submitAt = chunk.indexOf(\"\\u0004\");\n buffer += submitAt >= 0 ? chunk.slice(0, submitAt) : chunk;\n if (submitAt >= 0) {\n finish(buffer);\n return;\n }\n try {\n JSON.parse(buffer);\n finish(buffer);\n } catch {\n // A pasted multi-line JSON document is incomplete until its final chunk.\n }\n };\n\n options.input.on(\"data\", onData);\n options.input.on(\"error\", onError);\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 type { EnterpriseMcpMutationReceipt } from \"./store.js\";\n\nconst agentManagedStateSchema = z.strictObject({\n id: z.string().min(1),\n connectionId: z.string().min(1),\n fingerprint: z.string().min(1),\n updatedAt: z.string().min(1),\n});\n\nconst skillManagedStateSchema = z.strictObject({\n id: z.string().min(1),\n fingerprint: z.string().min(1),\n backupPath: z.string().min(1),\n updatedAt: z.string().min(1),\n});\n\nconst enterpriseMcpManagedStateSchema = z.strictObject({\n version: z.literal(1),\n agents: z.record(z.string().min(1), agentManagedStateSchema),\n skills: z.record(z.string().min(1), skillManagedStateSchema),\n});\n\nexport type EnterpriseMcpAgentManagedState = z.infer<typeof agentManagedStateSchema>;\nexport type EnterpriseMcpSkillManagedState = z.infer<typeof skillManagedStateSchema>;\nexport type EnterpriseMcpManagedState = z.infer<typeof enterpriseMcpManagedStateSchema>;\n\nfunction emptyState(): EnterpriseMcpManagedState {\n return { version: 1, agents: {}, skills: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 受管状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction receiptFor(\n state: EnterpriseMcpManagedState,\n): EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState> {\n return { previous: structuredClone(state) };\n}\n\nexport class EnterpriseMcpManagedStateStore {\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, { realpath: false, retries: 0 });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 受管状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<EnterpriseMcpManagedState> {\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 enterpriseMcpManagedStateSchema.parse(parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #saveUnlocked(state: EnterpriseMcpManagedState): Promise<void> {\n let validated: EnterpriseMcpManagedState;\n try {\n validated = enterpriseMcpManagedStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\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 getAgent(id: string): Promise<EnterpriseMcpAgentManagedState | null> {\n return (await this.load()).agents[id] ?? null;\n }\n\n async setAgent(\n agent: EnterpriseMcpAgentManagedState,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n let validated: EnterpriseMcpAgentManagedState;\n try {\n validated = agentManagedStateSchema.parse(agent);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.agents[validated.id] = validated;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async deleteAgent(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n delete state.agents[id];\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async listAgents(): Promise<EnterpriseMcpAgentManagedState[]> {\n return Object.values((await this.load()).agents).sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n async getSkill(id: string): Promise<EnterpriseMcpSkillManagedState | null> {\n return (await this.load()).skills[id] ?? null;\n }\n\n async setSkill(\n skill: EnterpriseMcpSkillManagedState,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n let validated: EnterpriseMcpSkillManagedState;\n try {\n validated = skillManagedStateSchema.parse(skill);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.skills[validated.id] = validated;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async deleteSkill(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n delete state.skills[id];\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async listSkills(): Promise<EnterpriseMcpSkillManagedState[]> {\n return Object.values((await this.load()).skills).sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n async restore(\n receipt: EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpManagedState>> {\n return this.#withLock(async () => {\n const currentState = await this.load();\n const restoreReceipt = receiptFor(currentState);\n await this.#saveUnlocked(receipt.previous);\n return restoreReceipt;\n });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } 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 type { EnterpriseMcpConnection } from \"./model.js\";\n\nconst toolRiskSummarySchema = z.strictObject({\n readOnly: z.number().int().nonnegative(),\n write: z.number().int().nonnegative(),\n destructive: z.number().int().nonnegative(),\n unknown: z.number().int().nonnegative(),\n hasWarning: z.boolean(),\n});\n\nconst enterpriseMcpConnectionSchema = z\n .strictObject({\n id: z.string().min(1),\n serverKey: z.string().min(1),\n preferredId: z.string().min(1),\n transport: z.literal(\"streamable-http\"),\n url: z.string().url(),\n headerNames: z.array(z.string().min(1)),\n credentialStore: z.enum([\"keychain\", \"file\"]),\n credentialRef: z.string().min(1),\n toolSnapshot: z.strictObject({\n count: z.number().int().nonnegative(),\n fingerprint: z.string().min(1),\n risk: toolRiskSummarySchema,\n observedAt: z.string().min(1),\n }),\n createdAt: z.string().min(1),\n updatedAt: z.string().min(1),\n lastVerifiedAt: z.string().min(1).optional(),\n })\n .superRefine((connection, context) => {\n if (connection.credentialRef !== `enterprise-mcp/${connection.id}`) {\n context.addIssue({\n code: \"custom\",\n message: \"企业 MCP 凭据引用与连接名称不一致。\",\n path: [\"credentialRef\"],\n });\n }\n });\n\nconst enterpriseMcpConnectionStateSchema = z\n .strictObject({\n version: z.literal(1),\n activeId: z.string().min(1).optional(),\n connections: z.record(z.string().min(1), enterpriseMcpConnectionSchema),\n })\n .superRefine((state, context) => {\n if (state.activeId && !state.connections[state.activeId]) {\n context.addIssue({\n code: \"custom\",\n message: \"当前使用的企业 MCP 连接不存在。\",\n path: [\"activeId\"],\n });\n }\n });\n\nexport type EnterpriseMcpConnectionState = z.infer<\n typeof enterpriseMcpConnectionStateSchema\n>;\n\nexport interface EnterpriseMcpMutationReceipt<State> {\n previous: State;\n}\n\nfunction emptyState(): EnterpriseMcpConnectionState {\n return { version: 1, connections: {} };\n}\n\nfunction invalidState(cause: unknown, filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 连接状态无效\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: `请检查或恢复 ${filePath}。`,\n });\n}\n\nfunction receiptFor(\n state: EnterpriseMcpConnectionState,\n): EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState> {\n return { previous: structuredClone(state) };\n}\n\nfunction toConnection(\n connection: z.infer<typeof enterpriseMcpConnectionSchema>,\n): EnterpriseMcpConnection {\n return {\n id: connection.id,\n serverKey: connection.serverKey,\n preferredId: connection.preferredId,\n transport: connection.transport,\n url: connection.url,\n headerNames: connection.headerNames,\n credentialStore: connection.credentialStore,\n credentialRef: connection.credentialRef,\n toolSnapshot: connection.toolSnapshot,\n createdAt: connection.createdAt,\n updatedAt: connection.updatedAt,\n ...(connection.lastVerifiedAt === undefined\n ? {}\n : { lastVerifiedAt: connection.lastVerifiedAt }),\n };\n}\n\nexport class EnterpriseMcpConnectionStore {\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>;\n try {\n release = await lock(this.filePath, { realpath: false, retries: 0 });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 连接状态正被其他命令使用\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async withPersistenceLock<T>(operation: () => Promise<T>): Promise<T> {\n await mkdir(path.dirname(this.filePath), { recursive: true });\n const operationPath = `${this.filePath}.operation`;\n let release: () => Promise<void>;\n try {\n release = await lock(operationPath, {\n realpath: false,\n retries: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch (cause) {\n throw new CliError(\"CONFIG_CONFLICT\", \"企业 MCP 持久化操作正忙\", {\n exitCode: exitCodes.configConflict,\n cause,\n hint: \"请等待其他 SAG CLI 企业 MCP 命令完成后重试。\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<EnterpriseMcpConnectionState> {\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 enterpriseMcpConnectionStateSchema.parse(parse(raw));\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n }\n\n async #saveUnlocked(state: EnterpriseMcpConnectionState): Promise<void> {\n let validated: EnterpriseMcpConnectionState;\n try {\n validated = enterpriseMcpConnectionStateSchema.parse(state);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async list(): Promise<EnterpriseMcpConnection[]> {\n return Object.values((await this.load()).connections)\n .sort((left, right) => left.id.localeCompare(right.id))\n .map(toConnection);\n }\n\n async get(id: string): Promise<EnterpriseMcpConnection | null> {\n const connection = (await this.load()).connections[id];\n return connection ? toConnection(connection) : null;\n }\n\n async active(): Promise<EnterpriseMcpConnection | null> {\n const state = await this.load();\n const connection = state.activeId ? state.connections[state.activeId] : undefined;\n return connection ? toConnection(connection) : null;\n }\n\n async upsert(\n connection: EnterpriseMcpConnection,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n let validated: z.infer<typeof enterpriseMcpConnectionSchema>;\n try {\n validated = enterpriseMcpConnectionSchema.parse(connection);\n } catch (cause) {\n throw invalidState(cause, this.filePath);\n }\n return this.#withLock(async () => {\n const state = await this.load();\n const receipt = receiptFor(state);\n state.connections[validated.id] = validated;\n state.activeId ??= validated.id;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async restore(\n receipt: EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const currentState = await this.load();\n const restoreReceipt = receiptFor(currentState);\n await this.#saveUnlocked(receipt.previous);\n return restoreReceipt;\n });\n }\n\n async use(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n if (!state.connections[id]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n const receipt = receiptFor(state);\n state.activeId = id;\n await this.#saveUnlocked(state);\n return receipt;\n });\n }\n\n async remove(\n id: string,\n ): Promise<EnterpriseMcpMutationReceipt<EnterpriseMcpConnectionState>> {\n return this.#withLock(async () => {\n const state = await this.load();\n if (!state.connections[id]) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n const receipt = receiptFor(state);\n delete state.connections[id];\n if (state.activeId === id) {\n state.activeId = Object.keys(state.connections).sort()[0];\n if (!state.activeId) {\n delete state.activeId;\n }\n }\n await this.#saveUnlocked(state);\n return receipt;\n });\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 {\n HttpMcpConnectionSpec,\n McpConnectionSpec,\n StdioMcpConnectionSpec,\n} from \"./connection.js\";\nimport { localMcpFailure } from \"./failure.js\";\nimport {\n closeHttpMcpClient,\n createHttpMcpTransport,\n sessionCleanupTimeoutMs,\n} from \"./commands.js\";\nimport {\n toMcpToolSummary,\n type McpToolSummary,\n type ToolRiskSummary,\n} from \"./enterprise/model.js\";\nimport { classifyTools } from \"./enterprise/risk.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\ninterface McpVerificationBase {\n era: \"modern\" | \"legacy\";\n protocolVersion: string;\n server?: {\n name: string;\n version: string;\n };\n}\n\nexport type McpVerificationReport =\n | (McpVerificationBase & {\n transport: \"stdio\";\n tools: string[];\n missingTools: string[];\n listSourcesCallable: boolean;\n })\n | (McpVerificationBase & {\n transport: \"streamable-http\";\n url: string;\n tools: McpToolSummary[];\n toolCount: number;\n risk: ToolRiskSummary;\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 === \"streamable-http\") {\n return this.verifyHttp(spec, options);\n }\n return this.verifyStdio(spec, options);\n }\n\n private createClient(probeTimeoutMs: number): Client {\n return new Client(\n {\n name: \"@zleap-ai/sag-cli\",\n version: this.cliVersion,\n },\n {\n versionNegotiation: {\n mode: \"auto\",\n probe: {\n timeoutMs: probeTimeoutMs,\n maxRetries: 0,\n },\n },\n },\n );\n }\n\n private async verifyStdio(\n spec: StdioMcpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport> {\n const client = this.createClient(Math.min(options.timeoutMs, 250));\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 private async verifyHttp(\n spec: HttpMcpConnectionSpec,\n options: McpVerifyOptions,\n ): Promise<McpVerificationReport> {\n const client = this.createClient(Math.min(options.timeoutMs, 250));\n const transport = createHttpMcpTransport(\n spec,\n sessionCleanupTimeoutMs(options.timeoutMs),\n );\n let report: McpVerificationReport | undefined;\n let primaryFailure = false;\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 new Error(\"MCP protocol negotiation returned no version\");\n }\n const listed = await client.listTools(undefined, {\n timeout: options.timeoutMs,\n cacheMode: \"refresh\",\n });\n const tools: McpToolSummary[] = listed.tools.map(toMcpToolSummary);\n const server = client.getServerVersion();\n report = {\n transport: \"streamable-http\",\n url: spec.url,\n era,\n protocolVersion,\n ...(server ? { server } : {}),\n tools,\n toolCount: tools.length,\n risk: classifyTools(tools),\n };\n } catch {\n primaryFailure = true;\n }\n let cleanupFailure: unknown;\n try {\n await closeHttpMcpClient(client, transport);\n } catch (cause) {\n cleanupFailure = cause;\n }\n if (primaryFailure) {\n throw new CliError(\"MCP_FAILED\", \"无法验证企业版 HTTP MCP\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查 MCP 地址和 AccessKey 后重试。\",\n });\n }\n if (cleanupFailure) {\n throw cleanupFailure;\n }\n return report as McpVerificationReport;\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 { Client, StreamableHTTPClientTransport } from \"@modelcontextprotocol/client\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"./connection.js\";\n\nexport interface HttpMcpCommandOptions {\n cliVersion: string;\n timeoutMs: number;\n}\n\nexport interface HttpMcpToolCallInput extends HttpMcpCommandOptions {\n spec: HttpMcpConnectionSpec;\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n}\n\nconst MIN_SESSION_CLEANUP_TIMEOUT_MS = 50;\nconst MAX_SESSION_CLEANUP_TIMEOUT_MS = 250;\n\nfunction mcpFailure(): CliError {\n return new CliError(\"MCP_FAILED\", \"无法与企业 HTTP MCP 通信\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查已导入的 MCP 地址和访问密钥后重试。\",\n });\n}\n\nfunction createClient(cliVersion: string): Client {\n return new Client(\n { name: \"@zleap-ai/sag-cli\", version: cliVersion },\n {\n versionNegotiation: {\n mode: \"auto\",\n probe: { timeoutMs: 250, maxRetries: 0 },\n },\n },\n );\n}\n\nexport function createHttpMcpTransport(\n spec: HttpMcpConnectionSpec,\n cleanupTimeoutMs = MAX_SESSION_CLEANUP_TIMEOUT_MS,\n): StreamableHTTPClientTransport {\n return new StreamableHTTPClientTransport(new URL(spec.url), {\n fetch: async (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, name) => headers.set(name, value));\n for (const [name, value] of Object.entries(spec.headers)) {\n headers.set(name, value);\n }\n const method = init?.method ?? (input instanceof Request ? input.method : \"GET\");\n return fetch(input, {\n ...init,\n headers,\n ...(method.toUpperCase() === \"DELETE\"\n ? { signal: AbortSignal.timeout(cleanupTimeoutMs) }\n : {}),\n });\n },\n });\n}\n\nexport function sessionCleanupTimeoutMs(operationTimeoutMs: number): number {\n return Math.min(\n Math.max(operationTimeoutMs, MIN_SESSION_CLEANUP_TIMEOUT_MS),\n MAX_SESSION_CLEANUP_TIMEOUT_MS,\n );\n}\n\nexport async function closeHttpMcpClient(\n client: Client,\n transport: StreamableHTTPClientTransport,\n): Promise<void> {\n if (transport.sessionId) {\n await transport.terminateSession().catch(() => undefined);\n }\n await client.close().catch(() => undefined);\n}\n\nasync function withHttpMcpClient<T>(\n spec: HttpMcpConnectionSpec,\n options: HttpMcpCommandOptions,\n action: (client: Client) => Promise<T>,\n): Promise<T> {\n const client = createClient(options.cliVersion);\n const transport = createHttpMcpTransport(\n spec,\n sessionCleanupTimeoutMs(options.timeoutMs),\n );\n let result: T | undefined;\n let primaryFailure: unknown;\n let hasPrimaryFailure = false;\n try {\n await client.connect(transport, { timeout: options.timeoutMs });\n result = await action(client);\n } catch (cause) {\n hasPrimaryFailure = true;\n primaryFailure = cause;\n }\n let cleanupFailure: unknown;\n try {\n await closeHttpMcpClient(client, transport);\n } catch (cause) {\n cleanupFailure = cause;\n }\n if (hasPrimaryFailure) {\n if (primaryFailure instanceof CliError) {\n throw primaryFailure;\n }\n throw mcpFailure();\n }\n if (cleanupFailure) {\n throw cleanupFailure;\n }\n return result as T;\n}\n\nexport async function listHttpMcpTools(\n spec: HttpMcpConnectionSpec,\n options: HttpMcpCommandOptions,\n) {\n return withHttpMcpClient(spec, options, (client) =>\n client.listTools(undefined, { timeout: options.timeoutMs, cacheMode: \"refresh\" }),\n );\n}\n\nexport async function callHttpMcpTool(input: HttpMcpToolCallInput) {\n return withHttpMcpClient(input.spec, input, async (client) => {\n const listed = await client.listTools(undefined, {\n timeout: input.timeoutMs,\n cacheMode: \"refresh\",\n });\n const tool = listed.tools.find((candidate) => candidate.name === input.tool);\n if (!tool) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到 MCP 工具:${input.tool}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n if (tool.annotations?.readOnlyHint !== true && !input.yes) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `MCP 工具 ${input.tool} 可能会修改数据,需使用 --yes 确认`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"请检查工具参数,并使用 --yes 重新执行以确认。\",\n },\n );\n }\n const result = await client.callTool(\n { name: input.tool, arguments: input.arguments_ },\n { timeout: input.timeoutMs },\n );\n return { tool: input.tool, result };\n });\n}\n\nexport function parseMcpToolArguments(value: string): Record<string, unknown> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new CliError(\"INVALID_ARGUMENT\", \"工具参数必须是有效的 JSON\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"工具参数必须是 JSON 对象\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed as Record<string, unknown>;\n}\n","import type { HttpMcpConnectionSpec } from \"../connection.js\";\n\nexport interface ParsedEnterpriseServer {\n serverKey: string;\n preferredId: string;\n connection: HttpMcpConnectionSpec;\n}\n\nexport interface ParseEnterpriseMcpOptions {\n allowInsecureHttp: boolean;\n}\n\nexport interface McpToolAnnotations {\n title?: string | undefined;\n readOnlyHint?: boolean | undefined;\n destructiveHint?: boolean | undefined;\n idempotentHint?: boolean | undefined;\n openWorldHint?: boolean | undefined;\n}\n\nexport interface McpToolSummary {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n annotations?: McpToolAnnotations;\n}\n\nexport function toMcpToolSummary(input: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n annotations?: McpToolAnnotations | undefined;\n}): McpToolSummary {\n const annotations = {\n ...(input.annotations?.title === undefined\n ? {}\n : { title: input.annotations.title }),\n ...(input.annotations?.readOnlyHint === undefined\n ? {}\n : { readOnlyHint: input.annotations.readOnlyHint }),\n ...(input.annotations?.destructiveHint === undefined\n ? {}\n : { destructiveHint: input.annotations.destructiveHint }),\n ...(input.annotations?.idempotentHint === undefined\n ? {}\n : { idempotentHint: input.annotations.idempotentHint }),\n ...(input.annotations?.openWorldHint === undefined\n ? {}\n : { openWorldHint: input.annotations.openWorldHint }),\n };\n return {\n name: input.name,\n ...(input.description === undefined ? {} : { description: input.description }),\n inputSchema: input.inputSchema as Record<string, unknown>,\n ...(Object.keys(annotations).length ? { annotations } : {}),\n };\n}\n\nexport interface ToolRiskSummary {\n readOnly: number;\n write: number;\n destructive: number;\n unknown: number;\n hasWarning: boolean;\n}\n\nexport interface EnterpriseMcpToolSnapshot {\n count: number;\n fingerprint: string;\n risk: ToolRiskSummary;\n observedAt: string;\n}\n\nexport interface EnterpriseMcpConnection {\n id: string;\n serverKey: string;\n preferredId: string;\n transport: \"streamable-http\";\n url: string;\n headerNames: string[];\n credentialStore: \"keychain\" | \"file\";\n credentialRef: string;\n toolSnapshot: EnterpriseMcpToolSnapshot;\n createdAt: string;\n updatedAt: string;\n lastVerifiedAt?: string;\n}\n\nexport interface StageResult {\n stage: \"parse\" | \"verify\" | \"persist\" | \"agent\" | \"skill\" | \"reverify\";\n target: string;\n ok: boolean;\n status: \"created\" | \"updated\" | \"skipped\" | \"failed\";\n code?: string;\n message: string;\n}\n","import type { McpToolSummary, ToolRiskSummary } from \"./model.js\";\n\ntype ToolAnnotations = Pick<McpToolSummary, \"name\" | \"annotations\">;\n\nexport function classifyTools(tools: readonly ToolAnnotations[]): ToolRiskSummary {\n const summary: ToolRiskSummary = {\n readOnly: 0,\n write: 0,\n destructive: 0,\n unknown: 0,\n hasWarning: false,\n };\n\n for (const tool of tools) {\n if (tool.annotations?.destructiveHint === true) {\n summary.destructive += 1;\n } else if (tool.annotations?.readOnlyHint === true) {\n summary.readOnly += 1;\n } else if (tool.annotations?.readOnlyHint === false) {\n summary.write += 1;\n } else {\n summary.unknown += 1;\n }\n }\n\n summary.hasWarning =\n summary.write > 0 || summary.destructive > 0 || summary.unknown > 0;\n return summary;\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 { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport type { AgentId } from \"../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nconst agentSchema = z.enum([\"codex\", \"claude-code\", \"workbuddy\"]);\nconst digestSchema = z.string().regex(/^sha256:[a-f0-9]{64}$/u);\nconst managedSkillSchema = z.strictObject({\n agent: agentSchema,\n backupPath: z.string().min(1).optional(),\n fingerprint: digestSchema,\n target: z.string().min(1),\n version: z.string().min(1),\n});\nconst skillStateSchema = z.strictObject({\n schema: z.literal(2),\n managedSkills: z.record(z.string(), managedSkillSchema),\n});\n\nexport type ManagedSkill = z.infer<typeof managedSkillSchema>;\nexport type SkillState = z.infer<typeof skillStateSchema>;\n\nfunction emptyState(): SkillState {\n return { schema: 2, managedSkills: {} };\n}\n\nfunction invalidState(filePath: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", \"Skill installation state is invalid\", {\n exitCode: exitCodes.configConflict,\n hint: `Remove the unpublished legacy state at ${filePath}, then reinstall the Skill.`,\n });\n}\n\nfunction managedSkillKey(agent: AgentId, target: string): string {\n return `${agent}:${target}`;\n}\n\nexport class SkillStateStore {\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: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"Skill installation state is busy\", {\n exitCode: exitCodes.configConflict,\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async load(): Promise<SkillState> {\n try {\n return skillStateSchema.parse(JSON.parse(await readFile(this.filePath, \"utf8\")));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptyState();\n throw invalidState(this.filePath);\n }\n }\n\n async #saveUnlocked(state: SkillState): Promise<void> {\n const validated = skillStateSchema.parse(state);\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n\n async getManagedSkill(agent: AgentId, target: string): Promise<ManagedSkill | null> {\n return (await this.load()).managedSkills[managedSkillKey(agent, target)] ?? null;\n }\n\n async saveManagedSkill(managedSkill: ManagedSkill): Promise<void> {\n const validated = managedSkillSchema.parse(managedSkill);\n await this.#withLock(async () => {\n const state = await this.load();\n state.managedSkills[managedSkillKey(validated.agent, validated.target)] =\n validated;\n await this.#saveUnlocked(state);\n });\n }\n\n async deleteManagedSkill(agent: AgentId, target: string): Promise<void> {\n await this.#withLock(async () => {\n const state = await this.load();\n delete state.managedSkills[managedSkillKey(agent, target)];\n await this.#saveUnlocked(state);\n });\n }\n}\n","import { z } from \"zod\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin, type SkillAccount } from \"./account-config.js\";\nimport { SkillError } from \"./model.js\";\n\nconst dateTimeSchema = z.string().datetime({ offset: true });\nconst sessionIdSchema = z.uuid();\nconst createSessionSchema = z.strictObject({\n session_id: sessionIdSchema,\n verification_url: z.url(),\n expires_at: dateTimeSchema,\n});\nconst loginSessionSchema = z.strictObject({\n session_id: sessionIdSchema,\n status: z.enum([\"pending\", \"approved\", \"denied\", \"consumed\"]),\n expires_at: dateTimeSchema,\n});\nconst accountSchema = z.strictObject({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n access_expires_at: dateTimeSchema,\n refresh_expires_at: dateTimeSchema,\n user: z.strictObject({ id: z.string().min(1), name: z.string().min(1) }),\n});\nconst problemSchema = z.object({ code: z.string().min(1) }).passthrough();\n\nexport interface SkillAccountAuthClientOptions {\n readonly fetchImplementation?: typeof fetch;\n readonly timeoutMs?: number;\n}\n\nexport interface SkillLoginSession {\n readonly sessionId: string;\n readonly status?: \"pending\" | \"approved\" | \"denied\" | \"consumed\";\n readonly verificationUrl?: string;\n readonly expiresAt: string;\n}\n\nexport class SkillAccountAuthHttpClient {\n readonly #fetch: typeof fetch;\n readonly #timeoutMs: number;\n\n constructor(options: SkillAccountAuthClientOptions = {}) {\n this.#fetch = options.fetchImplementation ?? fetch;\n this.#timeoutMs = options.timeoutMs ?? 10_000;\n }\n\n async createLoginSession(\n origin: string,\n pkceChallenge: string,\n ): Promise<SkillLoginSession> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const response = await this.#request(\n normalizedOrigin,\n \"/api/v1/integrations/skill-account-logins\",\n { method: \"POST\", body: { pkce_challenge: pkceChallenge } },\n );\n const parsed = await this.#parse(response, createSessionSchema);\n if (\n normalizeSkillOrigin(new URL(parsed.verification_url).origin) !== normalizedOrigin\n ) {\n throw invalidResponse();\n }\n return {\n sessionId: parsed.session_id,\n verificationUrl: parsed.verification_url,\n expiresAt: parsed.expires_at,\n };\n }\n\n async getLoginSession(origin: string, sessionId: string): Promise<SkillLoginSession> {\n const validatedId = this.#sessionId(sessionId);\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n `/api/v1/integrations/skill-account-logins/${encodeURIComponent(validatedId)}`,\n { method: \"GET\" },\n );\n const parsed = await this.#parse(response, loginSessionSchema);\n if (parsed.session_id !== validatedId) throw invalidResponse();\n return {\n sessionId: parsed.session_id,\n status: parsed.status,\n expiresAt: parsed.expires_at,\n };\n }\n\n async exchange(\n origin: string,\n input: { sessionId: string; pkceVerifier: string },\n ): Promise<SkillAccount> {\n const sessionId = this.#sessionId(input.sessionId);\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n `/api/v1/integrations/skill-account-logins/${encodeURIComponent(sessionId)}/exchange`,\n { method: \"POST\", body: { pkce_verifier: input.pkceVerifier } },\n );\n return asAccount(await this.#parse(response, accountSchema));\n }\n\n async refresh(origin: string, refreshToken: string): Promise<SkillAccount> {\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n \"/api/v1/integrations/skill-account-sessions/refresh\",\n { method: \"POST\", body: { refresh_token: refreshToken } },\n );\n return asAccount(await this.#parse(response, accountSchema));\n }\n\n async logout(\n origin: string,\n accessToken: string,\n refreshToken: string,\n ): Promise<void> {\n const response = await this.#request(\n normalizeSkillOrigin(origin),\n \"/api/v1/integrations/skill-account-sessions/current\",\n {\n method: \"DELETE\",\n body: { refresh_token: refreshToken },\n authorization: `Bearer ${accessToken}`,\n },\n );\n if (response.status !== 204) throw invalidResponse();\n }\n\n #sessionId(value: string): string {\n const parsed = sessionIdSchema.safeParse(value);\n if (!parsed.success) {\n throw new SkillError(\"INVALID_ARGUMENT\", \"Skill login session is invalid\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed.data;\n }\n\n async #request(\n origin: string,\n requestPath: string,\n options: {\n method: \"GET\" | \"POST\" | \"DELETE\";\n body?: Record<string, unknown>;\n authorization?: string;\n },\n ): Promise<Response> {\n let response: Response;\n try {\n response = await this.#fetch(new URL(requestPath, origin), {\n headers: {\n Accept: \"application/json\",\n \"Cache-Control\": \"no-store\",\n ...(options.body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(options.authorization ? { Authorization: options.authorization } : {}),\n },\n method: options.method,\n redirect: \"error\",\n signal: AbortSignal.timeout(this.#timeoutMs),\n ...(options.body ? { body: JSON.stringify(options.body) } : {}),\n });\n } catch {\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the SAG account authorization service\",\n { exitCode: exitCodes.networkUnreachable },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw invalidResponse();\n }\n if (!response.ok) {\n let code = \"unknown\";\n try {\n const problem = problemSchema.safeParse(await response.json());\n if (problem.success) code = problem.data.code;\n } catch {\n // The stable error mapping below intentionally ignores the response body.\n }\n throw problemError(code, response.status);\n }\n return response;\n }\n\n async #parse<TSchema extends z.ZodType>(\n response: Response,\n schema: TSchema,\n ): Promise<z.output<TSchema>> {\n try {\n const parsed = schema.safeParse(await response.json());\n if (parsed.success) return parsed.data;\n } catch {\n // Fall through to the same non-secret contract error.\n }\n throw invalidResponse();\n }\n}\n\nfunction asAccount(value: z.output<typeof accountSchema>): SkillAccount {\n return {\n accessToken: value.access_token,\n refreshToken: value.refresh_token,\n accessExpiresAt: value.access_expires_at,\n refreshExpiresAt: value.refresh_expires_at,\n user: value.user,\n };\n}\n\nfunction invalidResponse(): SkillError {\n return new SkillError(\n \"INVALID_RESPONSE\",\n \"SAG account authorization returned an incompatible response\",\n { exitCode: exitCodes.internalError },\n );\n}\n\nfunction problemError(code: string, status: number): SkillError {\n if (code === \"access_denied\" || status === 403) {\n return new SkillError(\"PERMISSION_DENIED\", \"SAG account authorization was denied\", {\n exitCode: exitCodes.permissionDenied,\n problemCode: \"access_denied\",\n });\n }\n if (code === \"login_session_expired\" || code === \"invalid_grant\" || status === 410) {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n problemCode: code,\n });\n }\n if (status === 401) {\n return new SkillError(\"AUTH_REQUIRED\", \"SAG account authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n }\n if (status === 429 || code === \"rate_limited\") {\n return new SkillError(\"RATE_LIMITED\", \"SAG account authorization is rate limited\", {\n exitCode: exitCodes.networkUnreachable,\n problemCode: \"rate_limited\",\n });\n }\n return invalidResponse();\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\nimport { z } from \"zod\";\n\nimport { CliError, exitCodes } from \"../core/errors.js\";\n\nconst recentKnowledgeBaseSchema = z.strictObject({\n id: z.string().min(1),\n name: z.string().min(1),\n});\n\nconst skillAccountSchema = z.strictObject({\n accessToken: z.string().min(1),\n refreshToken: z.string().min(1),\n accessExpiresAt: z.string().datetime({ offset: true }),\n refreshExpiresAt: z.string().datetime({ offset: true }),\n user: z.strictObject({ id: z.string().min(1), name: z.string().min(1) }),\n recentKnowledgeBase: recentKnowledgeBaseSchema.optional(),\n});\n\nconst skillLinkTokenSchema = z.strictObject({\n kind: z.literal(\"open_link\"),\n token: z.string().regex(/^zmp_[A-Za-z0-9_-]{32,}$/),\n});\n\nconst skillAuthorizationSchema = z.union([skillAccountSchema, skillLinkTokenSchema]);\n\nconst skillAccountConfigSchema = z\n .object({\n version: z.literal(1),\n currentOrigin: z.string().optional(),\n accounts: z.record(z.string(), skillAuthorizationSchema),\n })\n .passthrough();\n\nexport type SkillAccount = z.infer<typeof skillAccountSchema>;\nexport type SkillLinkToken = z.infer<typeof skillLinkTokenSchema>;\nexport type SkillAuthorization = z.infer<typeof skillAuthorizationSchema>;\nexport type SkillAccountConfig = z.infer<typeof skillAccountConfigSchema>;\n\nfunction configurationConflict(message: string, filePath?: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: filePath ? `Review or restore ${filePath}.` : \"Provide a pure SAG Origin.\",\n });\n}\n\nexport function normalizeSkillOrigin(input: string): string {\n try {\n const parsed = new URL(input);\n if (\n ![\"http:\", \"https:\"].includes(parsed.protocol) ||\n !parsed.hostname ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash\n ) {\n throw new Error(\"not a pure HTTP Origin\");\n }\n return parsed.origin;\n } catch {\n throw configurationConflict(\"SAG address must be a pure HTTP or HTTPS Origin\");\n }\n}\n\nexport class SkillAccountConfigStore {\n constructor(readonly filePath: string) {}\n\n async load(): Promise<SkillAccountConfig> {\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 { version: 1, accounts: {} };\n }\n throw error;\n }\n try {\n return skillAccountConfigSchema.parse(JSON.parse(raw));\n } catch {\n throw configurationConflict(\n \"SAG account configuration is invalid\",\n this.filePath,\n );\n }\n }\n\n async saveAccount(origin: string, account: SkillAccount): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n let validated: SkillAccount;\n try {\n validated = skillAccountSchema.parse(account);\n } catch {\n throw configurationConflict(\"SAG account is invalid\", this.filePath);\n }\n await this.#withLock(async () => {\n const config = await this.load();\n config.accounts[normalizedOrigin] = validated;\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async saveLinkToken(origin: string, token: string): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n let authorization: SkillLinkToken;\n try {\n authorization = skillLinkTokenSchema.parse({ kind: \"open_link\", token });\n } catch {\n throw configurationConflict(\"Open Link token is invalid\", this.filePath);\n }\n await this.#withLock(async () => {\n const config = await this.load();\n config.accounts[normalizedOrigin] = authorization;\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async removeAccount(origin: string): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n await this.#withLock(async () => {\n const config = await this.load();\n delete config.accounts[normalizedOrigin];\n if (config.currentOrigin === normalizedOrigin) {\n config.currentOrigin = Object.keys(config.accounts).sort()[0];\n }\n await this.#saveUnlocked(config);\n });\n }\n\n async setCurrentOrigin(origin: string): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n await this.#withLock(async () => {\n const config = await this.load();\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async getAccount(origin: string): Promise<SkillAccount | null> {\n const authorization = (await this.load()).accounts[normalizeSkillOrigin(origin)];\n return authorization && !(\"kind\" in authorization) ? authorization : null;\n }\n\n async getAuthorization(origin: string): Promise<SkillAuthorization | null> {\n return (await this.load()).accounts[normalizeSkillOrigin(origin)] ?? null;\n }\n\n async saveRecentKnowledgeBase(\n origin: string,\n knowledgeBase: Readonly<{ id: string; name: string }>,\n ): Promise<void> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const validated = recentKnowledgeBaseSchema.parse(knowledgeBase);\n await this.#withLock(async () => {\n const config = await this.load();\n const account = config.accounts[normalizedOrigin];\n if (!account) {\n throw configurationConflict(\n \"SAG account authorization is required\",\n this.filePath,\n );\n }\n if (\"kind\" in account) return;\n config.accounts[normalizedOrigin] = {\n ...account,\n recentKnowledgeBase: validated,\n };\n config.currentOrigin = normalizedOrigin;\n await this.#saveUnlocked(config);\n });\n }\n\n async withRefreshLock<T>(origin: string, operation: () => Promise<T>): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const digest = createHash(\"sha256\").update(normalizedOrigin).digest(\"hex\");\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let release: (() => Promise<void>) | undefined;\n try {\n release = await lock(`${this.filePath}.refresh-${digest}`, {\n realpath: false,\n stale: 10_000,\n update: 2_000,\n retries: { retries: 300, factor: 1, minTimeout: 100, maxTimeout: 100 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"SAG account refresh is busy\", {\n exitCode: exitCodes.configConflict,\n hint: \"Wait for the other SAG Skill refresh to finish and retry.\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\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: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new CliError(\"CONFIG_CONFLICT\", \"SAG account configuration is busy\", {\n exitCode: exitCodes.configConflict,\n hint: \"Wait for the other SAG Skill operation to finish and retry.\",\n });\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n }\n\n async #saveUnlocked(config: SkillAccountConfig): Promise<void> {\n let validated: SkillAccountConfig;\n try {\n validated = skillAccountConfigSchema.parse(config);\n } catch {\n throw configurationConflict(\n \"SAG account configuration is invalid\",\n this.filePath,\n );\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)}.${randomUUID()}.tmp`,\n );\n let temporaryCreated = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n temporaryCreated = true;\n try {\n await handle.chmod(0o600).catch(() => undefined);\n await handle.writeFile(JSON.stringify(validated), \"utf8\");\n } finally {\n await handle.close();\n }\n await rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated) await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n }\n}\n","import type { SkillErrorCode } from \"../core/errors.js\";\n\nexport interface SkillErrorOptions {\n readonly details?: Record<string, unknown>;\n readonly exitCode: number;\n readonly problemCode?: string;\n}\n\nexport class SkillError extends Error {\n readonly code: SkillErrorCode;\n readonly details: Record<string, unknown> | undefined;\n readonly exitCode: number;\n readonly problemCode: string | undefined;\n\n constructor(code: SkillErrorCode, message: string, options: SkillErrorOptions) {\n super(message);\n this.name = \"SkillError\";\n this.code = code;\n this.details = options.details;\n this.exitCode = options.exitCode;\n this.problemCode = options.problemCode;\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { Command, CommanderError, Option } from \"commander\";\n\nimport { SagClient, type SagClientOptions, type SearchInput } from \"./api/client.js\";\nimport type {\n SagCapabilities,\n SagDocument,\n SagEntityContext,\n SagGrepResponse,\n SagMcpDescriptor,\n SagOutline,\n SagReadResponse,\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 { getEntityContext, grep, outline, read } from \"./commands/knowledge.js\";\nimport { localMcpDoctorChecks, testLocalMcp } from \"./commands/mcp.js\";\nimport {\n attachConnection,\n callConnectionTool,\n connectEnterpriseMcpCommand,\n detachConnection,\n disconnectConnection,\n inspectConnectionStatus,\n installSkill,\n listConnections,\n listConnectionTools,\n skillStatus,\n uninstallSkill,\n useConnection,\n type EnterpriseMcpLifecycleCommandRuntime,\n} from \"./commands/enterprise-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, toSkillErrorCode } 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 { redact } from \"./output/redaction.js\";\nimport { SkillEventWriter, type SkillEvent } from \"./output/ndjson.js\";\nimport { type AgentId, type PersonalAgentId } from \"./agents/adapter.js\";\nimport type {\n EnterpriseMcpCollisionAction,\n EnterpriseMcpCollisionChoice,\n EnterpriseMcpConnectRuntime,\n EnterpriseMcpServerChoice,\n} from \"./mcp/enterprise/service.js\";\nimport {\n installSkillTargets,\n inspectSkillTargets,\n uninstallSkillTargets,\n type SkillInstallerRuntime,\n type SkillTargetsReport,\n} from \"./skill/installer.js\";\nimport {\n authorizeSkillAccount,\n logoutSkillAccount,\n type SkillAccountAuthRuntime,\n} from \"./skill/account-auth.js\";\nimport type { SkillAccountAuthHttpClient } from \"./skill/account-auth-client.js\";\nimport {\n normalizeSkillOrigin,\n type SkillAccountConfigStore,\n} from \"./skill/account-config.js\";\nimport {\n askSkillAccountKnowledge,\n deleteSkillAccountDocument,\n listSkillAccountDocuments,\n listSkillAccountKnowledgeBases,\n renameSkillAccountDocument,\n type SkillAccountKnowledgeRuntime,\n} from \"./skill/account-knowledge.js\";\nimport {\n inspectSkillAccountUpload,\n uploadSkillAccountFile,\n type SkillAccountUploadEvent,\n type SkillAccountUploadRuntime,\n} from \"./skill/account-upload.js\";\nimport {\n SkillKnowledgeHttpClient,\n type SkillKnowledgeClient,\n type SkillKnowledgeClientOptions,\n} from \"./skill/knowledge-client.js\";\nimport { SkillError } from \"./skill/model.js\";\n\nexport interface CliSagClient {\n root(): Promise<SagRoot>;\n ready(): Promise<SagReady>;\n capabilities(): Promise<SagCapabilities>;\n me(): Promise<SagUser>;\n login(name: string): Promise<{ accessToken: string; user: 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 outline(sourceId: string, documentId: string): Promise<SagOutline>;\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse>;\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse>;\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext>;\n}\n\nexport interface CliDependencies {\n version: string;\n environment: NodeJS.ProcessEnv;\n configStore: ConfigStore;\n credentialStore: CredentialStore;\n createClient(options: SagClientOptions): CliSagClient;\n promptName(): Promise<string>;\n confirm(message: string): Promise<boolean>;\n readStdin(): Promise<string>;\n stdinIsTty?: boolean;\n promptMcpJson?(): Promise<string>;\n selectMcpServers?(\n servers: readonly EnterpriseMcpServerChoice[],\n ): Promise<readonly string[]>;\n selectAgents?(agents: readonly AgentId[]): Promise<readonly AgentId[]>;\n selectCollisionAction?(\n collision: EnterpriseMcpCollisionChoice,\n ): Promise<EnterpriseMcpCollisionAction>;\n writeStdout(value: string): void;\n writeStderr(value: string): void;\n localMcp?: LocalMcpCliDependencies;\n enterpriseMcp?: EnterpriseMcpConnectRuntime;\n skill?: SkillInstallerRuntime;\n skillAccount?: Readonly<{\n client: SkillAccountAuthHttpClient;\n config: SkillAccountConfigStore;\n now: () => Date;\n openBrowser: (url: string) => Promise<void>;\n }>;\n promptSkillOrigin?(): Promise<string>;\n createSkillKnowledgeClient?(\n options: SkillKnowledgeClientOptions,\n ): SkillKnowledgeClient;\n}\n\nexport type LocalMcpCliDependencies = AgentRuntime;\n\ninterface GlobalOptions {\n json?: boolean;\n output?: \"human\" | \"ndjson\";\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\", \"参数必须是正整数\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed;\n}\n\nfunction parseNonNegativeInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new CliError(\"INVALID_ARGUMENT\", \"参数必须是非负整数\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n return parsed;\n}\n\nfunction parseAgent(value: string): PersonalAgentId {\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 parseEnterpriseAgent(value: string): AgentId {\n if (value === \"codex\" || value === \"claude-code\" || value === \"workbuddy\") {\n return value;\n }\n throw new CliError(\"INVALID_ARGUMENT\", `不支持的 Agent:${value}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 codex、claude-code 或 workbuddy。\",\n });\n}\n\nfunction parseCredentialStore(value: string): \"keychain\" | \"file\" {\n if (value === \"keychain\" || value === \"file\") return value;\n throw new CliError(\"INVALID_ARGUMENT\", `不支持的凭据存储:${value}`, {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 keychain 或 file。\",\n });\n}\n\nfunction resolveEnterpriseSkillAgent(\n positional: AgentId | undefined,\n option: AgentId | undefined,\n): AgentId {\n if (positional && option && positional !== option) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"位置参数 Agent 与 --agent 指定的 Agent 不一致\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n const agent = option ?? positional;\n if (!agent) {\n throw new CliError(\"INVALID_ARGUMENT\", \"请使用 --agent 指定 Agent\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"请选择 codex、claude-code 或 workbuddy。\",\n });\n }\n return agent;\n}\n\nfunction parseMcpToolArguments(value: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"not an object\");\n }\n return parsed as Record<string, unknown>;\n } catch (cause) {\n throw new CliError(\"INVALID_ARGUMENT\", \"--arguments-json 必须是一个 JSON 对象\", {\n exitCode: exitCodes.invalidArgument,\n cause,\n });\n }\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction commandOptions(program: Command): GlobalOptions {\n return program.opts<GlobalOptions>();\n}\n\nconst skillWriters = new WeakMap<Command, SkillEventWriter>();\n\nfunction skillOperation(program: Command): SkillEvent[\"operation\"] {\n const [command, subcommand, action] = program.args;\n if (command === \"auth\" || (command === \"skill\" && subcommand === \"auth\")) {\n return \"auth\";\n }\n if (command === \"skill\" && subcommand === \"knowledge\") {\n if (action === \"upload\" || action === \"upload-status\") return \"upload\";\n if (action === \"ask\") return \"search\";\n return \"document\";\n }\n if (command === \"search\") return \"search\";\n if (\n command === \"document\" &&\n (subcommand === \"upload\" || subcommand === \"upload-status\")\n ) {\n return \"upload\";\n }\n if (command === \"mcp\" || command === \"agent\") return \"install\";\n if (command === \"document\" || command === \"knowledge\") return \"document\";\n return \"install\";\n}\n\nfunction skillData(program: Command, data: unknown): Record<string, unknown> {\n const base =\n data && typeof data === \"object\" && !Array.isArray(data)\n ? (data as Record<string, unknown>)\n : Array.isArray(data)\n ? { items: data }\n : { value: data };\n if (program.args[0] === \"knowledge\") {\n return { resource: \"knowledge_base\", ...base };\n }\n return base;\n}\n\nfunction commandOutputIsNdjson(arguments_: string[]): boolean {\n return arguments_.some(\n (argument, index) =>\n argument === \"--output=ndjson\" ||\n (argument === \"--output\" && arguments_[index + 1] === \"ndjson\"),\n );\n}\n\nfunction skillOperationId(): string {\n return `cli-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction skillEvent(\n program: Command,\n event: string,\n data?: Record<string, unknown>,\n error?: SkillEvent[\"error\"],\n operationId = skillOperationId(),\n): SkillEvent {\n return {\n schema: \"sag.skill.ndjson.v1\",\n operation: skillOperation(program),\n event,\n operation_id: operationId,\n timestamp: new Date().toISOString(),\n ...(data ? { data } : {}),\n ...(error ? { error } : {}),\n };\n}\n\nfunction emit(program: Command, dependencies: CliDependencies, data: unknown): void {\n const options = commandOptions(program);\n if (options.output === \"ndjson\") {\n skillWriters\n .get(program)\n ?.complete(skillEvent(program, \"completed\", skillData(program, data)));\n return;\n }\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\nfunction enterpriseMcpRuntime(\n dependencies: CliDependencies,\n): EnterpriseMcpConnectRuntime {\n if (!dependencies.enterpriseMcp) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"企业 MCP 运行环境不可用\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.enterpriseMcp;\n}\n\nfunction enterpriseMcpCommandRuntime(\n dependencies: CliDependencies,\n timeoutMs: number,\n): EnterpriseMcpLifecycleCommandRuntime {\n return {\n ...enterpriseMcpRuntime(dependencies),\n cliVersion: dependencies.version,\n timeoutMs,\n };\n}\n\nfunction skillInstallerRuntime(dependencies: CliDependencies): SkillInstallerRuntime {\n if (!dependencies.skill) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG Knowledge Skill runtime is unavailable\",\n {\n exitCode: exitCodes.dependencyMissing,\n },\n );\n }\n return dependencies.skill;\n}\n\nfunction skillAccountAuthRuntime(\n dependencies: CliDependencies,\n): SkillAccountAuthRuntime {\n const runtime = dependencies.skillAccount;\n if (!runtime) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account authorization runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n return runtime;\n}\n\nfunction skillAccountKnowledgeRuntime(\n dependencies: CliDependencies,\n): SkillAccountKnowledgeRuntime {\n const account = dependencies.skillAccount;\n if (!account) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account Knowledge runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n return {\n auth: skillAccountAuthRuntime(dependencies),\n createId: randomUUID,\n config: account.config,\n createClient:\n dependencies.createSkillKnowledgeClient ??\n ((options) => new SkillKnowledgeHttpClient(options)),\n };\n}\n\nfunction skillAccountUploadRuntime(\n dependencies: CliDependencies,\n): SkillAccountUploadRuntime {\n return {\n ...skillAccountKnowledgeRuntime(dependencies),\n now: () => new Date(),\n sleep: async (milliseconds) =>\n new Promise((resolve) => setTimeout(resolve, milliseconds)),\n };\n}\n\nfunction emitSkillAccountUpload(\n program: Command,\n dependencies: CliDependencies,\n events: readonly SkillAccountUploadEvent[],\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emit(program, dependencies, { events });\n return;\n }\n const operationId = skillOperationId();\n const writer = skillWriters.get(program);\n events.forEach((event, index) => {\n const data = {\n import_id: event.importId,\n ...(event.documentId ? { document_id: event.documentId } : {}),\n ...(event.jobId ? { job_id: event.jobId } : {}),\n ...(event.failure ? { failure: event.failure } : {}),\n };\n const frame = skillEvent(program, event.event, data, undefined, operationId);\n if (index === events.length - 1) writer?.complete(frame);\n else writer?.emit(frame);\n });\n}\n\nfunction emitSkillAccountUploadStatus(\n program: Command,\n dependencies: CliDependencies,\n status: SkillAccountUploadEvent,\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emitSkillAccountUpload(program, dependencies, [status]);\n return;\n }\n skillWriters.get(program)?.complete(\n skillEvent(program, \"completed\", {\n import_id: status.importId,\n state: status.event,\n ...(status.documentId ? { document_id: status.documentId } : {}),\n ...(status.jobId ? { job_id: status.jobId } : {}),\n ...(status.failure ? { failure: status.failure } : {}),\n }),\n );\n}\n\nasync function resolveSkillOrigin(\n dependencies: CliDependencies,\n explicitOrigin?: string,\n promptWhenMissing = false,\n): Promise<string> {\n if (explicitOrigin) return normalizeSkillOrigin(explicitOrigin);\n const runtime = dependencies.skillAccount;\n if (!runtime) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account authorization runtime is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n const current = (await runtime.config.load()).currentOrigin;\n if (current) return normalizeSkillOrigin(current);\n if (promptWhenMissing && dependencies.promptSkillOrigin) {\n return normalizeSkillOrigin(await dependencies.promptSkillOrigin());\n }\n throw new SkillError(\"AUTH_REQUIRED\", \"SAG address is required\", {\n exitCode: exitCodes.authRequired,\n details: { required_option: \"--origin\" },\n });\n}\n\nclass ReportedSkillTargetFailure extends Error {\n constructor(readonly exitCode: number) {\n super(\"Skill target operation completed with errors\");\n }\n}\n\ninterface SkillTargetEmissionOptions {\n readonly operationId?: string;\n readonly terminal?: boolean;\n readonly terminalData?: Record<string, unknown>;\n readonly progressData?: Record<string, unknown>;\n readonly progressEvent?: string;\n readonly progressOnErrors?: boolean;\n}\n\nfunction emitSkillTargets(\n program: Command,\n dependencies: CliDependencies,\n report: SkillTargetsReport,\n options: SkillTargetEmissionOptions = {},\n): void {\n if (commandOptions(program).output !== \"ndjson\") {\n emit(program, dependencies, report);\n return;\n }\n const writer = skillWriters.get(program);\n const operationId = options.operationId ?? skillOperationId();\n for (const target of report.targets) {\n const failed = target.status === \"failed\" || target.status === \"conflict\";\n writer?.emit(\n skillEvent(\n program,\n failed ? \"target_failed\" : \"target_completed\",\n {\n agent: target.agent,\n target: target.target,\n status: target.status,\n ...(target.version ? { version: target.version } : {}),\n ...(target.package ? { package: target.package } : {}),\n ...(target.code ? { code: target.code } : {}),\n },\n undefined,\n operationId,\n ),\n );\n }\n const terminal = options.terminal ?? true;\n const summary = {\n package: report.package,\n version: report.version,\n target_count: report.targets.length,\n };\n if (!terminal && (!report.completedWithErrors || options.progressOnErrors)) {\n writer?.emit(\n skillEvent(\n program,\n options.progressEvent ?? \"installation_completed\",\n options.progressData ?? summary,\n undefined,\n operationId,\n ),\n );\n return;\n }\n writer?.complete(\n skillEvent(\n program,\n report.completedWithErrors ? \"completed_with_errors\" : \"completed\",\n options.terminalData ?? summary,\n undefined,\n operationId,\n ),\n );\n}\n\nasync function executeSkillTargets(\n program: Command,\n dependencies: CliDependencies,\n report: Promise<SkillTargetsReport>,\n): Promise<void> {\n const resolved = await report;\n emitSkillTargets(program, dependencies, resolved);\n if (resolved.completedWithErrors) {\n const conflict = resolved.targets.some((target) => target.status === \"conflict\");\n throw new ReportedSkillTargetFailure(\n conflict ? exitCodes.configConflict : exitCodes.internalError,\n );\n }\n}\n\nfunction rejectEnterpriseProfile(program: Command): void {\n if (!commandOptions(program).profile) return;\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 命令不使用 Profile\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"请移除 --profile;个人 Profile 只用于 sag mcp test 和 sag agent。\",\n });\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\n .command(\"login\")\n .option(\"--name <name>\", \"SAG user name for the existing local login\")\n .action(async (options: { name?: string }) => {\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 ...(options.name ? { name: options.name } : {}),\n promptName: dependencies.promptName,\n authenticate: (name) =>\n dependencies.createClient({ origin: context.connection.url }).login(name),\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 program\n .command(\"outline\")\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 outline(context.client, options.source, documentId),\n );\n });\n\n program\n .command(\"grep\")\n .argument(\"<pattern>\")\n .requiredOption(\"--source <source-id>\")\n .option(\"--limit <number>\", \"Maximum result count\", parseInteger)\n .action(async (pattern: string, options: { source: string; limit?: number }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await grep(context.client, options.source, pattern, options.limit),\n );\n });\n\n program\n .command(\"read\")\n .argument(\"<document-id>\")\n .requiredOption(\"--source <source-id>\")\n .option(\"--offset <number>\", \"Starting line (1-based)\", parseInteger)\n .option(\"--limit <number>\", \"Lines to read\", parseInteger)\n .action(\n async (\n documentId: string,\n options: { source: string; offset?: number; limit?: number },\n ) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await read(\n context.client,\n options.source,\n documentId,\n options.offset,\n options.limit,\n ),\n );\n },\n );\n\n program\n .command(\"get-entity\")\n .argument(\"<name>\")\n .requiredOption(\"--source <source-id>\")\n .action(async (name: string, options: { source: string }) => {\n const context = await runtime(program, dependencies);\n emit(\n program,\n dependencies,\n await getEntityContext(context.client, options.source, name),\n );\n });\n}\n\nfunction addLocalMcpCommands(program: Command, dependencies: CliDependencies): void {\n const mcp = program\n .command(\"mcp\")\n .description(\"验证本机 SAG MCP,并管理企业 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 mcp\n .command(\"list\")\n .description(\"列出企业 MCP 连接\")\n .action(async () => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await listConnections(enterpriseMcpCommandRuntime(dependencies, 15_000)),\n );\n });\n\n mcp\n .command(\"use\")\n .description(\"选择当前企业 MCP 连接\")\n .argument(\"<server>\", \"企业 MCP 连接名称\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改当前连接\")\n .action(async (server: string, options: { dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await useConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n server,\n dryRun: options.dryRun ?? false,\n }),\n );\n });\n\n mcp\n .command(\"status\")\n .description(\"检查企业 MCP、Agent 和 Skill 状态\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(async (options: { server?: string; timeout: number }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await inspectConnectionStatus(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n options.server === undefined ? {} : { server: options.server },\n ),\n );\n });\n\n mcp\n .command(\"tools\")\n .description(\"列出企业 MCP 工具及风险分类\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(async (options: { server?: string; timeout: number }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await listConnectionTools(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n options.server === undefined ? {} : { server: options.server },\n ),\n );\n });\n\n mcp\n .command(\"call\")\n .description(\"调用企业 MCP 工具\")\n .argument(\"<tool>\", \"工具名称\")\n .requiredOption(\"--arguments-json <json>\", \"传给工具的 JSON 对象\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .action(\n async (\n tool: string,\n options: { argumentsJson: string; server?: string; timeout: number },\n ) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await callConnectionTool(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n {\n ...(options.server === undefined ? {} : { server: options.server }),\n tool,\n arguments_: parseMcpToolArguments(options.argumentsJson),\n yes: commandOptions(program).yes ?? false,\n },\n ),\n );\n },\n );\n\n mcp\n .command(\"attach\")\n .description(\"把企业 MCP 接入一个 Agent\")\n .argument(\"<agent>\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .option(\"--no-skill\", \"不安装企业 SAG MCP Skill\")\n .action(\n async (\n agent: AgentId,\n options: {\n server?: string;\n timeout: number;\n dryRun?: boolean;\n skill: boolean;\n },\n ) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await attachConnection(\n enterpriseMcpCommandRuntime(dependencies, options.timeout),\n {\n ...(options.server === undefined ? {} : { server: options.server }),\n agent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n noSkill: !options.skill,\n confirm: dependencies.confirm,\n },\n ),\n );\n },\n );\n\n mcp\n .command(\"detach\")\n .description(\"从一个 Agent 移除受管企业 MCP\")\n .argument(\"<agent>\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(async (agent: AgentId, options: { server?: string; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await detachConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n ...(options.server === undefined ? {} : { server: options.server }),\n agent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n });\n\n mcp\n .command(\"disconnect\")\n .description(\"断开并删除企业 MCP 连接\")\n .option(\"--server <server>\", \"指定企业 MCP 连接;默认使用当前连接\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(async (options: { server?: string; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n emit(\n program,\n dependencies,\n await disconnectConnection(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n ...(options.server === undefined ? {} : { server: options.server }),\n yes: commandOptions(program).yes ?? false,\n dryRun: options.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n });\n\n const skill = mcp.command(\"skill\").description(\"管理企业 SAG MCP Skill\");\n skill\n .command(\"install\")\n .description(\"安装企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(\n async (agent?: AgentId, options?: { agent?: AgentId; dryRun?: boolean }) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n emit(\n program,\n dependencies,\n await installSkill(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n agent: selectedAgent,\n yes: commandOptions(program).yes ?? false,\n dryRun: options?.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n },\n );\n skill\n .command(\"status\")\n .description(\"检查企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .action(async (agent?: AgentId, options?: { agent?: AgentId }) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n const statuses = await skillStatus(\n enterpriseMcpCommandRuntime(dependencies, 15_000),\n {\n agents: [selectedAgent],\n },\n );\n emit(program, dependencies, statuses[0]);\n });\n skill\n .command(\"uninstall\")\n .description(\"卸载企业 SAG MCP Skill\")\n .argument(\"[agent]\", \"codex、claude-code 或 workbuddy\", parseEnterpriseAgent)\n .option(\n \"--agent <agent>\",\n \"指定 codex、claude-code 或 workbuddy\",\n parseEnterpriseAgent,\n )\n .option(\"--force\", \"先备份,再强制卸载已变更的 Skill\")\n .option(\"--dry-run\", \"只检查并展示计划,不修改本机状态\")\n .action(\n async (\n agent?: AgentId,\n options?: { agent?: AgentId; force?: boolean; dryRun?: boolean },\n ) => {\n rejectEnterpriseProfile(program);\n const selectedAgent = resolveEnterpriseSkillAgent(agent, options?.agent);\n emit(\n program,\n dependencies,\n await uninstallSkill(enterpriseMcpCommandRuntime(dependencies, 15_000), {\n agent: selectedAgent,\n yes: commandOptions(program).yes ?? false,\n force: options?.force ?? false,\n dryRun: options?.dryRun ?? false,\n confirm: dependencies.confirm,\n }),\n );\n },\n );\n\n mcp\n .command(\"connect\")\n .description(\"粘贴并接入企业 MCP 连接\")\n .option(\"--from-stdin\", \"从标准输入读取 mcpServers JSON\")\n .option(\"--server <server-key>\", \"选择一个 MCP Server,可重复\", collect, [])\n .option(\n \"--agent <agent>\",\n \"接入 codex、claude-code 或 workbuddy,可重复\",\n (value: string, previous: AgentId[]) => [\n ...previous,\n parseEnterpriseAgent(value),\n ],\n [],\n )\n .option(\"--replace\", \"同名不同 URL 时替换原连接\")\n .option(\"--keep-both\", \"同名不同 URL 时保留两个连接\")\n .option(\"--no-skill\", \"不安装企业 SAG MCP Skill\")\n .option(\n \"--credential-store <keychain|file>\",\n \"凭据保存位置\",\n parseCredentialStore,\n \"keychain\",\n )\n .option(\"--allow-insecure-http\", \"允许非本机地址使用明文 HTTP\")\n .option(\"--timeout <milliseconds>\", \"MCP 超时时间\", parsePositiveInteger, 15_000)\n .option(\"--dry-run\", \"只验证并展示计划,不修改本机状态\")\n .action(\n async (options: {\n fromStdin?: boolean;\n server: string[];\n agent: AgentId[];\n replace?: boolean;\n keepBoth?: boolean;\n skill: boolean;\n credentialStore: \"keychain\" | \"file\";\n allowInsecureHttp?: boolean;\n timeout: number;\n dryRun?: boolean;\n }) => {\n rejectEnterpriseProfile(program);\n if (options.replace && options.keepBoth) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"--replace 与 --keep-both 不能同时使用\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n\n const interactive = !options.fromStdin && (dependencies.stdinIsTty ?? false);\n let raw: string;\n if (options.fromStdin) {\n raw = await dependencies.readStdin();\n } else if (dependencies.promptMcpJson) {\n raw = await dependencies.promptMcpJson();\n } else {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法读取企业 MCP 连接 JSON\", {\n exitCode: exitCodes.dependencyMissing,\n hint: \"请使用 `sag mcp connect --from-stdin` 从标准输入传入 JSON。\",\n });\n }\n\n emit(\n program,\n dependencies,\n await connectEnterpriseMcpCommand({\n runtime: enterpriseMcpRuntime(dependencies),\n raw,\n requestedServers: options.server,\n requestedAgents: options.agent,\n credentialStore: options.credentialStore,\n ...(options.replace\n ? { collisionAction: \"replace\" as const }\n : options.keepBoth\n ? { collisionAction: \"keep-both\" as const }\n : {}),\n allowInsecureHttp: options.allowInsecureHttp ?? false,\n timeoutMs: options.timeout,\n yes: commandOptions(program).yes ?? false,\n noSkill: !options.skill,\n dryRun: options.dryRun ?? false,\n interactive,\n selectMcpServers: async (servers) => {\n if (!dependencies.selectMcpServers) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法选择 MCP Server\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.selectMcpServers(servers);\n },\n selectAgents: async (agents) =>\n dependencies.selectAgents ? dependencies.selectAgents(agents) : [],\n selectCollisionAction: async (collision) => {\n if (!dependencies.selectCollisionAction) {\n throw new CliError(\"DEPENDENCY_MISSING\", \"无法处理同名 MCP 连接\", {\n exitCode: exitCodes.dependencyMissing,\n });\n }\n return dependencies.selectCollisionAction(collision);\n },\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: PersonalAgentId,\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(\n async (agentId: PersonalAgentId | 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\n agent\n .command(\"disconnect\")\n .argument(\"<agent>\", \"codex or claude-code\", parseAgent)\n .option(\"--name <server-name>\")\n .action(async (agentId: PersonalAgentId, 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\nfunction addSkillCommands(program: Command, dependencies: CliDependencies): void {\n const skill = program\n .command(\"skill\")\n .description(\"Install and manage the SAG Knowledge Skill\");\n const selectedAgents = (value: string, previous: AgentId[]): AgentId[] => [\n ...previous,\n parseEnterpriseAgent(value),\n ];\n const addInstall = (name: \"install\" | \"update\", description: string) => {\n const command = skill\n .command(name)\n .description(description)\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n );\n command.option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\");\n command.option(\n \"--link-token <token>\",\n \"Open Link token; replaces the saved authorization for this Origin\",\n );\n command.action(\n async (options: { agent: AgentId[]; origin?: string; linkToken?: string }) => {\n if (options.linkToken && !options.origin) {\n throw new CliError(\"INVALID_ARGUMENT\", \"--link-token requires --origin\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (options.origin) {\n const account = dependencies.skillAccount;\n if (!account) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account configuration is unavailable\",\n { exitCode: exitCodes.dependencyMissing },\n );\n }\n if (options.linkToken) {\n await account.config.saveLinkToken(options.origin, options.linkToken);\n } else {\n await account.config.setCurrentOrigin(options.origin);\n }\n }\n await executeSkillTargets(\n program,\n dependencies,\n installSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n yes: commandOptions(program).yes ?? false,\n update: name === \"update\",\n }),\n );\n },\n );\n };\n addInstall(\"install\", \"Install SAG Knowledge for every detected Agent\");\n addInstall(\"update\", \"Resolve the running @latest package and update managed Skills\");\n\n const auth = skill.command(\"auth\").description(\"Authorize one SAG account Origin\");\n auth\n .command(\"paste-token\")\n .description(\"Save an Open Link token for one SAG Origin\")\n .requiredOption(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .requiredOption(\"--token <token>\", \"Open Link token provided by an administrator\")\n .action(async (options: { origin: string; token: string }) => {\n const account = dependencies.skillAccount;\n if (!account) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account configuration is unavailable\",\n {\n exitCode: exitCodes.dependencyMissing,\n },\n );\n }\n await account.config.saveLinkToken(options.origin, options.token);\n emit(program, dependencies, {\n origin: normalizeSkillOrigin(options.origin),\n authorized: true,\n method: \"open_link\",\n });\n });\n\n auth\n .command(\"login\")\n .description(\"Open browser approval and authorize the current SAG account\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin, true);\n emit(\n program,\n dependencies,\n await authorizeSkillAccount(skillAccountAuthRuntime(dependencies), origin),\n );\n });\n\n auth\n .command(\"status\")\n .description(\"Inspect the saved SAG account authorization\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const configured = dependencies.skillAccount;\n if (!configured) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"SAG account configuration is unavailable\",\n {\n exitCode: exitCodes.dependencyMissing,\n },\n );\n }\n const authorization = await configured.config.getAuthorization(origin);\n emit(program, dependencies, {\n authenticated: Boolean(authorization),\n origin,\n ...(authorization && \"kind\" in authorization\n ? { method: \"open_link\" }\n : authorization\n ? { method: \"browser\", user: authorization.user }\n : {}),\n });\n });\n\n auth\n .command(\"logout\")\n .description(\"Revoke and remove the saved SAG account authorization\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const removed = await logoutSkillAccount(\n skillAccountAuthRuntime(dependencies),\n origin,\n );\n emit(program, dependencies, { origin, removed });\n });\n\n const accountKnowledge = skill\n .command(\"knowledge\")\n .description(\"Use Knowledge Bases available to the authorized SAG account\");\n accountKnowledge\n .command(\"list\")\n .description(\"List Knowledge Bases available to the current SAG account\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await listSkillAccountKnowledgeBases(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n ),\n );\n });\n accountKnowledge\n .command(\"documents\")\n .description(\"List documents in one exact Knowledge Base\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Exact Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(async (options: { origin?: string; knowledgeBase: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await listSkillAccountDocuments(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n options.knowledgeBase,\n ),\n );\n });\n accountKnowledge\n .command(\"ask\")\n .description(\"Ask SAG and relay its answer and citations\")\n .argument(\"<question>\", \"Question for SAG\")\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .option(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Optional exact Knowledge Base scope; omit for SAG global search\",\n )\n .action(\n async (\n question: string,\n options: { origin?: string; knowledgeBase?: string },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await askSkillAccountKnowledge(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n question,\n options.knowledgeBase,\n ),\n );\n },\n );\n accountKnowledge\n .command(\"upload\")\n .description(\"Upload one regular file to an exact Knowledge Base\")\n .argument(\"<file>\", \"One regular file\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .option(\n \"--wait <milliseconds>\",\n \"Use 0 to detach after acceptance\",\n parseNonNegativeInteger,\n )\n .option(\n \"--overwrite-document-id <document-id>\",\n \"Existing document ID returned by a duplicate upload conflict\",\n )\n .action(\n async (\n filePath: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n wait?: number;\n overwriteDocumentId?: string;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n const events = await uploadSkillAccountFile(\n skillAccountUploadRuntime(dependencies),\n origin,\n filePath,\n options.knowledgeBase,\n options.wait,\n options.overwriteDocumentId,\n );\n emitSkillAccountUpload(program, dependencies, events);\n },\n );\n accountKnowledge\n .command(\"upload-status\")\n .description(\"Read upload progress using the returned import ID\")\n .argument(\"<import-id>\", \"Import ID returned by upload\")\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Exact Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (importId: string, options: { origin?: string; knowledgeBase: string }) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emitSkillAccountUploadStatus(\n program,\n dependencies,\n await inspectSkillAccountUpload(\n skillAccountUploadRuntime(dependencies),\n origin,\n importId,\n options.knowledgeBase,\n ),\n );\n },\n );\n accountKnowledge\n .command(\"rename\")\n .description(\"Rename one exact document version\")\n .argument(\"<document-id>\", \"Exact document ID\")\n .requiredOption(\"--title <title>\", \"New document title\")\n .requiredOption(\n \"--expected-version <version>\",\n \"Current document version\",\n parsePositiveInteger,\n )\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (\n documentId: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n expectedVersion: number;\n title: string;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await renameSkillAccountDocument(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n {\n knowledgeBase: options.knowledgeBase,\n documentId,\n expectedVersion: options.expectedVersion,\n title: options.title,\n },\n ),\n );\n },\n );\n accountKnowledge\n .command(\"delete\")\n .description(\"Move one exact document version to the recoverable recycle bin\")\n .argument(\"<document-id>\", \"Exact document ID\")\n .requiredOption(\n \"--expected-version <version>\",\n \"Current document version\",\n parsePositiveInteger,\n )\n .requiredOption(\n \"--knowledge-base <id-or-alias-or-name>\",\n \"Confirmed Knowledge Base ID, alias, or unique name\",\n )\n .option(\"--origin <origin>\", \"Full SAG HTTP or HTTPS Origin\")\n .action(\n async (\n documentId: string,\n options: {\n origin?: string;\n knowledgeBase: string;\n expectedVersion: number;\n },\n ) => {\n const origin = await resolveSkillOrigin(dependencies, options.origin);\n emit(\n program,\n dependencies,\n await deleteSkillAccountDocument(\n skillAccountKnowledgeRuntime(dependencies),\n origin,\n {\n knowledgeBase: options.knowledgeBase,\n documentId,\n expectedVersion: options.expectedVersion,\n },\n ),\n );\n },\n );\n\n skill\n .command(\"status\")\n .description(\"Inspect managed SAG Knowledge Skill targets\")\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n )\n .action(async (options: { agent: AgentId[] }) => {\n emitSkillTargets(\n program,\n dependencies,\n await inspectSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n }),\n );\n });\n\n skill\n .command(\"uninstall\")\n .description(\"Remove unchanged SAG CLI-managed Skills\")\n .option(\n \"--agent <agent>\",\n \"Target codex, claude-code, or workbuddy\",\n selectedAgents,\n [],\n )\n .action(async (options: { agent: AgentId[] }) => {\n await executeSkillTargets(\n program,\n dependencies,\n uninstallSkillTargets(skillInstallerRuntime(dependencies), {\n ...(options.agent.length ? { agents: options.agent } : {}),\n yes: commandOptions(program).yes ?? false,\n }),\n );\n });\n}\n\nexport function createProgram(dependencies: CliDependencies): Command {\n const program = new Command();\n skillWriters.set(program, new SkillEventWriter(dependencies.writeStdout));\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 .addOption(\n new Option(\"--output <format>\", \"Output format\")\n .choices([\"human\", \"ndjson\"])\n .conflicts(\"json\"),\n )\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.output === \"ndjson\") {\n skillWriters.get(program)?.complete(\n skillEvent(program, \"completed\", {\n name: \"sag\",\n version: dependencies.version,\n }),\n );\n } else 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 addSkillCommands(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 const program = createProgram(\n commandOutputIsNdjson(arguments_)\n ? { ...dependencies, writeStderr: () => undefined }\n : dependencies,\n );\n try {\n await program.parseAsync(arguments_);\n return exitCodes.success;\n } catch (error) {\n if (error instanceof ReportedSkillTargetFailure) return error.exitCode;\n if (error instanceof CommanderError && error.exitCode === 0) {\n return 0;\n }\n if (error instanceof SkillError) {\n if (json) {\n dependencies.writeStdout(\n renderJson({\n schema: \"sag.cli.v1\",\n ok: false,\n error: {\n code: error.code,\n message: error.message,\n ...(error.details ? { details: error.details } : {}),\n },\n } as never),\n );\n } else if (commandOutputIsNdjson(arguments_)) {\n const event = skillEvent(program, \"failed\", undefined, {\n code: error.code,\n message: error.message,\n retryable: error.code === \"NETWORK_UNREACHABLE\",\n ...(error.details ? { details: error.details } : {}),\n });\n const operationId = error.details?.operation_id;\n skillWriters.get(program)?.complete({\n ...event,\n ...(typeof operationId === \"string\" ? { operation_id: operationId } : {}),\n });\n } else {\n const operationId = error.details?.operation_id;\n dependencies.writeStderr(\n `Error [${error.code}]: ${error.message}${\n typeof operationId === \"string\" ? `\\nOperation ID: ${operationId}` : \"\"\n }\\n`,\n );\n }\n return error.exitCode;\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 if (commandOutputIsNdjson(arguments_)) {\n skillWriters.get(program)?.complete(\n skillEvent(program, \"failed\", undefined, {\n code: toSkillErrorCode(cliError.code),\n message: cliError.message,\n retryable: cliError.code === \"NETWORK_UNREACHABLE\",\n }),\n );\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(\n `${String(redact(cliError.cause.stack ?? cliError.cause.message))}\\n`,\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 loginResponseSchema = z\n .object({\n access_token: z.string().min(1),\n user: userSchema,\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 const outlineItemSchema = z\n .object({\n rank: z.number().int(),\n heading: z.string(),\n chunk_id: z.string(),\n })\n .passthrough();\n\nexport const outlineSchema = z\n .object({\n document_id: z.string(),\n filename: z.string(),\n outline: z.array(outlineItemSchema),\n })\n .passthrough();\n\nexport const grepMatchSchema = z\n .object({\n chunk_id: z.string(),\n heading: z.string(),\n snippet: z.string(),\n })\n .passthrough();\n\nexport const grepResponseSchema = z\n .object({\n pattern: z.string(),\n matches: z.array(grepMatchSchema),\n count: z.number().int().nonnegative(),\n })\n .passthrough();\n\nexport const readResponseSchema = z\n .object({\n document_id: z.string(),\n filename: z.string(),\n total_lines: z.number().int().nonnegative(),\n offset: z.number().int().positive(),\n limit: z.number().int().positive(),\n lines: z.array(z.string()),\n })\n .passthrough();\n\nexport const entityContextSchema = z\n .object({\n entity_id: z.string(),\n name: z.string(),\n type: z.string(),\n description: z.string(),\n context: z.string(),\n source_id: z.string(),\n source_name: z.string(),\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>;\nexport type SagOutline = z.infer<typeof outlineSchema>;\nexport type SagOutlineItem = z.infer<typeof outlineItemSchema>;\nexport type SagGrepResponse = z.infer<typeof grepResponseSchema>;\nexport type SagReadResponse = z.infer<typeof readResponseSchema>;\nexport type SagEntityContext = z.infer<typeof entityContextSchema>;\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 entityContextSchema,\n grepResponseSchema,\n loginResponseSchema,\n mcpDescriptorSchema,\n outlineSchema,\n readResponseSchema,\n readySchema,\n rootSchema,\n searchResponseSchema,\n sourceSchema,\n userSchema,\n type SagCapabilities,\n type SagDocument,\n type SagEntityContext,\n type SagGrepResponse,\n type SagMcpDescriptor,\n type SagOutline,\n type SagReadResponse,\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 timeoutMs?: number;\n}\n\nconst searchTimeoutMs = 15_000;\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 async login(name: string): Promise<{ accessToken: string; user: SagUser }> {\n const response = await this.#request(\"/api/v1/auth/login\", loginResponseSchema, {\n authenticated: false,\n method: \"POST\",\n body: { name },\n });\n return { accessToken: response.access_token, user: response.user };\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 timeoutMs: searchTimeoutMs,\n });\n }\n\n outline(sourceId: string, documentId: string): Promise<SagOutline> {\n const params = new URLSearchParams({ document_id: documentId });\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/outline?${params}`,\n outlineSchema,\n );\n }\n\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse> {\n const params = new URLSearchParams({ pattern });\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/grep?${params}`,\n grepResponseSchema,\n );\n }\n\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse> {\n const params = new URLSearchParams();\n if (offset !== undefined) {\n params.set(\"offset\", String(offset));\n }\n if (limit !== undefined) {\n params.set(\"limit\", String(limit));\n }\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}/read?${params}`,\n readResponseSchema,\n );\n }\n\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext> {\n return this.#request(\n `/api/v1/sources/${encodeURIComponent(sourceId)}/entities/${encodeURIComponent(name)}/context`,\n entityContextSchema,\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(options.timeoutMs ?? 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, StdioMcpConnectionSpec } from \"../mcp/connection.js\";\nimport type { McpVerificationReport, McpVerifyOptions } from \"../mcp/verifier.js\";\nimport {\n connectionKey,\n fingerprintConnection,\n type AgentAdapter,\n type PersonalAgentId,\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: StdioMcpConnectionSpec;\n}\n\nexport type AgentPlanAction = \"create\" | \"update\" | \"unchanged\";\n\nexport interface AgentConnectionPlan {\n action: AgentPlanAction;\n agent: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId;\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 if (!input.adapter.capabilities.transports.includes(resolved.spec.transport)) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `${input.agent} adapter does not support ${resolved.spec.transport} MCP connections`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"Choose a provider supported by the installed Agent adapter.\",\n },\n );\n }\n if (!input.adapter.capabilities.scopes.includes(input.scope)) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `${input.agent} adapter does not support ${input.scope} scope`,\n { exitCode: exitCodes.invalidArgument },\n );\n }\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 ProviderReport,\n StdioMcpConnectionSpec,\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<StdioMcpConnectionSpec> {\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 PersonalAgentId,\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?: {\n agent?: PersonalAgentId;\n scope?: AgentScope;\n }): Promise<ManagedConnection[]>;\n };\n adapters: Record<PersonalAgentId, AgentAdapter>;\n verifier: AgentMcpVerifier;\n}\n\nexport interface ConnectLocalAgentInput {\n agent: PersonalAgentId;\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: PersonalAgentId;\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: PersonalAgentId,\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?: PersonalAgentId;\n serverName: string;\n },\n): Promise<AgentStatusReport[]> {\n const agents: PersonalAgentId[] = input.agent\n ? [input.agent]\n : [\"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: PersonalAgentId;\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: PersonalAgentId;\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 name?: string;\n promptName(): Promise<string>;\n authenticate(name: string): Promise<{ accessToken: string; user: AuthUser }>;\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 environmentToken = input.environmentToken?.trim();\n if (environmentToken) {\n const user = await input.validate(environmentToken);\n await input.store.set(input.credentialRef, environmentToken);\n return {\n authenticated: true,\n credentialRef: input.credentialRef,\n credentialStore: input.store.kind,\n user,\n };\n }\n const name = (input.name ?? (await input.promptName())).trim();\n if (!name) {\n throw new CliError(\"INVALID_ARGUMENT\", \"A SAG user name is required\", {\n exitCode: exitCodes.invalidArgument,\n hint: \"Pass `--name <name>` or enter a name when prompted.\",\n });\n }\n const { accessToken, user } = await input.authenticate(name);\n await input.store.set(input.credentialRef, accessToken);\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 { CliError, exitCodes } from \"../core/errors.js\";\nimport type {\n SagEntityContext,\n SagGrepResponse,\n SagOutline,\n SagReadResponse,\n} from \"../api/schemas.js\";\n\nexport interface KnowledgeClient {\n outline(sourceId: string, documentId: string): Promise<SagOutline>;\n grep(sourceId: string, pattern: string, limit?: number): Promise<SagGrepResponse>;\n readDocument(\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n ): Promise<SagReadResponse>;\n getEntityContext(sourceId: string, name: string): Promise<SagEntityContext>;\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 async function outline(\n client: KnowledgeClient,\n sourceId: string,\n documentId: string,\n): Promise<SagOutline> {\n return client.outline(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(documentId, \"Document ID\"),\n );\n}\n\nexport async function grep(\n client: KnowledgeClient,\n sourceId: string,\n pattern: string,\n limit?: number,\n): Promise<SagGrepResponse> {\n return client.grep(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(pattern, \"Pattern\"),\n limit,\n );\n}\n\nexport async function read(\n client: KnowledgeClient,\n sourceId: string,\n documentId: string,\n offset?: number,\n limit?: number,\n): Promise<SagReadResponse> {\n return client.readDocument(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(documentId, \"Document ID\"),\n offset,\n limit,\n );\n}\n\nexport async function getEntityContext(\n client: KnowledgeClient,\n sourceId: string,\n name: string,\n): Promise<SagEntityContext> {\n return client.getEntityContext(\n requiredIdentifier(sourceId, \"Source ID\"),\n requiredIdentifier(name, \"Entity name\"),\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 type LocalMcpTestReport = 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 { CredentialStore } from \"../../credentials/store.js\";\nimport type { EnterpriseMcpConnection } from \"./model.js\";\n\nexport type EnterpriseMcpCredentialStores = Readonly<\n Record<EnterpriseMcpConnection[\"credentialStore\"], CredentialStore>\n>;\n\nexport function credentialStoreForEnterpriseMcpConnection(\n connection: EnterpriseMcpConnection,\n stores: EnterpriseMcpCredentialStores,\n): CredentialStore {\n return stores[connection.credentialStore];\n}\n","import { createHash } from \"node:crypto\";\n\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport type { ParsedEnterpriseServer, ParseEnterpriseMcpOptions } from \"./model.js\";\n\ninterface RawServer {\n transport?: unknown;\n type?: unknown;\n url?: unknown;\n headers?: unknown;\n}\n\nexport interface EnterpriseMcpServerCandidate {\n serverKey: string;\n raw: unknown;\n}\n\nfunction invalidImport(message: string, cause?: unknown): CliError {\n return new CliError(\"INVALID_ARGUMENT\", message, {\n exitCode: exitCodes.invalidArgument,\n ...(cause ? { cause } : {}),\n });\n}\n\nfunction parseDocument(input: string): Record<string, RawServer> {\n let decoded: unknown;\n try {\n decoded = JSON.parse(input);\n } catch (cause) {\n throw invalidImport(\"MCP 连接信息必须是有效的 JSON\", cause);\n }\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) {\n throw invalidImport(\"MCP 连接信息必须是 JSON 对象\");\n }\n\n const root = decoded as Record<string, unknown>;\n if (Object.keys(root).length !== 1 || !(\"mcpServers\" in root)) {\n throw invalidImport(\"MCP 连接信息的根字段必须且只能使用 mcpServers\");\n }\n const servers = root.mcpServers;\n if (!servers || typeof servers !== \"object\" || Array.isArray(servers)) {\n throw invalidImport(\"MCP 连接信息必须包含服务器配置\");\n }\n const parsedServers = servers as Record<string, RawServer>;\n if (!Object.keys(parsedServers).length) {\n throw invalidImport(\"MCP 连接信息中没有服务器\");\n }\n return parsedServers;\n}\n\nfunction hasForbiddenRawUrlDelimiter(value: string): boolean {\n const schemeEnd = value.indexOf(\"://\");\n const authorityAndPath = schemeEnd < 0 ? \"\" : value.slice(schemeEnd + 3);\n const authorityEnd = authorityAndPath.search(/[/?#]/u);\n const authority =\n authorityEnd < 0 ? authorityAndPath : authorityAndPath.slice(0, authorityEnd);\n return authority.includes(\"@\") || value.includes(\"#\");\n}\n\nfunction parseUrl(value: unknown, options: ParseEnterpriseMcpOptions): string {\n if (typeof value !== \"string\") {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n if (hasForbiddenRawUrlDelimiter(value)) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n\n let url: URL;\n try {\n url = new URL(value);\n } catch (cause) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\", cause);\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n !url.hostname ||\n url.username ||\n url.password\n ) {\n throw invalidImport(\"MCP 服务器 URL 必须是完整的 HTTP 或 HTTPS 地址\");\n }\n\n const localHosts = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n if (\n url.protocol === \"http:\" &&\n !options.allowInsecureHttp &&\n !localHosts.has(url.hostname)\n ) {\n throw invalidImport(\"远程 MCP 服务器 URL 必须使用 HTTPS\");\n }\n return url.toString();\n}\n\nexport function parseEnterpriseMcpHeaders(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw invalidImport(\"MCP 服务器配置必须包含 Authorization 请求头\");\n }\n\n const entries = Object.entries(value as Record<string, unknown>);\n let authorizationCount = 0;\n for (const [name, headerValue] of entries) {\n if (typeof headerValue !== \"string\") {\n throw invalidImport(\"MCP 服务器请求头的值必须是字符串\");\n }\n try {\n new Headers({ [name]: headerValue });\n } catch {\n throw invalidImport(\"MCP 服务器请求头无效\");\n }\n if (name.toLowerCase() === \"authorization\") {\n authorizationCount += 1;\n if (!headerValue.trim().startsWith(\"Bearer \")) {\n throw invalidImport(\"MCP Authorization 请求头必须使用 Bearer Token\");\n }\n }\n }\n if (authorizationCount !== 1) {\n throw invalidImport(\"MCP 服务器配置必须包含且只能包含一个 Authorization 请求头\");\n }\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction parseServer(\n serverKey: string,\n raw: unknown,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw invalidImport(\"MCP 服务器配置必须是对象\");\n }\n const server = raw as RawServer;\n if (server.type !== undefined && server.type !== \"http\") {\n throw invalidImport(\"MCP 服务器 type 必须是 http\");\n }\n if (\n server.transport !== undefined &&\n server.transport !== \"streamable_http\" &&\n server.transport !== \"streamable-http\"\n ) {\n throw invalidImport(\"MCP 服务器 transport 必须是 streamable_http\");\n }\n\n const connection: HttpMcpConnectionSpec = {\n transport: \"streamable-http\",\n url: parseUrl(server.url, options),\n headers: parseEnterpriseMcpHeaders(server.headers),\n };\n return { serverKey, preferredId: serverKey, connection };\n}\n\nexport function parseEnterpriseMcpDocument(\n raw: string,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer[] {\n return parseEnterpriseMcpCandidates(raw).map((candidate) =>\n validateEnterpriseMcpServer(candidate, options),\n );\n}\n\nexport function parseEnterpriseMcpCandidates(\n raw: string,\n): EnterpriseMcpServerCandidate[] {\n return Object.entries(parseDocument(raw)).map(([serverKey, server]) => ({\n serverKey,\n raw: server,\n }));\n}\n\nexport function validateEnterpriseMcpServer(\n candidate: EnterpriseMcpServerCandidate,\n options: ParseEnterpriseMcpOptions,\n): ParsedEnterpriseServer {\n return parseServer(candidate.serverKey, candidate.raw, options);\n}\n\nfunction selectByServerKey<T extends { serverKey: string }>(\n servers: readonly T[],\n requested: readonly string[] = [],\n): T[] {\n if (!requested.length) return [...servers];\n\n const serversByKey = new Map(servers.map((server) => [server.serverKey, server]));\n return requested.map((serverKey) => {\n const server = serversByKey.get(serverKey);\n if (!server) {\n throw invalidImport(`找不到 MCP 服务器:${serverKey}`);\n }\n return server;\n });\n}\n\nexport function selectEnterpriseMcpCandidates(\n servers: readonly EnterpriseMcpServerCandidate[],\n requested: readonly string[] = [],\n): EnterpriseMcpServerCandidate[] {\n return selectByServerKey(servers, requested);\n}\n\nexport function selectEnterpriseServers(\n servers: readonly ParsedEnterpriseServer[],\n requested: readonly string[] = [],\n): ParsedEnterpriseServer[] {\n return selectByServerKey(servers, requested);\n}\n\nexport function connectionIdForCollision(serverKey: string, url: string): string {\n return `${serverKey}-${createHash(\"sha256\").update(new URL(url).toString()).digest(\"hex\").slice(0, 8)}`;\n}\n","import { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport {\n credentialStoreForEnterpriseMcpConnection,\n type EnterpriseMcpCredentialStores,\n} from \"./credentials.js\";\nimport { parseEnterpriseMcpHeaders } from \"./import.js\";\nimport type { EnterpriseMcpConnection } from \"./model.js\";\n\nfunction credentialFailure(): CliError {\n return new CliError(\"MCP_FAILED\", \"企业 MCP 凭据不可用或无效\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查企业 MCP 凭据存储,必要时重新连接。\",\n });\n}\n\nexport async function resolveEnterpriseMcpSpec(\n connection: EnterpriseMcpConnection,\n stores: EnterpriseMcpCredentialStores,\n): Promise<HttpMcpConnectionSpec> {\n const store = credentialStoreForEnterpriseMcpConnection(connection, stores);\n let encodedCredential: string | null;\n try {\n encodedCredential = await store.get(connection.credentialRef);\n } catch {\n throw credentialFailure();\n }\n if (!encodedCredential) {\n throw credentialFailure();\n }\n\n try {\n return {\n transport: connection.transport,\n url: connection.url,\n headers: parseEnterpriseMcpHeaders(JSON.parse(encodedCredential)),\n };\n } catch {\n throw credentialFailure();\n }\n}\n","import { isDeepStrictEqual } from \"node:util\";\n\nimport { connectionKey, fingerprintValue, type AgentId } from \"../../agents/adapter.js\";\nimport type { AgentMcpVerifier } from \"../../agents/orchestrator.js\";\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { CredentialStore } from \"../../credentials/store.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport {\n attachEnterpriseMcp,\n detachEnterpriseMcp,\n inspectEnterpriseAgent,\n refreshManagedAgents,\n type EnterpriseMcpAgentRuntime,\n} from \"./agent-service.js\";\nimport type { EnterpriseMcpCredentialStores } from \"./credentials.js\";\nimport {\n connectionIdForCollision,\n parseEnterpriseMcpCandidates,\n selectEnterpriseMcpCandidates,\n validateEnterpriseMcpServer,\n type EnterpriseMcpServerCandidate,\n} from \"./import.js\";\nimport type {\n EnterpriseMcpConnection,\n McpToolSummary,\n ParsedEnterpriseServer,\n StageResult,\n ToolRiskSummary,\n} from \"./model.js\";\nimport { classifyTools } from \"./risk.js\";\nimport {\n inspectEnterpriseSkill,\n installEnterpriseSkill,\n uninstallEnterpriseSkill,\n type EnterpriseMcpSkillRuntime,\n} from \"./skill-service.js\";\nimport { resolveEnterpriseMcpSpec } from \"./runtime.js\";\nimport type {\n EnterpriseMcpConnectionState,\n EnterpriseMcpConnectionStore,\n} from \"./store.js\";\n\nexport type EnterpriseMcpCollisionAction = \"replace\" | \"keep-both\";\n\nexport interface EnterpriseMcpServerChoice {\n serverKey: string;\n}\n\nexport interface EnterpriseMcpCollisionChoice {\n serverKey: string;\n existingUrl: string;\n incomingUrl: string;\n}\n\nexport interface EnterpriseMcpConnectRuntime {\n store: EnterpriseMcpConnectionStore;\n credentials: EnterpriseMcpCredentialStores;\n verifier: AgentMcpVerifier;\n agents: EnterpriseMcpAgentRuntime;\n skill: EnterpriseMcpSkillRuntime;\n client?: EnterpriseMcpLifecycleHttpClient;\n now(): Date;\n}\n\nexport interface EnterpriseMcpLifecycleHttpClient {\n listTools(\n spec: HttpMcpConnectionSpec,\n options: { cliVersion: string; timeoutMs: number },\n ): Promise<{ tools: readonly McpToolSummary[] }>;\n callTool(input: {\n spec: HttpMcpConnectionSpec;\n cliVersion: string;\n timeoutMs: number;\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n }): Promise<{ tool: string; result: unknown }>;\n}\n\nexport interface EnterpriseConnectConnectionReport {\n serverKey: string;\n id: string;\n url: string;\n toolCount: number;\n risk: ToolRiskSummary;\n persisted: boolean;\n}\n\nexport interface EnterpriseConnectReport {\n kind: \"enterprise-mcp-stages\";\n dryRun: boolean;\n activeId: string | null;\n plannedActiveId?: string;\n connections: EnterpriseConnectConnectionReport[];\n stages: StageResult[];\n}\n\nexport interface ConnectEnterpriseMcpInput {\n runtime: EnterpriseMcpConnectRuntime;\n raw: string;\n requestedServers: readonly string[];\n requestedAgents: readonly AgentId[];\n credentialStore: EnterpriseMcpConnection[\"credentialStore\"];\n collisionAction?: EnterpriseMcpCollisionAction;\n allowInsecureHttp: boolean;\n timeoutMs: number;\n yes: boolean;\n noSkill: boolean;\n dryRun: boolean;\n interactive: boolean;\n selectMcpServers(\n servers: readonly EnterpriseMcpServerChoice[],\n ): Promise<readonly string[]>;\n selectAgents(agents: readonly AgentId[]): Promise<readonly AgentId[]>;\n selectCollisionAction(\n collision: EnterpriseMcpCollisionChoice,\n ): Promise<EnterpriseMcpCollisionAction>;\n}\n\ninterface VerifiedServer {\n parsed: ParsedEnterpriseServer;\n tools: McpToolSummary[];\n risk: ToolRiskSummary;\n observedAt: string;\n}\n\nconst supportedAgents = [\"codex\", \"claude-code\", \"workbuddy\"] as const;\n\nexport async function resolveEnterpriseMcpConnection(input: {\n store: EnterpriseMcpConnectionStore;\n server?: string;\n}): Promise<EnterpriseMcpConnection> {\n if (input.server !== undefined) {\n const id = input.server.trim();\n if (!id) {\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 连接名称不能为空\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n const connection = await input.store.get(id);\n if (connection) {\n return connection;\n }\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到企业 MCP 连接:${id}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n\n const connection = await input.store.active();\n if (connection) {\n return connection;\n }\n throw new CliError(\"RESOURCE_NOT_FOUND\", \"当前没有正在使用的企业 MCP 连接\", {\n exitCode: exitCodes.resourceNotFound,\n hint: \"请先选择或导入一个企业 MCP 连接。\",\n });\n}\n\nasync function restoreCredential(\n credentials: CredentialStore,\n reference: string,\n previous: string | null,\n): Promise<void> {\n if (previous === null) {\n await credentials.delete(reference);\n return;\n }\n await credentials.set(reference, previous);\n}\n\nfunction assertCredentialRef(connection: EnterpriseMcpConnection): void {\n if (connection.credentialRef !== `enterprise-mcp/${connection.id}`) {\n throw new CliError(\"INVALID_ARGUMENT\", \"企业 MCP 凭据引用无效\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n}\n\nasync function restoreAndVerifyPersistence(input: {\n credentials: CredentialStore;\n store: EnterpriseMcpConnectionStore;\n reference: string;\n previousCredential: string | null;\n previousState: EnterpriseMcpConnectionState;\n failure: unknown;\n restoreConnection: boolean;\n}): Promise<void> {\n const {\n credentials,\n failure,\n previousCredential,\n previousState,\n reference,\n restoreConnection,\n store,\n } = input;\n const recoveryFailures: unknown[] = [];\n const operations = await Promise.allSettled([\n ...(restoreConnection ? [store.restore({ previous: previousState })] : []),\n restoreCredential(credentials, reference, previousCredential),\n ]);\n if (restoreConnection && operations[0]?.status === \"rejected\") {\n recoveryFailures.push(operations[0].reason);\n }\n const credentialRestore = operations.at(-1);\n if (credentialRestore?.status === \"rejected\") {\n recoveryFailures.push(credentialRestore.reason);\n }\n\n const [stateReadback, credentialReadback] = await Promise.allSettled([\n store.load(),\n credentials.get(reference),\n ]);\n if (\n stateReadback.status === \"rejected\" ||\n !isDeepStrictEqual(stateReadback.value, previousState)\n ) {\n recoveryFailures.push(new Error(\"无法验证企业 MCP 连接是否已回滚\"));\n }\n if (\n credentialReadback.status === \"rejected\" ||\n credentialReadback.value !== previousCredential\n ) {\n recoveryFailures.push(new Error(\"无法验证企业 MCP 凭据是否已回滚\"));\n }\n\n if (recoveryFailures.length) {\n throw new AggregateError(\n [failure, ...recoveryFailures],\n \"企业 MCP 持久化恢复过程中出现其他失败\",\n { cause: failure },\n );\n }\n}\n\nasync function recover(input: {\n credentials: CredentialStore;\n store: EnterpriseMcpConnectionStore;\n reference: string;\n previousCredential: string | null;\n previousState: EnterpriseMcpConnectionState;\n failure: unknown;\n restoreConnection: boolean;\n}): Promise<never> {\n await restoreAndVerifyPersistence(input);\n throw input.failure;\n}\n\nexport async function persistVerifiedConnection(input: {\n store: EnterpriseMcpConnectionStore;\n credentials: CredentialStore;\n connection: EnterpriseMcpConnection;\n encodedCredential: string;\n}): Promise<void> {\n const { connection, credentials, encodedCredential, store } = input;\n assertCredentialRef(connection);\n\n await store.withPersistenceLock(async () => {\n const previousState = await store.load();\n const previousCredential = await credentials.get(connection.credentialRef);\n\n try {\n await credentials.set(connection.credentialRef, encodedCredential);\n } catch (failure) {\n return recover({\n credentials,\n store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure,\n restoreConnection: false,\n });\n }\n\n try {\n await store.upsert(connection);\n const [persistedConnection, persistedCredential] = await Promise.all([\n store.get(connection.id),\n credentials.get(connection.credentialRef),\n ]);\n if (!isDeepStrictEqual(persistedConnection, connection)) {\n throw new Error(\"企业 MCP 连接未能持久化\");\n }\n if (persistedCredential !== encodedCredential) {\n throw new Error(\"企业 MCP 凭据未能持久化\");\n }\n } catch (failure) {\n return recover({\n credentials,\n store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure,\n restoreConnection: true,\n });\n }\n });\n}\n\nfunction stageSuccess(\n stage: StageResult[\"stage\"],\n target: string,\n status: Exclude<StageResult[\"status\"], \"failed\">,\n message: string,\n): StageResult {\n return { stage, target, ok: true, status, message };\n}\n\nfunction stageFailure(\n stage: StageResult[\"stage\"],\n target: string,\n cause: unknown,\n message: string,\n): StageResult {\n const code =\n cause instanceof CliError\n ? cause.code\n : stage === \"verify\" || stage === \"reverify\"\n ? \"MCP_FAILED\"\n : stage === \"agent\"\n ? \"HOST_CONFIG_FAILED\"\n : \"INTERNAL_ERROR\";\n return { stage, target, ok: false, status: \"failed\", code, message };\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nasync function selectServers(\n input: ConnectEnterpriseMcpInput,\n servers: readonly EnterpriseMcpServerCandidate[],\n): Promise<EnterpriseMcpServerCandidate[]> {\n if (input.requestedServers.length) {\n return unique(\n selectEnterpriseMcpCandidates(servers, unique(input.requestedServers)).map(\n (server) => server.serverKey,\n ),\n ).map(\n (serverKey) =>\n servers.find(\n (server) => server.serverKey === serverKey,\n ) as EnterpriseMcpServerCandidate,\n );\n }\n if (!input.interactive) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n \"请至少使用一次 --server 明确选择 MCP Server\",\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"可重复使用 --server 选择多个 Server;--yes 不会自动选择目标。\",\n },\n );\n }\n const requested = await input.selectMcpServers(\n servers.map((server) => ({\n serverKey: server.serverKey,\n })),\n );\n if (!requested.length) return [];\n return selectEnterpriseMcpCandidates(servers, unique(requested));\n}\n\nasync function selectInstalledAgents(\n input: ConnectEnterpriseMcpInput,\n): Promise<AgentId[]> {\n if (input.requestedAgents.length) return unique(input.requestedAgents);\n if (!input.interactive) return [];\n\n const detected = await Promise.all(\n supportedAgents.map(async (agent) => {\n try {\n await input.runtime.agents.adapters[agent].detect();\n return agent;\n } catch {\n return null;\n }\n }),\n );\n const installed = detected.filter((agent): agent is AgentId => agent !== null);\n return unique(await input.selectAgents(installed));\n}\n\nasync function verifyServer(\n runtime: EnterpriseMcpConnectRuntime,\n server: ParsedEnterpriseServer,\n timeoutMs: number,\n): Promise<VerifiedServer> {\n const report = await runtime.verifier.verify(server.connection, { timeoutMs });\n if (report.transport !== \"streamable-http\") {\n throw new CliError(\"MCP_FAILED\", \"企业 MCP 返回了不支持的传输类型\", {\n exitCode: exitCodes.mcpFailed,\n });\n }\n const tools = [...report.tools];\n return {\n parsed: server,\n tools,\n risk: classifyTools(tools),\n observedAt: runtime.now().toISOString(),\n };\n}\n\nasync function connectionIdentity(input: {\n connect: ConnectEnterpriseMcpInput;\n server: ParsedEnterpriseServer;\n}): Promise<{ id: string; previous: EnterpriseMcpConnection | null }> {\n const preferred = await input.connect.runtime.store.get(input.server.preferredId);\n if (!preferred || preferred.url === input.server.connection.url) {\n return { id: input.server.preferredId, previous: preferred };\n }\n\n let action = input.connect.collisionAction;\n if (!action) {\n if (!input.connect.interactive) {\n throw new CliError(\n \"CONFIG_CONFLICT\",\n `MCP Server ${input.server.serverKey} 已保存为其他 URL`,\n {\n exitCode: exitCodes.configConflict,\n hint: \"自动化请明确使用 --replace 或 --keep-both。\",\n },\n );\n }\n action = await input.connect.selectCollisionAction({\n serverKey: input.server.serverKey,\n existingUrl: preferred.url,\n incomingUrl: input.server.connection.url,\n });\n }\n if (action === \"replace\") {\n return { id: input.server.preferredId, previous: preferred };\n }\n\n const id = connectionIdForCollision(\n input.server.serverKey,\n input.server.connection.url,\n );\n return { id, previous: await input.connect.runtime.store.get(id) };\n}\n\nfunction buildConnection(input: {\n verified: VerifiedServer;\n id: string;\n previous: EnterpriseMcpConnection | null;\n credentialStore: EnterpriseMcpConnection[\"credentialStore\"];\n now: string;\n}): EnterpriseMcpConnection {\n const { id, previous, verified } = input;\n return {\n id,\n serverKey: verified.parsed.serverKey,\n preferredId: verified.parsed.preferredId,\n transport: \"streamable-http\",\n url: verified.parsed.connection.url,\n headerNames: Object.keys(verified.parsed.connection.headers).sort((left, right) =>\n left.localeCompare(right),\n ),\n credentialStore: input.credentialStore,\n credentialRef: `enterprise-mcp/${id}`,\n toolSnapshot: {\n count: verified.tools.length,\n fingerprint: fingerprintValue(verified.tools),\n risk: verified.risk,\n observedAt: verified.observedAt,\n },\n createdAt: previous?.createdAt ?? input.now,\n updatedAt: input.now,\n lastVerifiedAt: input.now,\n };\n}\n\nfunction translatedAgentStage(result: StageResult): StageResult {\n return {\n ...result,\n message: result.ok\n ? result.status === \"skipped\"\n ? \"Agent 中的企业 MCP 配置已经是最新状态。\"\n : \"Agent 中的企业 MCP 配置已完成并通过验证。\"\n : \"Agent 中的企业 MCP 配置未能更新,请检查该 Agent 后重试。\",\n };\n}\n\nasync function reverifyAgent(\n input: ConnectEnterpriseMcpInput,\n agent: AgentId,\n connectionId: string,\n spec: HttpMcpConnectionSpec,\n): Promise<StageResult> {\n const target = `${agent}:${connectionId}`;\n try {\n await input.runtime.verifier.verify(spec, { timeoutMs: input.timeoutMs });\n return stageSuccess(\n \"reverify\",\n target,\n \"updated\",\n input.dryRun ? \"已完成只读的最终验证计划。\" : \"Agent 接入后的 MCP 已再次验证。\",\n );\n } catch (cause) {\n return stageFailure(\n \"reverify\",\n target,\n cause,\n \"Agent 接入后的 MCP 最终验证失败,请检查该 Agent 后重试。\",\n );\n }\n}\n\nasync function attachSelectedAgent(input: {\n connect: ConnectEnterpriseMcpInput;\n connection: EnterpriseMcpConnection;\n spec: HttpMcpConnectionSpec;\n agent: AgentId;\n}): Promise<{ stage: StageResult; connected: boolean }> {\n let confirmed = true;\n const runtime: EnterpriseMcpAgentRuntime = {\n ...input.connect.runtime.agents,\n confirm: async () => {\n confirmed = await input.connect.runtime.agents.confirm(\n `Agent ${input.agent} 中已有同名 MCP,是否由 sag-cli 接管并替换?`,\n );\n return confirmed;\n },\n };\n try {\n const result = await attachEnterpriseMcp(runtime, {\n connection: input.connection,\n spec: input.spec,\n agent: input.agent,\n yes: input.connect.yes,\n timeoutMs: input.connect.timeoutMs,\n dryRun: input.connect.dryRun,\n });\n return { stage: translatedAgentStage(result), connected: confirmed };\n } catch (cause) {\n return {\n stage: stageFailure(\n \"agent\",\n input.agent,\n cause,\n \"Agent 中的企业 MCP 配置失败;已保存的连接不受影响。\",\n ),\n connected: false,\n };\n }\n}\n\nfunction skippedAgentStage(agent: AgentId): StageResult {\n return stageSuccess(\n \"agent\",\n agent,\n \"skipped\",\n \"MCP 未返回可用工具,已跳过新的 Agent 配置。\",\n );\n}\n\nfunction skippedSkillStage(agent: AgentId): StageResult {\n return stageSuccess(\n \"skill\",\n agent,\n \"skipped\",\n \"MCP 未返回可用工具,已跳过 Skill 安装。\",\n );\n}\n\nasync function installSkillForAgent(\n input: ConnectEnterpriseMcpInput,\n agent: AgentId,\n): Promise<StageResult> {\n if (input.noSkill) {\n return stageSuccess(\"skill\", agent, \"skipped\", \"已按 --no-skill 跳过 Skill 安装。\");\n }\n if (input.dryRun) {\n return stageSuccess(\n \"skill\",\n agent,\n \"created\",\n \"已生成 Skill 安装计划,未写入文件或备份。\",\n );\n }\n const result = await installEnterpriseSkill({ ...input.runtime.skill, agent });\n return {\n ...result,\n message: result.ok\n ? \"企业 SAG MCP Skill 已安装。\"\n : \"Skill 安装失败;连接和 Agent MCP 配置保持不变。\",\n };\n}\n\nexport async function connectEnterpriseMcp(\n input: ConnectEnterpriseMcpInput,\n): Promise<EnterpriseConnectReport> {\n const candidates = parseEnterpriseMcpCandidates(input.raw);\n const selected = await selectServers(input, candidates);\n const stages: StageResult[] = [];\n const verified: VerifiedServer[] = [];\n\n for (const candidate of selected) {\n let server: ParsedEnterpriseServer;\n try {\n server = validateEnterpriseMcpServer(candidate, {\n allowInsecureHttp: input.allowInsecureHttp,\n });\n stages.push(\n stageSuccess(\n \"parse\",\n candidate.serverKey,\n \"created\",\n \"MCP Server 输入校验通过。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"parse\",\n candidate.serverKey,\n cause,\n \"MCP Server 输入校验失败,其他已选 Server 将继续处理。\",\n ),\n );\n continue;\n }\n try {\n const result = await verifyServer(input.runtime, server, input.timeoutMs);\n verified.push(result);\n stages.push(\n stageSuccess(\n \"verify\",\n server.serverKey,\n \"updated\",\n \"MCP 初始化和工具列表验证通过。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"verify\",\n server.serverKey,\n cause,\n \"MCP 验证失败,请检查该 Server 的地址和凭据。\",\n ),\n );\n }\n }\n\n const agents = verified.length ? await selectInstalledAgents(input) : [];\n const initialActive = await input.runtime.store.active();\n const connections: EnterpriseConnectConnectionReport[] = [];\n const skillEligibleAgents = new Set<AgentId>();\n const zeroToolSkillAgents = new Set<AgentId>();\n const reverifications: Array<{\n agent: AgentId;\n connectionId: string;\n spec: HttpMcpConnectionSpec;\n }> = [];\n let plannedActiveId: string | undefined;\n\n for (const item of verified) {\n let connection: EnterpriseMcpConnection;\n let previous: EnterpriseMcpConnection | null;\n try {\n const identity = await connectionIdentity({\n connect: input,\n server: item.parsed,\n });\n previous = identity.previous;\n if (previous && previous.credentialStore !== input.credentialStore) {\n throw new CliError(\n \"CONFIG_CONFLICT\",\n \"不能直接切换企业 MCP 的凭据存储;请先断开连接,再使用所需存储重新连接。\",\n {\n exitCode: exitCodes.configConflict,\n hint: \"先运行 sag mcp disconnect,再重新运行 sag mcp connect。\",\n },\n );\n }\n connection = buildConnection({\n verified: item,\n id: identity.id,\n previous,\n credentialStore: input.credentialStore,\n now: input.runtime.now().toISOString(),\n });\n if (!input.dryRun) {\n await persistVerifiedConnection({\n store: input.runtime.store,\n credentials: input.runtime.credentials[input.credentialStore],\n connection,\n encodedCredential: JSON.stringify(item.parsed.connection.headers),\n });\n await input.runtime.store.use(connection.id);\n }\n plannedActiveId = connection.id;\n connections.push({\n serverKey: item.parsed.serverKey,\n id: connection.id,\n url: connection.url,\n toolCount: item.tools.length,\n risk: item.risk,\n persisted: !input.dryRun,\n });\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n previous ? \"updated\" : \"created\",\n input.dryRun\n ? \"已生成连接和凭据保存计划,未写入本机状态。\"\n : \"连接元数据和凭据已保存。\",\n ),\n );\n } catch (cause) {\n stages.push(\n stageFailure(\n \"persist\",\n item.parsed.serverKey,\n cause,\n cause instanceof CliError && cause.code === \"CONFIG_CONFLICT\"\n ? cause.message\n : \"连接未能保存;其他 Server 不受影响。\",\n ),\n );\n continue;\n }\n\n const successfulAgents = new Set<AgentId>();\n const refreshedAgents = new Set<AgentId>();\n if (previous) {\n try {\n const refreshed = await refreshManagedAgents(input.runtime.agents, {\n connection,\n spec: item.parsed.connection,\n timeoutMs: input.timeoutMs,\n dryRun: input.dryRun,\n });\n for (const result of refreshed) {\n const translated = translatedAgentStage(result);\n stages.push(translated);\n if (supportedAgents.includes(result.target as AgentId)) {\n const agent = result.target as AgentId;\n refreshedAgents.add(agent);\n if (result.ok) successfulAgents.add(agent);\n }\n }\n } catch (cause) {\n stages.push(\n stageFailure(\n \"agent\",\n connection.id,\n cause,\n \"无法读取受管 Agent 状态;已保存的连接保持有效,其他 Server 将继续处理。\",\n ),\n );\n }\n }\n\n if (item.tools.length === 0) {\n for (const agent of successfulAgents) {\n reverifications.push({\n agent,\n connectionId: connection.id,\n spec: item.parsed.connection,\n });\n }\n for (const agent of agents) {\n stages.push(skippedAgentStage(agent));\n zeroToolSkillAgents.add(agent);\n }\n continue;\n }\n\n let riskAccepted = input.yes || input.dryRun || !item.risk.hasWarning;\n if (!riskAccepted && agents.length) {\n riskAccepted = await input.runtime.agents.confirm(\n `MCP ${connection.id} 含有写入、删除或风险未知的工具,是否继续接入所选 Agent?`,\n );\n }\n\n for (const agent of agents) {\n if (!riskAccepted) {\n stages.push(\n stageSuccess(\n \"agent\",\n agent,\n \"skipped\",\n \"用户取消了风险确认,未修改 Agent 配置。\",\n ),\n );\n continue;\n }\n if (refreshedAgents.has(agent)) continue;\n const attached = await attachSelectedAgent({\n connect: input,\n connection,\n spec: item.parsed.connection,\n agent,\n });\n stages.push(attached.stage);\n if (attached.stage.ok && attached.connected) successfulAgents.add(agent);\n }\n\n for (const agent of successfulAgents) {\n if (agents.includes(agent)) skillEligibleAgents.add(agent);\n reverifications.push({\n agent,\n connectionId: connection.id,\n spec: item.parsed.connection,\n });\n }\n }\n\n for (const agent of agents) {\n if (skillEligibleAgents.has(agent)) {\n stages.push(await installSkillForAgent(input, agent));\n } else if (zeroToolSkillAgents.has(agent)) {\n stages.push(skippedSkillStage(agent));\n }\n }\n for (const reverify of reverifications) {\n stages.push(\n await reverifyAgent(input, reverify.agent, reverify.connectionId, reverify.spec),\n );\n }\n\n const active = input.dryRun ? initialActive : await input.runtime.store.active();\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n activeId: active?.id ?? null,\n ...(plannedActiveId === undefined ? {} : { plannedActiveId }),\n connections,\n stages,\n };\n}\n\nexport interface EnterpriseMcpStagesReport {\n kind: \"enterprise-mcp-stages\";\n dryRun: boolean;\n connection?: { id: string; endpoint: string };\n stages: StageResult[];\n nextActions: string[];\n}\n\nexport interface EnterpriseMcpAgentStatus {\n agent: AgentId;\n mcp: \"connected\" | \"disconnected\" | \"drifted\" | \"unavailable\";\n skill: \"valid\" | \"missing\" | \"drifted\" | \"unmanaged\" | \"unavailable\";\n nextActions: string[];\n}\n\nexport interface EnterpriseMcpStatusReport {\n kind: \"enterprise-mcp-status\";\n connection: { id: string; active: boolean; endpoint: string };\n health: \"ready\" | \"unavailable\";\n toolCount: number;\n risk: ToolRiskSummary;\n agents: EnterpriseMcpAgentStatus[];\n nextActions: string[];\n}\n\ninterface EnterpriseMcpMutationInput {\n runtime: EnterpriseMcpConnectRuntime;\n server?: string;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n}\n\nfunction publicConnection(connection: EnterpriseMcpConnection): {\n id: string;\n endpoint: string;\n} {\n return { id: connection.id, endpoint: connection.url };\n}\n\nfunction cancelledStage(\n stage: Extract<StageResult[\"stage\"], \"agent\" | \"skill\" | \"persist\">,\n target: string,\n): StageResult {\n return stageSuccess(stage, target, \"skipped\", \"用户取消了操作,未修改本机状态。\");\n}\n\nasync function mutationConfirmed(\n input: Pick<EnterpriseMcpMutationInput, \"dryRun\" | \"yes\" | \"confirm\">,\n message: string,\n): Promise<boolean> {\n return input.dryRun || input.yes || input.confirm(message);\n}\n\nfunction lifecycleAgentStage(\n target: AgentId,\n cause: unknown,\n message: string,\n): StageResult {\n return stageFailure(\"agent\", target, cause, message);\n}\n\nfunction skillConflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请先检查该 Agent 的 sag-mcp Skill,再重试。\",\n });\n}\n\nexport async function attachEnterpriseMcpConnection(\n input: EnterpriseMcpMutationInput & {\n agent: AgentId;\n timeoutMs: number;\n noSkill: boolean;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (connection.toolSnapshot.count === 0) {\n throw new CliError(\"MCP_FAILED\", \"该企业 MCP 没有可用工具,不能接入 Agent。\", {\n exitCode: exitCodes.mcpFailed,\n hint: \"请检查平台权限或服务状态,确认 tools/list 返回工具后再重试。\",\n });\n }\n const spec = await resolveEnterpriseMcpSpec(connection, input.runtime.credentials);\n if (\n !(await mutationConfirmed(\n input,\n `将企业 MCP ${connection.id} 接入 ${input.agent}?`,\n ))\n ) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"agent\", input.agent)],\n nextActions: [],\n };\n }\n const stage = await attachEnterpriseMcp(input.runtime.agents, {\n connection,\n spec,\n agent: input.agent,\n yes: true,\n timeoutMs: input.timeoutMs,\n dryRun: input.dryRun,\n });\n const skillStage = input.noSkill\n ? stageSuccess(\"skill\", input.agent, \"skipped\", \"已按 --no-skill 跳过 Skill 安装。\")\n : input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n \"created\",\n \"已生成 Skill 安装计划,未写入文件或备份。\",\n )\n : await installEnterpriseSkill({ ...input.runtime.skill, agent: input.agent });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages: [translatedAgentStage(stage), skillStage],\n nextActions: [\n ...(skillStage.ok ? [] : [`sag mcp skill install --agent ${input.agent}`]),\n `sag mcp status --server ${connection.id}`,\n ],\n };\n}\n\nexport async function detachEnterpriseMcpConnection(\n input: EnterpriseMcpMutationInput & { agent: AgentId },\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (\n !(await mutationConfirmed(\n input,\n `从 ${input.agent} 移除企业 MCP ${connection.id}?`,\n ))\n ) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"agent\", input.agent)],\n nextActions: [],\n };\n }\n const stage = await detachEnterpriseMcp(input.runtime.agents, {\n connection,\n agent: input.agent,\n yes: true,\n dryRun: input.dryRun,\n });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages: [\n {\n ...stage,\n message: input.dryRun\n ? \"已检查受管 Agent 配置,将只移除指纹匹配的 MCP 项。\"\n : \"已从 Agent 移除受管企业 MCP 配置。\",\n },\n ],\n nextActions: [`sag mcp status --server ${connection.id}`],\n };\n}\n\nexport async function disconnectEnterpriseMcp(\n input: EnterpriseMcpMutationInput,\n): Promise<EnterpriseMcpStagesReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n if (!(await mutationConfirmed(input, `断开并删除企业 MCP ${connection.id}?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages: [cancelledStage(\"persist\", connection.id)],\n nextActions: [],\n };\n }\n\n const stages: StageResult[] = [];\n for (const agent of supportedAgents) {\n const managed = await input.runtime.agents.managed.getAgent(\n connectionKey(agent, \"user\", connection.id),\n );\n if (!managed) continue;\n try {\n await inspectEnterpriseAgent(input.runtime.agents, {\n connection,\n agent,\n });\n } catch (cause) {\n stages.push(\n lifecycleAgentStage(\n agent,\n cause,\n \"无法检查 Agent 中的受管 MCP;连接和凭据保持不变。\",\n ),\n );\n continue;\n }\n try {\n const detached = await detachEnterpriseMcp(input.runtime.agents, {\n connection,\n agent,\n yes: true,\n dryRun: input.dryRun,\n });\n stages.push({\n ...detached,\n message: input.dryRun\n ? \"已检查受管 Agent 配置,将移除指纹匹配的 MCP 项。\"\n : \"已从 Agent 移除受管企业 MCP 配置。\",\n });\n } catch (cause) {\n stages.push(\n lifecycleAgentStage(agent, cause, \"Agent MCP 移除失败;连接和凭据保持不变。\"),\n );\n }\n }\n\n if (stages.some((stage) => !stage.ok)) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n connection: publicConnection(connection),\n stages,\n nextActions: [`sag mcp status --server ${connection.id}`],\n };\n }\n\n if (input.dryRun) {\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n \"updated\",\n \"将先删除凭据,再删除连接记录;不会卸载共享 Skill。\",\n ),\n );\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: true,\n connection: publicConnection(connection),\n stages,\n nextActions: [\"sag mcp list\"],\n };\n }\n\n const credentialStore = input.runtime.credentials[connection.credentialStore];\n const previousState = await input.runtime.store.load();\n const previousCredential = await credentialStore.get(connection.credentialRef);\n const remaining = (await input.runtime.store.list())\n .filter((candidate) => candidate.id !== connection.id)\n .sort((left, right) => {\n const byUpdated = right.updatedAt.localeCompare(left.updatedAt);\n return byUpdated || left.id.localeCompare(right.id);\n });\n try {\n await credentialStore.delete(connection.credentialRef);\n await input.runtime.store.remove(connection.id);\n const next = remaining[0];\n if (next) await input.runtime.store.use(next.id);\n stages.push(\n stageSuccess(\n \"persist\",\n connection.id,\n \"updated\",\n \"凭据和连接记录已删除;共享 Skill 保持安装。\",\n ),\n );\n } catch (cause) {\n try {\n await restoreAndVerifyPersistence({\n credentials: credentialStore,\n store: input.runtime.store,\n reference: connection.credentialRef,\n previousCredential,\n previousState,\n failure: cause,\n restoreConnection: true,\n });\n } catch (recoveryFailure) {\n throw new CliError(\n \"INTERNAL_ERROR\",\n \"企业 MCP 删除失败,且连接、凭据或当前选择的恢复无法确认。\",\n {\n exitCode: exitCodes.internalError,\n cause: recoveryFailure,\n hint: \"请运行 `sag mcp list` 检查当前状态,并手动核对凭据存储。\",\n },\n );\n }\n stages.push(\n stageFailure(\n \"persist\",\n connection.id,\n cause,\n \"连接删除失败;连接、凭据和当前选择已恢复并验证。\",\n ),\n );\n }\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n connection: publicConnection(connection),\n stages,\n nextActions: stages.every((stage) => stage.ok)\n ? [\"sag mcp list\"]\n : [`sag mcp status --server ${connection.id}`],\n };\n}\n\nfunction mcpState(input: {\n connected: boolean;\n managed: boolean;\n drifted: boolean;\n}): EnterpriseMcpAgentStatus[\"mcp\"] {\n if (input.drifted) return \"drifted\";\n return input.connected && input.managed ? \"connected\" : \"disconnected\";\n}\n\nfunction skillState(input: {\n installed: boolean;\n managed: boolean;\n drifted: boolean;\n}): EnterpriseMcpAgentStatus[\"skill\"] {\n if (input.drifted) return \"drifted\";\n if (!input.installed) return \"missing\";\n return input.managed ? \"valid\" : \"unmanaged\";\n}\n\nexport async function inspectEnterpriseMcpStatus(input: {\n runtime: EnterpriseMcpConnectRuntime;\n server?: string;\n timeoutMs: number;\n}): Promise<EnterpriseMcpStatusReport> {\n const connection = await resolveEnterpriseMcpConnection({\n store: input.runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n const active = await input.runtime.store.active();\n let health: EnterpriseMcpStatusReport[\"health\"];\n let toolCount = connection.toolSnapshot.count;\n let risk = connection.toolSnapshot.risk;\n let resolvedSpec: HttpMcpConnectionSpec | undefined;\n try {\n resolvedSpec = await resolveEnterpriseMcpSpec(\n connection,\n input.runtime.credentials,\n );\n const verified = await input.runtime.verifier.verify(resolvedSpec, {\n timeoutMs: input.timeoutMs,\n });\n if (verified.transport !== \"streamable-http\") {\n throw new Error(\"unexpected enterprise MCP transport\");\n }\n const verifiedTools = [...verified.tools];\n toolCount = verifiedTools.length;\n risk = classifyTools(verifiedTools);\n health = \"ready\";\n } catch {\n health = \"unavailable\";\n }\n\n const agents = await Promise.all(\n supportedAgents.map(async (agent): Promise<EnterpriseMcpAgentStatus> => {\n const [mcpInspection, skillInspection] = await Promise.allSettled([\n inspectEnterpriseAgent(input.runtime.agents, {\n connection,\n agent,\n ...(resolvedSpec === undefined ? {} : { spec: resolvedSpec }),\n }),\n inspectEnterpriseSkill({ ...input.runtime.skill, agent }),\n ]);\n const mcp =\n mcpInspection.status === \"fulfilled\"\n ? mcpState(mcpInspection.value)\n : \"unavailable\";\n const skill =\n skillInspection.status === \"fulfilled\"\n ? skillState(skillInspection.value)\n : \"unavailable\";\n const nextActions: string[] = [];\n if (mcp === \"disconnected\") {\n nextActions.push(`sag mcp attach ${agent} --server ${connection.id}`);\n } else if (mcp === \"drifted\") {\n nextActions.push(`检查 ${agent} 中名为 ${connection.id} 的 MCP 配置`);\n } else if (mcp === \"unavailable\") {\n nextActions.push(`检查 ${agent} 的 MCP 配置是否可读`);\n }\n if (skill !== \"valid\" && skill !== \"unavailable\") {\n nextActions.push(`sag mcp skill install --agent ${agent}`);\n } else if (skill === \"unavailable\") {\n nextActions.push(`检查 ${agent} 的 Skill 目录是否可读`);\n }\n return { agent, mcp, skill, nextActions };\n }),\n );\n const nextActions = agents.flatMap((agent) => agent.nextActions);\n if (health !== \"ready\") {\n nextActions.unshift(`检查企业 MCP ${connection.id} 的网络和凭据`);\n }\n return {\n kind: \"enterprise-mcp-status\",\n connection: {\n id: connection.id,\n active: active?.id === connection.id,\n endpoint: connection.url,\n },\n health,\n toolCount,\n risk,\n agents,\n nextActions,\n };\n}\n\nexport async function installEnterpriseMcpSkill(\n input: Pick<EnterpriseMcpMutationInput, \"runtime\" | \"yes\" | \"dryRun\" | \"confirm\"> & {\n agent: AgentId;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n });\n if (!(await mutationConfirmed(input, `为 ${input.agent} 安装企业 SAG MCP Skill?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n stages: [cancelledStage(\"skill\", input.agent)],\n nextActions: [],\n };\n }\n const stage = input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n inspection.installed ? \"updated\" : \"created\",\n \"已检查现有 Skill,将安装并保留被替换版本的备份。\",\n )\n : await installEnterpriseSkill({ ...input.runtime.skill, agent: input.agent });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n stages: [stage],\n nextActions: [`sag mcp skill status --agent ${input.agent}`],\n };\n}\n\nexport async function inspectEnterpriseMcpSkillStatus(input: {\n runtime: EnterpriseMcpConnectRuntime;\n agents: readonly AgentId[];\n}): Promise<\n Array<{\n agent: AgentId;\n status: EnterpriseMcpAgentStatus[\"skill\"];\n nextAction: string;\n }>\n> {\n return Promise.all(\n input.agents.map(async (agent) => {\n try {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent,\n });\n const status = skillState(inspection);\n return {\n agent,\n status,\n nextAction:\n status === \"valid\"\n ? `sag mcp status`\n : `sag mcp skill install --agent ${agent}`,\n };\n } catch {\n return {\n agent,\n status: \"unavailable\" as const,\n nextAction: `检查 ${agent} 的 Skill 目录是否可读`,\n };\n }\n }),\n );\n}\n\nexport async function uninstallEnterpriseMcpSkill(\n input: Pick<EnterpriseMcpMutationInput, \"runtime\" | \"yes\" | \"dryRun\" | \"confirm\"> & {\n agent: AgentId;\n force: boolean;\n },\n): Promise<EnterpriseMcpStagesReport> {\n const inspection = await inspectEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n });\n if (\n !input.force &&\n (!inspection.installed || !inspection.managed || inspection.drifted)\n ) {\n throw skillConflict(\"受管 SAG MCP Skill 已被修改或不完整,普通卸载已停止。\");\n }\n if (input.force && !inspection.installed) {\n throw skillConflict(\"找不到可卸载的 SAG MCP Skill。\");\n }\n if (!(await mutationConfirmed(input, `从 ${input.agent} 卸载企业 SAG MCP Skill?`))) {\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: false,\n stages: [cancelledStage(\"skill\", input.agent)],\n nextActions: [],\n };\n }\n const stage = input.dryRun\n ? stageSuccess(\n \"skill\",\n input.agent,\n \"updated\",\n input.force\n ? \"已检查 Skill;强制卸载前会先创建备份。\"\n : \"已核对受管 Skill 指纹,将安全卸载。\",\n )\n : await uninstallEnterpriseSkill({\n ...input.runtime.skill,\n agent: input.agent,\n force: input.force,\n });\n return {\n kind: \"enterprise-mcp-stages\",\n dryRun: input.dryRun,\n stages: [stage],\n nextActions: [`sag mcp skill status --agent ${input.agent}`],\n };\n}\n","import { CliError, exitCodes } from \"../../core/errors.js\";\nimport {\n connectionKey,\n fingerprintConnection,\n type AgentAdapter,\n type AgentConnection,\n type AgentId,\n} from \"../../agents/adapter.js\";\nimport type { HttpMcpConnectionSpec } from \"../connection.js\";\nimport type { AgentMcpVerifier } from \"../../agents/orchestrator.js\";\nimport type { EnterpriseMcpAgentManagedState } from \"./managed-state.js\";\nimport type { EnterpriseMcpConnection, StageResult } from \"./model.js\";\n\nexport type EnterpriseAgentAction =\n \"create\" | \"unchanged\" | \"update-managed\" | \"takeover-unmanaged\" | \"blocked-drift\";\n\ninterface EnterpriseManagedAgentStore {\n getAgent(id: string): Promise<EnterpriseMcpAgentManagedState | null>;\n setAgent(agent: EnterpriseMcpAgentManagedState): Promise<unknown>;\n deleteAgent(id: string): Promise<unknown>;\n listAgents(): Promise<EnterpriseMcpAgentManagedState[]>;\n}\n\nexport interface EnterpriseMcpAgentRuntime {\n adapters: Record<AgentId, AgentAdapter>;\n managed: EnterpriseManagedAgentStore;\n verifier: AgentMcpVerifier;\n confirm(message: string): Promise<boolean>;\n now(): Date;\n}\n\nexport interface AttachEnterpriseMcpInput {\n connection: EnterpriseMcpConnection;\n spec: HttpMcpConnectionSpec;\n agent: AgentId;\n yes: boolean;\n timeoutMs: number;\n dryRun?: boolean;\n installSkill?: boolean;\n}\n\nexport interface DetachEnterpriseMcpInput {\n connection: EnterpriseMcpConnection;\n agent: AgentId;\n yes: boolean;\n dryRun?: boolean;\n}\n\nexport interface InspectEnterpriseAgentInput {\n connection: EnterpriseMcpConnection;\n agent: AgentId;\n spec?: HttpMcpConnectionSpec;\n}\n\nexport interface EnterpriseAgentInspection {\n agent: AgentId;\n connectionId: string;\n managed: boolean;\n drifted: boolean;\n connected: boolean;\n}\n\nfunction stateId(agent: AgentId, connectionId: string): string {\n return connectionKey(agent, \"user\", connectionId);\n}\n\nfunction configurationConflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请检查该 Agent 的同名 MCP 配置后重试。\",\n });\n}\n\nfunction hostFailure(message: string): CliError {\n return new CliError(\"HOST_CONFIG_FAILED\", message, {\n exitCode: exitCodes.hostConfigFailed,\n hint: \"请检查并修正该 Agent 的同名 MCP 配置后重试。\",\n });\n}\n\nfunction ensureSupported(adapter: AgentAdapter, spec: HttpMcpConnectionSpec): void {\n if (!adapter.capabilities.scopes.includes(\"user\")) {\n throw new CliError(\"INVALID_ARGUMENT\", \"该 Agent 不支持用户级 MCP 配置\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!adapter.capabilities.transports.includes(spec.transport)) {\n throw new CliError(\"INVALID_ARGUMENT\", \"该 Agent 不支持 HTTP MCP 连接\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n}\n\nfunction determineAction(input: {\n host: AgentConnection | null;\n managed: EnterpriseMcpAgentManagedState | null;\n desired: HttpMcpConnectionSpec;\n connectionId: string;\n}): EnterpriseAgentAction {\n const { connectionId, desired, host, managed } = input;\n if (!managed && !host) return \"create\";\n if (!managed && host) return \"takeover-unmanaged\";\n if (!managed) return \"create\";\n if (\n managed.connectionId !== connectionId ||\n !host ||\n host.fingerprint !== managed.fingerprint\n ) {\n return \"blocked-drift\";\n }\n return fingerprintConnection(host.spec) === fingerprintConnection(desired)\n ? \"unchanged\"\n : \"update-managed\";\n}\n\nfunction success(\n target: AgentId,\n status: Extract<StageResult[\"status\"], \"created\" | \"updated\" | \"skipped\">,\n message: string,\n): StageResult {\n return { stage: \"agent\", target, ok: true, status, message };\n}\n\nfunction failed(target: string, cause: unknown): StageResult {\n return {\n stage: \"agent\",\n target,\n ok: false,\n status: \"failed\",\n ...(cause instanceof CliError\n ? { code: cause.code }\n : { code: \"HOST_CONFIG_FAILED\" }),\n message: \"企业 MCP 在 Agent 中刷新失败,请检查同名配置后重试。\",\n };\n}\n\nasync function restoreHost(\n adapter: AgentAdapter,\n name: string,\n backup: AgentConnection | null,\n): Promise<void> {\n try {\n await adapter.remove(name, \"user\");\n if (backup) await adapter.add(name, \"user\", backup.spec);\n } catch {\n throw hostFailure(\n \"企业 MCP 更新失败且无法恢复原有 Agent 配置,请检查同名配置后重试。\",\n );\n }\n}\n\nfunction managedRecord(input: {\n agent: AgentId;\n connectionId: string;\n fingerprint: string;\n now: Date;\n}): EnterpriseMcpAgentManagedState {\n return {\n id: stateId(input.agent, input.connectionId),\n connectionId: input.connectionId,\n fingerprint: input.fingerprint,\n updatedAt: input.now.toISOString(),\n };\n}\n\nexport async function attachEnterpriseMcp(\n runtime: EnterpriseMcpAgentRuntime,\n input: AttachEnterpriseMcpInput,\n): Promise<StageResult> {\n const adapter = runtime.adapters[input.agent];\n ensureSupported(adapter, input.spec);\n await adapter.detect();\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n const action = determineAction({\n host,\n managed,\n desired: input.spec,\n connectionId: input.connection.id,\n });\n\n if (action === \"blocked-drift\") {\n throw configurationConflict(\"受管 Agent MCP 配置已在 SAG CLI 之外被修改\");\n }\n if (action === \"unchanged\") {\n return success(input.agent, \"skipped\", \"Agent 中的企业 MCP 配置已经是最新状态。\");\n }\n if (input.dryRun) {\n return success(\n input.agent,\n action === \"create\" ? \"created\" : \"updated\",\n \"已生成企业 MCP 接入计划,未写入 Agent 配置。\",\n );\n }\n if (\n action === \"takeover-unmanaged\" &&\n !input.yes &&\n !(await runtime.confirm(\n `是否替换 ${input.agent} 中现有的 ${input.connection.id} MCP?`,\n ))\n ) {\n return success(input.agent, \"skipped\", \"已取消接管 Agent 中的企业 MCP 配置。\");\n }\n\n try {\n if (host) await adapter.remove(input.connection.id, \"user\");\n await adapter.add(input.connection.id, \"user\", input.spec);\n const readBack = await adapter.read(input.connection.id, \"user\");\n if (\n !readBack ||\n fingerprintConnection(readBack.spec) !== fingerprintConnection(input.spec)\n ) {\n throw configurationConflict(\"Agent MCP 回读结果与请求的连接不一致\");\n }\n await runtime.verifier.verify(readBack.spec, { timeoutMs: input.timeoutMs });\n await runtime.managed.setAgent(\n managedRecord({\n agent: input.agent,\n connectionId: input.connection.id,\n fingerprint: readBack.fingerprint,\n now: runtime.now(),\n }),\n );\n } catch {\n await restoreHost(adapter, input.connection.id, host);\n throw hostFailure(\"企业 MCP 更新失败,已恢复 Agent 中原有的配置。\");\n }\n\n return success(\n input.agent,\n action === \"create\" ? \"created\" : \"updated\",\n \"企业 MCP 已接入 Agent 并通过验证。\",\n );\n}\n\nexport async function inspectEnterpriseAgent(\n runtime: EnterpriseMcpAgentRuntime,\n input: InspectEnterpriseAgentInput,\n): Promise<EnterpriseAgentInspection> {\n const adapter = runtime.adapters[input.agent];\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n return {\n agent: input.agent,\n connectionId: input.connection.id,\n managed: Boolean(managed),\n connected: Boolean(host),\n drifted: Boolean(\n managed &&\n (managed.connectionId !== input.connection.id ||\n !host ||\n host.fingerprint !== managed.fingerprint ||\n (input.spec !== undefined &&\n fingerprintConnection(host.spec) !== fingerprintConnection(input.spec))),\n ),\n };\n}\n\nexport async function detachEnterpriseMcp(\n runtime: EnterpriseMcpAgentRuntime,\n input: DetachEnterpriseMcpInput,\n): Promise<StageResult> {\n const adapter = runtime.adapters[input.agent];\n const id = stateId(input.agent, input.connection.id);\n const [host, managed] = await Promise.all([\n adapter.read(input.connection.id, \"user\"),\n runtime.managed.getAgent(id),\n ]);\n if (!managed || managed.connectionId !== input.connection.id || !host) {\n throw configurationConflict(\"该 Agent MCP 配置不受当前企业连接管理\");\n }\n if (host.fingerprint !== managed.fingerprint) {\n throw configurationConflict(\"受管 Agent MCP 配置已在 SAG CLI 之外被修改\");\n }\n if (input.dryRun) {\n return success(\n input.agent,\n \"updated\",\n \"已生成企业 MCP 移除计划,未修改 Agent 配置。\",\n );\n }\n if (\n !input.yes &&\n !(await runtime.confirm(`是否从 ${input.agent} 移除 ${input.connection.id}?`))\n ) {\n return success(input.agent, \"skipped\", \"已取消移除 Agent 中的企业 MCP 配置。\");\n }\n\n try {\n await adapter.remove(input.connection.id, \"user\");\n await runtime.managed.deleteAgent(id);\n } catch {\n try {\n await adapter.add(input.connection.id, \"user\", host.spec);\n } catch {\n throw hostFailure(\"企业 MCP 移除失败,且无法恢复 Agent 中原有的配置。\");\n }\n throw hostFailure(\"企业 MCP 移除失败,已恢复 Agent 中原有的配置。\");\n }\n return success(input.agent, \"updated\", \"已从 Agent 移除企业 MCP 配置。\");\n}\n\nfunction agentForState(\n state: EnterpriseMcpAgentManagedState,\n connectionId: string,\n): AgentId | null {\n return (\n ([\"codex\", \"claude-code\", \"workbuddy\"] as const).find(\n (agent) => state.id === stateId(agent, connectionId),\n ) ?? null\n );\n}\n\nexport async function refreshManagedAgents(\n runtime: EnterpriseMcpAgentRuntime,\n input: Omit<AttachEnterpriseMcpInput, \"agent\" | \"yes\">,\n): Promise<StageResult[]> {\n const managed = await runtime.managed.listAgents();\n const matching = managed.filter(\n (state) => state.connectionId === input.connection.id,\n );\n return Promise.all(\n matching.map(async (state) => {\n const agent = agentForState(state, input.connection.id);\n if (!agent) return failed(state.id, configurationConflict(\"受管 Agent 状态无效\"));\n try {\n return await attachEnterpriseMcp(runtime, { ...input, agent, yes: true });\n } catch (cause) {\n return failed(agent, cause);\n }\n }),\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { cp, lstat, mkdir, readFile, readdir, rename, rm } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\n\nimport type { AgentId } from \"../../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../../core/errors.js\";\nimport type { StageResult } from \"./model.js\";\n\nconst skillName = \"sag-mcp\";\nconst skillDescription =\n \"Use connected enterprise SAG MCP servers to search, read, and manage authorized knowledge.\";\nconst requiredReferences = [\n \"references/cli-reference.md\",\n \"references/tool-safety.md\",\n] as const;\n\nexport interface SkillPathOptions {\n home: string;\n CODEX_HOME?: string | undefined;\n}\n\nexport interface EnterpriseMcpSkillManagedState {\n id: string;\n fingerprint: string;\n backupPath: string;\n updatedAt: string;\n}\n\nexport interface EnterpriseMcpSkillManagedStateStore {\n getSkill(id: string): Promise<EnterpriseMcpSkillManagedState | null>;\n setSkill(skill: EnterpriseMcpSkillManagedState): Promise<unknown>;\n deleteSkill(id: string): Promise<unknown>;\n}\n\nexport interface EnterpriseMcpSkillRuntime {\n home: string;\n environment: { CODEX_HOME?: string | undefined };\n managed: EnterpriseMcpSkillManagedStateStore;\n now: () => Date;\n bundlePath?: string | undefined;\n}\n\nexport interface EnterpriseMcpSkillInput extends EnterpriseMcpSkillRuntime {\n agent: AgentId;\n}\n\nexport interface UninstallEnterpriseSkillInput extends EnterpriseMcpSkillInput {\n force: boolean;\n}\n\nexport interface EnterpriseMcpSkillInspection {\n agent: AgentId;\n target: string;\n managed: boolean;\n installed: boolean;\n drifted: boolean;\n}\n\nexport function skillTarget(agent: AgentId, options: SkillPathOptions): string {\n switch (agent) {\n case \"codex\":\n return path.join(\n options.CODEX_HOME || path.join(options.home, \".codex\"),\n \"skills\",\n skillName,\n );\n case \"claude-code\":\n return path.join(options.home, \".claude\", \"skills\", skillName);\n case \"workbuddy\":\n return path.join(options.home, \".workbuddy\", \"skills\", skillName);\n }\n}\n\nfunction managedSkillId(agent: AgentId): string {\n return `${agent}:${skillName}`;\n}\n\nfunction bundledSkillPath(): string {\n const moduleDirectory = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot =\n path.basename(moduleDirectory) === \"dist\"\n ? path.dirname(moduleDirectory)\n : path.resolve(moduleDirectory, \"../../..\");\n return path.join(packageRoot, \"skills\", skillName);\n}\n\nfunction timestamp(now: Date): string {\n return now.toISOString().replace(/[-:.]/gu, \"\");\n}\n\nfunction siblingPath(\n target: string,\n prefix: \"tmp\" | \"backup\" | \"remove\",\n now: Date,\n): string {\n return path.join(\n path.dirname(target),\n `${path.basename(target)}.${prefix}-${timestamp(now)}-${process.pid}`,\n );\n}\n\nasync function exists(target: string): Promise<boolean> {\n try {\n await lstat(target);\n return true;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw cause;\n }\n}\n\nasync function validateSkillBundle(bundlePath: string): Promise<void> {\n const skill = await readFile(path.join(bundlePath, \"SKILL.md\"), \"utf8\");\n const lines = skill.split(/\\r?\\n/u);\n const lineCount = skill.endsWith(\"\\n\") ? lines.length - 1 : lines.length;\n if (\n lineCount >= 100 ||\n lines[0] !== \"---\" ||\n lines[1] !== `name: ${skillName}` ||\n lines[2] !== `description: ${skillDescription}` ||\n lines[3] !== \"---\"\n ) {\n throw new Error(\"随包发布的 SAG MCP Skill frontmatter 无效。\");\n }\n for (const reference of requiredReferences) {\n await readFile(path.join(bundlePath, reference), \"utf8\");\n if (!skill.includes(`(${reference})`)) {\n throw new Error(`随包发布的 SAG MCP Skill 未引用 ${reference}。`);\n }\n }\n}\n\nasync function updateDirectoryFingerprint(\n hash: ReturnType<typeof createHash>,\n root: string,\n relative = \"\",\n): Promise<void> {\n const current = path.join(root, relative);\n const entries = await readdir(current, { withFileTypes: true });\n for (const entry of entries.sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const entryRelative = path.join(relative, entry.name);\n if (entry.isDirectory()) {\n hash.update(`directory:${entryRelative}\\n`);\n await updateDirectoryFingerprint(hash, root, entryRelative);\n continue;\n }\n if (!entry.isFile()) {\n throw new Error(\"SAG MCP Skill 包含不支持的文件。\");\n }\n hash.update(`file:${entryRelative}\\n`);\n hash.update(await readFile(path.join(root, entryRelative)));\n }\n}\n\nasync function fingerprintSkillBundle(bundlePath: string): Promise<string> {\n await validateSkillBundle(bundlePath);\n const hash = createHash(\"sha256\");\n await updateDirectoryFingerprint(hash, bundlePath);\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction success(\n target: AgentId,\n status: Extract<StageResult[\"status\"], \"created\" | \"updated\">,\n): StageResult {\n return {\n stage: \"skill\",\n target,\n ok: true,\n status,\n message: \"企业 SAG MCP Skill 已安装。\",\n };\n}\n\nfunction failed(target: AgentId): StageResult {\n return {\n stage: \"skill\",\n target,\n ok: false,\n status: \"failed\",\n code: \"INTERNAL_ERROR\",\n message: \"企业 SAG MCP Skill 安装失败,已恢复原有 Skill。\",\n };\n}\n\nfunction conflict(message: string): CliError {\n return new CliError(\"CONFIG_CONFLICT\", message, {\n exitCode: exitCodes.configConflict,\n hint: \"请检查 SAG MCP Skill 后重试。\",\n });\n}\n\nasync function restoreTarget(input: {\n target: string;\n hadTarget: boolean;\n targetMutated: boolean;\n backupPath: string | null;\n temporaryPath: string;\n}): Promise<void> {\n await rm(input.temporaryPath, { recursive: true, force: true }).catch(\n () => undefined,\n );\n if (!input.targetMutated) return;\n if (input.hadTarget && input.backupPath && (await exists(input.backupPath))) {\n await rm(input.target, { recursive: true, force: true });\n await rename(input.backupPath, input.target);\n return;\n }\n if (!input.hadTarget) {\n await rm(input.target, { recursive: true, force: true });\n }\n}\n\nexport async function installEnterpriseSkill(\n input: EnterpriseMcpSkillInput,\n): Promise<StageResult> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const bundlePath = input.bundlePath ?? bundledSkillPath();\n const temporaryPath = siblingPath(target, \"tmp\", input.now());\n let backupPath: string | null = null;\n let hadTarget = false;\n let targetMutated = false;\n\n try {\n hadTarget = await exists(target);\n await validateSkillBundle(bundlePath);\n await mkdir(path.dirname(target), { recursive: true });\n await cp(bundlePath, temporaryPath, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await validateSkillBundle(temporaryPath);\n if (hadTarget) {\n backupPath = siblingPath(target, \"backup\", input.now());\n await rename(target, backupPath);\n targetMutated = true;\n }\n await rename(temporaryPath, target);\n targetMutated = true;\n const fingerprint = await fingerprintSkillBundle(target);\n await input.managed.setSkill({\n id: managedSkillId(input.agent),\n fingerprint,\n backupPath: backupPath ?? siblingPath(target, \"backup\", input.now()),\n updatedAt: input.now().toISOString(),\n });\n return success(input.agent, hadTarget ? \"updated\" : \"created\");\n } catch {\n await restoreTarget({\n target,\n hadTarget,\n targetMutated,\n backupPath,\n temporaryPath,\n }).catch(() => undefined);\n return failed(input.agent);\n }\n}\n\nexport async function inspectEnterpriseSkill(\n input: EnterpriseMcpSkillInput,\n): Promise<EnterpriseMcpSkillInspection> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const [managed, installed] = await Promise.all([\n input.managed.getSkill(managedSkillId(input.agent)),\n exists(target),\n ]);\n let fingerprint: string | null = null;\n if (installed) {\n fingerprint = await fingerprintSkillBundle(target).catch(() => null);\n }\n return {\n agent: input.agent,\n target,\n managed: Boolean(managed),\n installed,\n drifted: Boolean(managed && (!fingerprint || managed.fingerprint !== fingerprint)),\n };\n}\n\nexport async function uninstallEnterpriseSkill(\n input: UninstallEnterpriseSkillInput,\n): Promise<StageResult> {\n const target = skillTarget(input.agent, {\n home: input.home,\n CODEX_HOME: input.environment.CODEX_HOME,\n });\n const state = await input.managed.getSkill(managedSkillId(input.agent));\n const installed = await exists(target);\n const fingerprint = installed\n ? await fingerprintSkillBundle(target).catch(() => null)\n : null;\n\n if (!input.force) {\n if (!state || !fingerprint || state.fingerprint !== fingerprint) {\n throw conflict(\"受 SAG CLI 管理的 SAG MCP Skill 已被外部修改。\");\n }\n const removedPath = siblingPath(target, \"remove\", input.now());\n await rename(target, removedPath);\n try {\n await input.managed.deleteSkill(state.id);\n } catch (cause) {\n await rename(removedPath, target);\n throw cause;\n }\n await rm(removedPath, { recursive: true, force: true }).catch(() => undefined);\n return {\n stage: \"skill\",\n target: input.agent,\n ok: true,\n status: \"updated\",\n message: \"企业 SAG MCP Skill 已移除。\",\n };\n }\n\n if (!installed) {\n throw conflict(\"没有可移除的 SAG MCP Skill。\");\n }\n const backupPath = siblingPath(target, \"backup\", input.now());\n await rename(target, backupPath);\n try {\n await input.managed.deleteSkill(managedSkillId(input.agent));\n } catch (cause) {\n await rename(backupPath, target).catch(() => undefined);\n throw cause;\n }\n return {\n stage: \"skill\",\n target: input.agent,\n ok: true,\n status: \"updated\",\n message: \"企业 SAG MCP Skill 已备份后强制移除。\",\n };\n}\n","import { CliError, exitCodes } from \"../core/errors.js\";\nimport type { AgentId } from \"../agents/adapter.js\";\nimport type { HttpMcpCommandOptions } from \"../mcp/commands.js\";\nimport { callHttpMcpTool, listHttpMcpTools } from \"../mcp/commands.js\";\nimport type { HttpMcpConnectionSpec } from \"../mcp/connection.js\";\nimport type { EnterpriseMcpCredentialStores } from \"../mcp/enterprise/credentials.js\";\nimport {\n type EnterpriseMcpConnection,\n type McpToolSummary,\n toMcpToolSummary,\n} from \"../mcp/enterprise/model.js\";\nimport { classifyTools } from \"../mcp/enterprise/risk.js\";\nimport { resolveEnterpriseMcpSpec } from \"../mcp/enterprise/runtime.js\";\nimport {\n attachEnterpriseMcpConnection,\n connectEnterpriseMcp,\n detachEnterpriseMcpConnection,\n disconnectEnterpriseMcp,\n inspectEnterpriseMcpSkillStatus,\n inspectEnterpriseMcpStatus,\n installEnterpriseMcpSkill,\n resolveEnterpriseMcpConnection,\n uninstallEnterpriseMcpSkill,\n type ConnectEnterpriseMcpInput,\n type EnterpriseConnectReport,\n type EnterpriseMcpConnectRuntime,\n type EnterpriseMcpLifecycleHttpClient,\n type EnterpriseMcpStagesReport,\n} from \"../mcp/enterprise/service.js\";\nimport type { EnterpriseMcpConnectionStore } from \"../mcp/enterprise/store.js\";\n\nexport type EnterpriseMcpHttpClient = EnterpriseMcpLifecycleHttpClient;\n\nconst httpClient: EnterpriseMcpHttpClient = {\n async listTools(spec, options) {\n const listed = await listHttpMcpTools(spec, options);\n return { tools: listed.tools.map(toMcpToolSummary) };\n },\n callTool: callHttpMcpTool,\n};\n\nexport interface EnterpriseMcpCommandRuntime {\n store: EnterpriseMcpConnectionStore;\n credentials: EnterpriseMcpCredentialStores;\n cliVersion: string;\n timeoutMs: number;\n client?: EnterpriseMcpHttpClient;\n}\n\nexport interface EnterpriseMcpConnectionSelection {\n server?: string;\n}\n\nexport type EnterpriseMcpLifecycleCommandRuntime = EnterpriseMcpConnectRuntime & {\n cliVersion: string;\n timeoutMs: number;\n};\n\nfunction connectionSummary(connection: EnterpriseMcpConnection, active?: boolean) {\n return {\n id: connection.id,\n endpoint: connection.url,\n toolCount: connection.toolSnapshot.count,\n risk: connection.toolSnapshot.risk,\n updatedAt: connection.updatedAt,\n ...(active === undefined ? {} : { active }),\n };\n}\n\nexport async function connectEnterpriseMcpCommand(\n input: ConnectEnterpriseMcpInput,\n): Promise<EnterpriseConnectReport> {\n return connectEnterpriseMcp(input);\n}\n\nasync function resolveConnectionRuntime(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{ connection: EnterpriseMcpConnection; spec: HttpMcpConnectionSpec }> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n return {\n connection,\n spec: await resolveEnterpriseMcpSpec(connection, runtime.credentials),\n };\n}\n\nfunction clientFor(runtime: EnterpriseMcpCommandRuntime): EnterpriseMcpHttpClient {\n return runtime.client ?? httpClient;\n}\n\nfunction commandOptions(runtime: EnterpriseMcpCommandRuntime): HttpMcpCommandOptions {\n return { cliVersion: runtime.cliVersion, timeoutMs: runtime.timeoutMs };\n}\n\nexport async function listConnections(runtime: EnterpriseMcpCommandRuntime): Promise<{\n activeId: string | null;\n connections: ReturnType<typeof connectionSummary>[];\n}> {\n const [state, connections] = await Promise.all([\n runtime.store.load(),\n runtime.store.list(),\n ]);\n return {\n activeId: state.activeId ?? null,\n connections: connections.map((connection) =>\n connectionSummary(connection, state.activeId === connection.id),\n ),\n };\n}\n\nexport async function useConnection(\n runtime: EnterpriseMcpCommandRuntime,\n input: { server: string; dryRun: boolean },\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n dryRun: boolean;\n plannedActiveId: string;\n}> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n server: input.server,\n });\n if (!input.dryRun) await runtime.store.use(connection.id);\n const active = await runtime.store.active();\n return {\n connection: connectionSummary(connection, active?.id === connection.id),\n dryRun: input.dryRun,\n plannedActiveId: connection.id,\n };\n}\n\nexport async function statusConnection(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n active: boolean;\n}> {\n const connection = await resolveEnterpriseMcpConnection({\n store: runtime.store,\n ...(input.server === undefined ? {} : { server: input.server }),\n });\n const active = await runtime.store.active();\n const isActive = active?.id === connection.id;\n return { connection: connectionSummary(connection, isActive), active: isActive };\n}\n\nexport async function listConnectionTools(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n tools: McpToolSummary[];\n toolCount: number;\n risk: ReturnType<typeof classifyTools>;\n}> {\n const { connection, spec } = await resolveConnectionRuntime(runtime, input);\n const tools = [\n ...(await clientFor(runtime).listTools(spec, commandOptions(runtime))).tools,\n ];\n return {\n connection: connectionSummary(connection),\n tools,\n toolCount: tools.length,\n risk: classifyTools(tools),\n };\n}\n\nexport async function callConnectionTool(\n runtime: EnterpriseMcpCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n tool: string;\n arguments_: Record<string, unknown>;\n yes: boolean;\n },\n): Promise<{\n connection: ReturnType<typeof connectionSummary>;\n tool: string;\n result: unknown;\n}> {\n const { connection, spec } = await resolveConnectionRuntime(runtime, input);\n const tools = await clientFor(runtime).listTools(spec, commandOptions(runtime));\n const tool = tools.tools.find((candidate) => candidate.name === input.tool);\n if (!tool) {\n throw new CliError(\"RESOURCE_NOT_FOUND\", `找不到 MCP 工具:${input.tool}`, {\n exitCode: exitCodes.resourceNotFound,\n });\n }\n if (tool.annotations?.readOnlyHint !== true && !input.yes) {\n throw new CliError(\n \"INVALID_ARGUMENT\",\n `MCP 工具 ${input.tool} 可能会修改数据,需使用 --yes 确认`,\n {\n exitCode: exitCodes.invalidArgument,\n hint: \"请检查工具参数,并使用 --yes 重新执行以确认。\",\n },\n );\n }\n const result = await clientFor(runtime).callTool({\n spec,\n tool: input.tool,\n arguments_: input.arguments_,\n yes: input.yes,\n ...commandOptions(runtime),\n });\n return { connection: connectionSummary(connection), ...result };\n}\n\nexport async function inspectConnectionStatus(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection,\n) {\n return inspectEnterpriseMcpStatus({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n timeoutMs: runtime.timeoutMs,\n });\n}\n\nexport async function attachConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n noSkill: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return attachEnterpriseMcpConnection({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n agent: input.agent,\n yes: input.yes,\n dryRun: input.dryRun,\n noSkill: input.noSkill,\n confirm: input.confirm,\n timeoutMs: runtime.timeoutMs,\n });\n}\n\nexport async function detachConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return detachEnterpriseMcpConnection({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n agent: input.agent,\n yes: input.yes,\n dryRun: input.dryRun,\n confirm: input.confirm,\n });\n}\n\nexport async function disconnectConnection(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: EnterpriseMcpConnectionSelection & {\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return disconnectEnterpriseMcp({\n runtime,\n ...(input.server === undefined ? {} : { server: input.server }),\n yes: input.yes,\n dryRun: input.dryRun,\n confirm: input.confirm,\n });\n}\n\nexport async function installSkill(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return installEnterpriseMcpSkill({ runtime, ...input });\n}\n\nexport async function skillStatus(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: { agents: readonly AgentId[] },\n) {\n return inspectEnterpriseMcpSkillStatus({ runtime, agents: input.agents });\n}\n\nexport async function uninstallSkill(\n runtime: EnterpriseMcpLifecycleCommandRuntime,\n input: {\n agent: AgentId;\n yes: boolean;\n dryRun: boolean;\n force: boolean;\n confirm(message: string): Promise<boolean>;\n },\n): Promise<EnterpriseMcpStagesReport> {\n return uninstallEnterpriseMcpSkill({ runtime, ...input });\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","const SENSITIVE_KEYS = new Set([\n \"authorization\",\n \"authorization_code\",\n \"token\",\n \"access_token\",\n \"password\",\n \"secret\",\n \"secretkey\",\n \"secret_key\",\n \"ticket\",\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 { DoctorReport } from \"../diagnostics/doctor.js\";\nimport { redact } from \"./redaction.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 \"active\",\n \"id\",\n \"name\",\n \"filename\",\n \"status\",\n \"url\",\n \"endpoint\",\n \"toolCount\",\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\nconst enterpriseStageOrder = [\n \"parse\",\n \"verify\",\n \"persist\",\n \"agent\",\n \"skill\",\n \"reverify\",\n] as const;\n\nfunction renderEnterpriseMcpStages(value: Record<string, unknown>): string {\n const stages = Array.isArray(value.stages) ? value.stages.filter(isRecord) : [];\n const ordered = stages\n .map((stage, index) => ({ stage, index }))\n .sort((left, right) => {\n const leftOrder = enterpriseStageOrder.indexOf(\n left.stage.stage as (typeof enterpriseStageOrder)[number],\n );\n const rightOrder = enterpriseStageOrder.indexOf(\n right.stage.stage as (typeof enterpriseStageOrder)[number],\n );\n return (\n (leftOrder < 0 ? 99 : leftOrder) - (rightOrder < 0 ? 99 : rightOrder) ||\n left.index - right.index\n );\n })\n .map(({ stage }) => stage);\n const connection = isRecord(value.connection) ? value.connection : null;\n const nextActions = Array.isArray(value.nextActions)\n ? value.nextActions.map(String)\n : [];\n const lines = [\n value.dryRun ? \"企业 MCP 变更计划(未写入)\" : \"企业 MCP 操作结果\",\n ...(connection\n ? [\n `连接:${String(connection.id ?? \"unknown\")}`,\n `端点:${String(connection.endpoint ?? \"unknown\")}`,\n ]\n : []),\n ...ordered.map((stage) => {\n const marker = stage.ok ? (stage.status === \"skipped\" ? \"-\" : \"✓\") : \"✗\";\n return `${marker} ${String(stage.stage)} · ${String(stage.target)}:${String(stage.message ?? stage.status ?? \"\")}`;\n }),\n ...(nextActions.length\n ? [\"下一步:\", ...nextActions.map((action) => ` ${action}`)]\n : []),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderEnterpriseMcpStatus(value: Record<string, unknown>): string {\n const connection = isRecord(value.connection) ? value.connection : {};\n const risk = isRecord(value.risk) ? value.risk : {};\n const agents = Array.isArray(value.agents) ? value.agents.filter(isRecord) : [];\n const nextActions = Array.isArray(value.nextActions)\n ? value.nextActions.map(String)\n : [];\n const lines = [\n `连接:${String(connection.id ?? \"unknown\")}${connection.active ? \"(当前)\" : \"\"}`,\n `端点:${String(connection.endpoint ?? \"unknown\")}`,\n `健康:${String(value.health ?? \"unknown\")}`,\n `工具:${String(value.toolCount ?? 0)}`,\n `风险:只读 ${String(risk.readOnly ?? 0)},写入 ${String(risk.write ?? 0)},删除 ${String(risk.destructive ?? 0)},未知 ${String(risk.unknown ?? 0)}`,\n ...agents.map(\n (agent) =>\n `Agent ${String(agent.agent ?? \"unknown\")}:MCP ${String(agent.mcp ?? \"unknown\")},Skill ${String(agent.skill ?? \"unknown\")}`,\n ),\n ...(nextActions.length\n ? [\"下一步:\", ...nextActions.map((action) => ` ${action}`)]\n : []),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderOutline(value: Record<string, unknown>): string {\n const filename = typeof value.filename === \"string\" ? value.filename : \"Unknown\";\n const items = Array.isArray(value.outline) ? value.outline.filter(isRecord) : [];\n const lines = items.map(\n (item) =>\n `${String(item.rank ?? 0).padStart(3)}. ${item.heading || \"(untitled)\"} (chunk_id=${item.chunk_id})`,\n );\n return `${filename}\\n${lines.join(\"\\n\")}\\n`;\n}\n\nfunction renderGrep(value: Record<string, unknown>): string {\n const matches = Array.isArray(value.matches) ? value.matches.filter(isRecord) : [];\n const lines = matches.map(\n (match, index) => `[${index + 1}] ${match.heading || \"Match\"}\\n${match.snippet}`,\n );\n return lines.length ? `${lines.join(\"\\n\\n\")}\\n` : \"No matches.\\n\";\n}\n\nfunction renderRead(value: Record<string, unknown>): string {\n const filename = typeof value.filename === \"string\" ? value.filename : \"Unknown\";\n const total = typeof value.total_lines === \"number\" ? value.total_lines : 0;\n const offset = typeof value.offset === \"number\" ? value.offset : 1;\n const lines = Array.isArray(value.lines) ? value.lines.map(String) : [];\n const header = `${filename} · lines ${offset}-${offset + lines.length - 1} / ${total}`;\n return `${header}\\n${lines.join(\"\")}`;\n}\n\nfunction renderEntityContext(value: Record<string, unknown>): string {\n const name = typeof value.name === \"string\" ? value.name : \"Unknown\";\n const type = typeof value.type === \"string\" ? value.type : \"\";\n const source = typeof value.source_name === \"string\" ? value.source_name : \"\";\n const context = typeof value.context === \"string\" ? value.context : \"\";\n return `Entity: ${name}${type ? ` (${type})` : \"\"}\\nSource: ${source}\\n\\n${context}\\n`;\n}\n\nexport function renderHuman(value: unknown, quiet = false): string {\n value = redact(value);\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) && value.kind === \"enterprise-mcp-stages\") {\n return renderEnterpriseMcpStages(value);\n }\n if (isRecord(value) && value.kind === \"enterprise-mcp-status\") {\n return renderEnterpriseMcpStatus(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 (isRecord(value) && Array.isArray(value.outline) && \"filename\" in value) {\n return renderOutline(value);\n }\n if (isRecord(value) && Array.isArray(value.matches) && \"pattern\" in value) {\n return renderGrep(value);\n }\n if (isRecord(value) && Array.isArray(value.lines) && \"total_lines\" in value) {\n return renderRead(value);\n }\n if (isRecord(value) && \"entity_id\" in value && \"context\" in value) {\n return renderEntityContext(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","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","import { type SkillErrorCode } from \"../core/errors.js\";\nimport { redact } from \"./redaction.js\";\n\nexport interface SkillEvent {\n schema: \"sag.skill.ndjson.v1\";\n operation: \"install\" | \"auth\" | \"upload\" | \"search\" | \"document\";\n event: string;\n operation_id: string;\n timestamp: string;\n data?: Record<string, unknown>;\n error?: {\n code: SkillErrorCode;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n };\n}\n\nconst terminalEvents = new Set([\n \"completed\",\n \"failed\",\n \"detached\",\n \"completed_with_errors\",\n]);\n\nexport class SkillEventWriter {\n private terminal = false;\n\n constructor(private readonly write: (value: string) => void) {}\n\n emit(event: SkillEvent): void {\n if (this.terminal) throw new Error(\"Cannot emit after terminal event\");\n if (terminalEvents.has(event.event)) {\n throw new Error(\"terminal event must be sent with complete\");\n }\n this.write(`${JSON.stringify(redact(event))}\\n`);\n }\n\n complete(event: SkillEvent): void {\n if (!terminalEvents.has(event.event)) {\n throw new Error(\"A terminal event is required\");\n }\n if (this.terminal) throw new Error(\"Cannot emit a second terminal event\");\n this.terminal = true;\n this.write(`${JSON.stringify(redact(event))}\\n`);\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n cp,\n lstat,\n mkdir,\n readFile,\n readdir,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport path from \"node:path\";\n\nimport { lock } from \"proper-lockfile\";\n\nimport type { AgentId } from \"../agents/adapter.js\";\nimport { CliError, exitCodes } from \"../core/errors.js\";\nimport type { ManagedSkill, SkillStateStore } from \"./state-store.js\";\n\nconst skillName = \"sag-knowledge\";\nconst packageName = \"@zleap-ai/sag-cli\";\nconst agents: readonly AgentId[] = [\"codex\", \"claude-code\", \"workbuddy\"];\nconst requiredFiles = [\n \"SKILL.md\",\n \"references/cli-reference.md\",\n \"references/ndjson-contract.md\",\n \"references/safety.md\",\n \"scripts/sag-knowledge.cjs\",\n] as const;\n\nexport interface SkillTargetAgent {\n readonly id: AgentId;\n installed(): Promise<boolean>;\n installSkill?(): Promise<void>;\n}\n\nexport interface SkillInstallerFilesystem {\n rename(from: string, to: string): Promise<void>;\n remove(target: string): Promise<void>;\n}\n\nexport interface SkillInstallerRuntime {\n readonly home: string;\n readonly environment: { CODEX_HOME?: string | undefined };\n readonly bundlePath?: string | undefined;\n readonly filesystem?: Partial<SkillInstallerFilesystem> | undefined;\n resolveLatestBundle?:\n (() => Promise<{ bundlePath: string; cleanup(): Promise<void> }>) | undefined;\n state: Pick<\n SkillStateStore,\n \"getManagedSkill\" | \"saveManagedSkill\" | \"deleteManagedSkill\"\n >;\n readonly agents: Record<AgentId, SkillTargetAgent>;\n readonly now: () => Date;\n readonly confirm?: (message: string) => Promise<boolean>;\n}\n\nexport type SkillTargetStatus =\n | \"created\"\n | \"updated\"\n | \"skipped\"\n | \"failed\"\n | \"conflict\"\n | \"removed\"\n | \"missing\"\n | \"installed\"\n | \"unavailable\"\n | \"unmanaged\"\n | \"drifted\";\n\nexport interface SkillTargetReport {\n readonly agent: AgentId;\n readonly target: string;\n readonly status: SkillTargetStatus;\n readonly code?: \"INSTALL_TARGET_CONFLICT\";\n readonly version?: string;\n readonly package?: string;\n readonly message: string;\n}\n\nexport interface SkillTargetsReport {\n readonly package: string;\n readonly version: string;\n readonly targets: readonly SkillTargetReport[];\n readonly completedWithErrors: boolean;\n}\n\nexport interface SkillTargetSelection {\n readonly agents?: readonly AgentId[];\n readonly yes: boolean;\n readonly update?: boolean;\n}\n\ninterface SkillManifest {\n readonly schema: 1;\n readonly name: typeof skillName;\n readonly package: typeof packageName;\n readonly packageVersion: string;\n readonly agent: AgentId | \"template\";\n readonly bundleDigest: string;\n}\n\nfunction bundledSkillPath(): string {\n const directory = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot =\n path.basename(directory) === \"dist\"\n ? path.dirname(directory)\n : path.resolve(directory, \"../..\");\n return path.join(packageRoot, \"skill\");\n}\n\nfunction uniqueAgents(selected: readonly AgentId[] | undefined): readonly AgentId[] {\n return [...new Set(selected ?? agents)];\n}\n\nexport function skillTargetPath(\n agent: AgentId,\n input: Pick<SkillInstallerRuntime, \"home\" | \"environment\">,\n): string {\n const home = path.resolve(input.home);\n const codexHome = input.environment.CODEX_HOME\n ? path.resolve(input.environment.CODEX_HOME)\n : path.join(home, \".codex\");\n switch (agent) {\n case \"codex\":\n return path.join(codexHome, \"skills\", skillName);\n case \"claude-code\":\n return path.join(home, \".claude\", \"skills\", skillName);\n case \"workbuddy\":\n return path.join(home, \".workbuddy\", \"skills\", skillName);\n }\n}\n\nfunction sourceTargetError(): never {\n throw new Error(\"Skill target is outside the configured user-level Agent directory\");\n}\n\nfunction assertUserTarget(\n target: string,\n agent: AgentId,\n runtime: SkillInstallerRuntime,\n): void {\n const parent =\n agent === \"codex\"\n ? path.resolve(\n runtime.environment.CODEX_HOME ?? path.join(runtime.home, \".codex\"),\n \"skills\",\n )\n : path.resolve(\n runtime.home,\n agent === \"claude-code\" ? \".claude/skills\" : \".workbuddy/skills\",\n );\n if (path.dirname(target) !== parent || path.basename(target) !== skillName)\n sourceTargetError();\n}\n\nclass SkillTargetLeaseError extends Error {}\n\nasync function withTargetLease<T>(\n target: string,\n operation: () => Promise<T>,\n): Promise<T> {\n await mkdir(path.dirname(target), { recursive: true });\n let release: () => Promise<void>;\n try {\n release = await lock(path.join(path.dirname(target), `.${skillName}.lease`), {\n realpath: false,\n stale: 10_000,\n update: 2_000,\n retries: { retries: 100, factor: 1, minTimeout: 10, maxTimeout: 10 },\n });\n } catch {\n throw new SkillTargetLeaseError();\n }\n try {\n return await operation();\n } finally {\n await release();\n }\n}\n\nasync function exists(location: string): Promise<boolean> {\n try {\n await lstat(location);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function moveTarget(\n runtime: SkillInstallerRuntime,\n from: string,\n to: string,\n): Promise<void> {\n if (runtime.filesystem?.rename) return runtime.filesystem.rename(from, to);\n await rename(from, to);\n}\n\nasync function removeTarget(\n runtime: SkillInstallerRuntime,\n target: string,\n): Promise<void> {\n if (runtime.filesystem?.remove) return runtime.filesystem.remove(target);\n await rm(target, { recursive: true, force: true });\n}\n\nfunction sameManagedSkill(left: ManagedSkill | null, right: ManagedSkill): boolean {\n return (\n left?.agent === right.agent &&\n left.target === right.target &&\n left.fingerprint === right.fingerprint &&\n left.version === right.version &&\n left.backupPath === right.backupPath\n );\n}\n\ntype UninstallRecovery = \"restored\" | \"incomplete\" | \"active-unmanaged\";\n\nasync function deactivateUnmanagedTarget(input: {\n runtime: SkillInstallerRuntime;\n target: string;\n removed: string;\n}): Promise<Exclude<UninstallRecovery, \"restored\">> {\n try {\n await moveTarget(input.runtime, input.target, input.removed);\n } catch {\n return \"active-unmanaged\";\n }\n return (await exists(input.target)) ? \"active-unmanaged\" : \"incomplete\";\n}\n\nasync function recoverUninstall(input: {\n runtime: SkillInstallerRuntime;\n agent: AgentId;\n target: string;\n removed: string;\n managed: ManagedSkill;\n}): Promise<UninstallRecovery> {\n try {\n await moveTarget(input.runtime, input.removed, input.target);\n } catch {\n return \"incomplete\";\n }\n if (!(await exists(input.target))) return \"incomplete\";\n try {\n await validateBundle(input.target, input.agent);\n if ((await fingerprintDirectory(input.target)) !== input.managed.fingerprint) {\n return deactivateUnmanagedTarget(input);\n }\n } catch {\n return deactivateUnmanagedTarget(input);\n }\n try {\n const current = await input.runtime.state.getManagedSkill(\n input.agent,\n input.target,\n );\n if (sameManagedSkill(current, input.managed)) return \"restored\";\n await input.runtime.state.saveManagedSkill(input.managed);\n const restored = await input.runtime.state.getManagedSkill(\n input.agent,\n input.target,\n );\n if (sameManagedSkill(restored, input.managed)) return \"restored\";\n } catch {\n // Keep the state from pointing to an active target when persistence recovery fails.\n }\n return deactivateUnmanagedTarget(input);\n}\n\nfunction digest(value: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(value).digest(\"hex\")}`;\n}\n\nfunction parseManifest(raw: string): SkillManifest {\n const value: unknown = JSON.parse(raw);\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"invalid manifest\");\n const manifest = value as Record<string, unknown>;\n if (\n manifest.schema !== 1 ||\n manifest.name !== skillName ||\n manifest.package !== packageName ||\n typeof manifest.packageVersion !== \"string\" ||\n !manifest.packageVersion ||\n typeof manifest.bundleDigest !== \"string\" ||\n !/^sha256:[a-f0-9]{64}$/u.test(manifest.bundleDigest) ||\n (!agents.includes(manifest.agent as AgentId) && manifest.agent !== \"template\")\n ) {\n throw new Error(\"invalid manifest\");\n }\n return manifest as unknown as SkillManifest;\n}\n\nasync function validateBundle(\n bundle: string,\n expectedAgent: AgentId | \"template\",\n): Promise<SkillManifest> {\n const [rawManifest, runtime] = await Promise.all([\n readFile(path.join(bundle, \"manifest.json\"), \"utf8\"),\n readFile(path.join(bundle, \"scripts\", \"sag-knowledge.cjs\")),\n ]);\n const manifest = parseManifest(rawManifest);\n if (manifest.agent !== expectedAgent || manifest.bundleDigest !== digest(runtime)) {\n throw new Error(\"invalid Skill bundle\");\n }\n await Promise.all(requiredFiles.map((file) => readFile(path.join(bundle, file))));\n return manifest;\n}\n\nasync function fingerprintDirectory(root: string, relative = \"\"): Promise<string> {\n const hash = createHash(\"sha256\");\n async function visit(nested = \"\"): Promise<void> {\n const entries = await readdir(path.join(root, nested), { withFileTypes: true });\n for (const entry of entries.sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const entryPath = path.join(nested, entry.name);\n if (entry.isDirectory()) {\n hash.update(`directory:${entryPath}\\n`);\n await visit(entryPath);\n } else if (entry.isFile()) {\n hash.update(`file:${entryPath}\\n`);\n hash.update(await readFile(path.join(root, entryPath)));\n } else {\n throw new Error(\"unsupported Skill file\");\n }\n }\n }\n await visit(relative);\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction sibling(target: string, suffix: \"tmp\" | \"backup\" | \"remove\"): string {\n return path.join(path.dirname(target), `.${skillName}.${suffix}-${randomUUID()}`);\n}\n\nasync function restore(input: {\n readonly runtime: SkillInstallerRuntime;\n readonly target: string;\n readonly temporary: string;\n readonly backup?: string;\n readonly hadTarget: boolean;\n readonly replacementFingerprint?: string;\n}): Promise<boolean> {\n let recovered = true;\n try {\n await removeTarget(input.runtime, input.temporary);\n } catch {\n recovered = false;\n }\n const targetMatchesReplacement = async (): Promise<boolean> => {\n if (!input.replacementFingerprint || !(await exists(input.target))) return false;\n try {\n return (\n (await fingerprintDirectory(input.target)) === input.replacementFingerprint\n );\n } catch {\n return false;\n }\n };\n if (input.backup && (await exists(input.backup))) {\n if (await exists(input.target)) {\n if (!(await targetMatchesReplacement())) return false;\n try {\n await removeTarget(input.runtime, input.target);\n } catch {\n return false;\n }\n }\n try {\n await moveTarget(input.runtime, input.backup, input.target);\n } catch {\n return false;\n }\n } else if (!input.hadTarget && (await exists(input.target))) {\n if (!(await targetMatchesReplacement())) return false;\n try {\n await removeTarget(input.runtime, input.target);\n } catch {\n return false;\n }\n }\n return recovered;\n}\n\nasync function inspectOne(\n runtime: SkillInstallerRuntime,\n agent: AgentId,\n inspectExplicitTarget = false,\n): Promise<SkillTargetReport> {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n if (!inspectExplicitTarget && !(await runtime.agents[agent].installed())) {\n return { agent, target, status: \"unavailable\", message: \"Agent is not installed.\" };\n }\n const managed = await runtime.state.getManagedSkill(agent, target);\n if (!(await exists(target))) {\n return managed\n ? {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory is missing.\",\n }\n : { agent, target, status: \"missing\", message: \"Skill is not installed.\" };\n }\n if (!managed) {\n return {\n agent,\n target,\n status: \"unmanaged\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Existing Skill directory is not managed by SAG CLI.\",\n };\n }\n try {\n const manifest = await validateBundle(target, agent);\n const fingerprint = await fingerprintDirectory(target);\n if (\n managed.fingerprint !== fingerprint ||\n managed.version !== manifest.packageVersion\n ) {\n return {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory has changed outside SAG CLI.\",\n };\n }\n return {\n agent,\n target,\n status: \"installed\",\n version: manifest.packageVersion,\n package: manifest.package,\n message: \"Managed Skill is installed.\",\n };\n } catch {\n return {\n agent,\n target,\n status: \"drifted\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message: \"Managed Skill directory has changed outside SAG CLI.\",\n };\n }\n}\n\nasync function activeAgents(\n runtime: SkillInstallerRuntime,\n selected: readonly AgentId[] | undefined,\n): Promise<readonly AgentId[]> {\n const choices = uniqueAgents(selected);\n if (selected) return choices;\n const installed = await Promise.all(\n choices.map(async (agent) => ({\n agent,\n installed: await runtime.agents[agent].installed(),\n })),\n );\n return installed.filter((choice) => choice.installed).map((choice) => choice.agent);\n}\n\nasync function requireConfirmation(\n runtime: SkillInstallerRuntime,\n selection: SkillTargetSelection,\n action: string,\n): Promise<boolean> {\n if (selection.yes) return true;\n return (await runtime.confirm?.(`${action} SAG Knowledge Skill?`)) ?? false;\n}\n\nexport async function inspectSkillTargets(\n runtime: SkillInstallerRuntime,\n input: Pick<SkillTargetSelection, \"agents\">,\n): Promise<SkillTargetsReport> {\n const source = await validateBundle(\n runtime.bundlePath ?? bundledSkillPath(),\n \"template\",\n );\n const selected = input.agents ? uniqueAgents(input.agents) : agents;\n const targets = await Promise.all(\n selected.map((agent) => inspectOne(runtime, agent, input.agents !== undefined)),\n );\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) => target.status === \"drifted\"),\n };\n}\n\nexport async function installSkillTargets(\n runtime: SkillInstallerRuntime,\n input: SkillTargetSelection,\n): Promise<SkillTargetsReport> {\n if (input.update && !runtime.resolveLatestBundle) {\n throw new CliError(\n \"DEPENDENCY_MISSING\",\n \"Unable to resolve @latest Skill package\",\n {\n exitCode: exitCodes.dependencyMissing,\n hint: \"Run this update through `npx @zleap-ai/sag-cli@latest` or restore npm access.\",\n },\n );\n }\n const resolved = input.update ? await runtime.resolveLatestBundle?.() : undefined;\n const sourcePath = resolved?.bundlePath ?? runtime.bundlePath ?? bundledSkillPath();\n const source = await validateBundle(sourcePath, \"template\");\n const selected = await activeAgents(runtime, input.agents);\n if (selected.length === 0) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: agents.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"unavailable\" as const,\n message: \"No supported Agent was detected on this device.\",\n })),\n completedWithErrors: true,\n };\n }\n if (!(await requireConfirmation(runtime, input, \"Install\"))) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: selected.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"skipped\",\n message: \"Installation was not confirmed.\",\n })),\n completedWithErrors: false,\n };\n }\n\n const targets: SkillTargetReport[] = [];\n try {\n for (const agent of selected) {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n try {\n targets.push(\n await withTargetLease(target, async () => {\n const inspection = await inspectOne(\n runtime,\n agent,\n input.agents !== undefined,\n );\n if (\n inspection.status === \"installed\" &&\n inspection.version === source.packageVersion\n ) {\n return {\n ...inspection,\n status: \"skipped\" as const,\n message: \"Managed Skill is already current.\",\n };\n }\n if (inspection.status === \"unmanaged\" || inspection.status === \"drifted\") {\n return { ...inspection, status: \"conflict\" as const };\n }\n if (inspection.status === \"unavailable\") return inspection;\n\n const temporary = sibling(target, \"tmp\");\n const hadTarget = inspection.status === \"installed\";\n let backup: string | undefined;\n let replacementFingerprint: string | undefined;\n try {\n await cp(sourcePath, temporary, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n const temporaryManifestPath = path.join(temporary, \"manifest.json\");\n const temporaryManifest = await validateBundle(temporary, \"template\");\n await writeFile(\n temporaryManifestPath,\n `${JSON.stringify({ ...temporaryManifest, agent }, null, 2)}\\n`,\n \"utf8\",\n );\n await validateBundle(temporary, agent);\n replacementFingerprint = await fingerprintDirectory(temporary);\n await runtime.agents[agent].installSkill?.();\n if (hadTarget) {\n backup = sibling(target, \"backup\");\n await moveTarget(runtime, target, backup);\n }\n await moveTarget(runtime, temporary, target);\n if ((await fingerprintDirectory(target)) !== replacementFingerprint) {\n throw new Error(\"Skill target changed during installation\");\n }\n const managed: ManagedSkill = {\n agent,\n target,\n version: source.packageVersion,\n fingerprint: replacementFingerprint,\n ...(backup ? { backupPath: backup } : {}),\n };\n await runtime.state.saveManagedSkill(managed);\n return {\n agent,\n target,\n status: hadTarget ? \"updated\" : \"created\",\n version: source.packageVersion,\n package: source.package,\n message: \"Skill installed.\",\n };\n } catch {\n const restored = await restore({\n runtime,\n target,\n temporary,\n ...(backup ? { backup } : {}),\n hadTarget,\n ...(replacementFingerprint ? { replacementFingerprint } : {}),\n }).catch(() => false);\n return {\n agent,\n target,\n status: \"failed\",\n message: restored\n ? \"Skill installation failed and this target was restored.\"\n : \"Skill installation failed and recovery was incomplete.\",\n };\n }\n }),\n );\n } catch (error) {\n if (!(error instanceof SkillTargetLeaseError)) throw error;\n targets.push({\n agent,\n target,\n status: \"conflict\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message:\n \"Skill target is busy; wait for the active SAG CLI operation and retry.\",\n });\n }\n }\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) =>\n [\"failed\", \"conflict\"].includes(target.status),\n ),\n };\n } finally {\n await resolved?.cleanup();\n }\n}\n\nexport async function uninstallSkillTargets(\n runtime: SkillInstallerRuntime,\n input: SkillTargetSelection,\n): Promise<SkillTargetsReport> {\n const source = await validateBundle(\n runtime.bundlePath ?? bundledSkillPath(),\n \"template\",\n );\n const selected = await activeAgents(runtime, input.agents);\n if (!(await requireConfirmation(runtime, input, \"Uninstall\"))) {\n return {\n package: source.package,\n version: source.packageVersion,\n targets: selected.map((agent) => ({\n agent,\n target: skillTargetPath(agent, runtime),\n status: \"skipped\",\n message: \"Uninstall was not confirmed.\",\n })),\n completedWithErrors: false,\n };\n }\n const targets: SkillTargetReport[] = [];\n for (const agent of selected) {\n const target = skillTargetPath(agent, runtime);\n assertUserTarget(target, agent, runtime);\n try {\n targets.push(\n await withTargetLease(target, async () => {\n const inspection = await inspectOne(\n runtime,\n agent,\n input.agents !== undefined,\n );\n if (inspection.status === \"missing\") return inspection;\n if (inspection.status !== \"installed\") {\n return {\n ...inspection,\n status: \"conflict\" as const,\n code: \"INSTALL_TARGET_CONFLICT\" as const,\n };\n }\n const removed = sibling(inspection.target, \"remove\");\n const managed = await runtime.state.getManagedSkill(agent, inspection.target);\n try {\n await moveTarget(runtime, inspection.target, removed);\n await runtime.state.deleteManagedSkill(agent, inspection.target);\n await removeTarget(runtime, removed);\n return {\n agent,\n target: inspection.target,\n status: \"removed\" as const,\n ...(inspection.version ? { version: inspection.version } : {}),\n package: source.package,\n message: \"Managed Skill was removed.\",\n };\n } catch {\n const recovery =\n managed && (await exists(removed))\n ? await recoverUninstall({\n runtime,\n agent,\n target: inspection.target,\n removed,\n managed,\n })\n : \"incomplete\";\n return {\n agent,\n target: inspection.target,\n status: \"failed\" as const,\n message:\n recovery === \"restored\"\n ? \"Skill uninstall failed; target and managed state were restored.\"\n : recovery === \"active-unmanaged\"\n ? \"Skill uninstall failed; recovery is incomplete and the active target is unmanaged.\"\n : \"Skill uninstall failed and recovery was incomplete.\",\n };\n }\n }),\n );\n } catch (error) {\n if (!(error instanceof SkillTargetLeaseError)) throw error;\n targets.push({\n agent,\n target,\n status: \"conflict\",\n code: \"INSTALL_TARGET_CONFLICT\",\n message:\n \"Skill target is busy; wait for the active SAG CLI operation and retry.\",\n });\n }\n }\n return {\n package: source.package,\n version: source.packageVersion,\n targets,\n completedWithErrors: targets.some((target) =>\n [\"failed\", \"conflict\"].includes(target.status),\n ),\n };\n}\n\nexport const skillInstallerExitCode = exitCodes.configConflict;\n","import { createHash, randomBytes as nodeRandomBytes } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport type { SkillAccount, SkillAuthorization } from \"./account-config.js\";\nimport type {\n SkillAccountAuthHttpClient,\n SkillLoginSession,\n} from \"./account-auth-client.js\";\nimport { SkillError } from \"./model.js\";\n\ninterface SkillAccountStore {\n getAccount(origin: string): Promise<SkillAccount | null>;\n getAuthorization?(origin: string): Promise<SkillAuthorization | null>;\n saveAccount(origin: string, account: SkillAccount): Promise<void>;\n removeAccount(origin: string): Promise<void>;\n withRefreshLock<T>(origin: string, operation: () => Promise<T>): Promise<T>;\n}\n\nexport interface SkillAccountAuthRuntime {\n readonly client: Pick<\n SkillAccountAuthHttpClient,\n \"createLoginSession\" | \"getLoginSession\" | \"exchange\" | \"refresh\" | \"logout\"\n >;\n readonly config: SkillAccountStore;\n readonly now: () => Date;\n readonly openBrowser: (url: string) => Promise<void>;\n readonly randomBytes?: (size: number) => Buffer;\n readonly sleep?: (milliseconds: number) => Promise<void>;\n}\n\nexport interface SkillAccountAuthorizationResult {\n readonly origin: string;\n readonly account: SkillAccount;\n readonly browserOpened: boolean;\n}\n\nexport async function authorizeSkillAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<SkillAccountAuthorizationResult> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const random = runtime.randomBytes ?? nodeRandomBytes;\n const verifier = random(32).toString(\"base64url\");\n const challenge = createHash(\"sha256\").update(verifier).digest(\"base64url\");\n const session = await runtime.client.createLoginSession(normalizedOrigin, challenge);\n await runtime.openBrowser(session.verificationUrl as string);\n const sleep = runtime.sleep ?? delay;\n\n for (;;) {\n if (runtime.now().getTime() >= new Date(session.expiresAt).getTime()) {\n throw expiredAuthorization();\n }\n const current = await runtime.client.getLoginSession(\n normalizedOrigin,\n session.sessionId,\n );\n if (current.status === \"denied\") {\n throw new SkillError(\n \"PERMISSION_DENIED\",\n \"SAG account authorization was denied\",\n { exitCode: exitCodes.permissionDenied },\n );\n }\n if (current.status === \"consumed\") throw expiredAuthorization();\n if (current.status === \"approved\") {\n const account = await runtime.client.exchange(normalizedOrigin, {\n sessionId: session.sessionId,\n pkceVerifier: verifier,\n });\n await runtime.config.saveAccount(normalizedOrigin, account);\n return { origin: normalizedOrigin, account, browserOpened: true };\n }\n await sleep(1_000);\n }\n}\n\nexport async function withFreshSkillAccount<T>(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n operation: (accessToken: string) => Promise<T>,\n): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const current = await requireAccount(runtime, normalizedOrigin);\n if (isFuture(current.accessExpiresAt, runtime.now())) {\n return operation(current.accessToken);\n }\n\n const accessToken = await runtime.config.withRefreshLock(\n normalizedOrigin,\n async () => {\n const latest = await requireAccount(runtime, normalizedOrigin);\n if (isFuture(latest.accessExpiresAt, runtime.now())) return latest.accessToken;\n if (!isFuture(latest.refreshExpiresAt, runtime.now())) {\n await runtime.config.removeAccount(normalizedOrigin);\n throw expiredAuthorization();\n }\n try {\n const rotated = await runtime.client.refresh(\n normalizedOrigin,\n latest.refreshToken,\n );\n const next = {\n ...rotated,\n ...(latest.recentKnowledgeBase && !rotated.recentKnowledgeBase\n ? { recentKnowledgeBase: latest.recentKnowledgeBase }\n : {}),\n };\n await runtime.config.saveAccount(normalizedOrigin, next);\n return next.accessToken;\n } catch (error) {\n if (\n error instanceof SkillError &&\n (error.code === \"AUTH_EXPIRED\" || error.code === \"AUTH_REQUIRED\")\n ) {\n await runtime.config.removeAccount(normalizedOrigin);\n }\n throw error;\n }\n },\n );\n return operation(accessToken);\n}\n\nexport async function withSkillAuthorization<T>(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n operation: (accessToken: string) => Promise<T>,\n): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const authorization = runtime.config.getAuthorization\n ? await runtime.config.getAuthorization(normalizedOrigin)\n : null;\n if (authorization && \"kind\" in authorization) return operation(authorization.token);\n return withFreshSkillAccount(runtime, normalizedOrigin, operation);\n}\n\nexport async function logoutSkillAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<boolean> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const authorization = runtime.config.getAuthorization\n ? await runtime.config.getAuthorization(normalizedOrigin)\n : null;\n if (authorization && \"kind\" in authorization) {\n await runtime.config.removeAccount(normalizedOrigin);\n return true;\n }\n const account = await runtime.config.getAccount(normalizedOrigin);\n if (!account) return false;\n await runtime.client.logout(\n normalizedOrigin,\n account.accessToken,\n account.refreshToken,\n );\n await runtime.config.removeAccount(normalizedOrigin);\n return true;\n}\n\nexport type { SkillLoginSession };\n\nasync function requireAccount(\n runtime: SkillAccountAuthRuntime,\n origin: string,\n): Promise<SkillAccount> {\n const account = await runtime.config.getAccount(origin);\n if (account) return account;\n throw new SkillError(\"AUTH_REQUIRED\", \"SAG account authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n}\n\nfunction isFuture(value: string, now: Date): boolean {\n return new Date(value).getTime() > now.getTime();\n}\n\nfunction expiredAuthorization(): SkillError {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n });\n}\n","import { exitCodes } from \"../core/errors.js\";\nimport {\n withSkillAuthorization,\n type SkillAccountAuthRuntime,\n} from \"./account-auth.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport type {\n SkillDocumentUploadClient,\n SkillKnowledgeAnswer,\n SkillKnowledgeBase,\n SkillKnowledgeClient,\n SkillKnowledgeClientOptions,\n} from \"./knowledge-client.js\";\nimport { SkillError } from \"./model.js\";\n\nexport interface SkillAccountKnowledgeRuntime {\n readonly auth: SkillAccountAuthRuntime;\n readonly createId: () => string;\n readonly config: Readonly<{\n saveRecentKnowledgeBase(\n origin: string,\n knowledgeBase: Readonly<{ id: string; name: string }>,\n ): Promise<void>;\n }>;\n readonly createClient: (\n options: SkillKnowledgeClientOptions,\n ) => SkillKnowledgeClient & Partial<SkillDocumentUploadClient>;\n}\n\nexport async function renameSkillAccountDocument(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n input: Readonly<{\n knowledgeBase: string;\n documentId: string;\n expectedVersion: number;\n title: string;\n }>,\n) {\n const knowledgeBase = await selectedKnowledgeBase(\n runtime,\n origin,\n input.knowledgeBase,\n );\n const renamed = await withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.renameDocument({\n knowledgeBaseId: knowledgeBase.id,\n documentId: input.documentId,\n expectedVersion: input.expectedVersion,\n idempotencyKey: runtime.createId(),\n title: input.title,\n }),\n );\n await remember(runtime, origin, knowledgeBase);\n return renamed;\n}\n\nexport async function deleteSkillAccountDocument(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n input: Readonly<{\n knowledgeBase: string;\n documentId: string;\n expectedVersion: number;\n }>,\n) {\n const knowledgeBase = await selectedKnowledgeBase(\n runtime,\n origin,\n input.knowledgeBase,\n );\n const deleted = await withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.deleteDocument({\n knowledgeBaseId: knowledgeBase.id,\n documentId: input.documentId,\n expectedVersion: input.expectedVersion,\n idempotencyKey: runtime.createId(),\n }),\n );\n await remember(runtime, origin, knowledgeBase);\n return deleted;\n}\n\nexport async function listSkillAccountKnowledgeBases(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n): Promise<readonly SkillKnowledgeBase[]> {\n return withSkillAccountKnowledgeClient(runtime, origin, (client) =>\n client.listKnowledgeBases(),\n );\n}\n\nexport async function listSkillAccountDocuments(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n selector: string,\n) {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n const knowledgeBases = await listSkillAccountKnowledgeBases(\n runtime,\n normalizedOrigin,\n );\n const knowledgeBase = resolveKnowledgeBase(knowledgeBases, selector);\n const documents = await withSkillAccountKnowledgeClient(\n runtime,\n normalizedOrigin,\n (client) => client.listDocuments(knowledgeBase.id),\n );\n await runtime.config.saveRecentKnowledgeBase(normalizedOrigin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n return { knowledgeBase, documents };\n}\n\nexport async function askSkillAccountKnowledge(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n question: string,\n selector?: string,\n): Promise<SkillKnowledgeAnswer> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n let knowledgeBase: SkillKnowledgeBase | undefined;\n if (selector) {\n knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, normalizedOrigin),\n selector,\n );\n }\n const answer = await withSkillAccountKnowledgeClient(\n runtime,\n normalizedOrigin,\n (client) => {\n if (!client.ask) {\n throw new SkillError(\n \"PLATFORM_UNAVAILABLE\",\n \"SAG account question answering is unavailable\",\n { exitCode: exitCodes.serviceNotReady },\n );\n }\n return client.ask(question, knowledgeBase?.id);\n },\n );\n if (knowledgeBase) {\n await runtime.config.saveRecentKnowledgeBase(normalizedOrigin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n }\n return answer;\n}\n\nexport function resolveKnowledgeBase(\n knowledgeBases: readonly SkillKnowledgeBase[],\n selector: string,\n): SkillKnowledgeBase {\n const exactId = knowledgeBases.find((item) => item.id === selector);\n if (exactId) return exactId;\n const exactAlias = knowledgeBases.filter((item) => item.alias === selector);\n if (exactAlias.length === 1) return exactAlias[0] as SkillKnowledgeBase;\n const normalized = selector.trim().toLocaleLowerCase();\n const names = knowledgeBases.filter(\n (item) => item.name.toLocaleLowerCase() === normalized,\n );\n if (names.length === 1) return names[0] as SkillKnowledgeBase;\n throw new SkillError(\n \"INVALID_ARGUMENT\",\n names.length > 1\n ? \"Knowledge Base name is ambiguous\"\n : \"Knowledge Base was not found\",\n {\n details: { selector },\n exitCode: exitCodes.invalidArgument,\n },\n );\n}\n\nasync function selectedKnowledgeBase(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n selector: string,\n): Promise<SkillKnowledgeBase> {\n return resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n selector,\n );\n}\n\nasync function remember(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n knowledgeBase: SkillKnowledgeBase,\n): Promise<void> {\n await runtime.config.saveRecentKnowledgeBase(origin, {\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n });\n}\n\nexport async function withSkillAccountKnowledgeClient<T>(\n runtime: SkillAccountKnowledgeRuntime,\n origin: string,\n operation: (\n client: SkillKnowledgeClient & Partial<SkillDocumentUploadClient>,\n ) => Promise<T>,\n): Promise<T> {\n const normalizedOrigin = normalizeSkillOrigin(origin);\n return withSkillAuthorization(runtime.auth, normalizedOrigin, (accessToken) =>\n operation(runtime.createClient({ accessToken, origin: normalizedOrigin })),\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport {\n listSkillAccountKnowledgeBases,\n resolveKnowledgeBase,\n withSkillAccountKnowledgeClient,\n type SkillAccountKnowledgeRuntime,\n} from \"./account-knowledge.js\";\nimport { SkillError } from \"./model.js\";\n\nconst DEFAULT_MAX_UPLOAD_BYTES = 25 * 1024 * 1024;\n\nexport type SkillAccountUploadEvent = Readonly<{\n event: \"accepted\" | \"processing\" | \"completed\" | \"failed\" | \"detached\";\n importId: string;\n documentId?: string;\n jobId?: string;\n failure?: string;\n}>;\n\nexport interface SkillAccountUploadRuntime extends SkillAccountKnowledgeRuntime {\n readonly now: () => Date;\n readonly sleep: (milliseconds: number) => Promise<void>;\n readonly onEvent?: (event: SkillAccountUploadEvent) => void | Promise<void>;\n}\n\nexport async function uploadSkillAccountFile(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n filePath: string,\n knowledgeBaseSelector: string,\n waitMs = 30 * 60 * 1000,\n overwriteDocumentId?: string,\n): Promise<readonly SkillAccountUploadEvent[]> {\n const file = await inspectFile(filePath);\n const knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n knowledgeBaseSelector,\n );\n const serverLimit = await withSkillAccountKnowledgeClient(\n runtime,\n origin,\n (client) => {\n if (!client.getServerLimit) return Promise.resolve(undefined);\n return client.getServerLimit(knowledgeBase.id);\n },\n );\n const limit = Math.min(\n DEFAULT_MAX_UPLOAD_BYTES,\n serverLimit ?? DEFAULT_MAX_UPLOAD_BYTES,\n );\n if (file.size > limit) {\n throw new SkillError(\n \"FILE_TOO_LARGE\",\n `This file exceeds the ${limit}-byte Knowledge Base upload limit.`,\n {\n details: { limit_bytes: limit, size_bytes: file.size },\n exitCode: exitCodes.invalidArgument,\n },\n );\n }\n const digest = await sha256(filePath);\n const receipt = await withSkillAccountKnowledgeClient(runtime, origin, (client) => {\n if (!client.upload) return unavailableUpload();\n return client.upload({\n fileDigest: digest,\n fileName: file.name,\n filePath,\n fileSize: file.size,\n idempotencyKey: runtime.createId(),\n knowledgeBaseId: knowledgeBase.id,\n ...(overwriteDocumentId ? { overwriteDocumentId } : {}),\n });\n });\n const accepted: SkillAccountUploadEvent = {\n event: \"accepted\",\n importId: receipt.importId,\n documentId: receipt.documentId,\n jobId: receipt.jobId,\n };\n await runtime.onEvent?.(accepted);\n if (waitMs === 0) {\n const detached = { ...accepted, event: \"detached\" as const };\n await runtime.onEvent?.(detached);\n return [accepted, detached];\n }\n const terminal = await poll(\n runtime,\n origin,\n knowledgeBase.id,\n receipt.importId,\n waitMs,\n );\n return [accepted, terminal];\n}\n\nexport async function inspectSkillAccountUpload(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n importId: string,\n knowledgeBaseSelector: string,\n): Promise<SkillAccountUploadEvent> {\n const knowledgeBase = resolveKnowledgeBase(\n await listSkillAccountKnowledgeBases(runtime, origin),\n knowledgeBaseSelector,\n );\n return readStatus(runtime, origin, knowledgeBase.id, importId);\n}\n\nasync function poll(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n knowledgeBaseId: string,\n importId: string,\n waitMs: number,\n): Promise<SkillAccountUploadEvent> {\n const startedAt = runtime.now().getTime();\n for (;;) {\n const event = await readStatus(runtime, origin, knowledgeBaseId, importId);\n await runtime.onEvent?.(event);\n if (event.event !== \"processing\") return event;\n if (runtime.now().getTime() - startedAt >= waitMs) {\n const detached = { event: \"detached\" as const, importId };\n await runtime.onEvent?.(detached);\n return detached;\n }\n await runtime.sleep(2_000);\n }\n}\n\nasync function readStatus(\n runtime: SkillAccountUploadRuntime,\n origin: string,\n knowledgeBaseId: string,\n importId: string,\n): Promise<SkillAccountUploadEvent> {\n const current = await withSkillAccountKnowledgeClient(runtime, origin, (client) => {\n if (!client.getImportStatus) return unavailableUpload();\n return client.getImportStatus(knowledgeBaseId, importId);\n });\n return {\n event: current.searchable\n ? \"completed\"\n : current.state === \"failed\"\n ? \"failed\"\n : \"processing\",\n importId,\n ...(current.failure ? { failure: current.failure } : {}),\n };\n}\n\nasync function inspectFile(filePath: string): Promise<{ name: string; size: number }> {\n let metadata;\n try {\n metadata = await stat(filePath);\n } catch {\n throw new SkillError(\"FILE_NOT_FOUND\", \"The upload file could not be found.\", {\n exitCode: exitCodes.invalidArgument,\n });\n }\n if (!metadata.isFile()) {\n throw new SkillError(\n \"UNSUPPORTED_FILE_TYPE\",\n \"Upload accepts one regular file, not a directory or batch.\",\n { exitCode: exitCodes.invalidArgument },\n );\n }\n return { name: path.basename(filePath), size: metadata.size };\n}\n\nasync function sha256(filePath: string): Promise<string> {\n const digest = createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) digest.update(chunk);\n return `sha256:${digest.digest(\"hex\")}`;\n}\n\nfunction unavailableUpload(): never {\n throw new SkillError(\"PLATFORM_UNAVAILABLE\", \"SAG upload is unavailable\", {\n exitCode: exitCodes.serviceNotReady,\n });\n}\n","import { z } from \"zod\";\nimport { openAsBlob } from \"node:fs\";\n\nimport { exitCodes } from \"../core/errors.js\";\nimport { normalizeSkillOrigin } from \"./account-config.js\";\nimport { SkillError } from \"./model.js\";\n\nconst knowledgeBaseSchema = z.strictObject({\n alias: z.string().min(1).optional(),\n id: z.string().min(1),\n name: z.string().min(1),\n});\nconst knowledgeBaseDirectorySchema = z.strictObject({\n items: z.array(knowledgeBaseSchema),\n});\nconst documentSchema = z.strictObject({\n id: z.string().min(1),\n knowledge_base_id: z.string().min(1),\n title: z.string().min(1),\n version: z.number().int().positive(),\n});\nconst documentDirectorySchema = z.strictObject({\n items: z.array(documentSchema),\n});\nconst deletedDocumentSchema = z.strictObject({\n deleted_at: z.string().datetime({ offset: true }),\n document_id: z.string().min(1),\n recoverable: z.literal(true),\n version: z.number().int().positive(),\n});\nconst uploadStateSchema = z.enum([\n \"queued\",\n \"accepted\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\nconst uploadResponseSchema = z.strictObject({\n document_id: z.string().min(1),\n import_id: z.string().min(1),\n job_id: z.string().min(1),\n state: uploadStateSchema,\n});\nconst uploadLimitSchema = z.strictObject({\n max_upload_bytes: z.number().int().positive(),\n});\nconst importStatusSchema = z.strictObject({\n failure: z.string().min(1).optional(),\n searchable: z.boolean(),\n state: uploadStateSchema,\n});\nconst answerSchema = z.strictObject({\n answer: z.string().min(1),\n citations: z.array(\n z.strictObject({\n number: z.number().int().positive(),\n knowledge_base_id: z.string().min(1),\n document_id: z.string().min(1),\n document_version_id: z.string().min(1),\n excerpt: z.string(),\n location: z.string().min(1).optional(),\n }),\n ),\n search_completeness: z.enum([\"complete\", \"partial\"]),\n search_partial_reasons: z.array(z.string().min(1)),\n});\nconst problemSchema = z\n .object({\n code: z.string().min(1),\n data: z.unknown().optional(),\n })\n .passthrough();\nconst duplicateImportDetailsSchema = z.object({\n conflict_type: z.enum([\n \"same_filename_same_checksum\",\n \"same_filename_changed_checksum\",\n ]),\n existing_document_id: z.string().min(1),\n existing_import_id: z.string().min(1),\n existing_filename: z.string().min(1),\n current_filename: z.string().min(1),\n checksum_sha256: z.string().min(1),\n existing_state: z.string().min(1),\n overwrite_allowed: z.boolean(),\n});\n\nexport type SkillKnowledgeBase = Readonly<{\n alias?: string;\n id: string;\n name: string;\n}>;\n\nexport type SkillDocument = Readonly<{\n id: string;\n knowledgeBaseId: string;\n title: string;\n version: number;\n}>;\n\nexport type SkillDeletedDocument = Readonly<{\n deletedAt: string;\n documentId: string;\n recoverable: true;\n version: number;\n}>;\n\nexport type SkillDocumentUploadReceipt = Readonly<{\n documentId: string;\n importId: string;\n jobId: string;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n}>;\n\nexport type SkillKnowledgeAnswer = Readonly<{\n answer: string;\n citations: readonly Readonly<{\n number: number;\n knowledgeBaseId: string;\n documentId: string;\n documentVersionId: string;\n excerpt: string;\n location?: string;\n }>[];\n completeness: \"complete\" | \"partial\";\n partialReasons: readonly string[];\n}>;\n\nexport interface SkillKnowledgeClient {\n ask?(question: string, knowledgeBaseId?: string): Promise<SkillKnowledgeAnswer>;\n listKnowledgeBases(): Promise<readonly SkillKnowledgeBase[]>;\n listDocuments(knowledgeBaseId: string): Promise<readonly SkillDocument[]>;\n renameDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n title: string;\n }): Promise<SkillDocument>;\n deleteDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): Promise<SkillDeletedDocument>;\n}\n\nexport interface SkillDocumentUploadClient {\n getServerLimit(knowledgeBaseId: string, signal?: AbortSignal): Promise<number>;\n getImportStatus(\n knowledgeBaseId: string,\n importId: string,\n signal?: AbortSignal,\n ): Promise<{\n failure?: string;\n searchable: boolean;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n }>;\n upload(\n input: {\n fileDigest: string;\n fileName: string;\n filePath: string;\n fileSize: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n overwriteDocumentId?: string;\n },\n signal?: AbortSignal,\n ): Promise<SkillDocumentUploadReceipt>;\n}\n\nexport interface SkillKnowledgeClientOptions {\n readonly accessToken: string;\n readonly fetchImplementation?: typeof fetch;\n readonly origin: string;\n readonly timeoutMs?: number;\n}\n\nfunction httpError(\n status: number,\n problemCode: string,\n problemData?: unknown,\n): SkillError {\n const normalizedProblemCode = problemCode.toLowerCase();\n const details = { problemCode };\n if (\n normalizedProblemCode === \"invalid_grant\" ||\n normalizedProblemCode === \"expired_token\"\n ) {\n return new SkillError(\"AUTH_EXPIRED\", \"SAG account authorization has expired\", {\n exitCode: exitCodes.authRequired,\n ...details,\n });\n }\n if (normalizedProblemCode === \"open_link_token_invalid\") {\n return new SkillError(\n \"AUTH_REQUIRED\",\n \"The Open Link token is no longer valid. Ask the link administrator for a current token.\",\n {\n exitCode: exitCodes.authRequired,\n ...details,\n },\n );\n }\n if (normalizedProblemCode === \"document_title_conflict\") {\n return new SkillError(\"DOCUMENT_TITLE_CONFLICT\", \"The document title conflicts\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (normalizedProblemCode === \"document_import_duplicate\") {\n const details = duplicateImportDetailsSchema.safeParse(problemData);\n return new SkillError(\n \"DOCUMENT_IMPORT_DUPLICATE\",\n \"A file with the same name already exists in this Knowledge Base\",\n {\n ...(details.success ? { details: details.data } : {}),\n exitCode: exitCodes.configConflict,\n problemCode,\n },\n );\n }\n if (normalizedProblemCode === \"stale_version\") {\n return new SkillError(\"STALE_VERSION\", \"The document version is stale\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (status === 401) {\n return new SkillError(\"AUTH_REQUIRED\", \"Skill authorization is required\", {\n exitCode: exitCodes.authRequired,\n ...details,\n });\n }\n if (status === 403) {\n return new SkillError(\"PERMISSION_DENIED\", \"Skill authorization was denied\", {\n exitCode: exitCodes.permissionDenied,\n ...details,\n });\n }\n if (status === 404) {\n return new SkillError(\n \"DOCUMENT_NOT_FOUND\",\n \"Skill Knowledge resource was not found\",\n {\n exitCode: exitCodes.resourceNotFound,\n ...details,\n },\n );\n }\n if (status === 409) {\n return new SkillError(\"CONFIG_CONFLICT\", \"Skill Knowledge request conflicts\", {\n exitCode: exitCodes.configConflict,\n ...details,\n });\n }\n if (status === 429) {\n return new SkillError(\n \"RATE_LIMITED\",\n \"Skill Knowledge service rate limit reached\",\n {\n exitCode: exitCodes.networkUnreachable,\n ...details,\n },\n );\n }\n if (status >= 500) {\n return new SkillError(\n \"PLATFORM_UNAVAILABLE\",\n \"Skill Knowledge service is unavailable\",\n {\n exitCode: exitCodes.serviceNotReady,\n ...details,\n },\n );\n }\n return new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned an incompatible response\",\n {\n exitCode: exitCodes.internalError,\n ...details,\n },\n );\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"The request was interrupted.\", \"AbortError\");\n}\n\nexport class SkillKnowledgeHttpClient\n implements SkillKnowledgeClient, SkillDocumentUploadClient\n{\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n readonly #origin: string;\n readonly #timeoutMs: number;\n\n constructor(options: SkillKnowledgeClientOptions) {\n try {\n this.#origin = normalizeSkillOrigin(options.origin);\n } catch {\n throw new SkillError(\"CONFIG_CONFLICT\", \"SAG address is invalid\", {\n exitCode: exitCodes.configConflict,\n });\n }\n if (!options.accessToken) {\n throw new SkillError(\"AUTH_REQUIRED\", \"Skill authorization is required\", {\n exitCode: exitCodes.authRequired,\n });\n }\n this.#accessToken = options.accessToken;\n this.#fetch = options.fetchImplementation ?? fetch;\n this.#timeoutMs = options.timeoutMs ?? 15_000;\n }\n\n async ask(question: string, knowledgeBaseId?: string): Promise<SkillKnowledgeAnswer> {\n const answer = this.#parse(\n answerSchema,\n await this.#request(\"/api/v1/integrations/skill/v1/questions\", {\n body: {\n question,\n ...(knowledgeBaseId ? { knowledge_base_id: knowledgeBaseId } : {}),\n },\n method: \"POST\",\n }),\n );\n return {\n answer: answer.answer,\n citations: answer.citations.map((citation) => ({\n number: citation.number,\n knowledgeBaseId: citation.knowledge_base_id,\n documentId: citation.document_id,\n documentVersionId: citation.document_version_id,\n excerpt: citation.excerpt,\n ...(citation.location ? { location: citation.location } : {}),\n })),\n completeness: answer.search_completeness,\n partialReasons: answer.search_partial_reasons,\n };\n }\n\n async listKnowledgeBases(): Promise<readonly SkillKnowledgeBase[]> {\n const parsed = await this.#request(\n \"/api/v1/integrations/skill/v1/knowledge-bases\",\n {\n method: \"GET\",\n },\n );\n return this.#parse(knowledgeBaseDirectorySchema, parsed).items.map(\n (knowledgeBase) => ({\n id: knowledgeBase.id,\n name: knowledgeBase.name,\n ...(knowledgeBase.alias ? { alias: knowledgeBase.alias } : {}),\n }),\n );\n }\n\n async listDocuments(knowledgeBaseId: string): Promise<readonly SkillDocument[]> {\n const parsed = await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/documents`,\n { method: \"GET\" },\n );\n return this.#parse(documentDirectorySchema, parsed).items.map((document) => ({\n id: document.id,\n knowledgeBaseId: document.knowledge_base_id,\n title: document.title,\n version: document.version,\n }));\n }\n\n async renameDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n title: string;\n }): Promise<SkillDocument> {\n const document = this.#parse(\n documentSchema,\n await this.#request(this.#mutationPath(input), {\n body: { title: input.title },\n headers: this.#mutationHeaders(input),\n method: \"PATCH\",\n }),\n );\n if (\n document.id !== input.documentId ||\n document.knowledge_base_id !== input.knowledgeBaseId\n ) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned a different document\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n return {\n id: document.id,\n knowledgeBaseId: document.knowledge_base_id,\n title: document.title,\n version: document.version,\n };\n }\n\n async deleteDocument(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): Promise<SkillDeletedDocument> {\n const deleted = this.#parse(\n deletedDocumentSchema,\n await this.#request(this.#mutationPath(input), {\n headers: this.#mutationHeaders(input),\n method: \"DELETE\",\n }),\n );\n if (deleted.document_id !== input.documentId) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned a different document\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n return {\n deletedAt: deleted.deleted_at,\n documentId: deleted.document_id,\n recoverable: deleted.recoverable,\n version: deleted.version,\n };\n }\n\n async getServerLimit(knowledgeBaseId: string, signal?: AbortSignal): Promise<number> {\n return this.#parse(\n uploadLimitSchema,\n await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/upload-limit`,\n { method: \"GET\", ...(signal ? { signal } : {}) },\n ),\n ).max_upload_bytes;\n }\n\n async upload(\n input: {\n fileDigest: string;\n fileName: string;\n filePath: string;\n fileSize: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n overwriteDocumentId?: string;\n },\n signal?: AbortSignal,\n ): Promise<SkillDocumentUploadReceipt> {\n throwIfAborted(signal);\n const form = new FormData();\n form.set(\"file\", await openAsBlob(input.filePath), input.fileName);\n if (input.overwriteDocumentId) {\n form.set(\"overwrite_document_id\", input.overwriteDocumentId);\n }\n const payload = await this.#multipartRequest(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents`,\n form,\n input.idempotencyKey,\n signal,\n );\n const response = this.#parse(uploadResponseSchema, payload);\n return {\n documentId: response.document_id,\n importId: response.import_id,\n jobId: response.job_id,\n state: response.state,\n };\n }\n\n async getImportStatus(\n knowledgeBaseId: string,\n importId: string,\n signal?: AbortSignal,\n ): Promise<{\n failure?: string;\n searchable: boolean;\n state: \"queued\" | \"accepted\" | \"processing\" | \"completed\" | \"failed\";\n }> {\n const status = this.#parse(\n importStatusSchema,\n await this.#request(\n `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/imports/${encodeURIComponent(importId)}`,\n { method: \"GET\", ...(signal ? { signal } : {}) },\n ),\n );\n return {\n searchable: status.searchable,\n state: status.state,\n ...(status.failure ? { failure: status.failure } : {}),\n };\n }\n\n async #request(\n path: string,\n options: {\n readonly body?: Record<string, unknown>;\n readonly headers?: Record<string, string>;\n readonly method: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\";\n readonly signal?: AbortSignal;\n },\n ): Promise<unknown> {\n let response: Response;\n try {\n throwIfAborted(options.signal);\n response = await this.#fetch(new URL(path, this.#origin), {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n \"Cache-Control\": \"no-store\",\n ...options.headers,\n ...(options.body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n },\n method: options.method,\n redirect: \"error\",\n signal: this.#requestSignal(options.signal),\n ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) }),\n });\n } catch (error) {\n if (options.signal?.aborted) throw error;\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the Skill Knowledge service\",\n {\n exitCode: exitCodes.networkUnreachable,\n },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service redirect was rejected\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const problem = problemSchema.safeParse(payload);\n throw httpError(\n response.status,\n problem.success ? problem.data.code : \"unknown\",\n problem.success ? problem.data.data : undefined,\n );\n }\n return payload;\n }\n\n #mutationPath(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n knowledgeBaseId: string;\n }): string {\n return `/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents/${encodeURIComponent(input.documentId)}`;\n }\n\n #mutationHeaders(input: {\n documentId: string;\n expectedVersion: number;\n idempotencyKey: string;\n }): Record<string, string> {\n return {\n \"Idempotency-Key\": input.idempotencyKey,\n \"If-Match\": `\"document.${input.documentId}.v${input.expectedVersion}\"`,\n };\n }\n\n async #multipartRequest(\n path: string,\n body: FormData,\n idempotencyKey: string,\n signal?: AbortSignal,\n ): Promise<unknown> {\n let response: Response;\n try {\n throwIfAborted(signal);\n response = await this.#fetch(new URL(path, this.#origin), {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.#accessToken}`,\n \"Cache-Control\": \"no-store\",\n \"Idempotency-Key\": idempotencyKey,\n },\n method: \"POST\",\n redirect: \"error\",\n signal: this.#requestSignal(signal),\n body,\n });\n } catch (error) {\n if (signal?.aborted) throw error;\n throw new SkillError(\n \"NETWORK_UNREACHABLE\",\n \"Cannot reach the Skill Knowledge service\",\n {\n exitCode: exitCodes.networkUnreachable,\n },\n );\n }\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service redirect was rejected\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const problem = problemSchema.safeParse(payload);\n throw httpError(\n response.status,\n problem.success ? problem.data.code : \"unknown\",\n problem.success ? problem.data.data : undefined,\n );\n }\n return payload;\n }\n\n #requestSignal(signal: AbortSignal | undefined): AbortSignal {\n const timeout = AbortSignal.timeout(this.#timeoutMs);\n return signal ? AbortSignal.any([signal, timeout]) : timeout;\n }\n\n #parse<TSchema extends z.ZodType>(\n schema: TSchema,\n payload: unknown,\n ): z.output<TSchema> {\n const parsed = schema.safeParse(payload);\n if (parsed.success) return parsed.data;\n throw new SkillError(\n \"INVALID_RESPONSE\",\n \"Skill Knowledge service returned an incompatible response\",\n {\n exitCode: exitCodes.internalError,\n },\n );\n }\n}\n"],"mappings":"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","names":["rm","os","path","readFile","os","path","z","z","invalidSpec","input","path","hostFailure","conflict","sameSpec","os","readFile","chmod","readFile","rename","stat","unlink","writeFile","os","path","z","z","invalidSpec","hostFailure","conflict","path","os","stat","readFile","writeFile","rename","chmod","unlink","chmod","mkdir","readFile","rename","unlink","writeFile","path","lock","z","z","mkdir","path","lock","readFile","writeFile","rename","chmod","unlink","input","mkdir","readFile","rename","unlink","writeFile","path","parse","stringify","input","z","readFile","parse","path","mkdir","writeFile","stringify","rename","unlink","os","path","randomUUID","chmod","mkdir","readFile","rename","unlink","path","lock","z","z","emptyState","invalidState","chmod","mkdir","path","lock","readFile","randomUUID","rename","unlink","z","chmod","mkdir","readFile","rename","unlink","writeFile","path","lock","parse","stringify","z","z","emptyState","invalidState","mkdir","path","lock","readFile","parse","writeFile","stringify","rename","chmod","unlink","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","parse","stringify","z","z","emptyState","invalidState","receiptFor","mkdir","path","lock","readFile","parse","randomUUID","open","stringify","rename","unlink","Client","input","input","Client","listSources","input","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","z","z","emptyState","invalidState","mkdir","path","lock","readFile","randomUUID","open","rename","unlink","z","createHash","randomUUID","mkdir","open","readFile","rename","unlink","path","lock","z","z","input","readFile","digest","createHash","mkdir","path","lock","randomUUID","open","rename","unlink","z","input","status","randomUUID","z","input","path","status","conflict","hostFailure","input","input","input","runtime","input","agents","input","user","requiredIdentifier","runtime","input","createHash","input","createHash","configurationConflict","hostFailure","input","status","runtime","createHash","lstat","mkdir","readFile","rename","path","path","lstat","readFile","createHash","success","status","failed","conflict","input","rename","mkdir","input","connection","failure","status","runtime","agents","nextActions","input","runtime","runtime","input","source","status","summary","createHash","createHash","input","success","status","input","agents","createHash","randomUUID","cp","lstat","mkdir","readFile","readdir","rename","rm","writeFile","fileURLToPath","path","lock","skillName","bundledSkillPath","path","fileURLToPath","input","runtime","mkdir","lock","exists","lstat","rename","rm","createHash","readFile","readdir","randomUUID","cp","writeFile","createHash","runtime","verifier","createHash","runtime","input","createHash","stat","path","runtime","digest","stat","path","createHash","z","z","documentSchema","problemSchema","status","details","input","path","commandOptions","dependencies","success","runtime","randomUUID","status","failed","conflict","agents","input","processRunner","path","rm","skillState","os"]}
|