@seclai/cli 1.0.6 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +333 -59
- package/dist/cli.js +1728 -219
- package/dist/cli.js.map +1 -1
- package/package.json +24 -5
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { readFileSync, realpathSync } from \"node:fs\";\nimport process from \"node:process\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport {\n Seclai,\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiConfigurationError,\n} from \"@seclai/sdk\";\n\ntype GlobalOptions = {\n apiKey?: string;\n};\n\nexport type CliRuntime = {\n stdin: NodeJS.ReadableStream;\n writeOut: (text: string) => void;\n writeErr: (text: string) => void;\n setExitCode: (code: number) => void;\n};\n\nfunction defaultRuntime(): CliRuntime {\n return {\n stdin: process.stdin,\n writeOut: (text) => {\n process.stdout.write(text);\n },\n writeErr: (text) => {\n process.stderr.write(text);\n },\n setExitCode: (code) => {\n process.exitCode = code;\n },\n };\n}\n\nasync function readStdinText(rt: CliRuntime): Promise<string> {\n return await new Promise((resolve, reject) => {\n let data = \"\";\n rt.stdin.setEncoding(\"utf8\");\n rt.stdin.on(\"data\", (chunk: string) => (data += chunk));\n rt.stdin.on(\"end\", () => resolve(data));\n rt.stdin.on(\"error\", reject);\n });\n}\n\nasync function readJsonInput(\n rt: CliRuntime,\n opts: {\n json?: string;\n jsonFile?: string;\n }\n): Promise<unknown> {\n if (opts.json !== undefined && opts.jsonFile !== undefined) {\n throw new Error(\"Provide only one of --json or --json-file\");\n }\n\n if (opts.jsonFile !== undefined) {\n const text =\n opts.jsonFile === \"-\" ? await readStdinText(rt) : await readFile(opts.jsonFile, \"utf8\");\n return JSON.parse(text);\n }\n\n if (opts.json !== undefined) {\n const text = opts.json === \"-\" ? await readStdinText(rt) : opts.json;\n return JSON.parse(text);\n }\n\n throw new Error(\"Missing JSON input. Provide --json or --json-file.\");\n}\n\nasync function readJsonObjectInput(\n rt: CliRuntime,\n opts: {\n json?: string;\n jsonFile?: string;\n }\n): Promise<Record<string, unknown>> {\n const value = await readJsonInput(rt, opts);\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Expected a JSON object.\");\n }\n return value as Record<string, unknown>;\n}\n\nfunction getCliVersion(): string {\n try {\n const packageJsonPath = new URL(\"../package.json\", import.meta.url);\n const raw = readFileSync(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === \"string\" ? parsed.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction createClient(opts: GlobalOptions): Seclai {\n const seclaiOpts: { apiKey?: string; baseUrl?: string } = {};\n if (opts.apiKey !== undefined) seclaiOpts.apiKey = opts.apiKey;\n\n // Be explicit about the default API host. (The SDK also supports SECLAI_API_URL.)\n const envUrl = process.env.SECLAI_API_URL;\n seclaiOpts.baseUrl = envUrl && envUrl.length > 0 ? envUrl : \"https://api.seclai.com\";\n\n return new Seclai(seclaiOpts);\n}\n\nfunction printJson(rt: CliRuntime, value: unknown): void {\n rt.writeOut(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction printError(rt: CliRuntime, err: unknown): void {\n if (err instanceof SeclaiAPIValidationError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n rt.writeErr(`status: ${err.statusCode}\\n`);\n rt.writeErr(`url: ${err.url}\\n`);\n if (err.responseText) rt.writeErr(`response: ${err.responseText}\\n`);\n if (err.validationError) printJson(rt, { validationError: err.validationError });\n return;\n }\n\n if (err instanceof SeclaiAPIStatusError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n rt.writeErr(`status: ${err.statusCode}\\n`);\n rt.writeErr(`url: ${err.url}\\n`);\n if (err.responseText) rt.writeErr(`response: ${err.responseText}\\n`);\n return;\n }\n\n if (err instanceof SeclaiConfigurationError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n return;\n }\n\n if (err instanceof Error) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n return;\n }\n\n rt.writeErr(String(err));\n rt.writeErr(\"\\n\");\n}\n\nasync function run(rt: CliRuntime, main: () => Promise<void>): Promise<void> {\n try {\n await main();\n } catch (err) {\n printError(rt, err);\n rt.setExitCode(1);\n }\n}\n\nexport function createProgram(rt: CliRuntime = defaultRuntime()): Command {\n const program = new Command();\n const cliVersion = getCliVersion();\n\n program\n .name(\"seclai\")\n .description(\n `Seclai Command Line Interface (v${cliVersion})\\n\\n` +\n `Use this CLI to interact with Seclai from scripts and CI: manage connected content sources, run agents, and inspect agent runs and indexed content.\\n\\n` +\n `All commands return JSON to stdout by default, which makes it easy to pipe into tools like jq.`\n )\n .version(cliVersion, \"-V, --version\", \"output the version\")\n .option(\n \"--api-key <key>\",\n \"Seclai API key (defaults to SECLAI_API_KEY). You can create/manage keys in the Seclai dashboard (Settings → API Keys).\"\n );\n\n program.addHelpText(\n \"after\",\n `\\nEnvironment:\\n` +\n ` SECLAI_API_KEY Default API key (alternative to --api-key)\\n` +\n ` SECLAI_API_URL Override API base URL (default: https://api.seclai.com). Intended for dev/staging.\\n\\n` +\n `Examples:\\n` +\n ` seclai sources list\\n` +\n ` seclai sources upload <sourceConnectionId> --file ./document.pdf --metadata '{\"category\":\"docs\"}'\\n` +\n ` seclai contents upload <sourceConnectionContentVersionId> --file ./updated.pdf\\n` +\n ` seclai agents run <agentId> --json '{\"input\":\"Hello\"}'\\n` +\n ` seclai agents run <agentId> --json-file - --stream --timeout-ms 60000 < run.json\\n`\n );\n\n program.configureOutput({\n writeOut: (str) => rt.writeOut(str),\n writeErr: (str) => rt.writeErr(str),\n });\n // Prevent commander from calling process.exit() (needed for testability)\n program.exitOverride();\n\n // sources\n const sources = program\n .command(\"sources\")\n .alias(\"source\")\n .description(\n \"Manage content sources connected to Seclai.\\n\\n\" +\n \"Sources are how Seclai ingests content (e.g., websites, RSS feeds, document uploads) into a knowledge base so agents can retrieve and cite it.\"\n );\n\nsources\n .command(\"list\")\n .description(\n \"List sources available to your organization/account.\\n\\n\" +\n \"Use this to discover source connections and their IDs before uploading documents or debugging indexing.\"\n )\n .option(\"--page <n>\", \"Page number for pagination (1-based).\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size (number of items to return).\", (v) => Number(v))\n .option(\"--sort <field>\", \"Sort field (API-defined; commonly created_at or updated_at).\")\n .option(\"--order <asc|desc>\", \"Sort direction: asc or desc.\")\n .option(\"--account-id <id>\", \"Filter results to a specific account/organization id.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.listSources({\n page: opts.page,\n limit: opts.limit,\n sort: opts.sort,\n order: opts.order,\n accountId: opts.accountId,\n });\n printJson(rt, res);\n });\n });\n\nsources\n .command(\"upload\")\n .description(\n \"Upload a local file to an existing source connection.\\n\\n\" +\n \"This is commonly used for document-upload sources inside a knowledge base. The uploaded file becomes indexed content that agents can retrieve from.\\n\\n\" +\n \"Note: file size limits and supported MIME types are defined by the Seclai API (see the API reference for the upload endpoint).\"\n )\n .argument(\n \"<sourceConnectionId>\",\n \"Source connection ID to upload into. You can find this in the Seclai dashboard or by listing sources.\"\n )\n .requiredOption(\"--file <path>\", \"Path to a local file to upload.\")\n .option(\"--title <title>\", \"Optional human-readable title to associate with the uploaded content.\")\n .option(\n \"--metadata <json>\",\n \"Optional metadata JSON object to attach to the upload (e.g. '{\\\"category\\\":\\\"docs\\\"}'). Use '-' to read JSON from stdin.\"\n )\n .option(\n \"--metadata-file <path>\",\n \"Path to a JSON file containing a metadata object. Use '-' to read JSON from stdin.\"\n )\n .option(\n \"--file-name <name>\",\n \"Override the filename sent to the API (defaults to the basename of --file). Useful when uploading from temp paths.\"\n )\n .option(\"--mime-type <type>\", \"Explicit MIME type (e.g., application/pdf, text/plain).\")\n .action(async (sourceConnectionId: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n\n const bytes = new Uint8Array(await readFile(opts.file));\n\n const uploadOpts: {\n file: Uint8Array;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n } = { file: bytes };\n if (opts.title !== undefined) uploadOpts.title = opts.title;\n if (opts.metadata !== undefined || opts.metadataFile !== undefined) {\n uploadOpts.metadata = await readJsonObjectInput(rt, { json: opts.metadata, jsonFile: opts.metadataFile });\n }\n if (opts.fileName !== undefined) uploadOpts.fileName = opts.fileName;\n if (opts.mimeType !== undefined) uploadOpts.mimeType = opts.mimeType;\n\n const res = await client.uploadFileToSource(sourceConnectionId, uploadOpts);\n printJson(rt, res);\n });\n });\n\n// agents\nconst agents = program\n .command(\"agents\")\n .description(\n \"Run agents and manage agent runs.\\n\\n\" +\n \"Agents are workflows/assistants backed by your configured knowledge base and model settings. Running an agent creates a run, which you can inspect later for status, outputs, and (optionally) step-level details.\"\n );\n\nagents\n .command(\"run\")\n .description(\n \"Run an agent by ID and print the run result as JSON.\\n\\n\" +\n \"The request body is passed through to the Seclai API as-is (see the API docs for the specific agent/run schema).\\n\\n\" +\n \"For automation, prefer --json-file and pipe input via stdin (use '-' as the path).\"\n )\n .argument(\"<agentId>\", \"Agent ID to run (from the Seclai dashboard).\")\n .option(\"--json <json>\", \"Inline JSON request body. Use '-' to read JSON from stdin.\")\n .option(\"--json-file <path>\", \"Path to a JSON file containing the request body. Use '-' to read from stdin.\")\n .option(\n \"--stream\",\n \"Wait for completion using the streaming (SSE) endpoint. The CLI prints the final result when the run is done.\"\n )\n .option(\n \"--timeout-ms <n>\",\n \"Client-side timeout (milliseconds) when using --stream. This controls how long the CLI waits; it does not change server-side execution limits.\",\n (v) => Number(v)\n )\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n\n let res: unknown;\n if (opts.stream) {\n res = await client.runStreamingAgentAndWait(\n agentId,\n body as any,\n opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : undefined\n );\n } else {\n res = await client.runAgent(agentId, body as any);\n }\n printJson(rt, res);\n });\n });\n\nconst agentRuns = agents.command(\"runs\").description(\"Manage agent runs\");\n\nagentRuns\n .command(\"list\")\n .description(\n \"List runs for a specific agent.\\n\\n\" +\n \"This is useful for monitoring recent executions, checking statuses, and obtaining run IDs for follow-up commands.\"\n )\n .argument(\"<agentId>\", \"Agent ID whose runs you want to list.\")\n .option(\"--page <n>\", \"Page number for pagination (1-based).\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size (number of runs to return).\", (v) => Number(v))\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.listAgentRuns(agentId, { page: opts.page, limit: opts.limit });\n printJson(rt, res);\n });\n });\n\nagentRuns\n .command(\"get\")\n .description(\n \"Fetch a specific agent run and print it as JSON.\\n\\n\" +\n \"Use this to inspect status, timestamps, and outputs. Optionally include step outputs for deeper debugging (may be large).\"\n )\n .argument(\"<runId>\", \"Run ID to retrieve.\")\n .option(\n \"--include-step-outputs\",\n \"Include step-level outputs when available. This may increase response size and latency.\"\n )\n .action(async (agentId: string, runId: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.getAgentRun(runId, opts.includeStepOutputs ? { includeStepOutputs: true } : undefined);\n printJson(rt, res);\n });\n });\n\nagentRuns\n .command(\"delete\")\n .description(\n \"Cancel or delete a specific agent run by ID.\\n\\n\" +\n \"If a run is still in progress, this requests cancellation. If it has already completed, behavior depends on the API (it may delete or mark the run).\"\n )\n .argument(\"<runId>\", \"Run ID to cancel/delete.\")\n .action(async (runId: string) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.deleteAgentRun(runId);\n printJson(rt, res);\n });\n });\n\n// runs (run id is globally unique)\nconst runs = program\n .command(\"runs\")\n .alias(\"agent-runs\")\n .description(\n \"Manage agent runs by run ID (globally unique).\"\n );\n\nruns\n .command(\"get\")\n .description(\n \"Fetch a specific agent run by run ID and print it as JSON.\\n\\n\" +\n \"Use --include-step-outputs to include step-level details when available (may be large).\"\n )\n .argument(\"<runId>\", \"Run ID to retrieve.\")\n .option(\n \"--include-step-outputs\",\n \"Include step-level outputs when available. This may increase response size and latency.\"\n )\n .action(async (runId: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.getAgentRun(runId, opts.includeStepOutputs ? { includeStepOutputs: true } : undefined);\n printJson(rt, res);\n });\n });\n\nruns\n .command(\"delete\")\n .description(\n \"Cancel or delete a specific agent run by run ID.\\n\\n\" +\n \"If the run is in progress, this requests cancellation. If it is completed, behavior depends on the API (it may delete or mark the run).\"\n )\n .argument(\"<runId>\", \"Run ID to cancel/delete.\")\n .action(async (runId: string) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.deleteAgentRun(runId);\n printJson(rt, res);\n });\n });\n\n// contents\nconst contents = program\n .command(\"contents\")\n .description(\n \"Inspect indexed content and embeddings.\\n\\n\" +\n \"When Seclai ingests data from sources into a knowledge base, it creates content versions and generates vector embeddings for retrieval. These commands help you debug what was indexed and what embeddings were produced.\"\n );\n\ncontents\n .command(\"upload\")\n .alias(\"replace\")\n .description(\n \"Upload a local file to replace the underlying data for an existing content version.\\n\\n\" +\n \"This calls the content replace upload endpoint (/contents/{source_connection_content_version}/upload).\\n\\n\" +\n \"Use this when you want to keep the same content version ID but update the file contents (e.g., new revision of a PDF).\"\n )\n .argument(\n \"<sourceConnectionContentVersion>\",\n \"Content version ID to replace (from Seclai dashboard or API responses).\"\n )\n .requiredOption(\"--file <path>\", \"Path to a local file to upload.\")\n .option(\"--title <title>\", \"Optional title to associate with the uploaded content.\")\n .option(\n \"--metadata <json>\",\n \"Optional metadata JSON object to attach to the upload (e.g. '{\\\"revision\\\":2}'). Use '-' to read JSON from stdin.\"\n )\n .option(\n \"--metadata-file <path>\",\n \"Path to a JSON file containing a metadata object. Use '-' to read JSON from stdin.\"\n )\n .option(\n \"--file-name <name>\",\n \"Override the filename sent to the API (defaults to the basename of --file). Useful when uploading from temp paths.\"\n )\n .option(\"--mime-type <type>\", \"Explicit MIME type (e.g., application/pdf, text/plain).\")\n .action(async (sourceConnectionContentVersion: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n\n const bytes = new Uint8Array(await readFile(opts.file));\n\n const uploadOpts: {\n file: Uint8Array;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n } = { file: bytes };\n\n if (opts.title !== undefined) uploadOpts.title = opts.title;\n if (opts.metadata !== undefined || opts.metadataFile !== undefined) {\n uploadOpts.metadata = await readJsonObjectInput(rt, { json: opts.metadata, jsonFile: opts.metadataFile });\n }\n if (opts.fileName !== undefined) uploadOpts.fileName = opts.fileName;\n if (opts.mimeType !== undefined) uploadOpts.mimeType = opts.mimeType;\n\n const res = await client.uploadFileToContent(sourceConnectionContentVersion, uploadOpts);\n printJson(rt, res);\n });\n });\n\ncontents\n .command(\"get\")\n .description(\n \"Get details for a specific content version.\\n\\n\" +\n \"This typically includes extracted text/metadata produced during indexing. Use --start/--end to fetch a slice of the text for faster inspection.\"\n )\n .argument(\n \"<sourceConnectionContentVersion>\",\n \"Content version ID to retrieve (from Seclai dashboard or API responses).\"\n )\n .option(\"--start <n>\", \"Start offset for returned text (0-based).\", (v) => Number(v))\n .option(\"--end <n>\", \"End offset for returned text (exclusive).\", (v) => Number(v))\n .action(async (sourceConnectionContentVersion: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.getContentDetail(sourceConnectionContentVersion, {\n start: opts.start,\n end: opts.end,\n });\n printJson(rt, res);\n });\n });\n\ncontents\n .command(\"delete\")\n .description(\n \"Delete a specific content version from Seclai.\\n\\n\" +\n \"Use with care: removing a content version can affect retrieval results for agents that rely on the associated knowledge base.\"\n )\n .argument(\"<sourceConnectionContentVersion>\", \"Content version ID to delete.\")\n .action(async (sourceConnectionContentVersion: string) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n await client.deleteContent(sourceConnectionContentVersion);\n printJson(rt, { ok: true });\n });\n });\n\ncontents\n .command(\"embeddings\")\n .description(\n \"List embeddings generated for a content version.\\n\\n\" +\n \"Embeddings power similarity search and retrieval for knowledge base agents. Listing them is useful for debugging indexing and verifying that content produced vectors.\"\n )\n .argument(\"<sourceConnectionContentVersion>\", \"Content version ID whose embeddings you want to list.\")\n .option(\"--page <n>\", \"Page number for pagination (1-based).\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size (number of embeddings to return).\", (v) => Number(v))\n .action(async (sourceConnectionContentVersion: string, opts) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n const res = await client.listContentEmbeddings(sourceConnectionContentVersion, {\n page: opts.page,\n limit: opts.limit,\n });\n printJson(rt, res);\n });\n });\n\n return program;\n}\n\nexport async function runCli(argv: string[], rt: CliRuntime = defaultRuntime()): Promise<number> {\n let observedExitCode = 0;\n const wrappedRt: CliRuntime = {\n ...rt,\n setExitCode: (code) => {\n observedExitCode = code;\n rt.setExitCode(code);\n },\n };\n\n const program = createProgram(wrappedRt);\n let exitCode = 0;\n\n try {\n await program.parseAsync(argv);\n } catch (err: any) {\n // commander throws a CommanderError on help/version/etc due to exitOverride()\n const maybeExitCode = typeof err?.exitCode === \"number\" ? err.exitCode : undefined;\n if (maybeExitCode !== undefined) {\n exitCode = maybeExitCode;\n } else {\n printError(wrappedRt, err);\n exitCode = 1;\n }\n }\n\n const finalExitCode = observedExitCode !== 0 ? observedExitCode : exitCode;\n wrappedRt.setExitCode(finalExitCode);\n return finalExitCode;\n}\n\n// Only run when executed as an entrypoint, not when imported (e.g. during tests).\nif (process.argv[1]) {\n // `process.argv[1]` can be a symlink (common with npm global installs).\n // Compare realpaths so the guard works reliably.\n try {\n const entryReal = realpathSync(process.argv[1]);\n const selfReal = realpathSync(fileURLToPath(import.meta.url));\n if (entryReal === selfReal) {\n await runCli(process.argv);\n }\n } catch {\n // Fall back to a URL comparison (best-effort).\n const entryHref = pathToFileURL(process.argv[1]).href;\n if (import.meta.url === entryHref) {\n await runCli(process.argv);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/helpers.ts","../src/commands/agents.ts","../src/commands/sources.ts","../src/commands/contents.ts","../src/commands/kb.ts","../src/commands/memory.ts","../src/commands/evals.ts","../src/commands/solutions.ts","../src/commands/governance.ts","../src/commands/alerts.ts","../src/commands/models.ts","../src/commands/search.ts","../src/commands/ai.ts","../src/commands/skills.ts","../src/commands/completion.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { realpathSync } from \"node:fs\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\nimport {\n type CliRuntime,\n type GlobalOptions,\n defaultRuntime,\n getCliVersion,\n printError,\n} from \"./helpers.js\";\n\nimport { register as registerAgents } from \"./commands/agents.js\";\nimport { register as registerSources } from \"./commands/sources.js\";\nimport { register as registerContents } from \"./commands/contents.js\";\nimport { register as registerKb } from \"./commands/kb.js\";\nimport { register as registerMemory } from \"./commands/memory.js\";\nimport { register as registerEvals } from \"./commands/evals.js\";\nimport { register as registerSolutions } from \"./commands/solutions.js\";\nimport { register as registerGovernance } from \"./commands/governance.js\";\nimport { register as registerAlerts } from \"./commands/alerts.js\";\nimport { register as registerModels } from \"./commands/models.js\";\nimport { register as registerSearch } from \"./commands/search.js\";\nimport { register as registerAi } from \"./commands/ai.js\";\nimport { register as registerSkills } from \"./commands/skills.js\";\nimport { register as registerCompletion } from \"./commands/completion.js\";\n\nexport type { CliRuntime, GlobalOptions };\n\n/**\n * Build the top-level Commander program with all command modules registered.\n * Pass a custom {@link CliRuntime} for testing; defaults to real process I/O.\n */\nexport function createProgram(rt: CliRuntime = defaultRuntime()): Command {\n const program = new Command();\n const cliVersion = getCliVersion();\n\n program\n .name(\"seclai\")\n .description(\n `Seclai Command Line Interface (v${cliVersion})\\n\\n` +\n `Manage agents, knowledge bases, sources, memory banks, evaluations, and more from the terminal.\\n\\n` +\n `All commands return JSON to stdout, making it easy to pipe into jq or other tools.`\n )\n .version(cliVersion, \"-V, --version\", \"output the version\")\n .option(\n \"--api-key <key>\",\n \"Seclai API key (defaults to SECLAI_API_KEY).\"\n )\n .option(\n \"--compact\",\n \"Output compact JSON (no indentation).\"\n );\n\n program.addHelpText(\n \"after\",\n `\\nEnvironment:\\n` +\n ` SECLAI_API_KEY Default API key (alternative to --api-key)\\n` +\n ` SECLAI_API_URL Override API base URL (default: https://api.seclai.com)\\n\\n` +\n `Examples:\\n` +\n ` seclai agents list\\n` +\n ` seclai agents run <agentId> --json '{\"input\":\"Hello\"}'\\n` +\n ` seclai agents run <agentId> --json '{\"input\":\"Hi\"}' --events\\n` +\n ` seclai sources list\\n` +\n ` seclai kb list\\n` +\n ` seclai search --query \"deployment guide\"\\n` +\n ` npx @seclai/cli agents list\\n`\n );\n\n program.configureOutput({\n writeOut: (str) => rt.writeOut(str),\n writeErr: (str) => rt.writeErr(str),\n });\n program.exitOverride();\n\n // Propagate global flags to runtime before any command action\n program.hook(\"preAction\", (thisCommand) => {\n const globalOpts = thisCommand.opts<GlobalOptions>();\n rt.compact = Boolean(globalOpts.compact);\n });\n\n // Register all command modules\n registerAgents(program, rt);\n registerSources(program, rt);\n registerContents(program, rt);\n registerKb(program, rt);\n registerMemory(program, rt);\n registerEvals(program, rt);\n registerSolutions(program, rt);\n registerGovernance(program, rt);\n registerAlerts(program, rt);\n registerModels(program, rt);\n registerSearch(program, rt);\n registerAi(program, rt);\n registerSkills(program, rt);\n registerCompletion(program, rt);\n\n return program;\n}\n\n/**\n * Parse `argv` and run the matching command.\n * Returns the process exit code (0 = success).\n */\nexport async function runCli(argv: string[], rt: CliRuntime = defaultRuntime()): Promise<number> {\n let observedExitCode = 0;\n const wrappedRt: CliRuntime = {\n ...rt,\n setExitCode: (code) => {\n observedExitCode = code;\n rt.setExitCode(code);\n },\n };\n\n const program = createProgram(wrappedRt);\n let exitCode = 0;\n\n try {\n await program.parseAsync(argv);\n } catch (err: any) {\n const maybeExitCode = typeof err?.exitCode === \"number\" ? err.exitCode : undefined;\n if (maybeExitCode !== undefined) {\n exitCode = maybeExitCode;\n } else {\n printError(wrappedRt, err);\n exitCode = 1;\n }\n }\n\n const finalExitCode = observedExitCode !== 0 ? observedExitCode : exitCode;\n wrappedRt.setExitCode(finalExitCode);\n return finalExitCode;\n}\n\n// Only run when executed as an entrypoint, not when imported.\nif (process.argv[1]) {\n try {\n const entryReal = realpathSync(process.argv[1]);\n const selfReal = realpathSync(fileURLToPath(import.meta.url));\n if (entryReal === selfReal) {\n await runCli(process.argv);\n }\n } catch {\n const entryHref = pathToFileURL(process.argv[1]).href;\n if (import.meta.url === entryHref) {\n await runCli(process.argv);\n }\n }\n}\n","import { Command } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\nimport process from \"node:process\";\n\nimport {\n Seclai,\n SeclaiAPIStatusError,\n SeclaiAPIValidationError,\n SeclaiConfigurationError,\n} from \"@seclai/sdk\";\n\n/** Global CLI options parsed from top-level flags (--api-key, --compact). */\nexport type GlobalOptions = {\n apiKey?: string;\n compact?: boolean;\n};\n\n/** Runtime abstraction that decouples the CLI from Node globals, enabling testability. */\nexport type CliRuntime = {\n stdin: NodeJS.ReadableStream;\n writeOut: (text: string) => void;\n writeErr: (text: string) => void;\n setExitCode: (code: number) => void;\n compact?: boolean;\n};\n\n/** Create a {@link CliRuntime} wired to process stdin/stdout/stderr. */\nexport function defaultRuntime(): CliRuntime {\n return {\n stdin: process.stdin,\n writeOut: (text) => {\n process.stdout.write(text);\n },\n writeErr: (text) => {\n process.stderr.write(text);\n },\n setExitCode: (code) => {\n process.exitCode = code;\n },\n };\n}\n\n/** Read all of stdin as a UTF-8 string. */\nexport async function readStdinText(rt: CliRuntime): Promise<string> {\n return await new Promise((resolve, reject) => {\n let data = \"\";\n rt.stdin.setEncoding(\"utf8\");\n rt.stdin.on(\"data\", (chunk: string) => (data += chunk));\n rt.stdin.on(\"end\", () => resolve(data));\n rt.stdin.on(\"error\", reject);\n });\n}\n\n/**\n * Resolve JSON input from `--json` or `--json-file` options.\n * Pass `\"-\"` as the value to read from stdin.\n * @throws If neither option is provided, or both are.\n */\nexport async function readJsonInput(\n rt: CliRuntime,\n opts: { json?: string; jsonFile?: string }\n): Promise<unknown> {\n if (opts.json !== undefined && opts.jsonFile !== undefined) {\n throw new Error(\"Provide only one of --json or --json-file\");\n }\n\n if (opts.jsonFile !== undefined) {\n const text =\n opts.jsonFile === \"-\" ? await readStdinText(rt) : await readFile(opts.jsonFile, \"utf8\");\n return JSON.parse(text);\n }\n\n if (opts.json !== undefined) {\n const text = opts.json === \"-\" ? await readStdinText(rt) : opts.json;\n return JSON.parse(text);\n }\n\n throw new Error(\"Missing JSON input. Provide --json or --json-file.\");\n}\n\n/**\n * Like {@link readJsonInput} but validates the result is a plain object.\n * @throws If the parsed value is not a JSON object.\n */\nexport async function readJsonObjectInput(\n rt: CliRuntime,\n opts: { json?: string; jsonFile?: string }\n): Promise<Record<string, unknown>> {\n const value = await readJsonInput(rt, opts);\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Expected a JSON object.\");\n }\n return value as Record<string, unknown>;\n}\n\n/** Read the CLI version from the nearest package.json. Returns `\"0.0.0\"` on failure. */\nexport function getCliVersion(): string {\n try {\n const packageJsonPath = new URL(\"../package.json\", import.meta.url);\n const raw = readFileSync(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as { version?: unknown };\n return typeof parsed.version === \"string\" ? parsed.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\n/** Create a {@link Seclai} SDK client from global CLI options and environment variables. */\nexport function createClient(opts: GlobalOptions): Seclai {\n const seclaiOpts: { apiKey?: string; baseUrl?: string } = {};\n if (opts.apiKey !== undefined) seclaiOpts.apiKey = opts.apiKey;\n\n const envUrl = process.env.SECLAI_API_URL;\n seclaiOpts.baseUrl = envUrl && envUrl.length > 0 ? envUrl : \"https://api.seclai.com\";\n\n return new Seclai(seclaiOpts);\n}\n\n/** Serialize `value` as JSON to stdout. Respects `rt.compact` for indentation. */\nexport function printJson(rt: CliRuntime, value: unknown): void {\n const indent = rt.compact ? undefined : 2;\n rt.writeOut(`${JSON.stringify(value, null, indent)}\\n`);\n}\n\n/** Print a human-readable error to stderr. Shows extra detail for SDK error types. */\nexport function printError(rt: CliRuntime, err: unknown): void {\n if (err instanceof SeclaiAPIValidationError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n rt.writeErr(`status: ${err.statusCode}\\n`);\n rt.writeErr(`url: ${err.url}\\n`);\n if (err.responseText) rt.writeErr(`response: ${err.responseText}\\n`);\n if (err.validationError) printJson(rt, { validationError: err.validationError });\n return;\n }\n\n if (err instanceof SeclaiAPIStatusError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n rt.writeErr(`status: ${err.statusCode}\\n`);\n rt.writeErr(`url: ${err.url}\\n`);\n if (err.responseText) rt.writeErr(`response: ${err.responseText}\\n`);\n return;\n }\n\n if (err instanceof SeclaiConfigurationError) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n rt.writeErr(`hint: Set the SECLAI_API_KEY environment variable or pass --api-key.\\n`);\n return;\n }\n\n if (err instanceof Error) {\n rt.writeErr(`${err.name}: ${err.message}\\n`);\n return;\n }\n\n rt.writeErr(String(err));\n rt.writeErr(\"\\n\");\n}\n\n/** Execute `main`, catching errors and routing them to {@link printError}. */\nexport async function run(rt: CliRuntime, main: () => Promise<void>): Promise<void> {\n try {\n await main();\n } catch (err) {\n printError(rt, err);\n rt.setExitCode(1);\n }\n}\n\n/** Add common pagination options to a command */\nexport function withListOptions(cmd: Command): Command {\n return cmd\n .option(\"--page <n>\", \"Page number (1-based).\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v));\n}\n\n/** Add sortable list options (page, limit, sort, order) */\nexport function withSortableListOptions(cmd: Command): Command {\n return withListOptions(cmd)\n .option(\"--sort <field>\", \"Sort field.\")\n .option(\"--order <asc|desc>\", \"Sort direction.\");\n}\n\n/** Add --json / --json-file options to a command */\nexport function withJsonInputOptions(cmd: Command): Command {\n return cmd\n .option(\"--json <json>\", \"Inline JSON body. Use '-' to read from stdin.\")\n .option(\"--json-file <path>\", \"Path to JSON file. Use '-' to read from stdin.\");\n}\n\n/** Add file upload options */\nexport function withFileUploadOptions(cmd: Command): Command {\n return cmd\n .requiredOption(\"--file <path>\", \"Path to a local file to upload.\")\n .option(\"--title <title>\", \"Optional title.\")\n .option(\"--metadata <json>\", \"Metadata JSON object. Use '-' for stdin.\")\n .option(\"--metadata-file <path>\", \"Path to metadata JSON file. Use '-' for stdin.\")\n .option(\"--file-name <name>\", \"Override filename sent to API.\")\n .option(\"--mime-type <type>\", \"Explicit MIME type.\");\n}\n\n/** Build upload opts from CLI flags */\nexport async function buildUploadOpts(\n rt: CliRuntime,\n opts: {\n file: string;\n title?: string;\n metadata?: string;\n metadataFile?: string;\n fileName?: string;\n mimeType?: string;\n }\n): Promise<{\n file: Uint8Array;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n}> {\n const bytes = new Uint8Array(await readFile(opts.file));\n const result: {\n file: Uint8Array;\n title?: string;\n metadata?: Record<string, unknown>;\n fileName?: string;\n mimeType?: string;\n } = { file: bytes };\n if (opts.title !== undefined) result.title = opts.title;\n if (opts.metadata !== undefined || opts.metadataFile !== undefined) {\n const jsonArg = opts.metadata !== undefined ? { json: opts.metadata } : {};\n const jsonFileArg = opts.metadataFile !== undefined ? { jsonFile: opts.metadataFile } : {};\n result.metadata = await readJsonObjectInput(rt, { ...jsonArg, ...jsonFileArg });\n }\n if (opts.fileName !== undefined) result.fileName = opts.fileName;\n if (opts.mimeType !== undefined) result.mimeType = opts.mimeType;\n return result;\n}\n\n/** Pick defined values from opts for list calls */\nexport function listOpts(opts: {\n page?: number;\n limit?: number;\n sort?: string;\n order?: string;\n}): Record<string, unknown> {\n const o: Record<string, unknown> = {};\n if (opts.page !== undefined) o.page = opts.page;\n if (opts.limit !== undefined) o.limit = opts.limit;\n if (opts.sort !== undefined) o.sort = opts.sort;\n if (opts.order !== undefined) o.order = opts.order;\n return o;\n}\n\n/** Signature for a command module's `register` function. */\nexport type RegisterFn = (program: Command, rt: CliRuntime) => void;\n\n/** Add --user-input / --json / --json-file options for AI assistant commands */\nexport function withAiInputOptions(cmd: Command): Command {\n return cmd\n .option(\"--user-input <text>\", \"User input text (shorthand for --json '{\\\"user_input\\\":\\\"...\\\"}')\")\n .option(\"--json <json>\", \"Full request body JSON.\")\n .option(\"--json-file <path>\", \"Request body JSON file.\");\n}\n\n/** Read AI assistant input: --user-input takes precedence, falls back to --json/--json-file */\nexport async function readAiInput(\n rt: CliRuntime,\n opts: { userInput?: string; json?: string; jsonFile?: string }\n): Promise<unknown> {\n if (opts.userInput !== undefined) {\n return { user_input: opts.userInput };\n }\n const jsonArg = opts.json !== undefined ? { json: opts.json } : {};\n const jsonFileArg = opts.jsonFile !== undefined ? { jsonFile: opts.jsonFile } : {};\n return readJsonInput(rt, { ...jsonArg, ...jsonFileArg });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport {\n run,\n createClient,\n printJson,\n readJsonInput,\n readAiInput,\n withAiInputOptions,\n listOpts,\n} from \"../helpers.js\";\n\n/** Register `agents` commands: CRUD, run (basic/stream/events/poll), runs, definition, input uploads, AI assistant. */\nexport function register(program: Command, rt: CliRuntime): void {\n const agents = program\n .command(\"agents\")\n .description(\"Manage agents, runs, definitions, and AI assistance.\");\n\n // --- CRUD ---\n\n agents\n .command(\"list\")\n .description(\"List agents.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listAgents(listOpts(opts)));\n });\n });\n\n agents\n .command(\"create\")\n .description(\"Create a new agent.\")\n .option(\"--json <json>\", \"Inline JSON body. Use '-' for stdin.\")\n .option(\"--json-file <path>\", \"JSON file path. Use '-' for stdin.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createAgent(body as any));\n });\n });\n\n agents\n .command(\"get\")\n .description(\"Get an agent by ID.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .action(async (agentId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAgent(agentId));\n });\n });\n\n agents\n .command(\"update\")\n .description(\"Update an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--json <json>\", \"Inline JSON body.\")\n .option(\"--json-file <path>\", \"JSON file path.\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateAgent(agentId, body as any));\n });\n });\n\n agents\n .command(\"delete\")\n .description(\"Delete an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .action(async (agentId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteAgent(agentId);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Run ---\n\n agents\n .command(\"run\")\n .description(\"Run an agent. Use --stream/--events/--poll for different modes.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--json <json>\", \"Inline JSON body. Use '-' for stdin.\")\n .option(\"--json-file <path>\", \"JSON file path. Use '-' for stdin.\")\n .option(\"--stream\", \"Stream and print final result when done.\")\n .option(\"--events\", \"Stream SSE events as newline-delimited JSON.\")\n .option(\"--event-filter <types>\", \"Comma-separated event types to show (with --events).\")\n .option(\"--output <mode>\", \"Output mode: 'full' prints entire event, 'data' prints only the data field, 'status' prints a one-line summary.\", \"full\")\n .option(\"--poll\", \"Poll until completion instead of streaming.\")\n .option(\"--poll-interval-ms <n>\", \"Poll interval in ms (with --poll).\", (v: string) => Number(v))\n .option(\"--timeout-ms <n>\", \"Client-side timeout in ms.\", (v: string) => Number(v))\n .option(\"--include-step-outputs\", \"Include step outputs (with --poll).\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n\n if (opts.events) {\n // Stream SSE events as NDJSON\n const filterSet = opts.eventFilter\n ? new Set(opts.eventFilter.split(\",\").map((s: string) => s.trim()))\n : undefined;\n\n const stream = client.runStreamingAgent(\n agentId,\n body as any,\n opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : undefined\n );\n\n for await (const event of stream) {\n if (filterSet && !filterSet.has((event as any).type ?? \"\")) continue;\n\n if (opts.output === \"data\") {\n rt.writeOut(JSON.stringify((event as any).data ?? event) + \"\\n\");\n } else if (opts.output === \"status\") {\n const e = event as any;\n rt.writeOut(`${e.type ?? \"event\"}: ${e.status ?? JSON.stringify(e.data ?? e)}\\n`);\n } else {\n rt.writeOut(JSON.stringify(event) + \"\\n\");\n }\n }\n return;\n }\n\n if (opts.poll) {\n const pollOpts: Record<string, unknown> = {};\n if (opts.pollIntervalMs !== undefined) pollOpts.pollIntervalMs = opts.pollIntervalMs;\n if (opts.timeoutMs !== undefined) pollOpts.timeoutMs = opts.timeoutMs;\n if (opts.includeStepOutputs) pollOpts.includeStepOutputs = true;\n printJson(rt, await client.runAgentAndPoll(agentId, body as any, pollOpts as any));\n return;\n }\n\n if (opts.stream) {\n printJson(\n rt,\n await client.runStreamingAgentAndWait(\n agentId,\n body as any,\n opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : undefined\n )\n );\n return;\n }\n\n printJson(rt, await client.runAgent(agentId, body as any));\n });\n });\n\n // --- Runs ---\n\n const runs = agents.command(\"runs\").description(\"Manage agent runs.\");\n\n runs\n .command(\"list\")\n .description(\"List runs for an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--status <status>\", \"Filter by run status (e.g. queued, running, completed, failed, cancelled).\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const o: Record<string, unknown> = listOpts(opts);\n if (opts.status) o.status = opts.status;\n printJson(rt, await client.listAgentRuns(agentId, o));\n });\n });\n\n runs\n .command(\"get\")\n .description(\"Get a specific run.\")\n .argument(\"<runId>\", \"Run ID.\")\n .option(\"--include-step-outputs\", \"Include step-level outputs.\")\n .action(async (runId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(\n rt,\n await client.getAgentRun(runId, opts.includeStepOutputs ? { includeStepOutputs: true } : undefined)\n );\n });\n });\n\n runs\n .command(\"delete\")\n .description(\"Delete a run.\")\n .argument(\"<runId>\", \"Run ID.\")\n .action(async (runId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteAgentRun(runId);\n printJson(rt, { ok: true });\n });\n });\n\n runs\n .command(\"cancel\")\n .description(\"Cancel a running agent run.\")\n .argument(\"<runId>\", \"Run ID.\")\n .action(async (runId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.cancelAgentRun(runId));\n });\n });\n\n runs\n .command(\"search\")\n .description(\"Search agent runs.\")\n .option(\"--json <json>\", \"Search body JSON.\")\n .option(\"--json-file <path>\", \"Search body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.searchAgentRuns(body as any));\n });\n });\n\n // --- Definition ---\n\n const def = agents.command(\"def\").description(\"Agent definition (step workflow).\");\n\n def\n .command(\"get\")\n .description(\"Get agent definition.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .action(async (agentId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAgentDefinition(agentId));\n });\n });\n\n def\n .command(\"update\")\n .description(\"Update agent definition.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--json <json>\", \"Definition JSON body.\")\n .option(\"--json-file <path>\", \"Definition JSON file.\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateAgentDefinition(agentId, body as any));\n });\n });\n\n // --- Input uploads ---\n\n agents\n .command(\"upload-input\")\n .description(\"Upload a file as agent input.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .requiredOption(\"--file <path>\", \"File to upload.\")\n .option(\"--file-name <name>\", \"Override filename.\")\n .option(\"--mime-type <type>\", \"MIME type.\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const { readFile } = await import(\"node:fs/promises\");\n const bytes = new Uint8Array(await readFile(opts.file));\n const o: Record<string, unknown> = { file: bytes };\n if (opts.fileName) o.fileName = opts.fileName;\n if (opts.mimeType) o.mimeType = opts.mimeType;\n printJson(rt, await client.uploadAgentInput(agentId, o as any));\n });\n });\n\n agents\n .command(\"input-status\")\n .description(\"Check agent input upload status.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .argument(\"<uploadId>\", \"Upload ID.\")\n .action(async (agentId: string, uploadId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAgentInputUploadStatus(agentId, uploadId));\n });\n });\n\n // --- AI Assistant ---\n\n const ai = agents.command(\"ai\").description(\"Agent AI assistant.\");\n\n withAiInputOptions(\n ai.command(\"gen-steps\")\n .description(\"Generate agent steps via AI.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n ).action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateAgentSteps(agentId, body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"step-config\")\n .description(\"Generate step config via AI.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n ).action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateStepConfig(agentId, body as any));\n });\n });\n\n ai.command(\"history\")\n .description(\"Get agent AI conversation history.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .action(async (agentId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAgentAiConversationHistory(agentId));\n });\n });\n\n ai.command(\"mark\")\n .description(\"Mark an AI suggestion (accept/reject).\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Mark body JSON.\")\n .option(\"--json-file <path>\", \"Mark body JSON file.\")\n .action(async (agentId: string, conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n await client.markAgentAiSuggestion(agentId, conversationId, body as any);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Run eval results (under runs) ---\n\n runs\n .command(\"eval-results\")\n .description(\"List evaluation results for a run.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .argument(\"<runId>\", \"Run ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (agentId: string, runId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listRunEvaluationResults(agentId, runId, listOpts(opts)));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport {\n run,\n createClient,\n printJson,\n readJsonInput,\n buildUploadOpts,\n withFileUploadOptions,\n listOpts,\n} from \"../helpers.js\";\n\n/** Register `sources` commands: CRUD, file/text upload, exports, embedding migration. */\nexport function register(program: Command, rt: CliRuntime): void {\n const sources = program\n .command(\"sources\")\n .alias(\"source\")\n .description(\"Manage content sources.\");\n\n // --- CRUD ---\n\n sources\n .command(\"list\")\n .description(\"List sources.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--sort <field>\", \"Sort field.\")\n .option(\"--order <asc|desc>\", \"Sort direction.\")\n .option(\"--account-id <id>\", \"Filter by account ID.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const o: Record<string, unknown> = listOpts(opts);\n if (opts.accountId) o.accountId = opts.accountId;\n printJson(rt, await client.listSources(o));\n });\n });\n\n sources\n .command(\"create\")\n .description(\"Create a source.\")\n .option(\"--json <json>\", \"Source body JSON.\")\n .option(\"--json-file <path>\", \"Source body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createSource(body as any));\n });\n });\n\n sources\n .command(\"get\")\n .description(\"Get a source by ID.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .action(async (sourceId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getSource(sourceId));\n });\n });\n\n sources\n .command(\"update\")\n .description(\"Update a source.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateSource(sourceId, body as any));\n });\n });\n\n sources\n .command(\"delete\")\n .description(\"Delete a source.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .action(async (sourceId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteSource(sourceId);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Upload ---\n\n const uploadCmd = sources.command(\"upload\").description(\"Upload a file to a source.\");\n withFileUploadOptions(uploadCmd)\n .argument(\"<sourceId>\", \"Source ID.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const uploadOpts = await buildUploadOpts(rt, opts);\n printJson(rt, await client.uploadFileToSource(sourceId, uploadOpts));\n });\n });\n\n sources\n .command(\"upload-text\")\n .description(\"Upload inline text to a source.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--json <json>\", \"Inline text body JSON.\")\n .option(\"--json-file <path>\", \"Inline text body JSON file.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.uploadInlineTextToSource(sourceId, body as any));\n });\n });\n\n // --- Exports ---\n\n const exports_ = sources.command(\"exports\").description(\"Manage source exports.\");\n\n exports_\n .command(\"list\")\n .description(\"List exports for a source.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listSourceExports(sourceId, listOpts(opts)));\n });\n });\n\n exports_\n .command(\"create\")\n .description(\"Create an export.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--json <json>\", \"Export body JSON.\")\n .option(\"--json-file <path>\", \"Export body JSON file.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createSourceExport(sourceId, body as any));\n });\n });\n\n exports_\n .command(\"get\")\n .description(\"Get an export.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .argument(\"<exportId>\", \"Export ID.\")\n .action(async (sourceId: string, exportId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getSourceExport(sourceId, exportId));\n });\n });\n\n exports_\n .command(\"cancel\")\n .description(\"Cancel an export.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .argument(\"<exportId>\", \"Export ID.\")\n .action(async (sourceId: string, exportId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.cancelSourceExport(sourceId, exportId));\n });\n });\n\n exports_\n .command(\"delete\")\n .description(\"Delete an export.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .argument(\"<exportId>\", \"Export ID.\")\n .action(async (sourceId: string, exportId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteSourceExport(sourceId, exportId);\n printJson(rt, { ok: true });\n });\n });\n\n exports_\n .command(\"download\")\n .description(\"Download an export (prints raw response body).\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .argument(\"<exportId>\", \"Export ID.\")\n .action(async (sourceId: string, exportId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const res = await client.downloadSourceExport(sourceId, exportId);\n rt.writeOut(await res.text());\n });\n });\n\n exports_\n .command(\"estimate\")\n .description(\"Estimate an export.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--json <json>\", \"Estimate body JSON.\")\n .option(\"--json-file <path>\", \"Estimate body JSON file.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.estimateSourceExport(sourceId, body as any));\n });\n });\n\n // --- Embedding Migration ---\n\n const migration = sources.command(\"migration\").description(\"Source embedding migrations.\");\n\n migration\n .command(\"get\")\n .description(\"Get migration status.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .action(async (sourceId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getSourceEmbeddingMigration(sourceId));\n });\n });\n\n migration\n .command(\"start\")\n .description(\"Start an embedding migration.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .option(\"--json <json>\", \"Migration config JSON.\")\n .option(\"--json-file <path>\", \"Migration config JSON file.\")\n .action(async (sourceId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.startSourceEmbeddingMigration(sourceId, body as any));\n });\n });\n\n migration\n .command(\"cancel\")\n .description(\"Cancel an embedding migration.\")\n .argument(\"<sourceId>\", \"Source ID.\")\n .action(async (sourceId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.cancelSourceEmbeddingMigration(sourceId));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport {\n run,\n createClient,\n printJson,\n readJsonInput,\n buildUploadOpts,\n withFileUploadOptions,\n listOpts,\n} from \"../helpers.js\";\n\n/** Register `contents` commands: get, delete, upload/replace, replace-text, embeddings. */\nexport function register(program: Command, rt: CliRuntime): void {\n const contents = program\n .command(\"contents\")\n .description(\"Manage indexed content and embeddings.\");\n\n contents\n .command(\"get\")\n .description(\"Get content version details.\")\n .argument(\"<contentVersionId>\", \"Content version ID.\")\n .option(\"--start <n>\", \"Text start offset (0-based).\", (v: string) => Number(v))\n .option(\"--end <n>\", \"Text end offset (exclusive).\", (v: string) => Number(v))\n .action(async (contentVersionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const o: Record<string, unknown> = {};\n if (opts.start !== undefined) o.start = opts.start;\n if (opts.end !== undefined) o.end = opts.end;\n printJson(rt, await client.getContentDetail(contentVersionId, o));\n });\n });\n\n contents\n .command(\"delete\")\n .description(\"Delete a content version.\")\n .argument(\"<contentVersionId>\", \"Content version ID.\")\n .action(async (contentVersionId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteContent(contentVersionId);\n printJson(rt, { ok: true });\n });\n });\n\n const uploadCmd = contents.command(\"upload\").alias(\"replace\").description(\"Upload/replace content file.\");\n withFileUploadOptions(uploadCmd)\n .argument(\"<contentVersionId>\", \"Content version ID.\")\n .action(async (contentVersionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const uploadOpts = await buildUploadOpts(rt, opts);\n printJson(rt, await client.uploadFileToContent(contentVersionId, uploadOpts));\n });\n });\n\n contents\n .command(\"replace-text\")\n .description(\"Replace content with inline text.\")\n .argument(\"<contentVersionId>\", \"Content version ID.\")\n .option(\"--json <json>\", \"Inline text body JSON.\")\n .option(\"--json-file <path>\", \"Inline text body JSON file.\")\n .action(async (contentVersionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.replaceContentWithInlineText(contentVersionId, body as any));\n });\n });\n\n contents\n .command(\"embeddings\")\n .description(\"List embeddings for a content version.\")\n .argument(\"<contentVersionId>\", \"Content version ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (contentVersionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listContentEmbeddings(contentVersionId, listOpts(opts)));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, listOpts } from \"../helpers.js\";\n\n/** Register `kb` (knowledge base) commands: list, create, get, update, delete. */\nexport function register(program: Command, rt: CliRuntime): void {\n const kb = program.command(\"kb\").description(\"Manage knowledge bases.\");\n\n kb.command(\"list\")\n .description(\"List knowledge bases.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--sort <field>\", \"Sort field.\")\n .option(\"--order <asc|desc>\", \"Sort direction.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listKnowledgeBases(listOpts(opts)));\n });\n });\n\n kb.command(\"create\")\n .description(\"Create a knowledge base.\")\n .option(\"--json <json>\", \"Body JSON.\")\n .option(\"--json-file <path>\", \"Body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createKnowledgeBase(body as any));\n });\n });\n\n kb.command(\"get\")\n .description(\"Get a knowledge base.\")\n .argument(\"<kbId>\", \"Knowledge base ID.\")\n .action(async (kbId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getKnowledgeBase(kbId));\n });\n });\n\n kb.command(\"update\")\n .description(\"Update a knowledge base.\")\n .argument(\"<kbId>\", \"Knowledge base ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (kbId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateKnowledgeBase(kbId, body as any));\n });\n });\n\n kb.command(\"delete\")\n .description(\"Delete a knowledge base.\")\n .argument(\"<kbId>\", \"Knowledge base ID.\")\n .action(async (kbId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteKnowledgeBase(kbId);\n printJson(rt, { ok: true });\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, readAiInput, withAiInputOptions, readJsonObjectInput, listOpts } from \"../helpers.js\";\n\n/** Register `memory` commands: CRUD, stats, utilities, test-compaction, AI assistant. */\nexport function register(program: Command, rt: CliRuntime): void {\n const memory = program.command(\"memory\").description(\"Manage memory banks.\");\n\n // --- CRUD ---\n\n memory\n .command(\"list\")\n .description(\"List memory banks.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--sort <field>\", \"Sort field.\")\n .option(\"--order <asc|desc>\", \"Sort direction.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listMemoryBanks(listOpts(opts)));\n });\n });\n\n memory\n .command(\"create\")\n .description(\"Create a memory bank.\")\n .option(\"--json <json>\", \"Body JSON.\")\n .option(\"--json-file <path>\", \"Body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createMemoryBank(body as any));\n });\n });\n\n memory\n .command(\"get\")\n .description(\"Get a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getMemoryBank(memoryBankId));\n });\n });\n\n memory\n .command(\"update\")\n .description(\"Update a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (memoryBankId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateMemoryBank(memoryBankId, body as any));\n });\n });\n\n memory\n .command(\"delete\")\n .description(\"Delete a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteMemoryBank(memoryBankId);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Stats & utilities ---\n\n memory\n .command(\"stats\")\n .description(\"Get memory bank statistics.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getMemoryBankStats(memoryBankId));\n });\n });\n\n memory\n .command(\"agents\")\n .description(\"List agents using a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAgentsUsingMemoryBank(memoryBankId));\n });\n });\n\n memory\n .command(\"compact\")\n .description(\"Compact a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.compactMemoryBank(memoryBankId);\n printJson(rt, { ok: true });\n });\n });\n\n memory\n .command(\"delete-source\")\n .description(\"Delete a memory bank's source data.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .action(async (memoryBankId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteMemoryBankSource(memoryBankId);\n printJson(rt, { ok: true });\n });\n });\n\n memory\n .command(\"templates\")\n .description(\"List memory bank templates.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listMemoryBankTemplates());\n });\n });\n\n memory\n .command(\"test-compaction\")\n .description(\"Test compaction on a memory bank.\")\n .argument(\"<memoryBankId>\", \"Memory bank ID.\")\n .option(\"--json <json>\", \"Test config JSON.\")\n .option(\"--json-file <path>\", \"Test config JSON file.\")\n .action(async (memoryBankId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.testMemoryBankCompaction(memoryBankId, body as any));\n });\n });\n\n memory\n .command(\"test-compaction-standalone\")\n .description(\"Test compaction prompt standalone (no memory bank required).\")\n .option(\"--json <json>\", \"Test config JSON.\")\n .option(\"--json-file <path>\", \"Test config JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.testCompactionPromptStandalone(body as any));\n });\n });\n\n // --- AI ---\n\n const ai = memory.command(\"ai\").description(\"Memory bank AI assistant.\");\n\n withAiInputOptions(\n ai.command(\"generate\")\n .description(\"Generate memory bank config via AI.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateMemoryBankConfig(body as any));\n });\n });\n\n ai.command(\"last\")\n .description(\"Get last memory bank AI conversation.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getMemoryBankAiLastConversation());\n });\n });\n\n ai.command(\"accept\")\n .description(\"Accept a memory bank AI suggestion.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Accept body JSON.\")\n .option(\"--json-file <path>\", \"Accept body JSON file.\")\n .action(async (conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.acceptMemoryBankAiSuggestion(conversationId, body as any));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, listOpts } from \"../helpers.js\";\n\n/** Register `evals` commands: criteria CRUD, results, compatible-runs, test-draft, agent-level summaries. */\nexport function register(program: Command, rt: CliRuntime): void {\n const evals = program.command(\"evals\").description(\"Manage evaluations.\");\n\n // --- Criteria ---\n\n const criteria = evals.command(\"criteria\").description(\"Evaluation criteria.\");\n\n criteria\n .command(\"list\")\n .description(\"List evaluation criteria for an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listEvaluationCriteria(agentId, listOpts(opts)));\n });\n });\n\n criteria\n .command(\"create\")\n .description(\"Create evaluation criteria.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--json <json>\", \"Criteria body JSON.\")\n .option(\"--json-file <path>\", \"Criteria body JSON file.\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createEvaluationCriteria(agentId, body as any));\n });\n });\n\n criteria\n .command(\"get\")\n .description(\"Get evaluation criteria.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .action(async (criteriaId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getEvaluationCriteria(criteriaId));\n });\n });\n\n criteria\n .command(\"update\")\n .description(\"Update evaluation criteria.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (criteriaId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateEvaluationCriteria(criteriaId, body as any));\n });\n });\n\n criteria\n .command(\"delete\")\n .description(\"Delete evaluation criteria.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .action(async (criteriaId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteEvaluationCriteria(criteriaId);\n printJson(rt, { ok: true });\n });\n });\n\n criteria\n .command(\"summary\")\n .description(\"Get criteria evaluation summary.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .action(async (criteriaId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getEvaluationCriteriaSummary(criteriaId));\n });\n });\n\n // --- Results ---\n\n const results = evals.command(\"results\").description(\"Evaluation results.\");\n\n results\n .command(\"list\")\n .description(\"List results for criteria.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (criteriaId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listEvaluationResults(criteriaId, listOpts(opts)));\n });\n });\n\n results\n .command(\"create\")\n .description(\"Create an evaluation result.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .option(\"--json <json>\", \"Result body JSON.\")\n .option(\"--json-file <path>\", \"Result body JSON file.\")\n .action(async (criteriaId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createEvaluationResult(criteriaId, body as any));\n });\n });\n\n // --- Misc ---\n\n evals\n .command(\"compatible-runs\")\n .description(\"List runs compatible with criteria.\")\n .argument(\"<criteriaId>\", \"Criteria ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (criteriaId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listCompatibleRuns(criteriaId, listOpts(opts)));\n });\n });\n\n evals\n .command(\"test-draft\")\n .description(\"Test a draft evaluation.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--json <json>\", \"Test body JSON.\")\n .option(\"--json-file <path>\", \"Test body JSON file.\")\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.testDraftEvaluation(agentId, body as any));\n });\n });\n\n evals\n .command(\"agent-results\")\n .description(\"List all evaluation results for an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listAgentEvaluationResults(agentId, listOpts(opts)));\n });\n });\n\n evals\n .command(\"agent-runs\")\n .description(\"List evaluation run summaries for an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (agentId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listEvaluationRuns(agentId, listOpts(opts)));\n });\n });\n\n evals\n .command(\"non-manual-summary\")\n .description(\"Get non-manual evaluation summary for an agent.\")\n .argument(\"<agentId>\", \"Agent ID.\")\n .action(async (agentId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getNonManualEvaluationSummary(agentId));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, readAiInput, withAiInputOptions, listOpts } from \"../helpers.js\";\n\n/** Register `solutions` commands: CRUD, link/unlink, conversations, AI assistant. */\nexport function register(program: Command, rt: CliRuntime): void {\n const solutions = program.command(\"solutions\").description(\"Manage solutions.\");\n\n // --- CRUD ---\n\n solutions\n .command(\"list\")\n .description(\"List solutions.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--sort <field>\", \"Sort field.\")\n .option(\"--order <asc|desc>\", \"Sort direction.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listSolutions(listOpts(opts)));\n });\n });\n\n solutions\n .command(\"create\")\n .description(\"Create a solution.\")\n .option(\"--json <json>\", \"Body JSON.\")\n .option(\"--json-file <path>\", \"Body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createSolution(body as any));\n });\n });\n\n solutions\n .command(\"get\")\n .description(\"Get a solution.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .action(async (solutionId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getSolution(solutionId));\n });\n });\n\n solutions\n .command(\"update\")\n .description(\"Update a solution.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateSolution(solutionId, body as any));\n });\n });\n\n solutions\n .command(\"delete\")\n .description(\"Delete a solution.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .action(async (solutionId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteSolution(solutionId);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Link / Unlink ---\n\n solutions\n .command(\"link\")\n .description(\"Link resources to a solution. Use --agents, --kb, or --sources with JSON array of IDs.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .option(\"--agents <json>\", \"Link agents (JSON body).\")\n .option(\"--kb <json>\", \"Link knowledge bases (JSON body).\")\n .option(\"--sources <json>\", \"Link sources (JSON body).\")\n .action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n if (!opts.agents && !opts.kb && !opts.sources) {\n rt.writeErr(\"Provide at least one of --agents, --kb, or --sources.\\n\");\n rt.setExitCode(1);\n return;\n }\n const client = createClient(program.opts<GlobalOptions>());\n const results: Record<string, unknown> = {};\n if (opts.agents) {\n results.agents = await client.linkAgentsToSolution(solutionId, JSON.parse(opts.agents));\n }\n if (opts.kb) {\n results.knowledgeBases = await client.linkKnowledgeBasesToSolution(solutionId, JSON.parse(opts.kb));\n }\n if (opts.sources) {\n results.sources = await client.linkSourceConnectionsToSolution(solutionId, JSON.parse(opts.sources));\n }\n printJson(rt, results);\n });\n });\n\n solutions\n .command(\"unlink\")\n .description(\"Unlink resources from a solution. Use --agents, --kb, or --sources with JSON array of IDs.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .option(\"--agents <json>\", \"Unlink agents (JSON body).\")\n .option(\"--kb <json>\", \"Unlink knowledge bases (JSON body).\")\n .option(\"--sources <json>\", \"Unlink sources (JSON body).\")\n .action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n if (!opts.agents && !opts.kb && !opts.sources) {\n rt.writeErr(\"Provide at least one of --agents, --kb, or --sources.\\n\");\n rt.setExitCode(1);\n return;\n }\n const client = createClient(program.opts<GlobalOptions>());\n const results: Record<string, unknown> = {};\n if (opts.agents) {\n results.agents = await client.unlinkAgentsFromSolution(solutionId, JSON.parse(opts.agents));\n }\n if (opts.kb) {\n results.knowledgeBases = await client.unlinkKnowledgeBasesFromSolution(solutionId, JSON.parse(opts.kb));\n }\n if (opts.sources) {\n results.sources = await client.unlinkSourceConnectionsFromSolution(solutionId, JSON.parse(opts.sources));\n }\n printJson(rt, results);\n });\n });\n\n // --- Conversations ---\n\n const convos = solutions.command(\"convos\").description(\"Solution conversations.\");\n\n convos\n .command(\"list\")\n .description(\"List conversations for a solution.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .action(async (solutionId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listSolutionConversations(solutionId));\n });\n });\n\n convos\n .command(\"add\")\n .description(\"Add a conversation turn.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .option(\"--json <json>\", \"Turn body JSON.\")\n .option(\"--json-file <path>\", \"Turn body JSON file.\")\n .action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.addSolutionConversationTurn(solutionId, body as any));\n });\n });\n\n convos\n .command(\"mark\")\n .description(\"Mark a conversation turn.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Mark body JSON.\")\n .option(\"--json-file <path>\", \"Mark body JSON file.\")\n .action(async (solutionId: string, conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n await client.markSolutionConversationTurn(solutionId, conversationId, body as any);\n printJson(rt, { ok: true });\n });\n });\n\n // --- AI ---\n\n const ai = solutions.command(\"ai\").description(\"Solution AI assistant.\");\n\n withAiInputOptions(\n ai.command(\"generate\")\n .description(\"Generate a solution AI plan.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n ).action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateSolutionAiPlan(solutionId, body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"kb\")\n .description(\"Generate a KB plan via solution AI.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n ).action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateSolutionAiKnowledgeBase(solutionId, body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"source\")\n .description(\"Generate a source plan via solution AI.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n ).action(async (solutionId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateSolutionAiSource(solutionId, body as any));\n });\n });\n\n ai.command(\"accept\")\n .description(\"Accept a solution AI plan.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Accept body JSON.\")\n .option(\"--json-file <path>\", \"Accept body JSON file.\")\n .action(async (solutionId: string, conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.acceptSolutionAiPlan(solutionId, conversationId, body as any));\n });\n });\n\n ai.command(\"decline\")\n .description(\"Decline a solution AI plan.\")\n .argument(\"<solutionId>\", \"Solution ID.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .action(async (solutionId: string, conversationId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.declineSolutionAiPlan(solutionId, conversationId);\n printJson(rt, { ok: true });\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readAiInput, withAiInputOptions } from \"../helpers.js\";\n\n/** Register `governance` commands: AI-assisted generate, list, accept, decline. */\nexport function register(program: Command, rt: CliRuntime): void {\n const governance = program.command(\"governance\").description(\"Governance AI assistant.\");\n\n const ai = governance.command(\"ai\").description(\"Governance AI operations.\");\n\n withAiInputOptions(\n ai.command(\"generate\")\n .description(\"Generate a governance AI plan.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.generateGovernanceAiPlan(body as any));\n });\n });\n\n ai.command(\"list\")\n .description(\"List governance AI conversations.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listGovernanceAiConversations());\n });\n });\n\n ai.command(\"accept\")\n .description(\"Accept a governance AI plan.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .action(async (conversationId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.acceptGovernanceAiPlan(conversationId));\n });\n });\n\n ai.command(\"decline\")\n .description(\"Decline a governance AI plan.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .action(async (conversationId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.declineGovernanceAiPlan(conversationId);\n printJson(rt, { ok: true });\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, listOpts } from \"../helpers.js\";\n\n/** Register `alerts` commands: alert CRUD, configs, organization preferences. */\nexport function register(program: Command, rt: CliRuntime): void {\n const alerts = program.command(\"alerts\").description(\"Manage alerts and alert configurations.\");\n\n // --- Alert CRUD ---\n\n alerts\n .command(\"list\")\n .description(\"List alerts.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .option(\"--status <status>\", \"Filter by status.\")\n .option(\"--severity <severity>\", \"Filter by severity.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const o: Record<string, unknown> = listOpts(opts);\n if (opts.status) o.status = opts.status;\n if (opts.severity) o.severity = opts.severity;\n printJson(rt, await client.listAlerts(o));\n });\n });\n\n alerts\n .command(\"get\")\n .description(\"Get an alert.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .action(async (alertId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAlert(alertId));\n });\n });\n\n alerts\n .command(\"status\")\n .description(\"Change alert status.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .option(\"--json <json>\", \"Status body JSON.\")\n .option(\"--json-file <path>\", \"Status body JSON file.\")\n .action(async (alertId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.changeAlertStatus(alertId, body as any));\n });\n });\n\n alerts\n .command(\"comment\")\n .description(\"Add a comment to an alert.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .option(\"--json <json>\", \"Comment body JSON.\")\n .option(\"--json-file <path>\", \"Comment body JSON file.\")\n .action(async (alertId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.addAlertComment(alertId, body as any));\n });\n });\n\n alerts\n .command(\"subscribe\")\n .description(\"Subscribe to an alert.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .action(async (alertId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.subscribeToAlert(alertId));\n });\n });\n\n alerts\n .command(\"unsubscribe\")\n .description(\"Unsubscribe from an alert.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .action(async (alertId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.unsubscribeFromAlert(alertId));\n });\n });\n\n // --- Alert Configs ---\n\n const configs = alerts.command(\"configs\").description(\"Alert configurations.\");\n\n configs\n .command(\"list\")\n .description(\"List alert configurations.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listAlertConfigs(listOpts(opts)));\n });\n });\n\n configs\n .command(\"create\")\n .description(\"Create an alert configuration.\")\n .option(\"--json <json>\", \"Config body JSON.\")\n .option(\"--json-file <path>\", \"Config body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.createAlertConfig(body as any));\n });\n });\n\n configs\n .command(\"get\")\n .description(\"Get an alert configuration.\")\n .argument(\"<configId>\", \"Config ID.\")\n .action(async (configId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAlertConfig(configId));\n });\n });\n\n configs\n .command(\"update\")\n .description(\"Update an alert configuration.\")\n .argument(\"<configId>\", \"Config ID.\")\n .option(\"--json <json>\", \"Update body JSON.\")\n .option(\"--json-file <path>\", \"Update body JSON file.\")\n .action(async (configId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateAlertConfig(configId, body as any));\n });\n });\n\n configs\n .command(\"delete\")\n .description(\"Delete an alert configuration.\")\n .argument(\"<configId>\", \"Config ID.\")\n .action(async (configId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.deleteAlertConfig(configId);\n printJson(rt, { ok: true });\n });\n });\n\n // --- Organization Alert Preferences ---\n\n const prefs = alerts.command(\"prefs\").description(\"Organization alert preferences.\");\n\n prefs\n .command(\"list\")\n .description(\"List organization alert preferences.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listOrganizationAlertPreferences());\n });\n });\n\n prefs\n .command(\"update\")\n .description(\"Update an organization alert preference.\")\n .argument(\"<organizationId>\", \"Organization ID.\")\n .argument(\"<alertType>\", \"Alert type.\")\n .option(\"--json <json>\", \"Preference body JSON.\")\n .option(\"--json-file <path>\", \"Preference body JSON file.\")\n .action(async (organizationId: string, alertType: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.updateOrganizationAlertPreference(organizationId, alertType, body as any));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, listOpts } from \"../helpers.js\";\n\n/** Register `models` commands: model alerts (list, mark-read, unread-count), recommendations. */\nexport function register(program: Command, rt: CliRuntime): void {\n const models = program.command(\"models\").description(\"Model alerts and recommendations.\");\n\n const alerts = models.command(\"alerts\").description(\"Model alerts.\");\n\n alerts\n .command(\"list\")\n .description(\"List model alerts.\")\n .option(\"--page <n>\", \"Page number.\", (v: string) => Number(v))\n .option(\"--limit <n>\", \"Page size.\", (v: string) => Number(v))\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.listModelAlerts(listOpts(opts)));\n });\n });\n\n alerts\n .command(\"mark-read\")\n .description(\"Mark a model alert as read.\")\n .argument(\"<alertId>\", \"Alert ID.\")\n .action(async (alertId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.markModelAlertRead(alertId);\n printJson(rt, { ok: true });\n });\n });\n\n alerts\n .command(\"mark-all-read\")\n .description(\"Mark all model alerts as read.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.markAllModelAlertsRead();\n printJson(rt, { ok: true });\n });\n });\n\n alerts\n .command(\"unread-count\")\n .description(\"Get unread model alert count.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getUnreadModelAlertCount());\n });\n });\n\n models\n .command(\"recommendations\")\n .description(\"Get model recommendations.\")\n .argument(\"<modelId>\", \"Model ID.\")\n .action(async (modelId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getModelRecommendations(modelId));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson } from \"../helpers.js\";\n\n/** Register the `search` command for querying across Seclai resources. */\nexport function register(program: Command, rt: CliRuntime): void {\n program\n .command(\"search\")\n .description(\"Search across Seclai resources.\")\n .requiredOption(\"--query <text>\", \"Search query text.\")\n .option(\"--limit <n>\", \"Max results.\", (v: string) => Number(v))\n .option(\"--entity-type <type>\", \"Filter by entity type (e.g. agent, source, knowledge_base, memory_bank).\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const o: Record<string, unknown> = { query: opts.query };\n if (opts.limit !== undefined) o.limit = opts.limit;\n if (opts.entityType) o.entityType = opts.entityType;\n printJson(rt, await client.search(o as any));\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime, GlobalOptions } from \"../helpers.js\";\nimport { run, createClient, printJson, readJsonInput, readAiInput, withAiInputOptions } from \"../helpers.js\";\n\n/** Register top-level `ai` commands: feedback, domain assistants (kb/source/solution/memory), accept/decline. */\nexport function register(program: Command, rt: CliRuntime): void {\n const ai = program.command(\"ai\").description(\"Top-level AI assistant.\");\n\n ai.command(\"feedback\")\n .description(\"Submit AI feedback.\")\n .option(\"--json <json>\", \"Feedback body JSON.\")\n .option(\"--json-file <path>\", \"Feedback body JSON file.\")\n .action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.submitAiFeedback(body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"kb\")\n .description(\"AI assistant for knowledge bases.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.aiAssistantKnowledgeBase(body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"source\")\n .description(\"AI assistant for sources.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.aiAssistantSource(body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"solution\")\n .description(\"AI assistant for solutions.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.aiAssistantSolution(body as any));\n });\n });\n\n withAiInputOptions(\n ai.command(\"memory\")\n .description(\"AI assistant for memory banks.\")\n ).action(async (opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readAiInput(rt, opts);\n printJson(rt, await client.aiAssistantMemoryBank(body as any));\n });\n });\n\n ai.command(\"memory-history\")\n .description(\"Get AI assistant memory bank conversation history.\")\n .action(async () => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n printJson(rt, await client.getAiAssistantMemoryBankHistory());\n });\n });\n\n ai.command(\"accept\")\n .description(\"Accept an AI assistant plan.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Accept body JSON.\")\n .option(\"--json-file <path>\", \"Accept body JSON file.\")\n .action(async (conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.acceptAiAssistantPlan(conversationId, body as any));\n });\n });\n\n ai.command(\"decline\")\n .description(\"Decline an AI assistant plan.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .action(async (conversationId: string) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n await client.declineAiAssistantPlan(conversationId);\n printJson(rt, { ok: true });\n });\n });\n\n ai.command(\"memory-accept\")\n .description(\"Accept an AI memory bank suggestion.\")\n .argument(\"<conversationId>\", \"Conversation ID.\")\n .option(\"--json <json>\", \"Accept body JSON.\")\n .option(\"--json-file <path>\", \"Accept body JSON file.\")\n .action(async (conversationId: string, opts) => {\n await run(rt, async () => {\n const client = createClient(program.opts<GlobalOptions>());\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n printJson(rt, await client.acceptAiMemoryBankSuggestion(conversationId, body as any));\n });\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { CliRuntime } from \"../helpers.js\";\nimport { run, printJson } from \"../helpers.js\";\n\n// --- Skill content ---\n\nconst SKILL_MD = `---\nname: seclai-cli\ndescription: >-\n Manage Seclai agents, knowledge bases, sources, memory banks, evaluations,\n solutions, governance, alerts, and more via the CLI. Use when working with\n the Seclai platform or when the user mentions Seclai CLI commands.\n---\n\n# Seclai CLI\n\nThe Seclai CLI (\\`seclai\\` / \\`npx @seclai/cli\\`) manages agents, knowledge bases, sources, memory banks, evaluations, solutions, governance, alerts, and more from the terminal.\n\nAll commands output JSON to stdout. Pipe into \\`jq\\` for filtering.\n\n## Authentication\n\nSet \\`SECLAI_API_KEY\\` env var or pass \\`--api-key <key>\\`.\nOverride the API URL with \\`SECLAI_API_URL\\` (default: https://api.seclai.com).\n\n## Quick Reference\n\n| Domain | Command | Description |\n|--------|---------|-------------|\n| Agents | \\`seclai agents list/create/get/update/delete\\` | Manage agents |\n| Agent Runs | \\`seclai agents run <id> --json '...'\\` | Run an agent |\n| Agent Runs | \\`seclai agents runs list/get/delete/cancel/search\\` | Manage runs |\n| Agent Def | \\`seclai agents def get/update\\` | Agent step definitions |\n| Sources | \\`seclai sources list/create/get/update/delete/upload/upload-text\\` | Content sources |\n| Source Exports | \\`seclai sources exports list/create/get/cancel/delete/download/estimate\\` | Export management |\n| Contents | \\`seclai contents get/delete/upload/replace-text/embeddings\\` | Indexed content |\n| Knowledge Bases | \\`seclai kb list/create/get/update/delete\\` | Knowledge bases |\n| Memory Banks | \\`seclai memory list/create/get/update/delete/stats/agents/compact/templates\\` | Memory banks |\n| Evaluations | \\`seclai evals criteria list/create/get/update/delete/summary\\` | Eval criteria |\n| Evaluations | \\`seclai evals results list/create\\` | Eval results |\n| Solutions | \\`seclai solutions list/create/get/update/delete/link/unlink\\` | Solutions |\n| Governance | \\`seclai governance ai generate/list/accept/decline\\` | Governance AI |\n| Alerts | \\`seclai alerts list/get/status/comment/subscribe/unsubscribe\\` | Alerts |\n| Alert Config | \\`seclai alerts configs list/create/get/update/delete\\` | Alert configs |\n| Models | \\`seclai models alerts list/mark-read/mark-all-read/unread-count\\` | Model alerts |\n| Search | \\`seclai search --query \"text\"\\` | Global search |\n| AI Assistant | \\`seclai ai feedback/kb/source/solution/memory/accept/decline/memory-accept\\` | AI assistant |\n\n## Common Patterns\n\n### JSON input\nMost create/update commands accept \\`--json '{\"key\":\"value\"}'\\` or \\`--json-file path.json\\`.\nUse \\`--json -\\` or \\`--json-file -\\` to read from stdin.\n\n### AI assistant shorthand\nAI generation commands accept \\`--user-input <text>\\` as shorthand for \\`--json '{\"user_input\":\"<text>\"}'\\`.\n\\`\\`\\`bash\nseclai agents ai gen-steps <id> --user-input \"Build a QA chatbot\"\nseclai ai kb --user-input \"Create a support knowledge base\"\n\\`\\`\\`\n\n### Compact output\nUse \\`--compact\\` for single-line JSON output (useful for scripting):\n\\`\\`\\`bash\nseclai agents list --compact | jq -c '.[]'\n\\`\\`\\`\n\n### Pagination\nList commands support \\`--page <n>\\` and \\`--limit <n>\\`. Some also support \\`--sort <field>\\` and \\`--order asc|desc\\`.\n\n### Streaming agent runs\n\\`\\`\\`bash\n# Wait for completion via SSE, print final result\nseclai agents run <id> --json '{\"input\":\"Hello\"}' --stream\n\n# Stream individual SSE events as NDJSON\nseclai agents run <id> --json '{\"input\":\"Hello\"}' --events\n\n# Filter event types\nseclai agents run <id> --json '{\"input\":\"Hello\"}' --events --event-filter \"status,data\"\n\n# Poll-based waiting\nseclai agents run <id> --json '{\"input\":\"Hello\"}' --poll --poll-interval-ms 2000\n\\`\\`\\`\n\n### File uploads\n\\`\\`\\`bash\nseclai sources upload <sourceId> --file ./doc.pdf --title \"My Doc\" --metadata '{\"category\":\"docs\"}'\nseclai contents upload <contentVersionId> --file ./updated.pdf\n\\`\\`\\`\n\n## Detailed References\n\n- [Agents](references/agents.md) — CRUD, runs, definitions, AI assistant\n- [Sources](references/sources.md) — content sources, uploads, exports, migrations\n- [Knowledge Bases & Memory Banks](references/kb-memory.md) — KB CRUD, memory banks, compaction\n- [Evaluations & Solutions](references/evals-solutions.md) — criteria, results, solutions, links\n- [Alerts, Governance & More](references/alerts-governance.md) — alerts, governance, models, search, AI\n`;\n\nconst AGENTS_SKILL = `# Seclai CLI — Agents\n\n## CRUD\n\\`\\`\\`bash\nseclai agents list [--page N] [--limit N]\nseclai agents create --json '{\"name\":\"My Agent\",...}'\nseclai agents get <agentId>\nseclai agents update <agentId> --json '{\"name\":\"Updated\"}'\nseclai agents delete <agentId>\n\\`\\`\\`\n\n## Running Agents\n\\`\\`\\`bash\n# Simple run\nseclai agents run <agentId> --json '{\"input\":\"Hello\"}'\n\n# Stream (wait for final result via SSE)\nseclai agents run <agentId> --json '{\"input\":\"Hello\"}' --stream [--timeout-ms 60000]\n\n# Stream individual events as NDJSON\nseclai agents run <agentId> --json '{\"input\":\"Hello\"}' --events [--event-filter \"status,data\"] [--output full|data|status]\n\n# Poll-based\nseclai agents run <agentId> --json '{\"input\":\"Hello\"}' --poll [--poll-interval-ms 2000] [--include-step-outputs]\n\\`\\`\\`\n\n## Runs Management\n\\`\\`\\`bash\nseclai agents runs list <agentId> [--page N] [--limit N] [--status <status>]\nseclai agents runs get <runId> [--include-step-outputs]\nseclai agents runs delete <runId>\nseclai agents runs cancel <runId>\nseclai agents runs search --json '{\"query\":\"...\"}'\nseclai agents runs eval-results <agentId> <runId> [--page N] [--limit N]\n\\`\\`\\`\n\n## Agent Definition\n\\`\\`\\`bash\nseclai agents def get <agentId>\nseclai agents def update <agentId> --json '{\"steps\":[...]}'\n\\`\\`\\`\n\n## Input Uploads\n\\`\\`\\`bash\nseclai agents upload-input <agentId> --file ./input.pdf [--file-name name] [--mime-type type]\nseclai agents input-status <agentId> <uploadId>\n\\`\\`\\`\n\n## AI Assistant\n\\`\\`\\`bash\nseclai agents ai gen-steps <agentId> --user-input \"Build a chat agent\"\nseclai agents ai step-config <agentId> --json '{\"step_type\":\"...\",}'\nseclai agents ai history <agentId>\nseclai agents ai mark <agentId> <conversationId> --json '{\"accepted\":true}'\n\\`\\`\\`\n`;\n\nconst SOURCES_SKILL = `# Seclai CLI — Sources\n\n## CRUD\n\\`\\`\\`bash\nseclai sources list [--page N] [--limit N] [--sort field] [--order asc|desc] [--account-id id]\nseclai sources create --json '{\"name\":\"My Source\",...}'\nseclai sources get <sourceId>\nseclai sources update <sourceId> --json '{\"name\":\"Updated\"}'\nseclai sources delete <sourceId>\n\\`\\`\\`\n\n## File Upload\n\\`\\`\\`bash\nseclai sources upload <sourceId> --file ./doc.pdf [--title \"Title\"] [--metadata '{\"k\":\"v\"}'] [--file-name name] [--mime-type type]\nseclai sources upload-text <sourceId> --json '{\"text\":\"...\",\"title\":\"...\"}'\n\\`\\`\\`\n\n## Exports\n\\`\\`\\`bash\nseclai sources exports list <sourceId> [--page N] [--limit N]\nseclai sources exports create <sourceId> --json '{\"format\":\"...\"}'\nseclai sources exports get <sourceId> <exportId>\nseclai sources exports cancel <sourceId> <exportId>\nseclai sources exports delete <sourceId> <exportId>\nseclai sources exports download <sourceId> <exportId>\nseclai sources exports estimate <sourceId> --json '{\"format\":\"...\"}'\n\\`\\`\\`\n\n## Embedding Migration\n\\`\\`\\`bash\nseclai sources migration get <sourceId>\nseclai sources migration start <sourceId> --json '{\"target_model\":\"...\"}'\nseclai sources migration cancel <sourceId>\n\\`\\`\\`\n`;\n\nconst KB_MEMORY_SKILL = `# Seclai CLI — Knowledge Bases & Memory Banks\n\n## Knowledge Bases\n\\`\\`\\`bash\nseclai kb list [--page N] [--limit N] [--sort field] [--order asc|desc]\nseclai kb create --json '{\"name\":\"My KB\",...}'\nseclai kb get <kbId>\nseclai kb update <kbId> --json '{\"name\":\"Updated\"}'\nseclai kb delete <kbId>\n\\`\\`\\`\n\n## Memory Banks\n\\`\\`\\`bash\nseclai memory list [--page N] [--limit N] [--sort field] [--order asc|desc]\nseclai memory create --json '{\"name\":\"My Bank\",\"type\":\"conversation\"}'\nseclai memory get <memoryBankId>\nseclai memory update <memoryBankId> --json '{\"name\":\"Updated\"}'\nseclai memory delete <memoryBankId>\n\\`\\`\\`\n\n## Memory Bank Utilities\n\\`\\`\\`bash\nseclai memory stats <memoryBankId>\nseclai memory agents <memoryBankId>\nseclai memory compact <memoryBankId>\nseclai memory delete-source <memoryBankId>\nseclai memory templates\nseclai memory test-compaction <memoryBankId> --json '{\"prompt\":\"...\"}'\nseclai memory test-compaction-standalone --json '{\"prompt\":\"...\"}'\n\\`\\`\\`\n\n## Memory Bank AI\n\\`\\`\\`bash\nseclai memory ai generate --user-input \"Configure compaction for chat memory\"\nseclai memory ai last\nseclai memory ai accept <conversationId> --json '{\"accepted\":true}'\n\\`\\`\\`\n`;\n\nconst EVALS_SOLUTIONS_SKILL = `# Seclai CLI — Evaluations & Solutions\n\n## Evaluation Criteria\n\\`\\`\\`bash\nseclai evals criteria list <agentId> [--page N] [--limit N]\nseclai evals criteria create <agentId> --json '{\"name\":\"Quality\",...}'\nseclai evals criteria get <criteriaId>\nseclai evals criteria update <criteriaId> --json '{\"name\":\"Updated\"}'\nseclai evals criteria delete <criteriaId>\nseclai evals criteria summary <criteriaId>\n\\`\\`\\`\n\n## Evaluation Results\n\\`\\`\\`bash\nseclai evals results list <criteriaId> [--page N] [--limit N]\nseclai evals results create <criteriaId> --json '{\"run_id\":\"...\",\"score\":0.9}'\n\\`\\`\\`\n\n## Other Evaluation Commands\n\\`\\`\\`bash\nseclai evals compatible-runs <criteriaId> [--page N] [--limit N]\nseclai evals test-draft <agentId> --json '{\"criteria\":{...},\"run_id\":\"...\"}'\nseclai evals agent-results <agentId> [--page N] [--limit N]\nseclai evals agent-runs <agentId> [--page N] [--limit N]\nseclai evals non-manual-summary <agentId>\n\\`\\`\\`\n\n## Solutions\n\\`\\`\\`bash\nseclai solutions list [--page N] [--limit N] [--sort field] [--order asc|desc]\nseclai solutions create --json '{\"name\":\"My Solution\"}'\nseclai solutions get <solutionId>\nseclai solutions update <solutionId> --json '{\"name\":\"Updated\"}'\nseclai solutions delete <solutionId>\n\\`\\`\\`\n\n## Solution Links\n\\`\\`\\`bash\nseclai solutions link <solutionId> --agents '[\"id1\",\"id2\"]' --kb '[\"id3\"]' --sources '[\"id4\"]'\nseclai solutions unlink <solutionId> --agents '[\"id1\"]'\n\\`\\`\\`\n\n## Solution Conversations\n\\`\\`\\`bash\nseclai solutions convos list <solutionId>\nseclai solutions convos add <solutionId> --json '{\"message\":\"...\"}'\nseclai solutions convos mark <solutionId> <conversationId> --json '{\"accepted\":true}'\n\\`\\`\\`\n\n## Solution AI\n\\`\\`\\`bash\nseclai solutions ai generate <solutionId> --user-input \"Add an FAQ source\"\nseclai solutions ai kb <solutionId> --user-input \"Create a knowledge base\"\nseclai solutions ai source <solutionId> --user-input \"Create a file source\"\nseclai solutions ai accept <solutionId> <conversationId> --json '{\"accepted\":true}'\nseclai solutions ai decline <solutionId> <conversationId>\n\\`\\`\\`\n`;\n\nconst ALERTS_GOVERNANCE_SKILL = `# Seclai CLI — Alerts, Governance, Models & Search\n\n## Alerts\n\\`\\`\\`bash\nseclai alerts list [--page N] [--limit N] [--status <s>] [--severity <s>]\nseclai alerts get <alertId>\nseclai alerts status <alertId> --json '{\"status\":\"resolved\"}'\nseclai alerts comment <alertId> --json '{\"comment\":\"Fixed\"}'\nseclai alerts subscribe <alertId>\nseclai alerts unsubscribe <alertId>\n\\`\\`\\`\n\n## Alert Configurations\n\\`\\`\\`bash\nseclai alerts configs list [--page N] [--limit N]\nseclai alerts configs create --json '{\"name\":\"My Config\",...}'\nseclai alerts configs get <configId>\nseclai alerts configs update <configId> --json '{\"name\":\"Updated\"}'\nseclai alerts configs delete <configId>\n\\`\\`\\`\n\n## Alert Preferences\n\\`\\`\\`bash\nseclai alerts prefs list\nseclai alerts prefs update <orgId> <alertType> --json '{\"enabled\":true}'\n\\`\\`\\`\n\n## Governance AI\n\\`\\`\\`bash\nseclai governance ai generate --user-input \"Create a content safety policy\"\nseclai governance ai list\nseclai governance ai accept <conversationId>\nseclai governance ai decline <conversationId>\n\\`\\`\\`\n\n## Model Alerts\n\\`\\`\\`bash\nseclai models alerts list [--page N] [--limit N]\nseclai models alerts mark-read <alertId>\nseclai models alerts mark-all-read\nseclai models alerts unread-count\nseclai models recommendations <modelId>\n\\`\\`\\`\n\n## Search\n\\`\\`\\`bash\nseclai search --query \"deployment guide\" [--limit N] [--entity-type <type>]\n\\`\\`\\`\n\n## AI Assistant\n\\`\\`\\`bash\nseclai ai feedback --json '{\"feedback\":\"...\"}'\nseclai ai kb --user-input \"Create a support knowledge base\"\nseclai ai source --user-input \"Create a documentation source\"\nseclai ai solution --user-input \"Build a customer support solution\"\nseclai ai memory --user-input \"Create a conversation memory bank\"\nseclai ai memory-history\nseclai ai accept <conversationId> --json '{\"accepted\":true}'\nseclai ai decline <conversationId>\nseclai ai memory-accept <conversationId> --json '{\"accepted\":true}'\n\\`\\`\\`\n`;\n\n// --- Tool detection & path mapping ---\n\ntype ToolConfig = {\n dir: string;\n files: Array<{ name: string; content: string }>;\n};\n\nfunction getToolConfig(tool: string, destDir: string): ToolConfig {\n const skillFiles = [\n { name: \"SKILL.md\", content: SKILL_MD },\n { name: \"references/agents.md\", content: AGENTS_SKILL },\n { name: \"references/sources.md\", content: SOURCES_SKILL },\n { name: \"references/kb-memory.md\", content: KB_MEMORY_SKILL },\n { name: \"references/evals-solutions.md\", content: EVALS_SOLUTIONS_SKILL },\n { name: \"references/alerts-governance.md\", content: ALERTS_GOVERNANCE_SKILL },\n ];\n\n switch (tool) {\n case \"copilot\":\n return { dir: join(destDir, \".github\", \"copilot\", \"seclai-cli\"), files: skillFiles };\n case \"claude\":\n return { dir: join(destDir, \".claude\", \"skills\", \"seclai-cli\"), files: skillFiles };\n case \"cursor\":\n return { dir: join(destDir, \".cursor\", \"skills\", \"seclai-cli\"), files: skillFiles };\n case \"windsurf\":\n return { dir: join(destDir, \".windsurf\", \"skills\", \"seclai-cli\"), files: skillFiles };\n case \"codex\":\n return { dir: join(destDir, \".codex\", \"skills\", \"seclai-cli\"), files: skillFiles };\n case \"kiro\":\n return { dir: join(destDir, \".kiro\", \"steering\", \"seclai-cli\"), files: skillFiles };\n case \"cline\":\n return { dir: join(destDir, \".clinerules\", \"seclai-cli\"), files: skillFiles };\n case \"roo\":\n return { dir: join(destDir, \".roo\", \"rules\", \"seclai-cli\"), files: skillFiles };\n case \"gemini\":\n return { dir: join(destDir, \".gemini\", \"seclai-cli\"), files: skillFiles };\n case \"antigravity\":\n return { dir: join(destDir, \".antigravity\", \"seclai-cli\"), files: skillFiles };\n default:\n throw new Error(`Unknown tool: ${tool}. Use copilot, claude, cursor, windsurf, codex, kiro, cline, roo, gemini, or antigravity.`);\n }\n}\n\nfunction detectTools(destDir: string): string[] {\n const detected: string[] = [];\n\n if (existsSync(join(destDir, \".github\", \"copilot\"))) detected.push(\"copilot\");\n if (existsSync(join(destDir, \".claude\")) || existsSync(join(destDir, \"CLAUDE.md\")))\n detected.push(\"claude\");\n if (existsSync(join(destDir, \".cursor\"))) detected.push(\"cursor\");\n if (existsSync(join(destDir, \".windsurf\"))) detected.push(\"windsurf\");\n if (existsSync(join(destDir, \".codex\"))) detected.push(\"codex\");\n if (existsSync(join(destDir, \".kiro\"))) detected.push(\"kiro\");\n if (existsSync(join(destDir, \".clinerules\")) && statSync(join(destDir, \".clinerules\")).isDirectory()) detected.push(\"cline\");\n if (existsSync(join(destDir, \".roo\"))) detected.push(\"roo\");\n if (existsSync(join(destDir, \".gemini\")) || existsSync(join(destDir, \"GEMINI.md\")))\n detected.push(\"gemini\");\n if (existsSync(join(destDir, \".antigravity\"))) detected.push(\"antigravity\");\n\n return detected;\n}\n\n/** Register the `skills` command for installing Seclai skill files into AI coding tool directories. */\nexport function register(program: Command, rt: CliRuntime): void {\n const skills = program.command(\"skills\").description(\"Install Seclai CLI skill files for AI coding tools.\");\n\n skills\n .command(\"install\")\n .description(\n \"Write Seclai CLI skill/instruction files into the current workspace.\\n\\n\" +\n \"Detected tools: copilot, claude, cursor, windsurf, codex, kiro, cline, roo, gemini, antigravity.\\n\" +\n \"Use --tool to target a specific tool, or 'all' for all supported tools.\"\n )\n .option(\"--tool <name>\", \"Target tool (copilot|claude|cursor|windsurf|codex|kiro|cline|roo|gemini|antigravity|all). Auto-detects if omitted.\")\n .option(\"--dir <path>\", \"Target directory (default: current directory).\", \".\")\n .action(async (opts) => {\n await run(rt, async () => {\n const destDir = opts.dir;\n let tools: string[];\n\n if (opts.tool === \"all\") {\n tools = [\"copilot\", \"claude\", \"cursor\", \"windsurf\", \"codex\", \"kiro\", \"cline\", \"roo\", \"gemini\", \"antigravity\"];\n } else if (opts.tool) {\n tools = [opts.tool];\n } else {\n tools = detectTools(destDir);\n if (tools.length === 0) {\n tools = [\"copilot\"]; // default fallback\n rt.writeErr(\"No AI tool detected, defaulting to copilot.\\n\");\n }\n }\n\n let totalFiles = 0;\n for (const tool of tools) {\n const config = getToolConfig(tool, destDir);\n for (const file of config.files) {\n const filePath = join(config.dir, file.name);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, file.content, \"utf8\");\n totalFiles++;\n }\n rt.writeErr(`Installed ${config.files.length} skill files for ${tool} → ${config.dir}\\n`);\n }\n\n printJson(rt, { ok: true, tools, filesWritten: totalFiles });\n });\n });\n}\n","import { Command } from \"commander\";\nimport type { CliRuntime } from \"../helpers.js\";\n\nconst BASH = `#!/usr/bin/env bash\n# seclai bash completion — add to ~/.bashrc:\n# eval \"$(seclai completion bash)\"\n\n_seclai_completions() {\n local cur prev commands\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n\n # Top-level commands\n commands=\"agents sources contents kb memory evals solutions governance alerts models search ai skills completion help\"\n\n case \"\\${COMP_WORDS[1]}\" in\n agents)\n case \"\\${COMP_WORDS[2]}\" in\n runs) COMPREPLY=( $(compgen -W \"list get delete cancel search eval-results\" -- \"$cur\") ); return ;;\n def) COMPREPLY=( $(compgen -W \"get update\" -- \"$cur\") ); return ;;\n ai) COMPREPLY=( $(compgen -W \"gen-steps step-config history mark\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"list create get update delete run runs def upload-input input-status ai\" -- \"$cur\") ); return ;;\n esac ;;\n sources|source)\n case \"\\${COMP_WORDS[2]}\" in\n exports) COMPREPLY=( $(compgen -W \"list create get cancel delete download estimate\" -- \"$cur\") ); return ;;\n migration) COMPREPLY=( $(compgen -W \"get start cancel\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"list create get update delete upload upload-text exports migration\" -- \"$cur\") ); return ;;\n esac ;;\n contents) COMPREPLY=( $(compgen -W \"get delete upload replace replace-text embeddings\" -- \"$cur\") ); return ;;\n kb) COMPREPLY=( $(compgen -W \"list create get update delete\" -- \"$cur\") ); return ;;\n memory)\n case \"\\${COMP_WORDS[2]}\" in\n ai) COMPREPLY=( $(compgen -W \"generate last accept\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"list create get update delete stats agents compact delete-source templates test-compaction test-compaction-standalone ai\" -- \"$cur\") ); return ;;\n esac ;;\n evals)\n case \"\\${COMP_WORDS[2]}\" in\n criteria) COMPREPLY=( $(compgen -W \"list create get update delete summary\" -- \"$cur\") ); return ;;\n results) COMPREPLY=( $(compgen -W \"list create\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"criteria results compatible-runs test-draft agent-results agent-runs non-manual-summary\" -- \"$cur\") ); return ;;\n esac ;;\n solutions)\n case \"\\${COMP_WORDS[2]}\" in\n convos) COMPREPLY=( $(compgen -W \"list add mark\" -- \"$cur\") ); return ;;\n ai) COMPREPLY=( $(compgen -W \"generate kb source accept decline\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"list create get update delete link unlink convos ai\" -- \"$cur\") ); return ;;\n esac ;;\n governance)\n case \"\\${COMP_WORDS[2]}\" in\n ai) COMPREPLY=( $(compgen -W \"generate list accept decline\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"ai\" -- \"$cur\") ); return ;;\n esac ;;\n alerts)\n case \"\\${COMP_WORDS[2]}\" in\n configs) COMPREPLY=( $(compgen -W \"list create get update delete\" -- \"$cur\") ); return ;;\n prefs) COMPREPLY=( $(compgen -W \"list update\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"list get status comment subscribe unsubscribe configs prefs\" -- \"$cur\") ); return ;;\n esac ;;\n models)\n case \"\\${COMP_WORDS[2]}\" in\n alerts) COMPREPLY=( $(compgen -W \"list mark-read mark-all-read unread-count\" -- \"$cur\") ); return ;;\n *) COMPREPLY=( $(compgen -W \"alerts recommendations\" -- \"$cur\") ); return ;;\n esac ;;\n ai) COMPREPLY=( $(compgen -W \"feedback kb source solution memory memory-history accept decline memory-accept\" -- \"$cur\") ); return ;;\n skills) COMPREPLY=( $(compgen -W \"install\" -- \"$cur\") ); return ;;\n completion) COMPREPLY=( $(compgen -W \"bash zsh fish\" -- \"$cur\") ); return ;;\n esac\n\n COMPREPLY=( $(compgen -W \"$commands\" -- \"$cur\") )\n}\n\ncomplete -F _seclai_completions seclai\n`;\n\nconst ZSH = `#compdef seclai\n# seclai zsh completion — add to ~/.zshrc:\n# eval \"$(seclai completion zsh)\"\n\n_seclai() {\n local -a commands\n commands=(\n 'agents:Manage agents, runs, definitions, and AI assistance'\n 'sources:Manage content sources'\n 'contents:Manage indexed content and embeddings'\n 'kb:Manage knowledge bases'\n 'memory:Manage memory banks'\n 'evals:Manage evaluations'\n 'solutions:Manage solutions'\n 'governance:Governance AI assistant'\n 'alerts:Manage alerts and alert configurations'\n 'models:Model alerts and recommendations'\n 'search:Search across Seclai resources'\n 'ai:Top-level AI assistant'\n 'skills:Install skill files for AI coding tools'\n 'completion:Generate shell completion scripts'\n 'help:Display help for command'\n )\n\n _arguments -C \\\\\n '--api-key[Seclai API key]:key' \\\\\n '--compact[Output compact JSON]' \\\\\n '-V[Output version]' \\\\\n '-h[Display help]' \\\\\n '1:command:->cmd' \\\\\n '*::arg:->args'\n\n case $state in\n cmd) _describe 'command' commands ;;\n args)\n case \\${words[1]} in\n agents)\n local -a sub=(list create get update delete run runs def upload-input input-status ai)\n _describe 'subcommand' sub ;;\n sources|source)\n local -a sub=(list create get update delete upload upload-text exports migration)\n _describe 'subcommand' sub ;;\n contents)\n local -a sub=(get delete upload replace replace-text embeddings)\n _describe 'subcommand' sub ;;\n kb)\n local -a sub=(list create get update delete)\n _describe 'subcommand' sub ;;\n memory)\n local -a sub=(list create get update delete stats agents compact delete-source templates test-compaction test-compaction-standalone ai)\n _describe 'subcommand' sub ;;\n evals)\n local -a sub=(criteria results compatible-runs test-draft agent-results agent-runs non-manual-summary)\n _describe 'subcommand' sub ;;\n solutions)\n local -a sub=(list create get update delete link unlink convos ai)\n _describe 'subcommand' sub ;;\n governance)\n local -a sub=(ai)\n _describe 'subcommand' sub ;;\n alerts)\n local -a sub=(list get status comment subscribe unsubscribe configs prefs)\n _describe 'subcommand' sub ;;\n models)\n local -a sub=(alerts recommendations)\n _describe 'subcommand' sub ;;\n ai)\n local -a sub=(feedback kb source solution memory memory-history accept decline memory-accept)\n _describe 'subcommand' sub ;;\n skills)\n local -a sub=(install)\n _describe 'subcommand' sub ;;\n completion)\n local -a sub=(bash zsh fish)\n _describe 'shell' sub ;;\n esac ;;\n esac\n}\n\n_seclai \"$@\"\n`;\n\nconst FISH = `# seclai fish completion — save to ~/.config/fish/completions/seclai.fish\n# seclai completion fish > ~/.config/fish/completions/seclai.fish\n\nset -l top agents sources contents kb memory evals solutions governance alerts models search ai skills completion help\n\n# Top-level\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"agents\" -d \"Manage agents\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"sources\" -d \"Manage sources\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"contents\" -d \"Manage content\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"kb\" -d \"Knowledge bases\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"memory\" -d \"Memory banks\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"evals\" -d \"Evaluations\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"solutions\" -d \"Solutions\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"governance\" -d \"Governance AI\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"alerts\" -d \"Alerts\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"models\" -d \"Model alerts\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"search\" -d \"Search resources\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"ai\" -d \"AI assistant\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"skills\" -d \"Skill files\"\ncomplete -c seclai -n \"not __fish_seen_subcommand_from $top\" -f -a \"completion\" -d \"Shell completions\"\n\n# agents\ncomplete -c seclai -n \"__fish_seen_subcommand_from agents; and not __fish_seen_subcommand_from list create get update delete run runs def upload-input input-status ai\" -f -a \"list create get update delete run runs def upload-input input-status ai\"\n\n# sources\ncomplete -c seclai -n \"__fish_seen_subcommand_from sources; and not __fish_seen_subcommand_from list create get update delete upload upload-text exports migration\" -f -a \"list create get update delete upload upload-text exports migration\"\n\n# contents\ncomplete -c seclai -n \"__fish_seen_subcommand_from contents; and not __fish_seen_subcommand_from get delete upload replace replace-text embeddings\" -f -a \"get delete upload replace replace-text embeddings\"\n\n# kb\ncomplete -c seclai -n \"__fish_seen_subcommand_from kb; and not __fish_seen_subcommand_from list create get update delete\" -f -a \"list create get update delete\"\n\n# memory\ncomplete -c seclai -n \"__fish_seen_subcommand_from memory; and not __fish_seen_subcommand_from list create get update delete stats agents compact delete-source templates test-compaction test-compaction-standalone ai\" -f -a \"list create get update delete stats agents compact delete-source templates test-compaction test-compaction-standalone ai\"\n\n# evals\ncomplete -c seclai -n \"__fish_seen_subcommand_from evals; and not __fish_seen_subcommand_from criteria results compatible-runs test-draft agent-results agent-runs non-manual-summary\" -f -a \"criteria results compatible-runs test-draft agent-results agent-runs non-manual-summary\"\n\n# solutions\ncomplete -c seclai -n \"__fish_seen_subcommand_from solutions; and not __fish_seen_subcommand_from list create get update delete link unlink convos ai\" -f -a \"list create get update delete link unlink convos ai\"\n\n# governance\ncomplete -c seclai -n \"__fish_seen_subcommand_from governance; and not __fish_seen_subcommand_from ai\" -f -a \"ai\"\n\n# alerts\ncomplete -c seclai -n \"__fish_seen_subcommand_from alerts; and not __fish_seen_subcommand_from list get status comment subscribe unsubscribe configs prefs\" -f -a \"list get status comment subscribe unsubscribe configs prefs\"\n\n# models\ncomplete -c seclai -n \"__fish_seen_subcommand_from models; and not __fish_seen_subcommand_from alerts recommendations\" -f -a \"alerts recommendations\"\n\n# ai\ncomplete -c seclai -n \"__fish_seen_subcommand_from ai; and not __fish_seen_subcommand_from feedback kb source solution memory memory-history accept decline memory-accept\" -f -a \"feedback kb source solution memory memory-history accept decline memory-accept\"\n\n# skills\ncomplete -c seclai -n \"__fish_seen_subcommand_from skills; and not __fish_seen_subcommand_from install\" -f -a \"install\"\n\n# completion\ncomplete -c seclai -n \"__fish_seen_subcommand_from completion; and not __fish_seen_subcommand_from bash zsh fish\" -f -a \"bash zsh fish\"\n\n# Global options\ncomplete -c seclai -l api-key -d \"Seclai API key\"\ncomplete -c seclai -l compact -d \"Output compact JSON\"\ncomplete -c seclai -s V -l version -d \"Output version\"\n`;\n\nconst SCRIPTS: Record<string, string> = { bash: BASH, zsh: ZSH, fish: FISH };\n\n/** Register the `completion` command for generating shell completion scripts (bash/zsh/fish). */\nexport function register(program: Command, rt: CliRuntime): void {\n const completion = program\n .command(\"completion\")\n .description(\"Generate shell completion scripts.\")\n .argument(\"<shell>\", \"Shell type: bash, zsh, or fish.\")\n .action(async (shell: string) => {\n const script = SCRIPTS[shell];\n if (!script) {\n rt.writeErr(`Unknown shell \"${shell}\". Use: bash, zsh, or fish.\\n`);\n rt.setExitCode(1);\n return;\n }\n rt.writeOut(script);\n });\n}\n"],"mappings":"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","names":["process","readFile","register","register","register","register","register","register","register","register","register","register","register","register","register","register"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seclai/cli",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "Seclai Command Line Interface",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Seclai Command Line Interface — manage agents, knowledge bases, sources, memory banks, and more from the terminal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
"LICENSE",
|
|
13
13
|
"README.md"
|
|
14
14
|
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"author": "Seclai, Inc. <support@seclai.com>",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"seclai",
|
|
21
|
+
"cli",
|
|
22
|
+
"ai",
|
|
23
|
+
"agent",
|
|
24
|
+
"knowledge-base",
|
|
25
|
+
"vector",
|
|
26
|
+
"rag",
|
|
27
|
+
"memory-bank",
|
|
28
|
+
"evaluation",
|
|
29
|
+
"governance"
|
|
30
|
+
],
|
|
15
31
|
"repository": "github:seclai/seclai-cli",
|
|
32
|
+
"homepage": "https://github.com/seclai/seclai-cli#readme",
|
|
33
|
+
"bugs": "https://github.com/seclai/seclai-cli/issues",
|
|
16
34
|
"scripts": {
|
|
17
35
|
"version:apply": "node scripts/set-version.mjs apply && node scripts/set-readme-version.mjs apply",
|
|
18
36
|
"version:restore": "node scripts/set-readme-version.mjs restore && node scripts/set-version.mjs restore",
|
|
@@ -20,20 +38,21 @@
|
|
|
20
38
|
"dev": "tsx src/cli.ts",
|
|
21
39
|
"docs": "npm run build && node scripts/generate-docs.mjs",
|
|
22
40
|
"build:versioned": "npm run version:apply && npm run build && npm run version:restore",
|
|
41
|
+
"prepublishOnly": "npm run build",
|
|
23
42
|
"publish:ci": "npm run version:apply && npm run build && npm publish --provenance --access public --ignore-scripts && npm run version:restore",
|
|
24
43
|
"test": "vitest run",
|
|
25
44
|
"test:watch": "vitest",
|
|
26
45
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
27
46
|
},
|
|
28
47
|
"dependencies": {
|
|
29
|
-
"@seclai/sdk": "^1.0
|
|
48
|
+
"@seclai/sdk": "^1.1.0",
|
|
30
49
|
"commander": "^13.1.0"
|
|
31
50
|
},
|
|
32
51
|
"devDependencies": {
|
|
33
52
|
"@types/node": "^20.19.0",
|
|
34
53
|
"tsup": "^8.5.0",
|
|
35
54
|
"tsx": "^4.19.2",
|
|
36
|
-
"
|
|
37
|
-
"
|
|
55
|
+
"typescript": "^5.7.3",
|
|
56
|
+
"vitest": "^2.1.9"
|
|
38
57
|
}
|
|
39
58
|
}
|