@openbkn/bkn-sdk 0.1.1-alpha.3 → 0.1.1-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json","../src/commands/admin.ts","../src/help/grouped-help.ts","../src/utils/org-tree.ts","../src/utils/output.ts","../src/commands/_shared.ts","../src/commands/auth.ts","../src/api/eacp-crypto.ts","../src/api/admin.ts","../src/commands/agent.ts","../src/commands/bkn.ts","../src/utils/bkn-validate.ts","../src/commands/call.ts","../src/commands/config.ts","../src/commands/context.ts","../src/commands/dataflow.ts","../src/commands/explore.ts","../src/commands/model.ts","../src/commands/resource.ts","../src/commands/skill.ts","../src/commands/toolbox.ts","../src/commands/trace.ts","../src/trace-ai/schema-validate.ts","../src/commands/vega.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `openbkn` — unified CLI for the BKN platform.\n * Thin shell: parse argv → call a resource → print. No business logic here.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { adminCommand } from \"./commands/admin.js\";\nimport { agentCommand } from \"./commands/agent.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { bknCommand } from \"./commands/bkn.js\";\nimport { callCommand } from \"./commands/call.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { contextCommand } from \"./commands/context.js\";\nimport { dataflowCommand } from \"./commands/dataflow.js\";\nimport { exploreCommand } from \"./commands/explore.js\";\nimport { modelCommand } from \"./commands/model.js\";\nimport { resourceCommand } from \"./commands/resource.js\";\nimport { skillCommand } from \"./commands/skill.js\";\nimport { toolCommand, toolboxCommand } from \"./commands/toolbox.js\";\nimport { traceCommand } from \"./commands/trace.js\";\nimport { vegaCommand } from \"./commands/vega.js\";\nimport { installGroupedHelp } from \"./help/grouped-help.js\";\nimport { formatError, toExitCode } from \"./utils/errors.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"openbkn\")\n .description(\"Operate the BKN platform from the CLI\")\n .version(pkg.version, \"-V, --version\", \"output the version number\")\n .option(\"--base-url <url>\", \"platform base URL (env: BKN_BASE_URL)\")\n .option(\"--token <value>\", \"access token (env: BKN_TOKEN)\")\n .option(\"--user <id|name>\", \"use specific user credentials (env: BKN_USER)\")\n .option(\"--json\", \"machine-readable JSON output\")\n .option(\"--compact\", \"single-line JSON output\")\n .option(\"--full\", \"human view: show all columns (default trims to the key ones)\")\n .option(\"--biz-domain <s>\", \"business domain (alias: -bd)\")\n .option(\"-k, --insecure\", \"skip TLS verification (dev / self-signed only)\")\n .showHelpAfterError();\n\n// Real commands.\nprogram.addCommand(authCommand());\nprogram.addCommand(callCommand());\nprogram.addCommand(configCommand());\nprogram.addCommand(vegaCommand());\nprogram.addCommand(bknCommand());\nprogram.addCommand(resourceCommand());\nprogram.addCommand(dataflowCommand());\nprogram.addCommand(contextCommand());\nprogram.addCommand(agentCommand());\nprogram.addCommand(modelCommand());\nprogram.addCommand(skillCommand());\nprogram.addCommand(toolboxCommand());\nprogram.addCommand(toolCommand());\nprogram.addCommand(traceCommand());\nprogram.addCommand(adminCommand());\nprogram.addCommand(exploreCommand());\n\n// Apply grouped help to the whole tree (after all commands are registered).\ninstallGroupedHelp(program);\n\n// Legacy `-bd` is a 2-char short flag commander can't declare; rewrite it to\n// the canonical `--biz-domain` before parsing (kweaver compatibility).\nconst argv = process.argv.map((a) => (a === \"-bd\" ? \"--biz-domain\" : a));\n\ntry {\n await program.parseAsync(argv);\n} catch (err) {\n console.error(formatError(err));\n process.exit(toExitCode(err));\n}\n","{\n \"name\": \"@openbkn/bkn-sdk\",\n \"version\": \"0.1.1-alpha.3\",\n \"description\": \"Unified TypeScript SDK + CLI for the BKN (Business Knowledge Network) platform.\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"bin\": {\n \"openbkn\": \"./dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\"dist\", \"README.md\", \"README.zh.md\", \"LICENSE\"],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/openbkn-ai/bkn-sdk.git\"\n },\n \"keywords\": [\"bkn\", \"openbkn\", \"knowledge-network\", \"cli\", \"sdk\", \"typescript\"],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"biome check . && tsc --noEmit\",\n \"format\": \"biome format --write .\",\n \"test\": \"vitest run\",\n \"test:cover\": \"vitest run --coverage\",\n \"ci\": \"npm run lint && npm test\",\n \"prepublishOnly\": \"npm run ci && npm run build\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.9.1\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"csv-parse\": \"^6.2.1\",\n \"js-yaml\": \"^4.2.0\",\n \"jszip\": \"^3.10.1\",\n \"zod\": \"^3.24.1\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^22.13.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","/**\n * `openbkn admin …` — the kweaver-admin operator CLI, nested as a subcommand.\n * Mapping is 1:1: `kweaver-admin <x>` → `openbkn admin <x>`. org/user/role\n * reads + writes (create/update/delete/reset-password) and org tree are real\n * and live-verified; operator `auth` reuses the top-level `openbkn auth`.\n */\nimport { Command } from \"commander\";\nimport { rawCall } from \"../api/call.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { activePlatform, setActivePlatform } from \"../config/store.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { renderOrgTree } from \"../utils/org-tree.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\nimport { registerAuthLeaves } from \"./auth.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function adminCommand(): Command {\n const admin = new Command(\"admin\").description(\n \"Operator CLI (kweaver-admin): org, user, role, models, audit\",\n );\n\n // Operator auth = the same leaves as top-level `openbkn auth` (1:1 nest).\n registerAuthLeaves(admin.command(\"auth\").description(\"Operator authentication\"));\n\n const org = admin.command(\"org\").description(\"Departments and org structure\");\n org\n .command(\"list\")\n .description(\"List departments\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgList({\n role: opts.role,\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"get <id>\")\n .description(\"Get one department\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.orgGet(id), outputOptions(cmd));\n });\n org\n .command(\"members <id>\")\n .description(\"List members of a department\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .option(\"--fields <s>\", \"fields segment\", \"users\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgMembers(id, {\n role: opts.role,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"create\")\n .description(\"Create a department\")\n .requiredOption(\"--name <s>\", \"department name\")\n .option(\"--parent <id>\", \"parent department id\", \"-1\")\n .option(\"--code <s>\", \"department code\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--email <s>\", \"email\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--status <n>\", \"status (1=enabled)\", int)\n .option(\"--oss-id <id>\", \"object-storage site id\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgCreate({\n name: opts.name,\n parentId: opts.parent,\n code: opts.code,\n remark: opts.remark,\n email: opts.email,\n managerID: opts.manager,\n status: opts.status,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"update <id>\")\n .description(\"Update a department (only provided fields change)\")\n .option(\"--name <s>\", \"new name\")\n .option(\"--code <s>\", \"department code\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--email <s>\", \"email\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--status <n>\", \"status (1=enabled)\", int)\n .option(\"--oss-id <id>\", \"object-storage site id\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgUpdate(id, {\n name: opts.name,\n code: opts.code,\n remark: opts.remark,\n email: opts.email,\n managerID: opts.manager,\n status: opts.status,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"delete <id>\")\n .description(\"Delete a department\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.orgDelete(id), outputOptions(cmd));\n });\n org\n .command(\"tree\")\n .description(\"Print the department hierarchy\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .action(async (opts, cmd: Command) => {\n const tree = await clientFrom(cmd).admin.orgTree(opts.role);\n const out = outputOptions(cmd);\n if (out.json) printJson(tree, out);\n else console.log(renderOrgTree(tree as Parameters<typeof renderOrgTree>[0]));\n });\n\n const user = admin.command(\"user\").description(\"User management\");\n user\n .command(\"list\")\n .description(\"List users\")\n .option(\"--org <id>\", \"filter by department id\")\n .option(\"--keyword <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userList({\n orgId: opts.org,\n name: opts.keyword,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"assign-role <user> <role>\")\n .description(\"Grant a role to a user\")\n .action(async (userId: string, roleId: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.addRoleMember(roleId, userId, \"user\"),\n outputOptions(cmd),\n );\n });\n user\n .command(\"revoke-role <user> <role>\")\n .description(\"Revoke a role from a user\")\n .action(async (userId: string, roleId: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.removeRoleMember(roleId, userId, \"user\"),\n outputOptions(cmd),\n );\n });\n user\n .command(\"get <id>\")\n .description(\"Get one user\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userGet(id), outputOptions(cmd));\n });\n user\n .command(\"roles <user>\")\n .description(\"List roles granted to a user\")\n .action(async (userId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userRoles(userId), outputOptions(cmd));\n });\n user\n .command(\"create\")\n .description(\"Create a user (gets the platform default password)\")\n .requiredOption(\"--login <name>\", \"login name\")\n .option(\"--display-name <s>\", \"display name (defaults to login name)\")\n .option(\"--email <s>\", \"email\")\n .option(\"--department <id>\", \"department id\", \"-1\")\n .option(\"--code <s>\", \"user code\")\n .option(\"--position <s>\", \"position\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--tel <s>\", \"telephone\")\n .option(\"--priority <n>\", \"priority\", int)\n .option(\"--csf-level <n>\", \"confidentiality level\", int)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userCreate({\n loginName: opts.login,\n displayName: opts.displayName,\n email: opts.email,\n departmentIds: opts.department ? [opts.department] : undefined,\n code: opts.code,\n position: opts.position,\n remark: opts.remark,\n telNumber: opts.tel,\n priority: opts.priority,\n csfLevel: opts.csfLevel,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"update <id>\")\n .description(\"Update a user (only provided fields change)\")\n .option(\"--display-name <s>\", \"display name\")\n .option(\"--email <s>\", \"email\")\n .option(\"--code <s>\", \"user code\")\n .option(\"--position <s>\", \"position\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--tel <s>\", \"telephone\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--idcard <s>\", \"id-card number\")\n .option(\"--priority <n>\", \"priority\", int)\n .option(\"--csf-level <n>\", \"confidentiality level\", int)\n .option(\"--csf-level2 <n>\", \"secondary confidentiality level\", int)\n .option(\"--expire-time <n>\", \"account expiry (epoch, -1 = never)\", int)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userUpdate(id, {\n displayName: opts.displayName,\n email: opts.email,\n code: opts.code,\n position: opts.position,\n remark: opts.remark,\n telNumber: opts.tel,\n managerID: opts.manager,\n priority: opts.priority,\n csfLevel: opts.csfLevel,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userDelete(id), outputOptions(cmd));\n });\n user\n .command(\"reset-password [id]\")\n .description(\"Reset a user's password (RSA-encrypted in transit)\")\n .option(\"--id <userId>\", \"explicit user UUID (alt to the positional id)\")\n .option(\"--user <account>\", \"resolve the user by account / login name\")\n .option(\"--password <s>\", \"the new password\")\n .option(\"--new-password <s>\", \"the new password (alias of --password)\")\n .option(\"--prompt-password\", \"prompt for the new password interactively\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string | undefined, opts, cmd: Command) => {\n const userId = id ?? opts.id ?? opts.user;\n const pwd = opts.password ?? opts.newPassword;\n if (!userId) throw new Error(\"Provide a user id (positional or --id).\");\n if (!pwd) throw new Error(\"Provide --password / --new-password.\");\n printJson(await clientFrom(cmd).admin.userResetPassword(userId, pwd), outputOptions(cmd));\n });\n\n const role = admin.command(\"role\").description(\"Role management\");\n role\n .command(\"list\")\n .description(\"List roles\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--source <s>\", \"role source filter (business | user)\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleList({ keyword: opts.keyword, limit: opts.limit }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"get <role>\")\n .description(\"Get a role by id\")\n .option(\"--view <mode>\", \"detail view mode\")\n .action(async (roleId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.roleGet(roleId), outputOptions(cmd));\n });\n role\n .command(\"members <role>\")\n .description(\"List members of a role\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--type <t>\", \"filter by member type (user|department|group|app)\")\n .option(\"--member <spec...>\", \"filter to specific member(s) '<type>:<id-or-name>'\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleMembers(roleId, {\n keyword: opts.keyword,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"add-member <role> <id>\")\n .description(\"Add a member to a role\")\n .option(\"--type <t>\", \"member type\", \"user\")\n .option(\"--member <spec...>\", \"member(s) as '<type>:<id-or-name>' (alt to <id>)\")\n .action(async (roleId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.addRoleMember(roleId, id, opts.type),\n outputOptions(cmd),\n );\n });\n role\n .command(\"remove-member <role> <id>\")\n .description(\"Remove a member from a role\")\n .option(\"--type <t>\", \"member type\", \"user\")\n .option(\"--member <spec...>\", \"member(s) as '<type>:<id-or-name>' (alt to <id>)\")\n .action(async (roleId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.removeRoleMember(roleId, id, opts.type),\n outputOptions(cmd),\n );\n });\n role\n .command(\"create\")\n .description(\"Create a custom role (bkn-safe; built-in roles are read-only)\")\n .requiredOption(\"--name <name>\", \"role name\")\n .option(\"--description <text>\", \"role description\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleCreate(opts.name, opts.description),\n outputOptions(cmd),\n );\n });\n role\n .command(\"update <role>\")\n .description(\"Update a custom role's name/description (403 on built-in)\")\n .option(\"--name <name>\", \"new name\")\n .option(\"--description <text>\", \"new description\")\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleUpdate(roleId, {\n name: opts.name,\n description: opts.description,\n }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"delete <role>\")\n .description(\"Delete a custom role (403 on built-in)\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (roleId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.roleDelete(roleId), outputOptions(cmd));\n });\n for (const [verb, grant] of [\n [\"grant-perm\", true],\n [\"revoke-perm\", false],\n ] as const) {\n role\n .command(`${verb} <role>`)\n .description(`${grant ? \"Grant\" : \"Revoke\"} a permission on a custom role (403 on built-in)`)\n .requiredOption(\"--resource-type <t>\", \"resource type (e.g. catalog)\")\n .option(\"--resource-id <id>\", \"resource id ('*' = whole type)\", \"*\")\n .requiredOption(\"--operations <list>\", \"comma-separated operations\")\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.rolePermission(\n roleId,\n grant,\n opts.resourceType,\n opts.resourceId,\n csv(opts.operations) ?? [],\n ),\n outputOptions(cmd),\n );\n });\n }\n\n // Models management reuses the (validated) mf-model-manager client. Granular\n // flags assemble the request body; `--body`/`--body-file` override wins.\n const modelBody = (opts: Record<string, unknown>): unknown => {\n if (opts.body || opts.bodyFile) return readBody(opts as { body?: string; bodyFile?: string });\n const mc: Record<string, unknown> = {};\n if (opts.apiModel) mc.api_model = opts.apiModel;\n if (opts.apiUrl) mc.api_url = opts.apiUrl;\n if (opts.apiBase) mc.api_url = opts.apiBase;\n if (opts.apiKey) mc.api_key = opts.apiKey;\n const body: Record<string, unknown> = {};\n if (opts.name) body.model_name = opts.name;\n if (opts.series) body.model_series = opts.series;\n if (opts.type) body.model_type = opts.type;\n if (opts.icon) body.icon = opts.icon;\n if (opts.embeddingDim !== undefined) body.model_dimensions = opts.embeddingDim;\n if (opts.maxTokens !== undefined) body.max_model_len = opts.maxTokens;\n if (opts.batchSize !== undefined) body.batch_size = opts.batchSize;\n if (Object.keys(mc).length > 0) body.model_config = mc;\n return body;\n };\n for (const kind of [\"llm\", \"small-model\"] as const) {\n const isLlm = kind === \"llm\";\n const m = admin.command(kind).description(`${kind} management`);\n const ns = isLlm ? \"llm\" : \"small\";\n\n const list = m\n .command(\"list\")\n .description(`List ${kind} models`)\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--page <n>\", \"page\", int, 1)\n .option(\"--size <n>\", \"page size\", int, DEFAULT_LIST_LIMIT);\n (isLlm\n ? list.option(\"--series <s>\", \"model series\")\n : list.option(\"--type <t>\", \"model type\")\n ).action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models[ns].list({\n name: opts.name,\n page: opts.page,\n limit: opts.size,\n modelType: opts.type,\n }),\n outputOptions(cmd),\n );\n });\n\n m.command(\"get <modelid>\")\n .description(`Get a ${kind} model`)\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].get(id), outputOptions(cmd));\n });\n\n const add = m\n .command(\"add\")\n .description(`Register a ${kind} model (granular flags or --body/--body-file)`)\n .option(\"--name <s>\", \"model name\")\n .option(\"--api-model <s>\", \"upstream API model id\")\n .option(\"--api-key <s>\", \"upstream API key\")\n .option(\"--body <json>\", \"model config JSON (overrides flags)\")\n .option(\"--body-file <path>\", \"read config JSON from a file\");\n if (isLlm) {\n add\n .option(\"--series <s>\", \"model series\")\n .option(\"--api-base <url>\", \"upstream API base URL\")\n .option(\"--icon <url>\", \"icon URL\");\n } else {\n add\n .option(\"--type <t>\", \"small-model type (embedding|reranker)\")\n .option(\"--api-url <url>\", \"upstream API URL\")\n .option(\"--embedding-dim <n>\", \"embedding dimensions\", int)\n .option(\"--max-tokens <n>\", \"max tokens\", int)\n .option(\"--batch-size <n>\", \"batch size\", int);\n }\n add.action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].add(modelBody(opts)), outputOptions(cmd));\n });\n\n const edit = m\n .command(\"edit <modelid>\")\n .description(`Edit a ${kind} model (granular flags or --body/--body-file)`)\n .option(\"--name <s>\", \"model name\")\n .option(\"--body <json>\", \"model config JSON (overrides flags)\")\n .option(\"--body-file <path>\", \"read config JSON from a file\");\n if (isLlm) {\n edit.option(\"--icon <url>\", \"icon URL\");\n } else {\n edit\n .option(\"--api-model <s>\", \"upstream API model id\")\n .option(\"--api-url <url>\", \"upstream API URL\");\n }\n edit.action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models[ns].edit({ model_id: id, ...(modelBody(opts) as object) }),\n outputOptions(cmd),\n );\n });\n\n m.command(\"delete <modelid...>\")\n .description(`Delete ${kind} model(s)`)\n .action(async (ids: string[], _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].delete(ids), outputOptions(cmd));\n });\n\n m.command(\"test <modelid>\")\n .description(`Test a ${kind} model`)\n .option(\"--body <json>\", \"test request JSON\")\n .option(\"--body-file <path>\", \"read test request JSON from a file\")\n .action(async (id: string, opts, cmd: Command) => {\n const body = opts.body || opts.bodyFile ? (readBody(opts) as object) : {};\n printJson(\n await clientFrom(cmd).models[ns].test({ model_id: id, ...body }),\n outputOptions(cmd),\n );\n });\n }\n\n admin\n .command(\"audit\")\n .description(\"Audit log queries\")\n .command(\"list\")\n .description(\"List login audit events\")\n .option(\"--user <name>\", \"filter by user\")\n .option(\"--start <time>\", \"start time\")\n .option(\"--end <time>\", \"end time\")\n .option(\"--page <n>\", \"page\", int, 1)\n .option(\"--size <n>\", \"page size\", int, 30)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.auditList({\n user: opts.user,\n start: opts.start,\n end: opts.end,\n page: opts.page,\n size: opts.size,\n }),\n outputOptions(cmd),\n );\n });\n const adminConfig = admin.command(\"config\").description(\"Admin CLI config (active platform)\");\n adminConfig\n .command(\"show\")\n .description(\"Show the active platform\")\n .action((_opts, cmd: Command) => {\n printJson({ baseUrl: activePlatform() }, outputOptions(cmd));\n });\n adminConfig\n .command(\"set <key> <value>\")\n .description(\"Set a config value (baseUrl)\")\n .action((key: string, value: string, _opts, cmd: Command) => {\n if (key !== \"baseUrl\") {\n throw new Error(`Unknown config key: ${key} (only baseUrl supported)`);\n }\n setActivePlatform(value.replace(/\\/+$/, \"\"));\n printJson({ ok: true, baseUrl: value }, outputOptions(cmd));\n });\n admin\n .command(\"call <url>\")\n .description(\"Operator API passthrough (curl-style; auto-injected auth)\")\n .option(\"-X, --request <method>\", \"HTTP method\")\n .option(\n \"-H, --header <header>\",\n 'extra header \"Name: value\" (repeatable)',\n (v, a: string[]) => {\n a.push(v);\n return a;\n },\n [] as string[],\n )\n .option(\"-d, --data <body>\", \"request body (JSON content-type if unset)\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const res = await rawCall(\n resolveContext({\n baseUrl: g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n }),\n url,\n { method: opts.request, header: opts.header, data: opts.data, businessDomain: g.bizDomain },\n );\n const out = outputOptions(cmd);\n try {\n printJson(JSON.parse(res.body), out);\n } catch {\n process.stdout.write(res.body.endsWith(\"\\n\") ? res.body : `${res.body}\\n`);\n }\n if (res.status >= 400) process.exitCode = 1;\n });\n\n return group(admin, \"OPERATOR\");\n}\n","/**\n * Grouped help formatter for commander — reproduces the legacy Kweaver layout\n * (section headers + USAGE / FLAGS) at every command level. One formatter, no\n * per-command help strings: each command carries a `group` tag read here.\n */\nimport type { Command, Help } from \"commander\";\n\nconst GROUP = Symbol(\"openbkn.group\");\nconst DEFAULT_GROUP = \"COMMANDS\";\n\n/** Tag a command with the help section it belongs to. Returns the command. */\nexport function group(cmd: Command, name: string): Command {\n (cmd as unknown as Record<symbol, string>)[GROUP] = name;\n return cmd;\n}\n\nfunction groupOf(cmd: Command): string {\n return (cmd as unknown as Record<symbol, string>)[GROUP] ?? DEFAULT_GROUP;\n}\n\nfunction formatHelp(cmd: Command, helper: Help): string {\n const out: string[] = [];\n const desc = helper.commandDescription(cmd);\n if (desc) out.push(desc, \"\");\n\n out.push(\"USAGE\", ` ${helper.commandUsage(cmd)}`, \"\");\n\n const subs = helper.visibleCommands(cmd);\n if (subs.length > 0) {\n const width = Math.max(...subs.map((c) => helper.subcommandTerm(c).length));\n const sections = new Map<string, Command[]>();\n for (const c of subs) {\n const g = groupOf(c);\n const bucket = sections.get(g);\n if (bucket) bucket.push(c);\n else sections.set(g, [c]);\n }\n for (const [name, cmds] of sections) {\n out.push(name);\n for (const c of cmds) {\n out.push(` ${helper.subcommandTerm(c).padEnd(width)} ${helper.subcommandDescription(c)}`);\n }\n out.push(\"\");\n }\n }\n\n const opts = helper.visibleOptions(cmd);\n if (opts.length > 0) {\n const width = Math.max(...opts.map((o) => helper.optionTerm(o).length));\n out.push(\"FLAGS\");\n for (const o of opts) {\n out.push(` ${helper.optionTerm(o).padEnd(width)} ${helper.optionDescription(o)}`);\n }\n out.push(\"\");\n }\n\n return out.join(\"\\n\");\n}\n\n/**\n * Apply the grouped formatter to a command and every descendant. Call AFTER all\n * subcommands are added — commander's `configureHelp` is per-command and is not\n * inherited through `addCommand`, so we set it on each node explicitly.\n */\nexport function installGroupedHelp(root: Command): void {\n const apply = (cmd: Command): void => {\n cmd.configureHelp({ formatHelp });\n for (const child of cmd.commands) apply(child);\n };\n apply(root);\n}\n","/** Build / render a department hierarchy from flat ISF search entries. */\nimport type { DeptEntry } from \"../api/admin.js\";\n\nexport interface OrgNode {\n id: string;\n name: string;\n children: OrgNode[];\n}\n\n/** Nest flat departments by their `parent_deps` chain (last dep = immediate parent). */\nexport function buildOrgTree(entries: DeptEntry[]): OrgNode[] {\n const nodes = new Map<string, OrgNode>();\n for (const e of entries) nodes.set(e.id, { id: e.id, name: e.name ?? e.id, children: [] });\n\n const roots: OrgNode[] = [];\n for (const e of entries) {\n const node = nodes.get(e.id);\n if (!node) continue;\n const deps = e.parent_deps;\n const parentId = deps && deps.length > 0 ? deps[deps.length - 1]?.id : undefined;\n const parent = parentId ? nodes.get(parentId) : undefined;\n if (parent) parent.children.push(node);\n else roots.push(node);\n }\n return roots;\n}\n\n/** Render a tree as indented text (`├── name (id: …)`). */\nexport function renderOrgTree(nodes: OrgNode[], prefix = \"\"): string {\n const lines: string[] = [];\n nodes.forEach((node, i) => {\n const last = i === nodes.length - 1;\n lines.push(`${prefix}${last ? \"└── \" : \"├── \"}${node.name} (id: ${node.id})`);\n if (node.children.length) {\n lines.push(renderOrgTree(node.children, `${prefix}${last ? \" \" : \"│ \"}`));\n }\n });\n return lines.join(\"\\n\");\n}\n","/** Output helpers: clean JSON for scripts, aligned plain columns for humans. */\nexport interface OutputOptions {\n /** Emit machine-readable JSON instead of a table. */\n json?: boolean;\n /** Single-line JSON (implies json). */\n compact?: boolean;\n /** Human view: show every column instead of the trimmed key set. */\n full?: boolean;\n}\n\n/**\n * Primary output sink. With `--json`/`--compact` (the equivalence path) it\n * prints JSON. Otherwise it renders a human table when the payload is a list of\n * objects (unwrapping common envelopes like `entries`/`data`/`cases`), falling\n * back to pretty JSON for single objects / scalars.\n */\nexport function printJson(value: unknown, opts: OutputOptions = {}): void {\n if (opts.json || opts.compact) {\n process.stdout.write(`${JSON.stringify(value, null, opts.compact ? 0 : 2)}\\n`);\n return;\n }\n const rows = toRows(value);\n if (rows) {\n // `--full` shows every non-empty column; default trims further. Hide the\n // footer count is measured against `--full` so all-empty columns (which\n // `--full` also drops) never inflate \"N more\".\n const fullColumns = columnsOf(rows).filter((c) => rows.some((r) => stringifyCell(r[c]) !== \"\"));\n const columns = opts.full ? fullColumns : selectColumns(rows);\n if (columns.length > 0) {\n printTable(rows, columns);\n const hidden = fullColumns.length - columns.length;\n if (hidden > 0 && !opts.full) {\n process.stdout.write(`… ${hidden} more column(s); use --full or --json for everything\\n`);\n }\n return;\n }\n }\n // A recognized list envelope that's simply empty → say so, not raw JSON.\n if (isEmptyEnvelope(value)) {\n process.stdout.write(\"(no results)\\n\");\n return;\n }\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/** True when value is `{ <envelope>: [] }` (an empty list response). */\nfunction isEmptyEnvelope(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const o = value as Record<string, unknown>;\n return ROW_ENVELOPES.some((k) => Array.isArray(o[k]) && (o[k] as unknown[]).length === 0);\n}\n\nconst ROW_ENVELOPES = [\n \"entries\",\n \"data\",\n \"cases\",\n \"reports\",\n \"results\",\n \"list\",\n \"recurringRules\",\n \"users\",\n \"roles\",\n \"departments\",\n \"members\",\n];\n\n/** Find the primary array-of-objects in a value (unwrapping common envelopes). */\nfunction toRows(value: unknown): Array<Record<string, unknown>> | null {\n const isRowArray = (v: unknown): v is Array<Record<string, unknown>> =>\n Array.isArray(v) &&\n v.length > 0 &&\n v.every((x) => x !== null && typeof x === \"object\" && !Array.isArray(x));\n if (isRowArray(value)) return value;\n if (value && typeof value === \"object\") {\n for (const key of ROW_ENVELOPES) {\n const inner = (value as Record<string, unknown>)[key];\n if (isRowArray(inner)) return inner;\n }\n }\n return null;\n}\n\n/** Column set = union of row keys, in first-seen order. */\nfunction columnsOf(rows: Array<Record<string, unknown>>): string[] {\n const seen: string[] = [];\n for (const row of rows) {\n for (const k of Object.keys(row)) if (!seen.includes(k)) seen.push(k);\n }\n return seen;\n}\n\n/** Max columns shown in the human view before truncating (use --full / --json). */\nconst MAX_COLS = 8;\n\n/** Audit/bookkeeping columns hidden by default — rarely the point of a list. */\nconst NOISE_COLS = new Set([\n \"creator\",\n \"updater\",\n \"create_by\",\n \"update_by\",\n \"create_user\",\n \"update_user\",\n \"operations\",\n \"status_message\",\n \"last_check_time\",\n \"last_discover_status\",\n \"health_check_result\",\n \"health_check_enabled\",\n]);\nconst isNoiseCol = (c: string) => NOISE_COLS.has(c) || /_time$/.test(c);\n\n/** Identity / key attributes a human scans for first. */\nconst isKeyCol = (c: string) =>\n /^(id|name|key|title|label)$/i.test(c) ||\n /_(id|name|key)$/i.test(c) ||\n /^(status|state|type|category|mode|enabled|version|branch)$/i.test(c);\n\n/**\n * Pick the columns worth showing a human: drop empty / nested-object / audit\n * columns, then order by usefulness (identity & key attributes first, long free\n * text last) and cap the count. The full record is always one `--full`/`--json`\n * away.\n */\nfunction selectColumns(rows: Array<Record<string, unknown>>): string[] {\n const isObj = (v: unknown) => v !== null && typeof v === \"object\" && !Array.isArray(v);\n const kept = columnsOf(rows).filter((c) => {\n if (isNoiseCol(c)) return false;\n const vals = rows.map((r) => r[c]);\n if (!vals.some((v) => stringifyCell(v) !== \"\")) return false; // all empty\n if (vals.every((v) => v === null || v === undefined || isObj(v))) return false; // nested objects\n return true;\n });\n // Long free-text (always truncated) is informative but bulky → push to the end.\n const isLongText = (c: string) =>\n rows.every((r) => {\n const s = stringifyCell(r[c]);\n return s === \"\" || s.length >= CELL_MAX - 1;\n });\n const rank = (c: string) => (isKeyCol(c) ? 0 : isLongText(c) ? 2 : 1);\n const ordered = kept\n .map((c, i) => ({ c, i, r: rank(c) }))\n .sort((a, b) => a.r - b.r || a.i - b.i) // stable: rank, then original order\n .map((x) => x.c);\n return ordered.slice(0, MAX_COLS);\n}\n\n/**\n * Print rows as space-aligned columns (no borders), or as JSON when\n * `--json`/`--compact` is set. Header row + left-aligned columns separated by\n * two spaces — readable without drawing an ASCII grid.\n */\nexport function printTable(\n rows: Array<Record<string, unknown>>,\n columns: string[],\n opts: OutputOptions = {},\n): void {\n if (opts.json || opts.compact) {\n printJson(rows, opts);\n return;\n }\n const cells = rows.map((row) => columns.map((c) => stringifyCell(row[c])));\n const widths = columns.map((col, i) =>\n Math.max(displayWidth(col), ...cells.map((r) => displayWidth(r[i] ?? \"\"))),\n );\n const fmt = (parts: string[]) =>\n parts\n .map((p, i) => (i === parts.length - 1 ? p : pad(p, widths[i] ?? 0)))\n .join(\" \")\n .trimEnd();\n const lines = [fmt(columns), ...cells.map(fmt)];\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nconst CELL_MAX = 48;\n\n/** Visual width counting East-Asian wide chars as 2 columns. */\nfunction displayWidth(s: string): number {\n let w = 0;\n for (const ch of s) w += /[ᄀ-ᅟ⺀-꓏가-힣豈-﫿︰-﹏＀-⦆¢-₩]/.test(ch) ? 2 : 1;\n return w;\n}\n\n/** Right-pad to a visual width (wide-char aware). */\nfunction pad(s: string, width: number): string {\n const gap = width - displayWidth(s);\n return gap > 0 ? s + \" \".repeat(gap) : s;\n}\n\nfunction stringifyCell(v: unknown): string {\n if (v === null || v === undefined) return \"\";\n // Arrays of scalars read better comma-joined than as JSON (e.g. tags).\n const raw =\n Array.isArray(v) && v.every((x) => x === null || typeof x !== \"object\")\n ? v.join(\",\")\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v);\n const s = raw.replace(/\\s+/g, \" \").trim();\n return s.length > CELL_MAX ? `${s.slice(0, CELL_MAX - 1)}…` : s;\n}\n","/** Helpers shared by command modules: client construction + output options. */\nimport { readFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { type BknClient, createClient } from \"../client.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport type { OutputOptions } from \"../utils/output.js\";\n\n/** Build a client from a command's merged (global + local) options. */\nexport function clientFrom(cmd: Command): BknClient {\n const o = cmd.optsWithGlobals();\n return createClient({\n baseUrl: o.baseUrl,\n token: o.token,\n user: o.user,\n businessDomain: o.bizDomain,\n insecure: o.insecure,\n });\n}\n\nexport function outputOptions(cmd: Command): OutputOptions {\n const o = cmd.optsWithGlobals();\n return { json: Boolean(o.json), compact: Boolean(o.compact), full: Boolean(o.full) };\n}\n\n/** Parse a comma-separated flag value into a trimmed string list. */\nexport function csv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Resolve a request body from `--body '<json>'` or `--body-file <path>`. */\nexport function readBody(opts: { body?: string; bodyFile?: string }): unknown {\n const raw = opts.bodyFile ? readFileSync(opts.bodyFile, \"utf8\") : opts.body;\n if (!raw) throw new InputError(\"Provide --body '<json>' or --body-file <path>.\");\n try {\n return JSON.parse(raw);\n } catch {\n throw new InputError(\"Request body is not valid JSON.\");\n }\n}\n","/** `openbkn auth …` — login / session / token (store-backed). */\nimport { createInterface } from \"node:readline\";\nimport { Command } from \"commander\";\nimport { changePasswordSafe } from \"../api/admin.js\";\nimport { getUserSafe } from \"../api/safe.js\";\nimport { decodeJwt } from \"../auth/jwt.js\";\nimport { credentialDeviceLogin, deviceLogin, fetchAuthStatus, openBrowser } from \"../auth/oauth.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport * as auth from \"../resources/auth.js\";\nimport { DEFAULT_BUSINESS_DOMAIN } from \"../types.js\";\nimport { HttpError, InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\n/** Best-effort: resolve the logged-in user's account name from their token. */\nasync function resolveAccount(\n baseUrl: string,\n accessToken: string,\n insecure: boolean,\n idToken?: string,\n): Promise<string | undefined> {\n const sub = decodeJwt(idToken ?? accessToken)?.sub;\n if (!sub) return undefined;\n try {\n const u = (await getUserSafe(\n { baseUrl, token: accessToken, businessDomain: DEFAULT_BUSINESS_DOMAIN, insecure },\n sub,\n )) as { account?: string };\n return u.account; // needs admin; ignored on 403 for non-admins\n } catch {\n return undefined;\n }\n}\n\n/** Prompt for a line on the TTY; when `hidden`, the typed characters are not echoed. */\nfunction promptLine(query: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n if (hidden) {\n // Swallow the echo of typed chars; print the query once up front.\n const mutable = rl as unknown as { _writeToOutput: (s: string) => void };\n mutable._writeToOutput = (s: string) => {\n if (s.startsWith(query)) process.stdout.write(query);\n };\n }\n rl.question(query, (answer) => {\n rl.close();\n if (hidden) process.stdout.write(\"\\n\");\n resolve(answer.trim());\n });\n });\n}\n\n/** Render saved sessions as a tree: platform → users, `*` marks the active one. */\nfunction renderSessions(items: auth.PlatformListItem[]): string {\n const byPlatform = new Map<string, auth.PlatformListItem[]>();\n for (const it of items) {\n const arr = byPlatform.get(it.baseUrl) ?? [];\n arr.push(it);\n byPlatform.set(it.baseUrl, arr);\n }\n const lines: string[] = [];\n for (const [platform, users] of byPlatform) {\n lines.push(platform);\n for (const u of users) lines.push(` ${u.active ? \"*\" : \" \"} ${u.username ?? u.userId}`);\n }\n return lines.join(\"\\n\") || \"(no saved sessions)\";\n}\n\n/** Register the auth leaves onto a parent (shared by top-level `auth` + `admin auth`). */\nexport function registerAuthLeaves(cmd: Command): void {\n cmd\n .command(\"login <url>\")\n .description(\"Log in to a platform (attach a token, or browser/password OAuth)\")\n .option(\"-u, --username <name>\", \"username for password signin\")\n .option(\"-p, --password <pwd>\", \"password for password signin\")\n .option(\"--token <token>\", \"provide a token directly (CI / headless)\")\n .option(\"--client-id <id>\", \"use a fixed OAuth2 client id (skip dynamic registration)\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret (omit for public/PKCE)\")\n .option(\"--port <n>\", \"loopback redirect port for the auth_code flow\", (v) =>\n Number.parseInt(v, 10),\n )\n .option(\"--device\", \"headless device-code login (RFC 8628) — no callback server, no password\")\n .option(\"--audience <aud>\", \"device-code token audience\", \"bkn-safe\")\n .option(\n \"--timeout <s>\",\n \"device-login wait before timing out\",\n (v) => Number.parseInt(v, 10),\n 120,\n )\n // Legacy ISF sign-in flags — accepted for compatibility, ignored by the\n // bkn-safe device-code flow.\n .option(\"--no-browser\", \"(legacy) print the URL instead of opening a browser\")\n .option(\"--product <name>\", \"(legacy) ISF OAuth product query\")\n .option(\"--signin-public-key-file <path>\", \"(legacy) RSA public key for ISF /oauth2/signin\")\n .option(\"--no-auth\", \"register the platform with no authentication (no bkn-safe)\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (g.insecure) process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n const out = outputOptions(cmd);\n const report = (r: {\n baseUrl?: string;\n userId?: string;\n username?: string;\n noAuth?: boolean;\n }) => {\n if (out.json || out.compact) {\n printJson({ loggedIn: true, ...r }, out);\n } else if (r.noAuth) {\n process.stdout.write(`Registered ${r.baseUrl ?? url} (no authentication)\\n`);\n } else {\n process.stdout.write(`Logged in to ${r.baseUrl ?? url} as ${r.username ?? r.userId}\\n`);\n }\n };\n const token = opts.token ?? g.token;\n if (token) {\n report(auth.attachToken(url, token, { insecure: g.insecure }));\n return;\n }\n // Explicit no-auth (open platform / no bkn-safe): store a tokenless session.\n if (opts.auth === false) {\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n // Auto-detect: the platform's install-status.json declares whether auth is\n // on. Disabled → register a tokenless session (no point in credentials).\n const authStatus = await fetchAuthStatus(url);\n if (authStatus && !authStatus.enabled) {\n process.stderr.write(\n `Platform auth is disabled (stack: ${authStatus.stack ?? \"none\"}) — registering without auth.\\n`,\n );\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n // All flows ride the device_code grant (the only seeded user client):\n // --device → print the URL/code; approve on any machine (headless).\n // -u/-p → CLI drives login/consent with the credentials (CI).\n // default → open the browser; user signs in + approves there.\n let tokens: Awaited<ReturnType<typeof deviceLogin>>;\n let account: string | undefined;\n try {\n if (opts.username || opts.password) {\n const username = opts.username ?? (await promptLine(\"Username: \"));\n account = username;\n const password = opts.password ?? (await promptLine(\"Password: \", true));\n tokens = await credentialDeviceLogin(url, username, password, {\n clientId: opts.clientId,\n audience: opts.audience,\n timeoutMs: opts.timeout * 1000,\n });\n } else {\n // open the browser unless headless (--device) or --no-browser.\n const openInBrowser = !opts.device && opts.browser !== false;\n tokens = await deviceLogin(url, {\n clientId: opts.clientId,\n audience: opts.audience,\n timeoutMs: opts.timeout * 1000,\n onPrompt: ({ userCode, verificationUri, verificationUriComplete }) => {\n const target = verificationUriComplete ?? verificationUri;\n process.stderr.write(\n `\\nOpen this URL to sign in and authorize:\\n ${target}\\nUser code: ${userCode}\\n`,\n );\n if (openInBrowser) openBrowser(target);\n process.stderr.write(\"Waiting for authorization…\\n\");\n },\n });\n }\n } catch (e) {\n // No device-auth endpoint → the platform has no auth stack (no bkn-safe).\n // Register a tokenless session instead of failing.\n if (e instanceof Error && /Device auth failed \\(404\\)/.test(e.message)) {\n process.stderr.write(\"No auth endpoint found — registering platform without auth.\\n\");\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n throw e;\n }\n // For browser/device logins (no -u), look the account name up so the\n // session list shows a name, not a UUID.\n if (!account) {\n account = await resolveAccount(\n url,\n tokens.accessToken,\n Boolean(g.insecure),\n tokens.idToken,\n );\n }\n report(\n auth.attachToken(url, tokens.accessToken, {\n refreshToken: tokens.refreshToken,\n idToken: tokens.idToken,\n insecure: g.insecure,\n username: account,\n }),\n );\n });\n\n cmd\n .command(\"status\")\n .description(\"Show base URL and whether a token is configured\")\n .action((_opts, cmd: Command) => printJson(auth.status(), outputOptions(cmd)));\n\n cmd\n .command(\"token\")\n .description(\"Print the current access token (keep secret)\")\n .action(() => {\n process.stdout.write(`${auth.currentToken()}\\n`);\n });\n\n cmd\n .command(\"whoami [url]\")\n .description(\"Show current user identity (from the token)\")\n .option(\"--no-lookup\", \"skip the backend identity fallback (eacp/user/get)\")\n .action((_url: string | undefined, _opts, cmd: Command) =>\n printJson(auth.whoami(), outputOptions(cmd)),\n );\n\n cmd\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List saved sessions (platform → users; * = active)\")\n .action((_opts, cmd: Command) => {\n const items = auth.listPlatforms();\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(items, out);\n else process.stdout.write(`${renderSessions(items)}\\n`);\n });\n\n cmd\n .command(\"use <url>\")\n .description(\"Switch the active platform\")\n .action((url: string, _opts, cmd: Command) => {\n auth.use(url);\n printJson(auth.status(), outputOptions(cmd));\n });\n\n cmd\n .command(\"logout\")\n .description(\"Remove the stored token for the active platform\")\n .action((_opts, cmd: Command) => printJson({ loggedOut: auth.logout() }, outputOptions(cmd)));\n\n cmd\n .command(\"delete <url>\")\n .description(\"Delete saved credentials for a platform\")\n .action((url: string, _opts, cmd: Command) =>\n printJson({ deleted: auth.deletePlatform(url) }, outputOptions(cmd)),\n );\n\n cmd\n .command(\"switch <url> <user>\")\n .description(\"Switch the active user for a platform (by username or user id)\")\n .action((url: string, user: string, _opts, cmd: Command) => {\n const r = auth.switchUser(url, user);\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(r, out);\n else process.stdout.write(`Switched to ${r.username ?? r.userId} on ${r.baseUrl}\\n`);\n });\n\n cmd\n .command(\"users <url>\")\n .description(\"List saved users for a platform (* = active)\")\n .action((url: string, _opts, cmd: Command) => {\n const norm = url.replace(/\\/+$/, \"\");\n const items = auth.listPlatforms().filter((i) => i.baseUrl === norm);\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(items, out);\n else process.stdout.write(`${renderSessions(items)}\\n`);\n });\n\n cmd\n .command(\"export\")\n .description(\"Export the active session's tokens (for a headless host)\")\n .action((_opts, cmd: Command) => {\n printJson(auth.exportCreds(), outputOptions(cmd));\n });\n\n cmd\n .command(\"change-password [url]\")\n .description(\"Change your account password (bkn-safe self-service; no browser)\")\n .option(\"-a, --account <name>\", \"account / login name (the login column, e.g. admin)\")\n .option(\"--old-password <pwd>\", \"current password\")\n .option(\"--new-password <pwd>\", \"new password\")\n .option(\"--public-key-file <path>\", \"(legacy) RSA public key for ISF password encryption\")\n .action(async (url: string | undefined, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (g.insecure) process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n const ctx = resolveContext({\n baseUrl: url ?? g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n });\n const account = opts.account ?? (await promptLine(\"Account: \"));\n const oldPassword = opts.oldPassword ?? (await promptLine(\"Current password: \", true));\n let newPassword = opts.newPassword;\n if (!newPassword) {\n newPassword = await promptLine(\"New password: \", true);\n const confirm = await promptLine(\"Confirm new password: \", true);\n if (newPassword !== confirm) throw new Error(\"New passwords do not match.\");\n }\n try {\n printJson(\n await changePasswordSafe(ctx, account, oldPassword, newPassword),\n outputOptions(cmd),\n );\n } catch (e) {\n // 401 here means bad account/old password, not a missing session;\n // 400 means the new password equals the old one.\n if (e instanceof HttpError && e.status === 401) {\n throw new InputError(\"Wrong account or current password.\");\n }\n if (e instanceof HttpError && e.status === 400) {\n throw new InputError(\"New password must differ from the current one.\");\n }\n throw e;\n }\n });\n}\n\nexport function authCommand(): Command {\n const cmd = new Command(\"auth\").description(\"Login, session, and token management\");\n registerAuthLeaves(cmd);\n return group(cmd, \"AUTHENTICATION & CONFIG\");\n}\n","/**\n * EACP password crypto. The UserManagement / EACP `modifypassword` endpoint\n * wants the password RSA-PKCS1-encrypted with a fixed 1024-bit public key, then\n * base64-encoded. That keypair is hard-coded in the ShareServer C++ binary\n * (`ncEACHttpServerUtil::RSADecrypt`) and shipped to every customer — it is NOT\n * a secret, just the agreed transport encoding. We embed the keypair and derive\n * the public half so the CLI can encrypt without a round-trip.\n */\nimport {\n constants,\n type KeyObject,\n createPrivateKey,\n createPublicKey,\n publicEncrypt,\n} from \"node:crypto\";\n\nconst EACP_MODIFYPWD_PRIVATE_KEY_PEM = `-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDB2fhLla9rMx+6LWTXajnK11Kdp520s1Q+TfPfIXI/7G9+L2YC\n4RA3M5rgRi32s5+UFQ/CVqUFqMqVuzaZ4lw/uEdk1qHcP0g6LB3E9wkl2FclFR0M\n+/HrWmxPoON+0y/tFQxxfNgsUodFzbdh0XY1rIVUIbPLvufUBbLKXHDPpwIDAQAB\nAoGBALCM/H6ajXFs1nCR903aCVicUzoS9qckzI0SIhIOPCfMBp8+PAJTSJl9/ohU\nYnhVj/kmVXwBvboxyJAmOcxdRPWL7iTk5nA1oiVXMer3Wby+tRg/ls91xQbJLVv3\noGSt7q0CXxJpRH2oYkVVlMMlZUwKz3ovHiLKAnhw+jEsdL2BAkEA9hA97yyeA2eq\nf9dMu/ici99R3WJRRtk4NEI4WShtWPyziDg48d3SOzYmhEJjPuOo3g1ze01os70P\nApE7d0qcyQJBAMmt+FR8h5MwxPQPAzjh/fTuTttvUfBeMiUDrIycK1I/L96lH+fU\ni4Nu+7TPOzExnPeGO5UJbZxrpIEUB7Zs8O8CQQCLzTCTGiNwxc5eMgH77kVrRudp\nQ7nv6ex/7Hu9VDXEUFbkdyULbj9KuvppPJrMmWZROw04qgNp02mayM8jeLXZAkEA\no+PM/pMn9TPXiWE9xBbaMhUKXgXLd2KEq1GeAbHS/oY8l1hmYhV1vjwNLbSNrH9d\nyEP73TQJL+jFiONHFTbYXwJAU03Xgum5mLIkX/02LpOrz2QCdfX1IMJk2iKi9osV\nKqfbvHsF0+GvFGg18/FXStG9Kr4TjqLsygQJT76/MnMluw==\n-----END RSA PRIVATE KEY-----`;\n\nlet cachedKey: KeyObject | undefined;\nfunction publicKey(): KeyObject {\n if (!cachedKey) cachedKey = createPublicKey(createPrivateKey(EACP_MODIFYPWD_PRIVATE_KEY_PEM));\n return cachedKey;\n}\n\n/** RSA-PKCS1 encrypt a password and base64-encode it for EACP/UserManagement. */\nexport function encryptModifyPwd(plain: string): string {\n const buf = publicEncrypt(\n { key: publicKey(), padding: constants.RSA_PKCS1_PADDING },\n Buffer.from(plain, \"utf8\"),\n );\n return buf.toString(\"base64\");\n}\n","import { decodeJwt } from \"../auth/jwt.js\";\n/**\n * Admin (operator) client — user-management + authorization. Mirrors\n * kweaver-admin. Reads and writes (org/user create/update/delete +\n * reset-password) implemented; org/user detail and writes go through ISFWeb\n * thrift where the REST routes are RegisterPrivate. Passed through as JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { encryptModifyPwd } from \"./eacp-crypto.js\";\nimport { request } from \"./http.js\";\n\nconst UM = \"/api/user-management/v1\";\nconst AUTHZ = \"/api/authorization/v1\";\nconst ISFWEB = \"/isfweb/api/ShareMgnt\";\n\n/**\n * The acting admin's UUID — required as a positional param by ShareMgnt user\n * writes. Prefer the JWT `sub` (id_token); when the token is opaque (Ory\n * `ory_at_…`), fall back to `GET /api/eacp/v1/user/get` (`userid`).\n */\nasync function callerUserId(ctx: RequestContext): Promise<string> {\n const sub = decodeJwt(ctx.token)?.sub;\n if (sub) return sub;\n const info = (await request(ctx, \"/api/eacp/v1/user/get\")) as { userid?: string };\n if (info?.userid) return info.userid;\n throw new Error(\n \"Cannot resolve the caller user id (token has no JWT `sub` and \" +\n \"eacp/v1/user/get returned no `userid`). Re-login.\",\n );\n}\n\n/**\n * ISFWeb thrift-style call: `POST /isfweb/api/ShareMgnt/<method>` with a\n * positional JSON array body. Business errors come back as HTTP 501 with\n * `{error:{errMsg,errID}}` — surface `errMsg` instead of \"501 Not Implemented\".\n */\nasync function shareMgnt(\n ctx: RequestContext,\n method: string,\n params: unknown[] = [],\n): Promise<unknown> {\n try {\n return await request(ctx, `${ISFWEB}/${method}`, { method: \"POST\", body: params });\n } catch (e) {\n if (e instanceof HttpError) {\n try {\n const parsed = JSON.parse(e.body) as { error?: { errMsg?: string; errID?: number } };\n const err = parsed?.error;\n if (err?.errMsg) {\n const m = err.errID !== undefined ? `${err.errMsg} (errID=${err.errID})` : err.errMsg;\n throw new Error(`ShareMgnt.${method} failed: ${m}`);\n }\n } catch (inner) {\n if (inner instanceof Error && inner.message.startsWith(\"ShareMgnt.\")) throw inner;\n }\n }\n throw e;\n }\n}\n\nconst DEPT_FIELDS = \"name,code,remark,manager,enabled,parent_deps,email\";\nconst USER_FIELDS = \"name,account,email,enabled,frozen,parent_deps,roles\";\n\nexport interface AdminListOptions {\n role?: string;\n offset?: number;\n limit?: number;\n name?: string;\n orgId?: string;\n}\n\n/** Departments (org structure) via the console search route. */\nexport function listDepartments(\n ctx: RequestContext,\n opts: AdminListOptions = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/console/search-departments/${DEPT_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface DeptEntry {\n id: string;\n name?: string;\n parent_deps?: Array<{ id: string; name?: string }>;\n}\n\n/** Fetch every department by paging the console search route (for tree building). */\nexport async function listAllDepartments(\n ctx: RequestContext,\n role = \"super_admin\",\n pageSize = 100,\n): Promise<DeptEntry[]> {\n const out: DeptEntry[] = [];\n let offset = 0;\n for (;;) {\n const data = (await listDepartments(ctx, { role, offset, limit: pageSize })) as {\n total_count?: number;\n entries?: DeptEntry[];\n };\n const entries = data.entries ?? [];\n out.push(...entries);\n if (entries.length < pageSize) break;\n if (data.total_count !== undefined && out.length >= data.total_count) break;\n offset += pageSize;\n }\n return out;\n}\n\n/** Users via the console search route (REST `/users` 404s on every deploy). */\nexport function listUsers(ctx: RequestContext, opts: AdminListOptions = {}): Promise<unknown> {\n return request(ctx, `${UM}/console/search-users/${USER_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n department_id: opts.orgId || undefined,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface ListRolesOptions {\n offset?: number;\n limit?: number;\n keyword?: string;\n}\n\nexport function listRoles(ctx: RequestContext, opts: ListRolesOptions = {}): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\nexport function getRole(ctx: RequestContext, roleId: string): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles/${encodeURIComponent(roleId)}`);\n}\n\n/**\n * One user's full info. UserManagement REST `/users/:id/:fields` rejects the\n * call (`invalid type` on `role`); the console uses ISFWeb thrift\n * `Usrm_GetUserInfo` with a positional `[id]` body, so we do the same.\n */\nexport function getUser(ctx: RequestContext, userId: string): Promise<unknown> {\n return shareMgnt(ctx, \"Usrm_GetUserInfo\", [userId]);\n}\n\n/**\n * Roles granted to a user. The Authorization `accessor_roles` route is\n * `RegisterPrivate` (404 on a public gateway); on 404 fall back to enumerating\n * roles and querying each role's members (cluster role counts are small).\n */\nexport async function getUserRoles(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n return await request(ctx, `${AUTHZ}/accessor_roles`, {\n query: { accessor_id: userId, accessor_type: \"user\" },\n });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n const rolesPage = (await listRoles(ctx, { offset: 0, limit: 200 })) as {\n entries?: Array<{ id: string; name?: string; description?: string }>;\n };\n const roles = rolesPage.entries ?? [];\n const matched: Array<{ id: string; name?: string; description?: string }> = [];\n await Promise.all(\n roles.map(async (role) => {\n const members = (await listRoleMembers(ctx, role.id, { offset: 0, limit: 500 })) as {\n entries?: Array<{ id: string; type?: string }>;\n };\n if (\n (members.entries ?? []).some((m) => m.id === userId && (!m.type || m.type === \"user\"))\n ) {\n matched.push(role);\n }\n }),\n );\n return {\n entries: matched,\n total_count: matched.length,\n route: \"fallback:list-roles+role-members\",\n };\n }\n}\n\n/**\n * One department's full info. The REST `/departments/:id/:fields` route is\n * `RegisterPrivate` (404 on a public gateway), so go straight to ISFWeb thrift:\n * try `Usrm_GetOrgDepartmentById` (root-level orgs), fall back to\n * `Usrm_GetDepartmentById` (sub-departments) on a \"not found\"-style error.\n */\nexport async function getDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n try {\n return await shareMgnt(ctx, \"Usrm_GetOrgDepartmentById\", [deptId]);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (!/部门不存在|errID:?\\s*20201|errID=?\\s*99|NoneType.+subscriptable/i.test(msg)) throw e;\n return shareMgnt(ctx, \"Usrm_GetDepartmentById\", [deptId]);\n }\n}\n\n/** Members of a department (public route, fields default to `users`). */\nexport function getDepartmentMembers(\n ctx: RequestContext,\n deptId: string,\n opts: { role?: string; offset?: number; limit?: number } = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/department-members/${encodeURIComponent(deptId)}/users`, {\n query: { role: opts.role ?? \"super_admin\", offset: opts.offset ?? 0, limit: opts.limit ?? 100 },\n });\n}\n\n// ---- department writes (ISFWeb thrift) -------------------------------------\n\nexport interface CreateOrgInput {\n name: string;\n parentId?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Create a department (`Usrm_AddDepartment`). Returns the new department id. */\nexport async function createDepartment(\n ctx: RequestContext,\n input: CreateOrgInput,\n): Promise<unknown> {\n const ncTAddDepartParam = {\n parentId: input.parentId ?? \"-1\",\n departName: input.name,\n managerID: input.managerID ?? null,\n code: input.code ?? \"\",\n remark: input.remark ?? \"\",\n status: input.status ?? 1,\n email: input.email ?? \"\",\n ossId: \"\",\n };\n const id = await shareMgnt(ctx, \"Usrm_AddDepartment\", [{ ncTAddDepartParam }]);\n return { id };\n}\n\nexport interface UpdateOrgInput {\n name?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Update a department (`Usrm_EditDepartment`); only provided fields are sent. */\nexport async function updateDepartment(\n ctx: RequestContext,\n deptId: string,\n input: UpdateOrgInput,\n): Promise<unknown> {\n const p: Record<string, unknown> = { departId: deptId };\n if (input.name !== undefined) p.departName = input.name;\n if (input.managerID !== undefined) p.managerID = input.managerID;\n if (input.code !== undefined) p.code = input.code;\n if (input.remark !== undefined) p.remark = input.remark;\n if (input.status !== undefined) p.status = input.status;\n if (input.email !== undefined) p.email = input.email;\n await shareMgnt(ctx, \"Usrm_EditDepartment\", [{ ncTEditDepartParam: p }]);\n return { id: deptId, updated: true };\n}\n\n/** Delete a department (`DELETE /management/departments/:id`). */\nexport async function deleteDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n await request(ctx, `${UM}/management/departments/${encodeURIComponent(deptId)}`, {\n method: \"DELETE\",\n });\n return { id: deptId, deleted: true };\n}\n\n// ---- user writes -----------------------------------------------------------\n\nexport interface CreateUserInput {\n loginName: string;\n displayName?: string;\n email?: string;\n departmentIds?: string[];\n code?: string;\n position?: string;\n remark?: string;\n telNumber?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Create a user (`Usrm_AddUser`). The thrift call does not accept a password —\n * the new user gets the platform default (forced change on first login).\n * Returns the new user id.\n */\nexport async function createUser(ctx: RequestContext, input: CreateUserInput): Promise<unknown> {\n const ncTUsrmUserInfo: Record<string, unknown> = {\n loginName: input.loginName,\n displayName: input.displayName ?? input.loginName,\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: null,\n managerDisplayName: null,\n remark: input.remark ?? \"\",\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n idcardNumber: \"\",\n departmentIds: input.departmentIds ?? [\"-1\"],\n priority: input.priority ?? 999,\n csfLevel2: null,\n pwdControl: false,\n expireTime: -1,\n };\n if (input.csfLevel !== undefined) ncTUsrmUserInfo.csfLevel = input.csfLevel;\n const id = await shareMgnt(ctx, \"Usrm_AddUser\", [\n { ncTUsrmAddUserInfo: { user: { ncTUsrmUserInfo } } },\n await callerUserId(ctx),\n ]);\n return { id };\n}\n\nexport interface UpdateUserInput {\n displayName?: string;\n code?: string;\n position?: string;\n remark?: string;\n email?: string;\n telNumber?: string;\n managerID?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Update mutable user fields. Tries the public REST route\n * `PATCH /management/users/:id` (snake_case body); on 404/405 falls back to\n * ISFWeb thrift `Usrm_EditUser` (needs the caller UUID).\n */\nexport async function updateUser(\n ctx: RequestContext,\n userId: string,\n input: UpdateUserInput,\n): Promise<unknown> {\n const restBody: Record<string, unknown> = {};\n if (input.displayName !== undefined) restBody.display_name = input.displayName;\n if (input.code !== undefined) restBody.code = input.code;\n if (input.position !== undefined) restBody.position = input.position;\n if (input.remark !== undefined) restBody.remark = input.remark;\n if (input.email !== undefined) restBody.email = input.email;\n if (input.telNumber !== undefined) restBody.tel_number = input.telNumber;\n if (input.managerID !== undefined) restBody.manager_id = input.managerID;\n if (input.priority !== undefined) restBody.priority = input.priority;\n if (input.csfLevel !== undefined) restBody.csf_level = input.csfLevel;\n try {\n const r = await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}`, {\n method: \"PATCH\",\n body: restBody,\n });\n return r ?? { id: userId, updated: true, route: \"rest\" };\n } catch (e) {\n if (!(e instanceof HttpError) || (e.status !== 404 && e.status !== 405)) throw e;\n const ncTEditUserParam = {\n id: userId,\n displayName: input.displayName ?? \"\",\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: input.managerID ?? \"\",\n remark: input.remark ?? \"\",\n idcardNumber: null,\n priority: input.priority ?? 999,\n csfLevel: input.csfLevel ?? 5,\n csfLevel2: null,\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n expireTime: -1,\n };\n await shareMgnt(ctx, \"Usrm_EditUser\", [{ ncTEditUserParam }, await callerUserId(ctx)]);\n return { id: userId, updated: true, route: \"shareMgnt\" };\n }\n}\n\n/** Delete a user (`DELETE /users/:id`, fallback ISFWeb thrift `Usrm_DelUser`). */\nexport async function deleteUser(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n await request(ctx, `${UM}/users/${encodeURIComponent(userId)}`, { method: \"DELETE\" });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n await shareMgnt(ctx, \"Usrm_DelUser\", [userId]);\n }\n return { id: userId, deleted: true };\n}\n\n/**\n * Admin reset of a user's password. RSA-PKCS1 encrypts the new password with\n * the built-in UserManagement key (`PUT /management/users/:id/password`).\n * No old password required for this admin route.\n */\nexport async function setUserPassword(\n ctx: RequestContext,\n userId: string,\n newPassword: string,\n): Promise<unknown> {\n await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}/password`, {\n method: \"PUT\",\n body: { password: encryptModifyPwd(newPassword) },\n });\n return { id: userId, passwordReset: true };\n}\n\nconst EACP = \"/api/eacp/v1\";\n\nexport interface AuditListOptions {\n page?: number;\n size?: number;\n user?: string;\n start?: string;\n end?: string;\n}\n\n/** Login audit events (EACP). */\nexport function listAuditLogs(ctx: RequestContext, opts: AuditListOptions = {}): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/login-log`, {\n method: \"POST\",\n body: {\n page_num: opts.page ?? 1,\n page_size: opts.size ?? 30,\n user_name: opts.user || undefined,\n start_time: opts.start || undefined,\n end_time: opts.end || undefined,\n },\n });\n}\n\n/**\n * Self-service password change via EACP (`POST /api/eacp/v1/auth1/modifypassword`).\n * Both passwords are RSA-PKCS1 encrypted + base64 (same key as reset-password).\n */\nexport function changePassword(\n ctx: RequestContext,\n account: string,\n oldPassword: string,\n newPassword: string,\n): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/modifypassword`, {\n method: \"POST\",\n body: {\n account,\n oldpwd: encryptModifyPwd(oldPassword),\n newpwd: encryptModifyPwd(newPassword),\n },\n });\n}\n\n/**\n * Self-service password change on bkn-safe (`POST /api/safe/v1/auth/change-password`).\n * Plaintext over TLS, no token (it's a pre-login credential change). 204 on\n * success; 401 wrong account/old password; 400 new == old.\n */\nexport async function changePasswordSafe(\n ctx: RequestContext,\n account: string,\n oldPassword: string,\n newPassword: string,\n): Promise<{ ok: true }> {\n await request(ctx, \"/api/safe/v1/auth/change-password\", {\n method: \"POST\",\n body: { account, old_password: oldPassword, new_password: newPassword },\n });\n return { ok: true };\n}\n\nexport type MemberType = \"user\" | \"department\" | \"group\" | \"app\";\n\nexport function listRoleMembers(\n ctx: RequestContext,\n roleId: string,\n opts: { offset?: number; limit?: number; keyword?: string } = {},\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\n/**\n * Add or remove role members. Both use POST; the verb is in the body\n * (`{method:\"POST\"|\"DELETE\", members:[{id,type}]}`).\n */\nexport function modifyRoleMembers(\n ctx: RequestContext,\n roleId: string,\n method: \"POST\" | \"DELETE\",\n members: Array<{ id: string; type: MemberType }>,\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n method: \"POST\",\n body: { method, members },\n });\n}\n","/** `openbkn agent …` — decision agents (read side + listings). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function agentCommand(): Command {\n const cmd = new Command(\"agent\").description(\"Agent CRUD, chat, sessions, publish\");\n\n cmd\n .command(\"list\")\n .description(\"List published agents\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--category-id <id>\", \"filter by category\")\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.list({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n categoryId: opts.categoryId,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"personal-list\")\n .description(\"List personal-space agents\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.personalList({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"category-list\")\n .description(\"List agent categories\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.categoryList(), outputOptions(cmd));\n });\n\n cmd\n .command(\"template-list\")\n .description(\"List published agent templates\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.templateList({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"template-get <id>\")\n .description(\"Get a published agent template\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.templateGet(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"get <id>\")\n .description(\"Get agent details\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.get(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"get-by-key <key>\")\n .description(\"Get an agent by key\")\n .action(async (key: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.getByKey(key), outputOptions(cmd));\n });\n\n cmd\n .command(\"create\")\n .description(\"Create an agent (--body-file <json> or --body '<json>')\")\n .option(\"--body <json>\", \"agent definition JSON\")\n .option(\"--body-file <path>\", \"read agent definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.create(readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"update <id>\")\n .description(\"Update an agent (--body-file <json> or --body '<json>')\")\n .option(\"--body <json>\", \"agent definition JSON\")\n .option(\"--body-file <path>\", \"read agent definition JSON from a file\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.update(id, readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <id>\")\n .description(\"Delete an agent\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"publish <id>\")\n .description(\"Publish an agent\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.publish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"unpublish <id>\")\n .description(\"Unpublish an agent\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.unpublish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"sessions <agent>\")\n .description(\"List conversations for an agent (by agent key)\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (agentKey: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).agents.sessions(agentKey, { size: opts.limit, page: opts.page }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"history <agent> <conversation-id>\")\n .description(\"Show message history for a conversation\")\n .action(async (agentKey: string, conversationId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.history(agentKey, conversationId), outputOptions(cmd));\n });\n\n cmd\n .command(\"chat <agent-id>\")\n .description(\"Chat with an agent (SSE streaming with --stream)\")\n .requiredOption(\"-m, --message <text>\", \"user message\")\n .option(\"--version <v>\", \"agent version\", \"v0\")\n .option(\"--conversation-id <id>\", \"continue an existing conversation\")\n .option(\"--stream\", \"stream the reply to stdout as it arrives\")\n .action(async (agentId: string, opts, cmd: Command) => {\n const client = clientFrom(cmd);\n if (opts.stream) {\n const res = await client.agents.chat(agentId, opts.message, {\n version: opts.version,\n conversationId: opts.conversationId,\n stream: true,\n onDelta: (t) => process.stdout.write(t),\n });\n process.stdout.write(\"\\n\");\n if (res.conversationId) console.error(`conversation_id: ${res.conversationId}`);\n return;\n }\n printJson(\n await client.agents.chat(agentId, opts.message, {\n version: opts.version,\n conversationId: opts.conversationId,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"trace <conversation-id>\")\n .description(\"Get trace spans for a conversation (agent-scoped alias of `trace get`)\")\n .action(async (conversationId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).trace.spans(conversationId), outputOptions(cmd));\n });\n\n const skill = cmd.command(\"skill\").description(\"Manage skills attached to an agent\");\n skill\n .command(\"list <agent-id>\")\n .description(\"List skill ids attached to an agent\")\n .action(async (agentId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.skillList(agentId), outputOptions(cmd));\n });\n skill\n .command(\"add <agent-id> <skill-ids>\")\n .description(\"Attach skill(s) to an agent (comma-joined ids)\")\n .action(async (agentId: string, ids: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.skillAdd(agentId, csv(ids) ?? []), outputOptions(cmd));\n });\n skill\n .command(\"remove <agent-id> <skill-ids>\")\n .description(\"Detach skill(s) from an agent (comma-joined ids)\")\n .action(async (agentId: string, ids: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).agents.skillRemove(agentId, csv(ids) ?? []),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n","/** `openbkn bkn …` — knowledge networks (kept identical to legacy `kweaver bkn`). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { validateBknDirectory } from \"../utils/bkn-validate.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { parseEmbeddingFields, parsePkMap } from \"../utils/pk-detection.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function bknCommand(): Command {\n const bkn = new Command(\"bkn\").description(\"Knowledge networks — list, query, schema, instances\");\n\n bkn\n .command(\"list\")\n .description(\"List knowledge networks\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--name-pattern <s>\", \"filter by name pattern\")\n .option(\"--tag <s>\", \"filter by tag\")\n .option(\"--sort <field>\", \"sort field\", \"update_time\")\n .option(\"--direction <dir>\", \"asc | desc\", \"desc\")\n .action(async (_opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const data = await clientFrom(cmd).kn.list({\n limit: o.limit,\n offset: o.offset,\n namePattern: o.namePattern,\n tag: o.tag,\n sort: o.sort,\n direction: o.direction,\n });\n printJson(data, outputOptions(cmd));\n });\n\n bkn\n .command(\"get <kn-id>\")\n .description(\"Get a knowledge network (use --stats or --export)\")\n .option(\"--stats\", \"include statistics\")\n .option(\"--export\", \"return the full export payload\")\n .action(async (knId: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).kn.get(knId, {\n stats: opts.stats,\n exportMode: opts.export,\n });\n printJson(data, outputOptions(cmd));\n });\n\n bkn\n .command(\"search <kn-id> <query>\")\n .description(\"Semantic search within a knowledge network\")\n .option(\"--max-concepts <n>\", \"max concepts to return\", int, 10)\n .option(\"--mode <mode>\", \"retrieval mode\", \"keyword_vector_retrieval\")\n .action(async (knId: string, query: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).kn.search(knId, query, {\n maxConcepts: opts.maxConcepts,\n mode: opts.mode,\n });\n printJson(data, outputOptions(cmd));\n });\n\n // Schema groups: real list; object-type/relation-type also get real CRUD.\n const schemaGroups: Array<\n [string, \"objectTypes\" | \"relationTypes\" | \"actionTypes\", \"objectType\" | \"relationType\" | null]\n > = [\n [\"object-type\", \"objectTypes\", \"objectType\"],\n [\"relation-type\", \"relationTypes\", \"relationType\"],\n [\"action-type\", \"actionTypes\", null],\n ];\n for (const [name, listMethod, crud] of schemaGroups) {\n const g = bkn.command(name).description(`${name} list/get/...`);\n g.command(\"list <kn-id>\")\n .description(`List ${name}s`)\n .option(\"--branch <b>\", \"branch\", \"main\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[listMethod](knId, { branch: opts.branch }),\n outputOptions(cmd),\n );\n });\n if (crud) {\n g.command(\"get <kn-id> <id>\")\n .description(`Get ${name}`)\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn[`${crud}Get`](knId, id), outputOptions(cmd));\n });\n g.command(\"create <kn-id>\")\n .description(`Create ${name} (--body / --body-file)`)\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[`${crud}Create`](knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n g.command(\"update <kn-id> <id>\")\n .description(`Update ${name} (--body / --body-file)`)\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[`${crud}Update`](knId, id, readBody(opts)),\n outputOptions(cmd),\n );\n });\n g.command(\"delete <kn-id> <id>\")\n .description(`Delete ${name}`)\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn[`${crud}Delete`](knId, id), outputOptions(cmd));\n });\n }\n }\n\n // Real action-type query + execute on the action-type group.\n const actionType = bkn.commands.find((c) => c.name() === \"action-type\");\n actionType\n ?.command(\"query <kn-id> <at-id>\")\n .description(\"Query an action type (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, atId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionTypeQuery(knId, atId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n actionType\n ?.command(\"execute <kn-id> <at-id>\")\n .description(\"Execute an action type (--body / --body-file envelope JSON)\")\n .option(\"--body <json>\", \"execution envelope JSON\")\n .option(\"--body-file <path>\", \"read envelope JSON from a file\")\n .action(async (knId: string, atId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionTypeExecute(knId, atId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n actionType\n ?.command(\"inputs <kn-id> <at-id>\")\n .description(\"Get an action type's input schema\")\n .action(async (knId: string, atId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionTypeInputs(knId, atId), outputOptions(cmd));\n });\n actionType\n ?.command(\"get <kn-id> <at-id>\")\n .description(\"Get an action type\")\n .action(async (knId: string, atId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionTypeGet(knId, atId), outputOptions(cmd));\n });\n\n // stats/export are aliases of `get --stats` / `get --export`.\n bkn\n .command(\"stats <kn-id>\")\n .description(\"Get knowledge-network statistics (alias for get --stats)\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.get(knId, { stats: true }), outputOptions(cmd));\n });\n bkn\n .command(\"export <kn-id>\")\n .description(\"Export a knowledge network (alias for get --export)\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.get(knId, { exportMode: true }), outputOptions(cmd));\n });\n\n // Real object-type instance query + properties (the rest are stubs above).\n const objectType = bkn.commands.find((c) => c.name() === \"object-type\");\n objectType\n ?.command(\"query <kn-id> <ot-id>\")\n .description(\"Query instances of an object type (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, otId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.objectTypeQuery(knId, otId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n objectType\n ?.command(\"properties <kn-id> <ot-id>\")\n .description(\"Get an object type's calculated properties\")\n .action(async (knId: string, otId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.objectTypeProperties(knId, otId), outputOptions(cmd));\n });\n\n bkn\n .command(\"create <name>\")\n .description(\"Create an (empty) knowledge network\")\n .option(\"--branch <b>\", \"branch\", \"main\")\n .action(async (name: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.create({ name, branch: opts.branch }), outputOptions(cmd));\n });\n\n bkn\n .command(\"update <kn-id>\")\n .description(\"Update a knowledge network (--body / --body-file)\")\n .option(\"--body <json>\", \"update body JSON\")\n .option(\"--body-file <path>\", \"read update body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.update(knId, readBody(opts)), outputOptions(cmd));\n });\n\n bkn\n .command(\"delete <kn-id>\")\n .description(\"Delete a knowledge network\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.delete(knId), outputOptions(cmd));\n });\n\n bkn\n .command(\"subgraph <kn-id>\")\n .description(\"Query a subgraph (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"subgraph query JSON\")\n .option(\"--body-file <path>\", \"read subgraph query JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.subgraph(knId, readBody(opts)), outputOptions(cmd));\n });\n\n const actionLog = bkn.command(\"action-log\").description(\"Action logs — list/get/cancel\");\n actionLog\n .command(\"list <kn-id>\")\n .description(\"List action logs\")\n .option(\"--status <s>\", \"filter by status\")\n .option(\"--action-type-id <id>\", \"filter by action type\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionLogs(knId, {\n status: opts.status,\n actionTypeId: opts.actionTypeId,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n actionLog\n .command(\"get <kn-id> <log-id>\")\n .description(\"Get an action log\")\n .action(async (knId: string, logId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionLog(knId, logId), outputOptions(cmd));\n });\n actionLog\n .command(\"cancel <kn-id> <log-id>\")\n .description(\"Cancel a running action\")\n .action(async (knId: string, logId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.cancelActionLog(knId, logId), outputOptions(cmd));\n });\n\n bkn\n .command(\"action-execution <kn-id> <execution-id>\")\n .description(\"Get action execution status\")\n .action(async (knId: string, execId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionExecution(knId, execId), outputOptions(cmd));\n });\n\n const metric = bkn.command(\"metric\").description(\"Metrics — query / dry-run\");\n metric\n .command(\"query <kn-id> <metric-id>\")\n .description(\"Query a metric's data (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, metricId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.metricQuery(knId, metricId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n metric\n .command(\"dry-run <kn-id>\")\n .description(\"Dry-run a metric definition (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"metric definition JSON\")\n .option(\"--body-file <path>\", \"read metric definition JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricDryRun(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"list <kn-id>\")\n .description(\"List metrics\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricList(knId), outputOptions(cmd));\n });\n metric\n .command(\"get <kn-id> <metric-id>\")\n .description(\"Get a metric\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricGet(knId, id), outputOptions(cmd));\n });\n metric\n .command(\"create <kn-id>\")\n .description(\"Create a metric (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricCreate(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"update <kn-id> <metric-id>\")\n .description(\"Update a metric (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.metricUpdate(knId, id, readBody(opts)),\n outputOptions(cmd),\n );\n });\n metric\n .command(\"delete <kn-id> <metric-id>\")\n .description(\"Delete a metric\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricDelete(knId, id), outputOptions(cmd));\n });\n metric\n .command(\"search <kn-id>\")\n .description(\"Search metrics (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricSearch(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"validate <kn-id>\")\n .description(\"Validate a metric definition (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricValidate(knId, readBody(opts)), outputOptions(cmd));\n });\n\n const cg = bkn.command(\"concept-group\").description(\"Concept groups — list/get\");\n cg.command(\"list <kn-id>\")\n .description(\"List concept groups\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroups(knId), outputOptions(cmd));\n });\n cg.command(\"get <kn-id> <cg-id>\")\n .description(\"Get a concept group\")\n .action(async (knId: string, cgId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroup(knId, cgId), outputOptions(cmd));\n });\n cg.command(\"create <kn-id>\")\n .description(\"Create a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupCreate(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"update <kn-id> <cg-id>\")\n .description(\"Update a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, cgId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupUpdate(knId, cgId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"delete <kn-id> <cg-id>\")\n .description(\"Delete a concept group\")\n .action(async (knId: string, cgId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroupDelete(knId, cgId), outputOptions(cmd));\n });\n cg.command(\"add-members <kn-id> <cg-id>\")\n .description(\"Add object types to a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, cgId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupAddMembers(knId, cgId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"remove-members <kn-id> <cg-id> <ot-ids>\")\n .description(\"Remove object types (comma-joined ids) from a concept group\")\n .action(async (knId: string, cgId: string, otIds: string, _o, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupRemoveMembers(knId, cgId, otIds),\n outputOptions(cmd),\n );\n });\n\n const sched = bkn.command(\"action-schedule\").description(\"Action schedules — list/get\");\n sched\n .command(\"list <kn-id>\")\n .description(\"List action schedules\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionSchedules(knId), outputOptions(cmd));\n });\n sched\n .command(\"get <kn-id> <schedule-id>\")\n .description(\"Get an action schedule\")\n .action(async (knId: string, sId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionSchedule(knId, sId), outputOptions(cmd));\n });\n sched\n .command(\"create <kn-id>\")\n .description(\"Create an action schedule (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleCreate(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"update <kn-id> <schedule-id>\")\n .description(\"Update an action schedule (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, sId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleUpdate(knId, sId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"set-status <kn-id> <schedule-id>\")\n .description(\"Set an action schedule's status (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, sId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleSetStatus(knId, sId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"delete <kn-id> <schedule-ids>\")\n .description(\"Delete action schedule(s) (comma-joined ids)\")\n .action(async (knId: string, ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionScheduleDelete(knId, ids), outputOptions(cmd));\n });\n\n const job = bkn.command(\"job\").description(\"Build jobs — list/get/tasks\");\n job\n .command(\"list <kn-id>\")\n .description(\"List jobs\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobs(knId), outputOptions(cmd));\n });\n job\n .command(\"get <kn-id> <job-id>\")\n .description(\"Get a job\")\n .action(async (knId: string, jobId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.job(knId, jobId), outputOptions(cmd));\n });\n job\n .command(\"tasks <kn-id> <job-id>\")\n .description(\"List a job's tasks\")\n .action(async (knId: string, jobId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobTasks(knId, jobId), outputOptions(cmd));\n });\n job\n .command(\"delete <kn-id> <job-ids>\")\n .description(\"Delete job(s) (comma-joined ids)\")\n .action(async (knId: string, ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobDelete(knId, ids), outputOptions(cmd));\n });\n\n bkn\n .command(\"push <directory>\")\n .description(\"Pack a BKN directory into a tar and import it as a knowledge network\")\n .option(\"--branch <name>\", \"target branch\", \"main\")\n .option(\"--build\", \"submit a Vega build task for each object type declaring a vector index\")\n .option(\n \"--embedding-model <id>\",\n \"embedding model id for declared vector indexes (with --build)\",\n )\n .action(async (dir: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.push(dir, {\n branch: opts.branch,\n build: Boolean(opts.build),\n embeddingModel: opts.embeddingModel,\n }),\n outputOptions(cmd),\n );\n });\n bkn\n .command(\"pull <kn-id> [directory]\")\n .description(\"Download a knowledge network as a BKN tar and extract it locally\")\n .option(\"--branch <name>\", \"source branch\", \"main\")\n .action(async (knId: string, dir: string | undefined, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.pull(knId, dir ?? knId, { branch: opts.branch }),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"relation-type-paths <kn-id>\")\n .description(\"Query relation-type paths between object types (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"request JSON\")\n .option(\"--body-file <path>\", \"read request JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.relationTypePaths(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"resources\")\n .description(\"List BKN-backend resources\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.bknResources(), outputOptions(cmd));\n });\n\n bkn\n .command(\"create-from-catalog <catalog-id>\")\n .description(\"Build a knowledge network from a Vega catalog's tables\")\n .requiredOption(\"--name <name>\", \"knowledge network name\")\n .option(\"--tables <list>\", \"comma-separated table names (default: all)\")\n .option(\"--pk-map <map>\", \"explicit primary keys: '<table>:<col>[,<table>:<col>...]'\")\n .option(\"--build\", \"submit a Vega build task per resource after creation\")\n .option(\n \"--embedding-fields <map>\",\n \"columns to vectorize per table (with --build): '<table>:<col>[+<col>...][,...]'\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id for the vector index (with --build)\")\n .option(\"--no-rollback\", \"keep a partially-created KN on failure\")\n .action(async (catalogId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.createFromCatalog({\n catalogId,\n name: opts.name,\n tables: csv(opts.tables),\n pkMap: opts.pkMap ? parsePkMap(opts.pkMap) : undefined,\n build: Boolean(opts.build),\n embeddingFields: opts.embeddingFields\n ? parseEmbeddingFields(opts.embeddingFields)\n : undefined,\n embeddingModel: opts.embeddingModel,\n noRollback: opts.rollback === false,\n onProgress: (m) => console.error(m),\n }),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"validate <directory>\")\n .description(\"Validate a local BKN directory's structure (offline)\")\n .action(async (dir: string, _opts, cmd: Command) => {\n const result = validateBknDirectory(dir);\n printJson(result, outputOptions(cmd));\n if (!result.valid) process.exitCode = 1;\n });\n\n bkn\n .command(\"create-from-csv <catalog-id>\")\n .description(\"Import CSV files into a Vega catalog, then build a KN from them\")\n .requiredOption(\"--files <glob>\", \"CSV paths (comma-separated or glob)\")\n .requiredOption(\"--name <name>\", \"knowledge network name\")\n .option(\"--table-prefix <s>\", \"prefix for derived table names\", \"\")\n .option(\"--batch-size <n>\", \"rows per insert batch\", int, 500)\n .option(\"--tables <list>\", \"subset of imported tables to include in the KN\")\n .option(\"--pk-map <map>\", \"explicit primary keys: '<table>:<col>[,...]'\")\n .option(\"--build\", \"submit a Vega build task per resource after creation\")\n .option(\n \"--embedding-fields <map>\",\n \"columns to vectorize per table (with --build): '<table>:<col>[+<col>...][,...]'\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id for the vector index (with --build)\")\n .option(\"--no-rollback\", \"keep a partially-created KN on failure\")\n .action(async (catalogId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.createFromCsv({\n catalogId,\n name: opts.name,\n files: opts.files,\n tablePrefix: opts.tablePrefix,\n batchSize: opts.batchSize,\n tables: csv(opts.tables),\n pkMap: opts.pkMap ? parsePkMap(opts.pkMap) : undefined,\n build: Boolean(opts.build),\n embeddingFields: opts.embeddingFields\n ? parseEmbeddingFields(opts.embeddingFields)\n : undefined,\n embeddingModel: opts.embeddingModel,\n noRollback: opts.rollback === false,\n onProgress: (m) => console.error(m),\n }),\n outputOptions(cmd),\n );\n });\n\n return group(bkn, \"AI DATA PLATFORM\");\n}\n","/**\n * Structural validation of a local BKN directory. This is a slim, dependency-free\n * check (the full `@kweaver-ai/bkn` network model is not vendored): it parses the\n * frontmatter of every `.bkn` file and verifies the network is internally\n * consistent enough to push — required files, well-formed frontmatter, object-type\n * name limits, unique ids, and relation endpoints that reference real object types.\n */\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\n// validateObjectName parity: ISF caps BKN object names at 40 utf-8 codepoints.\nexport const BKN_OBJECT_NAME_MAX_LENGTH = 40;\n\nexport interface ValidationResult {\n valid: boolean;\n dir: string;\n counts: { objectTypes: number; relationTypes: number; conceptGroups: number };\n errors: string[];\n warnings: string[];\n}\n\ninterface Frontmatter {\n type?: string;\n id?: string;\n name?: string;\n}\n\n/** Parse a leading `--- ... ---` YAML-ish frontmatter block (flat scalars only). */\nfunction parseFrontmatter(text: string): Frontmatter | null {\n if (!text.startsWith(\"---\")) return null;\n const end = text.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n const block = text.slice(3, end);\n const fm: Frontmatter = {};\n for (const line of block.split(\"\\n\")) {\n const m = line.match(/^\\s*(type|id|name)\\s*:\\s*(.+?)\\s*$/);\n if (m?.[1]) fm[m[1] as keyof Frontmatter] = m[2]?.replace(/^[\"']|[\"']$/g, \"\");\n }\n return fm;\n}\n\nfunction bknFiles(dir: string): string[] {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".bkn\"))\n .map((f) => join(dir, f));\n}\n\n/** Pull (source, target) object-type ids out of a relation file's Endpoint table. */\nfunction endpointRefs(text: string): Array<{ source: string; target: string }> {\n const refs: Array<{ source: string; target: string }> = [];\n const idx = text.indexOf(\"### Endpoint\");\n if (idx === -1) return refs;\n // Only the Endpoint section — stop at the next heading (e.g. Mapping Rules).\n const after = text.slice(idx + \"### Endpoint\".length);\n const next = after.indexOf(\"\\n###\");\n const section = next === -1 ? after : after.slice(0, next);\n for (const line of section.split(\"\\n\")) {\n const cells = line\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length < 2) continue;\n const [source, target] = cells;\n if (!source || !target) continue;\n if (/^source$/i.test(source) || /^-+$/.test(source)) continue; // header / divider\n refs.push({ source, target });\n }\n return refs;\n}\n\nexport function validateBknDirectory(dirPath: string): ValidationResult {\n const dir = resolve(dirPath);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n return {\n valid: false,\n dir,\n counts: { objectTypes: 0, relationTypes: 0, conceptGroups: 0 },\n errors: [`Not a directory: ${dir}`],\n warnings: [],\n };\n }\n\n // network.bkn — required, must declare a knowledge_network.\n const networkPath = join(dir, \"network.bkn\");\n if (!existsSync(networkPath)) {\n errors.push(\"Missing network.bkn at the BKN root.\");\n } else {\n const fm = parseFrontmatter(readFileSync(networkPath, \"utf8\"));\n if (!fm) errors.push(\"network.bkn has no frontmatter block.\");\n else {\n if (fm.type !== \"knowledge_network\")\n errors.push(`network.bkn type must be 'knowledge_network', got '${fm.type ?? \"\"}'.`);\n if (!fm.id) errors.push(\"network.bkn is missing 'id'.\");\n if (!fm.name) errors.push(\"network.bkn is missing 'name'.\");\n }\n }\n\n // Object types.\n const otIds = new Set<string>();\n const otFiles = bknFiles(join(dir, \"object_types\"));\n for (const file of otFiles) {\n const fm = parseFrontmatter(readFileSync(file, \"utf8\"));\n const rel = file.slice(dir.length + 1);\n if (!fm || fm.type !== \"object_type\") {\n errors.push(`${rel}: not a valid object_type (missing/wrong frontmatter type).`);\n continue;\n }\n if (!fm.id) errors.push(`${rel}: object_type missing 'id'.`);\n if (!fm.name) errors.push(`${rel}: object_type missing 'name'.`);\n if (fm.name && [...fm.name].length > BKN_OBJECT_NAME_MAX_LENGTH) {\n errors.push(\n `${rel}: object_type name exceeds ${BKN_OBJECT_NAME_MAX_LENGTH} codepoints ('${fm.name}').`,\n );\n }\n if (fm.id) {\n if (otIds.has(fm.id)) errors.push(`Duplicate object_type id '${fm.id}'.`);\n otIds.add(fm.id);\n }\n }\n\n // Relation types — validate frontmatter + endpoint references.\n const rtFiles = bknFiles(join(dir, \"relation_types\"));\n for (const file of rtFiles) {\n const text = readFileSync(file, \"utf8\");\n const fm = parseFrontmatter(text);\n const rel = file.slice(dir.length + 1);\n if (!fm || fm.type !== \"relation_type\") {\n errors.push(`${rel}: not a valid relation_type (missing/wrong frontmatter type).`);\n continue;\n }\n if (!fm.id) errors.push(`${rel}: relation_type missing 'id'.`);\n for (const { source, target } of endpointRefs(text)) {\n if (otIds.size > 0 && !otIds.has(source))\n warnings.push(`${rel}: endpoint source '${source}' is not a known object_type.`);\n if (otIds.size > 0 && !otIds.has(target))\n warnings.push(`${rel}: endpoint target '${target}' is not a known object_type.`);\n }\n }\n\n const cgFiles = bknFiles(join(dir, \"concept_groups\"));\n\n return {\n valid: errors.length === 0,\n dir,\n counts: {\n objectTypes: otFiles.length,\n relationTypes: rtFiles.length,\n conceptGroups: cgFiles.length,\n },\n errors,\n warnings,\n };\n}\n","/** `openbkn call`/`curl` — curl-style API passthrough with auth headers. */\nimport { Command } from \"commander\";\nimport { rawCall } from \"../api/call.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\nfunction collect(value: string, prev: string[]): string[] {\n prev.push(value);\n return prev;\n}\n\nexport function callCommand(): Command {\n const cmd = new Command(\"call\")\n .alias(\"curl\")\n .description(\"Call an API with curl-style flags and auto-injected auth headers\")\n .argument(\"<url>\", \"API path (e.g. /api/...) or absolute URL\")\n .option(\"-X, --request <method>\", \"HTTP method\")\n .option(\"-H, --header <header>\", 'extra header \"Name: value\" (repeatable)', collect, [])\n .option(\"-d, --data <body>\", \"request body (sets JSON content-type if unset)\")\n .option(\"--data-raw <body>\", \"alias for --data\")\n .option(\n \"-F, --form <field>\",\n \"multipart field key=value or key=@file (repeatable)\",\n collect,\n [],\n )\n .option(\"-v, --verbose\", \"print request line to stderr\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const ctx = resolveContext({\n baseUrl: g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n });\n const res = await rawCall(ctx, url, {\n method: opts.request,\n header: opts.header,\n data: opts.data ?? opts.dataRaw,\n form: opts.form,\n businessDomain: g.bizDomain,\n verbose: opts.verbose,\n });\n\n // Pretty-print JSON bodies; pass anything else through verbatim.\n const out = outputOptions(cmd);\n try {\n printJson(JSON.parse(res.body), out);\n } catch {\n process.stdout.write(res.body.endsWith(\"\\n\") ? res.body : `${res.body}\\n`);\n }\n if (res.status >= 400) process.exitCode = 1;\n });\n\n return group(cmd, \"AUTHENTICATION & CONFIG\");\n}\n","/** `openbkn config …` — active platform + per-platform business domain. */\nimport { Command } from \"commander\";\nimport {\n activePlatform,\n readPlatformConfig,\n setActivePlatform,\n writePlatformConfig,\n} from \"../config/store.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\nfunction requireActive(): string {\n const baseUrl = activePlatform();\n if (!baseUrl) throw new InputError(\"No active platform. Run `openbkn auth login <url>` first.\");\n return baseUrl;\n}\n\nexport function configCommand(): Command {\n const config = new Command(\"config\").description(\"Per-platform CLI configuration\");\n\n config\n .command(\"show\")\n .description(\"Show the active platform and business domain\")\n .action((_opts, cmd: Command) => {\n const baseUrl = activePlatform();\n printJson(\n {\n baseUrl,\n businessDomain: baseUrl ? readPlatformConfig(baseUrl).businessDomain : undefined,\n },\n outputOptions(cmd),\n );\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"Set a config value (baseUrl | businessDomain)\")\n .action((key: string, value: string, _opts, cmd: Command) => {\n if (key === \"baseUrl\") {\n setActivePlatform(value.replace(/\\/+$/, \"\"));\n } else if (key === \"businessDomain\") {\n writePlatformConfig(requireActive(), { businessDomain: value });\n } else {\n throw new InputError(`Unknown config key: ${key} (expected baseUrl | businessDomain)`);\n }\n printJson({ ok: true, key, value }, outputOptions(cmd));\n });\n\n config\n .command(\"set-bd <value>\")\n .description(\"Set the default business domain for the active platform\")\n .action((value: string, _opts, cmd: Command) => {\n const baseUrl = requireActive();\n writePlatformConfig(baseUrl, { businessDomain: value });\n printJson({ baseUrl, businessDomain: value }, outputOptions(cmd));\n });\n\n config\n .command(\"list-bd\")\n .description(\"List business domains (requires login)\")\n .action(() => {\n throw new InputError(\"Not yet implemented — requires backend business-domains API.\");\n });\n\n return group(config, \"AUTHENTICATION & CONFIG\");\n}\n","/** `openbkn context …` (alias of legacy context-loader) — MCP retrieval. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function contextCommand(): Command {\n const cmd = new Command(\"context\").description(\n \"Context loader (MCP) — schema discovery, instance query, skill recall\",\n );\n\n cmd\n .command(\"search-schema <kn-id> <query>\")\n .description(\"Search object/relation/action/metric schemas\")\n .option(\"--scope <list>\", \"comma-separated scopes (object,relation,action,metric)\")\n .option(\"--max <n>\", \"max concepts\", int)\n .action(async (knId: string, query: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).context.searchSchema(knId, query, {\n searchScope: opts.scope ? String(opts.scope).split(\",\") : undefined,\n maxConcepts: opts.max,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"query-object-instance <kn-id>\")\n .description(\"Query object instances (provide --args as JSON)\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n printJson(await clientFrom(cmd).context.queryObjectInstance(knId, args), outputOptions(cmd));\n });\n\n cmd\n .command(\"find-skills <kn-id> <object-type-id>\")\n .description(\"Recall skills for an object type\")\n .option(\"--top-k <n>\", \"max skills (1-20)\", int)\n .action(async (knId: string, otId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.findSkills(knId, otId, opts.topK),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"tools <kn-id>\")\n .description(\"List MCP tools\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.tools(knId), outputOptions(cmd));\n });\n\n cmd\n .command(\"tool-call <kn-id> <name>\")\n .description(\"Call any MCP tool directly (--args JSON)\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, name: string, opts, cmd: Command) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n printJson(await clientFrom(cmd).context.toolCall(knId, name, args), outputOptions(cmd));\n });\n\n cmd\n .command(\"resources <kn-id>\")\n .description(\"List MCP resources\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.resources(knId), outputOptions(cmd));\n });\n cmd\n .command(\"resource <kn-id> <uri>\")\n .description(\"Read one MCP resource by uri\")\n .action(async (knId: string, uri: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.resource(knId, uri), outputOptions(cmd));\n });\n cmd\n .command(\"templates <kn-id>\")\n .description(\"List MCP resource templates\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.templates(knId), outputOptions(cmd));\n });\n cmd\n .command(\"prompts <kn-id>\")\n .description(\"List MCP prompts\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.prompts(knId), outputOptions(cmd));\n });\n cmd\n .command(\"prompt <kn-id> <name>\")\n .description(\"Get one MCP prompt (--args JSON for prompt arguments)\")\n .option(\"--args <json>\", \"prompt arguments as JSON\")\n .action(async (knId: string, name: string, opts, cmd: Command) => {\n let args: Record<string, unknown> | undefined;\n if (opts.args) {\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n }\n printJson(await clientFrom(cmd).context.prompt(knId, name, args), outputOptions(cmd));\n });\n\n const jsonArgs = (raw: string): Record<string, unknown> => {\n try {\n return JSON.parse(raw);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n };\n cmd\n .command(\"query-instance-subgraph <kn-id>\")\n .description(\"Layer-2: query an instance subgraph across relation-type paths\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.queryInstanceSubgraph(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"get-logic-properties <kn-id>\")\n .description(\"Layer-3: compute logic-property values for instances\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.logicProperties(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"get-action-info <kn-id>\")\n .description(\"Layer-3: fetch action info / dynamic tools for an instance\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.actionInfo(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/** `openbkn dataflow …` — document/data flow workflows. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function dataflowCommand(): Command {\n const cmd = new Command(\"dataflow\").description(\"Dataflow document workflows — list, runs, logs\");\n\n cmd\n .command(\"list\")\n .description(\"List all dataflows\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).dataflows.list(), outputOptions(cmd));\n });\n\n cmd\n .command(\"runs <dagId>\")\n .description(\"List run records for one dataflow\")\n .option(\"--since <date>\", \"filter runs since a date\")\n .action(async (dagId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.runs(dagId, { since: opts.since }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"logs <dagId> <instanceId>\")\n .description(\"Show logs for one run\")\n .option(\"--page <n>\", \"page\", int, 0)\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (dagId: string, instanceId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.logs(dagId, instanceId, {\n page: opts.page,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"run <dagId>\")\n .description(\"Trigger a dataflow run from a remote file URL\")\n .requiredOption(\"--url <url>\", \"remote file URL\")\n .requiredOption(\"--name <name>\", \"file name\")\n .action(async (dagId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.run(dagId, opts.url, opts.name),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"create\")\n .description(\"Create a dataflow (DAG) from a full document body (--body / --body-file)\")\n .option(\"--body <json>\", \"dataflow document JSON\")\n .option(\"--body-file <path>\", \"read the dataflow document JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).dataflows.create(readBody(opts)), outputOptions(cmd));\n });\n\n const parseSet = (pairs: string[] | undefined): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const item of pairs ?? []) {\n const i = item.indexOf(\"=\");\n if (i > 0) out[item.slice(0, i)] = item.slice(i + 1);\n }\n return out;\n };\n cmd\n .command(\"templates\")\n .description(\"List available dataset/bkn/dataflow templates\")\n .action(async (_opts, cmd: Command) => {\n printJson(clientFrom(cmd).dataflows.templates(), outputOptions(cmd));\n });\n cmd\n .command(\"create-dataset\")\n .description(\"Create a dataset from a template (--template <name> --set k=v ...)\")\n .requiredOption(\"--template <name>\", \"template name\")\n .option(\n \"--set <kv...>\",\n \"set a template argument (key=value); repeatable\",\n (v, acc: string[]) => {\n acc.push(v);\n return acc;\n },\n [] as string[],\n )\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.createDataset(opts.template, parseSet(opts.set)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"create-bkn\")\n .description(\"Create a knowledge network from a template (--template <name> --set k=v ...)\")\n .requiredOption(\"--template <name>\", \"template name\")\n .option(\n \"--set <kv...>\",\n \"set a template argument (key=value); repeatable\",\n (v, acc: string[]) => {\n acc.push(v);\n return acc;\n },\n [] as string[],\n )\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.createBkn(opts.template, parseSet(opts.set)),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/**\n * `openbkn explore` — a minimal local web server exposing read-only JSON\n * endpoints for **bkn** and **vega** (no SPA bundle, no chat). Reuses the\n * configured client; meant for quick local data poking, not a full UI.\n */\nimport { type IncomingMessage, type ServerResponse, createServer } from \"node:http\";\nimport { Command } from \"commander\";\nimport type { BknClient } from \"../client.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { clientFrom } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\ntype Handler = (\n client: BknClient,\n query: URLSearchParams,\n body: Record<string, unknown>,\n) => Promise<unknown>;\n\n/** Route table: `${METHOD} ${pathname}` → handler. bkn + vega read paths only. */\nconst ROUTES: Record<string, Handler> = {\n \"GET /api/bkn/meta\": (c, q) => c.kn.get(req(q, \"knId\")),\n \"POST /api/bkn/search\": (c, _q, b) =>\n c.kn.search(str(b.knId), str(b.query), {\n maxConcepts: typeof b.maxConcepts === \"number\" ? b.maxConcepts : undefined,\n }),\n \"POST /api/bkn/instances\": (c, _q, b) =>\n c.kn.objectTypeQuery(str(b.knId), str(b.objectTypeId), b.body ?? {}),\n \"POST /api/bkn/subgraph\": (c, _q, b) => c.kn.subgraph(str(b.knId), b.body ?? b),\n \"POST /api/bkn/properties\": (c, _q, b) =>\n c.kn.objectTypeProperties(str(b.knId), str(b.objectTypeId)),\n \"GET /api/vega/catalogs\": (c) => c.vega.catalogs(),\n \"GET /api/vega/catalog\": (c, q) => c.vega.getCatalog(req(q, \"catalogId\")),\n \"GET /api/vega/catalog-resources\": (c, q) =>\n c.vega.catalogResources(req(q, \"catalogId\"), q.get(\"category\") ?? undefined),\n \"GET /api/vega/connector-types\": (c) => c.vega.connectorTypes(),\n \"POST /api/vega/query\": (c, _q, b) => c.resource.query(str(b.resourceId), b.options ?? {}),\n};\n\nfunction str(v: unknown): string {\n return typeof v === \"string\" ? v : String(v ?? \"\");\n}\nfunction req(q: URLSearchParams, key: string): string {\n const v = q.get(key);\n if (!v) throw new Error(`missing query param: ${key}`);\n return v;\n}\n\nfunction readBody(reqMsg: IncomingMessage): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n reqMsg.on(\"data\", (chunk) => {\n data += chunk;\n });\n reqMsg.on(\"end\", () => {\n if (!data.trim()) return resolve({});\n try {\n resolve(JSON.parse(data) as Record<string, unknown>);\n } catch {\n reject(new Error(\"invalid JSON body\"));\n }\n });\n reqMsg.on(\"error\", reject);\n });\n}\n\nconst INDEX = `<!doctype html><meta charset=\"utf-8\"><title>openbkn explore</title>\n<h1>openbkn explore</h1>\n<p>Read-only JSON endpoints for bkn + vega:</p>\n<ul>${Object.keys(ROUTES)\n .map((r) => `<li><code>${r}</code></li>`)\n .join(\"\")}</ul>`;\n\nexport function exploreCommand(): Command {\n const cmd = new Command(\"explore\").description(\n \"Start a local web server with read-only bkn + vega JSON endpoints\",\n );\n cmd\n .option(\"--port <n>\", \"port to listen on\", int, 7777)\n .option(\"--host <h>\", \"host to bind\", \"127.0.0.1\")\n .action(async (opts, command: Command) => {\n const client = clientFrom(command);\n const server = createServer((reqMsg, res) => {\n void handle(client, reqMsg, res);\n });\n server.listen(opts.port, opts.host, () => {\n console.error(`openbkn explore running at http://${opts.host}:${opts.port}/`);\n console.error(\"bkn + vega read endpoints only. Press Ctrl+C to stop.\");\n });\n });\n return group(cmd, \"FOUNDATION\");\n}\n\nasync function handle(\n client: BknClient,\n reqMsg: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const url = new URL(reqMsg.url ?? \"/\", \"http://localhost\");\n const method = reqMsg.method ?? \"GET\";\n if (method === \"GET\" && url.pathname === \"/\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(INDEX);\n return;\n }\n const handler = ROUTES[`${method} ${url.pathname}`];\n if (!handler) {\n res.writeHead(404, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n try {\n const body = method === \"GET\" ? {} : await readBody(reqMsg);\n const data = await handler(client, url.searchParams, body);\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify(data ?? null));\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));\n }\n}\n","/** `openbkn model …` — model factory (llm / small-model). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\n/** Management subcommands (add/edit/delete/test) wired to the model resource. */\nfunction addManagementCommands(parent: Command, kind: \"llm\" | \"small\"): void {\n parent\n .command(\"add\")\n .description(\"Register a model (definition JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"model definition JSON\")\n .option(\"--body-file <path>\", \"read model definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].add(readBody(opts)), outputOptions(cmd));\n });\n parent\n .command(\"edit\")\n .description(\"Update a model definition (JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"model definition JSON\")\n .option(\"--body-file <path>\", \"read model definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].edit(readBody(opts)), outputOptions(cmd));\n });\n parent\n .command(\"delete <model-ids>\")\n .description(\"Delete model(s) (comma-joined ids)\")\n .action(async (ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].delete(csv(ids) ?? []), outputOptions(cmd));\n });\n parent\n .command(\"test\")\n .description(\"Test a model's connectivity / inference (JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"test request JSON\")\n .option(\"--body-file <path>\", \"read test request JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].test(readBody(opts)), outputOptions(cmd));\n });\n}\n\nexport function modelCommand(): Command {\n const model = new Command(\"model\").description(\"Model factory — LLM / small-model CRUD + chat\");\n\n const llm = model.command(\"llm\").description(\"Large language models\");\n llm\n .command(\"list\")\n .description(\"List LLM models\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--type <t>\", \"model type filter\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.llm.list({\n name: opts.name,\n modelType: opts.type,\n limit: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n llm\n .command(\"get <modelId>\")\n .description(\"Get an LLM model\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models.llm.get(id), outputOptions(cmd));\n });\n llm\n .command(\"chat <modelId>\")\n .description(\"OpenAI-compatible chat completion\")\n .requiredOption(\"-m, --message <text>\", \"user message\")\n .option(\"--stream\", \"stream the reply token-by-token to stdout\")\n .action(async (id: string, opts, cmd: Command) => {\n const messages = [{ role: \"user\", content: opts.message }];\n if (opts.stream) {\n await clientFrom(cmd).models.llm.chatStream(id, messages, (t) => process.stdout.write(t));\n process.stdout.write(\"\\n\");\n return;\n }\n printJson(await clientFrom(cmd).models.llm.chat(id, messages), outputOptions(cmd));\n });\n addManagementCommands(llm, \"llm\");\n\n const small = model.command(\"small\").description(\"Small models (embedding / reranker)\");\n small\n .command(\"list\")\n .description(\"List small models\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--type <t>\", \"model type filter\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.list({\n name: opts.name,\n modelType: opts.type,\n limit: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n small\n .command(\"get <modelId>\")\n .description(\"Get a small model\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models.small.get(id), outputOptions(cmd));\n });\n small\n .command(\"embeddings <modelId>\")\n .description(\"Compute embeddings\")\n .requiredOption(\"-i, --input <text>\", \"comma-separated input texts\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.embeddings(id, csv(opts.input) ?? []),\n outputOptions(cmd),\n );\n });\n small\n .command(\"rerank <modelId>\")\n .description(\"Rerank documents against a query\")\n .requiredOption(\"-q, --query <text>\", \"query\")\n .requiredOption(\"-d, --documents <list>\", \"comma-separated documents\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.rerank(id, opts.query, csv(opts.documents) ?? []),\n outputOptions(cmd),\n );\n });\n addManagementCommands(small, \"small\");\n\n return group(model, \"MODELS & SKILLS\");\n}\n","/** `openbkn resource` (alias `res`) — vega-backend resources. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT, DEFAULT_QUERY_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function resourceCommand(): Command {\n const cmd = new Command(\"resource\")\n .alias(\"res\")\n .description(\"Resources — list, find, get, query, delete\");\n\n cmd\n .command(\"list\")\n .description(\"List resources under a catalog\")\n .option(\"--catalog-id <id>\", \"filter by catalog id\")\n .option(\"--datasource-id <id>\", \"alias of --catalog-id\")\n .option(\"--category <c>\", \"resource category (table | logicview | dataset)\")\n .option(\"--type <c>\", \"alias of --category\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.list({\n datasourceId: opts.catalogId ?? opts.datasourceId,\n category: opts.category ?? opts.type,\n limit: opts.limit,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"find\")\n .description(\"Search resources by name (fuzzy; --exact for strict)\")\n .requiredOption(\"--name <name>\", \"resource name to search\")\n .option(\"--exact\", \"exact name match\")\n .option(\"--catalog-id <id>\", \"limit to a catalog\")\n .option(\"--datasource-id <id>\", \"alias of --catalog-id\")\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.find(opts.name, {\n exact: opts.exact,\n datasourceId: opts.catalogId ?? opts.datasourceId,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"get <id>\")\n .description(\"Get resource details\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.get(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"query <id>\")\n .description(\"Fetch data rows from a resource\")\n .option(\"--limit <n>\", \"row limit\", int, DEFAULT_QUERY_LIMIT)\n .option(\"--offset <n>\", \"row offset\", int, 0)\n .option(\"--need-total\", \"include total count\")\n .action(async (id: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.query(id, {\n limit: opts.limit,\n offset: opts.offset,\n needTotal: opts.needTotal,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <id>\")\n .description(\"Delete a resource\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.delete(id), outputOptions(cmd));\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/** `openbkn skill …` — skill registry and market. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function skillCommand(): Command {\n const cmd = new Command(\"skill\").description(\"Skill registry and market\");\n\n const listOpts = (c: Command) =>\n c\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--source <s>\", \"filter by source\")\n .option(\"--status <s>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1);\n\n listOpts(cmd.command(\"list\").description(\"List skills\"))\n .option(\"--create-user <s>\", \"filter by creator\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.list({\n name: opts.name,\n source: opts.source,\n status: opts.status,\n createUser: opts.createUser,\n pageSize: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"get <skill-id>\")\n .description(\"Get a skill by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.get(id), outputOptions(cmd));\n });\n\n listOpts(cmd.command(\"market\").description(\"Browse the skill market\")).action(\n async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.market({\n name: opts.name,\n source: opts.source,\n pageSize: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n },\n );\n\n cmd\n .command(\"market-get <skill-id>\")\n .description(\"Get a market skill by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.marketGet(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <skill-id>\")\n .description(\"Delete a skill\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"content <skill-id>\")\n .description(\"Read a skill's SKILL.md content index\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.content(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"read-file <skill-id> <rel-path>\")\n .description(\"Read a file inside a skill (progressive)\")\n .action(async (id: string, relPath: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.readFile(id, relPath), outputOptions(cmd));\n });\n\n cmd\n .command(\"history <skill-id>\")\n .description(\"Show a skill's version history\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.history(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"set-status <skill-id> <status>\")\n .description(\"Change status: unpublish | published | offline\")\n .action(async (id: string, status: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.setStatus(id, status as \"unpublish\" | \"published\" | \"offline\"),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"register <directory>\")\n .description(\"Zip a local skill directory and register it\")\n .option(\"--source <s>\", \"source tag\")\n .option(\"--extend-info <json>\", \"extra metadata as JSON\")\n .action(async (dir: string, opts, cmd: Command) => {\n const extendInfo = opts.extendInfo ? JSON.parse(opts.extendInfo) : undefined;\n printJson(\n await clientFrom(cmd).skills.register(dir, { source: opts.source, extendInfo }),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"download <skill-id> [out-path]\")\n .description(\"Download a skill archive to a local .zip\")\n .action(async (skillId: string, outPath: string | undefined, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.download(skillId, outPath), outputOptions(cmd));\n });\n cmd\n .command(\"install <skill-id> [directory]\")\n .description(\"Download a skill archive and extract it locally\")\n .action(async (skillId: string, dir: string | undefined, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.install(skillId, dir), outputOptions(cmd));\n });\n cmd\n .command(\"update-metadata <skill-id>\")\n .description(\"Update a skill's metadata (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"metadata JSON\")\n .option(\"--body-file <path>\", \"read metadata JSON from a file\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.updateMetadata(skillId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"update-package <skill-id> <directory>\")\n .description(\"Replace a skill's package from a local directory\")\n .action(async (skillId: string, dir: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.updatePackage(skillId, dir), outputOptions(cmd));\n });\n\n cmd\n .command(\"republish <skill-id>\")\n .description(\"Republish a previous skill version\")\n .requiredOption(\"--version <v>\", \"version to republish\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.republish(skillId, opts.version), outputOptions(cmd));\n });\n cmd\n .command(\"publish-history <skill-id>\")\n .description(\"Publish a historical skill version\")\n .requiredOption(\"--version <v>\", \"version to publish\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.publishHistory(skillId, opts.version),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"MODELS & SKILLS\");\n}\n","/** `openbkn toolbox …` and `openbkn tool …` — agent toolboxes + tools. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function toolboxCommand(): Command {\n const cmd = new Command(\"toolbox\").description(\"Agent toolbox lifecycle\");\n\n cmd\n .command(\"list\")\n .description(\"List toolboxes\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.list({\n keyword: opts.keyword,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"create\")\n .description(\"Create a toolbox\")\n .requiredOption(\"--name <name>\", \"toolbox name\")\n .requiredOption(\"--service-url <url>\", \"tool service URL\")\n .option(\"--description <d>\", \"description\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.create({\n name: opts.name,\n serviceUrl: opts.serviceUrl,\n description: opts.description,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"publish <box-id>\")\n .description(\"Publish a toolbox\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.publish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"unpublish <box-id>\")\n .description(\"Unpublish a toolbox (status=draft)\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.unpublish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <box-id>\")\n .description(\"Delete a toolbox\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"export <box-id>\")\n .description(\"Export a toolbox config to a local .adp file\")\n .requiredOption(\"-o, --out <file>\", \"output .adp path\")\n .option(\"--type <t>\", \"impex type: toolbox | mcp | operator\", \"toolbox\")\n .action(async (boxId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.export(boxId, opts.out, opts.type),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"import <file>\")\n .description(\"Import a toolbox config from a local .adp file\")\n .option(\"--type <t>\", \"impex type: toolbox | mcp | operator\", \"toolbox\")\n .action(async (file: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.import(file, opts.type), outputOptions(cmd));\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n\nexport function toolCommand(): Command {\n const cmd = new Command(\"tool\").description(\"Tools inside a toolbox\");\n\n cmd\n .command(\"list\")\n .description(\"List tools in a toolbox\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.tools(opts.toolbox), outputOptions(cmd));\n });\n\n cmd\n .command(\"enable <tool-ids...>\")\n .description(\"Enable one or more tools\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (toolIds: string[], opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.setToolStatus(opts.toolbox, toolIds, \"enabled\"),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"disable <tool-ids...>\")\n .description(\"Disable one or more tools\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (toolIds: string[], opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.setToolStatus(opts.toolbox, toolIds, \"disabled\"),\n outputOptions(cmd),\n );\n });\n\n const invokeOpts = (c: Command) =>\n c\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .option(\"--body <json>\", \"request body JSON\")\n .option(\"--header <json>\", \"headers map JSON\")\n .option(\"--query <json>\", \"query params JSON\")\n .option(\"--path <json>\", \"path params JSON\")\n .option(\"--timeout <s>\", \"per-call timeout seconds\", int);\n\n const parseJson = (s: string | undefined, label: string): Record<string, unknown> | undefined => {\n if (!s) return undefined;\n try {\n return JSON.parse(s);\n } catch {\n throw new InputError(`--${label} must be valid JSON`);\n }\n };\n\n const buildEnvelope = (opts: Record<string, string | undefined>) => ({\n body: opts.body ? JSON.parse(opts.body) : undefined,\n header: parseJson(opts.header, \"header\"),\n query: parseJson(opts.query, \"query\"),\n path: parseJson(opts.path, \"path\"),\n timeout: opts.timeout ? Number(opts.timeout) : undefined,\n });\n\n invokeOpts(\n cmd.command(\"execute <tool-id>\").description(\"Invoke a published+enabled tool\"),\n ).action(async (toolId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.execute(opts.toolbox, toolId, buildEnvelope(opts)),\n outputOptions(cmd),\n );\n });\n invokeOpts(\n cmd.command(\"debug <tool-id>\").description(\"Invoke a tool (draft/disabled too)\"),\n ).action(async (toolId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.debug(opts.toolbox, toolId, buildEnvelope(opts)),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"upload <file>\")\n .description(\"Upload a tool definition file (OpenAPI spec) into a toolbox\")\n .requiredOption(\"--toolbox <id>\", \"target toolbox id\")\n .option(\"--metadata-type <t>\", \"metadata type\", \"openapi\")\n .action(async (file: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.upload(opts.toolbox, file, opts.metadataType),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n","/** `openbkn trace …` — trace data (search/get) + diagnose + eval-set. */\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { renderReportMarkdown } from \"../trace-ai/diagnose.js\";\nimport { validateSchemaFile } from \"../trace-ai/schema-validate.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nexport function traceCommand(): Command {\n const cmd = new Command(\"trace\").description(\n \"Trace AI — fetch spans, diagnose (symbolic + LLM rubric), scan, eval-set, schema validate\",\n );\n\n cmd\n .command(\"get <conversation-id>\")\n .description(\"Fetch all trace spans for a conversation\")\n .option(\"--max-spans <n>\", \"max spans\", (v) => Number.parseInt(v, 10))\n .action(async (conversationId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).trace.spans(conversationId, { maxSpans: opts.maxSpans }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"search\")\n .description(\"Raw trace search (--body / --body-file OpenSearch JSON)\")\n .option(\"--body <json>\", \"search body JSON\")\n .option(\"--body-file <path>\", \"read search body JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).trace.search(readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"diagnose <conversation-id>\")\n .description(\"Diagnose a conversation's trace (symbolic rules; --llm adds rubric judging)\")\n .option(\"--llm\", \"also run LLM-judged rubric rules via the local `claude` CLI\")\n .action(async (conversationId: string, opts, cmd: Command) => {\n const report = await clientFrom(cmd).trace.diagnose(conversationId, {\n llm: Boolean(opts.llm),\n });\n const out = outputOptions(cmd);\n if (out.json) printJson(report, out);\n else console.log(renderReportMarkdown(report));\n });\n\n cmd\n .command(\"scan <conversation-ids>\")\n .description(\"Batch-diagnose several conversations (comma-joined) + aggregate findings\")\n .option(\"--llm\", \"hybrid mode (rubric + synthesizer) per trace via local `claude`\")\n .action(async (ids: string, opts, cmd: Command) => {\n const list = ids\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n printJson(\n await clientFrom(cmd).trace.scan(list, { llm: Boolean(opts.llm) }),\n outputOptions(cmd),\n );\n });\n\n const evalSet = cmd.command(\"eval-set\").description(\"Build + run trace eval sets\");\n evalSet\n .command(\"build <queries-file>\")\n .description(\"Build eval cases from a queries JSON file\")\n .option(\"--out <file>\", \"write the cases JSON here (default: stdout)\")\n .action(async (queriesFile: string, opts, cmd: Command) => {\n const raw = JSON.parse(readFileSync(queriesFile, \"utf8\"));\n const cases = clientFrom(cmd).trace.evalSetBuild(raw);\n if (opts.out) {\n writeFileSync(opts.out, JSON.stringify({ cases }, null, 2));\n printJson({ out: opts.out, cases: cases.length }, outputOptions(cmd));\n } else {\n printJson({ cases }, outputOptions(cmd));\n }\n });\n evalSet\n .command(\"test <cases-file>\")\n .description(\"Run an eval set against an agent (--llm enables semantic_match)\")\n .requiredOption(\"--agent <id>\", \"agent id to run the queries against\")\n .option(\"--version <v>\", \"agent version\", \"v0\")\n .option(\"--llm\", \"enable semantic_match assertions via the local `claude` CLI\")\n .action(async (casesFile: string, opts, cmd: Command) => {\n const raw = JSON.parse(readFileSync(casesFile, \"utf8\"));\n const cases = clientFrom(cmd).trace.evalSetBuild(raw);\n const result = await clientFrom(cmd).trace.evalSetTest(opts.agent, cases, {\n version: opts.version,\n llm: Boolean(opts.llm),\n });\n printJson(result, outputOptions(cmd));\n if (result.failed > 0) process.exitCode = 1;\n });\n\n const schema = cmd.command(\"schema\").description(\"Validate eval-set / diagnosis-rule files\");\n schema\n .command(\"validate <file>\")\n .description(\"Validate an eval-set or diagnosis-rule file (JSON/YAML) against its schema\")\n .option(\"--kind <k>\", \"force schema kind: eval-set | rule (default: auto-detect)\")\n .action(async (file: string, opts, cmd: Command) => {\n const result = validateSchemaFile(file, opts.kind);\n printJson(result, outputOptions(cmd));\n if (!result.valid) process.exitCode = 1;\n });\n\n return group(cmd, \"TRACE AI\");\n}\n","/**\n * `trace schema validate` — validate a local eval-set or diagnosis-rule file\n * (JSON or YAML) against a zod schema. Catches malformed cases/rules before\n * `eval-set test` runs them or before a custom rule is shipped.\n */\nimport { readFileSync } from \"node:fs\";\nimport { extname } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\n\nconst Assertion = z\n .object({\n type: z.enum([\n \"contains\",\n \"not_contains\",\n \"regex\",\n \"tool_call_count\",\n \"tool_call_order\",\n \"latency_ms\",\n \"semantic_match\",\n ]),\n })\n .passthrough();\n\nconst EvalCase = z.object({\n query_id: z.string().optional(),\n query: z.string().optional(),\n input: z.object({ user_message: z.string() }).optional(),\n reference: z.object({ answer: z.string() }).optional(),\n assertions: z.array(Assertion).optional(),\n tags: z.array(z.string()).optional(),\n});\n\nconst EvalSetFile = z.union([\n z.array(EvalCase),\n z.object({ cases: z.array(EvalCase) }),\n z.object({ queries: z.array(EvalCase) }),\n]);\n\nconst DiagnosisRule = z.object({\n id: z.string(),\n severity: z.enum([\"low\", \"medium\", \"high\"]),\n symptom: z.string(),\n predicate: z.string().optional(),\n rubric: z.unknown().optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type SchemaKind = \"eval-set\" | \"rule\";\n\nexport interface SchemaValidateResult {\n valid: boolean;\n kind: SchemaKind;\n file: string;\n errors: string[];\n}\n\nfunction parseFile(file: string): unknown {\n const text = readFileSync(file, \"utf8\");\n const ext = extname(file).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") return yaml.load(text);\n return JSON.parse(text);\n}\n\n/** Infer the schema kind from the parsed shape when not given explicitly. */\nfunction inferKind(data: unknown): SchemaKind {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const o = data as Record<string, unknown>;\n if (\"predicate\" in o || \"rubric\" in o || (\"symptom\" in o && \"severity\" in o)) return \"rule\";\n }\n return \"eval-set\";\n}\n\nexport function validateSchemaFile(file: string, kind?: SchemaKind): SchemaValidateResult {\n let data: unknown;\n try {\n data = parseFile(file);\n } catch (e) {\n return {\n valid: false,\n kind: kind ?? \"eval-set\",\n file,\n errors: [`parse error: ${e instanceof Error ? e.message : String(e)}`],\n };\n }\n const resolved = kind ?? inferKind(data);\n const schema = resolved === \"rule\" ? DiagnosisRule : EvalSetFile;\n const result = schema.safeParse(data);\n if (result.success) return { valid: true, kind: resolved, file, errors: [] };\n return {\n valid: false,\n kind: resolved,\n file,\n errors: result.error.issues.map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`),\n };\n}\n","/** `openbkn vega …` — Catalog reads + index BuildTask. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions } from \"./_shared.js\";\n\nexport function vegaCommand(): Command {\n const vega = new Command(\"vega\").description(\n \"Vega observability — catalog, resources, index build tasks\",\n );\n\n const catalog = vega.command(\"catalog\").description(\"Catalog entries\");\n catalog\n .command(\"list\")\n .description(\"List catalog entries\")\n .option(\"--limit <n>\", \"page size\", (v) => Number.parseInt(v, 10), DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", (v) => Number.parseInt(v, 10), 0)\n .action(async (_opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const data = await clientFrom(cmd).vega.catalogs({ limit: o.limit, offset: o.offset });\n printJson(data, outputOptions(cmd));\n });\n catalog\n .command(\"get <id>\")\n .description(\"Get a catalog by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.getCatalog(id), outputOptions(cmd));\n });\n catalog\n .command(\"resources <id>\")\n .description(\"List resources under a catalog\")\n .option(\"--category <c>\", \"filter by category (e.g. table)\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.catalogResources(id, opts.category), outputOptions(cmd));\n });\n catalog\n .command(\"health <ids...>\")\n .description(\"Health-status for one or more catalogs\")\n .action(async (ids: string[], _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.catalogHealth(ids), outputOptions(cmd));\n });\n catalog\n .command(\"create\")\n .description(\"Create a catalog (data source)\")\n .requiredOption(\"--name <s>\", \"catalog name\")\n .requiredOption(\"--connector-type <s>\", \"connector type (e.g. mysql)\")\n .requiredOption(\"--connector-config <json>\", \"connector config JSON\")\n .option(\"--tags <t1,t2>\", \"comma-separated tags\")\n .option(\"--description <s>\", \"description\")\n .option(\"--enabled\", \"create enabled (default: disabled)\")\n .action(async (opts, cmd: Command) => {\n let connectorConfig: unknown;\n try {\n connectorConfig = JSON.parse(opts.connectorConfig);\n } catch {\n throw new Error(\"--connector-config must be valid JSON\");\n }\n printJson(\n await clientFrom(cmd).vega.createCatalog({\n name: opts.name,\n connectorType: opts.connectorType,\n connectorConfig,\n tags: opts.tags\n ? String(opts.tags)\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean)\n : undefined,\n description: opts.description,\n enabled: opts.enabled ? true : undefined,\n }),\n outputOptions(cmd),\n );\n });\n catalog\n .command(\"enable <id>\")\n .description(\"Enable a catalog (required before discovery)\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.enableCatalog(id), outputOptions(cmd));\n });\n catalog\n .command(\"discover <id>\")\n .description(\"Trigger catalog resource discovery\")\n .option(\"--wait\", \"wait for discovery to complete\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).vega.discoverCatalog(id, Boolean(opts.wait)),\n outputOptions(cmd),\n );\n });\n\n const connector = vega.command(\"connector-type\").description(\"Connector types\");\n connector\n .command(\"list\")\n .description(\"List connector types\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.connectorTypes(), outputOptions(cmd));\n });\n connector\n .command(\"get <type>\")\n .description(\"Get a connector type\")\n .action(async (type: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.connectorType(type), outputOptions(cmd));\n });\n\n const resource = vega.command(\"resource\").description(\"Vega-backend resources\");\n resource\n .command(\"list\")\n .description(\"List resources\")\n .option(\"--datasource-id <id>\", \"filter by catalog/datasource id\")\n .option(\"--catalog-id <id>\", \"alias of --datasource-id\")\n .option(\"--type <category>\", \"resource category\")\n .option(\"--category <category>\", \"alias of --type\")\n .option(\"--limit <n>\", \"page size\", (v) => Number.parseInt(v, 10), DEFAULT_LIST_LIMIT)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).resource.list({\n datasourceId: opts.datasourceId ?? opts.catalogId,\n category: opts.type ?? opts.category,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n resource\n .command(\"get <id>\")\n .description(\"Get a resource\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.get(id), outputOptions(cmd));\n });\n resource\n .command(\"query <id>\")\n .description(\"Fetch data rows from a resource\")\n .option(\"--limit <n>\", \"row limit\", (v) => Number.parseInt(v, 10), 50)\n .option(\"--offset <n>\", \"row offset\", (v) => Number.parseInt(v, 10), 0)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).resource.query(id, { limit: opts.limit, offset: opts.offset }),\n outputOptions(cmd),\n );\n });\n\n const dataset = vega.command(\"dataset\").description(\"Dataset index build tasks\");\n dataset\n .command(\"build <resource-id>\")\n .description(\"Build a resource's index (creates a BuildTask)\")\n .requiredOption(\"--mode <mode>\", \"build mode: batch | streaming\")\n .option(\"--embedding-fields <list>\", \"comma-separated fields to vectorize\")\n .option(\n \"--build-key-fields <list>\",\n \"comma-separated key fields (batch: time; streaming: row id)\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id (default if omitted)\")\n .option(\"--model-dimensions <n>\", \"vector dimensions\", (v) => Number.parseInt(v, 10))\n .option(\"--wait\", \"poll until the build reaches a terminal state\")\n .option(\"--timeout <s>\", \"wait timeout in seconds\", (v) => Number.parseInt(v, 10), 300)\n .action(async (resourceId: string, _opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const task = await clientFrom(cmd).vega.build(\n {\n resource_id: resourceId,\n mode: o.mode,\n embedding_fields: csv(o.embeddingFields),\n build_key_fields: csv(o.buildKeyFields),\n embedding_model: o.embeddingModel,\n model_dimensions: o.modelDimensions,\n },\n { wait: Boolean(o.wait), timeoutMs: o.timeout * 1000 },\n );\n printJson(task, outputOptions(cmd));\n });\n\n dataset\n .command(\"build-status <resource-id> <task-id>\")\n .description(\"Show a BuildTask's state and progress\")\n .action(async (_resourceId: string, taskId: string, _opts, cmd: Command) => {\n const task = await clientFrom(cmd).vega.buildStatus(taskId);\n printJson(task, outputOptions(cmd));\n });\n\n return group(vega, \"AI DATA PLATFORM\");\n}\n"],"mappings":"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","names":["Command","Command","resolve","cmd","Command","Command","int","Command","cmd","Command","readFileSync","int","Command","Command","Command","cmd","Command","Command","Command","int","Command","cmd","Command","int","Command","cmd","Command","int","readBody","resolve","Command","Command","int","Command","Command","int","Command","cmd","Command","int","Command","cmd","status","Command","int","Command","cmd","readFileSync","Command","readFileSync","Command","cmd","readFileSync","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json","../src/commands/admin.ts","../src/help/grouped-help.ts","../src/utils/org-tree.ts","../src/utils/output.ts","../src/commands/_shared.ts","../src/commands/auth.ts","../src/api/eacp-crypto.ts","../src/api/admin.ts","../src/commands/agent.ts","../src/commands/bkn.ts","../src/utils/bkn-validate.ts","../src/commands/call.ts","../src/commands/config.ts","../src/commands/context.ts","../src/commands/dataflow.ts","../src/commands/explore.ts","../src/commands/model.ts","../src/commands/resource.ts","../src/commands/skill.ts","../src/commands/toolbox.ts","../src/commands/trace.ts","../src/trace-ai/schema-validate.ts","../src/commands/vega.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * `openbkn` — unified CLI for the BKN platform.\n * Thin shell: parse argv → call a resource → print. No business logic here.\n */\nimport { Command } from \"commander\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { adminCommand } from \"./commands/admin.js\";\nimport { agentCommand } from \"./commands/agent.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { bknCommand } from \"./commands/bkn.js\";\nimport { callCommand } from \"./commands/call.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { contextCommand } from \"./commands/context.js\";\nimport { dataflowCommand } from \"./commands/dataflow.js\";\nimport { exploreCommand } from \"./commands/explore.js\";\nimport { modelCommand } from \"./commands/model.js\";\nimport { resourceCommand } from \"./commands/resource.js\";\nimport { skillCommand } from \"./commands/skill.js\";\nimport { toolCommand, toolboxCommand } from \"./commands/toolbox.js\";\nimport { traceCommand } from \"./commands/trace.js\";\nimport { vegaCommand } from \"./commands/vega.js\";\nimport { installGroupedHelp } from \"./help/grouped-help.js\";\nimport { formatError, toExitCode } from \"./utils/errors.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"openbkn\")\n .description(\"Operate the BKN platform from the CLI\")\n .version(pkg.version, \"-V, --version\", \"output the version number\")\n .option(\"--base-url <url>\", \"platform base URL (env: BKN_BASE_URL)\")\n .option(\"--token <value>\", \"access token (env: BKN_TOKEN)\")\n .option(\"--user <id|name>\", \"use specific user credentials (env: BKN_USER)\")\n .option(\"--json\", \"machine-readable JSON output\")\n .option(\"--compact\", \"single-line JSON output\")\n .option(\"--full\", \"human view: show all columns (default trims to the key ones)\")\n .option(\"--biz-domain <s>\", \"business domain (alias: -bd)\")\n .option(\"-k, --insecure\", \"skip TLS verification (dev / self-signed only)\")\n .showHelpAfterError();\n\n// Real commands.\nprogram.addCommand(authCommand());\nprogram.addCommand(callCommand());\nprogram.addCommand(configCommand());\nprogram.addCommand(vegaCommand());\nprogram.addCommand(bknCommand());\nprogram.addCommand(resourceCommand());\nprogram.addCommand(dataflowCommand());\nprogram.addCommand(contextCommand());\nprogram.addCommand(agentCommand());\nprogram.addCommand(modelCommand());\nprogram.addCommand(skillCommand());\nprogram.addCommand(toolboxCommand());\nprogram.addCommand(toolCommand());\nprogram.addCommand(traceCommand());\nprogram.addCommand(adminCommand());\nprogram.addCommand(exploreCommand());\n\n// Apply grouped help to the whole tree (after all commands are registered).\ninstallGroupedHelp(program);\n\n// Legacy `-bd` is a 2-char short flag commander can't declare; rewrite it to\n// the canonical `--biz-domain` before parsing (kweaver compatibility).\nconst argv = process.argv.map((a) => (a === \"-bd\" ? \"--biz-domain\" : a));\n\ntry {\n await program.parseAsync(argv);\n} catch (err) {\n console.error(formatError(err));\n process.exit(toExitCode(err));\n}\n","{\n \"name\": \"@openbkn/bkn-sdk\",\n \"version\": \"0.1.1-alpha.5\",\n \"description\": \"Unified TypeScript SDK + CLI for the BKN (Business Knowledge Network) platform.\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"engines\": {\n \"node\": \">=18\"\n },\n \"bin\": {\n \"openbkn\": \"./dist/cli.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"files\": [\"dist\", \"README.md\", \"README.zh.md\", \"LICENSE\"],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/openbkn-ai/bkn-sdk.git\"\n },\n \"keywords\": [\"bkn\", \"openbkn\", \"knowledge-network\", \"cli\", \"sdk\", \"typescript\"],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"biome check . && tsc --noEmit\",\n \"format\": \"biome format --write .\",\n \"test\": \"vitest run\",\n \"test:cover\": \"vitest run --coverage\",\n \"ci\": \"npm run lint && npm test\",\n \"prepublishOnly\": \"npm run ci && npm run build\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^0.9.1\",\n \"@openbkn/bkn-sdk\": \"^0.1.1-alpha.3\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"csv-parse\": \"^6.2.1\",\n \"js-yaml\": \"^4.2.0\",\n \"jszip\": \"^3.10.1\",\n \"zod\": \"^3.24.1\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^22.13.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","/**\n * `openbkn admin …` — the kweaver-admin operator CLI, nested as a subcommand.\n * Mapping is 1:1: `kweaver-admin <x>` → `openbkn admin <x>`. org/user/role\n * reads + writes (create/update/delete/reset-password) and org tree are real\n * and live-verified; operator `auth` reuses the top-level `openbkn auth`.\n */\nimport { Command } from \"commander\";\nimport { rawCall } from \"../api/call.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { activePlatform, setActivePlatform } from \"../config/store.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { renderOrgTree } from \"../utils/org-tree.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\nimport { registerAuthLeaves } from \"./auth.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n/** Platform initial password — what `reset-password` resets to by default. */\nconst DEFAULT_RESET_PASSWORD = \"openbkn\";\n\nexport function adminCommand(): Command {\n const admin = new Command(\"admin\").description(\n \"Operator CLI (kweaver-admin): org, user, role, models, audit\",\n );\n\n // Operator auth = the same leaves as top-level `openbkn auth` (1:1 nest).\n registerAuthLeaves(admin.command(\"auth\").description(\"Operator authentication\"));\n\n const org = admin.command(\"org\").description(\"Departments and org structure\");\n org\n .command(\"list\")\n .description(\"List departments\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgList({\n role: opts.role,\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"get <id>\")\n .description(\"Get one department\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.orgGet(id), outputOptions(cmd));\n });\n org\n .command(\"members <id>\")\n .description(\"List members of a department\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .option(\"--fields <s>\", \"fields segment\", \"users\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgMembers(id, {\n role: opts.role,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"create\")\n .description(\"Create a department\")\n .requiredOption(\"--name <s>\", \"department name\")\n .option(\"--parent <id>\", \"parent department id\", \"-1\")\n .option(\"--code <s>\", \"department code\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--email <s>\", \"email\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--status <n>\", \"status (1=enabled)\", int)\n .option(\"--oss-id <id>\", \"object-storage site id\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgCreate({\n name: opts.name,\n parentId: opts.parent,\n code: opts.code,\n remark: opts.remark,\n email: opts.email,\n managerID: opts.manager,\n status: opts.status,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"update <id>\")\n .description(\"Update a department (only provided fields change)\")\n .option(\"--name <s>\", \"new name\")\n .option(\"--code <s>\", \"department code\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--email <s>\", \"email\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--status <n>\", \"status (1=enabled)\", int)\n .option(\"--oss-id <id>\", \"object-storage site id\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.orgUpdate(id, {\n name: opts.name,\n code: opts.code,\n remark: opts.remark,\n email: opts.email,\n managerID: opts.manager,\n status: opts.status,\n }),\n outputOptions(cmd),\n );\n });\n org\n .command(\"delete <id>\")\n .description(\"Delete a department\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.orgDelete(id), outputOptions(cmd));\n });\n org\n .command(\"tree\")\n .description(\"Print the department hierarchy\")\n .option(\"--role <r>\", \"role qualifier\", \"super_admin\")\n .action(async (opts, cmd: Command) => {\n const tree = await clientFrom(cmd).admin.orgTree(opts.role);\n const out = outputOptions(cmd);\n if (out.json) printJson(tree, out);\n else console.log(renderOrgTree(tree as Parameters<typeof renderOrgTree>[0]));\n });\n\n const user = admin.command(\"user\").description(\"User management\");\n user\n .command(\"list\")\n .description(\"List users\")\n .option(\"--org <id>\", \"filter by department id\")\n .option(\"--keyword <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userList({\n orgId: opts.org,\n name: opts.keyword,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"assign-role <user> <role>\")\n .description(\"Grant a role to a user\")\n .action(async (userId: string, roleId: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.addRoleMember(roleId, userId, \"user\"),\n outputOptions(cmd),\n );\n });\n user\n .command(\"revoke-role <user> <role>\")\n .description(\"Revoke a role from a user\")\n .action(async (userId: string, roleId: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.removeRoleMember(roleId, userId, \"user\"),\n outputOptions(cmd),\n );\n });\n user\n .command(\"get <id>\")\n .description(\"Get one user\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userGet(id), outputOptions(cmd));\n });\n user\n .command(\"roles <user>\")\n .description(\"List roles granted to a user\")\n .action(async (userId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userRoles(userId), outputOptions(cmd));\n });\n user\n .command(\"create\")\n .description(\"Create a user (gets the platform default password)\")\n .requiredOption(\"--login <name>\", \"login name\")\n .option(\"--display-name <s>\", \"display name (defaults to login name)\")\n .option(\"--email <s>\", \"email\")\n .option(\"--department <id>\", \"department id\", \"-1\")\n .option(\"--code <s>\", \"user code\")\n .option(\"--position <s>\", \"position\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--tel <s>\", \"telephone\")\n .option(\"--priority <n>\", \"priority\", int)\n .option(\"--csf-level <n>\", \"confidentiality level\", int)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userCreate({\n loginName: opts.login,\n displayName: opts.displayName,\n email: opts.email,\n departmentIds: opts.department ? [opts.department] : undefined,\n code: opts.code,\n position: opts.position,\n remark: opts.remark,\n telNumber: opts.tel,\n priority: opts.priority,\n csfLevel: opts.csfLevel,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"update <id>\")\n .description(\"Update a user (only provided fields change)\")\n .option(\"--display-name <s>\", \"display name\")\n .option(\"--email <s>\", \"email\")\n .option(\"--code <s>\", \"user code\")\n .option(\"--position <s>\", \"position\")\n .option(\"--remark <s>\", \"remark\")\n .option(\"--tel <s>\", \"telephone\")\n .option(\"--manager <id>\", \"manager user id\")\n .option(\"--idcard <s>\", \"id-card number\")\n .option(\"--priority <n>\", \"priority\", int)\n .option(\"--csf-level <n>\", \"confidentiality level\", int)\n .option(\"--csf-level2 <n>\", \"secondary confidentiality level\", int)\n .option(\"--expire-time <n>\", \"account expiry (epoch, -1 = never)\", int)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.userUpdate(id, {\n displayName: opts.displayName,\n email: opts.email,\n code: opts.code,\n position: opts.position,\n remark: opts.remark,\n telNumber: opts.tel,\n managerID: opts.manager,\n priority: opts.priority,\n csfLevel: opts.csfLevel,\n }),\n outputOptions(cmd),\n );\n });\n user\n .command(\"delete <id>\")\n .description(\"Delete a user\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.userDelete(id), outputOptions(cmd));\n });\n user\n .command(\"reset-password [id]\")\n .description(\"Reset a user's password (defaults to the platform initial password)\")\n .option(\"--id <userId>\", \"explicit user UUID (alt to the positional id)\")\n .option(\"--user <account>\", \"resolve the user by account / login name\")\n .option(\"--password <s>\", \"the new password (default: platform initial 'openbkn')\")\n .option(\"--new-password <s>\", \"the new password (alias of --password)\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string | undefined, opts, cmd: Command) => {\n const userId = id ?? opts.id ?? opts.user;\n if (!userId) throw new Error(\"Provide a user id (positional or --id).\");\n // Reset = set the platform initial password (forced-change on next login)\n // unless an explicit new password is given.\n const pwd = opts.password ?? opts.newPassword ?? DEFAULT_RESET_PASSWORD;\n const r = await clientFrom(cmd).admin.userResetPassword(userId, pwd);\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(r, out);\n else if (opts.password || opts.newPassword)\n process.stdout.write(`Password reset for ${userId}.\\n`);\n else\n process.stdout.write(\n `Password reset for ${userId} to the initial password '${DEFAULT_RESET_PASSWORD}' (must change on next login).\\n`,\n );\n });\n\n const role = admin.command(\"role\").description(\"Role management\");\n role\n .command(\"list\")\n .description(\"List roles\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--source <s>\", \"role source filter (business | user)\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleList({ keyword: opts.keyword, limit: opts.limit }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"get <role>\")\n .description(\"Get a role by id\")\n .option(\"--view <mode>\", \"detail view mode\")\n .action(async (roleId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.roleGet(roleId), outputOptions(cmd));\n });\n role\n .command(\"members <role>\")\n .description(\"List members of a role\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--type <t>\", \"filter by member type (user|department|group|app)\")\n .option(\"--member <spec...>\", \"filter to specific member(s) '<type>:<id-or-name>'\")\n .option(\"--limit <n>\", \"page size\", int, 100)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleMembers(roleId, {\n keyword: opts.keyword,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"add-member <role> <id>\")\n .description(\"Add a member to a role\")\n .option(\"--type <t>\", \"member type\", \"user\")\n .option(\"--member <spec...>\", \"member(s) as '<type>:<id-or-name>' (alt to <id>)\")\n .action(async (roleId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.addRoleMember(roleId, id, opts.type),\n outputOptions(cmd),\n );\n });\n role\n .command(\"remove-member <role> <id>\")\n .description(\"Remove a member from a role\")\n .option(\"--type <t>\", \"member type\", \"user\")\n .option(\"--member <spec...>\", \"member(s) as '<type>:<id-or-name>' (alt to <id>)\")\n .action(async (roleId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.removeRoleMember(roleId, id, opts.type),\n outputOptions(cmd),\n );\n });\n role\n .command(\"create\")\n .description(\"Create a custom role (bkn-safe; built-in roles are read-only)\")\n .requiredOption(\"--name <name>\", \"role name\")\n .option(\"--description <text>\", \"role description\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleCreate(opts.name, opts.description),\n outputOptions(cmd),\n );\n });\n role\n .command(\"update <role>\")\n .description(\"Update a custom role's name/description (403 on built-in)\")\n .option(\"--name <name>\", \"new name\")\n .option(\"--description <text>\", \"new description\")\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.roleUpdate(roleId, {\n name: opts.name,\n description: opts.description,\n }),\n outputOptions(cmd),\n );\n });\n role\n .command(\"delete <role>\")\n .description(\"Delete a custom role (403 on built-in)\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (roleId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).admin.roleDelete(roleId), outputOptions(cmd));\n });\n for (const [verb, grant] of [\n [\"grant-perm\", true],\n [\"revoke-perm\", false],\n ] as const) {\n role\n .command(`${verb} <role>`)\n .description(`${grant ? \"Grant\" : \"Revoke\"} a permission on a custom role (403 on built-in)`)\n .requiredOption(\"--resource-type <t>\", \"resource type (e.g. catalog)\")\n .option(\"--resource-id <id>\", \"resource id ('*' = whole type)\", \"*\")\n .requiredOption(\"--operations <list>\", \"comma-separated operations\")\n .action(async (roleId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.rolePermission(\n roleId,\n grant,\n opts.resourceType,\n opts.resourceId,\n csv(opts.operations) ?? [],\n ),\n outputOptions(cmd),\n );\n });\n }\n\n // Models management reuses the (validated) mf-model-manager client. Granular\n // flags assemble the request body; `--body`/`--body-file` override wins.\n const modelBody = (opts: Record<string, unknown>): unknown => {\n if (opts.body || opts.bodyFile) return readBody(opts as { body?: string; bodyFile?: string });\n const mc: Record<string, unknown> = {};\n if (opts.apiModel) mc.api_model = opts.apiModel;\n if (opts.apiUrl) mc.api_url = opts.apiUrl;\n if (opts.apiBase) mc.api_url = opts.apiBase;\n if (opts.apiKey) mc.api_key = opts.apiKey;\n const body: Record<string, unknown> = {};\n if (opts.name) body.model_name = opts.name;\n if (opts.series) body.model_series = opts.series;\n if (opts.type) body.model_type = opts.type;\n if (opts.icon) body.icon = opts.icon;\n if (opts.embeddingDim !== undefined) body.model_dimensions = opts.embeddingDim;\n if (opts.maxTokens !== undefined) body.max_model_len = opts.maxTokens;\n if (opts.batchSize !== undefined) body.batch_size = opts.batchSize;\n if (Object.keys(mc).length > 0) body.model_config = mc;\n return body;\n };\n for (const kind of [\"llm\", \"small-model\"] as const) {\n const isLlm = kind === \"llm\";\n const m = admin.command(kind).description(`${kind} management`);\n const ns = isLlm ? \"llm\" : \"small\";\n\n const list = m\n .command(\"list\")\n .description(`List ${kind} models`)\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--page <n>\", \"page\", int, 1)\n .option(\"--size <n>\", \"page size\", int, DEFAULT_LIST_LIMIT);\n (isLlm\n ? list.option(\"--series <s>\", \"model series\")\n : list.option(\"--type <t>\", \"model type\")\n ).action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models[ns].list({\n name: opts.name,\n page: opts.page,\n limit: opts.size,\n modelType: opts.type,\n }),\n outputOptions(cmd),\n );\n });\n\n m.command(\"get <modelid>\")\n .description(`Get a ${kind} model`)\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].get(id), outputOptions(cmd));\n });\n\n const add = m\n .command(\"add\")\n .description(`Register a ${kind} model (granular flags or --body/--body-file)`)\n .option(\"--name <s>\", \"model name\")\n .option(\"--api-model <s>\", \"upstream API model id\")\n .option(\"--api-key <s>\", \"upstream API key\")\n .option(\"--body <json>\", \"model config JSON (overrides flags)\")\n .option(\"--body-file <path>\", \"read config JSON from a file\");\n if (isLlm) {\n add\n .option(\"--series <s>\", \"model series\")\n .option(\"--api-base <url>\", \"upstream API base URL\")\n .option(\"--icon <url>\", \"icon URL\");\n } else {\n add\n .option(\"--type <t>\", \"small-model type (embedding|reranker)\")\n .option(\"--api-url <url>\", \"upstream API URL\")\n .option(\"--embedding-dim <n>\", \"embedding dimensions\", int)\n .option(\"--max-tokens <n>\", \"max tokens\", int)\n .option(\"--batch-size <n>\", \"batch size\", int);\n }\n add.action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].add(modelBody(opts)), outputOptions(cmd));\n });\n\n const edit = m\n .command(\"edit <modelid>\")\n .description(`Edit a ${kind} model (granular flags or --body/--body-file)`)\n .option(\"--name <s>\", \"model name\")\n .option(\"--body <json>\", \"model config JSON (overrides flags)\")\n .option(\"--body-file <path>\", \"read config JSON from a file\");\n if (isLlm) {\n edit.option(\"--icon <url>\", \"icon URL\");\n } else {\n edit\n .option(\"--api-model <s>\", \"upstream API model id\")\n .option(\"--api-url <url>\", \"upstream API URL\");\n }\n edit.action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models[ns].edit({ model_id: id, ...(modelBody(opts) as object) }),\n outputOptions(cmd),\n );\n });\n\n m.command(\"delete <modelid...>\")\n .description(`Delete ${kind} model(s)`)\n .action(async (ids: string[], _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[ns].delete(ids), outputOptions(cmd));\n });\n\n m.command(\"test <modelid>\")\n .description(`Test a ${kind} model`)\n .option(\"--body <json>\", \"test request JSON\")\n .option(\"--body-file <path>\", \"read test request JSON from a file\")\n .action(async (id: string, opts, cmd: Command) => {\n const body = opts.body || opts.bodyFile ? (readBody(opts) as object) : {};\n printJson(\n await clientFrom(cmd).models[ns].test({ model_id: id, ...body }),\n outputOptions(cmd),\n );\n });\n }\n\n admin\n .command(\"audit\")\n .description(\"Audit log queries\")\n .command(\"list\")\n .description(\"List login audit events\")\n .option(\"--user <name>\", \"filter by user\")\n .option(\"--start <time>\", \"start time\")\n .option(\"--end <time>\", \"end time\")\n .option(\"--page <n>\", \"page\", int, 1)\n .option(\"--size <n>\", \"page size\", int, 30)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).admin.auditList({\n user: opts.user,\n start: opts.start,\n end: opts.end,\n page: opts.page,\n size: opts.size,\n }),\n outputOptions(cmd),\n );\n });\n const adminConfig = admin.command(\"config\").description(\"Admin CLI config (active platform)\");\n adminConfig\n .command(\"show\")\n .description(\"Show the active platform\")\n .action((_opts, cmd: Command) => {\n printJson({ baseUrl: activePlatform() }, outputOptions(cmd));\n });\n adminConfig\n .command(\"set <key> <value>\")\n .description(\"Set a config value (baseUrl)\")\n .action((key: string, value: string, _opts, cmd: Command) => {\n if (key !== \"baseUrl\") {\n throw new Error(`Unknown config key: ${key} (only baseUrl supported)`);\n }\n setActivePlatform(value.replace(/\\/+$/, \"\"));\n printJson({ ok: true, baseUrl: value }, outputOptions(cmd));\n });\n admin\n .command(\"call <url>\")\n .description(\"Operator API passthrough (curl-style; auto-injected auth)\")\n .option(\"-X, --request <method>\", \"HTTP method\")\n .option(\n \"-H, --header <header>\",\n 'extra header \"Name: value\" (repeatable)',\n (v, a: string[]) => {\n a.push(v);\n return a;\n },\n [] as string[],\n )\n .option(\"-d, --data <body>\", \"request body (JSON content-type if unset)\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const res = await rawCall(\n resolveContext({\n baseUrl: g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n }),\n url,\n { method: opts.request, header: opts.header, data: opts.data, businessDomain: g.bizDomain },\n );\n const out = outputOptions(cmd);\n try {\n printJson(JSON.parse(res.body), out);\n } catch {\n process.stdout.write(res.body.endsWith(\"\\n\") ? res.body : `${res.body}\\n`);\n }\n if (res.status >= 400) process.exitCode = 1;\n });\n\n return group(admin, \"OPERATOR\");\n}\n","/**\n * Grouped help formatter for commander — reproduces the legacy Kweaver layout\n * (section headers + USAGE / FLAGS) at every command level. One formatter, no\n * per-command help strings: each command carries a `group` tag read here.\n */\nimport type { Command, Help } from \"commander\";\n\nconst GROUP = Symbol(\"openbkn.group\");\nconst DEFAULT_GROUP = \"COMMANDS\";\n\n/** Tag a command with the help section it belongs to. Returns the command. */\nexport function group(cmd: Command, name: string): Command {\n (cmd as unknown as Record<symbol, string>)[GROUP] = name;\n return cmd;\n}\n\nfunction groupOf(cmd: Command): string {\n return (cmd as unknown as Record<symbol, string>)[GROUP] ?? DEFAULT_GROUP;\n}\n\nfunction formatHelp(cmd: Command, helper: Help): string {\n const out: string[] = [];\n const desc = helper.commandDescription(cmd);\n if (desc) out.push(desc, \"\");\n\n out.push(\"USAGE\", ` ${helper.commandUsage(cmd)}`, \"\");\n\n const subs = helper.visibleCommands(cmd);\n if (subs.length > 0) {\n const width = Math.max(...subs.map((c) => helper.subcommandTerm(c).length));\n const sections = new Map<string, Command[]>();\n for (const c of subs) {\n const g = groupOf(c);\n const bucket = sections.get(g);\n if (bucket) bucket.push(c);\n else sections.set(g, [c]);\n }\n for (const [name, cmds] of sections) {\n out.push(name);\n for (const c of cmds) {\n out.push(` ${helper.subcommandTerm(c).padEnd(width)} ${helper.subcommandDescription(c)}`);\n }\n out.push(\"\");\n }\n }\n\n const opts = helper.visibleOptions(cmd);\n if (opts.length > 0) {\n const width = Math.max(...opts.map((o) => helper.optionTerm(o).length));\n out.push(\"FLAGS\");\n for (const o of opts) {\n out.push(` ${helper.optionTerm(o).padEnd(width)} ${helper.optionDescription(o)}`);\n }\n out.push(\"\");\n }\n\n return out.join(\"\\n\");\n}\n\n/**\n * Apply the grouped formatter to a command and every descendant. Call AFTER all\n * subcommands are added — commander's `configureHelp` is per-command and is not\n * inherited through `addCommand`, so we set it on each node explicitly.\n */\nexport function installGroupedHelp(root: Command): void {\n const apply = (cmd: Command): void => {\n cmd.configureHelp({ formatHelp });\n for (const child of cmd.commands) apply(child);\n };\n apply(root);\n}\n","/** Build / render a department hierarchy from flat ISF search entries. */\nimport type { DeptEntry } from \"../api/admin.js\";\n\nexport interface OrgNode {\n id: string;\n name: string;\n children: OrgNode[];\n}\n\n/** Nest flat departments by their `parent_deps` chain (last dep = immediate parent). */\nexport function buildOrgTree(entries: DeptEntry[]): OrgNode[] {\n const nodes = new Map<string, OrgNode>();\n for (const e of entries) nodes.set(e.id, { id: e.id, name: e.name ?? e.id, children: [] });\n\n const roots: OrgNode[] = [];\n for (const e of entries) {\n const node = nodes.get(e.id);\n if (!node) continue;\n const deps = e.parent_deps;\n const parentId = deps && deps.length > 0 ? deps[deps.length - 1]?.id : undefined;\n const parent = parentId ? nodes.get(parentId) : undefined;\n if (parent) parent.children.push(node);\n else roots.push(node);\n }\n return roots;\n}\n\n/** Render a tree as indented text (`├── name (id: …)`). */\nexport function renderOrgTree(nodes: OrgNode[], prefix = \"\"): string {\n const lines: string[] = [];\n nodes.forEach((node, i) => {\n const last = i === nodes.length - 1;\n lines.push(`${prefix}${last ? \"└── \" : \"├── \"}${node.name} (id: ${node.id})`);\n if (node.children.length) {\n lines.push(renderOrgTree(node.children, `${prefix}${last ? \" \" : \"│ \"}`));\n }\n });\n return lines.join(\"\\n\");\n}\n","/** Output helpers: clean JSON for scripts, aligned plain columns for humans. */\nexport interface OutputOptions {\n /** Emit machine-readable JSON instead of a table. */\n json?: boolean;\n /** Single-line JSON (implies json). */\n compact?: boolean;\n /** Human view: show every column instead of the trimmed key set. */\n full?: boolean;\n}\n\n/**\n * Primary output sink. With `--json`/`--compact` (the equivalence path) it\n * prints JSON. Otherwise it renders a human table when the payload is a list of\n * objects (unwrapping common envelopes like `entries`/`data`/`cases`), falling\n * back to pretty JSON for single objects / scalars.\n */\nexport function printJson(value: unknown, opts: OutputOptions = {}): void {\n if (opts.json || opts.compact) {\n process.stdout.write(`${JSON.stringify(value, null, opts.compact ? 0 : 2)}\\n`);\n return;\n }\n const rows = toRows(value);\n if (rows) {\n // `--full` shows every non-empty column; default trims further. Hide the\n // footer count is measured against `--full` so all-empty columns (which\n // `--full` also drops) never inflate \"N more\".\n const fullColumns = columnsOf(rows).filter((c) => rows.some((r) => stringifyCell(r[c]) !== \"\"));\n const columns = opts.full ? fullColumns : selectColumns(rows);\n if (columns.length > 0) {\n printTable(rows, columns);\n const hidden = fullColumns.length - columns.length;\n if (hidden > 0 && !opts.full) {\n process.stdout.write(`… ${hidden} more column(s); use --full or --json for everything\\n`);\n }\n return;\n }\n }\n // A recognized list envelope that's simply empty → say so, not raw JSON.\n if (isEmptyEnvelope(value)) {\n process.stdout.write(\"(no results)\\n\");\n return;\n }\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/** True when value is `{ <envelope>: [] }` (an empty list response). */\nfunction isEmptyEnvelope(value: unknown): boolean {\n if (!value || typeof value !== \"object\") return false;\n const o = value as Record<string, unknown>;\n return ROW_ENVELOPES.some((k) => Array.isArray(o[k]) && (o[k] as unknown[]).length === 0);\n}\n\nconst ROW_ENVELOPES = [\n \"entries\",\n \"data\",\n \"cases\",\n \"reports\",\n \"results\",\n \"list\",\n \"recurringRules\",\n \"users\",\n \"roles\",\n \"departments\",\n \"members\",\n];\n\n/** Find the primary array-of-objects in a value (unwrapping common envelopes). */\nfunction toRows(value: unknown): Array<Record<string, unknown>> | null {\n const isRowArray = (v: unknown): v is Array<Record<string, unknown>> =>\n Array.isArray(v) &&\n v.length > 0 &&\n v.every((x) => x !== null && typeof x === \"object\" && !Array.isArray(x));\n if (isRowArray(value)) return value;\n if (value && typeof value === \"object\") {\n for (const key of ROW_ENVELOPES) {\n const inner = (value as Record<string, unknown>)[key];\n if (isRowArray(inner)) return inner;\n }\n }\n return null;\n}\n\n/** Column set = union of row keys, in first-seen order. */\nfunction columnsOf(rows: Array<Record<string, unknown>>): string[] {\n const seen: string[] = [];\n for (const row of rows) {\n for (const k of Object.keys(row)) if (!seen.includes(k)) seen.push(k);\n }\n return seen;\n}\n\n/** Max columns shown in the human view before truncating (use --full / --json). */\nconst MAX_COLS = 8;\n\n/** Audit/bookkeeping columns hidden by default — rarely the point of a list. */\nconst NOISE_COLS = new Set([\n \"creator\",\n \"updater\",\n \"create_by\",\n \"update_by\",\n \"create_user\",\n \"update_user\",\n \"operations\",\n \"status_message\",\n \"last_check_time\",\n \"last_discover_status\",\n \"health_check_result\",\n \"health_check_enabled\",\n]);\nconst isNoiseCol = (c: string) => NOISE_COLS.has(c) || /_time$/.test(c);\n\n/** Identity / key attributes a human scans for first. */\nconst isKeyCol = (c: string) =>\n /^(id|name|key|title|label)$/i.test(c) ||\n /_(id|name|key)$/i.test(c) ||\n /^(status|state|type|category|mode|enabled|version|branch)$/i.test(c);\n\n/**\n * Pick the columns worth showing a human: drop empty / nested-object / audit\n * columns, then order by usefulness (identity & key attributes first, long free\n * text last) and cap the count. The full record is always one `--full`/`--json`\n * away.\n */\nfunction selectColumns(rows: Array<Record<string, unknown>>): string[] {\n const isObj = (v: unknown) => v !== null && typeof v === \"object\" && !Array.isArray(v);\n const kept = columnsOf(rows).filter((c) => {\n if (isNoiseCol(c)) return false;\n const vals = rows.map((r) => r[c]);\n if (!vals.some((v) => stringifyCell(v) !== \"\")) return false; // all empty\n if (vals.every((v) => v === null || v === undefined || isObj(v))) return false; // nested objects\n return true;\n });\n // Long free-text (always truncated) is informative but bulky → push to the end.\n const isLongText = (c: string) =>\n rows.every((r) => {\n const s = stringifyCell(r[c]);\n return s === \"\" || s.length >= CELL_MAX - 1;\n });\n const rank = (c: string) => (isKeyCol(c) ? 0 : isLongText(c) ? 2 : 1);\n const ordered = kept\n .map((c, i) => ({ c, i, r: rank(c) }))\n .sort((a, b) => a.r - b.r || a.i - b.i) // stable: rank, then original order\n .map((x) => x.c);\n return ordered.slice(0, MAX_COLS);\n}\n\n/**\n * Print rows as space-aligned columns (no borders), or as JSON when\n * `--json`/`--compact` is set. Header row + left-aligned columns separated by\n * two spaces — readable without drawing an ASCII grid.\n */\nexport function printTable(\n rows: Array<Record<string, unknown>>,\n columns: string[],\n opts: OutputOptions = {},\n): void {\n if (opts.json || opts.compact) {\n printJson(rows, opts);\n return;\n }\n const cells = rows.map((row) => columns.map((c) => stringifyCell(row[c])));\n const widths = columns.map((col, i) =>\n Math.max(displayWidth(col), ...cells.map((r) => displayWidth(r[i] ?? \"\"))),\n );\n const fmt = (parts: string[]) =>\n parts\n .map((p, i) => (i === parts.length - 1 ? p : pad(p, widths[i] ?? 0)))\n .join(\" \")\n .trimEnd();\n const lines = [fmt(columns), ...cells.map(fmt)];\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nconst CELL_MAX = 48;\n\n/** Visual width counting East-Asian wide chars as 2 columns. */\nfunction displayWidth(s: string): number {\n let w = 0;\n for (const ch of s) w += /[ᄀ-ᅟ⺀-꓏가-힣豈-﫿︰-﹏＀-⦆¢-₩]/.test(ch) ? 2 : 1;\n return w;\n}\n\n/** Right-pad to a visual width (wide-char aware). */\nfunction pad(s: string, width: number): string {\n const gap = width - displayWidth(s);\n return gap > 0 ? s + \" \".repeat(gap) : s;\n}\n\nfunction stringifyCell(v: unknown): string {\n if (v === null || v === undefined) return \"\";\n // Arrays of scalars read better comma-joined than as JSON (e.g. tags).\n const raw =\n Array.isArray(v) && v.every((x) => x === null || typeof x !== \"object\")\n ? v.join(\",\")\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v);\n const s = raw.replace(/\\s+/g, \" \").trim();\n return s.length > CELL_MAX ? `${s.slice(0, CELL_MAX - 1)}…` : s;\n}\n","/** Helpers shared by command modules: client construction + output options. */\nimport { readFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { type BknClient, createClient } from \"../client.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport type { OutputOptions } from \"../utils/output.js\";\n\n/** Build a client from a command's merged (global + local) options. */\nexport function clientFrom(cmd: Command): BknClient {\n const o = cmd.optsWithGlobals();\n return createClient({\n baseUrl: o.baseUrl,\n token: o.token,\n user: o.user,\n businessDomain: o.bizDomain,\n insecure: o.insecure,\n });\n}\n\nexport function outputOptions(cmd: Command): OutputOptions {\n const o = cmd.optsWithGlobals();\n return { json: Boolean(o.json), compact: Boolean(o.compact), full: Boolean(o.full) };\n}\n\n/** Parse a comma-separated flag value into a trimmed string list. */\nexport function csv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Resolve a request body from `--body '<json>'` or `--body-file <path>`. */\nexport function readBody(opts: { body?: string; bodyFile?: string }): unknown {\n const raw = opts.bodyFile ? readFileSync(opts.bodyFile, \"utf8\") : opts.body;\n if (!raw) throw new InputError(\"Provide --body '<json>' or --body-file <path>.\");\n try {\n return JSON.parse(raw);\n } catch {\n throw new InputError(\"Request body is not valid JSON.\");\n }\n}\n","/** `openbkn auth …` — login / session / token (store-backed). */\nimport { createInterface } from \"node:readline\";\nimport { Command } from \"commander\";\nimport { changePasswordSafe } from \"../api/admin.js\";\nimport { getUserSafe } from \"../api/safe.js\";\nimport { decodeJwt } from \"../auth/jwt.js\";\nimport {\n credentialDeviceLogin,\n deviceLogin,\n fetchAuthStatus,\n isHeadless,\n openBrowser,\n} from \"../auth/oauth.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport * as auth from \"../resources/auth.js\";\nimport { DEFAULT_BUSINESS_DOMAIN } from \"../types.js\";\nimport { HttpError, InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\n/** Best-effort: resolve the logged-in user's account name from their token. */\nasync function resolveAccount(\n baseUrl: string,\n accessToken: string,\n insecure: boolean,\n idToken?: string,\n): Promise<string | undefined> {\n const sub = decodeJwt(idToken ?? accessToken)?.sub;\n if (!sub) return undefined;\n try {\n const u = (await getUserSafe(\n { baseUrl, token: accessToken, businessDomain: DEFAULT_BUSINESS_DOMAIN, insecure },\n sub,\n )) as { account?: string };\n return u.account; // needs admin; ignored on 403 for non-admins\n } catch {\n return undefined;\n }\n}\n\n/** Prompt for a line on the TTY; when `hidden`, the typed characters are not echoed. */\nfunction promptLine(query: string, hidden = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n if (hidden) {\n // Swallow the echo of typed chars; print the query once up front.\n const mutable = rl as unknown as { _writeToOutput: (s: string) => void };\n mutable._writeToOutput = (s: string) => {\n if (s.startsWith(query)) process.stdout.write(query);\n };\n }\n rl.question(query, (answer) => {\n rl.close();\n if (hidden) process.stdout.write(\"\\n\");\n resolve(answer.trim());\n });\n });\n}\n\n/** Render saved sessions as a tree: platform → users, `*` marks the active one. */\nfunction renderSessions(items: auth.PlatformListItem[]): string {\n const byPlatform = new Map<string, auth.PlatformListItem[]>();\n for (const it of items) {\n const arr = byPlatform.get(it.baseUrl) ?? [];\n arr.push(it);\n byPlatform.set(it.baseUrl, arr);\n }\n const lines: string[] = [];\n for (const [platform, users] of byPlatform) {\n lines.push(platform);\n for (const u of users) lines.push(` ${u.active ? \"*\" : \" \"} ${u.username ?? u.userId}`);\n }\n return lines.join(\"\\n\") || \"(no saved sessions)\";\n}\n\n/** Register the auth leaves onto a parent (shared by top-level `auth` + `admin auth`). */\nexport function registerAuthLeaves(cmd: Command): void {\n cmd\n .command(\"login <url>\")\n .description(\"Log in to a platform (attach a token, or browser/password OAuth)\")\n .option(\"-u, --username <name>\", \"username for password signin\")\n .option(\"-p, --password <pwd>\", \"password for password signin\")\n .option(\"--token <token>\", \"provide a token directly (CI / headless)\")\n .option(\"--client-id <id>\", \"use a fixed OAuth2 client id (skip dynamic registration)\")\n .option(\"--client-secret <secret>\", \"OAuth2 client secret (omit for public/PKCE)\")\n .option(\"--port <n>\", \"loopback redirect port for the auth_code flow\", (v) =>\n Number.parseInt(v, 10),\n )\n .option(\"--device\", \"headless device-code login (RFC 8628) — no callback server, no password\")\n .option(\"--audience <aud>\", \"device-code token audience\", \"bkn-safe\")\n .option(\n \"--timeout <s>\",\n \"device-login wait before timing out\",\n (v) => Number.parseInt(v, 10),\n 120,\n )\n // Legacy ISF sign-in flags — accepted for compatibility, ignored by the\n // bkn-safe device-code flow.\n .option(\"--no-browser\", \"(legacy) print the URL instead of opening a browser\")\n .option(\"--product <name>\", \"(legacy) ISF OAuth product query\")\n .option(\"--signin-public-key-file <path>\", \"(legacy) RSA public key for ISF /oauth2/signin\")\n .option(\"--no-auth\", \"register the platform with no authentication (no bkn-safe)\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (g.insecure) process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n const out = outputOptions(cmd);\n const report = (r: {\n baseUrl?: string;\n userId?: string;\n username?: string;\n noAuth?: boolean;\n }) => {\n if (out.json || out.compact) {\n printJson({ loggedIn: true, ...r }, out);\n } else if (r.noAuth) {\n process.stdout.write(`Registered ${r.baseUrl ?? url} (no authentication)\\n`);\n } else {\n process.stdout.write(`Logged in to ${r.baseUrl ?? url} as ${r.username ?? r.userId}\\n`);\n }\n };\n const token = opts.token ?? g.token;\n if (token) {\n report(auth.attachToken(url, token, { insecure: g.insecure }));\n return;\n }\n // Explicit no-auth (open platform / no bkn-safe): store a tokenless session.\n if (opts.auth === false) {\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n // Auto-detect: the platform's install-status.json declares whether auth is\n // on. Disabled → register a tokenless session (no point in credentials).\n const authStatus = await fetchAuthStatus(url);\n if (authStatus && !authStatus.enabled) {\n process.stderr.write(\n `Platform auth is disabled (stack: ${authStatus.stack ?? \"none\"}) — registering without auth.\\n`,\n );\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n // All flows ride the device_code grant (the only seeded user client):\n // --device → print the URL/code; approve on any machine (headless).\n // -u/-p → CLI drives login/consent with the credentials (CI).\n // default → open the browser; user signs in + approves there.\n let tokens: Awaited<ReturnType<typeof deviceLogin>>;\n let account: string | undefined;\n try {\n if (opts.username || opts.password) {\n const username = opts.username ?? (await promptLine(\"Username: \"));\n account = username;\n const password = opts.password ?? (await promptLine(\"Password: \", true));\n tokens = await credentialDeviceLogin(url, username, password, {\n clientId: opts.clientId,\n audience: opts.audience,\n timeoutMs: opts.timeout * 1000,\n });\n } else {\n // Open the browser unless asked not to (--device / --no-browser) or\n // there's none to open (headless server). On a headless box we just\n // print the URL/code — approve it on any machine with a browser.\n const headless = isHeadless();\n const openInBrowser = !opts.device && opts.browser !== false && !headless;\n tokens = await deviceLogin(url, {\n clientId: opts.clientId,\n audience: opts.audience,\n timeoutMs: opts.timeout * 1000,\n onPrompt: ({ userCode, verificationUri, verificationUriComplete }) => {\n const target = verificationUriComplete ?? verificationUri;\n process.stderr.write(\n `\\nOpen this URL to sign in and authorize:\\n ${target}\\nUser code: ${userCode}\\n`,\n );\n if (openInBrowser) openBrowser(target);\n else if (headless && !opts.device && opts.browser !== false)\n process.stderr.write(\"(headless — approve on any machine with a browser)\\n\");\n process.stderr.write(\"Waiting for authorization…\\n\");\n },\n });\n }\n } catch (e) {\n // No device-auth endpoint → the platform has no auth stack (no bkn-safe).\n // Register a tokenless session instead of failing.\n if (e instanceof Error && /Device auth failed \\(404\\)/.test(e.message)) {\n process.stderr.write(\"No auth endpoint found — registering platform without auth.\\n\");\n report(auth.attachNoAuth(url, { insecure: g.insecure }));\n return;\n }\n throw e;\n }\n // For browser/device logins (no -u), look the account name up so the\n // session list shows a name, not a UUID.\n if (!account) {\n account = await resolveAccount(\n url,\n tokens.accessToken,\n Boolean(g.insecure),\n tokens.idToken,\n );\n }\n report(\n auth.attachToken(url, tokens.accessToken, {\n refreshToken: tokens.refreshToken,\n idToken: tokens.idToken,\n insecure: g.insecure,\n username: account,\n }),\n );\n });\n\n cmd\n .command(\"status\")\n .description(\"Show base URL and whether a token is configured\")\n .action((_opts, cmd: Command) => printJson(auth.status(), outputOptions(cmd)));\n\n cmd\n .command(\"token\")\n .description(\"Print the current access token (keep secret)\")\n .action(() => {\n process.stdout.write(`${auth.currentToken()}\\n`);\n });\n\n cmd\n .command(\"whoami [url]\")\n .description(\"Show current user identity (from the token)\")\n .option(\"--no-lookup\", \"skip the backend identity fallback (eacp/user/get)\")\n .action((_url: string | undefined, _opts, cmd: Command) =>\n printJson(auth.whoami(), outputOptions(cmd)),\n );\n\n cmd\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List saved sessions (platform → users; * = active)\")\n .action((_opts, cmd: Command) => {\n const items = auth.listPlatforms();\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(items, out);\n else process.stdout.write(`${renderSessions(items)}\\n`);\n });\n\n cmd\n .command(\"use <url>\")\n .description(\"Switch the active platform\")\n .action((url: string, _opts, cmd: Command) => {\n auth.use(url);\n printJson(auth.status(), outputOptions(cmd));\n });\n\n cmd\n .command(\"logout\")\n .description(\"Remove the stored token for the active platform\")\n .action((_opts, cmd: Command) => printJson({ loggedOut: auth.logout() }, outputOptions(cmd)));\n\n cmd\n .command(\"delete <url>\")\n .description(\"Delete saved credentials for a platform\")\n .action((url: string, _opts, cmd: Command) =>\n printJson({ deleted: auth.deletePlatform(url) }, outputOptions(cmd)),\n );\n\n cmd\n .command(\"switch <url> <user>\")\n .description(\"Switch the active user for a platform (by username or user id)\")\n .action((url: string, user: string, _opts, cmd: Command) => {\n const r = auth.switchUser(url, user);\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(r, out);\n else process.stdout.write(`Switched to ${r.username ?? r.userId} on ${r.baseUrl}\\n`);\n });\n\n cmd\n .command(\"users <url>\")\n .description(\"List saved users for a platform (* = active)\")\n .action((url: string, _opts, cmd: Command) => {\n const norm = url.replace(/\\/+$/, \"\");\n const items = auth.listPlatforms().filter((i) => i.baseUrl === norm);\n const out = outputOptions(cmd);\n if (out.json || out.compact) printJson(items, out);\n else process.stdout.write(`${renderSessions(items)}\\n`);\n });\n\n cmd\n .command(\"export\")\n .description(\"Export the active session's tokens (for a headless host)\")\n .action((_opts, cmd: Command) => {\n printJson(auth.exportCreds(), outputOptions(cmd));\n });\n\n cmd\n .command(\"change-password [url]\")\n .description(\"Change your account password (bkn-safe self-service; no browser)\")\n .option(\"-a, --account <name>\", \"account / login name (the login column, e.g. admin)\")\n .option(\"--old-password <pwd>\", \"current password\")\n .option(\"--new-password <pwd>\", \"new password\")\n .option(\"--public-key-file <path>\", \"(legacy) RSA public key for ISF password encryption\")\n .action(async (url: string | undefined, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n if (g.insecure) process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n const ctx = resolveContext({\n baseUrl: url ?? g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n });\n const account = opts.account ?? (await promptLine(\"Account: \"));\n const oldPassword = opts.oldPassword ?? (await promptLine(\"Current password: \", true));\n let newPassword = opts.newPassword;\n if (!newPassword) {\n newPassword = await promptLine(\"New password: \", true);\n const confirm = await promptLine(\"Confirm new password: \", true);\n if (newPassword !== confirm) throw new Error(\"New passwords do not match.\");\n }\n try {\n printJson(\n await changePasswordSafe(ctx, account, oldPassword, newPassword),\n outputOptions(cmd),\n );\n } catch (e) {\n // 401 here means bad account/old password, not a missing session;\n // 400 means the new password equals the old one.\n if (e instanceof HttpError && e.status === 401) {\n throw new InputError(\"Wrong account or current password.\");\n }\n if (e instanceof HttpError && e.status === 400) {\n throw new InputError(\"New password must differ from the current one.\");\n }\n throw e;\n }\n });\n}\n\nexport function authCommand(): Command {\n const cmd = new Command(\"auth\").description(\"Login, session, and token management\");\n registerAuthLeaves(cmd);\n return group(cmd, \"AUTHENTICATION & CONFIG\");\n}\n","/**\n * EACP password crypto. The UserManagement / EACP `modifypassword` endpoint\n * wants the password RSA-PKCS1-encrypted with a fixed 1024-bit public key, then\n * base64-encoded. That keypair is hard-coded in the ShareServer C++ binary\n * (`ncEACHttpServerUtil::RSADecrypt`) and shipped to every customer — it is NOT\n * a secret, just the agreed transport encoding. We embed the keypair and derive\n * the public half so the CLI can encrypt without a round-trip.\n */\nimport {\n constants,\n type KeyObject,\n createPrivateKey,\n createPublicKey,\n publicEncrypt,\n} from \"node:crypto\";\n\nconst EACP_MODIFYPWD_PRIVATE_KEY_PEM = `-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDB2fhLla9rMx+6LWTXajnK11Kdp520s1Q+TfPfIXI/7G9+L2YC\n4RA3M5rgRi32s5+UFQ/CVqUFqMqVuzaZ4lw/uEdk1qHcP0g6LB3E9wkl2FclFR0M\n+/HrWmxPoON+0y/tFQxxfNgsUodFzbdh0XY1rIVUIbPLvufUBbLKXHDPpwIDAQAB\nAoGBALCM/H6ajXFs1nCR903aCVicUzoS9qckzI0SIhIOPCfMBp8+PAJTSJl9/ohU\nYnhVj/kmVXwBvboxyJAmOcxdRPWL7iTk5nA1oiVXMer3Wby+tRg/ls91xQbJLVv3\noGSt7q0CXxJpRH2oYkVVlMMlZUwKz3ovHiLKAnhw+jEsdL2BAkEA9hA97yyeA2eq\nf9dMu/ici99R3WJRRtk4NEI4WShtWPyziDg48d3SOzYmhEJjPuOo3g1ze01os70P\nApE7d0qcyQJBAMmt+FR8h5MwxPQPAzjh/fTuTttvUfBeMiUDrIycK1I/L96lH+fU\ni4Nu+7TPOzExnPeGO5UJbZxrpIEUB7Zs8O8CQQCLzTCTGiNwxc5eMgH77kVrRudp\nQ7nv6ex/7Hu9VDXEUFbkdyULbj9KuvppPJrMmWZROw04qgNp02mayM8jeLXZAkEA\no+PM/pMn9TPXiWE9xBbaMhUKXgXLd2KEq1GeAbHS/oY8l1hmYhV1vjwNLbSNrH9d\nyEP73TQJL+jFiONHFTbYXwJAU03Xgum5mLIkX/02LpOrz2QCdfX1IMJk2iKi9osV\nKqfbvHsF0+GvFGg18/FXStG9Kr4TjqLsygQJT76/MnMluw==\n-----END RSA PRIVATE KEY-----`;\n\nlet cachedKey: KeyObject | undefined;\nfunction publicKey(): KeyObject {\n if (!cachedKey) cachedKey = createPublicKey(createPrivateKey(EACP_MODIFYPWD_PRIVATE_KEY_PEM));\n return cachedKey;\n}\n\n/** RSA-PKCS1 encrypt a password and base64-encode it for EACP/UserManagement. */\nexport function encryptModifyPwd(plain: string): string {\n const buf = publicEncrypt(\n { key: publicKey(), padding: constants.RSA_PKCS1_PADDING },\n Buffer.from(plain, \"utf8\"),\n );\n return buf.toString(\"base64\");\n}\n","import { decodeJwt } from \"../auth/jwt.js\";\n/**\n * Admin (operator) client — user-management + authorization. Mirrors\n * kweaver-admin. Reads and writes (org/user create/update/delete +\n * reset-password) implemented; org/user detail and writes go through ISFWeb\n * thrift where the REST routes are RegisterPrivate. Passed through as JSON.\n */\nimport type { RequestContext } from \"../types.js\";\nimport { HttpError } from \"../utils/errors.js\";\nimport { encryptModifyPwd } from \"./eacp-crypto.js\";\nimport { request } from \"./http.js\";\n\nconst UM = \"/api/user-management/v1\";\nconst AUTHZ = \"/api/authorization/v1\";\nconst ISFWEB = \"/isfweb/api/ShareMgnt\";\n\n/**\n * The acting admin's UUID — required as a positional param by ShareMgnt user\n * writes. Prefer the JWT `sub` (id_token); when the token is opaque (Ory\n * `ory_at_…`), fall back to `GET /api/eacp/v1/user/get` (`userid`).\n */\nasync function callerUserId(ctx: RequestContext): Promise<string> {\n const sub = decodeJwt(ctx.token)?.sub;\n if (sub) return sub;\n const info = (await request(ctx, \"/api/eacp/v1/user/get\")) as { userid?: string };\n if (info?.userid) return info.userid;\n throw new Error(\n \"Cannot resolve the caller user id (token has no JWT `sub` and \" +\n \"eacp/v1/user/get returned no `userid`). Re-login.\",\n );\n}\n\n/**\n * ISFWeb thrift-style call: `POST /isfweb/api/ShareMgnt/<method>` with a\n * positional JSON array body. Business errors come back as HTTP 501 with\n * `{error:{errMsg,errID}}` — surface `errMsg` instead of \"501 Not Implemented\".\n */\nasync function shareMgnt(\n ctx: RequestContext,\n method: string,\n params: unknown[] = [],\n): Promise<unknown> {\n try {\n return await request(ctx, `${ISFWEB}/${method}`, { method: \"POST\", body: params });\n } catch (e) {\n if (e instanceof HttpError) {\n try {\n const parsed = JSON.parse(e.body) as { error?: { errMsg?: string; errID?: number } };\n const err = parsed?.error;\n if (err?.errMsg) {\n const m = err.errID !== undefined ? `${err.errMsg} (errID=${err.errID})` : err.errMsg;\n throw new Error(`ShareMgnt.${method} failed: ${m}`);\n }\n } catch (inner) {\n if (inner instanceof Error && inner.message.startsWith(\"ShareMgnt.\")) throw inner;\n }\n }\n throw e;\n }\n}\n\nconst DEPT_FIELDS = \"name,code,remark,manager,enabled,parent_deps,email\";\nconst USER_FIELDS = \"name,account,email,enabled,frozen,parent_deps,roles\";\n\nexport interface AdminListOptions {\n role?: string;\n offset?: number;\n limit?: number;\n name?: string;\n orgId?: string;\n}\n\n/** Departments (org structure) via the console search route. */\nexport function listDepartments(\n ctx: RequestContext,\n opts: AdminListOptions = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/console/search-departments/${DEPT_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface DeptEntry {\n id: string;\n name?: string;\n parent_deps?: Array<{ id: string; name?: string }>;\n}\n\n/** Fetch every department by paging the console search route (for tree building). */\nexport async function listAllDepartments(\n ctx: RequestContext,\n role = \"super_admin\",\n pageSize = 100,\n): Promise<DeptEntry[]> {\n const out: DeptEntry[] = [];\n let offset = 0;\n for (;;) {\n const data = (await listDepartments(ctx, { role, offset, limit: pageSize })) as {\n total_count?: number;\n entries?: DeptEntry[];\n };\n const entries = data.entries ?? [];\n out.push(...entries);\n if (entries.length < pageSize) break;\n if (data.total_count !== undefined && out.length >= data.total_count) break;\n offset += pageSize;\n }\n return out;\n}\n\n/** Users via the console search route (REST `/users` 404s on every deploy). */\nexport function listUsers(ctx: RequestContext, opts: AdminListOptions = {}): Promise<unknown> {\n return request(ctx, `${UM}/console/search-users/${USER_FIELDS}`, {\n query: {\n role: opts.role ?? \"super_admin\",\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n department_id: opts.orgId || undefined,\n name: opts.name || undefined,\n },\n });\n}\n\nexport interface ListRolesOptions {\n offset?: number;\n limit?: number;\n keyword?: string;\n}\n\nexport function listRoles(ctx: RequestContext, opts: ListRolesOptions = {}): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\nexport function getRole(ctx: RequestContext, roleId: string): Promise<unknown> {\n return request(ctx, `${AUTHZ}/roles/${encodeURIComponent(roleId)}`);\n}\n\n/**\n * One user's full info. UserManagement REST `/users/:id/:fields` rejects the\n * call (`invalid type` on `role`); the console uses ISFWeb thrift\n * `Usrm_GetUserInfo` with a positional `[id]` body, so we do the same.\n */\nexport function getUser(ctx: RequestContext, userId: string): Promise<unknown> {\n return shareMgnt(ctx, \"Usrm_GetUserInfo\", [userId]);\n}\n\n/**\n * Roles granted to a user. The Authorization `accessor_roles` route is\n * `RegisterPrivate` (404 on a public gateway); on 404 fall back to enumerating\n * roles and querying each role's members (cluster role counts are small).\n */\nexport async function getUserRoles(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n return await request(ctx, `${AUTHZ}/accessor_roles`, {\n query: { accessor_id: userId, accessor_type: \"user\" },\n });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n const rolesPage = (await listRoles(ctx, { offset: 0, limit: 200 })) as {\n entries?: Array<{ id: string; name?: string; description?: string }>;\n };\n const roles = rolesPage.entries ?? [];\n const matched: Array<{ id: string; name?: string; description?: string }> = [];\n await Promise.all(\n roles.map(async (role) => {\n const members = (await listRoleMembers(ctx, role.id, { offset: 0, limit: 500 })) as {\n entries?: Array<{ id: string; type?: string }>;\n };\n if (\n (members.entries ?? []).some((m) => m.id === userId && (!m.type || m.type === \"user\"))\n ) {\n matched.push(role);\n }\n }),\n );\n return {\n entries: matched,\n total_count: matched.length,\n route: \"fallback:list-roles+role-members\",\n };\n }\n}\n\n/**\n * One department's full info. The REST `/departments/:id/:fields` route is\n * `RegisterPrivate` (404 on a public gateway), so go straight to ISFWeb thrift:\n * try `Usrm_GetOrgDepartmentById` (root-level orgs), fall back to\n * `Usrm_GetDepartmentById` (sub-departments) on a \"not found\"-style error.\n */\nexport async function getDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n try {\n return await shareMgnt(ctx, \"Usrm_GetOrgDepartmentById\", [deptId]);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (!/部门不存在|errID:?\\s*20201|errID=?\\s*99|NoneType.+subscriptable/i.test(msg)) throw e;\n return shareMgnt(ctx, \"Usrm_GetDepartmentById\", [deptId]);\n }\n}\n\n/** Members of a department (public route, fields default to `users`). */\nexport function getDepartmentMembers(\n ctx: RequestContext,\n deptId: string,\n opts: { role?: string; offset?: number; limit?: number } = {},\n): Promise<unknown> {\n return request(ctx, `${UM}/department-members/${encodeURIComponent(deptId)}/users`, {\n query: { role: opts.role ?? \"super_admin\", offset: opts.offset ?? 0, limit: opts.limit ?? 100 },\n });\n}\n\n// ---- department writes (ISFWeb thrift) -------------------------------------\n\nexport interface CreateOrgInput {\n name: string;\n parentId?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Create a department (`Usrm_AddDepartment`). Returns the new department id. */\nexport async function createDepartment(\n ctx: RequestContext,\n input: CreateOrgInput,\n): Promise<unknown> {\n const ncTAddDepartParam = {\n parentId: input.parentId ?? \"-1\",\n departName: input.name,\n managerID: input.managerID ?? null,\n code: input.code ?? \"\",\n remark: input.remark ?? \"\",\n status: input.status ?? 1,\n email: input.email ?? \"\",\n ossId: \"\",\n };\n const id = await shareMgnt(ctx, \"Usrm_AddDepartment\", [{ ncTAddDepartParam }]);\n return { id };\n}\n\nexport interface UpdateOrgInput {\n name?: string;\n managerID?: string | null;\n code?: string;\n remark?: string;\n status?: number;\n email?: string;\n}\n\n/** Update a department (`Usrm_EditDepartment`); only provided fields are sent. */\nexport async function updateDepartment(\n ctx: RequestContext,\n deptId: string,\n input: UpdateOrgInput,\n): Promise<unknown> {\n const p: Record<string, unknown> = { departId: deptId };\n if (input.name !== undefined) p.departName = input.name;\n if (input.managerID !== undefined) p.managerID = input.managerID;\n if (input.code !== undefined) p.code = input.code;\n if (input.remark !== undefined) p.remark = input.remark;\n if (input.status !== undefined) p.status = input.status;\n if (input.email !== undefined) p.email = input.email;\n await shareMgnt(ctx, \"Usrm_EditDepartment\", [{ ncTEditDepartParam: p }]);\n return { id: deptId, updated: true };\n}\n\n/** Delete a department (`DELETE /management/departments/:id`). */\nexport async function deleteDepartment(ctx: RequestContext, deptId: string): Promise<unknown> {\n await request(ctx, `${UM}/management/departments/${encodeURIComponent(deptId)}`, {\n method: \"DELETE\",\n });\n return { id: deptId, deleted: true };\n}\n\n// ---- user writes -----------------------------------------------------------\n\nexport interface CreateUserInput {\n loginName: string;\n displayName?: string;\n email?: string;\n departmentIds?: string[];\n code?: string;\n position?: string;\n remark?: string;\n telNumber?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Create a user (`Usrm_AddUser`). The thrift call does not accept a password —\n * the new user gets the platform default (forced change on first login).\n * Returns the new user id.\n */\nexport async function createUser(ctx: RequestContext, input: CreateUserInput): Promise<unknown> {\n const ncTUsrmUserInfo: Record<string, unknown> = {\n loginName: input.loginName,\n displayName: input.displayName ?? input.loginName,\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: null,\n managerDisplayName: null,\n remark: input.remark ?? \"\",\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n idcardNumber: \"\",\n departmentIds: input.departmentIds ?? [\"-1\"],\n priority: input.priority ?? 999,\n csfLevel2: null,\n pwdControl: false,\n expireTime: -1,\n };\n if (input.csfLevel !== undefined) ncTUsrmUserInfo.csfLevel = input.csfLevel;\n const id = await shareMgnt(ctx, \"Usrm_AddUser\", [\n { ncTUsrmAddUserInfo: { user: { ncTUsrmUserInfo } } },\n await callerUserId(ctx),\n ]);\n return { id };\n}\n\nexport interface UpdateUserInput {\n displayName?: string;\n code?: string;\n position?: string;\n remark?: string;\n email?: string;\n telNumber?: string;\n managerID?: string;\n priority?: number;\n csfLevel?: number;\n}\n\n/**\n * Update mutable user fields. Tries the public REST route\n * `PATCH /management/users/:id` (snake_case body); on 404/405 falls back to\n * ISFWeb thrift `Usrm_EditUser` (needs the caller UUID).\n */\nexport async function updateUser(\n ctx: RequestContext,\n userId: string,\n input: UpdateUserInput,\n): Promise<unknown> {\n const restBody: Record<string, unknown> = {};\n if (input.displayName !== undefined) restBody.display_name = input.displayName;\n if (input.code !== undefined) restBody.code = input.code;\n if (input.position !== undefined) restBody.position = input.position;\n if (input.remark !== undefined) restBody.remark = input.remark;\n if (input.email !== undefined) restBody.email = input.email;\n if (input.telNumber !== undefined) restBody.tel_number = input.telNumber;\n if (input.managerID !== undefined) restBody.manager_id = input.managerID;\n if (input.priority !== undefined) restBody.priority = input.priority;\n if (input.csfLevel !== undefined) restBody.csf_level = input.csfLevel;\n try {\n const r = await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}`, {\n method: \"PATCH\",\n body: restBody,\n });\n return r ?? { id: userId, updated: true, route: \"rest\" };\n } catch (e) {\n if (!(e instanceof HttpError) || (e.status !== 404 && e.status !== 405)) throw e;\n const ncTEditUserParam = {\n id: userId,\n displayName: input.displayName ?? \"\",\n code: input.code ?? \"\",\n position: input.position ?? \"\",\n managerID: input.managerID ?? \"\",\n remark: input.remark ?? \"\",\n idcardNumber: null,\n priority: input.priority ?? 999,\n csfLevel: input.csfLevel ?? 5,\n csfLevel2: null,\n email: input.email ?? \"\",\n telNumber: input.telNumber ?? \"\",\n expireTime: -1,\n };\n await shareMgnt(ctx, \"Usrm_EditUser\", [{ ncTEditUserParam }, await callerUserId(ctx)]);\n return { id: userId, updated: true, route: \"shareMgnt\" };\n }\n}\n\n/** Delete a user (`DELETE /users/:id`, fallback ISFWeb thrift `Usrm_DelUser`). */\nexport async function deleteUser(ctx: RequestContext, userId: string): Promise<unknown> {\n try {\n await request(ctx, `${UM}/users/${encodeURIComponent(userId)}`, { method: \"DELETE\" });\n } catch (e) {\n if (!(e instanceof HttpError) || e.status !== 404) throw e;\n await shareMgnt(ctx, \"Usrm_DelUser\", [userId]);\n }\n return { id: userId, deleted: true };\n}\n\n/**\n * Admin reset of a user's password. RSA-PKCS1 encrypts the new password with\n * the built-in UserManagement key (`PUT /management/users/:id/password`).\n * No old password required for this admin route.\n */\nexport async function setUserPassword(\n ctx: RequestContext,\n userId: string,\n newPassword: string,\n): Promise<unknown> {\n await request(ctx, `${UM}/management/users/${encodeURIComponent(userId)}/password`, {\n method: \"PUT\",\n body: { password: encryptModifyPwd(newPassword) },\n });\n return { id: userId, passwordReset: true };\n}\n\nconst EACP = \"/api/eacp/v1\";\n\nexport interface AuditListOptions {\n page?: number;\n size?: number;\n user?: string;\n start?: string;\n end?: string;\n}\n\n/** Login audit events (EACP). */\nexport function listAuditLogs(ctx: RequestContext, opts: AuditListOptions = {}): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/login-log`, {\n method: \"POST\",\n body: {\n page_num: opts.page ?? 1,\n page_size: opts.size ?? 30,\n user_name: opts.user || undefined,\n start_time: opts.start || undefined,\n end_time: opts.end || undefined,\n },\n });\n}\n\n/**\n * Self-service password change via EACP (`POST /api/eacp/v1/auth1/modifypassword`).\n * Both passwords are RSA-PKCS1 encrypted + base64 (same key as reset-password).\n */\nexport function changePassword(\n ctx: RequestContext,\n account: string,\n oldPassword: string,\n newPassword: string,\n): Promise<unknown> {\n return request(ctx, `${EACP}/auth1/modifypassword`, {\n method: \"POST\",\n body: {\n account,\n oldpwd: encryptModifyPwd(oldPassword),\n newpwd: encryptModifyPwd(newPassword),\n },\n });\n}\n\n/**\n * Self-service password change on bkn-safe (`POST /api/safe/v1/auth/change-password`).\n * Plaintext over TLS, no token (it's a pre-login credential change). 204 on\n * success; 401 wrong account/old password; 400 new == old.\n */\nexport async function changePasswordSafe(\n ctx: RequestContext,\n account: string,\n oldPassword: string,\n newPassword: string,\n): Promise<{ ok: true }> {\n await request(ctx, \"/api/safe/v1/auth/change-password\", {\n method: \"POST\",\n body: { account, old_password: oldPassword, new_password: newPassword },\n });\n return { ok: true };\n}\n\nexport type MemberType = \"user\" | \"department\" | \"group\" | \"app\";\n\nexport function listRoleMembers(\n ctx: RequestContext,\n roleId: string,\n opts: { offset?: number; limit?: number; keyword?: string } = {},\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n query: {\n offset: opts.offset ?? 0,\n limit: opts.limit ?? 100,\n keyword: opts.keyword || undefined,\n },\n });\n}\n\n/**\n * Add or remove role members. Both use POST; the verb is in the body\n * (`{method:\"POST\"|\"DELETE\", members:[{id,type}]}`).\n */\nexport function modifyRoleMembers(\n ctx: RequestContext,\n roleId: string,\n method: \"POST\" | \"DELETE\",\n members: Array<{ id: string; type: MemberType }>,\n): Promise<unknown> {\n return request(ctx, `${AUTHZ}/role-members/${encodeURIComponent(roleId)}`, {\n method: \"POST\",\n body: { method, members },\n });\n}\n","/** `openbkn agent …` — decision agents (read side + listings). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function agentCommand(): Command {\n const cmd = new Command(\"agent\").description(\"Agent CRUD, chat, sessions, publish\");\n\n cmd\n .command(\"list\")\n .description(\"List published agents\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--category-id <id>\", \"filter by category\")\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.list({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n categoryId: opts.categoryId,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"personal-list\")\n .description(\"List personal-space agents\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.personalList({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"category-list\")\n .description(\"List agent categories\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.categoryList(), outputOptions(cmd));\n });\n\n cmd\n .command(\"template-list\")\n .description(\"List published agent templates\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).agents.templateList({\n name: opts.name,\n limit: opts.limit,\n offset: opts.offset,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"template-get <id>\")\n .description(\"Get a published agent template\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.templateGet(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"get <id>\")\n .description(\"Get agent details\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.get(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"get-by-key <key>\")\n .description(\"Get an agent by key\")\n .action(async (key: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.getByKey(key), outputOptions(cmd));\n });\n\n cmd\n .command(\"create\")\n .description(\"Create an agent (--body-file <json> or --body '<json>')\")\n .option(\"--body <json>\", \"agent definition JSON\")\n .option(\"--body-file <path>\", \"read agent definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.create(readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"update <id>\")\n .description(\"Update an agent (--body-file <json> or --body '<json>')\")\n .option(\"--body <json>\", \"agent definition JSON\")\n .option(\"--body-file <path>\", \"read agent definition JSON from a file\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.update(id, readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <id>\")\n .description(\"Delete an agent\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"publish <id>\")\n .description(\"Publish an agent\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.publish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"unpublish <id>\")\n .description(\"Unpublish an agent\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.unpublish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"sessions <agent>\")\n .description(\"List conversations for an agent (by agent key)\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (agentKey: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).agents.sessions(agentKey, { size: opts.limit, page: opts.page }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"history <agent> <conversation-id>\")\n .description(\"Show message history for a conversation\")\n .action(async (agentKey: string, conversationId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.history(agentKey, conversationId), outputOptions(cmd));\n });\n\n cmd\n .command(\"chat <agent-id>\")\n .description(\"Chat with an agent (SSE streaming with --stream)\")\n .requiredOption(\"-m, --message <text>\", \"user message\")\n .option(\"--version <v>\", \"agent version\", \"v0\")\n .option(\"--conversation-id <id>\", \"continue an existing conversation\")\n .option(\"--stream\", \"stream the reply to stdout as it arrives\")\n .action(async (agentId: string, opts, cmd: Command) => {\n const client = clientFrom(cmd);\n if (opts.stream) {\n const res = await client.agents.chat(agentId, opts.message, {\n version: opts.version,\n conversationId: opts.conversationId,\n stream: true,\n onDelta: (t) => process.stdout.write(t),\n });\n process.stdout.write(\"\\n\");\n if (res.conversationId) console.error(`conversation_id: ${res.conversationId}`);\n return;\n }\n printJson(\n await client.agents.chat(agentId, opts.message, {\n version: opts.version,\n conversationId: opts.conversationId,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"trace <conversation-id>\")\n .description(\"Get trace spans for a conversation (agent-scoped alias of `trace get`)\")\n .action(async (conversationId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).trace.spans(conversationId), outputOptions(cmd));\n });\n\n const skill = cmd.command(\"skill\").description(\"Manage skills attached to an agent\");\n skill\n .command(\"list <agent-id>\")\n .description(\"List skill ids attached to an agent\")\n .action(async (agentId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.skillList(agentId), outputOptions(cmd));\n });\n skill\n .command(\"add <agent-id> <skill-ids>\")\n .description(\"Attach skill(s) to an agent (comma-joined ids)\")\n .action(async (agentId: string, ids: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).agents.skillAdd(agentId, csv(ids) ?? []), outputOptions(cmd));\n });\n skill\n .command(\"remove <agent-id> <skill-ids>\")\n .description(\"Detach skill(s) from an agent (comma-joined ids)\")\n .action(async (agentId: string, ids: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).agents.skillRemove(agentId, csv(ids) ?? []),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n","/** `openbkn bkn …` — knowledge networks (kept identical to legacy `kweaver bkn`). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { validateBknDirectory } from \"../utils/bkn-validate.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { parseEmbeddingFields, parsePkMap } from \"../utils/pk-detection.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function bknCommand(): Command {\n const bkn = new Command(\"bkn\").description(\"Knowledge networks — list, query, schema, instances\");\n\n bkn\n .command(\"list\")\n .description(\"List knowledge networks\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .option(\"--name-pattern <s>\", \"filter by name pattern\")\n .option(\"--tag <s>\", \"filter by tag\")\n .option(\"--sort <field>\", \"sort field\", \"update_time\")\n .option(\"--direction <dir>\", \"asc | desc\", \"desc\")\n .action(async (_opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const data = await clientFrom(cmd).kn.list({\n limit: o.limit,\n offset: o.offset,\n namePattern: o.namePattern,\n tag: o.tag,\n sort: o.sort,\n direction: o.direction,\n });\n printJson(data, outputOptions(cmd));\n });\n\n bkn\n .command(\"get <kn-id>\")\n .description(\"Get a knowledge network (use --stats or --export)\")\n .option(\"--stats\", \"include statistics\")\n .option(\"--export\", \"return the full export payload\")\n .action(async (knId: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).kn.get(knId, {\n stats: opts.stats,\n exportMode: opts.export,\n });\n printJson(data, outputOptions(cmd));\n });\n\n bkn\n .command(\"search <kn-id> <query>\")\n .description(\"Semantic search within a knowledge network\")\n .option(\"--max-concepts <n>\", \"max concepts to return\", int, 10)\n .option(\"--mode <mode>\", \"retrieval mode\", \"keyword_vector_retrieval\")\n .action(async (knId: string, query: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).kn.search(knId, query, {\n maxConcepts: opts.maxConcepts,\n mode: opts.mode,\n });\n printJson(data, outputOptions(cmd));\n });\n\n // Schema groups: real list; object-type/relation-type also get real CRUD.\n const schemaGroups: Array<\n [string, \"objectTypes\" | \"relationTypes\" | \"actionTypes\", \"objectType\" | \"relationType\" | null]\n > = [\n [\"object-type\", \"objectTypes\", \"objectType\"],\n [\"relation-type\", \"relationTypes\", \"relationType\"],\n [\"action-type\", \"actionTypes\", null],\n ];\n for (const [name, listMethod, crud] of schemaGroups) {\n const g = bkn.command(name).description(`${name} list/get/...`);\n g.command(\"list <kn-id>\")\n .description(`List ${name}s`)\n .option(\"--branch <b>\", \"branch\", \"main\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[listMethod](knId, { branch: opts.branch }),\n outputOptions(cmd),\n );\n });\n if (crud) {\n g.command(\"get <kn-id> <id>\")\n .description(`Get ${name}`)\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn[`${crud}Get`](knId, id), outputOptions(cmd));\n });\n g.command(\"create <kn-id>\")\n .description(`Create ${name} (--body / --body-file)`)\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[`${crud}Create`](knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n g.command(\"update <kn-id> <id>\")\n .description(`Update ${name} (--body / --body-file)`)\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn[`${crud}Update`](knId, id, readBody(opts)),\n outputOptions(cmd),\n );\n });\n g.command(\"delete <kn-id> <id>\")\n .description(`Delete ${name}`)\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn[`${crud}Delete`](knId, id), outputOptions(cmd));\n });\n }\n }\n\n // Real action-type query + execute on the action-type group.\n const actionType = bkn.commands.find((c) => c.name() === \"action-type\");\n actionType\n ?.command(\"query <kn-id> <at-id>\")\n .description(\"Query an action type (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, atId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionTypeQuery(knId, atId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n actionType\n ?.command(\"execute <kn-id> <at-id>\")\n .description(\"Execute an action type (--body / --body-file envelope JSON)\")\n .option(\"--body <json>\", \"execution envelope JSON\")\n .option(\"--body-file <path>\", \"read envelope JSON from a file\")\n .action(async (knId: string, atId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionTypeExecute(knId, atId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n actionType\n ?.command(\"inputs <kn-id> <at-id>\")\n .description(\"Get an action type's input schema\")\n .action(async (knId: string, atId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionTypeInputs(knId, atId), outputOptions(cmd));\n });\n actionType\n ?.command(\"get <kn-id> <at-id>\")\n .description(\"Get an action type\")\n .action(async (knId: string, atId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionTypeGet(knId, atId), outputOptions(cmd));\n });\n\n // stats/export are aliases of `get --stats` / `get --export`.\n bkn\n .command(\"stats <kn-id>\")\n .description(\"Get knowledge-network statistics (alias for get --stats)\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.get(knId, { stats: true }), outputOptions(cmd));\n });\n bkn\n .command(\"export <kn-id>\")\n .description(\"Export a knowledge network (alias for get --export)\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.get(knId, { exportMode: true }), outputOptions(cmd));\n });\n\n // Real object-type instance query + properties (the rest are stubs above).\n const objectType = bkn.commands.find((c) => c.name() === \"object-type\");\n objectType\n ?.command(\"query <kn-id> <ot-id>\")\n .description(\"Query instances of an object type (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, otId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.objectTypeQuery(knId, otId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n objectType\n ?.command(\"properties <kn-id> <ot-id>\")\n .description(\"Get an object type's calculated properties\")\n .action(async (knId: string, otId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.objectTypeProperties(knId, otId), outputOptions(cmd));\n });\n\n bkn\n .command(\"create <name>\")\n .description(\"Create an (empty) knowledge network\")\n .option(\"--branch <b>\", \"branch\", \"main\")\n .action(async (name: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.create({ name, branch: opts.branch }), outputOptions(cmd));\n });\n\n bkn\n .command(\"update <kn-id>\")\n .description(\"Update a knowledge network (--body / --body-file)\")\n .option(\"--body <json>\", \"update body JSON\")\n .option(\"--body-file <path>\", \"read update body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.update(knId, readBody(opts)), outputOptions(cmd));\n });\n\n bkn\n .command(\"delete <kn-id>\")\n .description(\"Delete a knowledge network\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.delete(knId), outputOptions(cmd));\n });\n\n bkn\n .command(\"subgraph <kn-id>\")\n .description(\"Query a subgraph (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"subgraph query JSON\")\n .option(\"--body-file <path>\", \"read subgraph query JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.subgraph(knId, readBody(opts)), outputOptions(cmd));\n });\n\n const actionLog = bkn.command(\"action-log\").description(\"Action logs — list/get/cancel\");\n actionLog\n .command(\"list <kn-id>\")\n .description(\"List action logs\")\n .option(\"--status <s>\", \"filter by status\")\n .option(\"--action-type-id <id>\", \"filter by action type\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionLogs(knId, {\n status: opts.status,\n actionTypeId: opts.actionTypeId,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n actionLog\n .command(\"get <kn-id> <log-id>\")\n .description(\"Get an action log\")\n .action(async (knId: string, logId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionLog(knId, logId), outputOptions(cmd));\n });\n actionLog\n .command(\"cancel <kn-id> <log-id>\")\n .description(\"Cancel a running action\")\n .action(async (knId: string, logId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.cancelActionLog(knId, logId), outputOptions(cmd));\n });\n\n bkn\n .command(\"action-execution <kn-id> <execution-id>\")\n .description(\"Get action execution status\")\n .action(async (knId: string, execId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionExecution(knId, execId), outputOptions(cmd));\n });\n\n const metric = bkn.command(\"metric\").description(\"Metrics — query / dry-run\");\n metric\n .command(\"query <kn-id> <metric-id>\")\n .description(\"Query a metric's data (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"query JSON\")\n .option(\"--body-file <path>\", \"read query JSON from a file\")\n .action(async (knId: string, metricId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.metricQuery(knId, metricId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n metric\n .command(\"dry-run <kn-id>\")\n .description(\"Dry-run a metric definition (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"metric definition JSON\")\n .option(\"--body-file <path>\", \"read metric definition JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricDryRun(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"list <kn-id>\")\n .description(\"List metrics\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricList(knId), outputOptions(cmd));\n });\n metric\n .command(\"get <kn-id> <metric-id>\")\n .description(\"Get a metric\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricGet(knId, id), outputOptions(cmd));\n });\n metric\n .command(\"create <kn-id>\")\n .description(\"Create a metric (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricCreate(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"update <kn-id> <metric-id>\")\n .description(\"Update a metric (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.metricUpdate(knId, id, readBody(opts)),\n outputOptions(cmd),\n );\n });\n metric\n .command(\"delete <kn-id> <metric-id>\")\n .description(\"Delete a metric\")\n .action(async (knId: string, id: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricDelete(knId, id), outputOptions(cmd));\n });\n metric\n .command(\"search <kn-id>\")\n .description(\"Search metrics (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricSearch(knId, readBody(opts)), outputOptions(cmd));\n });\n metric\n .command(\"validate <kn-id>\")\n .description(\"Validate a metric definition (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.metricValidate(knId, readBody(opts)), outputOptions(cmd));\n });\n\n const cg = bkn.command(\"concept-group\").description(\"Concept groups — list/get\");\n cg.command(\"list <kn-id>\")\n .description(\"List concept groups\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroups(knId), outputOptions(cmd));\n });\n cg.command(\"get <kn-id> <cg-id>\")\n .description(\"Get a concept group\")\n .action(async (knId: string, cgId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroup(knId, cgId), outputOptions(cmd));\n });\n cg.command(\"create <kn-id>\")\n .description(\"Create a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupCreate(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"update <kn-id> <cg-id>\")\n .description(\"Update a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, cgId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupUpdate(knId, cgId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"delete <kn-id> <cg-id>\")\n .description(\"Delete a concept group\")\n .action(async (knId: string, cgId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.conceptGroupDelete(knId, cgId), outputOptions(cmd));\n });\n cg.command(\"add-members <kn-id> <cg-id>\")\n .description(\"Add object types to a concept group (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, cgId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupAddMembers(knId, cgId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cg.command(\"remove-members <kn-id> <cg-id> <ot-ids>\")\n .description(\"Remove object types (comma-joined ids) from a concept group\")\n .action(async (knId: string, cgId: string, otIds: string, _o, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.conceptGroupRemoveMembers(knId, cgId, otIds),\n outputOptions(cmd),\n );\n });\n\n const sched = bkn.command(\"action-schedule\").description(\"Action schedules — list/get\");\n sched\n .command(\"list <kn-id>\")\n .description(\"List action schedules\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionSchedules(knId), outputOptions(cmd));\n });\n sched\n .command(\"get <kn-id> <schedule-id>\")\n .description(\"Get an action schedule\")\n .action(async (knId: string, sId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionSchedule(knId, sId), outputOptions(cmd));\n });\n sched\n .command(\"create <kn-id>\")\n .description(\"Create an action schedule (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleCreate(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"update <kn-id> <schedule-id>\")\n .description(\"Update an action schedule (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, sId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleUpdate(knId, sId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"set-status <kn-id> <schedule-id>\")\n .description(\"Set an action schedule's status (--body / --body-file)\")\n .option(\"--body <json>\", \"body JSON\")\n .option(\"--body-file <path>\", \"read body JSON from a file\")\n .action(async (knId: string, sId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.actionScheduleSetStatus(knId, sId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n sched\n .command(\"delete <kn-id> <schedule-ids>\")\n .description(\"Delete action schedule(s) (comma-joined ids)\")\n .action(async (knId: string, ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.actionScheduleDelete(knId, ids), outputOptions(cmd));\n });\n\n const job = bkn.command(\"job\").description(\"Build jobs — list/get/tasks\");\n job\n .command(\"list <kn-id>\")\n .description(\"List jobs\")\n .action(async (knId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobs(knId), outputOptions(cmd));\n });\n job\n .command(\"get <kn-id> <job-id>\")\n .description(\"Get a job\")\n .action(async (knId: string, jobId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.job(knId, jobId), outputOptions(cmd));\n });\n job\n .command(\"tasks <kn-id> <job-id>\")\n .description(\"List a job's tasks\")\n .action(async (knId: string, jobId: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobTasks(knId, jobId), outputOptions(cmd));\n });\n job\n .command(\"delete <kn-id> <job-ids>\")\n .description(\"Delete job(s) (comma-joined ids)\")\n .action(async (knId: string, ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.jobDelete(knId, ids), outputOptions(cmd));\n });\n\n bkn\n .command(\"push <directory>\")\n .description(\"Pack a BKN directory into a tar and import it as a knowledge network\")\n .option(\"--branch <name>\", \"target branch\", \"main\")\n .option(\"--build\", \"submit a Vega build task for each object type declaring a vector index\")\n .option(\n \"--embedding-model <id>\",\n \"embedding model id for declared vector indexes (with --build)\",\n )\n .action(async (dir: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.push(dir, {\n branch: opts.branch,\n build: Boolean(opts.build),\n embeddingModel: opts.embeddingModel,\n }),\n outputOptions(cmd),\n );\n });\n bkn\n .command(\"pull <kn-id> [directory]\")\n .description(\"Download a knowledge network as a BKN tar and extract it locally\")\n .option(\"--branch <name>\", \"source branch\", \"main\")\n .action(async (knId: string, dir: string | undefined, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.pull(knId, dir ?? knId, { branch: opts.branch }),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"relation-type-paths <kn-id>\")\n .description(\"Query relation-type paths between object types (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"request JSON\")\n .option(\"--body-file <path>\", \"read request JSON from a file\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.relationTypePaths(knId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"resources\")\n .description(\"List BKN-backend resources\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).kn.bknResources(), outputOptions(cmd));\n });\n\n bkn\n .command(\"create-from-catalog <catalog-id>\")\n .description(\"Build a knowledge network from a Vega catalog's tables\")\n .requiredOption(\"--name <name>\", \"knowledge network name\")\n .option(\"--tables <list>\", \"comma-separated table names (default: all)\")\n .option(\"--pk-map <map>\", \"explicit primary keys: '<table>:<col>[,<table>:<col>...]'\")\n .option(\"--build\", \"submit a Vega build task per resource after creation\")\n .option(\n \"--embedding-fields <map>\",\n \"columns to vectorize per table (with --build): '<table>:<col>[+<col>...][,...]'\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id for the vector index (with --build)\")\n .option(\"--no-rollback\", \"keep a partially-created KN on failure\")\n .action(async (catalogId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.createFromCatalog({\n catalogId,\n name: opts.name,\n tables: csv(opts.tables),\n pkMap: opts.pkMap ? parsePkMap(opts.pkMap) : undefined,\n build: Boolean(opts.build),\n embeddingFields: opts.embeddingFields\n ? parseEmbeddingFields(opts.embeddingFields)\n : undefined,\n embeddingModel: opts.embeddingModel,\n noRollback: opts.rollback === false,\n onProgress: (m) => console.error(m),\n }),\n outputOptions(cmd),\n );\n });\n\n bkn\n .command(\"validate <directory>\")\n .description(\"Validate a local BKN directory's structure (offline)\")\n .action(async (dir: string, _opts, cmd: Command) => {\n const result = validateBknDirectory(dir);\n printJson(result, outputOptions(cmd));\n if (!result.valid) process.exitCode = 1;\n });\n\n bkn\n .command(\"create-from-csv <catalog-id>\")\n .description(\"Import CSV files into a Vega catalog, then build a KN from them\")\n .requiredOption(\"--files <glob>\", \"CSV paths (comma-separated or glob)\")\n .requiredOption(\"--name <name>\", \"knowledge network name\")\n .option(\"--table-prefix <s>\", \"prefix for derived table names\", \"\")\n .option(\"--batch-size <n>\", \"rows per insert batch\", int, 500)\n .option(\"--tables <list>\", \"subset of imported tables to include in the KN\")\n .option(\"--pk-map <map>\", \"explicit primary keys: '<table>:<col>[,...]'\")\n .option(\"--build\", \"submit a Vega build task per resource after creation\")\n .option(\n \"--embedding-fields <map>\",\n \"columns to vectorize per table (with --build): '<table>:<col>[+<col>...][,...]'\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id for the vector index (with --build)\")\n .option(\"--no-rollback\", \"keep a partially-created KN on failure\")\n .action(async (catalogId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).kn.createFromCsv({\n catalogId,\n name: opts.name,\n files: opts.files,\n tablePrefix: opts.tablePrefix,\n batchSize: opts.batchSize,\n tables: csv(opts.tables),\n pkMap: opts.pkMap ? parsePkMap(opts.pkMap) : undefined,\n build: Boolean(opts.build),\n embeddingFields: opts.embeddingFields\n ? parseEmbeddingFields(opts.embeddingFields)\n : undefined,\n embeddingModel: opts.embeddingModel,\n noRollback: opts.rollback === false,\n onProgress: (m) => console.error(m),\n }),\n outputOptions(cmd),\n );\n });\n\n return group(bkn, \"AI DATA PLATFORM\");\n}\n","/**\n * Structural validation of a local BKN directory. This is a slim, dependency-free\n * check (the full `@kweaver-ai/bkn` network model is not vendored): it parses the\n * frontmatter of every `.bkn` file and verifies the network is internally\n * consistent enough to push — required files, well-formed frontmatter, object-type\n * name limits, unique ids, and relation endpoints that reference real object types.\n */\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\n\n// validateObjectName parity: ISF caps BKN object names at 40 utf-8 codepoints.\nexport const BKN_OBJECT_NAME_MAX_LENGTH = 40;\n\nexport interface ValidationResult {\n valid: boolean;\n dir: string;\n counts: { objectTypes: number; relationTypes: number; conceptGroups: number };\n errors: string[];\n warnings: string[];\n}\n\ninterface Frontmatter {\n type?: string;\n id?: string;\n name?: string;\n}\n\n/** Parse a leading `--- ... ---` YAML-ish frontmatter block (flat scalars only). */\nfunction parseFrontmatter(text: string): Frontmatter | null {\n if (!text.startsWith(\"---\")) return null;\n const end = text.indexOf(\"\\n---\", 3);\n if (end === -1) return null;\n const block = text.slice(3, end);\n const fm: Frontmatter = {};\n for (const line of block.split(\"\\n\")) {\n const m = line.match(/^\\s*(type|id|name)\\s*:\\s*(.+?)\\s*$/);\n if (m?.[1]) fm[m[1] as keyof Frontmatter] = m[2]?.replace(/^[\"']|[\"']$/g, \"\");\n }\n return fm;\n}\n\nfunction bknFiles(dir: string): string[] {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".bkn\"))\n .map((f) => join(dir, f));\n}\n\n/** Pull (source, target) object-type ids out of a relation file's Endpoint table. */\nfunction endpointRefs(text: string): Array<{ source: string; target: string }> {\n const refs: Array<{ source: string; target: string }> = [];\n const idx = text.indexOf(\"### Endpoint\");\n if (idx === -1) return refs;\n // Only the Endpoint section — stop at the next heading (e.g. Mapping Rules).\n const after = text.slice(idx + \"### Endpoint\".length);\n const next = after.indexOf(\"\\n###\");\n const section = next === -1 ? after : after.slice(0, next);\n for (const line of section.split(\"\\n\")) {\n const cells = line\n .split(\"|\")\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length < 2) continue;\n const [source, target] = cells;\n if (!source || !target) continue;\n if (/^source$/i.test(source) || /^-+$/.test(source)) continue; // header / divider\n refs.push({ source, target });\n }\n return refs;\n}\n\nexport function validateBknDirectory(dirPath: string): ValidationResult {\n const dir = resolve(dirPath);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n return {\n valid: false,\n dir,\n counts: { objectTypes: 0, relationTypes: 0, conceptGroups: 0 },\n errors: [`Not a directory: ${dir}`],\n warnings: [],\n };\n }\n\n // network.bkn — required, must declare a knowledge_network.\n const networkPath = join(dir, \"network.bkn\");\n if (!existsSync(networkPath)) {\n errors.push(\"Missing network.bkn at the BKN root.\");\n } else {\n const fm = parseFrontmatter(readFileSync(networkPath, \"utf8\"));\n if (!fm) errors.push(\"network.bkn has no frontmatter block.\");\n else {\n if (fm.type !== \"knowledge_network\")\n errors.push(`network.bkn type must be 'knowledge_network', got '${fm.type ?? \"\"}'.`);\n if (!fm.id) errors.push(\"network.bkn is missing 'id'.\");\n if (!fm.name) errors.push(\"network.bkn is missing 'name'.\");\n }\n }\n\n // Object types.\n const otIds = new Set<string>();\n const otFiles = bknFiles(join(dir, \"object_types\"));\n for (const file of otFiles) {\n const fm = parseFrontmatter(readFileSync(file, \"utf8\"));\n const rel = file.slice(dir.length + 1);\n if (!fm || fm.type !== \"object_type\") {\n errors.push(`${rel}: not a valid object_type (missing/wrong frontmatter type).`);\n continue;\n }\n if (!fm.id) errors.push(`${rel}: object_type missing 'id'.`);\n if (!fm.name) errors.push(`${rel}: object_type missing 'name'.`);\n if (fm.name && [...fm.name].length > BKN_OBJECT_NAME_MAX_LENGTH) {\n errors.push(\n `${rel}: object_type name exceeds ${BKN_OBJECT_NAME_MAX_LENGTH} codepoints ('${fm.name}').`,\n );\n }\n if (fm.id) {\n if (otIds.has(fm.id)) errors.push(`Duplicate object_type id '${fm.id}'.`);\n otIds.add(fm.id);\n }\n }\n\n // Relation types — validate frontmatter + endpoint references.\n const rtFiles = bknFiles(join(dir, \"relation_types\"));\n for (const file of rtFiles) {\n const text = readFileSync(file, \"utf8\");\n const fm = parseFrontmatter(text);\n const rel = file.slice(dir.length + 1);\n if (!fm || fm.type !== \"relation_type\") {\n errors.push(`${rel}: not a valid relation_type (missing/wrong frontmatter type).`);\n continue;\n }\n if (!fm.id) errors.push(`${rel}: relation_type missing 'id'.`);\n for (const { source, target } of endpointRefs(text)) {\n if (otIds.size > 0 && !otIds.has(source))\n warnings.push(`${rel}: endpoint source '${source}' is not a known object_type.`);\n if (otIds.size > 0 && !otIds.has(target))\n warnings.push(`${rel}: endpoint target '${target}' is not a known object_type.`);\n }\n }\n\n const cgFiles = bknFiles(join(dir, \"concept_groups\"));\n\n return {\n valid: errors.length === 0,\n dir,\n counts: {\n objectTypes: otFiles.length,\n relationTypes: rtFiles.length,\n conceptGroups: cgFiles.length,\n },\n errors,\n warnings,\n };\n}\n","/** `openbkn call`/`curl` — curl-style API passthrough with auth headers. */\nimport { Command } from \"commander\";\nimport { rawCall } from \"../api/call.js\";\nimport { resolveContext } from \"../config/resolve.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\nfunction collect(value: string, prev: string[]): string[] {\n prev.push(value);\n return prev;\n}\n\nexport function callCommand(): Command {\n const cmd = new Command(\"call\")\n .alias(\"curl\")\n .description(\"Call an API with curl-style flags and auto-injected auth headers\")\n .argument(\"<url>\", \"API path (e.g. /api/...) or absolute URL\")\n .option(\"-X, --request <method>\", \"HTTP method\")\n .option(\"-H, --header <header>\", 'extra header \"Name: value\" (repeatable)', collect, [])\n .option(\"-d, --data <body>\", \"request body (sets JSON content-type if unset)\")\n .option(\"--data-raw <body>\", \"alias for --data\")\n .option(\n \"-F, --form <field>\",\n \"multipart field key=value or key=@file (repeatable)\",\n collect,\n [],\n )\n .option(\"-v, --verbose\", \"print request line to stderr\")\n .action(async (url: string, opts, cmd: Command) => {\n const g = cmd.optsWithGlobals();\n const ctx = resolveContext({\n baseUrl: g.baseUrl,\n token: g.token,\n user: g.user,\n businessDomain: g.bizDomain,\n insecure: g.insecure,\n });\n const res = await rawCall(ctx, url, {\n method: opts.request,\n header: opts.header,\n data: opts.data ?? opts.dataRaw,\n form: opts.form,\n businessDomain: g.bizDomain,\n verbose: opts.verbose,\n });\n\n // Pretty-print JSON bodies; pass anything else through verbatim.\n const out = outputOptions(cmd);\n try {\n printJson(JSON.parse(res.body), out);\n } catch {\n process.stdout.write(res.body.endsWith(\"\\n\") ? res.body : `${res.body}\\n`);\n }\n if (res.status >= 400) process.exitCode = 1;\n });\n\n return group(cmd, \"AUTHENTICATION & CONFIG\");\n}\n","/** `openbkn config …` — active platform + per-platform business domain. */\nimport { Command } from \"commander\";\nimport {\n activePlatform,\n readPlatformConfig,\n setActivePlatform,\n writePlatformConfig,\n} from \"../config/store.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { outputOptions } from \"./_shared.js\";\n\nfunction requireActive(): string {\n const baseUrl = activePlatform();\n if (!baseUrl) throw new InputError(\"No active platform. Run `openbkn auth login <url>` first.\");\n return baseUrl;\n}\n\nexport function configCommand(): Command {\n const config = new Command(\"config\").description(\"Per-platform CLI configuration\");\n\n config\n .command(\"show\")\n .description(\"Show the active platform and business domain\")\n .action((_opts, cmd: Command) => {\n const baseUrl = activePlatform();\n printJson(\n {\n baseUrl,\n businessDomain: baseUrl ? readPlatformConfig(baseUrl).businessDomain : undefined,\n },\n outputOptions(cmd),\n );\n });\n\n config\n .command(\"set <key> <value>\")\n .description(\"Set a config value (baseUrl | businessDomain)\")\n .action((key: string, value: string, _opts, cmd: Command) => {\n if (key === \"baseUrl\") {\n setActivePlatform(value.replace(/\\/+$/, \"\"));\n } else if (key === \"businessDomain\") {\n writePlatformConfig(requireActive(), { businessDomain: value });\n } else {\n throw new InputError(`Unknown config key: ${key} (expected baseUrl | businessDomain)`);\n }\n printJson({ ok: true, key, value }, outputOptions(cmd));\n });\n\n config\n .command(\"set-bd <value>\")\n .description(\"Set the default business domain for the active platform\")\n .action((value: string, _opts, cmd: Command) => {\n const baseUrl = requireActive();\n writePlatformConfig(baseUrl, { businessDomain: value });\n printJson({ baseUrl, businessDomain: value }, outputOptions(cmd));\n });\n\n config\n .command(\"list-bd\")\n .description(\"List business domains (requires login)\")\n .action(() => {\n throw new InputError(\"Not yet implemented — requires backend business-domains API.\");\n });\n\n return group(config, \"AUTHENTICATION & CONFIG\");\n}\n","/** `openbkn context …` (alias of legacy context-loader) — MCP retrieval. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function contextCommand(): Command {\n const cmd = new Command(\"context\").description(\n \"Context loader (MCP) — schema discovery, instance query, skill recall\",\n );\n\n cmd\n .command(\"search-schema <kn-id> <query>\")\n .description(\"Search object/relation/action/metric schemas\")\n .option(\"--scope <list>\", \"comma-separated scopes (object,relation,action,metric)\")\n .option(\"--max <n>\", \"max concepts\", int)\n .action(async (knId: string, query: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).context.searchSchema(knId, query, {\n searchScope: opts.scope ? String(opts.scope).split(\",\") : undefined,\n maxConcepts: opts.max,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"query-object-instance <kn-id>\")\n .description(\"Query object instances (provide --args as JSON)\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n printJson(await clientFrom(cmd).context.queryObjectInstance(knId, args), outputOptions(cmd));\n });\n\n cmd\n .command(\"find-skills <kn-id> <object-type-id>\")\n .description(\"Recall skills for an object type\")\n .option(\"--top-k <n>\", \"max skills (1-20)\", int)\n .action(async (knId: string, otId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.findSkills(knId, otId, opts.topK),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"tools <kn-id>\")\n .description(\"List MCP tools\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.tools(knId), outputOptions(cmd));\n });\n\n cmd\n .command(\"tool-call <kn-id> <name>\")\n .description(\"Call any MCP tool directly (--args JSON)\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, name: string, opts, cmd: Command) => {\n let args: Record<string, unknown>;\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n printJson(await clientFrom(cmd).context.toolCall(knId, name, args), outputOptions(cmd));\n });\n\n cmd\n .command(\"resources <kn-id>\")\n .description(\"List MCP resources\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.resources(knId), outputOptions(cmd));\n });\n cmd\n .command(\"resource <kn-id> <uri>\")\n .description(\"Read one MCP resource by uri\")\n .action(async (knId: string, uri: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.resource(knId, uri), outputOptions(cmd));\n });\n cmd\n .command(\"templates <kn-id>\")\n .description(\"List MCP resource templates\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.templates(knId), outputOptions(cmd));\n });\n cmd\n .command(\"prompts <kn-id>\")\n .description(\"List MCP prompts\")\n .action(async (knId: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).context.prompts(knId), outputOptions(cmd));\n });\n cmd\n .command(\"prompt <kn-id> <name>\")\n .description(\"Get one MCP prompt (--args JSON for prompt arguments)\")\n .option(\"--args <json>\", \"prompt arguments as JSON\")\n .action(async (knId: string, name: string, opts, cmd: Command) => {\n let args: Record<string, unknown> | undefined;\n if (opts.args) {\n try {\n args = JSON.parse(opts.args);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n }\n printJson(await clientFrom(cmd).context.prompt(knId, name, args), outputOptions(cmd));\n });\n\n const jsonArgs = (raw: string): Record<string, unknown> => {\n try {\n return JSON.parse(raw);\n } catch {\n throw new InputError(\"--args must be valid JSON\");\n }\n };\n cmd\n .command(\"query-instance-subgraph <kn-id>\")\n .description(\"Layer-2: query an instance subgraph across relation-type paths\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.queryInstanceSubgraph(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"get-logic-properties <kn-id>\")\n .description(\"Layer-3: compute logic-property values for instances\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.logicProperties(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"get-action-info <kn-id>\")\n .description(\"Layer-3: fetch action info / dynamic tools for an instance\")\n .requiredOption(\"--args <json>\", \"tool arguments as JSON\")\n .action(async (knId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).context.actionInfo(knId, jsonArgs(opts.args)),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/** `openbkn dataflow …` — document/data flow workflows. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function dataflowCommand(): Command {\n const cmd = new Command(\"dataflow\").description(\"Dataflow document workflows — list, runs, logs\");\n\n cmd\n .command(\"list\")\n .description(\"List all dataflows\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).dataflows.list(), outputOptions(cmd));\n });\n\n cmd\n .command(\"runs <dagId>\")\n .description(\"List run records for one dataflow\")\n .option(\"--since <date>\", \"filter runs since a date\")\n .action(async (dagId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.runs(dagId, { since: opts.since }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"logs <dagId> <instanceId>\")\n .description(\"Show logs for one run\")\n .option(\"--page <n>\", \"page\", int, 0)\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (dagId: string, instanceId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.logs(dagId, instanceId, {\n page: opts.page,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"run <dagId>\")\n .description(\"Trigger a dataflow run from a remote file URL\")\n .requiredOption(\"--url <url>\", \"remote file URL\")\n .requiredOption(\"--name <name>\", \"file name\")\n .action(async (dagId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.run(dagId, opts.url, opts.name),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"create\")\n .description(\"Create a dataflow (DAG) from a full document body (--body / --body-file)\")\n .option(\"--body <json>\", \"dataflow document JSON\")\n .option(\"--body-file <path>\", \"read the dataflow document JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).dataflows.create(readBody(opts)), outputOptions(cmd));\n });\n\n const parseSet = (pairs: string[] | undefined): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const item of pairs ?? []) {\n const i = item.indexOf(\"=\");\n if (i > 0) out[item.slice(0, i)] = item.slice(i + 1);\n }\n return out;\n };\n cmd\n .command(\"templates\")\n .description(\"List available dataset/bkn/dataflow templates\")\n .action(async (_opts, cmd: Command) => {\n printJson(clientFrom(cmd).dataflows.templates(), outputOptions(cmd));\n });\n cmd\n .command(\"create-dataset\")\n .description(\"Create a dataset from a template (--template <name> --set k=v ...)\")\n .requiredOption(\"--template <name>\", \"template name\")\n .option(\n \"--set <kv...>\",\n \"set a template argument (key=value); repeatable\",\n (v, acc: string[]) => {\n acc.push(v);\n return acc;\n },\n [] as string[],\n )\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.createDataset(opts.template, parseSet(opts.set)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"create-bkn\")\n .description(\"Create a knowledge network from a template (--template <name> --set k=v ...)\")\n .requiredOption(\"--template <name>\", \"template name\")\n .option(\n \"--set <kv...>\",\n \"set a template argument (key=value); repeatable\",\n (v, acc: string[]) => {\n acc.push(v);\n return acc;\n },\n [] as string[],\n )\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).dataflows.createBkn(opts.template, parseSet(opts.set)),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/**\n * `openbkn explore` — a minimal local web server exposing read-only JSON\n * endpoints for **bkn** and **vega** (no SPA bundle, no chat). Reuses the\n * configured client; meant for quick local data poking, not a full UI.\n */\nimport { type IncomingMessage, type ServerResponse, createServer } from \"node:http\";\nimport { Command } from \"commander\";\nimport type { BknClient } from \"../client.js\";\nimport { group } from \"../help/grouped-help.js\";\nimport { clientFrom } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\ntype Handler = (\n client: BknClient,\n query: URLSearchParams,\n body: Record<string, unknown>,\n) => Promise<unknown>;\n\n/** Route table: `${METHOD} ${pathname}` → handler. bkn + vega read paths only. */\nconst ROUTES: Record<string, Handler> = {\n \"GET /api/bkn/meta\": (c, q) => c.kn.get(req(q, \"knId\")),\n \"POST /api/bkn/search\": (c, _q, b) =>\n c.kn.search(str(b.knId), str(b.query), {\n maxConcepts: typeof b.maxConcepts === \"number\" ? b.maxConcepts : undefined,\n }),\n \"POST /api/bkn/instances\": (c, _q, b) =>\n c.kn.objectTypeQuery(str(b.knId), str(b.objectTypeId), b.body ?? {}),\n \"POST /api/bkn/subgraph\": (c, _q, b) => c.kn.subgraph(str(b.knId), b.body ?? b),\n \"POST /api/bkn/properties\": (c, _q, b) =>\n c.kn.objectTypeProperties(str(b.knId), str(b.objectTypeId)),\n \"GET /api/vega/catalogs\": (c) => c.vega.catalogs(),\n \"GET /api/vega/catalog\": (c, q) => c.vega.getCatalog(req(q, \"catalogId\")),\n \"GET /api/vega/catalog-resources\": (c, q) =>\n c.vega.catalogResources(req(q, \"catalogId\"), q.get(\"category\") ?? undefined),\n \"GET /api/vega/connector-types\": (c) => c.vega.connectorTypes(),\n \"POST /api/vega/query\": (c, _q, b) => c.resource.query(str(b.resourceId), b.options ?? {}),\n};\n\nfunction str(v: unknown): string {\n return typeof v === \"string\" ? v : String(v ?? \"\");\n}\nfunction req(q: URLSearchParams, key: string): string {\n const v = q.get(key);\n if (!v) throw new Error(`missing query param: ${key}`);\n return v;\n}\n\nfunction readBody(reqMsg: IncomingMessage): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n reqMsg.on(\"data\", (chunk) => {\n data += chunk;\n });\n reqMsg.on(\"end\", () => {\n if (!data.trim()) return resolve({});\n try {\n resolve(JSON.parse(data) as Record<string, unknown>);\n } catch {\n reject(new Error(\"invalid JSON body\"));\n }\n });\n reqMsg.on(\"error\", reject);\n });\n}\n\nconst INDEX = `<!doctype html><meta charset=\"utf-8\"><title>openbkn explore</title>\n<h1>openbkn explore</h1>\n<p>Read-only JSON endpoints for bkn + vega:</p>\n<ul>${Object.keys(ROUTES)\n .map((r) => `<li><code>${r}</code></li>`)\n .join(\"\")}</ul>`;\n\nexport function exploreCommand(): Command {\n const cmd = new Command(\"explore\").description(\n \"Start a local web server with read-only bkn + vega JSON endpoints\",\n );\n cmd\n .option(\"--port <n>\", \"port to listen on\", int, 7777)\n .option(\"--host <h>\", \"host to bind\", \"127.0.0.1\")\n .action(async (opts, command: Command) => {\n const client = clientFrom(command);\n const server = createServer((reqMsg, res) => {\n void handle(client, reqMsg, res);\n });\n server.listen(opts.port, opts.host, () => {\n console.error(`openbkn explore running at http://${opts.host}:${opts.port}/`);\n console.error(\"bkn + vega read endpoints only. Press Ctrl+C to stop.\");\n });\n });\n return group(cmd, \"FOUNDATION\");\n}\n\nasync function handle(\n client: BknClient,\n reqMsg: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n const url = new URL(reqMsg.url ?? \"/\", \"http://localhost\");\n const method = reqMsg.method ?? \"GET\";\n if (method === \"GET\" && url.pathname === \"/\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(INDEX);\n return;\n }\n const handler = ROUTES[`${method} ${url.pathname}`];\n if (!handler) {\n res.writeHead(404, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n try {\n const body = method === \"GET\" ? {} : await readBody(reqMsg);\n const data = await handler(client, url.searchParams, body);\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify(data ?? null));\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) }));\n }\n}\n","/** `openbkn model …` — model factory (llm / small-model). */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\n/** Management subcommands (add/edit/delete/test) wired to the model resource. */\nfunction addManagementCommands(parent: Command, kind: \"llm\" | \"small\"): void {\n parent\n .command(\"add\")\n .description(\"Register a model (definition JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"model definition JSON\")\n .option(\"--body-file <path>\", \"read model definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].add(readBody(opts)), outputOptions(cmd));\n });\n parent\n .command(\"edit\")\n .description(\"Update a model definition (JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"model definition JSON\")\n .option(\"--body-file <path>\", \"read model definition JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].edit(readBody(opts)), outputOptions(cmd));\n });\n parent\n .command(\"delete <model-ids>\")\n .description(\"Delete model(s) (comma-joined ids)\")\n .action(async (ids: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].delete(csv(ids) ?? []), outputOptions(cmd));\n });\n parent\n .command(\"test\")\n .description(\"Test a model's connectivity / inference (JSON via --body / --body-file)\")\n .option(\"--body <json>\", \"test request JSON\")\n .option(\"--body-file <path>\", \"read test request JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models[kind].test(readBody(opts)), outputOptions(cmd));\n });\n}\n\nexport function modelCommand(): Command {\n const model = new Command(\"model\").description(\"Model factory — LLM / small-model CRUD + chat\");\n\n const llm = model.command(\"llm\").description(\"Large language models\");\n llm\n .command(\"list\")\n .description(\"List LLM models\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--type <t>\", \"model type filter\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.llm.list({\n name: opts.name,\n modelType: opts.type,\n limit: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n llm\n .command(\"get <modelId>\")\n .description(\"Get an LLM model\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models.llm.get(id), outputOptions(cmd));\n });\n llm\n .command(\"chat <modelId>\")\n .description(\"OpenAI-compatible chat completion\")\n .requiredOption(\"-m, --message <text>\", \"user message\")\n .option(\"--stream\", \"stream the reply token-by-token to stdout\")\n .action(async (id: string, opts, cmd: Command) => {\n const messages = [{ role: \"user\", content: opts.message }];\n if (opts.stream) {\n await clientFrom(cmd).models.llm.chatStream(id, messages, (t) => process.stdout.write(t));\n process.stdout.write(\"\\n\");\n return;\n }\n printJson(await clientFrom(cmd).models.llm.chat(id, messages), outputOptions(cmd));\n });\n addManagementCommands(llm, \"llm\");\n\n const small = model.command(\"small\").description(\"Small models (embedding / reranker)\");\n small\n .command(\"list\")\n .description(\"List small models\")\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--type <t>\", \"model type filter\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.list({\n name: opts.name,\n modelType: opts.type,\n limit: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n small\n .command(\"get <modelId>\")\n .description(\"Get a small model\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).models.small.get(id), outputOptions(cmd));\n });\n small\n .command(\"embeddings <modelId>\")\n .description(\"Compute embeddings\")\n .requiredOption(\"-i, --input <text>\", \"comma-separated input texts\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.embeddings(id, csv(opts.input) ?? []),\n outputOptions(cmd),\n );\n });\n small\n .command(\"rerank <modelId>\")\n .description(\"Rerank documents against a query\")\n .requiredOption(\"-q, --query <text>\", \"query\")\n .requiredOption(\"-d, --documents <list>\", \"comma-separated documents\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).models.small.rerank(id, opts.query, csv(opts.documents) ?? []),\n outputOptions(cmd),\n );\n });\n addManagementCommands(small, \"small\");\n\n return group(model, \"MODELS & SKILLS\");\n}\n","/** `openbkn resource` (alias `res`) — vega-backend resources. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT, DEFAULT_QUERY_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function resourceCommand(): Command {\n const cmd = new Command(\"resource\")\n .alias(\"res\")\n .description(\"Resources — list, find, get, query, delete\");\n\n cmd\n .command(\"list\")\n .description(\"List resources under a catalog\")\n .option(\"--catalog-id <id>\", \"filter by catalog id\")\n .option(\"--datasource-id <id>\", \"alias of --catalog-id\")\n .option(\"--category <c>\", \"resource category (table | logicview | dataset)\")\n .option(\"--type <c>\", \"alias of --category\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.list({\n datasourceId: opts.catalogId ?? opts.datasourceId,\n category: opts.category ?? opts.type,\n limit: opts.limit,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"find\")\n .description(\"Search resources by name (fuzzy; --exact for strict)\")\n .requiredOption(\"--name <name>\", \"resource name to search\")\n .option(\"--exact\", \"exact name match\")\n .option(\"--catalog-id <id>\", \"limit to a catalog\")\n .option(\"--datasource-id <id>\", \"alias of --catalog-id\")\n .action(async (opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.find(opts.name, {\n exact: opts.exact,\n datasourceId: opts.catalogId ?? opts.datasourceId,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"get <id>\")\n .description(\"Get resource details\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.get(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"query <id>\")\n .description(\"Fetch data rows from a resource\")\n .option(\"--limit <n>\", \"row limit\", int, DEFAULT_QUERY_LIMIT)\n .option(\"--offset <n>\", \"row offset\", int, 0)\n .option(\"--need-total\", \"include total count\")\n .action(async (id: string, opts, cmd: Command) => {\n const data = await clientFrom(cmd).resource.query(id, {\n limit: opts.limit,\n offset: opts.offset,\n needTotal: opts.needTotal,\n });\n printJson(data, outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <id>\")\n .description(\"Delete a resource\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.delete(id), outputOptions(cmd));\n });\n\n return group(cmd, \"AI DATA PLATFORM\");\n}\n","/** `openbkn skill …` — skill registry and market. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function skillCommand(): Command {\n const cmd = new Command(\"skill\").description(\"Skill registry and market\");\n\n const listOpts = (c: Command) =>\n c\n .option(\"--name <s>\", \"filter by name\")\n .option(\"--source <s>\", \"filter by source\")\n .option(\"--status <s>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--page <n>\", \"page\", int, 1);\n\n listOpts(cmd.command(\"list\").description(\"List skills\"))\n .option(\"--create-user <s>\", \"filter by creator\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.list({\n name: opts.name,\n source: opts.source,\n status: opts.status,\n createUser: opts.createUser,\n pageSize: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"get <skill-id>\")\n .description(\"Get a skill by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.get(id), outputOptions(cmd));\n });\n\n listOpts(cmd.command(\"market\").description(\"Browse the skill market\")).action(\n async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.market({\n name: opts.name,\n source: opts.source,\n pageSize: opts.limit,\n page: opts.page,\n }),\n outputOptions(cmd),\n );\n },\n );\n\n cmd\n .command(\"market-get <skill-id>\")\n .description(\"Get a market skill by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.marketGet(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <skill-id>\")\n .description(\"Delete a skill\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"content <skill-id>\")\n .description(\"Read a skill's SKILL.md content index\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.content(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"read-file <skill-id> <rel-path>\")\n .description(\"Read a file inside a skill (progressive)\")\n .action(async (id: string, relPath: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.readFile(id, relPath), outputOptions(cmd));\n });\n\n cmd\n .command(\"history <skill-id>\")\n .description(\"Show a skill's version history\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.history(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"set-status <skill-id> <status>\")\n .description(\"Change status: unpublish | published | offline\")\n .action(async (id: string, status: string, _opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.setStatus(id, status as \"unpublish\" | \"published\" | \"offline\"),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"register <directory>\")\n .description(\"Zip a local skill directory and register it\")\n .option(\"--source <s>\", \"source tag\")\n .option(\"--extend-info <json>\", \"extra metadata as JSON\")\n .action(async (dir: string, opts, cmd: Command) => {\n const extendInfo = opts.extendInfo ? JSON.parse(opts.extendInfo) : undefined;\n printJson(\n await clientFrom(cmd).skills.register(dir, { source: opts.source, extendInfo }),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"download <skill-id> [out-path]\")\n .description(\"Download a skill archive to a local .zip\")\n .action(async (skillId: string, outPath: string | undefined, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.download(skillId, outPath), outputOptions(cmd));\n });\n cmd\n .command(\"install <skill-id> [directory]\")\n .description(\"Download a skill archive and extract it locally\")\n .action(async (skillId: string, dir: string | undefined, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.install(skillId, dir), outputOptions(cmd));\n });\n cmd\n .command(\"update-metadata <skill-id>\")\n .description(\"Update a skill's metadata (--body / --body-file JSON)\")\n .option(\"--body <json>\", \"metadata JSON\")\n .option(\"--body-file <path>\", \"read metadata JSON from a file\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.updateMetadata(skillId, readBody(opts)),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"update-package <skill-id> <directory>\")\n .description(\"Replace a skill's package from a local directory\")\n .action(async (skillId: string, dir: string, _o, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.updatePackage(skillId, dir), outputOptions(cmd));\n });\n\n cmd\n .command(\"republish <skill-id>\")\n .description(\"Republish a previous skill version\")\n .requiredOption(\"--version <v>\", \"version to republish\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).skills.republish(skillId, opts.version), outputOptions(cmd));\n });\n cmd\n .command(\"publish-history <skill-id>\")\n .description(\"Publish a historical skill version\")\n .requiredOption(\"--version <v>\", \"version to publish\")\n .action(async (skillId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).skills.publishHistory(skillId, opts.version),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"MODELS & SKILLS\");\n}\n","/** `openbkn toolbox …` and `openbkn tool …` — agent toolboxes + tools. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { InputError } from \"../utils/errors.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions } from \"./_shared.js\";\n\nconst int = (v: string) => Number.parseInt(v, 10);\n\nexport function toolboxCommand(): Command {\n const cmd = new Command(\"toolbox\").description(\"Agent toolbox lifecycle\");\n\n cmd\n .command(\"list\")\n .description(\"List toolboxes\")\n .option(\"--keyword <s>\", \"filter by keyword\")\n .option(\"--limit <n>\", \"page size\", int, DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", int, 0)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.list({\n keyword: opts.keyword,\n limit: opts.limit,\n offset: opts.offset,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"create\")\n .description(\"Create a toolbox\")\n .requiredOption(\"--name <name>\", \"toolbox name\")\n .requiredOption(\"--service-url <url>\", \"tool service URL\")\n .option(\"--description <d>\", \"description\")\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.create({\n name: opts.name,\n serviceUrl: opts.serviceUrl,\n description: opts.description,\n }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"publish <box-id>\")\n .description(\"Publish a toolbox\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.publish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"unpublish <box-id>\")\n .description(\"Unpublish a toolbox (status=draft)\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.unpublish(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"delete <box-id>\")\n .description(\"Delete a toolbox\")\n .option(\"-y, --yes\", \"skip confirmation\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.delete(id), outputOptions(cmd));\n });\n\n cmd\n .command(\"export <box-id>\")\n .description(\"Export a toolbox config to a local .adp file\")\n .requiredOption(\"-o, --out <file>\", \"output .adp path\")\n .option(\"--type <t>\", \"impex type: toolbox | mcp | operator\", \"toolbox\")\n .action(async (boxId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.export(boxId, opts.out, opts.type),\n outputOptions(cmd),\n );\n });\n cmd\n .command(\"import <file>\")\n .description(\"Import a toolbox config from a local .adp file\")\n .option(\"--type <t>\", \"impex type: toolbox | mcp | operator\", \"toolbox\")\n .action(async (file: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.import(file, opts.type), outputOptions(cmd));\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n\nexport function toolCommand(): Command {\n const cmd = new Command(\"tool\").description(\"Tools inside a toolbox\");\n\n cmd\n .command(\"list\")\n .description(\"List tools in a toolbox\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).toolboxes.tools(opts.toolbox), outputOptions(cmd));\n });\n\n cmd\n .command(\"enable <tool-ids...>\")\n .description(\"Enable one or more tools\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (toolIds: string[], opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.setToolStatus(opts.toolbox, toolIds, \"enabled\"),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"disable <tool-ids...>\")\n .description(\"Disable one or more tools\")\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .action(async (toolIds: string[], opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.setToolStatus(opts.toolbox, toolIds, \"disabled\"),\n outputOptions(cmd),\n );\n });\n\n const invokeOpts = (c: Command) =>\n c\n .requiredOption(\"--toolbox <box-id>\", \"toolbox id\")\n .option(\"--body <json>\", \"request body JSON\")\n .option(\"--header <json>\", \"headers map JSON\")\n .option(\"--query <json>\", \"query params JSON\")\n .option(\"--path <json>\", \"path params JSON\")\n .option(\"--timeout <s>\", \"per-call timeout seconds\", int);\n\n const parseJson = (s: string | undefined, label: string): Record<string, unknown> | undefined => {\n if (!s) return undefined;\n try {\n return JSON.parse(s);\n } catch {\n throw new InputError(`--${label} must be valid JSON`);\n }\n };\n\n const buildEnvelope = (opts: Record<string, string | undefined>) => ({\n body: opts.body ? JSON.parse(opts.body) : undefined,\n header: parseJson(opts.header, \"header\"),\n query: parseJson(opts.query, \"query\"),\n path: parseJson(opts.path, \"path\"),\n timeout: opts.timeout ? Number(opts.timeout) : undefined,\n });\n\n invokeOpts(\n cmd.command(\"execute <tool-id>\").description(\"Invoke a published+enabled tool\"),\n ).action(async (toolId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.execute(opts.toolbox, toolId, buildEnvelope(opts)),\n outputOptions(cmd),\n );\n });\n invokeOpts(\n cmd.command(\"debug <tool-id>\").description(\"Invoke a tool (draft/disabled too)\"),\n ).action(async (toolId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.debug(opts.toolbox, toolId, buildEnvelope(opts)),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"upload <file>\")\n .description(\"Upload a tool definition file (OpenAPI spec) into a toolbox\")\n .requiredOption(\"--toolbox <id>\", \"target toolbox id\")\n .option(\"--metadata-type <t>\", \"metadata type\", \"openapi\")\n .action(async (file: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).toolboxes.upload(opts.toolbox, file, opts.metadataType),\n outputOptions(cmd),\n );\n });\n\n return group(cmd, \"DECISION AGENT\");\n}\n","/** `openbkn trace …` — trace data (search/get) + diagnose + eval-set. */\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { renderReportMarkdown } from \"../trace-ai/diagnose.js\";\nimport { validateSchemaFile } from \"../trace-ai/schema-validate.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, outputOptions, readBody } from \"./_shared.js\";\n\nexport function traceCommand(): Command {\n const cmd = new Command(\"trace\").description(\n \"Trace AI — fetch spans, diagnose (symbolic + LLM rubric), scan, eval-set, schema validate\",\n );\n\n cmd\n .command(\"get <conversation-id>\")\n .description(\"Fetch all trace spans for a conversation\")\n .option(\"--max-spans <n>\", \"max spans\", (v) => Number.parseInt(v, 10))\n .action(async (conversationId: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).trace.spans(conversationId, { maxSpans: opts.maxSpans }),\n outputOptions(cmd),\n );\n });\n\n cmd\n .command(\"search\")\n .description(\"Raw trace search (--body / --body-file OpenSearch JSON)\")\n .option(\"--body <json>\", \"search body JSON\")\n .option(\"--body-file <path>\", \"read search body JSON from a file\")\n .action(async (opts, cmd: Command) => {\n printJson(await clientFrom(cmd).trace.search(readBody(opts)), outputOptions(cmd));\n });\n\n cmd\n .command(\"diagnose <conversation-id>\")\n .description(\"Diagnose a conversation's trace (symbolic rules; --llm adds rubric judging)\")\n .option(\"--llm\", \"also run LLM-judged rubric rules via the local `claude` CLI\")\n .action(async (conversationId: string, opts, cmd: Command) => {\n const report = await clientFrom(cmd).trace.diagnose(conversationId, {\n llm: Boolean(opts.llm),\n });\n const out = outputOptions(cmd);\n if (out.json) printJson(report, out);\n else console.log(renderReportMarkdown(report));\n });\n\n cmd\n .command(\"scan <conversation-ids>\")\n .description(\"Batch-diagnose several conversations (comma-joined) + aggregate findings\")\n .option(\"--llm\", \"hybrid mode (rubric + synthesizer) per trace via local `claude`\")\n .action(async (ids: string, opts, cmd: Command) => {\n const list = ids\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n printJson(\n await clientFrom(cmd).trace.scan(list, { llm: Boolean(opts.llm) }),\n outputOptions(cmd),\n );\n });\n\n const evalSet = cmd.command(\"eval-set\").description(\"Build + run trace eval sets\");\n evalSet\n .command(\"build <queries-file>\")\n .description(\"Build eval cases from a queries JSON file\")\n .option(\"--out <file>\", \"write the cases JSON here (default: stdout)\")\n .action(async (queriesFile: string, opts, cmd: Command) => {\n const raw = JSON.parse(readFileSync(queriesFile, \"utf8\"));\n const cases = clientFrom(cmd).trace.evalSetBuild(raw);\n if (opts.out) {\n writeFileSync(opts.out, JSON.stringify({ cases }, null, 2));\n printJson({ out: opts.out, cases: cases.length }, outputOptions(cmd));\n } else {\n printJson({ cases }, outputOptions(cmd));\n }\n });\n evalSet\n .command(\"test <cases-file>\")\n .description(\"Run an eval set against an agent (--llm enables semantic_match)\")\n .requiredOption(\"--agent <id>\", \"agent id to run the queries against\")\n .option(\"--version <v>\", \"agent version\", \"v0\")\n .option(\"--llm\", \"enable semantic_match assertions via the local `claude` CLI\")\n .action(async (casesFile: string, opts, cmd: Command) => {\n const raw = JSON.parse(readFileSync(casesFile, \"utf8\"));\n const cases = clientFrom(cmd).trace.evalSetBuild(raw);\n const result = await clientFrom(cmd).trace.evalSetTest(opts.agent, cases, {\n version: opts.version,\n llm: Boolean(opts.llm),\n });\n printJson(result, outputOptions(cmd));\n if (result.failed > 0) process.exitCode = 1;\n });\n\n const schema = cmd.command(\"schema\").description(\"Validate eval-set / diagnosis-rule files\");\n schema\n .command(\"validate <file>\")\n .description(\"Validate an eval-set or diagnosis-rule file (JSON/YAML) against its schema\")\n .option(\"--kind <k>\", \"force schema kind: eval-set | rule (default: auto-detect)\")\n .action(async (file: string, opts, cmd: Command) => {\n const result = validateSchemaFile(file, opts.kind);\n printJson(result, outputOptions(cmd));\n if (!result.valid) process.exitCode = 1;\n });\n\n return group(cmd, \"TRACE AI\");\n}\n","/**\n * `trace schema validate` — validate a local eval-set or diagnosis-rule file\n * (JSON or YAML) against a zod schema. Catches malformed cases/rules before\n * `eval-set test` runs them or before a custom rule is shipped.\n */\nimport { readFileSync } from \"node:fs\";\nimport { extname } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { z } from \"zod\";\n\nconst Assertion = z\n .object({\n type: z.enum([\n \"contains\",\n \"not_contains\",\n \"regex\",\n \"tool_call_count\",\n \"tool_call_order\",\n \"latency_ms\",\n \"semantic_match\",\n ]),\n })\n .passthrough();\n\nconst EvalCase = z.object({\n query_id: z.string().optional(),\n query: z.string().optional(),\n input: z.object({ user_message: z.string() }).optional(),\n reference: z.object({ answer: z.string() }).optional(),\n assertions: z.array(Assertion).optional(),\n tags: z.array(z.string()).optional(),\n});\n\nconst EvalSetFile = z.union([\n z.array(EvalCase),\n z.object({ cases: z.array(EvalCase) }),\n z.object({ queries: z.array(EvalCase) }),\n]);\n\nconst DiagnosisRule = z.object({\n id: z.string(),\n severity: z.enum([\"low\", \"medium\", \"high\"]),\n symptom: z.string(),\n predicate: z.string().optional(),\n rubric: z.unknown().optional(),\n params: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type SchemaKind = \"eval-set\" | \"rule\";\n\nexport interface SchemaValidateResult {\n valid: boolean;\n kind: SchemaKind;\n file: string;\n errors: string[];\n}\n\nfunction parseFile(file: string): unknown {\n const text = readFileSync(file, \"utf8\");\n const ext = extname(file).toLowerCase();\n if (ext === \".yaml\" || ext === \".yml\") return yaml.load(text);\n return JSON.parse(text);\n}\n\n/** Infer the schema kind from the parsed shape when not given explicitly. */\nfunction inferKind(data: unknown): SchemaKind {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const o = data as Record<string, unknown>;\n if (\"predicate\" in o || \"rubric\" in o || (\"symptom\" in o && \"severity\" in o)) return \"rule\";\n }\n return \"eval-set\";\n}\n\nexport function validateSchemaFile(file: string, kind?: SchemaKind): SchemaValidateResult {\n let data: unknown;\n try {\n data = parseFile(file);\n } catch (e) {\n return {\n valid: false,\n kind: kind ?? \"eval-set\",\n file,\n errors: [`parse error: ${e instanceof Error ? e.message : String(e)}`],\n };\n }\n const resolved = kind ?? inferKind(data);\n const schema = resolved === \"rule\" ? DiagnosisRule : EvalSetFile;\n const result = schema.safeParse(data);\n if (result.success) return { valid: true, kind: resolved, file, errors: [] };\n return {\n valid: false,\n kind: resolved,\n file,\n errors: result.error.issues.map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`),\n };\n}\n","/** `openbkn vega …` — Catalog reads + index BuildTask. */\nimport { Command } from \"commander\";\nimport { group } from \"../help/grouped-help.js\";\nimport { DEFAULT_LIST_LIMIT } from \"../types.js\";\nimport { printJson } from \"../utils/output.js\";\nimport { clientFrom, csv, outputOptions } from \"./_shared.js\";\n\nexport function vegaCommand(): Command {\n const vega = new Command(\"vega\").description(\n \"Vega observability — catalog, resources, index build tasks\",\n );\n\n const catalog = vega.command(\"catalog\").description(\"Catalog entries\");\n catalog\n .command(\"list\")\n .description(\"List catalog entries\")\n .option(\"--limit <n>\", \"page size\", (v) => Number.parseInt(v, 10), DEFAULT_LIST_LIMIT)\n .option(\"--offset <n>\", \"page offset\", (v) => Number.parseInt(v, 10), 0)\n .action(async (_opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const data = await clientFrom(cmd).vega.catalogs({ limit: o.limit, offset: o.offset });\n printJson(data, outputOptions(cmd));\n });\n catalog\n .command(\"get <id>\")\n .description(\"Get a catalog by id\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.getCatalog(id), outputOptions(cmd));\n });\n catalog\n .command(\"resources <id>\")\n .description(\"List resources under a catalog\")\n .option(\"--category <c>\", \"filter by category (e.g. table)\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.catalogResources(id, opts.category), outputOptions(cmd));\n });\n catalog\n .command(\"health <ids...>\")\n .description(\"Health-status for one or more catalogs\")\n .action(async (ids: string[], _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.catalogHealth(ids), outputOptions(cmd));\n });\n catalog\n .command(\"create\")\n .description(\"Create a catalog (data source)\")\n .requiredOption(\"--name <s>\", \"catalog name\")\n .requiredOption(\"--connector-type <s>\", \"connector type (e.g. mysql)\")\n .requiredOption(\"--connector-config <json>\", \"connector config JSON\")\n .option(\"--tags <t1,t2>\", \"comma-separated tags\")\n .option(\"--description <s>\", \"description\")\n .option(\"--enabled\", \"create enabled (default: disabled)\")\n .action(async (opts, cmd: Command) => {\n let connectorConfig: unknown;\n try {\n connectorConfig = JSON.parse(opts.connectorConfig);\n } catch {\n throw new Error(\"--connector-config must be valid JSON\");\n }\n printJson(\n await clientFrom(cmd).vega.createCatalog({\n name: opts.name,\n connectorType: opts.connectorType,\n connectorConfig,\n tags: opts.tags\n ? String(opts.tags)\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean)\n : undefined,\n description: opts.description,\n enabled: opts.enabled ? true : undefined,\n }),\n outputOptions(cmd),\n );\n });\n catalog\n .command(\"enable <id>\")\n .description(\"Enable a catalog (required before discovery)\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.enableCatalog(id), outputOptions(cmd));\n });\n catalog\n .command(\"discover <id>\")\n .description(\"Trigger catalog resource discovery\")\n .option(\"--wait\", \"wait for discovery to complete\")\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).vega.discoverCatalog(id, Boolean(opts.wait)),\n outputOptions(cmd),\n );\n });\n\n const connector = vega.command(\"connector-type\").description(\"Connector types\");\n connector\n .command(\"list\")\n .description(\"List connector types\")\n .action(async (_opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.connectorTypes(), outputOptions(cmd));\n });\n connector\n .command(\"get <type>\")\n .description(\"Get a connector type\")\n .action(async (type: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).vega.connectorType(type), outputOptions(cmd));\n });\n\n const resource = vega.command(\"resource\").description(\"Vega-backend resources\");\n resource\n .command(\"list\")\n .description(\"List resources\")\n .option(\"--datasource-id <id>\", \"filter by catalog/datasource id\")\n .option(\"--catalog-id <id>\", \"alias of --datasource-id\")\n .option(\"--type <category>\", \"resource category\")\n .option(\"--category <category>\", \"alias of --type\")\n .option(\"--limit <n>\", \"page size\", (v) => Number.parseInt(v, 10), DEFAULT_LIST_LIMIT)\n .action(async (opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).resource.list({\n datasourceId: opts.datasourceId ?? opts.catalogId,\n category: opts.type ?? opts.category,\n limit: opts.limit,\n }),\n outputOptions(cmd),\n );\n });\n resource\n .command(\"get <id>\")\n .description(\"Get a resource\")\n .action(async (id: string, _opts, cmd: Command) => {\n printJson(await clientFrom(cmd).resource.get(id), outputOptions(cmd));\n });\n resource\n .command(\"query <id>\")\n .description(\"Fetch data rows from a resource\")\n .option(\"--limit <n>\", \"row limit\", (v) => Number.parseInt(v, 10), 50)\n .option(\"--offset <n>\", \"row offset\", (v) => Number.parseInt(v, 10), 0)\n .action(async (id: string, opts, cmd: Command) => {\n printJson(\n await clientFrom(cmd).resource.query(id, { limit: opts.limit, offset: opts.offset }),\n outputOptions(cmd),\n );\n });\n\n const dataset = vega.command(\"dataset\").description(\"Dataset index build tasks\");\n dataset\n .command(\"build <resource-id>\")\n .description(\"Build a resource's index (creates a BuildTask)\")\n .requiredOption(\"--mode <mode>\", \"build mode: batch | streaming\")\n .option(\"--embedding-fields <list>\", \"comma-separated fields to vectorize\")\n .option(\n \"--build-key-fields <list>\",\n \"comma-separated key fields (batch: time; streaming: row id)\",\n )\n .option(\"--embedding-model <id>\", \"embedding model id (default if omitted)\")\n .option(\"--model-dimensions <n>\", \"vector dimensions\", (v) => Number.parseInt(v, 10))\n .option(\"--wait\", \"poll until the build reaches a terminal state\")\n .option(\"--timeout <s>\", \"wait timeout in seconds\", (v) => Number.parseInt(v, 10), 300)\n .action(async (resourceId: string, _opts, cmd: Command) => {\n const o = cmd.optsWithGlobals();\n const task = await clientFrom(cmd).vega.build(\n {\n resource_id: resourceId,\n mode: o.mode,\n embedding_fields: csv(o.embeddingFields),\n build_key_fields: csv(o.buildKeyFields),\n embedding_model: o.embeddingModel,\n model_dimensions: o.modelDimensions,\n },\n { wait: Boolean(o.wait), timeoutMs: o.timeout * 1000 },\n );\n printJson(task, outputOptions(cmd));\n });\n\n dataset\n .command(\"build-status <resource-id> <task-id>\")\n .description(\"Show a BuildTask's state and progress\")\n .action(async (_resourceId: string, taskId: string, _opts, cmd: Command) => {\n const task = await clientFrom(cmd).vega.buildStatus(taskId);\n printJson(task, outputOptions(cmd));\n });\n\n return group(vega, \"AI DATA PLATFORM\");\n}\n"],"mappings":"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","names":["Command","Command","resolve","cmd","Command","Command","int","Command","cmd","Command","readFileSync","int","Command","Command","Command","cmd","Command","Command","Command","int","Command","cmd","Command","int","Command","cmd","Command","int","readBody","resolve","Command","Command","int","Command","Command","int","Command","cmd","Command","int","Command","cmd","status","Command","int","Command","cmd","readFileSync","Command","readFileSync","Command","cmd","readFileSync","Command","Command","Command"]}