@seclai/cli 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@ npm i -g @seclai/cli
14
14
 
15
15
  Command reference (latest):
16
16
 
17
- https://seclai.github.io/seclai-cli/1.0.4/
17
+ https://seclai.github.io/seclai-cli/1.0.5/
18
18
 
19
19
  ## Authentication
20
20
 
package/dist/cli.js CHANGED
@@ -118,14 +118,41 @@ async function run(rt, main) {
118
118
  function createProgram(rt = defaultRuntime()) {
119
119
  const program = new Command();
120
120
  const cliVersion = getCliVersion();
121
- program.name("seclai").description(`Seclai Command Line Interface (v${cliVersion})`).version(cliVersion, "-V, --version", "output the version").option("--api-key <key>", "API key (defaults to SECLAI_API_KEY)");
121
+ program.name("seclai").description(
122
+ `Seclai Command Line Interface (v${cliVersion})
123
+
124
+ Use this CLI to interact with Seclai from scripts and CI: manage connected content sources, run agents, and inspect agent runs and indexed content.
125
+
126
+ All commands return JSON to stdout by default, which makes it easy to pipe into tools like jq.`
127
+ ).version(cliVersion, "-V, --version", "output the version").option(
128
+ "--api-key <key>",
129
+ "Seclai API key (defaults to SECLAI_API_KEY). You can create/manage keys in the Seclai dashboard (Settings \u2192 API Keys)."
130
+ );
131
+ program.addHelpText(
132
+ "after",
133
+ `
134
+ Environment:
135
+ SECLAI_API_KEY Default API key (alternative to --api-key)
136
+ SECLAI_API_URL Override API base URL (default: https://api.seclai.com). Intended for dev/staging.
137
+
138
+ Examples:
139
+ seclai sources list
140
+ seclai sources upload <sourceConnectionId> --file ./document.pdf
141
+ seclai agents run <agentId> --json '{"input":"Hello"}'
142
+ seclai agents run <agentId> --json-file - --stream --timeout-ms 60000 < run.json
143
+ `
144
+ );
122
145
  program.configureOutput({
123
146
  writeOut: (str) => rt.writeOut(str),
124
147
  writeErr: (str) => rt.writeErr(str)
125
148
  });
126
149
  program.exitOverride();
127
- const sources = program.command("sources").alias("source").description("Manage sources");
128
- sources.command("list").description("List sources").option("--page <n>", "Page number", (v) => Number(v)).option("--limit <n>", "Page size", (v) => Number(v)).option("--sort <field>", "Sort field").option("--order <asc|desc>", "Sort order").option("--account-id <id>", "Filter by account id").action(async (opts) => {
150
+ const sources = program.command("sources").alias("source").description(
151
+ "Manage content sources connected to Seclai.\n\nSources are how Seclai ingests content (e.g., websites, RSS feeds, document uploads) into a knowledge base so agents can retrieve and cite it."
152
+ );
153
+ sources.command("list").description(
154
+ "List sources available to your organization/account.\n\nUse this to discover source connections and their IDs before uploading documents or debugging indexing."
155
+ ).option("--page <n>", "Page number for pagination (1-based).", (v) => Number(v)).option("--limit <n>", "Page size (number of items to return).", (v) => Number(v)).option("--sort <field>", "Sort field (API-defined; commonly created_at or updated_at).").option("--order <asc|desc>", "Sort direction: asc or desc.").option("--account-id <id>", "Filter results to a specific account/organization id.").action(async (opts) => {
129
156
  await run(rt, async () => {
130
157
  const global = program.opts();
131
158
  const client = createClient(global);
@@ -139,7 +166,15 @@ function createProgram(rt = defaultRuntime()) {
139
166
  printJson(rt, res);
140
167
  });
141
168
  });
142
- sources.command("upload").description("Upload a file to a source connection").argument("<sourceConnectionId>", "Source connection id").requiredOption("--file <path>", "Path to local file").option("--title <title>", "Optional title").option("--file-name <name>", "Filename to send (defaults to basename)").option("--mime-type <type>", "MIME type").action(async (sourceConnectionId, opts) => {
169
+ sources.command("upload").description(
170
+ "Upload a local file to an existing source connection.\n\nThis is commonly used for document-upload sources inside a knowledge base. The uploaded file becomes indexed content that agents can retrieve from.\n\nNote: file size limits and supported MIME types are defined by the Seclai API (see the API reference for the upload endpoint)."
171
+ ).argument(
172
+ "<sourceConnectionId>",
173
+ "Source connection ID to upload into. You can find this in the Seclai dashboard or by listing sources."
174
+ ).requiredOption("--file <path>", "Path to a local file to upload.").option("--title <title>", "Optional human-readable title to associate with the uploaded content.").option(
175
+ "--file-name <name>",
176
+ "Override the filename sent to the API (defaults to the basename of --file). Useful when uploading from temp paths."
177
+ ).option("--mime-type <type>", "Explicit MIME type (e.g., application/pdf, text/plain).").action(async (sourceConnectionId, opts) => {
143
178
  await run(rt, async () => {
144
179
  const global = program.opts();
145
180
  const client = createClient(global);
@@ -152,8 +187,19 @@ function createProgram(rt = defaultRuntime()) {
152
187
  printJson(rt, res);
153
188
  });
154
189
  });
155
- const agents = program.command("agents").description("Run agents and manage runs");
156
- agents.command("run").description("Run an agent").argument("<agentId>", "Agent id").option("--json <json>", "Request body JSON (string or '-')").option("--json-file <path>", "Request body JSON file path (or '-')").option("--stream", "Use streaming SSE endpoint and wait for completion").option("--timeout-ms <n>", "Client-side timeout in milliseconds", (v) => Number(v)).action(async (agentId, opts) => {
190
+ const agents = program.command("agents").description(
191
+ "Run agents and manage agent runs.\n\nAgents 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."
192
+ );
193
+ agents.command("run").description(
194
+ "Run an agent by ID and print the run result as JSON.\n\nThe request body is passed through to the Seclai API as-is (see the API docs for the specific agent/run schema).\n\nFor automation, prefer --json-file and pipe input via stdin (use '-' as the path)."
195
+ ).argument("<agentId>", "Agent ID to run (from the Seclai dashboard).").option("--json <json>", "Inline JSON request body. Use '-' to read JSON from stdin.").option("--json-file <path>", "Path to a JSON file containing the request body. Use '-' to read from stdin.").option(
196
+ "--stream",
197
+ "Wait for completion using the streaming (SSE) endpoint. The CLI prints the final result when the run is done."
198
+ ).option(
199
+ "--timeout-ms <n>",
200
+ "Client-side timeout (milliseconds) when using --stream. This controls how long the CLI waits; it does not change server-side execution limits.",
201
+ (v) => Number(v)
202
+ ).action(async (agentId, opts) => {
157
203
  await run(rt, async () => {
158
204
  const global = program.opts();
159
205
  const client = createClient(global);
@@ -174,7 +220,9 @@ function createProgram(rt = defaultRuntime()) {
174
220
  });
175
221
  });
176
222
  const agentRuns = agents.command("runs").description("Manage agent runs");
177
- agentRuns.command("list").description("List runs for an agent").argument("<agentId>", "Agent id").option("--page <n>", "Page number", (v) => Number(v)).option("--limit <n>", "Page size", (v) => Number(v)).action(async (agentId, opts) => {
223
+ agentRuns.command("list").description(
224
+ "List runs for a specific agent.\n\nThis is useful for monitoring recent executions, checking statuses, and obtaining run IDs for follow-up commands."
225
+ ).argument("<agentId>", "Agent ID whose runs you want to list.").option("--page <n>", "Page number for pagination (1-based).", (v) => Number(v)).option("--limit <n>", "Page size (number of runs to return).", (v) => Number(v)).action(async (agentId, opts) => {
178
226
  await run(rt, async () => {
179
227
  const global = program.opts();
180
228
  const client = createClient(global);
@@ -182,7 +230,15 @@ function createProgram(rt = defaultRuntime()) {
182
230
  printJson(rt, res);
183
231
  });
184
232
  });
185
- agentRuns.command("get").description("Get a specific agent run").argument("<agentId>", "Agent id").argument("<runId>", "Run id").option("--include-step-outputs", "Include step outputs (may be omitted by default)").action(async (agentId, runId, opts) => {
233
+ agentRuns.command("get").description(
234
+ "Fetch a specific agent run and print it as JSON.\n\nUse this to inspect status, timestamps, and outputs. Optionally include step outputs for deeper debugging (may be large)."
235
+ ).argument(
236
+ "<agentId>",
237
+ "Agent ID (accepted for backward compatibility; the API identifies runs globally by runId)."
238
+ ).argument("<runId>", "Run ID to retrieve.").option(
239
+ "--include-step-outputs",
240
+ "Include step-level outputs when available. This may increase response size and latency."
241
+ ).action(async (agentId, runId, opts) => {
186
242
  await run(rt, async () => {
187
243
  const global = program.opts();
188
244
  const client = createClient(global);
@@ -190,7 +246,12 @@ function createProgram(rt = defaultRuntime()) {
190
246
  printJson(rt, res);
191
247
  });
192
248
  });
193
- agentRuns.command("delete").description("Cancel/delete a specific agent run").argument("<agentId>", "Agent id").argument("<runId>", "Run id").action(async (agentId, runId) => {
249
+ agentRuns.command("delete").description(
250
+ "Cancel or delete a specific agent run by ID.\n\nIf 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)."
251
+ ).argument(
252
+ "<agentId>",
253
+ "Agent ID (accepted for backward compatibility; the API identifies runs globally by runId)."
254
+ ).argument("<runId>", "Run ID to cancel/delete.").action(async (agentId, runId) => {
194
255
  await run(rt, async () => {
195
256
  const global = program.opts();
196
257
  const client = createClient(global);
@@ -198,8 +259,15 @@ function createProgram(rt = defaultRuntime()) {
198
259
  printJson(rt, res);
199
260
  });
200
261
  });
201
- const runs = program.command("runs").alias("agent-runs").description("Manage agent runs by run id");
202
- runs.command("get").description("Get a specific agent run by run id").argument("<runId>", "Run id").option("--include-step-outputs", "Include step outputs (may be omitted by default)").action(async (runId, opts) => {
262
+ const runs = program.command("runs").alias("agent-runs").description(
263
+ "Manage agent runs by run ID (globally unique).\n\nUse this when you already have a runId (for example from `agents runs list`) and don't want to supply an agentId."
264
+ );
265
+ runs.command("get").description(
266
+ "Fetch a specific agent run by run ID and print it as JSON.\n\nUse --include-step-outputs to include step-level details when available (may be large)."
267
+ ).argument("<runId>", "Run ID to retrieve.").option(
268
+ "--include-step-outputs",
269
+ "Include step-level outputs when available. This may increase response size and latency."
270
+ ).action(async (runId, opts) => {
203
271
  await run(rt, async () => {
204
272
  const global = program.opts();
205
273
  const client = createClient(global);
@@ -207,7 +275,9 @@ function createProgram(rt = defaultRuntime()) {
207
275
  printJson(rt, res);
208
276
  });
209
277
  });
210
- runs.command("delete").description("Cancel/delete a specific agent run by run id").argument("<runId>", "Run id").action(async (runId) => {
278
+ runs.command("delete").description(
279
+ "Cancel or delete a specific agent run by run ID.\n\nIf the run is in progress, this requests cancellation. If it is completed, behavior depends on the API (it may delete or mark the run)."
280
+ ).argument("<runId>", "Run ID to cancel/delete.").action(async (runId) => {
211
281
  await run(rt, async () => {
212
282
  const global = program.opts();
213
283
  const client = createClient(global);
@@ -215,8 +285,15 @@ function createProgram(rt = defaultRuntime()) {
215
285
  printJson(rt, res);
216
286
  });
217
287
  });
218
- const contents = program.command("contents").description("Inspect content and embeddings");
219
- contents.command("get").description("Get content detail").argument("<sourceConnectionContentVersion>", "Content version id").option("--start <n>", "Start offset", (v) => Number(v)).option("--end <n>", "End offset", (v) => Number(v)).action(async (sourceConnectionContentVersion, opts) => {
288
+ const contents = program.command("contents").description(
289
+ "Inspect indexed content and embeddings.\n\nWhen 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."
290
+ );
291
+ contents.command("get").description(
292
+ "Get details for a specific content version.\n\nThis typically includes extracted text/metadata produced during indexing. Use --start/--end to fetch a slice of the text for faster inspection."
293
+ ).argument(
294
+ "<sourceConnectionContentVersion>",
295
+ "Content version ID to retrieve (from Seclai dashboard or API responses)."
296
+ ).option("--start <n>", "Start offset for returned text (0-based).", (v) => Number(v)).option("--end <n>", "End offset for returned text (exclusive).", (v) => Number(v)).action(async (sourceConnectionContentVersion, opts) => {
220
297
  await run(rt, async () => {
221
298
  const global = program.opts();
222
299
  const client = createClient(global);
@@ -227,7 +304,9 @@ function createProgram(rt = defaultRuntime()) {
227
304
  printJson(rt, res);
228
305
  });
229
306
  });
230
- contents.command("delete").description("Delete a content version").argument("<sourceConnectionContentVersion>", "Content version id").action(async (sourceConnectionContentVersion) => {
307
+ contents.command("delete").description(
308
+ "Delete a specific content version from Seclai.\n\nUse with care: removing a content version can affect retrieval results for agents that rely on the associated knowledge base."
309
+ ).argument("<sourceConnectionContentVersion>", "Content version ID to delete.").action(async (sourceConnectionContentVersion) => {
231
310
  await run(rt, async () => {
232
311
  const global = program.opts();
233
312
  const client = createClient(global);
@@ -235,7 +314,9 @@ function createProgram(rt = defaultRuntime()) {
235
314
  printJson(rt, { ok: true });
236
315
  });
237
316
  });
238
- contents.command("embeddings").description("List embeddings for a content version").argument("<sourceConnectionContentVersion>", "Content version id").option("--page <n>", "Page number", (v) => Number(v)).option("--limit <n>", "Page size", (v) => Number(v)).action(async (sourceConnectionContentVersion, opts) => {
317
+ contents.command("embeddings").description(
318
+ "List embeddings generated for a content version.\n\nEmbeddings power similarity search and retrieval for knowledge base agents. Listing them is useful for debugging indexing and verifying that content produced vectors."
319
+ ).argument("<sourceConnectionContentVersion>", "Content version ID whose embeddings you want to list.").option("--page <n>", "Page number for pagination (1-based).", (v) => Number(v)).option("--limit <n>", "Page size (number of embeddings to return).", (v) => Number(v)).action(async (sourceConnectionContentVersion, opts) => {
239
320
  await run(rt, async () => {
240
321
  const global = program.opts();
241
322
  const client = createClient(global);
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\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(`Seclai Command Line Interface (v${cliVersion})`)\n .version(cliVersion, \"-V, --version\", \"output the version\")\n .option(\"--api-key <key>\", \"API key (defaults to SECLAI_API_KEY)\");\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(\"Manage sources\");\n\nsources\n .command(\"list\")\n .description(\"List sources\")\n .option(\"--page <n>\", \"Page number\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size\", (v) => Number(v))\n .option(\"--sort <field>\", \"Sort field\")\n .option(\"--order <asc|desc>\", \"Sort order\")\n .option(\"--account-id <id>\", \"Filter by account 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(\"Upload a file to a source connection\")\n .argument(\"<sourceConnectionId>\", \"Source connection id\")\n .requiredOption(\"--file <path>\", \"Path to local file\")\n .option(\"--title <title>\", \"Optional title\")\n .option(\"--file-name <name>\", \"Filename to send (defaults to basename)\")\n .option(\"--mime-type <type>\", \"MIME type\")\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 fileName?: string;\n mimeType?: string;\n } = { file: bytes };\n if (opts.title !== undefined) uploadOpts.title = opts.title;\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.command(\"agents\").description(\"Run agents and manage runs\");\n\nagents\n .command(\"run\")\n .description(\"Run an agent\")\n .argument(\"<agentId>\", \"Agent id\")\n .option(\"--json <json>\", \"Request body JSON (string or '-')\")\n .option(\"--json-file <path>\", \"Request body JSON file path (or '-')\")\n .option(\"--stream\", \"Use streaming SSE endpoint and wait for completion\")\n .option(\"--timeout-ms <n>\", \"Client-side timeout in milliseconds\", (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\n const body = await readJsonInput(rt, { json: opts.json, jsonFile: opts.jsonFile });\n\n let res: unknown;\n if (opts.stream) {\n const streamFn = (client as any).runStreamingAgentAndWait as\n | undefined\n | ((agentId: string, body: unknown, opts?: { timeoutMs?: number }) => Promise<unknown>);\n if (!streamFn) {\n throw new Error(\n \"This version of @seclai/sdk does not support streaming agent runs yet. Upgrade @seclai/sdk to a version that includes runStreamingAgentAndWait.\"\n );\n }\n res = await streamFn(agentId, body, opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : undefined);\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(\"List runs for an agent\")\n .argument(\"<agentId>\", \"Agent id\")\n .option(\"--page <n>\", \"Page number\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size\", (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(\"Get a specific agent run\")\n .argument(\"<agentId>\", \"Agent id\")\n .argument(\"<runId>\", \"Run id\")\n .option(\"--include-step-outputs\", \"Include step outputs (may be omitted by default)\")\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 // Backward-compatible CLI: agentId is accepted but no longer required by the API.\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(\"Cancel/delete a specific agent run\")\n .argument(\"<agentId>\", \"Agent id\")\n .argument(\"<runId>\", \"Run id\")\n .action(async (agentId: string, runId: string) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n // Backward-compatible CLI: agentId is accepted but no longer required by the API.\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(\"Manage agent runs by run id\");\n\nruns\n .command(\"get\")\n .description(\"Get a specific agent run by run id\")\n .argument(\"<runId>\", \"Run id\")\n .option(\"--include-step-outputs\", \"Include step outputs (may be omitted by default)\")\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(\"Cancel/delete a specific agent run by run id\")\n .argument(\"<runId>\", \"Run id\")\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.command(\"contents\").description(\"Inspect content and embeddings\");\n\ncontents\n .command(\"get\")\n .description(\"Get content detail\")\n .argument(\"<sourceConnectionContentVersion>\", \"Content version id\")\n .option(\"--start <n>\", \"Start offset\", (v) => Number(v))\n .option(\"--end <n>\", \"End offset\", (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(\"Delete a content version\")\n .argument(\"<sourceConnectionContentVersion>\", \"Content version id\")\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(\"List embeddings for a content version\")\n .argument(\"<sourceConnectionContentVersion>\", \"Content version id\")\n .option(\"--page <n>\", \"Page number\", (v) => Number(v))\n .option(\"--limit <n>\", \"Page size\", (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"],"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\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\\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 \"--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 fileName?: string;\n mimeType?: string;\n } = { file: bytes };\n if (opts.title !== undefined) uploadOpts.title = opts.title;\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 const streamFn = (client as any).runStreamingAgentAndWait as\n | undefined\n | ((agentId: string, body: unknown, opts?: { timeoutMs?: number }) => Promise<unknown>);\n if (!streamFn) {\n throw new Error(\n \"This version of @seclai/sdk does not support streaming agent runs yet. Upgrade @seclai/sdk to a version that includes runStreamingAgentAndWait.\"\n );\n }\n res = await streamFn(agentId, body, opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : undefined);\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(\n \"<agentId>\",\n \"Agent ID (accepted for backward compatibility; the API identifies runs globally by runId).\"\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 // Backward-compatible CLI: agentId is accepted but no longer required by the API.\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(\n \"<agentId>\",\n \"Agent ID (accepted for backward compatibility; the API identifies runs globally by runId).\"\n )\n .argument(\"<runId>\", \"Run ID to cancel/delete.\")\n .action(async (agentId: string, runId: string) => {\n await run(rt, async () => {\n const global = program.opts<GlobalOptions>();\n const client = createClient(global);\n // Backward-compatible CLI: agentId is accepted but no longer required by the API.\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\" +\n \"Use this when you already have a runId (for example from `agents runs list`) and don't want to supply an agentId.\"\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(\"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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seclai/cli",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Seclai Command Line Interface",
5
5
  "license": "MIT",
6
6
  "type": "module",