@knowttl/artium-axi 0.0.9 → 0.0.11

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.
Files changed (3) hide show
  1. package/README.md +25 -16
  2. package/bin/artium-axi.mjs +2623 -1014
  3. package/package.json +1 -1
@@ -6,9 +6,9 @@ var __export = (target, all) => {
6
6
  };
7
7
 
8
8
  // src/cli/main.ts
9
- import { randomUUID as randomUUID3 } from "node:crypto";
9
+ import { randomUUID as randomUUID4 } from "node:crypto";
10
10
  import { homedir as homedir3 } from "node:os";
11
- import { resolve as resolve2, relative, sep, isAbsolute } from "node:path";
11
+ import { resolve as resolve3, relative, sep, isAbsolute } from "node:path";
12
12
 
13
13
  // node_modules/.pnpm/zod@4.6.5/node_modules/zod/v4/classic/external.js
14
14
  var external_exports = {};
@@ -5036,7 +5036,7 @@ var recursive = /* @__PURE__ */ new WeakMap();
5036
5036
  var NONE = 0;
5037
5037
  var ASSUMED = 1;
5038
5038
  var PROVEN = 2;
5039
- function isRecursive(inst, stack, resolve3) {
5039
+ function isRecursive(inst, stack, resolve4) {
5040
5040
  const cached2 = recursive.get(inst);
5041
5041
  if (cached2 !== void 0)
5042
5042
  return cached2 ? PROVEN : NONE;
@@ -5046,7 +5046,7 @@ function isRecursive(inst, stack, resolve3) {
5046
5046
  let result = NONE;
5047
5047
  const check2 = (child) => {
5048
5048
  if (result !== PROVEN && child?._zod) {
5049
- const answer = isRecursive(child, stack, resolve3);
5049
+ const answer = isRecursive(child, stack, resolve4);
5050
5050
  if (answer > result)
5051
5051
  result = answer;
5052
5052
  }
@@ -5057,7 +5057,7 @@ function isRecursive(inst, stack, resolve3) {
5057
5057
  const desc = Object.getOwnPropertyDescriptor(sh, key);
5058
5058
  if (spread && !desc.enumerable)
5059
5059
  continue;
5060
- const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve3) : NONE;
5060
+ const child = desc.get ? ASSUMED : desc.value?._zod ? isRecursive(desc.value, stack, resolve4) : NONE;
5061
5061
  if (child > answer)
5062
5062
  answer = child;
5063
5063
  }
@@ -5121,7 +5121,7 @@ function isRecursive(inst, stack, resolve3) {
5121
5121
  break;
5122
5122
  // `$ZodLazy` caches its inner on the def, so a resolved edge is followed exactly
5123
5123
  case "lazy": {
5124
- const inner = def._cachedInner ?? (resolve3 ? inst._zod.innerType : void 0);
5124
+ const inner = def._cachedInner ?? (resolve4 ? inst._zod.innerType : void 0);
5125
5125
  merge2(inner ? isRecursive(inner, stack, false) : ASSUMED);
5126
5126
  break;
5127
5127
  }
@@ -19683,7 +19683,7 @@ var definitions = {
19683
19683
  STORE_SCHEMA_INVALID: { status: 503, message: "The store schema is unsupported by this image.", next: "Use the matching image, or restore the pre-upgrade backup into a new volume with its matching image and key." },
19684
19684
  BACKUP_FAILED: { status: 500, message: "Database backup did not complete.", next: "Check the source store and a writable backup directory; choose a new output file." },
19685
19685
  RESTORE_FAILED: { status: 500, message: "Database restore did not complete.", next: "Stop the destination server and use an empty new data volume, an intact backup and its matching master key." },
19686
- CLI_OUTDATED: { status: 426, message: "The CLI version is too old for this server.", next: "Download the current CLI from /cli/artium-axi.mjs." },
19686
+ CLI_OUTDATED: { status: 426, message: "The CLI version is too old for this server.", next: "Run artium-axi update to install the current CLI." },
19687
19687
  CERTIFICATE_INVALID: { status: 503, message: "The server certificate could not be verified.", next: "Check certificate trust or set ARTIUM_AXI_CA_FILE to the trusted CA file." },
19688
19688
  ADMIN_REQUIRED: { status: 403, message: "Administrator capability is required.", next: "Ask an administrator to perform this operation." },
19689
19689
  REVISION_CONFLICT: { status: 409, message: "The record changed since it was read.", next: "Read the current record revision and retry your edit." },
@@ -19775,7 +19775,7 @@ function errorResponse(error62, requestId) {
19775
19775
  var inputLimits = {
19776
19776
  requestBytes: 16 * 1024 * 1024,
19777
19777
  arguments: 64,
19778
- argumentBytes: 4096,
19778
+ argumentBytes: 64 * 1024,
19779
19779
  stdinBytes: 512 * 1024,
19780
19780
  fileBytes: 1024 * 1024,
19781
19781
  totalFileBytes: 4 * 1024 * 1024,
@@ -19823,10 +19823,11 @@ var meResponseSchema = external_exports.strictObject({
19823
19823
  displayName: external_exports.string(),
19824
19824
  administrator: external_exports.boolean(),
19825
19825
  roles: external_exports.array(external_exports.string()),
19826
- accessExpiresAt: external_exports.number().int()
19826
+ accessExpiresAt: external_exports.number().int(),
19827
+ sessionExpiresAt: external_exports.number().int()
19827
19828
  });
19828
19829
  var accountId = external_exports.string().min(1);
19829
- var toolSchema = external_exports.enum(["falcon-axi", "vectra-axi", "az-axi", "mg-axi", "ldap-axi", "ado-axi", "awx-axi"]);
19830
+ var toolSchema = external_exports.enum(["falcon-axi", "vectra-axi", "az-axi", "mg-axi", "ldap-axi", "ado-axi", "awx-axi", "tenable-axi"]);
19830
19831
  var skillsResponseSchema = external_exports.strictObject({ skills: external_exports.array(external_exports.strictObject({
19831
19832
  name: toolSchema,
19832
19833
  content: external_exports.string().min(1)
@@ -20045,7 +20046,34 @@ var adminAuditRoute = {
20045
20046
  authorization: "administrator-and-recent-auth",
20046
20047
  auditEvent: null
20047
20048
  };
20049
+ var falconRtrSettingsSchema = external_exports.strictObject({
20050
+ enabled: external_exports.boolean(),
20051
+ commands: external_exports.array(external_exports.enum([
20052
+ "cat",
20053
+ "cd",
20054
+ "clear",
20055
+ "csrutil",
20056
+ "env",
20057
+ "eventlog",
20058
+ "filehash",
20059
+ "getsid",
20060
+ "help",
20061
+ "history",
20062
+ "ifconfig",
20063
+ "ipconfig",
20064
+ "ls",
20065
+ "mount",
20066
+ "netstat",
20067
+ "ps",
20068
+ "reg query",
20069
+ "users"
20070
+ ])).optional()
20071
+ });
20048
20072
  var nativeSettingsSchemas = {
20073
+ "tenable-axi": external_exports.strictObject({ writes: external_exports.strictObject({
20074
+ allowWrites: external_exports.boolean(),
20075
+ operations: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/)).min(1).max(64)
20076
+ }).optional() }),
20049
20077
  "awx-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional() }),
20050
20078
  "ldap-axi": external_exports.strictObject({}),
20051
20079
  "ado-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional() }),
@@ -20053,7 +20081,7 @@ var nativeSettingsSchemas = {
20053
20081
  allowWrites: external_exports.boolean(),
20054
20082
  operations: external_exports.array(external_exports.string().min(1).max(256)).min(1).max(64)
20055
20083
  }).optional() }),
20056
- "falcon-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional() }),
20084
+ "falcon-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional(), rtr: falconRtrSettingsSchema.optional() }),
20057
20085
  "vectra-axi": external_exports.strictObject({ writes: external_exports.strictObject({
20058
20086
  allowWrites: external_exports.boolean(),
20059
20087
  operations: external_exports.array(external_exports.string().min(1).refine((value) => value.trim().length > 0)).min(1)
@@ -20091,10 +20119,25 @@ var healthSchema = external_exports.strictObject({
20091
20119
  credentialRevision: external_exports.number().int().nullable(),
20092
20120
  errorCode: external_exports.enum(Object.keys(errors)).nullable()
20093
20121
  });
20122
+ var toolWriteStateSchema = external_exports.strictObject({
20123
+ capable: external_exports.boolean(),
20124
+ enabled: external_exports.boolean(),
20125
+ reason: external_exports.string().nullable(),
20126
+ supportedOperations: external_exports.array(external_exports.string()).nullable(),
20127
+ allowedOperations: external_exports.array(external_exports.string()),
20128
+ unlocks: external_exports.string(),
20129
+ blocked: external_exports.string()
20130
+ });
20131
+ var writeAccessInputSchema = external_exports.strictObject({
20132
+ enabled: external_exports.boolean(),
20133
+ operations: external_exports.array(external_exports.string().min(1).max(256)).max(64).refine((operations) => new Set(operations).size === operations.length).optional(),
20134
+ expectedRevision: external_exports.number().int().positive()
20135
+ });
20094
20136
  var adminToolSchema = external_exports.strictObject({
20095
20137
  name: toolSchema,
20096
20138
  enabled: external_exports.boolean(),
20097
20139
  version: external_exports.string(),
20140
+ writeAccess: toolWriteStateSchema,
20098
20141
  readOnly: external_exports.boolean().default(true),
20099
20142
  nativeSettings: external_exports.record(external_exports.string(), external_exports.unknown()),
20100
20143
  revision: external_exports.number().int().positive(),
@@ -20177,6 +20220,26 @@ var adminCertificateRoutes = {
20177
20220
  }
20178
20221
  };
20179
20222
  var adminToolRoutes = {
20223
+ get: {
20224
+ method: "GET",
20225
+ path: "/v1/admin/tools/:tool",
20226
+ input: external_exports.strictObject({}),
20227
+ response: adminToolSchema,
20228
+ authorization: "administrator-and-recent-auth",
20229
+ auditEvent: null
20230
+ },
20231
+ // Changes only write policy. Omitted operations retain the current allow-list; an empty
20232
+ // list clears it while disabling. Graph and Vectra require a supported nonempty allow-list
20233
+ // when enabling; tools without an allow-list reject operations input.
20234
+ // Other native settings and credentials are preserved. Revision conflicts never mutate.
20235
+ writeAccess: {
20236
+ method: "PATCH",
20237
+ path: "/v1/admin/tools/:tool/write-access",
20238
+ input: writeAccessInputSchema,
20239
+ response: adminToolSchema,
20240
+ authorization: "administrator-and-recent-auth",
20241
+ auditEvent: "tool-write-access"
20242
+ },
20180
20243
  list: {
20181
20244
  method: "GET",
20182
20245
  path: "/v1/admin/tools",
@@ -20559,11 +20622,12 @@ import { readFileSync as readFileSync2 } from "node:fs";
20559
20622
  import { request as httpRequest } from "node:http";
20560
20623
  import { request as httpsRequest } from "node:https";
20561
20624
  import { rootCertificates } from "node:tls";
20625
+ import { resolve } from "node:path";
20562
20626
 
20563
20627
  // package.json
20564
20628
  var package_default = {
20565
20629
  name: "artium-axi",
20566
- version: "0.0.9",
20630
+ version: "0.0.11",
20567
20631
  private: true,
20568
20632
  license: "MIT",
20569
20633
  type: "module",
@@ -20641,8 +20705,20 @@ function sessionPath(platform = process.platform, environment = process.env, hom
20641
20705
  if (!base) throw new ArtiumError("CLIENT_CONFIG_INVALID", void 0, "Set APPDATA to your writable roaming configuration folder, then sign in again.");
20642
20706
  return paths.join(base, "artium-axi", "session.json");
20643
20707
  }
20708
+ function clientConfigPath(platform = process.platform, environment = process.env, home = homedir()) {
20709
+ return sessionPath(platform, environment, home).replace(/session\.json$/, "config.json");
20710
+ }
20711
+ function readClientConfig(environment = process.env) {
20712
+ try {
20713
+ return external_exports.object({ serverUrl: external_exports.string(), caFile: external_exports.string().optional() }).parse(JSON.parse(readFileSync(clientConfigPath(process.platform, environment), "utf8")));
20714
+ } catch (error62) {
20715
+ if (error62.code === "ENOENT") return void 0;
20716
+ if (error62 instanceof ArtiumError) throw error62;
20717
+ throw new ArtiumError("CLIENT_CONFIG_INVALID");
20718
+ }
20719
+ }
20644
20720
  function restrictWindowsAcl(path, directory) {
20645
- const script = `$ErrorActionPreference='Stop'; $path=$env:ARTIUM_AXI_SESSION_ACL_PATH; $directory=$env:ARTIUM_AXI_SESSION_ACL_KIND -eq 'directory'; $acl=if ($directory) { [System.Security.AccessControl.DirectorySecurity]::new() } else { [System.Security.AccessControl.FileSecurity]::new() }; $acl.SetAccessRuleProtection($true,$false); $user=[System.Security.Principal.WindowsIdentity]::GetCurrent().User; $inherit=if ($directory) { [System.Security.AccessControl.InheritanceFlags]'ContainerInherit,ObjectInherit' } else { [System.Security.AccessControl.InheritanceFlags]::None }; foreach ($sid in @($user,[System.Security.Principal.SecurityIdentifier]::new('S-1-5-18'),[System.Security.Principal.SecurityIdentifier]::new('S-1-5-32-544'))) { $acl.AddAccessRule([System.Security.AccessControl.FileSystemAccessRule]::new($sid,'FullControl',$inherit,'None','Allow')) }; Set-Acl -LiteralPath $path -AclObject $acl -ErrorAction Stop`;
20721
+ const script = `$ErrorActionPreference='Stop'; $path=$env:ARTIUM_AXI_SESSION_ACL_PATH; $directory=$env:ARTIUM_AXI_SESSION_ACL_KIND -eq 'directory'; $acl=if ($directory) { [System.Security.AccessControl.DirectorySecurity]::new() } else { [System.Security.AccessControl.FileSecurity]::new() }; $acl.SetAccessRuleProtection($true,$false); $user=[System.Security.Principal.WindowsIdentity]::GetCurrent().User; $inherit=if ($directory) { [System.Security.AccessControl.InheritanceFlags]'ContainerInherit,ObjectInherit' } else { [System.Security.AccessControl.InheritanceFlags]::None }; foreach ($sid in @($user,[System.Security.Principal.SecurityIdentifier]::new('S-1-5-18'),[System.Security.Principal.SecurityIdentifier]::new('S-1-5-32-544'))) { $acl.AddAccessRule([System.Security.AccessControl.FileSystemAccessRule]::new($sid,'FullControl',$inherit,'None','Allow')) }; $item=if ($directory) { [System.IO.DirectoryInfo]::new($path) } else { [System.IO.FileInfo]::new($path) }; $item.SetAccessControl($acl)`;
20646
20722
  execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-EncodedCommand", Buffer.from(script, "utf16le").toString("base64")], {
20647
20723
  stdio: "ignore",
20648
20724
  env: { ...process.env, ARTIUM_AXI_SESSION_ACL_PATH: path, ARTIUM_AXI_SESSION_ACL_KIND: directory ? "directory" : "file" }
@@ -20706,6 +20782,26 @@ var SessionStore = class {
20706
20782
  rmSync(temporary, { force: true });
20707
20783
  }
20708
20784
  }
20785
+ writeClientConfig(caFile) {
20786
+ this.secureDirectory();
20787
+ const temporary = join(this.directory, `${randomUUID()}.tmp`);
20788
+ try {
20789
+ const file2 = openSync(temporary, "wx", 384);
20790
+ try {
20791
+ if (this.platform === "win32") this.acl(temporary, false);
20792
+ else fchmodSync(file2, 384);
20793
+ writeFileSync(file2, JSON.stringify({ serverUrl: this.serverUrl, caFile }));
20794
+ fsyncSync(file2);
20795
+ } finally {
20796
+ closeSync(file2);
20797
+ }
20798
+ renameSync(temporary, join(this.directory, "config.json"));
20799
+ } catch {
20800
+ throw new ArtiumError("SESSION_STORAGE_UNAVAILABLE");
20801
+ } finally {
20802
+ rmSync(temporary, { force: true });
20803
+ }
20804
+ }
20709
20805
  remove() {
20710
20806
  try {
20711
20807
  rmSync(this.file, { force: true });
@@ -20720,8 +20816,8 @@ var SessionStore = class {
20720
20816
  while (true) {
20721
20817
  const watcher = watch(this.directory);
20722
20818
  let timer;
20723
- const changed = new Promise((resolve3, reject) => {
20724
- watcher.once("change", () => resolve3());
20819
+ const changed = new Promise((resolve4, reject) => {
20820
+ watcher.once("change", () => resolve4());
20725
20821
  watcher.once("error", () => reject(new ArtiumError("SESSION_STORAGE_UNAVAILABLE")));
20726
20822
  timer = setTimeout(() => reject(new ArtiumError("SESSION_BUSY")), Math.max(0, deadline - Date.now()));
20727
20823
  });
@@ -20750,11 +20846,14 @@ var SessionStore = class {
20750
20846
  var DEFAULT_REQUEST_DEADLINE_MS = 9e4;
20751
20847
  var Client = class {
20752
20848
  constructor(environment = process.env, managed2, requestDeadlineMs = DEFAULT_REQUEST_DEADLINE_MS) {
20753
- this.environment = environment;
20754
20849
  this.managed = managed2;
20755
20850
  this.requestDeadlineMs = requestDeadlineMs;
20756
20851
  try {
20757
- const url2 = new URL(environment.ARTIUM_AXI_URL);
20852
+ const config2 = !managed2 && (environment.ARTIUM_AXI_URL === void 0 || environment.ARTIUM_AXI_CA_FILE === void 0) ? readClientConfig(environment) : void 0;
20853
+ this.serverUrlSource = environment.ARTIUM_AXI_URL === void 0 ? "config.json" : "ARTIUM_AXI_URL";
20854
+ const caFile = environment.ARTIUM_AXI_CA_FILE ?? config2?.caFile;
20855
+ this.caFile = caFile ? resolve(caFile) : void 0;
20856
+ const url2 = new URL(environment.ARTIUM_AXI_URL ?? config2?.serverUrl ?? "");
20758
20857
  if (url2.username || url2.password || url2.href.includes("?") || url2.href.includes("#") || url2.protocol !== "https:" && !(url2.protocol === "http:" && environment.ARTIUM_AXI_TEST_HTTP === "1" && ["localhost", "127.0.0.1", "[::1]"].includes(url2.hostname))) throw new Error();
20759
20858
  this.serverUrl = url2.href.replace(/\/$/, "");
20760
20859
  if (!managed2) this.storedSessions = new SessionStore(this.serverUrl, sessionPath(process.platform, environment));
@@ -20764,21 +20863,22 @@ var Client = class {
20764
20863
  }
20765
20864
  managed2?.checkServer(this.serverUrl);
20766
20865
  }
20767
- environment;
20768
20866
  managed;
20769
20867
  requestDeadlineMs;
20770
20868
  serverUrl;
20869
+ serverUrlSource;
20870
+ caFile;
20771
20871
  storedSessions;
20772
20872
  get sessions() {
20773
20873
  if (!this.storedSessions) throw new ArtiumError("INVALID_INPUT", "Session-file operations are unavailable in managed mode.");
20774
20874
  return this.storedSessions;
20775
20875
  }
20776
20876
  certificateVerified = false;
20777
- async request(path, method, input2, token) {
20877
+ async request(path, method, input2, token, bytes = false) {
20778
20878
  this.certificateVerified = false;
20779
20879
  let ca;
20780
20880
  try {
20781
- if (this.environment.ARTIUM_AXI_CA_FILE) ca = [...rootCertificates, readFileSync2(this.environment.ARTIUM_AXI_CA_FILE, "utf8")];
20881
+ if (this.caFile) ca = [...rootCertificates, readFileSync2(this.caFile, "utf8")];
20782
20882
  } catch {
20783
20883
  throw new ArtiumError("CLIENT_CONFIG_INVALID");
20784
20884
  }
@@ -20786,7 +20886,7 @@ var Client = class {
20786
20886
  const controller = new AbortController();
20787
20887
  const deadline = setTimeout(() => controller.abort(), this.requestDeadlineMs);
20788
20888
  const url2 = new URL(`${this.serverUrl}${path}`);
20789
- const result = await new Promise((resolve3, reject) => {
20889
+ const result = await new Promise((resolve4, reject) => {
20790
20890
  const request = (url2.protocol === "https:" ? httpsRequest : httpRequest)(url2, {
20791
20891
  method,
20792
20892
  ca,
@@ -20804,9 +20904,9 @@ var Client = class {
20804
20904
  response.on("error", () => reject(new ArtiumError("SERVER_UNAVAILABLE")));
20805
20905
  response.on("end", () => {
20806
20906
  try {
20807
- resolve3({
20907
+ resolve4({
20808
20908
  status: response.statusCode,
20809
- body: response.statusCode === 204 ? void 0 : JSON.parse(Buffer.concat(chunks).toString("utf8")),
20909
+ body: bytes ? Buffer.concat(chunks) : response.statusCode === 204 ? void 0 : JSON.parse(Buffer.concat(chunks).toString("utf8")),
20810
20910
  serverVersion: typeof response.headers["x-artium-cli-version"] === "string" ? response.headers["x-artium-cli-version"] : void 0
20811
20911
  });
20812
20912
  } catch {
@@ -20842,7 +20942,7 @@ var Client = class {
20842
20942
  if (result.status !== 200 && result.status !== 204) throw new ArtiumError("INVALID_RESPONSE");
20843
20943
  if ((path === "/v1/auth/login" || path === "/v1/auth/device") && result.serverVersion && result.serverVersion !== cliVersion) {
20844
20944
  const version2 = result.serverVersion.replace(/[\x00-\x1f\x7f]/g, "");
20845
- const warning = `warning: CLI ${cliVersion} differs from server ${version2}; download the matching client from ${this.serverUrl}/cli/artium-axi.mjs and verify its .sha256, or run npm install -g @knowttl/artium-axi@${version2}.
20945
+ const warning = `warning: CLI ${cliVersion} differs from server ${version2}; run artium-axi update, or run npm install -g @knowttl/artium-axi@${version2}.
20846
20946
  `;
20847
20947
  if (this.managed) this.managed.write("stderr", warning);
20848
20948
  else process.stderr.write(warning);
@@ -20916,13 +21016,13 @@ async function readPassword(stdin, environmentVariable) {
20916
21016
  process.stdin.setRawMode(true);
20917
21017
  process.stdin.resume();
20918
21018
  try {
20919
- return await new Promise((resolve3, reject) => {
21019
+ return await new Promise((resolve4, reject) => {
20920
21020
  let password = "";
20921
21021
  const keypress = (text2, key) => {
20922
21022
  if (key.name === "return" || key.ctrl && key.name === "c") {
20923
21023
  process.stdin.off("keypress", keypress);
20924
21024
  if (key.ctrl) reject(new ArtiumError("CANCELLED"));
20925
- else resolve3(password);
21025
+ else resolve4(password);
20926
21026
  } else if (key.name === "backspace") password = Array.from(password).slice(0, -1).join("");
20927
21027
  else if (text2 && !key.ctrl && !new RegExp("\\p{Cc}", "u").test(text2)) password += text2;
20928
21028
  };
@@ -20936,82 +21036,22 @@ async function readPassword(stdin, environmentVariable) {
20936
21036
  }
20937
21037
  }
20938
21038
 
20939
- // src/cli/doctor.ts
20940
- var DIAGNOSTIC_REQUEST_DEADLINE_MS = 5e3;
20941
- async function doctor(createClient = (deadline) => new Client(process.env, void 0, deadline), write = (text2) => {
20942
- process.stdout.write(text2);
20943
- }) {
20944
- let failure2;
20945
- const line = (name, pass, detail, error62) => {
20946
- if (!pass) failure2 ??= error62 ?? new ArtiumError("INVALID_RESPONSE");
20947
- write(`${pass ? "pass" : "fail"}: ${name}${detail ? ` (${detail})` : ""}
20948
- `);
20949
- };
20950
- let client;
20951
- try {
20952
- client = createClient(DIAGNOSTIC_REQUEST_DEADLINE_MS);
20953
- } catch (error62) {
20954
- for (const name of ["server address", "certificate", "token", "CLI version"]) line(name, false, "CLIENT_CONFIG_INVALID");
20955
- throw error62;
20956
- }
20957
- let addressOk = false;
20958
- try {
20959
- const live = await client.request("/health/live", "GET");
20960
- addressOk = !!live && typeof live === "object" && "status" in live && live.status === "ok";
20961
- line("server address", addressOk);
20962
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : "test HTTP", new ArtiumError("CLIENT_CONFIG_INVALID"));
20963
- } catch (error62) {
20964
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20965
- line("server address", cause.code === "CERTIFICATE_INVALID", cause.code, cause);
20966
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : cause.code, cause);
20967
- }
20968
- if (!addressOk && failure2) throw failure2;
20969
- let versionOk = true;
20970
- let versionError;
20971
- try {
20972
- await client.request("/v1/me", "GET");
20973
- } catch (error62) {
20974
- versionOk = error62 instanceof ArtiumError && error62.code === "TOKEN_INVALID";
20975
- if (!versionOk) versionError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20976
- }
20977
- let tokenOk = false;
20978
- let tokenError;
20979
- try {
20980
- tokenOk = meResponseSchema.safeParse(await client.authenticated("/v1/me", "GET")).success;
20981
- } catch (error62) {
20982
- tokenError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20983
- }
20984
- line("token", tokenOk, void 0, tokenError);
20985
- line("CLI version", versionOk, void 0, versionError);
20986
- if (tokenOk && versionOk) {
20987
- try {
20988
- const parsed = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET"));
20989
- if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
20990
- for (const tool of parsed.data.tools) line(
20991
- tool.name,
20992
- tool.status === "ok",
20993
- tool.status,
20994
- new ArtiumError(tool.status === "unconfigured" ? "CREDENTIAL_NOT_CONFIGURED" : tool.status === "error" ? "TOOL_FAILED" : tool.status === "disabled" ? "TOOL_DISABLED" : "SERVER_UNAVAILABLE")
20995
- );
20996
- } catch (error62) {
20997
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20998
- line("tools", false, cause.code, cause);
20999
- }
21000
- }
21001
- if (failure2) throw failure2;
21002
- }
21003
-
21004
21039
  // tools/inventories/falcon-axi.json
21005
21040
  var falcon_axi_default = {
21006
21041
  generatedBy: "scripts/falcon-inventory.mjs",
21007
21042
  tool: "falcon-axi",
21008
21043
  repository: "https://github.com/knowttl/falcon-axi.git",
21009
- tag: "v0.5.0",
21010
- commit: "2676743a997442e50cef570fc406ca38a5943833",
21011
- version: "0.5.0",
21044
+ tag: "v0.6.0",
21045
+ commit: "84017f66e72757a8468992c793b3c1095fe6baa3",
21046
+ version: "0.6.0",
21047
+ distribution: {
21048
+ filename: "falcon_axi-0.6.0-py3-none-any.whl",
21049
+ sha256: "88bacab2be710432807678f6c710fc5f8d00eb5b1d44680f3807d64398b23781",
21050
+ provenance: "https://pypi.org/integrity/falcon-axi/0.6.0/falcon_axi-0.6.0-py3-none-any.whl/provenance"
21051
+ },
21012
21052
  parser: {
21013
21053
  path: "falcon_axi/cli.py",
21014
- sha256: "ca8e5abef2ff056cf5cd08c37a5282851f5f858cf7a19feeae78ab1111ab95db",
21054
+ sha256: "d8b94b90440d7c538847a7da5dc8b3daa12fbaee09a400144c70539261ae7ec6",
21015
21055
  aliases: {},
21016
21056
  shortFlags: {},
21017
21057
  repeats: "last value wins",
@@ -21122,6 +21162,20 @@ var falcon_axi_default = {
21122
21162
  },
21123
21163
  input: "No file or raw URL input; cursors and queries remain native values"
21124
21164
  },
21165
+ {
21166
+ command: "detection process",
21167
+ flags: {
21168
+ help: "boolean",
21169
+ region: "value",
21170
+ "allow-unknown-origin": "boolean",
21171
+ "member-cid": "value",
21172
+ "no-member-cid": "boolean",
21173
+ config: "value",
21174
+ profile: "value",
21175
+ full: "boolean"
21176
+ },
21177
+ input: "No file or raw URL input; cursors and queries remain native values"
21178
+ },
21125
21179
  {
21126
21180
  command: "host list",
21127
21181
  flags: {
@@ -21632,7 +21686,8 @@ var falcon_axi_default = {
21632
21686
  profile: "value",
21633
21687
  query: "value",
21634
21688
  repository: "value",
21635
- since: "value"
21689
+ since: "value",
21690
+ wait: "value"
21636
21691
  },
21637
21692
  input: "No file or raw URL input; cursors and queries remain native values"
21638
21693
  },
@@ -21646,7 +21701,8 @@ var falcon_axi_default = {
21646
21701
  "no-member-cid": "boolean",
21647
21702
  config: "value",
21648
21703
  profile: "value",
21649
- repository: "value"
21704
+ repository: "value",
21705
+ wait: "value"
21650
21706
  },
21651
21707
  input: "No file or raw URL input; cursors and queries remain native values"
21652
21708
  },
@@ -22188,6 +22244,68 @@ var falcon_axi_default = {
22188
22244
  },
22189
22245
  input: "No file or raw URL input; cursors and queries remain native values"
22190
22246
  },
22247
+ {
22248
+ command: "rtr session list",
22249
+ flags: {
22250
+ help: "boolean",
22251
+ region: "value",
22252
+ "allow-unknown-origin": "boolean",
22253
+ "member-cid": "value",
22254
+ "no-member-cid": "boolean",
22255
+ config: "value",
22256
+ profile: "value",
22257
+ filter: "value",
22258
+ limit: "value",
22259
+ cursor: "value"
22260
+ },
22261
+ input: "No file or raw URL input; cursors and queries remain native values"
22262
+ },
22263
+ {
22264
+ command: "rtr session show",
22265
+ flags: {
22266
+ help: "boolean",
22267
+ region: "value",
22268
+ "allow-unknown-origin": "boolean",
22269
+ "member-cid": "value",
22270
+ "no-member-cid": "boolean",
22271
+ config: "value",
22272
+ profile: "value",
22273
+ full: "boolean"
22274
+ },
22275
+ input: "No file or raw URL input; cursors and queries remain native values"
22276
+ },
22277
+ {
22278
+ command: "rtr audit list",
22279
+ flags: {
22280
+ help: "boolean",
22281
+ region: "value",
22282
+ "allow-unknown-origin": "boolean",
22283
+ "member-cid": "value",
22284
+ "no-member-cid": "boolean",
22285
+ config: "value",
22286
+ profile: "value",
22287
+ filter: "value",
22288
+ limit: "value",
22289
+ cursor: "value"
22290
+ },
22291
+ input: "No file or raw URL input; cursors and queries remain native values"
22292
+ },
22293
+ {
22294
+ command: "rtr run",
22295
+ flags: {
22296
+ help: "boolean",
22297
+ region: "value",
22298
+ "allow-unknown-origin": "boolean",
22299
+ "member-cid": "value",
22300
+ "no-member-cid": "boolean",
22301
+ config: "value",
22302
+ profile: "value",
22303
+ command: "value",
22304
+ execute: "boolean",
22305
+ confirm: "value"
22306
+ },
22307
+ input: "No file or raw URL input; cursors and queries remain native values"
22308
+ },
22191
22309
  {
22192
22310
  command: "auth status",
22193
22311
  flags: {
@@ -22384,6 +22502,10 @@ var falcon_axi_default = {
22384
22502
  name: "FALCON_AXI_READ_ONLY",
22385
22503
  disposition: "injected"
22386
22504
  },
22505
+ {
22506
+ name: "FALCON_AXI_WRITE_LOG",
22507
+ disposition: "injected"
22508
+ },
22387
22509
  {
22388
22510
  name: "FALCON_AXI_MEMBER_CID",
22389
22511
  disposition: "never injected"
@@ -22403,17 +22525,15 @@ var falcon_axi_default = {
22403
22525
  {
22404
22526
  name: "FALCON_AXI_PROFILE",
22405
22527
  disposition: "never injected"
22406
- },
22407
- {
22408
- name: "FALCON_AXI_WRITE_LOG",
22409
- disposition: "never injected"
22410
22528
  }
22411
22529
  ],
22412
22530
  requirements: {
22413
22531
  runtime: "python",
22414
- timeoutMs: 6e4,
22415
- temporaryFiles: [],
22416
- nativeWrites: "read-only upstream design"
22532
+ timeoutMs: 65e3,
22533
+ temporaryFiles: [
22534
+ "falcon-axi/config.json"
22535
+ ],
22536
+ nativeWrites: "RTR read-only command execution requires host permission, profile opt-in and exact confirmation"
22417
22537
  },
22418
22538
  healthRead: [
22419
22539
  "auth",
@@ -22457,6 +22577,7 @@ var falcon_axi_default = {
22457
22577
  "ioa",
22458
22578
  "correlation-rule",
22459
22579
  "case",
22580
+ "rtr",
22460
22581
  "auth",
22461
22582
  "scopes",
22462
22583
  "sensor-usage",
@@ -22477,10 +22598,10 @@ var falcon_axi_default = {
22477
22598
  var vectra_axi_default = {
22478
22599
  generatedBy: "scripts/upstream-inventory.mjs",
22479
22600
  tool: "vectra-axi",
22480
- version: "0.1.7",
22481
- integrity: "sha512-7gop8tQkTohKKoldYuHZ9Kz2Eq/vQNBqW0OZV8HLSPEKc3OVhdFt00osRb1kwRjB1h1Vr/ku0H0IWoKOxxticQ==",
22601
+ version: "0.1.8",
22602
+ integrity: "sha512-Wvn73g5hm4mzQQKhNnKvAjt6SfGFrPD2EAYMa4AXhoVqFfjXjxnQLk6tUw7E92jozeHtpZ+aDXSGMHaJhhTi1Q==",
22482
22603
  parserEvidence: "Installed pinned catalogue exports, provisional until adapter acceptance",
22483
- packageManifestSha256: "f9c6cbae6a861654398dd30d830ec5b048fad34f8b6bd5f8157dcf8a5cd3ed7e",
22604
+ packageManifestSha256: "0e2e4e616e06435582fcd96787a2088f7fda5b0b99c32daa4d6c7dc8c2b2f3fb",
22484
22605
  environment: [
22485
22606
  {
22486
22607
  name: "VECTRA_AXI_CONFIG",
@@ -22546,6 +22667,38 @@ var vectra_axi_default = {
22546
22667
  nativeWriteSettings: {
22547
22668
  default: "disabled",
22548
22669
  disposition: "server-owned",
22670
+ supportedOperations: [
22671
+ "qux.account.assignment.create",
22672
+ "qux.account.assignment.reassign",
22673
+ "qux.account.assignment.unassign",
22674
+ "qux.account.note.add",
22675
+ "qux.account.note.delete",
22676
+ "qux.account.note.edit",
22677
+ "qux.account.tag.bulk-delete",
22678
+ "qux.account.tag.bulk-set",
22679
+ "qux.account.tag.set",
22680
+ "qux.detection.note.add",
22681
+ "qux.detection.note.delete",
22682
+ "qux.detection.note.edit",
22683
+ "qux.detection.tag.bulk-delete",
22684
+ "qux.detection.tag.bulk-set",
22685
+ "qux.detection.tag.set",
22686
+ "qux.host.assignment.create",
22687
+ "qux.host.assignment.reassign",
22688
+ "qux.host.assignment.unassign",
22689
+ "qux.host.note.add",
22690
+ "qux.host.note.delete",
22691
+ "qux.host.note.edit",
22692
+ "qux.host.tag.bulk-delete",
22693
+ "qux.host.tag.bulk-set",
22694
+ "qux.host.tag.set",
22695
+ "rux.account.note.delete",
22696
+ "rux.account.note.edit",
22697
+ "rux.detection.note.delete",
22698
+ "rux.detection.note.edit",
22699
+ "rux.host.note.delete",
22700
+ "rux.host.note.edit"
22701
+ ],
22549
22702
  profileFields: {
22550
22703
  "writes.allowWrites": "boolean",
22551
22704
  "writes.operations": "string[]"
@@ -22597,12 +22750,13 @@ var vectra_axi_default = {
22597
22750
  help: {
22598
22751
  command: "vectra-axi detection list",
22599
22752
  description: "List detections on QUX v2.5 or RUX v3.4 with server-side filters and a bounded window",
22753
+ pagination: "QUX: collection pages; bounded --all supported; RUX: collection pages; bounded --all supported",
22600
22754
  flags: {
22601
22755
  "--help": "Show concise help; default false",
22602
22756
  "--state <state>": "Filter by server-side detection state",
22603
22757
  "--detection-type <type>": "Filter by server-side detection type",
22604
22758
  "--detection-category <category>": "Filter by server-side detection category",
22605
- "--host-id <id>": "Filter by server-side host ID (non-negative integer)",
22759
+ "--host-id <id>": "Filter by server-side host ID (non-negative integer); find it with host list --name <text>, then detection list --host-id <id>",
22606
22760
  "--tags <tags>": "Filter by server-side tags",
22607
22761
  "--certainty-gte <score>": "Filter by server-side minimum certainty",
22608
22762
  "--threat-gte <score>": "Filter by server-side minimum threat",
@@ -22610,7 +22764,7 @@ var vectra_axi_default = {
22610
22764
  "--min-id <id>": "Server-side minimum detection ID (non-negative integer)",
22611
22765
  "--max-id <id>": "Server-side maximum detection ID (non-negative integer)",
22612
22766
  "--limit <rows>": "Row window for this read; default 100",
22613
- "--fields <list>": "Comma-separated projection over id,detection_type,state,threat,certainty",
22767
+ "--fields <list>": "Comma-separated detection fields, including first_timestamp,last_timestamp,src_ip,src_host,summary,grouped_details; default id,detection_type,state,threat,certainty",
22614
22768
  "--all": "Traverse pages within 10 requests, 8 MiB, 60 seconds and 10000 rows; cannot combine with --limit",
22615
22769
  "--cursor <cursor>": "Resume a capped list with its original filters"
22616
22770
  },
@@ -22642,7 +22796,7 @@ var vectra_axi_default = {
22642
22796
  },
22643
22797
  source: {
22644
22798
  path: "dist/src/catalogue.js",
22645
- sha256: "9c0a3783a91fb0fd4c2a2f4df00e477b8abdc3ea3cefe80dc20e98b4cebf55fd"
22799
+ sha256: "5fadea660c71fb4021a4c130699ae3883c54e801c8e3eb6c3f370a10b0a04930"
22646
22800
  }
22647
22801
  },
22648
22802
  flags: [
@@ -22973,6 +23127,7 @@ var vectra_axi_default = {
22973
23127
  profile: "value",
22974
23128
  config: "value",
22975
23129
  id: "value",
23130
+ fields: "value",
22976
23131
  full: "boolean"
22977
23132
  }
22978
23133
  },
@@ -22995,6 +23150,7 @@ var vectra_axi_default = {
22995
23150
  help: "boolean",
22996
23151
  profile: "value",
22997
23152
  config: "value",
23153
+ name: "value",
22998
23154
  "threat-gte": "value",
22999
23155
  "certainty-gte": "value",
23000
23156
  tags: "value",
@@ -23402,6 +23558,7 @@ var vectra_axi_default = {
23402
23558
  help: "boolean",
23403
23559
  profile: "value",
23404
23560
  config: "value",
23561
+ all: "boolean",
23405
23562
  account: "value",
23406
23563
  host: "value",
23407
23564
  assignee: "value",
@@ -23434,6 +23591,7 @@ var vectra_axi_default = {
23434
23591
  help: "boolean",
23435
23592
  profile: "value",
23436
23593
  config: "value",
23594
+ all: "boolean",
23437
23595
  limit: "value",
23438
23596
  fields: "value",
23439
23597
  cursor: "value"
@@ -23454,6 +23612,7 @@ var vectra_axi_default = {
23454
23612
  help: "boolean",
23455
23613
  profile: "value",
23456
23614
  config: "value",
23615
+ all: "boolean",
23457
23616
  username: "value",
23458
23617
  limit: "value",
23459
23618
  fields: "value",
@@ -23490,6 +23649,7 @@ var vectra_axi_default = {
23490
23649
  help: "boolean",
23491
23650
  profile: "value",
23492
23651
  config: "value",
23652
+ all: "boolean",
23493
23653
  name: "value",
23494
23654
  type: "value",
23495
23655
  limit: "value",
@@ -23512,6 +23672,7 @@ var vectra_axi_default = {
23512
23672
  help: "boolean",
23513
23673
  profile: "value",
23514
23674
  config: "value",
23675
+ all: "boolean",
23515
23676
  id: "value",
23516
23677
  name: "value",
23517
23678
  ordering: "value",
@@ -23527,6 +23688,7 @@ var vectra_axi_default = {
23527
23688
  help: "boolean",
23528
23689
  profile: "value",
23529
23690
  config: "value",
23691
+ all: "boolean",
23530
23692
  contains: "value",
23531
23693
  ordering: "value",
23532
23694
  limit: "value",
@@ -23611,727 +23773,6 @@ var vectra_axi_default = {
23611
23773
  ]
23612
23774
  };
23613
23775
 
23614
- // tools/inventories/ldap-axi.json
23615
- var ldap_axi_default = {
23616
- generatedBy: "scripts/ldap-inventory.mjs",
23617
- tool: "ldap-axi",
23618
- version: "0.2.0",
23619
- integrity: "sha512-w/gE4jHaUHE0iKh3ucDnDG0AVrhP0VwpFCEcw3wSTzLmTBMNZrJ9AFB06j2jnf4TFgK5+5NhF0EE0R69mv7crA==",
23620
- parserEvidence: "Installed pinned command schemas and reviewed CLI globals and entry routes",
23621
- sources: [
23622
- {
23623
- path: "package.json",
23624
- sha256: "7ee133bf0333fe975c905418c9ecdd542836dab39f52aa5f7f630776d2bcc0b0"
23625
- },
23626
- {
23627
- path: "README.md",
23628
- sha256: "3a1eeda8c376c39853e4835acf2a1d61f76f23a555651417d0d691459fbb3139"
23629
- },
23630
- {
23631
- path: "axi-credential.schema.json",
23632
- sha256: "76b9f5f449d844dcd4365b966ed907515582f72fc920b936dae825ebf1b7cc53"
23633
- },
23634
- {
23635
- path: "dist/src/cli.js",
23636
- sha256: "2cb024b2848c2c9e27c292205b3ed86a829cfed21d52e8fea06ef544a039ec2a"
23637
- },
23638
- {
23639
- path: "dist/src/schema.js",
23640
- sha256: "0d5946fa26efb55e8480e9a22f93cdb6b321c48697e77ca02c4c99630f11284f"
23641
- },
23642
- {
23643
- path: "dist/src/config.js",
23644
- sha256: "cbc48584b6ff2a2a70375e9e8e6242a87543a3e6e6f7e1c055a2d29c42b677f9"
23645
- },
23646
- {
23647
- path: "dist/src/secrets.js",
23648
- sha256: "9f2ccf86515cec1dd65f2dd5850188232374535f7fe56a788fdc7b94d91c8532"
23649
- },
23650
- {
23651
- path: "dist/src/directory/auth.js",
23652
- sha256: "d2b3a61cb9e63744462e3a6a2841fcddb2b48e7823c307841028288cfe9d688b"
23653
- },
23654
- {
23655
- path: "dist/src/directory/policy.js",
23656
- sha256: "a697dd78990493f7f1c19d22278ebb922c997e9cf88a51b12adfaca30fa8a01d"
23657
- }
23658
- ],
23659
- credentialSchema: {
23660
- $schema: "https://json-schema.org/draft/2020-12/schema",
23661
- title: "ldap-axi profile",
23662
- type: "object",
23663
- additionalProperties: false,
23664
- required: [
23665
- "url"
23666
- ],
23667
- properties: {
23668
- url: {
23669
- type: "string",
23670
- pattern: "^ldaps?://",
23671
- description: "LDAP URL without userinfo; use the server FQDN for ambient authentication"
23672
- },
23673
- auth: {
23674
- enum: [
23675
- "auto",
23676
- "gssapi",
23677
- "simple"
23678
- ],
23679
- default: "auto"
23680
- },
23681
- bindDn: {
23682
- type: "string",
23683
- minLength: 1,
23684
- description: "Simple-bind identity, required for simple authentication"
23685
- },
23686
- bindPassword: {
23687
- "x-secret": true,
23688
- description: "Simple-bind password reference; defaults to env LDAP_AXI_BIND_PASSWORD. No stored secrets.",
23689
- oneOf: [
23690
- {
23691
- type: "object",
23692
- additionalProperties: false,
23693
- required: [
23694
- "env"
23695
- ],
23696
- properties: {
23697
- env: {
23698
- type: "string",
23699
- pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
23700
- }
23701
- }
23702
- },
23703
- {
23704
- type: "object",
23705
- additionalProperties: false,
23706
- required: [
23707
- "file"
23708
- ],
23709
- properties: {
23710
- file: {
23711
- type: "string",
23712
- pattern: "^(?:/|[A-Za-z]:[\\\\/])",
23713
- description: "Absolute local path to a private UTF-8 password file; UNC/device paths are forbidden on Windows"
23714
- }
23715
- }
23716
- }
23717
- ]
23718
- },
23719
- base: {
23720
- type: "string"
23721
- },
23722
- pageSize: {
23723
- type: "integer",
23724
- minimum: 1,
23725
- maximum: 1e3
23726
- },
23727
- caFile: {
23728
- type: "string",
23729
- minLength: 1
23730
- },
23731
- startTls: {
23732
- type: "boolean",
23733
- default: false
23734
- },
23735
- tlsMaxVersion: {
23736
- const: "1.2"
23737
- },
23738
- flavor: {
23739
- enum: [
23740
- "ad",
23741
- "adlds",
23742
- "ldapv3"
23743
- ]
23744
- },
23745
- gssapiService: {
23746
- type: "string",
23747
- minLength: 1
23748
- },
23749
- gssapiProtection: {
23750
- enum: [
23751
- "none",
23752
- "confidentiality"
23753
- ]
23754
- }
23755
- }
23756
- },
23757
- adapterBoundary: {
23758
- unsafeOverrides: [
23759
- "config",
23760
- "url",
23761
- "start-tls",
23762
- "ca-file",
23763
- "ca-only",
23764
- "tls-no-verify",
23765
- "tls-max-version",
23766
- "insecure-plaintext",
23767
- "anonymous",
23768
- "profile",
23769
- "auth",
23770
- "gssapi-service",
23771
- "gssapi-protection"
23772
- ],
23773
- blockedCommands: [
23774
- "config",
23775
- "profile",
23776
- "setup"
23777
- ],
23778
- sensitiveFlags: [
23779
- "base",
23780
- "filter",
23781
- "name",
23782
- "sam",
23783
- "upn",
23784
- "uid"
23785
- ],
23786
- authentication: "Stored simple-bind identity over verified LDAPS or StartTLS; no ambient ticket or keytab",
23787
- inputs: {
23788
- stdin: "unsupported",
23789
- files: "unsupported",
23790
- caFile: "stored PEM materialized privately by host"
23791
- },
23792
- resources: {
23793
- nodeHeapMiB: 128
23794
- },
23795
- nativeWrites: "read-only upstream design"
23796
- },
23797
- discovery: {
23798
- commands: [
23799
- "entry",
23800
- "user",
23801
- "group",
23802
- "computer",
23803
- "auth status",
23804
- "server"
23805
- ],
23806
- example: [
23807
- "user",
23808
- "list",
23809
- "--limit",
23810
- "1"
23811
- ],
23812
- help: "List user accounts.\nLDAPv3 users are inetOrgPerson or posixAccount entries; use ldap-axi entry search for account + simpleSecurityObject service accounts.\nUsage: ldap-axi user list [flags]\nFlags:\n --help show this help\n --base <dn> search base (default: environment, config, or server naming contexts)\n --disabled include disabled accounts (LDAPv3: permanent ppolicy locks)\n --enabled include enabled accounts (LDAPv3: exclude permanent ppolicy locks)\n --locked include current AD locks or recorded LDAPv3 ppolicy lock candidates\n --all read all pages up to --max-rows or --limit\n --name <pattern> match cn\n --sam <pattern> AD only: match sAMAccountName\n --upn <pattern> AD only: match userPrincipalName\n --uid <pattern> LDAPv3 only: match uid\n --filter <RFC4515> add a raw LDAP filter\n --scope <base|one|sub> search scope (default: sub)\n --max-rows <n> maximum output rows\n --page-size <1..1000> LDAP page size (default: AD 1000, LDAPv3 500; config overrides)\n --limit <n> alias for bounded list output\n --fields <name,...> select output fields\n --attributes <name,...> request and emit raw attributes\nActive Directory fields: sam, upn, name, dn, enabled, locked, last_logon, object_sid, when_created\nActive Directory defaults: sam, name, enabled, last_logon\nLDAPv3 fields: uid, name, mail, enabled, locked, account_state, dn, entry_uuid, when_created\nLDAPv3 defaults: uid, name, mail, enabled, locked, account_state\nExamples:\n ldap-axi user list --disabled --max-rows 25\n ldap-axi user list --name Alice --fields name,dn --limit 50"
23813
- },
23814
- suggestionFields: [
23815
- "help"
23816
- ],
23817
- format: "TOON",
23818
- commands: [
23819
- {
23820
- command: "home",
23821
- flags: {
23822
- help: "boolean",
23823
- config: "value",
23824
- url: "value",
23825
- base: "value",
23826
- "start-tls": "boolean",
23827
- "ca-file": "value",
23828
- "ca-only": "boolean",
23829
- "tls-no-verify": "boolean",
23830
- "tls-max-version": "value",
23831
- "insecure-plaintext": "boolean",
23832
- anonymous: "boolean",
23833
- profile: "value",
23834
- auth: "value",
23835
- "gssapi-service": "value",
23836
- "gssapi-protection": "value"
23837
- },
23838
- positionalInput: false
23839
- },
23840
- {
23841
- command: "auth status",
23842
- flags: {
23843
- help: "boolean",
23844
- config: "value",
23845
- url: "value",
23846
- base: "value",
23847
- "start-tls": "boolean",
23848
- "ca-file": "value",
23849
- "ca-only": "boolean",
23850
- "tls-no-verify": "boolean",
23851
- "tls-max-version": "value",
23852
- "insecure-plaintext": "boolean",
23853
- anonymous: "boolean",
23854
- profile: "value",
23855
- auth: "value",
23856
- "gssapi-service": "value",
23857
- "gssapi-protection": "value",
23858
- offline: "boolean"
23859
- },
23860
- positionalInput: false
23861
- },
23862
- {
23863
- command: "server",
23864
- flags: {
23865
- help: "boolean",
23866
- config: "value",
23867
- url: "value",
23868
- base: "value",
23869
- "start-tls": "boolean",
23870
- "ca-file": "value",
23871
- "ca-only": "boolean",
23872
- "tls-no-verify": "boolean",
23873
- "tls-max-version": "value",
23874
- "insecure-plaintext": "boolean",
23875
- anonymous: "boolean",
23876
- profile: "value",
23877
- auth: "value",
23878
- "gssapi-service": "value",
23879
- "gssapi-protection": "value"
23880
- },
23881
- positionalInput: false
23882
- },
23883
- {
23884
- command: "entry search",
23885
- flags: {
23886
- help: "boolean",
23887
- config: "value",
23888
- url: "value",
23889
- base: "value",
23890
- "start-tls": "boolean",
23891
- "ca-file": "value",
23892
- "ca-only": "boolean",
23893
- "tls-no-verify": "boolean",
23894
- "tls-max-version": "value",
23895
- "insecure-plaintext": "boolean",
23896
- anonymous: "boolean",
23897
- profile: "value",
23898
- auth: "value",
23899
- "gssapi-service": "value",
23900
- "gssapi-protection": "value",
23901
- filter: "value",
23902
- scope: "value",
23903
- attributes: "value",
23904
- "page-size": "value",
23905
- "max-rows": "value",
23906
- all: "boolean"
23907
- },
23908
- positionalInput: false
23909
- },
23910
- {
23911
- command: "entry show",
23912
- flags: {
23913
- help: "boolean",
23914
- config: "value",
23915
- url: "value",
23916
- base: "value",
23917
- "start-tls": "boolean",
23918
- "ca-file": "value",
23919
- "ca-only": "boolean",
23920
- "tls-no-verify": "boolean",
23921
- "tls-max-version": "value",
23922
- "insecure-plaintext": "boolean",
23923
- anonymous: "boolean",
23924
- profile: "value",
23925
- auth: "value",
23926
- "gssapi-service": "value",
23927
- "gssapi-protection": "value",
23928
- attributes: "value",
23929
- "page-size": "value"
23930
- },
23931
- positionalInput: true
23932
- },
23933
- {
23934
- command: "user list",
23935
- flags: {
23936
- help: "boolean",
23937
- config: "value",
23938
- url: "value",
23939
- base: "value",
23940
- "start-tls": "boolean",
23941
- "ca-file": "value",
23942
- "ca-only": "boolean",
23943
- "tls-no-verify": "boolean",
23944
- "tls-max-version": "value",
23945
- "insecure-plaintext": "boolean",
23946
- anonymous: "boolean",
23947
- profile: "value",
23948
- auth: "value",
23949
- "gssapi-service": "value",
23950
- "gssapi-protection": "value",
23951
- disabled: "boolean",
23952
- enabled: "boolean",
23953
- locked: "boolean",
23954
- all: "boolean",
23955
- name: "value",
23956
- sam: "value",
23957
- upn: "value",
23958
- uid: "value",
23959
- filter: "value",
23960
- scope: "value",
23961
- "max-rows": "value",
23962
- "page-size": "value",
23963
- limit: "value",
23964
- fields: "value",
23965
- attributes: "value"
23966
- },
23967
- positionalInput: false
23968
- },
23969
- {
23970
- command: "user show",
23971
- flags: {
23972
- help: "boolean",
23973
- config: "value",
23974
- url: "value",
23975
- base: "value",
23976
- "start-tls": "boolean",
23977
- "ca-file": "value",
23978
- "ca-only": "boolean",
23979
- "tls-no-verify": "boolean",
23980
- "tls-max-version": "value",
23981
- "insecure-plaintext": "boolean",
23982
- anonymous: "boolean",
23983
- profile: "value",
23984
- auth: "value",
23985
- "gssapi-service": "value",
23986
- "gssapi-protection": "value",
23987
- fields: "value",
23988
- attributes: "value"
23989
- },
23990
- positionalInput: true
23991
- },
23992
- {
23993
- command: "user groups",
23994
- flags: {
23995
- help: "boolean",
23996
- config: "value",
23997
- url: "value",
23998
- base: "value",
23999
- "start-tls": "boolean",
24000
- "ca-file": "value",
24001
- "ca-only": "boolean",
24002
- "tls-no-verify": "boolean",
24003
- "tls-max-version": "value",
24004
- "insecure-plaintext": "boolean",
24005
- anonymous: "boolean",
24006
- profile: "value",
24007
- auth: "value",
24008
- "gssapi-service": "value",
24009
- "gssapi-protection": "value",
24010
- nested: "boolean",
24011
- "max-rows": "value",
24012
- "page-size": "value",
24013
- fields: "value"
24014
- },
24015
- positionalInput: true
24016
- },
24017
- {
24018
- command: "group list",
24019
- flags: {
24020
- help: "boolean",
24021
- config: "value",
24022
- url: "value",
24023
- base: "value",
24024
- "start-tls": "boolean",
24025
- "ca-file": "value",
24026
- "ca-only": "boolean",
24027
- "tls-no-verify": "boolean",
24028
- "tls-max-version": "value",
24029
- "insecure-plaintext": "boolean",
24030
- anonymous: "boolean",
24031
- profile: "value",
24032
- auth: "value",
24033
- "gssapi-service": "value",
24034
- "gssapi-protection": "value",
24035
- all: "boolean",
24036
- name: "value",
24037
- sam: "value",
24038
- filter: "value",
24039
- scope: "value",
24040
- "max-rows": "value",
24041
- "page-size": "value",
24042
- limit: "value",
24043
- fields: "value",
24044
- attributes: "value"
24045
- },
24046
- positionalInput: false
24047
- },
24048
- {
24049
- command: "group show",
24050
- flags: {
24051
- help: "boolean",
24052
- config: "value",
24053
- url: "value",
24054
- base: "value",
24055
- "start-tls": "boolean",
24056
- "ca-file": "value",
24057
- "ca-only": "boolean",
24058
- "tls-no-verify": "boolean",
24059
- "tls-max-version": "value",
24060
- "insecure-plaintext": "boolean",
24061
- anonymous: "boolean",
24062
- profile: "value",
24063
- auth: "value",
24064
- "gssapi-service": "value",
24065
- "gssapi-protection": "value",
24066
- fields: "value",
24067
- attributes: "value"
24068
- },
24069
- positionalInput: true
24070
- },
24071
- {
24072
- command: "group members",
24073
- flags: {
24074
- help: "boolean",
24075
- config: "value",
24076
- url: "value",
24077
- base: "value",
24078
- "start-tls": "boolean",
24079
- "ca-file": "value",
24080
- "ca-only": "boolean",
24081
- "tls-no-verify": "boolean",
24082
- "tls-max-version": "value",
24083
- "insecure-plaintext": "boolean",
24084
- anonymous: "boolean",
24085
- profile: "value",
24086
- auth: "value",
24087
- "gssapi-service": "value",
24088
- "gssapi-protection": "value",
24089
- nested: "boolean",
24090
- "max-rows": "value",
24091
- "page-size": "value",
24092
- fields: "value"
24093
- },
24094
- positionalInput: true
24095
- },
24096
- {
24097
- command: "computer list",
24098
- flags: {
24099
- help: "boolean",
24100
- config: "value",
24101
- url: "value",
24102
- base: "value",
24103
- "start-tls": "boolean",
24104
- "ca-file": "value",
24105
- "ca-only": "boolean",
24106
- "tls-no-verify": "boolean",
24107
- "tls-max-version": "value",
24108
- "insecure-plaintext": "boolean",
24109
- anonymous: "boolean",
24110
- profile: "value",
24111
- auth: "value",
24112
- "gssapi-service": "value",
24113
- "gssapi-protection": "value",
24114
- all: "boolean",
24115
- name: "value",
24116
- sam: "value",
24117
- filter: "value",
24118
- scope: "value",
24119
- "max-rows": "value",
24120
- "page-size": "value",
24121
- limit: "value",
24122
- fields: "value",
24123
- attributes: "value"
24124
- },
24125
- positionalInput: false
24126
- },
24127
- {
24128
- command: "computer show",
24129
- flags: {
24130
- help: "boolean",
24131
- config: "value",
24132
- url: "value",
24133
- base: "value",
24134
- "start-tls": "boolean",
24135
- "ca-file": "value",
24136
- "ca-only": "boolean",
24137
- "tls-no-verify": "boolean",
24138
- "tls-max-version": "value",
24139
- "insecure-plaintext": "boolean",
24140
- anonymous: "boolean",
24141
- profile: "value",
24142
- auth: "value",
24143
- "gssapi-service": "value",
24144
- "gssapi-protection": "value",
24145
- fields: "value",
24146
- attributes: "value"
24147
- },
24148
- positionalInput: true
24149
- }
24150
- ]
24151
- };
24152
-
24153
- // src/cli/help.ts
24154
- var commands = {
24155
- home: { usage: "artium-axi [tools [show <tool>]|whoami|login|passwd|logout|doctor|setup|<tool> <args>]", purpose: "Show your identity, roles and available tools.", flags: ["--version (default false; print the client package version and exit)"], example: "artium-axi" },
24156
- setup: {
24157
- usage: "artium-axi setup --host <claude|codex|opencode|pi> [--hook] [--force]",
24158
- purpose: "Install skills for your signed-in account\u2019s granted tools and an optional Claude Code session hook.",
24159
- flags: ["--host <claude|codex|opencode|pi> (required)", "--hook (default false; Claude Code only)", "--force (default false; explicitly replace an edited skill)"],
24160
- example: "artium-axi setup --host claude --hook"
24161
- },
24162
- tools: { usage: "artium-axi tools", purpose: "List available tools with their status and pinned version.", flags: [], example: "artium-axi tools" },
24163
- "tools show": { usage: "artium-axi tools show <tool>", purpose: "Show one available tool and its vetted upstream help.", flags: [], example: "artium-axi tools show falcon-axi" },
24164
- whoami: { usage: "artium-axi whoami", purpose: "Show your identity, roles, access expiry and server.", flags: [], example: "artium-axi whoami" },
24165
- login: {
24166
- usage: "artium-axi login --sso | --username <username> [--password-stdin]",
24167
- purpose: "Sign in through browser SSO (8-hour session) or with a local account.",
24168
- flags: ["--sso (default false; open the displayed URL in any browser and approve your terminal code; no password flags)", "--username <username> (required for local sign-in)", "--password-stdin (default false; local only; otherwise ARTIUM_AXI_PASSWORD or a terminal prompt)"],
24169
- example: "artium-axi login --sso"
24170
- },
24171
- passwd: {
24172
- usage: "artium-axi passwd [--password-stdin]",
24173
- purpose: "Change your password, then sign in again.",
24174
- flags: ["--password-stdin (default false; otherwise a terminal prompt; current password uses ARTIUM_AXI_CURRENT_PASSWORD or a terminal prompt)"],
24175
- example: "artium-axi passwd --password-stdin"
24176
- },
24177
- logout: { usage: "artium-axi logout", purpose: "Remove local tokens and revoke the server session.", flags: [], example: "artium-axi logout" },
24178
- doctor: { usage: "artium-axi doctor", purpose: "Check the server, certificate, token, CLI version and cached tool health.", flags: [], example: "artium-axi doctor" },
24179
- "falcon-axi": {
24180
- usage: "artium-axi falcon-axi [<args>]",
24181
- purpose: "Run Falcon commands with your managed credentials.",
24182
- flags: ["Arguments after falcon-axi are forwarded upstream, including --help."],
24183
- example: `artium-axi falcon-axi ${falcon_axi_default.discovery.example.join(" ")}`
24184
- },
24185
- "vectra-axi": {
24186
- usage: "artium-axi vectra-axi [<args>]",
24187
- purpose: "Run Vectra commands with your managed credentials.",
24188
- flags: ["Arguments after vectra-axi are forwarded upstream, including --help."],
24189
- example: `artium-axi vectra-axi ${vectra_axi_default.discovery.example.join(" ")}`
24190
- },
24191
- "ldap-axi": {
24192
- usage: "artium-axi ldap-axi [<args>]",
24193
- purpose: "Read directory data with the managed LDAP bind identity.",
24194
- flags: ["Arguments after ldap-axi are forwarded upstream, including --help."],
24195
- example: `artium-axi ldap-axi ${ldap_axi_default.discovery.example.join(" ")}`
24196
- },
24197
- "ado-axi": {
24198
- usage: "artium-axi ado-axi [<args>]",
24199
- purpose: "Run Azure DevOps commands with managed credentials.",
24200
- flags: ["Arguments after ado-axi include --help. Organization and credentials are managed by Artium; api is GET only; writes are off by default."],
24201
- example: "artium-axi ado-axi project list --limit 1"
24202
- },
24203
- "awx-axi": {
24204
- usage: "artium-axi awx-axi [<args>]",
24205
- purpose: "Inspect AWX automation with managed credentials.",
24206
- flags: ["Arguments after awx-axi include --help. Operational writes are off by default; configuration, deletion and security writes are blocked."],
24207
- example: "artium-axi awx-axi job list --limit 1"
24208
- },
24209
- "az-axi": {
24210
- usage: "artium-axi az-axi [<args>]",
24211
- purpose: "Run Azure commands with your managed identity.",
24212
- flags: ["Arguments after az-axi are forwarded upstream, including --help."],
24213
- example: "artium-axi az-axi sub list"
24214
- },
24215
- "mg-axi": {
24216
- usage: "artium-axi mg-axi [<args>]",
24217
- purpose: "Run Microsoft Graph commands with your managed identity.",
24218
- flags: ["Arguments after mg-axi are forwarded upstream, including --help."],
24219
- example: "artium-axi mg-axi entra user list"
24220
- },
24221
- "managed-session": {
24222
- usage: "artium-axi --managed-session <command> [<args>]",
24223
- purpose: "Let a caller supply and persist sessions through private pipes.",
24224
- flags: [],
24225
- example: "artium-axi --managed-session whoami"
24226
- }
24227
- };
24228
- function commandHelp(command) {
24229
- const entry = commands[command];
24230
- const flags = [
24231
- toolSchema.safeParse(command).success ? "--help before the tool name (default false)" : "--help (default false)",
24232
- ...entry.flags,
24233
- "--managed-session before the command (default false; caller-owned sessions; see artium-axi --managed-session --help)"
24234
- ];
24235
- const protocol = [
24236
- "Session JSON on inherited pipe fd 3, new sessions and rotations as JSON lines on private pipe fd 4; no session file.",
24237
- "Managed input: {serverUrl, accessToken, refreshToken?}; close fd 3 after JSON (64 KiB maximum). Output: {serverUrl, status, accessToken, refreshToken, accessExpiresAt, familyExpiresAt} per rotation, before retry, including on later failure.",
24238
- "Managed login: fd 3 is unused; fd 4 must be a writable private pipe/socket. Local sign-in requires --username <username> --password-stdin with protected inherited stdin; password argv and ARTIUM_AXI_PASSWORD are refused. SSO uses login --sso and displays browser approval instructions immediately. New sessions use the rotation envelope; password-change-required returns {serverUrl, status, passwordChangeToken, passwordChangeExpiresAt} on fd 4 and exits 1.",
24239
- "Managed exits: 0 success; 2 invalid JSON/descriptors or refused passwd/logout/setup; 1 authentication/transport failure; tool exit codes pass through. Only TOKEN_EXPIRED permits one refresh/retry; without refreshToken or on refusal, return control to the caller."
24240
- ];
24241
- const purposes = command === "home" ? `commands[${Object.keys(commands).length - 2}]{command,purpose}:
24242
- ${Object.entries(commands).filter(([name]) => name !== "home" && name !== "managed-session").map(([name, value]) => ` ${name},${JSON.stringify(value.purpose)}`).join("\n")}
24243
- ` : "";
24244
- return `purpose: ${entry.purpose}
24245
- usage: ${entry.usage}
24246
- ${purposes}flags[${flags.length}]:
24247
- ${flags.map((flag) => ` - ${JSON.stringify(flag)}`).join("\n")}
24248
- example: ${entry.example}
24249
- ` + (command === "login" || command === "managed-session" ? `managedSession[${protocol.length}]:
24250
- ${protocol.map((line) => ` - ${JSON.stringify(line)}`).join("\n")}
24251
- ` : "");
24252
- }
24253
- function validateArguments(args, prefixHelp) {
24254
- const command = args[0];
24255
- if (command === "tools") args = [...args.filter((arg) => arg !== "--help"), ...args.filter((arg) => arg === "--help")];
24256
- const rootFlags = "--help, --version, --managed-session (before the command)";
24257
- const rootCommands = Object.keys(commands).filter((name) => name !== "home" && name !== "managed-session" && name !== "tools show").join(", ");
24258
- function fail(token, level2, choices2) {
24259
- const kind = token?.startsWith("-") ? "flag" : "argument";
24260
- const message = token === void 0 ? `Missing argument for ${level2}.` : command === "login" || command === "passwd" ? `Unexpected argument at position ${args.indexOf(token) + 1} for ${level2}. Password arguments are refused.` : `Unknown or unexpected ${kind} ${JSON.stringify(kind === "flag" ? token.split("=")[0] : token)} for ${level2}.`;
24261
- throw new ArtiumError("INVALID_INPUT", message, choices2);
24262
- }
24263
- if (!command) return;
24264
- if (command === "--version" && args.length === 1) return;
24265
- if (!Object.hasOwn(commands, command) || command === "home" || command === "managed-session" || command === "tools show") {
24266
- fail(command, "artium-axi", `Valid commands: ${rootCommands}. Valid flags: ${rootFlags}.`);
24267
- }
24268
- if (toolSchema.safeParse(command).success) {
24269
- if (prefixHelp && args.length > 1) fail(args[1], command, `Use artium-axi --help ${command} for local help; artium-axi ${command} --help for upstream flags.`);
24270
- return;
24271
- }
24272
- let level = command;
24273
- let start = 1;
24274
- if (command === "tools" && args[1] === "show") {
24275
- level = "tools show";
24276
- start = 2;
24277
- }
24278
- const entry = commands[level];
24279
- const validFlags = ["--help", ...entry.flags.map((flag) => flag.split(" ")[0])];
24280
- const choices = `Valid flags for ${level}: ${validFlags.join(", ")}.` + (level === "tools" ? " Valid subcommands: show <tool>." : level === "tools show" ? ` Valid tools: ${toolSchema.options.join(", ")}.` : "");
24281
- let tool = false;
24282
- const seen = /* @__PURE__ */ new Set();
24283
- for (let index = start; index < args.length; index++) {
24284
- const token = args[index];
24285
- if (level === "tools show" && !token.startsWith("-") && !tool) {
24286
- if (!toolSchema.safeParse(token).success) fail(token, level, choices);
24287
- tool = true;
24288
- } else {
24289
- if (!validFlags.includes(token) || seen.has(token)) fail(token, level, choices);
24290
- seen.add(token);
24291
- if (token === "--username" || token === "--host") {
24292
- const value = args[index + 1];
24293
- if (!value) fail(value, `${level} ${token}`, `Supply ${token} ${token === "--host" ? "<claude|codex|opencode|pi>" : "<username>"}. ${choices}`);
24294
- if (token === "--host" && !["claude", "codex", "opencode", "pi"].includes(value)) fail(value, `${level} --host`, `Valid hosts: claude, codex, opencode, pi. Use ${entry.usage}.`);
24295
- index++;
24296
- }
24297
- }
24298
- }
24299
- if (level === "tools show" && !tool && !seen.has("--help") && !prefixHelp) fail(void 0, level, choices);
24300
- }
24301
- function helpCommand(args, prefixHelp = false) {
24302
- if (args[0] === "setup" && args.includes("--help")) {
24303
- const path2 = args.filter((arg) => arg !== "--help");
24304
- for (let index = 1; index < path2.length; index++) {
24305
- if (path2[index] === "--host" && ["claude", "codex", "opencode", "pi"].includes(path2[index + 1])) index++;
24306
- else if (path2[index] !== "--hook" && path2[index] !== "--force") return void 0;
24307
- }
24308
- return "setup";
24309
- }
24310
- if (toolSchema.safeParse(args[0]).success) return prefixHelp && args.length === 2 ? args[0] : void 0;
24311
- if (args[0] === "login" || args[0] === "passwd") {
24312
- if (args[0] === "login" && args.length === 3 && args.includes("--sso") && args.includes("--help")) return "login";
24313
- let requested = false;
24314
- let username = false;
24315
- let stdin = false;
24316
- for (let index = 1; index < args.length; index++) {
24317
- const option = args[index];
24318
- if (option === "--username" && args[0] === "login" && !username && args[index + 1] !== void 0) {
24319
- username = true;
24320
- index++;
24321
- } else if (option === "--password-stdin" && !stdin) stdin = true;
24322
- else if (option === "--help" && !requested) requested = true;
24323
- else return void 0;
24324
- }
24325
- return requested ? args[0] : void 0;
24326
- }
24327
- if (!args.includes("--help")) return void 0;
24328
- const path = args.filter((arg) => arg !== "--help");
24329
- if (path.length === 0) return "home";
24330
- if (path[0] === "tools" && path[1] === "show" && (path.length === 2 || path.length === 3 && toolSchema.safeParse(path[2]).success)) return "tools show";
24331
- if (path.length === 1 && path[0] !== "home" && Object.hasOwn(commands, path[0])) return path[0];
24332
- return void 0;
24333
- }
24334
-
24335
23776
  // tools/inventories/az-axi.json
24336
23777
  var az_axi_default = {
24337
23778
  generatedBy: "scripts/upstream-inventory.mjs",
@@ -29064,6 +28505,13 @@ var mg_axi_default = {
29064
28505
  ],
29065
28506
  nativeWriteSettings: {
29066
28507
  default: "disabled",
28508
+ supportedOperations: [
28509
+ "entra.conditional-access.policy.update",
28510
+ "entra.risky-user.dismiss",
28511
+ "entra.user.revokeSessions",
28512
+ "entra.user.update",
28513
+ "mg.entra.group.member.add"
28514
+ ],
29067
28515
  profileFields: {
29068
28516
  "writes.allowWrites": "boolean",
29069
28517
  "writes.operations": "string[]"
@@ -33640,171 +33088,710 @@ var mg_axi_default = {
33640
33088
  positionalInput: false
33641
33089
  },
33642
33090
  {
33643
- command: "entra lifecycle run user-processing-result count",
33091
+ command: "entra lifecycle run user-processing-result count",
33092
+ flags: {
33093
+ help: "boolean",
33094
+ profile: "value",
33095
+ "api-version": "value",
33096
+ workflow: "value",
33097
+ run: "value",
33098
+ scopes: "value",
33099
+ config: "value"
33100
+ },
33101
+ positionalInput: false
33102
+ },
33103
+ {
33104
+ command: "entra lifecycle run subject-processing-result list",
33105
+ flags: {
33106
+ help: "boolean",
33107
+ profile: "value",
33108
+ "api-version": "value",
33109
+ workflow: "value",
33110
+ run: "value",
33111
+ limit: "value",
33112
+ all: "boolean",
33113
+ filter: "value",
33114
+ fields: "value",
33115
+ full: "boolean",
33116
+ cursor: "value",
33117
+ scopes: "value",
33118
+ config: "value"
33119
+ },
33120
+ positionalInput: false
33121
+ },
33122
+ {
33123
+ command: "entra lifecycle run subject-processing-result show",
33124
+ flags: {
33125
+ help: "boolean",
33126
+ profile: "value",
33127
+ "api-version": "value",
33128
+ workflow: "value",
33129
+ run: "value",
33130
+ id: "value",
33131
+ fields: "value",
33132
+ full: "boolean",
33133
+ scopes: "value",
33134
+ config: "value"
33135
+ },
33136
+ positionalInput: false
33137
+ },
33138
+ {
33139
+ command: "entra lifecycle run subject-processing-result count",
33140
+ flags: {
33141
+ help: "boolean",
33142
+ profile: "value",
33143
+ "api-version": "value",
33144
+ workflow: "value",
33145
+ run: "value",
33146
+ scopes: "value",
33147
+ config: "value"
33148
+ },
33149
+ positionalInput: false
33150
+ },
33151
+ {
33152
+ command: "entra lifecycle run task-processing-result list",
33153
+ flags: {
33154
+ help: "boolean",
33155
+ profile: "value",
33156
+ "api-version": "value",
33157
+ workflow: "value",
33158
+ run: "value",
33159
+ limit: "value",
33160
+ all: "boolean",
33161
+ filter: "value",
33162
+ select: "value",
33163
+ fields: "value",
33164
+ full: "boolean",
33165
+ cursor: "value",
33166
+ scopes: "value",
33167
+ config: "value"
33168
+ },
33169
+ positionalInput: false
33170
+ },
33171
+ {
33172
+ command: "entra lifecycle run task-processing-result show",
33173
+ flags: {
33174
+ help: "boolean",
33175
+ profile: "value",
33176
+ "api-version": "value",
33177
+ workflow: "value",
33178
+ run: "value",
33179
+ id: "value",
33180
+ fields: "value",
33181
+ full: "boolean",
33182
+ scopes: "value",
33183
+ config: "value"
33184
+ },
33185
+ positionalInput: false
33186
+ },
33187
+ {
33188
+ command: "entra lifecycle run task-processing-result count",
33189
+ flags: {
33190
+ help: "boolean",
33191
+ profile: "value",
33192
+ "api-version": "value",
33193
+ workflow: "value",
33194
+ run: "value",
33195
+ scopes: "value",
33196
+ config: "value"
33197
+ },
33198
+ positionalInput: false
33199
+ },
33200
+ {
33201
+ command: "api get",
33202
+ flags: {
33203
+ help: "boolean",
33204
+ profile: "value",
33205
+ "api-version": "value",
33206
+ odata: "value",
33207
+ cursor: "value",
33208
+ scopes: "value",
33209
+ limit: "value",
33210
+ all: "boolean",
33211
+ full: "boolean",
33212
+ config: "value"
33213
+ },
33214
+ positionalInput: {
33215
+ name: "path",
33216
+ description: "Server-relative Graph path, e.g. /users",
33217
+ required: true
33218
+ }
33219
+ },
33220
+ {
33221
+ command: "login",
33222
+ flags: {
33223
+ help: "boolean",
33224
+ profile: "value",
33225
+ method: "value",
33226
+ scopes: "value",
33227
+ config: "value"
33228
+ },
33229
+ positionalInput: false
33230
+ },
33231
+ {
33232
+ command: "config path",
33233
+ flags: {
33234
+ help: "boolean",
33235
+ config: "value"
33236
+ },
33237
+ positionalInput: false
33238
+ },
33239
+ {
33240
+ command: "auth status",
33241
+ flags: {
33242
+ help: "boolean",
33243
+ profile: "value",
33244
+ config: "value"
33245
+ },
33246
+ positionalInput: false
33247
+ },
33248
+ {
33249
+ command: "auth logout",
33250
+ flags: {
33251
+ help: "boolean",
33252
+ profile: "value",
33253
+ config: "value"
33254
+ },
33255
+ positionalInput: false
33256
+ }
33257
+ ]
33258
+ };
33259
+
33260
+ // tools/inventories/ldap-axi.json
33261
+ var ldap_axi_default = {
33262
+ generatedBy: "scripts/ldap-inventory.mjs",
33263
+ tool: "ldap-axi",
33264
+ version: "0.3.0",
33265
+ integrity: "sha512-QVectHNsRxYWNBf0im5DjeN78mcgK0Te0Sxh7uXGNb+AhQjsS5ywiCrnKAk0/INA/oxiZ1TiXaDX7jHAg5OvDg==",
33266
+ parserEvidence: "Installed pinned command schemas and reviewed CLI globals and entry routes",
33267
+ sources: [
33268
+ {
33269
+ path: "package.json",
33270
+ sha256: "9fa26acd15443dad0857c7468f570164e436f7b25aef3df733da3c4d859917a9"
33271
+ },
33272
+ {
33273
+ path: "README.md",
33274
+ sha256: "cd05d13da53b80aa651a5207b680e7fa6a0fb0c975244e4cc135d26b13391204"
33275
+ },
33276
+ {
33277
+ path: "axi-credential.schema.json",
33278
+ sha256: "76b9f5f449d844dcd4365b966ed907515582f72fc920b936dae825ebf1b7cc53"
33279
+ },
33280
+ {
33281
+ path: "dist/src/cli.js",
33282
+ sha256: "2cb024b2848c2c9e27c292205b3ed86a829cfed21d52e8fea06ef544a039ec2a"
33283
+ },
33284
+ {
33285
+ path: "dist/src/schema.js",
33286
+ sha256: "ba2285cbda6e5994c536b2f9de65736df1b43b0b10c5d5b7a1c2d7124ab198a0"
33287
+ },
33288
+ {
33289
+ path: "dist/src/config.js",
33290
+ sha256: "cbc48584b6ff2a2a70375e9e8e6242a87543a3e6e6f7e1c055a2d29c42b677f9"
33291
+ },
33292
+ {
33293
+ path: "dist/src/secrets.js",
33294
+ sha256: "9f2ccf86515cec1dd65f2dd5850188232374535f7fe56a788fdc7b94d91c8532"
33295
+ },
33296
+ {
33297
+ path: "dist/src/directory/auth.js",
33298
+ sha256: "64885ea4bc5067c58dcb4d432610f99eedfa9af65fa46273b68d503d26ec3214"
33299
+ },
33300
+ {
33301
+ path: "dist/src/directory/policy.js",
33302
+ sha256: "a697dd78990493f7f1c19d22278ebb922c997e9cf88a51b12adfaca30fa8a01d"
33303
+ }
33304
+ ],
33305
+ credentialSchema: {
33306
+ $schema: "https://json-schema.org/draft/2020-12/schema",
33307
+ title: "ldap-axi profile",
33308
+ type: "object",
33309
+ additionalProperties: false,
33310
+ required: [
33311
+ "url"
33312
+ ],
33313
+ properties: {
33314
+ url: {
33315
+ type: "string",
33316
+ pattern: "^ldaps?://",
33317
+ description: "LDAP URL without userinfo; use the server FQDN for ambient authentication"
33318
+ },
33319
+ auth: {
33320
+ enum: [
33321
+ "auto",
33322
+ "gssapi",
33323
+ "simple"
33324
+ ],
33325
+ default: "auto"
33326
+ },
33327
+ bindDn: {
33328
+ type: "string",
33329
+ minLength: 1,
33330
+ description: "Simple-bind identity, required for simple authentication"
33331
+ },
33332
+ bindPassword: {
33333
+ "x-secret": true,
33334
+ description: "Simple-bind password reference; defaults to env LDAP_AXI_BIND_PASSWORD. No stored secrets.",
33335
+ oneOf: [
33336
+ {
33337
+ type: "object",
33338
+ additionalProperties: false,
33339
+ required: [
33340
+ "env"
33341
+ ],
33342
+ properties: {
33343
+ env: {
33344
+ type: "string",
33345
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
33346
+ }
33347
+ }
33348
+ },
33349
+ {
33350
+ type: "object",
33351
+ additionalProperties: false,
33352
+ required: [
33353
+ "file"
33354
+ ],
33355
+ properties: {
33356
+ file: {
33357
+ type: "string",
33358
+ pattern: "^(?:/|[A-Za-z]:[\\\\/])",
33359
+ description: "Absolute local path to a private UTF-8 password file; UNC/device paths are forbidden on Windows"
33360
+ }
33361
+ }
33362
+ }
33363
+ ]
33364
+ },
33365
+ base: {
33366
+ type: "string"
33367
+ },
33368
+ pageSize: {
33369
+ type: "integer",
33370
+ minimum: 1,
33371
+ maximum: 1e3
33372
+ },
33373
+ caFile: {
33374
+ type: "string",
33375
+ minLength: 1
33376
+ },
33377
+ startTls: {
33378
+ type: "boolean",
33379
+ default: false
33380
+ },
33381
+ tlsMaxVersion: {
33382
+ const: "1.2"
33383
+ },
33384
+ flavor: {
33385
+ enum: [
33386
+ "ad",
33387
+ "adlds",
33388
+ "ldapv3"
33389
+ ]
33390
+ },
33391
+ gssapiService: {
33392
+ type: "string",
33393
+ minLength: 1
33394
+ },
33395
+ gssapiProtection: {
33396
+ enum: [
33397
+ "none",
33398
+ "confidentiality"
33399
+ ]
33400
+ }
33401
+ }
33402
+ },
33403
+ adapterBoundary: {
33404
+ unsafeOverrides: [
33405
+ "config",
33406
+ "url",
33407
+ "start-tls",
33408
+ "ca-file",
33409
+ "ca-only",
33410
+ "tls-no-verify",
33411
+ "tls-max-version",
33412
+ "insecure-plaintext",
33413
+ "anonymous",
33414
+ "profile",
33415
+ "auth",
33416
+ "gssapi-service",
33417
+ "gssapi-protection"
33418
+ ],
33419
+ blockedCommands: [
33420
+ "config",
33421
+ "profile",
33422
+ "setup"
33423
+ ],
33424
+ sensitiveFlags: [
33425
+ "base",
33426
+ "filter",
33427
+ "name",
33428
+ "sam",
33429
+ "upn",
33430
+ "uid"
33431
+ ],
33432
+ authentication: "Stored simple-bind identity over verified LDAPS or StartTLS; no ambient ticket or keytab",
33433
+ inputs: {
33434
+ stdin: "unsupported",
33435
+ files: "unsupported",
33436
+ caFile: "stored PEM materialized privately by host"
33437
+ },
33438
+ resources: {
33439
+ nodeHeapMiB: 128
33440
+ },
33441
+ nativeWrites: "read-only upstream design"
33442
+ },
33443
+ discovery: {
33444
+ commands: [
33445
+ "entry",
33446
+ "user",
33447
+ "group",
33448
+ "computer",
33449
+ "auth status",
33450
+ "server"
33451
+ ],
33452
+ example: [
33453
+ "user",
33454
+ "list",
33455
+ "--limit",
33456
+ "1"
33457
+ ],
33458
+ help: "List user accounts.\nLDAPv3 users are inetOrgPerson or posixAccount entries; use ldap-axi entry search for account + simpleSecurityObject service accounts.\nUsage: ldap-axi user list [flags]\nFlags:\n --help show this help\n --base <dn> search base (default: environment, config, or server naming contexts)\n --disabled include disabled accounts (LDAPv3: permanent ppolicy locks)\n --enabled include enabled accounts (LDAPv3: exclude permanent ppolicy locks)\n --locked include current AD locks or recorded LDAPv3 ppolicy lock candidates\n --all read all pages up to --max-rows or --limit\n --name <pattern> match cn\n --sam <pattern> AD only: match sAMAccountName\n --upn <pattern> AD only: match userPrincipalName\n --uid <pattern> LDAPv3 only: match uid\n --filter <RFC4515> add a raw LDAP filter\n --scope <base|one|sub> search scope (default: sub)\n --max-rows <n> maximum output rows\n --page-size <1..1000> LDAP page size (default: AD 1000, LDAPv3 500; config overrides)\n --limit <n> alias for bounded list output\n --fields <name,...> select output fields\n --attributes <name,...> request and emit raw attributes\nActive Directory fields: sam, upn, name, dn, enabled, locked, last_logon, object_sid, when_created, description, display_name, memberOf\nActive Directory defaults: sam, name, enabled, last_logon\nLDAPv3 fields: uid, name, mail, enabled, locked, account_state, dn, entry_uuid, when_created\nLDAPv3 defaults: uid, name, mail, enabled, locked, account_state\nExamples:\n ldap-axi user list --disabled --max-rows 25\n ldap-axi user list --name Alice --fields name,dn --limit 50"
33459
+ },
33460
+ suggestionFields: [
33461
+ "help"
33462
+ ],
33463
+ format: "TOON",
33464
+ commands: [
33465
+ {
33466
+ command: "home",
33467
+ flags: {
33468
+ help: "boolean",
33469
+ config: "value",
33470
+ url: "value",
33471
+ base: "value",
33472
+ "start-tls": "boolean",
33473
+ "ca-file": "value",
33474
+ "ca-only": "boolean",
33475
+ "tls-no-verify": "boolean",
33476
+ "tls-max-version": "value",
33477
+ "insecure-plaintext": "boolean",
33478
+ anonymous: "boolean",
33479
+ profile: "value",
33480
+ auth: "value",
33481
+ "gssapi-service": "value",
33482
+ "gssapi-protection": "value"
33483
+ },
33484
+ positionalInput: false
33485
+ },
33486
+ {
33487
+ command: "auth status",
33644
33488
  flags: {
33645
33489
  help: "boolean",
33490
+ config: "value",
33491
+ url: "value",
33492
+ base: "value",
33493
+ "start-tls": "boolean",
33494
+ "ca-file": "value",
33495
+ "ca-only": "boolean",
33496
+ "tls-no-verify": "boolean",
33497
+ "tls-max-version": "value",
33498
+ "insecure-plaintext": "boolean",
33499
+ anonymous: "boolean",
33646
33500
  profile: "value",
33647
- "api-version": "value",
33648
- workflow: "value",
33649
- run: "value",
33650
- scopes: "value",
33651
- config: "value"
33501
+ auth: "value",
33502
+ "gssapi-service": "value",
33503
+ "gssapi-protection": "value",
33504
+ offline: "boolean"
33652
33505
  },
33653
33506
  positionalInput: false
33654
33507
  },
33655
33508
  {
33656
- command: "entra lifecycle run subject-processing-result list",
33509
+ command: "server",
33657
33510
  flags: {
33658
33511
  help: "boolean",
33512
+ config: "value",
33513
+ url: "value",
33514
+ base: "value",
33515
+ "start-tls": "boolean",
33516
+ "ca-file": "value",
33517
+ "ca-only": "boolean",
33518
+ "tls-no-verify": "boolean",
33519
+ "tls-max-version": "value",
33520
+ "insecure-plaintext": "boolean",
33521
+ anonymous: "boolean",
33659
33522
  profile: "value",
33660
- "api-version": "value",
33661
- workflow: "value",
33662
- run: "value",
33663
- limit: "value",
33664
- all: "boolean",
33665
- filter: "value",
33666
- fields: "value",
33667
- full: "boolean",
33668
- cursor: "value",
33669
- scopes: "value",
33670
- config: "value"
33523
+ auth: "value",
33524
+ "gssapi-service": "value",
33525
+ "gssapi-protection": "value"
33671
33526
  },
33672
33527
  positionalInput: false
33673
33528
  },
33674
33529
  {
33675
- command: "entra lifecycle run subject-processing-result show",
33530
+ command: "entry search",
33676
33531
  flags: {
33677
33532
  help: "boolean",
33533
+ config: "value",
33534
+ url: "value",
33535
+ base: "value",
33536
+ "start-tls": "boolean",
33537
+ "ca-file": "value",
33538
+ "ca-only": "boolean",
33539
+ "tls-no-verify": "boolean",
33540
+ "tls-max-version": "value",
33541
+ "insecure-plaintext": "boolean",
33542
+ anonymous: "boolean",
33678
33543
  profile: "value",
33679
- "api-version": "value",
33680
- workflow: "value",
33681
- run: "value",
33682
- id: "value",
33683
- fields: "value",
33684
- full: "boolean",
33685
- scopes: "value",
33686
- config: "value"
33544
+ auth: "value",
33545
+ "gssapi-service": "value",
33546
+ "gssapi-protection": "value",
33547
+ filter: "value",
33548
+ scope: "value",
33549
+ attributes: "value",
33550
+ "page-size": "value",
33551
+ "max-rows": "value",
33552
+ all: "boolean"
33687
33553
  },
33688
33554
  positionalInput: false
33689
33555
  },
33690
33556
  {
33691
- command: "entra lifecycle run subject-processing-result count",
33557
+ command: "entry show",
33692
33558
  flags: {
33693
33559
  help: "boolean",
33560
+ config: "value",
33561
+ url: "value",
33562
+ base: "value",
33563
+ "start-tls": "boolean",
33564
+ "ca-file": "value",
33565
+ "ca-only": "boolean",
33566
+ "tls-no-verify": "boolean",
33567
+ "tls-max-version": "value",
33568
+ "insecure-plaintext": "boolean",
33569
+ anonymous: "boolean",
33694
33570
  profile: "value",
33695
- "api-version": "value",
33696
- workflow: "value",
33697
- run: "value",
33698
- scopes: "value",
33699
- config: "value"
33571
+ auth: "value",
33572
+ "gssapi-service": "value",
33573
+ "gssapi-protection": "value",
33574
+ attributes: "value",
33575
+ "page-size": "value"
33700
33576
  },
33701
- positionalInput: false
33577
+ positionalInput: true
33702
33578
  },
33703
33579
  {
33704
- command: "entra lifecycle run task-processing-result list",
33580
+ command: "user list",
33705
33581
  flags: {
33706
33582
  help: "boolean",
33583
+ config: "value",
33584
+ url: "value",
33585
+ base: "value",
33586
+ "start-tls": "boolean",
33587
+ "ca-file": "value",
33588
+ "ca-only": "boolean",
33589
+ "tls-no-verify": "boolean",
33590
+ "tls-max-version": "value",
33591
+ "insecure-plaintext": "boolean",
33592
+ anonymous: "boolean",
33707
33593
  profile: "value",
33708
- "api-version": "value",
33709
- workflow: "value",
33710
- run: "value",
33711
- limit: "value",
33594
+ auth: "value",
33595
+ "gssapi-service": "value",
33596
+ "gssapi-protection": "value",
33597
+ disabled: "boolean",
33598
+ enabled: "boolean",
33599
+ locked: "boolean",
33712
33600
  all: "boolean",
33601
+ name: "value",
33602
+ sam: "value",
33603
+ upn: "value",
33604
+ uid: "value",
33713
33605
  filter: "value",
33714
- select: "value",
33606
+ scope: "value",
33607
+ "max-rows": "value",
33608
+ "page-size": "value",
33609
+ limit: "value",
33715
33610
  fields: "value",
33716
- full: "boolean",
33717
- cursor: "value",
33718
- scopes: "value",
33719
- config: "value"
33611
+ attributes: "value"
33720
33612
  },
33721
33613
  positionalInput: false
33722
33614
  },
33723
33615
  {
33724
- command: "entra lifecycle run task-processing-result show",
33616
+ command: "user show",
33725
33617
  flags: {
33726
33618
  help: "boolean",
33619
+ config: "value",
33620
+ url: "value",
33621
+ base: "value",
33622
+ "start-tls": "boolean",
33623
+ "ca-file": "value",
33624
+ "ca-only": "boolean",
33625
+ "tls-no-verify": "boolean",
33626
+ "tls-max-version": "value",
33627
+ "insecure-plaintext": "boolean",
33628
+ anonymous: "boolean",
33727
33629
  profile: "value",
33728
- "api-version": "value",
33729
- workflow: "value",
33730
- run: "value",
33731
- id: "value",
33630
+ auth: "value",
33631
+ "gssapi-service": "value",
33632
+ "gssapi-protection": "value",
33732
33633
  fields: "value",
33733
- full: "boolean",
33734
- scopes: "value",
33735
- config: "value"
33634
+ attributes: "value"
33736
33635
  },
33737
- positionalInput: false
33636
+ positionalInput: true
33738
33637
  },
33739
33638
  {
33740
- command: "entra lifecycle run task-processing-result count",
33639
+ command: "user groups",
33741
33640
  flags: {
33742
33641
  help: "boolean",
33642
+ config: "value",
33643
+ url: "value",
33644
+ base: "value",
33645
+ "start-tls": "boolean",
33646
+ "ca-file": "value",
33647
+ "ca-only": "boolean",
33648
+ "tls-no-verify": "boolean",
33649
+ "tls-max-version": "value",
33650
+ "insecure-plaintext": "boolean",
33651
+ anonymous: "boolean",
33743
33652
  profile: "value",
33744
- "api-version": "value",
33745
- workflow: "value",
33746
- run: "value",
33747
- scopes: "value",
33748
- config: "value"
33653
+ auth: "value",
33654
+ "gssapi-service": "value",
33655
+ "gssapi-protection": "value",
33656
+ nested: "boolean",
33657
+ "max-rows": "value",
33658
+ "page-size": "value",
33659
+ fields: "value"
33749
33660
  },
33750
- positionalInput: false
33661
+ positionalInput: true
33751
33662
  },
33752
33663
  {
33753
- command: "api get",
33664
+ command: "group list",
33754
33665
  flags: {
33755
33666
  help: "boolean",
33667
+ config: "value",
33668
+ url: "value",
33669
+ base: "value",
33670
+ "start-tls": "boolean",
33671
+ "ca-file": "value",
33672
+ "ca-only": "boolean",
33673
+ "tls-no-verify": "boolean",
33674
+ "tls-max-version": "value",
33675
+ "insecure-plaintext": "boolean",
33676
+ anonymous: "boolean",
33756
33677
  profile: "value",
33757
- "api-version": "value",
33758
- odata: "value",
33759
- cursor: "value",
33760
- scopes: "value",
33761
- limit: "value",
33678
+ auth: "value",
33679
+ "gssapi-service": "value",
33680
+ "gssapi-protection": "value",
33762
33681
  all: "boolean",
33763
- full: "boolean",
33764
- config: "value"
33682
+ name: "value",
33683
+ sam: "value",
33684
+ filter: "value",
33685
+ scope: "value",
33686
+ "max-rows": "value",
33687
+ "page-size": "value",
33688
+ limit: "value",
33689
+ fields: "value",
33690
+ attributes: "value"
33765
33691
  },
33766
- positionalInput: {
33767
- name: "path",
33768
- description: "Server-relative Graph path, e.g. /users",
33769
- required: true
33770
- }
33692
+ positionalInput: false
33771
33693
  },
33772
33694
  {
33773
- command: "login",
33695
+ command: "group show",
33774
33696
  flags: {
33775
33697
  help: "boolean",
33698
+ config: "value",
33699
+ url: "value",
33700
+ base: "value",
33701
+ "start-tls": "boolean",
33702
+ "ca-file": "value",
33703
+ "ca-only": "boolean",
33704
+ "tls-no-verify": "boolean",
33705
+ "tls-max-version": "value",
33706
+ "insecure-plaintext": "boolean",
33707
+ anonymous: "boolean",
33776
33708
  profile: "value",
33777
- method: "value",
33778
- scopes: "value",
33779
- config: "value"
33709
+ auth: "value",
33710
+ "gssapi-service": "value",
33711
+ "gssapi-protection": "value",
33712
+ fields: "value",
33713
+ attributes: "value"
33780
33714
  },
33781
- positionalInput: false
33715
+ positionalInput: true
33782
33716
  },
33783
33717
  {
33784
- command: "config path",
33718
+ command: "group members",
33785
33719
  flags: {
33786
33720
  help: "boolean",
33787
- config: "value"
33721
+ config: "value",
33722
+ url: "value",
33723
+ base: "value",
33724
+ "start-tls": "boolean",
33725
+ "ca-file": "value",
33726
+ "ca-only": "boolean",
33727
+ "tls-no-verify": "boolean",
33728
+ "tls-max-version": "value",
33729
+ "insecure-plaintext": "boolean",
33730
+ anonymous: "boolean",
33731
+ profile: "value",
33732
+ auth: "value",
33733
+ "gssapi-service": "value",
33734
+ "gssapi-protection": "value",
33735
+ nested: "boolean",
33736
+ "max-rows": "value",
33737
+ "page-size": "value",
33738
+ fields: "value"
33788
33739
  },
33789
- positionalInput: false
33740
+ positionalInput: true
33790
33741
  },
33791
33742
  {
33792
- command: "auth status",
33743
+ command: "computer list",
33793
33744
  flags: {
33794
33745
  help: "boolean",
33746
+ config: "value",
33747
+ url: "value",
33748
+ base: "value",
33749
+ "start-tls": "boolean",
33750
+ "ca-file": "value",
33751
+ "ca-only": "boolean",
33752
+ "tls-no-verify": "boolean",
33753
+ "tls-max-version": "value",
33754
+ "insecure-plaintext": "boolean",
33755
+ anonymous: "boolean",
33795
33756
  profile: "value",
33796
- config: "value"
33757
+ auth: "value",
33758
+ "gssapi-service": "value",
33759
+ "gssapi-protection": "value",
33760
+ all: "boolean",
33761
+ name: "value",
33762
+ sam: "value",
33763
+ filter: "value",
33764
+ scope: "value",
33765
+ "max-rows": "value",
33766
+ "page-size": "value",
33767
+ limit: "value",
33768
+ fields: "value",
33769
+ attributes: "value"
33797
33770
  },
33798
33771
  positionalInput: false
33799
33772
  },
33800
33773
  {
33801
- command: "auth logout",
33774
+ command: "computer show",
33802
33775
  flags: {
33803
33776
  help: "boolean",
33777
+ config: "value",
33778
+ url: "value",
33779
+ base: "value",
33780
+ "start-tls": "boolean",
33781
+ "ca-file": "value",
33782
+ "ca-only": "boolean",
33783
+ "tls-no-verify": "boolean",
33784
+ "tls-max-version": "value",
33785
+ "insecure-plaintext": "boolean",
33786
+ anonymous: "boolean",
33804
33787
  profile: "value",
33805
- config: "value"
33788
+ auth: "value",
33789
+ "gssapi-service": "value",
33790
+ "gssapi-protection": "value",
33791
+ fields: "value",
33792
+ attributes: "value"
33806
33793
  },
33807
- positionalInput: false
33794
+ positionalInput: true
33808
33795
  }
33809
33796
  ]
33810
33797
  };
@@ -34879,8 +34866,8 @@ var ado_axi_default = {
34879
34866
  var awx_axi_default = {
34880
34867
  generatedBy: "scripts/awx-inventory.mjs",
34881
34868
  tool: "awx-axi",
34882
- version: "0.1.7",
34883
- integrity: "sha512-hZFvJnOhW+UZDeBTp+un1K1anUqEVC0njETANXbHjgXKwiGB3W1h5oEZzmf4fiPskZarr+ynlEaUaWafEHtnsA==",
34869
+ version: "0.1.8",
34870
+ integrity: "sha512-tkheZgSTjs6nZT3KWo0e/+SH43ZacfvZpo7COktmpIs8lNr8VLhUtrGARz+mvwj8pov4zscdfmxAHL/8V025Bw==",
34884
34871
  parserEvidence: "Published domain registry, reviewed plan effects and transport safety gates",
34885
34872
  sources: [
34886
34873
  {
@@ -34893,7 +34880,7 @@ var awx_axi_default = {
34893
34880
  },
34894
34881
  {
34895
34882
  path: "dist/commands/auth.js",
34896
- sha256: "5ccc0c9a226ab900bcc89a55aa71b22b64a41069e9f64d73c2c1fece79190a68"
34883
+ sha256: "cf8e52f33d6acb5091d009c23df4957da3d208d4e9417bdcbba547f4d7c8b690"
34897
34884
  },
34898
34885
  {
34899
34886
  path: "dist/commands/home.js",
@@ -34917,7 +34904,7 @@ var awx_axi_default = {
34917
34904
  },
34918
34905
  {
34919
34906
  path: "dist/core/flags.js",
34920
- sha256: "ae72d1964d63ef9fab92bb5ff561f584432c14b8d216b5f2e2b5967333b25fbb"
34907
+ sha256: "60d5c58ab68c3cc61e57c249b93db544d619469c6fbd1e3082ee573ed1b50498"
34921
34908
  },
34922
34909
  {
34923
34910
  path: "dist/core/mutations.js",
@@ -34925,11 +34912,11 @@ var awx_axi_default = {
34925
34912
  },
34926
34913
  {
34927
34914
  path: "dist/core/output.js",
34928
- sha256: "b8d4dc8dff76151b2af0e25caf5946c97ba98f8eb21939aab49ed1222d7c16dd"
34915
+ sha256: "7406df524ee329a3e2eb1f2b37295d8699de678e687525c8d55a3ce67d78dd0a"
34929
34916
  },
34930
34917
  {
34931
34918
  path: "dist/core/paginate.js",
34932
- sha256: "cd5b17961f1671e204a8087b96ef8a15dc8c4994b486f0b3027734c560e648b2"
34919
+ sha256: "d952bc390a4ac2da263b1d98c24f05e416652335904de37b26379576632059a3"
34933
34920
  },
34934
34921
  {
34935
34922
  path: "dist/core/poll.js",
@@ -34937,19 +34924,19 @@ var awx_axi_default = {
34937
34924
  },
34938
34925
  {
34939
34926
  path: "dist/core/private-file.js",
34940
- sha256: "eedc2a13e5e4470eb22b8e3d500cd971b376c57fff9220c12c4d507ceeb240f6"
34927
+ sha256: "30f44672d91f74b232ae6f7884b7daee6bd12ce6702ca57b3213a8a5da4bf992"
34941
34928
  },
34942
34929
  {
34943
34930
  path: "dist/core/profiles.js",
34944
- sha256: "72b3bfe669c5471222efb6a457d25daff793375399c406f47a112fc76b291dc4"
34931
+ sha256: "c3ac1d2a531115d253ed83020d88e3763108249a4a03ca710da40833db05bc7d"
34945
34932
  },
34946
34933
  {
34947
34934
  path: "dist/core/redact.js",
34948
- sha256: "dd8de047c53d06808f90f9c51324b737a51d83768c16d4e69f9af64f56bdf602"
34935
+ sha256: "4fa205b30a3165738578c01ecfa5787bb6993ee11b07dbcb74b6401d4441679f"
34949
34936
  },
34950
34937
  {
34951
34938
  path: "dist/core/registry.js",
34952
- sha256: "a1818f532b67b39c6402d694b982b688234fdfdec4df51782ef30783b7afe488"
34939
+ sha256: "89d3983928dd3a63712e9c78a4959c2e9c950097a3d200f6d1ccf2c3327bbdfd"
34953
34940
  },
34954
34941
  {
34955
34942
  path: "dist/core/resolve.js",
@@ -34965,95 +34952,95 @@ var awx_axi_default = {
34965
34952
  },
34966
34953
  {
34967
34954
  path: "dist/domains/activity-stream/index.js",
34968
- sha256: "b5e7094013f5626affc0bf756b96ad3edce3d1720d0698238bc703e749e8571a"
34955
+ sha256: "633995f66b7e24cb4c6d98341e943a7e8d61b3b271503cb1b191b161b3fb927f"
34969
34956
  },
34970
34957
  {
34971
34958
  path: "dist/domains/ad-hoc/index.js",
34972
- sha256: "8fdaf507ab0b4b4f7e9ae7713e36ae318d55882276cfe9e82dfdeff65417266d"
34959
+ sha256: "92f5395f74f449bb6fde43276764dfe965eaa8afb491a8f5e13323dc9a366084"
34973
34960
  },
34974
34961
  {
34975
34962
  path: "dist/domains/approval/index.js",
34976
- sha256: "139356c4fa1289f2694d55248b7f12e8b0267fa5acd39edb05b0f3ac4da0f64e"
34963
+ sha256: "741282a1143b776ba0850cd8cc0ec3da913e1d354cc08f671b51cdea58621b1b"
34977
34964
  },
34978
34965
  {
34979
34966
  path: "dist/domains/credential/index.js",
34980
- sha256: "554a36457a4d264f2361da766350ec6696aaace78280e978f56b6fb577447f6b"
34967
+ sha256: "00e5171e9b653f8266722cc53302748bbd54c874c07e60e2967f95797c7bcf05"
34981
34968
  },
34982
34969
  {
34983
34970
  path: "dist/domains/execution-environment/index.js",
34984
- sha256: "d068ff30cdf0eff1d8af2a53a564ed26e2843c544cd1d0d5c2643e8a9f07bdca"
34971
+ sha256: "0038065d8d51b9fe370e8e517ddcebfdb8ccf0b3ee512a89147eea413e918685"
34985
34972
  },
34986
34973
  {
34987
34974
  path: "dist/domains/group/index.js",
34988
- sha256: "6415d7548cc0220f423dd5da887b0fc6975be3cdb8367ed5df74f7af375fc5ef"
34975
+ sha256: "7fdd83edd141372fcc5486ba07968137f913ac9a73147aa748127b523c4cc785"
34989
34976
  },
34990
34977
  {
34991
34978
  path: "dist/domains/host/index.js",
34992
- sha256: "2faf483f269b39a12f759f46ff520ee97ac1009448062ccfb333c5a26ecd4591"
34979
+ sha256: "478ff268a6a6a8452aa206be7671e402782fbfde8504808d9cc4fe10205b6707"
34993
34980
  },
34994
34981
  {
34995
34982
  path: "dist/domains/inventory-source/index.js",
34996
- sha256: "1015ff818f4051828cd089ff603f6a1fe28ddb672061be021372c93f68053f56"
34983
+ sha256: "56d8f203514f688eb734c29c2db45930dcddb96bdb82424bf8cc835c493cb279"
34997
34984
  },
34998
34985
  {
34999
34986
  path: "dist/domains/inventory/index.js",
35000
- sha256: "8363397bbb0b9f90617442ae980d9900b536f7c17dec35d1b931c71546603f31"
34987
+ sha256: "0352fc474d38aed258ab069a6a80da83d3acf00c9cccd37c3d26b16e8b6d8e2d"
35001
34988
  },
35002
34989
  {
35003
34990
  path: "dist/domains/job/index.js",
35004
- sha256: "5a5c76bc626d83dc286b737416b8f44c0b5bf53b419f39cc07bb61ef65ae00bd"
34991
+ sha256: "db22aa5cd3c15da799d7aaea4430c9a6aa5e04e7f5fa1a5cacb340799f34f38c"
35005
34992
  },
35006
34993
  {
35007
34994
  path: "dist/domains/notification-template/index.js",
35008
- sha256: "8b6faa1fd012db6d2c66246dea378d8360aaa36dc1accfed367cb39f4679721a"
34995
+ sha256: "c3ddb6e7abcdc57583bc1ada57f30302f63b01a559381c2be196b7ee3bbfdc9b"
35009
34996
  },
35010
34997
  {
35011
34998
  path: "dist/domains/notification/index.js",
35012
- sha256: "4825216f22fb565de502165455dd23a3126573dcff584d5cf97915123680d3cf"
34999
+ sha256: "d9c46319aabe8187e3417710c3ebeda5650b55463f84fa9baa3d6fe91edc1ced"
35013
35000
  },
35014
35001
  {
35015
35002
  path: "dist/domains/organization/index.js",
35016
- sha256: "d79160904aca5909b3e83cee7a43d751566a49fcba7fd63595d2d10ecb473289"
35003
+ sha256: "65072b9afb1706b67b1f7c37c9d96bf12104d8ec56a214f06a512e6283fb0229"
35017
35004
  },
35018
35005
  {
35019
35006
  path: "dist/domains/project/index.js",
35020
- sha256: "8dcb5a74ed19511e9c53cfe0d9c67efe3cf78861019a559c60c19914d8d7cde2"
35007
+ sha256: "eafb98f7148e2a5e8c194af16ebbaa7569ddf74344e367531ba9f6946a39ef46"
35021
35008
  },
35022
35009
  {
35023
35010
  path: "dist/domains/role/index.js",
35024
- sha256: "63df014ea35ce97855e19fba126ccef8971756b2cc707a9c442f3fd6c094bdc9"
35011
+ sha256: "0e5ee47acb703d2f202f01450eb87330140b97c430440eff31c4f33bab28a647"
35025
35012
  },
35026
35013
  {
35027
35014
  path: "dist/domains/schedule/index.js",
35028
- sha256: "bcab018cfa8b38fa9c4b3509ba1ec1c10c4e4d10e3887e500e00baa794bbc8a6"
35015
+ sha256: "d3267a27432a6911027a2d5dc04177eb46db703ea012cc6d1cfe33c19be49694"
35029
35016
  },
35030
35017
  {
35031
35018
  path: "dist/domains/system-job-template/index.js",
35032
- sha256: "d9c8efd7b12054715e2a110bffa726dcb1bd34120521725c505b1179d7a49b45"
35019
+ sha256: "8f485966f9f290399dfaf2eedf21b4182d2dd712bb6833e1df377eabb53ebb04"
35033
35020
  },
35034
35021
  {
35035
35022
  path: "dist/domains/system-job/index.js",
35036
- sha256: "59e45fa7495ae48f1e9d8e551a80673cbfbe880d4c78c4221a168709a8247cff"
35023
+ sha256: "25bae07068cd93cf705c2bebcd8a4f6e5f6071c6b41951edb62527630e2c678f"
35037
35024
  },
35038
35025
  {
35039
35026
  path: "dist/domains/team/index.js",
35040
- sha256: "fd47ffaa541b5deede3994d16be4ad6683a2a8b0883d99846475f2e924453797"
35027
+ sha256: "eb3a4b5cff91f8ef1b07b64a934a3b9d9bc025cf2eb476f6aafa92086b9c07b6"
35041
35028
  },
35042
35029
  {
35043
35030
  path: "dist/domains/template/index.js",
35044
- sha256: "30801bdd67e37b105eefd4df3e7c0ece4a7257258e9087bf444a3383e12c93c8"
35031
+ sha256: "92dd83d5adbba8b572b2bcec6090630a34d572b4a1346906dafdc8499d6f7941"
35045
35032
  },
35046
35033
  {
35047
35034
  path: "dist/domains/user/index.js",
35048
- sha256: "b85dc53d942ffc9ed062bf948565c69d4cb046f718bb65118e3e27ce7533217c"
35035
+ sha256: "dc2de36112a32b61f34d631f642a134b317255a5f5a1c1f2da6f3cf6d09e7cf3"
35049
35036
  },
35050
35037
  {
35051
35038
  path: "dist/domains/workflow/index.js",
35052
- sha256: "d5734a2b8f937fca7e0660f8c2942fbcc0e543c105c4be5a16b3f3787e6530af"
35039
+ sha256: "811a3b1df2bfa7a2f76f6fb1c3464de91ed2b7c171788bc82ae4cd991ce4c52a"
35053
35040
  },
35054
35041
  {
35055
35042
  path: "dist/skill.js",
35056
- sha256: "65fe6713e288b6263bc74331969db46c39bd7d798b816266512de456427626a7"
35043
+ sha256: "c7280e3093b0f547c577d54dc1f861cac4ce13ec70afabf7a3d1d55e3dbd6247"
35057
35044
  }
35058
35045
  ],
35059
35046
  credentialSchema: {
@@ -35145,7 +35132,7 @@ var awx_axi_default = {
35145
35132
  }
35146
35133
  }
35147
35134
  },
35148
- skillSha256: "b3e128cd347128b36f949cf5641a4a1e3eeac47866e469d74d467f068cfb99c5",
35135
+ skillSha256: "71f03eed887e2a5189b1b08b692fc5fd7a4acfd274102bd925c27d1dd16177ce",
35149
35136
  adapterBoundary: {
35150
35137
  unsafeOverrides: [
35151
35138
  "config",
@@ -35218,7 +35205,9 @@ var awx_axi_default = {
35218
35205
  template: "value",
35219
35206
  failed: "boolean",
35220
35207
  since: "value",
35221
- limit: "value"
35208
+ limit: "value",
35209
+ all: "boolean",
35210
+ "max-rows": "value"
35222
35211
  },
35223
35212
  positionals: {
35224
35213
  names: [],
@@ -35263,7 +35252,9 @@ var awx_axi_default = {
35263
35252
  failed: "boolean",
35264
35253
  host: "value",
35265
35254
  task: "value",
35266
- limit: "value"
35255
+ limit: "value",
35256
+ all: "boolean",
35257
+ "max-rows": "value"
35267
35258
  },
35268
35259
  positionals: {
35269
35260
  names: [
@@ -35276,7 +35267,10 @@ var awx_axi_default = {
35276
35267
  command: "job hosts",
35277
35268
  effect: "read",
35278
35269
  flags: {
35279
- help: "boolean"
35270
+ help: "boolean",
35271
+ limit: "value",
35272
+ all: "boolean",
35273
+ "max-rows": "value"
35280
35274
  },
35281
35275
  positionals: {
35282
35276
  names: [
@@ -35366,7 +35360,9 @@ var awx_axi_default = {
35366
35360
  effect: "read",
35367
35361
  flags: {
35368
35362
  help: "boolean",
35369
- limit: "value"
35363
+ limit: "value",
35364
+ all: "boolean",
35365
+ "max-rows": "value"
35370
35366
  },
35371
35367
  positionals: {
35372
35368
  names: [
@@ -35593,7 +35589,9 @@ var awx_axi_default = {
35593
35589
  help: "boolean",
35594
35590
  project: "value",
35595
35591
  search: "value",
35596
- limit: "value"
35592
+ limit: "value",
35593
+ all: "boolean",
35594
+ "max-rows": "value"
35597
35595
  },
35598
35596
  positionals: {
35599
35597
  names: [],
@@ -35658,7 +35656,9 @@ var awx_axi_default = {
35658
35656
  effect: "read",
35659
35657
  flags: {
35660
35658
  help: "boolean",
35661
- limit: "value"
35659
+ limit: "value",
35660
+ all: "boolean",
35661
+ "max-rows": "value"
35662
35662
  },
35663
35663
  positionals: {
35664
35664
  names: [
@@ -36019,7 +36019,9 @@ var awx_axi_default = {
36019
36019
  flags: {
36020
36020
  help: "boolean",
36021
36021
  search: "value",
36022
- limit: "value"
36022
+ limit: "value",
36023
+ all: "boolean",
36024
+ "max-rows": "value"
36023
36025
  },
36024
36026
  positionals: {
36025
36027
  names: [],
@@ -36076,7 +36078,10 @@ var awx_axi_default = {
36076
36078
  command: "workflow nodes",
36077
36079
  effect: "read",
36078
36080
  flags: {
36079
- help: "boolean"
36081
+ help: "boolean",
36082
+ limit: "value",
36083
+ all: "boolean",
36084
+ "max-rows": "value"
36080
36085
  },
36081
36086
  positionals: {
36082
36087
  names: [
@@ -36090,7 +36095,9 @@ var awx_axi_default = {
36090
36095
  effect: "read",
36091
36096
  flags: {
36092
36097
  help: "boolean",
36093
- limit: "value"
36098
+ limit: "value",
36099
+ all: "boolean",
36100
+ "max-rows": "value"
36094
36101
  },
36095
36102
  positionals: {
36096
36103
  names: [
@@ -36103,8 +36110,7 @@ var awx_axi_default = {
36103
36110
  command: "workflow template-node",
36104
36111
  effect: "read",
36105
36112
  flags: {
36106
- help: "boolean",
36107
- limit: "value"
36113
+ help: "boolean"
36108
36114
  },
36109
36115
  positionals: {
36110
36116
  names: [
@@ -36430,7 +36436,9 @@ var awx_axi_default = {
36430
36436
  flags: {
36431
36437
  help: "boolean",
36432
36438
  search: "value",
36433
- limit: "value"
36439
+ limit: "value",
36440
+ all: "boolean",
36441
+ "max-rows": "value"
36434
36442
  },
36435
36443
  positionals: {
36436
36444
  names: [],
@@ -36472,7 +36480,9 @@ var awx_axi_default = {
36472
36480
  flags: {
36473
36481
  help: "boolean",
36474
36482
  search: "value",
36475
- limit: "value"
36483
+ limit: "value",
36484
+ all: "boolean",
36485
+ "max-rows": "value"
36476
36486
  },
36477
36487
  positionals: {
36478
36488
  names: [],
@@ -36515,7 +36525,9 @@ var awx_axi_default = {
36515
36525
  search: "value",
36516
36526
  template: "value",
36517
36527
  status: "value",
36518
- limit: "value"
36528
+ limit: "value",
36529
+ all: "boolean",
36530
+ "max-rows": "value"
36519
36531
  },
36520
36532
  positionals: {
36521
36533
  names: [],
@@ -36543,7 +36555,9 @@ var awx_axi_default = {
36543
36555
  failed: "boolean",
36544
36556
  host: "value",
36545
36557
  task: "value",
36546
- limit: "value"
36558
+ limit: "value",
36559
+ all: "boolean",
36560
+ "max-rows": "value"
36547
36561
  },
36548
36562
  positionals: {
36549
36563
  names: [
@@ -36557,7 +36571,9 @@ var awx_axi_default = {
36557
36571
  effect: "read",
36558
36572
  flags: {
36559
36573
  help: "boolean",
36560
- limit: "value"
36574
+ limit: "value",
36575
+ all: "boolean",
36576
+ "max-rows": "value"
36561
36577
  },
36562
36578
  positionals: {
36563
36579
  names: [
@@ -36571,7 +36587,9 @@ var awx_axi_default = {
36571
36587
  effect: "read",
36572
36588
  flags: {
36573
36589
  help: "boolean",
36574
- limit: "value"
36590
+ limit: "value",
36591
+ all: "boolean",
36592
+ "max-rows": "value"
36575
36593
  },
36576
36594
  positionals: {
36577
36595
  names: [
@@ -36658,7 +36676,9 @@ var awx_axi_default = {
36658
36676
  help: "boolean",
36659
36677
  search: "value",
36660
36678
  organization: "value",
36661
- limit: "value"
36679
+ limit: "value",
36680
+ all: "boolean",
36681
+ "max-rows": "value"
36662
36682
  },
36663
36683
  positionals: {
36664
36684
  names: [],
@@ -36684,7 +36704,9 @@ var awx_axi_default = {
36684
36704
  flags: {
36685
36705
  help: "boolean",
36686
36706
  "include-decided": "boolean",
36687
- limit: "value"
36707
+ limit: "value",
36708
+ all: "boolean",
36709
+ "max-rows": "value"
36688
36710
  },
36689
36711
  positionals: {
36690
36712
  names: [],
@@ -36766,7 +36788,9 @@ var awx_axi_default = {
36766
36788
  flags: {
36767
36789
  help: "boolean",
36768
36790
  search: "value",
36769
- limit: "value"
36791
+ limit: "value",
36792
+ all: "boolean",
36793
+ "max-rows": "value"
36770
36794
  },
36771
36795
  positionals: {
36772
36796
  names: [],
@@ -36793,7 +36817,9 @@ var awx_axi_default = {
36793
36817
  help: "boolean",
36794
36818
  host: "value",
36795
36819
  task: "value",
36796
- limit: "value"
36820
+ limit: "value",
36821
+ all: "boolean",
36822
+ "max-rows": "value"
36797
36823
  },
36798
36824
  positionals: {
36799
36825
  names: [
@@ -36932,7 +36958,9 @@ var awx_axi_default = {
36932
36958
  flags: {
36933
36959
  help: "boolean",
36934
36960
  search: "value",
36935
- limit: "value"
36961
+ limit: "value",
36962
+ all: "boolean",
36963
+ "max-rows": "value"
36936
36964
  },
36937
36965
  positionals: {
36938
36966
  names: [],
@@ -36970,7 +36998,9 @@ var awx_axi_default = {
36970
36998
  effect: "read",
36971
36999
  flags: {
36972
37000
  help: "boolean",
36973
- limit: "value"
37001
+ limit: "value",
37002
+ all: "boolean",
37003
+ "max-rows": "value"
36974
37004
  },
36975
37005
  positionals: {
36976
37006
  names: [
@@ -36983,7 +37013,10 @@ var awx_axi_default = {
36983
37013
  command: "project roles",
36984
37014
  effect: "read",
36985
37015
  flags: {
36986
- help: "boolean"
37016
+ help: "boolean",
37017
+ limit: "value",
37018
+ all: "boolean",
37019
+ "max-rows": "value"
36987
37020
  },
36988
37021
  positionals: {
36989
37022
  names: [
@@ -37415,7 +37448,9 @@ var awx_axi_default = {
37415
37448
  flags: {
37416
37449
  help: "boolean",
37417
37450
  search: "value",
37418
- limit: "value"
37451
+ limit: "value",
37452
+ all: "boolean",
37453
+ "max-rows": "value"
37419
37454
  },
37420
37455
  positionals: {
37421
37456
  names: [],
@@ -37441,7 +37476,9 @@ var awx_axi_default = {
37441
37476
  flags: {
37442
37477
  help: "boolean",
37443
37478
  search: "value",
37444
- limit: "value"
37479
+ limit: "value",
37480
+ all: "boolean",
37481
+ "max-rows": "value"
37445
37482
  },
37446
37483
  positionals: {
37447
37484
  names: [
@@ -37457,6 +37494,8 @@ var awx_axi_default = {
37457
37494
  help: "boolean",
37458
37495
  search: "value",
37459
37496
  limit: "value",
37497
+ all: "boolean",
37498
+ "max-rows": "value",
37460
37499
  facts: "boolean"
37461
37500
  },
37462
37501
  positionals: {
@@ -37472,7 +37511,9 @@ var awx_axi_default = {
37472
37511
  flags: {
37473
37512
  help: "boolean",
37474
37513
  search: "value",
37475
- limit: "value"
37514
+ limit: "value",
37515
+ all: "boolean",
37516
+ "max-rows": "value"
37476
37517
  },
37477
37518
  positionals: {
37478
37519
  names: [
@@ -37503,7 +37544,9 @@ var awx_axi_default = {
37503
37544
  flags: {
37504
37545
  help: "boolean",
37505
37546
  search: "value",
37506
- limit: "value"
37547
+ limit: "value",
37548
+ all: "boolean",
37549
+ "max-rows": "value"
37507
37550
  },
37508
37551
  positionals: {
37509
37552
  names: [],
@@ -37531,7 +37574,9 @@ var awx_axi_default = {
37531
37574
  search: "value",
37532
37575
  name: "value",
37533
37576
  inventory: "value",
37534
- limit: "value"
37577
+ limit: "value",
37578
+ all: "boolean",
37579
+ "max-rows": "value"
37535
37580
  },
37536
37581
  positionals: {
37537
37582
  names: [],
@@ -37559,7 +37604,9 @@ var awx_axi_default = {
37559
37604
  search: "value",
37560
37605
  name: "value",
37561
37606
  inventory: "value",
37562
- limit: "value"
37607
+ limit: "value",
37608
+ all: "boolean",
37609
+ "max-rows": "value"
37563
37610
  },
37564
37611
  positionals: {
37565
37612
  names: [],
@@ -37589,7 +37636,9 @@ var awx_axi_default = {
37589
37636
  inventory: "value",
37590
37637
  source: "value",
37591
37638
  status: "value",
37592
- limit: "value"
37639
+ limit: "value",
37640
+ all: "boolean",
37641
+ "max-rows": "value"
37593
37642
  },
37594
37643
  positionals: {
37595
37644
  names: [],
@@ -37781,7 +37830,9 @@ var awx_axi_default = {
37781
37830
  template: "value",
37782
37831
  enabled: "boolean",
37783
37832
  disabled: "boolean",
37784
- limit: "value"
37833
+ limit: "value",
37834
+ all: "boolean",
37835
+ "max-rows": "value"
37785
37836
  },
37786
37837
  positionals: {
37787
37838
  names: [],
@@ -37882,7 +37933,9 @@ var awx_axi_default = {
37882
37933
  search: "value",
37883
37934
  organization: "value",
37884
37935
  type: "value",
37885
- limit: "value"
37936
+ limit: "value",
37937
+ all: "boolean",
37938
+ "max-rows": "value"
37886
37939
  },
37887
37940
  positionals: {
37888
37941
  names: [],
@@ -38000,7 +38053,9 @@ var awx_axi_default = {
38000
38053
  flags: {
38001
38054
  help: "boolean",
38002
38055
  search: "value",
38003
- limit: "value"
38056
+ limit: "value",
38057
+ all: "boolean",
38058
+ "max-rows": "value"
38004
38059
  },
38005
38060
  positionals: {
38006
38061
  names: [],
@@ -38034,7 +38089,9 @@ var awx_axi_default = {
38034
38089
  "inventory-update": "value",
38035
38090
  "ad-hoc": "value",
38036
38091
  "system-job": "value",
38037
- limit: "value"
38092
+ limit: "value",
38093
+ all: "boolean",
38094
+ "max-rows": "value"
38038
38095
  },
38039
38096
  positionals: {
38040
38097
  names: [],
@@ -38152,7 +38209,9 @@ var awx_axi_default = {
38152
38209
  search: "value",
38153
38210
  type: "value",
38154
38211
  organization: "value",
38155
- limit: "value"
38212
+ limit: "value",
38213
+ all: "boolean",
38214
+ "max-rows": "value"
38156
38215
  },
38157
38216
  positionals: {
38158
38217
  names: [],
@@ -38189,7 +38248,9 @@ var awx_axi_default = {
38189
38248
  team: "value",
38190
38249
  user: "value",
38191
38250
  credential: "value",
38192
- limit: "value"
38251
+ limit: "value",
38252
+ all: "boolean",
38253
+ "max-rows": "value"
38193
38254
  },
38194
38255
  positionals: {
38195
38256
  names: [],
@@ -38317,7 +38378,9 @@ var awx_axi_default = {
38317
38378
  help: "boolean",
38318
38379
  search: "value",
38319
38380
  organization: "value",
38320
- limit: "value"
38381
+ limit: "value",
38382
+ all: "boolean",
38383
+ "max-rows": "value"
38321
38384
  },
38322
38385
  positionals: {
38323
38386
  names: [],
@@ -38342,7 +38405,9 @@ var awx_axi_default = {
38342
38405
  effect: "read",
38343
38406
  flags: {
38344
38407
  help: "boolean",
38345
- limit: "value"
38408
+ limit: "value",
38409
+ all: "boolean",
38410
+ "max-rows": "value"
38346
38411
  },
38347
38412
  positionals: {
38348
38413
  names: [
@@ -38356,7 +38421,9 @@ var awx_axi_default = {
38356
38421
  effect: "read",
38357
38422
  flags: {
38358
38423
  help: "boolean",
38359
- limit: "value"
38424
+ limit: "value",
38425
+ all: "boolean",
38426
+ "max-rows": "value"
38360
38427
  },
38361
38428
  positionals: {
38362
38429
  names: [
@@ -38370,7 +38437,9 @@ var awx_axi_default = {
38370
38437
  effect: "read",
38371
38438
  flags: {
38372
38439
  help: "boolean",
38373
- limit: "value"
38440
+ limit: "value",
38441
+ all: "boolean",
38442
+ "max-rows": "value"
38374
38443
  },
38375
38444
  positionals: {
38376
38445
  names: [
@@ -38384,7 +38453,9 @@ var awx_axi_default = {
38384
38453
  effect: "read",
38385
38454
  flags: {
38386
38455
  help: "boolean",
38387
- limit: "value"
38456
+ limit: "value",
38457
+ all: "boolean",
38458
+ "max-rows": "value"
38388
38459
  },
38389
38460
  positionals: {
38390
38461
  names: [
@@ -38398,7 +38469,9 @@ var awx_axi_default = {
38398
38469
  effect: "read",
38399
38470
  flags: {
38400
38471
  help: "boolean",
38401
- limit: "value"
38472
+ limit: "value",
38473
+ all: "boolean",
38474
+ "max-rows": "value"
38402
38475
  },
38403
38476
  positionals: {
38404
38477
  names: [
@@ -38412,7 +38485,9 @@ var awx_axi_default = {
38412
38485
  effect: "read",
38413
38486
  flags: {
38414
38487
  help: "boolean",
38415
- limit: "value"
38488
+ limit: "value",
38489
+ all: "boolean",
38490
+ "max-rows": "value"
38416
38491
  },
38417
38492
  positionals: {
38418
38493
  names: [
@@ -38462,7 +38537,9 @@ var awx_axi_default = {
38462
38537
  help: "boolean",
38463
38538
  search: "value",
38464
38539
  type: "value",
38465
- limit: "value"
38540
+ limit: "value",
38541
+ all: "boolean",
38542
+ "max-rows": "value"
38466
38543
  },
38467
38544
  positionals: {
38468
38545
  names: [],
@@ -38487,7 +38564,9 @@ var awx_axi_default = {
38487
38564
  effect: "read",
38488
38565
  flags: {
38489
38566
  help: "boolean",
38490
- limit: "value"
38567
+ limit: "value",
38568
+ all: "boolean",
38569
+ "max-rows": "value"
38491
38570
  },
38492
38571
  positionals: {
38493
38572
  names: [
@@ -38501,7 +38580,9 @@ var awx_axi_default = {
38501
38580
  effect: "read",
38502
38581
  flags: {
38503
38582
  help: "boolean",
38504
- limit: "value"
38583
+ limit: "value",
38584
+ all: "boolean",
38585
+ "max-rows": "value"
38505
38586
  },
38506
38587
  positionals: {
38507
38588
  names: [
@@ -38515,7 +38596,9 @@ var awx_axi_default = {
38515
38596
  effect: "read",
38516
38597
  flags: {
38517
38598
  help: "boolean",
38518
- limit: "value"
38599
+ limit: "value",
38600
+ all: "boolean",
38601
+ "max-rows": "value"
38519
38602
  },
38520
38603
  positionals: {
38521
38604
  names: [
@@ -38529,7 +38612,9 @@ var awx_axi_default = {
38529
38612
  effect: "read",
38530
38613
  flags: {
38531
38614
  help: "boolean",
38532
- limit: "value"
38615
+ limit: "value",
38616
+ all: "boolean",
38617
+ "max-rows": "value"
38533
38618
  },
38534
38619
  positionals: {
38535
38620
  names: [
@@ -38640,8 +38725,1210 @@ var awx_axi_default = {
38640
38725
  ]
38641
38726
  };
38642
38727
 
38728
+ // tools/inventories/tenable-axi.json
38729
+ var tenable_axi_default = {
38730
+ generatedBy: "scripts/tenable-inventory.mjs",
38731
+ tool: "tenable-axi",
38732
+ version: "0.1.1",
38733
+ integrity: "sha512-ukWwVny4DeEBLqqWJhaM0au4Z5dvQTsDKoE2NhROIE3p114WUz2tT5dOfWL8MaalVrmU/zSMhk+S29sUocR3xg==",
38734
+ parserEvidence: "Published command catalogue, mutation registry and reviewed native parsers and transport gates",
38735
+ sources: [
38736
+ {
38737
+ path: "dist/src/attack-catalogue.js",
38738
+ sha256: "022f9d46c0e0a76b62ed528b17552fccae9634208698e541146f8af2f6107316"
38739
+ },
38740
+ {
38741
+ path: "dist/src/attack-export-catalogue.js",
38742
+ sha256: "7127a33fdbb01db34886b2c91b36bdc174131819b5753c1201c56999389584ee"
38743
+ },
38744
+ {
38745
+ path: "dist/src/attack-export.js",
38746
+ sha256: "38adf6d13ab1afe4f8d0123803257c2f10a1c47b9a7f9b216ee9107ea30368c8"
38747
+ },
38748
+ {
38749
+ path: "dist/src/attack.js",
38750
+ sha256: "76905fe54d1038ffbaa6b4a82b4cb4fadb6473462d28679319a98ab7cdd08650"
38751
+ },
38752
+ {
38753
+ path: "dist/src/catalogue.js",
38754
+ sha256: "d05c8dfebce3219c2ee0a305888fa336e62db5fc3b3b4bc95a27c0588943587b"
38755
+ },
38756
+ {
38757
+ path: "dist/src/cli.js",
38758
+ sha256: "df6dfee98019af2da15ac7a3c4d1ea7b3860c73021cbf2f08ac52386a64f441c"
38759
+ },
38760
+ {
38761
+ path: "dist/src/export-file.js",
38762
+ sha256: "2eb4f73e2d9a3361283a62e887c6cf95de70d5d3f353441bcd4de738377d57df"
38763
+ },
38764
+ {
38765
+ path: "dist/src/exposure-contracts.js",
38766
+ sha256: "febe68635d243ce801607d76af753d21f2ff30712c0efe9c3a2805209cc4b915"
38767
+ },
38768
+ {
38769
+ path: "dist/src/exposure.js",
38770
+ sha256: "5e93b01dc54368627f1f7c1ac4a96579af2f4beae7c2b10189ba190cf5cc9af6"
38771
+ },
38772
+ {
38773
+ path: "dist/src/hook-install.js",
38774
+ sha256: "74fce246ea8fd1ee83bc89f06ab71b3bbf10b2b6ebce0701d24c95eae7755668"
38775
+ },
38776
+ {
38777
+ path: "dist/src/inventory-catalogue.js",
38778
+ sha256: "ccd42834a43aabffbd90e7326926660e9cff788997ab836cb2eb858fc36f1119"
38779
+ },
38780
+ {
38781
+ path: "dist/src/inventory-export-catalogue.js",
38782
+ sha256: "cf07efc8540e83fcda3f79df4a5ec6c75e081e1557a52e6e178a24ee7d393905"
38783
+ },
38784
+ {
38785
+ path: "dist/src/inventory-export.js",
38786
+ sha256: "176bd2aef67901383e29f5984867d104fdb8278a40d13d1281aa459ea44a8f9c"
38787
+ },
38788
+ {
38789
+ path: "dist/src/inventory.js",
38790
+ sha256: "83bd3b19b1ad54785fdf107b57a66ffc882141706337bb886108b67f75565bb1"
38791
+ },
38792
+ {
38793
+ path: "dist/src/inventory/schema.js",
38794
+ sha256: "1dc7cf0f1fb0e07dcf79bcac7e41450e1394345fc4fcd410119ab639064926af"
38795
+ },
38796
+ {
38797
+ path: "dist/src/local-commands.js",
38798
+ sha256: "4bb2769049b72126c47857f850b3cd008a371f952c479e0b288d5279d7aaa77a"
38799
+ },
38800
+ {
38801
+ path: "dist/src/platform-tag-catalogue.js",
38802
+ sha256: "9efb6f39618f2508e7e3cf58e1f50ce0c994351d5e8d69463c8caad8ecf020d7"
38803
+ },
38804
+ {
38805
+ path: "dist/src/platform-tag.js",
38806
+ sha256: "89933fd5ed557037afab537d147348cad8131684cd8422f20ee4fb5846707a18"
38807
+ },
38808
+ {
38809
+ path: "dist/src/private-file.js",
38810
+ sha256: "a5f01182fe09394ecf508deb46d54c9fb0b39c9fd205094d155ace212bbd1c8b"
38811
+ },
38812
+ {
38813
+ path: "dist/src/profiles.js",
38814
+ sha256: "12defbf234e4da8584e1f6ba601eb3826733ff85c76445197b0162ac52299b4a"
38815
+ },
38816
+ {
38817
+ path: "dist/src/redact.js",
38818
+ sha256: "e88631746e63a7fc08f206b58ddf3754ecea6f0ec21011c37ded0114dfbb6830"
38819
+ },
38820
+ {
38821
+ path: "dist/src/response-catalogue.js",
38822
+ sha256: "6f0eb3f6ba860e59e7bfd764a0d3932b52101e4013acea4ee5aa63081a1f83db"
38823
+ },
38824
+ {
38825
+ path: "dist/src/response.js",
38826
+ sha256: "44277f2a0c28b3e6801c47578603270ed59c76aac5214c6428fd2dbf8a83f1d4"
38827
+ },
38828
+ {
38829
+ path: "dist/src/setup.js",
38830
+ sha256: "2e9c8430b4fbf0f95e0e31267ba828107fd054e9d525a5c970f7c9c2e20d5348"
38831
+ },
38832
+ {
38833
+ path: "dist/src/transport-core.js",
38834
+ sha256: "3419fbee2b091109495216c4da4f68fdaa1779449f9eee29a9ec429b0d306195"
38835
+ },
38836
+ {
38837
+ path: "dist/src/transport.js",
38838
+ sha256: "c3639f96d71c80217da15fe7449b586ee797c94e9f4f6b3f22d0472613d28ee1"
38839
+ },
38840
+ {
38841
+ path: "dist/src/writes-core.js",
38842
+ sha256: "55a76961512751653c8d14778b6b74094318ba1527b50dedf2167127f1e7c1f9"
38843
+ },
38844
+ {
38845
+ path: "dist/src/writes.js",
38846
+ sha256: "43099c373b451991102515f0f583c9a7678edb89a5b6bc9ad7e261a1c1f4a5dd"
38847
+ }
38848
+ ],
38849
+ credentialSchema: {
38850
+ $schema: "https://json-schema.org/draft/2020-12/schema",
38851
+ $id: "https://github.com/knowttl/tenable-axi/axi-credential.schema.json",
38852
+ title: "Tenable AXI credential profile",
38853
+ type: "object",
38854
+ additionalProperties: false,
38855
+ properties: {
38856
+ origin: {
38857
+ const: "https://cloud.tenable.com",
38858
+ default: "https://cloud.tenable.com"
38859
+ },
38860
+ accessKey: {
38861
+ $ref: "#/$defs/secretRef",
38862
+ "x-secret": true,
38863
+ default: {
38864
+ env: "TENABLE_AXI_ACCESS_KEY"
38865
+ }
38866
+ },
38867
+ secretKey: {
38868
+ $ref: "#/$defs/secretRef",
38869
+ "x-secret": true,
38870
+ default: {
38871
+ env: "TENABLE_AXI_SECRET_KEY"
38872
+ }
38873
+ },
38874
+ writes: {
38875
+ type: "object",
38876
+ additionalProperties: false,
38877
+ required: [
38878
+ "allowWrites",
38879
+ "operations"
38880
+ ],
38881
+ default: {
38882
+ allowWrites: false,
38883
+ operations: []
38884
+ },
38885
+ properties: {
38886
+ allowWrites: {
38887
+ type: "boolean"
38888
+ },
38889
+ operations: {
38890
+ type: "array",
38891
+ items: {
38892
+ type: "string",
38893
+ pattern: "^[A-Za-z0-9][A-Za-z0-9_-]*$"
38894
+ }
38895
+ }
38896
+ }
38897
+ }
38898
+ },
38899
+ $defs: {
38900
+ secretRef: {
38901
+ oneOf: [
38902
+ {
38903
+ type: "object",
38904
+ additionalProperties: false,
38905
+ required: [
38906
+ "env"
38907
+ ],
38908
+ properties: {
38909
+ env: {
38910
+ type: "string",
38911
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
38912
+ }
38913
+ }
38914
+ },
38915
+ {
38916
+ type: "object",
38917
+ additionalProperties: false,
38918
+ required: [
38919
+ "file"
38920
+ ],
38921
+ properties: {
38922
+ file: {
38923
+ type: "string",
38924
+ pattern: "^(?:/|[A-Za-z]:[\\\\/])"
38925
+ }
38926
+ }
38927
+ }
38928
+ ]
38929
+ }
38930
+ }
38931
+ },
38932
+ skillSha256: "ea35fe90d39fee3982f731ccc3c717c92aabd0799ff2371f6f3cc5e12d7aea9a",
38933
+ nativeWriteSettings: {
38934
+ supportedOperations: [
38935
+ "apa-export-attack-path",
38936
+ "apa-export-attack-technique",
38937
+ "apa-export-mitre-heatmap",
38938
+ "combinations-create",
38939
+ "combinations-delete",
38940
+ "combinations-update",
38941
+ "initiatives-create",
38942
+ "initiatives-delete",
38943
+ "initiatives-update",
38944
+ "inventory-export-assets",
38945
+ "inventory-export-findings",
38946
+ "tags-assign-asset-tags",
38947
+ "tags-create-tag-category",
38948
+ "tags-create-tag-value",
38949
+ "tags-delete-tag-category",
38950
+ "tags-delete-tag-value",
38951
+ "tags-delete-tag-values-bulk",
38952
+ "tags-edit-tag-category",
38953
+ "tags-update-tag-value"
38954
+ ]
38955
+ },
38956
+ adapterBoundary: {
38957
+ unsafeOverrides: [
38958
+ "config",
38959
+ "profile",
38960
+ "origin",
38961
+ "output"
38962
+ ],
38963
+ inputFileFlags: [
38964
+ "filter-file",
38965
+ "body-file",
38966
+ "ids-file",
38967
+ "asset-ids-file",
38968
+ "tag-ids-file"
38969
+ ],
38970
+ blockedCommands: [
38971
+ "setup hooks",
38972
+ "config path",
38973
+ "profile list",
38974
+ "hook",
38975
+ "export attack download",
38976
+ "export inventory download"
38977
+ ],
38978
+ inputs: {
38979
+ stdin: "explicit file flag with - only",
38980
+ files: "uploaded leaves only",
38981
+ downloads: "unsupported"
38982
+ },
38983
+ nativeWrites: "native preview, operation allow-list, execute, exact confirm and durable journal"
38984
+ },
38985
+ discovery: {
38986
+ commands: [
38987
+ "asset",
38988
+ "attack-path",
38989
+ "attack-technique",
38990
+ "auth",
38991
+ "card",
38992
+ "combination",
38993
+ "connector",
38994
+ "doctor",
38995
+ "export",
38996
+ "finding",
38997
+ "home",
38998
+ "initiative",
38999
+ "software",
39000
+ "tag"
39001
+ ],
39002
+ example: [
39003
+ "card",
39004
+ "list",
39005
+ "--limit",
39006
+ "1"
39007
+ ],
39008
+ help: "tenable-axi card list [--limit <n>]\nArtium manages both API keys and the fixed https://cloud.tenable.com origin. Writes and export-job creation require administrator-enabled operations, preview, --execute and exact --confirm. File inputs accept uploaded leaves or explicit stdin (-). Downloads and local configuration are blocked.\n"
39009
+ },
39010
+ suggestionFields: [
39011
+ "help"
39012
+ ],
39013
+ format: "TOON",
39014
+ commands: [
39015
+ {
39016
+ command: "asset list",
39017
+ effect: "read",
39018
+ flags: {
39019
+ config: "Config path; default credential precedence",
39020
+ profile: "Profile name; default credential precedence",
39021
+ fields: "Comma-separated display or wire properties; default compact view",
39022
+ full: "Show full text; default false",
39023
+ help: "Show help",
39024
+ limit: "Maximum emitted rows, 1-10000; default 100",
39025
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39026
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39027
+ query: "Simple query text",
39028
+ filter: "Repeatable: <property> <operator> <JSON string array>",
39029
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
39030
+ sort: "Wire property:asc|desc",
39031
+ "extra-properties": "Comma-separated extra wire properties",
39032
+ offset: "Starting record; default 0; excludes --cursor",
39033
+ class: "Server-side asset class filter"
39034
+ }
39035
+ },
39036
+ {
39037
+ command: "asset properties",
39038
+ effect: "read",
39039
+ flags: {
39040
+ config: "Config path; default credential precedence",
39041
+ profile: "Profile name; default credential precedence",
39042
+ fields: "Comma-separated display or wire properties; default compact view",
39043
+ full: "Show full text; default false",
39044
+ help: "Show help",
39045
+ limit: "Maximum emitted rows, 1-10000; default 100",
39046
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39047
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39048
+ "asset-classes": "Comma-separated documented asset classes"
39049
+ }
39050
+ },
39051
+ {
39052
+ command: "asset show",
39053
+ effect: "read",
39054
+ flags: {
39055
+ config: "Config path; default credential precedence",
39056
+ profile: "Profile name; default credential precedence",
39057
+ fields: "Comma-separated display or wire properties; default compact view",
39058
+ full: "Show full text; default false",
39059
+ help: "Show help",
39060
+ id: "Required exact inventory ID",
39061
+ "extra-properties": "Comma-separated extra wire properties"
39062
+ }
39063
+ },
39064
+ {
39065
+ command: "attack-path list",
39066
+ effect: "read",
39067
+ flags: {
39068
+ config: "Config path; default credential precedence",
39069
+ profile: "Profile name; default credential precedence",
39070
+ fields: "Comma-separated display or wire fields; default compact view",
39071
+ full: "Show full text; default false",
39072
+ help: "Show help",
39073
+ limit: "Maximum emitted rows, 1-10000; default 100",
39074
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39075
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
39076
+ offset: "Starting record; default 0; excludes --cursor",
39077
+ sort: "Documented wire property:direction",
39078
+ filter: "Repeatable: <property> <operator> <JSON-value>; combines with AND (paths) or and (techniques)",
39079
+ "filter-file": "Documented single or nested JSON filter, at most two logical levels; '-' reads stdin; excludes --filter",
39080
+ "include-resolved": "Include resolved records; default false (exclude_resolved=true)",
39081
+ "run-ai-summarization": "true|false; default false"
39082
+ }
39083
+ },
39084
+ {
39085
+ command: "attack-technique list",
39086
+ effect: "read",
39087
+ flags: {
39088
+ config: "Config path; default credential precedence",
39089
+ profile: "Profile name; default credential precedence",
39090
+ fields: "Comma-separated display or wire fields; default compact view",
39091
+ full: "Show full text; default false",
39092
+ help: "Show help",
39093
+ limit: "Maximum emitted rows, 1-10000; default 100",
39094
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39095
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
39096
+ offset: "Starting record; default 0; excludes --cursor",
39097
+ sort: "Documented wire property:direction",
39098
+ filter: "Repeatable: <property> <operator> <JSON-value>; combines with AND (paths) or and (techniques)",
39099
+ "filter-file": "Documented single or nested JSON filter, at most two logical levels; '-' reads stdin; excludes --filter",
39100
+ "include-resolved": "Include resolved records; default false (exclude_resolved=true)"
39101
+ }
39102
+ },
39103
+ {
39104
+ command: "auth status",
39105
+ effect: "read",
39106
+ flags: {
39107
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39108
+ profile: "Profile name; default credential precedence",
39109
+ fields: "Comma-separated output fields; default all",
39110
+ full: "Show full text; default false",
39111
+ help: "Show help; default false"
39112
+ }
39113
+ },
39114
+ {
39115
+ command: "card list",
39116
+ effect: "read",
39117
+ flags: {
39118
+ config: "Config path; default platform path",
39119
+ profile: "Profile name; default credential precedence",
39120
+ fields: "Comma-separated output fields; default compact projection",
39121
+ full: "Full text; default false",
39122
+ help: "Show help; default false",
39123
+ limit: "Output rows; default 100",
39124
+ offset: "Starting record; default 0",
39125
+ cursor: "Resume the same scoped collection",
39126
+ all: "Read up to 10000 rows; incompatible with --limit",
39127
+ global: "true or false; default all cards",
39128
+ query: "Card name search",
39129
+ "sorting-order": "asc or desc; default API order"
39130
+ }
39131
+ },
39132
+ {
39133
+ command: "card show",
39134
+ effect: "read",
39135
+ flags: {
39136
+ config: "Config path; default platform path",
39137
+ profile: "Profile name; default credential precedence",
39138
+ fields: "Comma-separated output fields; default compact projection",
39139
+ full: "Full text; default false",
39140
+ help: "Show help; default false",
39141
+ id: "Required card ID",
39142
+ "trend-start-date": "UTC ISO timestamp",
39143
+ "trend-end-date": "UTC ISO timestamp",
39144
+ "sla-efficiency-start-date": "UTC ISO timestamp",
39145
+ "sla-efficiency-end-date": "UTC ISO timestamp",
39146
+ "sla-breakdown-filter": "ANY, REMEDIATED or NON_REMEDIATED; default ANY",
39147
+ "include-trend-events": "true or false; default false"
39148
+ }
39149
+ },
39150
+ {
39151
+ command: "combination create",
39152
+ effect: "write",
39153
+ flags: {
39154
+ config: "Config path; default credential precedence",
39155
+ profile: "Profile name; default credential precedence",
39156
+ fields: "Comma-separated fields; default compact view",
39157
+ full: "Full text; default false",
39158
+ help: "Show help",
39159
+ execute: "Send once; default preview",
39160
+ "dry-run": "Preview only; excludes --execute",
39161
+ confirm: "Exact preview confirmation; required to execute",
39162
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39163
+ }
39164
+ },
39165
+ {
39166
+ command: "combination delete",
39167
+ effect: "write",
39168
+ flags: {
39169
+ config: "Config path; default credential precedence",
39170
+ profile: "Profile name; default credential precedence",
39171
+ fields: "Comma-separated fields; default compact view",
39172
+ full: "Full text; default false",
39173
+ help: "Show help",
39174
+ id: "Required exact UUID",
39175
+ execute: "Send once; default preview",
39176
+ "dry-run": "Preview only; excludes --execute",
39177
+ confirm: "Exact preview confirmation; required to execute"
39178
+ }
39179
+ },
39180
+ {
39181
+ command: "combination filters",
39182
+ effect: "read",
39183
+ flags: {
39184
+ config: "Config path; default credential precedence",
39185
+ profile: "Profile name; default credential precedence",
39186
+ fields: "Comma-separated fields; default compact view",
39187
+ full: "Full text; default false",
39188
+ help: "Show help",
39189
+ limit: "Output rows; default 100, maximum 10000",
39190
+ all: "Up to 10000 rows; excludes --limit",
39191
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors"
39192
+ }
39193
+ },
39194
+ {
39195
+ command: "combination list",
39196
+ effect: "read",
39197
+ flags: {
39198
+ config: "Config path; default credential precedence",
39199
+ profile: "Profile name; default credential precedence",
39200
+ fields: "Comma-separated fields; default compact view",
39201
+ full: "Full text; default false",
39202
+ help: "Show help",
39203
+ limit: "Output rows; default 100, maximum 10000",
39204
+ all: "Up to 10000 rows; excludes --limit",
39205
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors",
39206
+ type: "private, shared or tenable; default all accessible"
39207
+ }
39208
+ },
39209
+ {
39210
+ command: "combination show",
39211
+ effect: "read",
39212
+ flags: {
39213
+ config: "Config path; default credential precedence",
39214
+ profile: "Profile name; default credential precedence",
39215
+ fields: "Comma-separated fields; default compact view",
39216
+ full: "Full text; default false",
39217
+ help: "Show help",
39218
+ id: "Required exact UUID"
39219
+ }
39220
+ },
39221
+ {
39222
+ command: "combination update",
39223
+ effect: "write",
39224
+ flags: {
39225
+ config: "Config path; default credential precedence",
39226
+ profile: "Profile name; default credential precedence",
39227
+ fields: "Comma-separated fields; default compact view",
39228
+ full: "Full text; default false",
39229
+ help: "Show help",
39230
+ id: "Required exact UUID",
39231
+ execute: "Send once; default preview",
39232
+ "dry-run": "Preview only; excludes --execute",
39233
+ confirm: "Exact preview confirmation; required to execute",
39234
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39235
+ }
39236
+ },
39237
+ {
39238
+ command: "config path",
39239
+ effect: "blocked",
39240
+ flags: {
39241
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39242
+ profile: "Common selector; paths are independent of profile",
39243
+ fields: "Comma-separated output fields; default all",
39244
+ full: "Show full text; default false",
39245
+ help: "Show help; default false"
39246
+ }
39247
+ },
39248
+ {
39249
+ command: "connector logs",
39250
+ effect: "read",
39251
+ flags: {
39252
+ config: "Config path; default credential precedence",
39253
+ profile: "Profile name; default credential precedence",
39254
+ fields: "Comma-separated display or wire fields; default compact view",
39255
+ full: "Show full text; default false",
39256
+ help: "Show help",
39257
+ limit: "Maximum emitted rows, 1-10000; default 100",
39258
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39259
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
39260
+ "connector-id": "Nonnegative numeric connector ID",
39261
+ status: "SUCCEEDED|FAILED",
39262
+ "start-date": "Inclusive YYYY-MM-DD; requires --end-date",
39263
+ "end-date": "Exclusive YYYY-MM-DD; requires --start-date"
39264
+ }
39265
+ },
39266
+ {
39267
+ command: "doctor",
39268
+ effect: "read",
39269
+ flags: {
39270
+ config: "Config path; default platform path",
39271
+ profile: "Profile name; default credential precedence",
39272
+ fields: "Comma-separated output fields; default compact projection",
39273
+ full: "Full text; default false",
39274
+ help: "Show help; default false"
39275
+ }
39276
+ },
39277
+ {
39278
+ command: "export asset jobs",
39279
+ effect: "read",
39280
+ flags: {
39281
+ config: "Config path; default platform path",
39282
+ profile: "Profile name; default credential precedence",
39283
+ fields: "Comma-separated output fields; default compact view",
39284
+ full: "Full output; default false",
39285
+ help: "Show help",
39286
+ status: "QUEUED|PROCESSING|FINISHED|ERROR",
39287
+ limit: "1-1000; default 100; last three days only"
39288
+ }
39289
+ },
39290
+ {
39291
+ command: "export asset start",
39292
+ effect: "write",
39293
+ flags: {
39294
+ config: "Config path; default platform path",
39295
+ profile: "Profile name; default credential precedence",
39296
+ fields: "Comma-separated output fields; default compact view",
39297
+ full: "Full output; default false",
39298
+ help: "Show help",
39299
+ "body-file": "Optional strict query/filters JSON file, '-' for stdin; maximum 1 MiB",
39300
+ properties: "Comma-separated names from asset properties; id maps to asset_id",
39301
+ "use-readable-name": "true|false; API default true",
39302
+ "max-chunk-file-size": "5242880-104857600 bytes; API default 20971520",
39303
+ sort: "property:asc|desc",
39304
+ "file-format": "JSON|CSV; API default JSON",
39305
+ compress: "true|false; API default false",
39306
+ execute: "Create once; default preview",
39307
+ "dry-run": "Explicit preview; excludes --execute",
39308
+ confirm: "Exact confirmation from preview",
39309
+ "intent-id": "Unique execution intent for replay protection"
39310
+ }
39311
+ },
39312
+ {
39313
+ command: "export attack download",
39314
+ effect: "blocked",
39315
+ flags: {
39316
+ config: "Config path; default credential precedence",
39317
+ profile: "Profile name; default credential precedence",
39318
+ fields: "Comma-separated metadata fields; default compact view",
39319
+ full: "Full metadata text; default false",
39320
+ help: "Show help",
39321
+ id: "Required attack export UUID",
39322
+ output: "Required new output file; overwrite refused"
39323
+ }
39324
+ },
39325
+ {
39326
+ command: "export attack status",
39327
+ effect: "read",
39328
+ flags: {
39329
+ config: "Config path; default credential precedence",
39330
+ profile: "Profile name; default credential precedence",
39331
+ fields: "Comma-separated metadata fields; default compact view",
39332
+ full: "Full metadata text; default false",
39333
+ help: "Show help",
39334
+ id: "Required attack export UUID",
39335
+ wait: "Poll once per second within 20-second/20-request budgets; default false"
39336
+ }
39337
+ },
39338
+ {
39339
+ command: "export attack-path start",
39340
+ effect: "write",
39341
+ flags: {
39342
+ config: "Config path; default credential precedence",
39343
+ profile: "Profile name; default credential precedence",
39344
+ fields: "Comma-separated metadata fields; default compact view",
39345
+ full: "Full metadata text; default false",
39346
+ help: "Show help",
39347
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39348
+ execute: "Create the previewed job once; default false",
39349
+ "dry-run": "Preview only; excludes --execute",
39350
+ confirm: "Exact confirmation string from preview; required with --execute"
39351
+ }
39352
+ },
39353
+ {
39354
+ command: "export attack-technique start",
39355
+ effect: "write",
39356
+ flags: {
39357
+ config: "Config path; default credential precedence",
39358
+ profile: "Profile name; default credential precedence",
39359
+ fields: "Comma-separated metadata fields; default compact view",
39360
+ full: "Full metadata text; default false",
39361
+ help: "Show help",
39362
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39363
+ execute: "Create the previewed job once; default false",
39364
+ "dry-run": "Preview only; excludes --execute",
39365
+ confirm: "Exact confirmation string from preview; required with --execute"
39366
+ }
39367
+ },
39368
+ {
39369
+ command: "export finding jobs",
39370
+ effect: "read",
39371
+ flags: {
39372
+ config: "Config path; default platform path",
39373
+ profile: "Profile name; default credential precedence",
39374
+ fields: "Comma-separated output fields; default compact view",
39375
+ full: "Full output; default false",
39376
+ help: "Show help",
39377
+ status: "QUEUED|PROCESSING|FINISHED|ERROR",
39378
+ limit: "1-1000; default 100; last three days only"
39379
+ }
39380
+ },
39381
+ {
39382
+ command: "export finding start",
39383
+ effect: "write",
39384
+ flags: {
39385
+ config: "Config path; default platform path",
39386
+ profile: "Profile name; default credential precedence",
39387
+ fields: "Comma-separated output fields; default compact view",
39388
+ full: "Full output; default false",
39389
+ help: "Show help",
39390
+ "body-file": "Optional strict query/filters JSON file, '-' for stdin; maximum 1 MiB",
39391
+ properties: "Comma-separated names from finding properties; id maps to finding_id",
39392
+ "use-readable-name": "true|false; API default true",
39393
+ "max-chunk-file-size": "5242880-104857600 bytes; API default 20971520",
39394
+ sort: "property:asc|desc",
39395
+ "file-format": "JSON|CSV; API default JSON",
39396
+ compress: "true|false; API default false",
39397
+ execute: "Create once; default preview",
39398
+ "dry-run": "Explicit preview; excludes --execute",
39399
+ confirm: "Exact confirmation from preview",
39400
+ "intent-id": "Unique execution intent for replay protection"
39401
+ }
39402
+ },
39403
+ {
39404
+ command: "export inventory download",
39405
+ effect: "blocked",
39406
+ flags: {
39407
+ config: "Config path; default platform path",
39408
+ profile: "Profile name; default credential precedence",
39409
+ fields: "Comma-separated output fields; default compact view",
39410
+ full: "Full output; default false",
39411
+ help: "Show help",
39412
+ id: "Required export UUID",
39413
+ chunk: "Required nonnegative chunk number from status",
39414
+ output: "Required new output file; refuses overwrite"
39415
+ }
39416
+ },
39417
+ {
39418
+ command: "export inventory status",
39419
+ effect: "read",
39420
+ flags: {
39421
+ config: "Config path; default platform path",
39422
+ profile: "Profile name; default credential precedence",
39423
+ fields: "Comma-separated output fields; default compact view",
39424
+ full: "Full output; default false",
39425
+ help: "Show help",
39426
+ id: "Required export UUID"
39427
+ }
39428
+ },
39429
+ {
39430
+ command: "export mitre-heatmap start",
39431
+ effect: "write",
39432
+ flags: {
39433
+ config: "Config path; default credential precedence",
39434
+ profile: "Profile name; default credential precedence",
39435
+ fields: "Comma-separated metadata fields; default compact view",
39436
+ full: "Full metadata text; default false",
39437
+ help: "Show help",
39438
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39439
+ execute: "Create the previewed job once; default false",
39440
+ "dry-run": "Preview only; excludes --execute",
39441
+ confirm: "Exact confirmation string from preview; required with --execute"
39442
+ }
39443
+ },
39444
+ {
39445
+ command: "finding list",
39446
+ effect: "read",
39447
+ flags: {
39448
+ config: "Config path; default credential precedence",
39449
+ profile: "Profile name; default credential precedence",
39450
+ fields: "Comma-separated display or wire properties; default compact view",
39451
+ full: "Show full text; default false",
39452
+ help: "Show help",
39453
+ limit: "Maximum emitted rows, 1-10000; default 100",
39454
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39455
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39456
+ query: "Simple query text",
39457
+ filter: "Repeatable: <property> <operator> <JSON string array>",
39458
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
39459
+ sort: "Wire property:asc|desc",
39460
+ "extra-properties": "Comma-separated extra wire properties",
39461
+ offset: "Starting record; default 0; excludes --cursor"
39462
+ }
39463
+ },
39464
+ {
39465
+ command: "finding properties",
39466
+ effect: "read",
39467
+ flags: {
39468
+ config: "Config path; default credential precedence",
39469
+ profile: "Profile name; default credential precedence",
39470
+ fields: "Comma-separated display or wire properties; default compact view",
39471
+ full: "Show full text; default false",
39472
+ help: "Show help",
39473
+ limit: "Maximum emitted rows, 1-10000; default 100",
39474
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39475
+ cursor: "Opaque resume cursor; retain the original selectors and filters"
39476
+ }
39477
+ },
39478
+ {
39479
+ command: "finding show",
39480
+ effect: "read",
39481
+ flags: {
39482
+ config: "Config path; default credential precedence",
39483
+ profile: "Profile name; default credential precedence",
39484
+ fields: "Comma-separated display or wire properties; default compact view",
39485
+ full: "Show full text; default false",
39486
+ help: "Show help",
39487
+ id: "Required exact inventory ID",
39488
+ "extra-properties": "Comma-separated extra wire properties"
39489
+ }
39490
+ },
39491
+ {
39492
+ command: "home",
39493
+ effect: "read",
39494
+ flags: {
39495
+ config: "Config path; default platform path",
39496
+ profile: "Profile name; default credential precedence",
39497
+ fields: "Card fields; default id,name,score",
39498
+ full: "Full text; default false",
39499
+ help: "Show help; default false"
39500
+ }
39501
+ },
39502
+ {
39503
+ command: "hook",
39504
+ effect: "blocked",
39505
+ flags: {
39506
+ config: "Config path; default platform path",
39507
+ profile: "Profile name; default credential precedence",
39508
+ fields: "Comma-separated output fields; default compact projection",
39509
+ full: "Full text; default false",
39510
+ help: "Show help; default false"
39511
+ }
39512
+ },
39513
+ {
39514
+ command: "initiative create",
39515
+ effect: "write",
39516
+ flags: {
39517
+ config: "Config path; default credential precedence",
39518
+ profile: "Profile name; default credential precedence",
39519
+ fields: "Comma-separated fields; default compact view",
39520
+ full: "Full text; default false",
39521
+ help: "Show help",
39522
+ execute: "Send once; default preview",
39523
+ "dry-run": "Preview only; excludes --execute",
39524
+ confirm: "Exact preview confirmation; required to execute",
39525
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39526
+ }
39527
+ },
39528
+ {
39529
+ command: "initiative delete",
39530
+ effect: "write",
39531
+ flags: {
39532
+ config: "Config path; default credential precedence",
39533
+ profile: "Profile name; default credential precedence",
39534
+ fields: "Comma-separated fields; default compact view",
39535
+ full: "Full text; default false",
39536
+ help: "Show help",
39537
+ id: "Required exact UUID",
39538
+ execute: "Send once; default preview",
39539
+ "dry-run": "Preview only; excludes --execute",
39540
+ confirm: "Exact preview confirmation; required to execute"
39541
+ }
39542
+ },
39543
+ {
39544
+ command: "initiative list",
39545
+ effect: "read",
39546
+ flags: {
39547
+ config: "Config path; default credential precedence",
39548
+ profile: "Profile name; default credential precedence",
39549
+ fields: "Comma-separated fields; default compact view",
39550
+ full: "Full text; default false",
39551
+ help: "Show help",
39552
+ limit: "Output rows; default 100, maximum 10000",
39553
+ all: "Up to 10000 rows; excludes --limit",
39554
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors"
39555
+ }
39556
+ },
39557
+ {
39558
+ command: "initiative show",
39559
+ effect: "read",
39560
+ flags: {
39561
+ config: "Config path; default credential precedence",
39562
+ profile: "Profile name; default credential precedence",
39563
+ fields: "Comma-separated fields; default compact view",
39564
+ full: "Full text; default false",
39565
+ help: "Show help",
39566
+ id: "Required exact UUID"
39567
+ }
39568
+ },
39569
+ {
39570
+ command: "initiative update",
39571
+ effect: "write",
39572
+ flags: {
39573
+ config: "Config path; default credential precedence",
39574
+ profile: "Profile name; default credential precedence",
39575
+ fields: "Comma-separated fields; default compact view",
39576
+ full: "Full text; default false",
39577
+ help: "Show help",
39578
+ id: "Required exact UUID",
39579
+ execute: "Send once; default preview",
39580
+ "dry-run": "Preview only; excludes --execute",
39581
+ confirm: "Exact preview confirmation; required to execute",
39582
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39583
+ }
39584
+ },
39585
+ {
39586
+ command: "profile list",
39587
+ effect: "blocked",
39588
+ flags: {
39589
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39590
+ profile: "Common selector; list still shows all profiles",
39591
+ fields: "Comma-separated output fields; default all",
39592
+ full: "Show full text; default false",
39593
+ help: "Show help; default false"
39594
+ }
39595
+ },
39596
+ {
39597
+ command: "setup hooks",
39598
+ effect: "blocked",
39599
+ flags: {
39600
+ scope: "user or project; default user; project targets the current directory",
39601
+ help: "Show help; default false"
39602
+ }
39603
+ },
39604
+ {
39605
+ command: "software list",
39606
+ effect: "read",
39607
+ flags: {
39608
+ config: "Config path; default credential precedence",
39609
+ profile: "Profile name; default credential precedence",
39610
+ fields: "Comma-separated display or wire properties; default compact view",
39611
+ full: "Show full text; default false",
39612
+ help: "Show help",
39613
+ limit: "Maximum emitted rows, 1-10000; default 100",
39614
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39615
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39616
+ query: "Simple query text",
39617
+ filter: "Repeatable: <property> <operator> <JSON string array>",
39618
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
39619
+ sort: "Wire property:asc|desc",
39620
+ "extra-properties": "Comma-separated extra wire properties",
39621
+ offset: "Starting record; default 0; excludes --cursor"
39622
+ }
39623
+ },
39624
+ {
39625
+ command: "software properties",
39626
+ effect: "read",
39627
+ flags: {
39628
+ config: "Config path; default credential precedence",
39629
+ profile: "Profile name; default credential precedence",
39630
+ fields: "Comma-separated display or wire properties; default compact view",
39631
+ full: "Show full text; default false",
39632
+ help: "Show help",
39633
+ limit: "Maximum emitted rows, 1-10000; default 100",
39634
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39635
+ cursor: "Opaque resume cursor; retain the original selectors and filters"
39636
+ }
39637
+ },
39638
+ {
39639
+ command: "tag asset-filter list",
39640
+ effect: "read",
39641
+ flags: {
39642
+ config: "Config path; default platform path",
39643
+ profile: "Profile name; default credential precedence",
39644
+ fields: "Comma-separated output fields; default compact view",
39645
+ full: "Full text; default false",
39646
+ help: "Show help",
39647
+ limit: "Output rows; default 100; maximum 10000",
39648
+ cursor: "Resume the same scoped collection",
39649
+ all: "Read at most 10000 rows; excludes --limit"
39650
+ }
39651
+ },
39652
+ {
39653
+ command: "tag assignment add",
39654
+ effect: "write",
39655
+ flags: {
39656
+ config: "Config path; default platform path",
39657
+ profile: "Profile name; default credential precedence",
39658
+ fields: "Comma-separated output fields; default compact view",
39659
+ full: "Full text; default false",
39660
+ help: "Show help",
39661
+ execute: "Execute once; default preview",
39662
+ "dry-run": "Explicit preview; excludes --execute",
39663
+ confirm: "Exact confirmation from preview",
39664
+ "intent-id": "Unique execution intent for replay protection",
39665
+ "asset-ids-file": "Required JSON asset UUID array; '-' for stdin",
39666
+ "tag-ids-file": "Required JSON tag UUID array; '-' for stdin"
39667
+ }
39668
+ },
39669
+ {
39670
+ command: "tag assignment list",
39671
+ effect: "read",
39672
+ flags: {
39673
+ config: "Config path; default platform path",
39674
+ profile: "Profile name; default credential precedence",
39675
+ fields: "Comma-separated output fields; default compact view",
39676
+ full: "Full text; default false",
39677
+ help: "Show help",
39678
+ "asset-id": "Required exact asset UUID",
39679
+ limit: "Output rows; default 100; maximum 10000",
39680
+ cursor: "Resume the same scoped collection",
39681
+ all: "Read at most 10000 rows; excludes --limit"
39682
+ }
39683
+ },
39684
+ {
39685
+ command: "tag assignment remove",
39686
+ effect: "write",
39687
+ flags: {
39688
+ config: "Config path; default platform path",
39689
+ profile: "Profile name; default credential precedence",
39690
+ fields: "Comma-separated output fields; default compact view",
39691
+ full: "Full text; default false",
39692
+ help: "Show help",
39693
+ execute: "Execute once; default preview",
39694
+ "dry-run": "Explicit preview; excludes --execute",
39695
+ confirm: "Exact confirmation from preview",
39696
+ "intent-id": "Unique execution intent for replay protection",
39697
+ "asset-ids-file": "Required JSON asset UUID array; '-' for stdin",
39698
+ "tag-ids-file": "Required JSON tag UUID array; '-' for stdin"
39699
+ }
39700
+ },
39701
+ {
39702
+ command: "tag category create",
39703
+ effect: "write",
39704
+ flags: {
39705
+ config: "Config path; default platform path",
39706
+ profile: "Profile name; default credential precedence",
39707
+ fields: "Comma-separated output fields; default compact view",
39708
+ full: "Full text; default false",
39709
+ help: "Show help",
39710
+ name: "Required category name, at most 127 characters, no colon",
39711
+ description: "Optional description, at most 3000 characters",
39712
+ execute: "Execute once; default preview",
39713
+ "dry-run": "Explicit preview; excludes --execute",
39714
+ confirm: "Exact confirmation from preview",
39715
+ "intent-id": "Unique execution intent for replay protection"
39716
+ }
39717
+ },
39718
+ {
39719
+ command: "tag category delete",
39720
+ effect: "write",
39721
+ flags: {
39722
+ config: "Config path; default platform path",
39723
+ profile: "Profile name; default credential precedence",
39724
+ fields: "Comma-separated output fields; default compact view",
39725
+ full: "Full text; default false",
39726
+ help: "Show help",
39727
+ id: "Required exact UUID",
39728
+ execute: "Execute once; default preview",
39729
+ "dry-run": "Explicit preview; excludes --execute",
39730
+ confirm: "Exact confirmation from preview",
39731
+ "intent-id": "Unique execution intent for replay protection"
39732
+ }
39733
+ },
39734
+ {
39735
+ command: "tag category list",
39736
+ effect: "read",
39737
+ flags: {
39738
+ config: "Config path; default platform path",
39739
+ profile: "Profile name; default credential precedence",
39740
+ fields: "Comma-separated output fields; default compact view",
39741
+ full: "Full text; default false",
39742
+ help: "Show help",
39743
+ limit: "Output rows; default 100; maximum 10000",
39744
+ offset: "Starting record; default 0",
39745
+ cursor: "Resume the same scoped collection",
39746
+ all: "Read at most 10000 rows; excludes --limit",
39747
+ filter: "Repeatable field:operator:value",
39748
+ "filter-type": "and|or; API default and",
39749
+ sort: "Comma-separated field:asc|desc"
39750
+ }
39751
+ },
39752
+ {
39753
+ command: "tag category show",
39754
+ effect: "read",
39755
+ flags: {
39756
+ config: "Config path; default platform path",
39757
+ profile: "Profile name; default credential precedence",
39758
+ fields: "Comma-separated output fields; default compact view",
39759
+ full: "Full text; default false",
39760
+ help: "Show help",
39761
+ id: "Required exact UUID"
39762
+ }
39763
+ },
39764
+ {
39765
+ command: "tag category update",
39766
+ effect: "write",
39767
+ flags: {
39768
+ config: "Config path; default platform path",
39769
+ profile: "Profile name; default credential precedence",
39770
+ fields: "Comma-separated output fields; default compact view",
39771
+ full: "Full text; default false",
39772
+ help: "Show help",
39773
+ id: "Required exact UUID",
39774
+ name: "Required category name, at most 127 characters, no colon",
39775
+ description: "Optional description, at most 3000 characters",
39776
+ execute: "Execute once; default preview",
39777
+ "dry-run": "Explicit preview; excludes --execute",
39778
+ confirm: "Exact confirmation from preview",
39779
+ "intent-id": "Unique execution intent for replay protection"
39780
+ }
39781
+ },
39782
+ {
39783
+ command: "tag exclusion list",
39784
+ effect: "read",
39785
+ flags: {
39786
+ config: "Config path; default platform path",
39787
+ profile: "Profile name; default credential precedence",
39788
+ fields: "Comma-separated output fields; default compact view",
39789
+ full: "Full text; default false",
39790
+ help: "Show help",
39791
+ limit: "Output rows; default 100; maximum 10000",
39792
+ offset: "Starting record; default 0",
39793
+ cursor: "Resume the same scoped collection",
39794
+ all: "Read at most 10000 rows; excludes --limit",
39795
+ "tag-id": "Required exact dynamic tag UUID",
39796
+ "target-type": "assets; API default assets"
39797
+ }
39798
+ },
39799
+ {
39800
+ command: "tag list",
39801
+ effect: "read",
39802
+ flags: {
39803
+ config: "Config path; default platform path",
39804
+ profile: "Profile name; default credential precedence",
39805
+ fields: "Comma-separated output fields; default compact projection",
39806
+ full: "Full text; default false",
39807
+ help: "Show help; default false",
39808
+ limit: "Output rows; default 100",
39809
+ offset: "Starting record; default 0",
39810
+ cursor: "Resume the same scoped collection",
39811
+ all: "Read up to 10000 rows; incompatible with --limit",
39812
+ query: "Simple text search",
39813
+ filter: "Repeatable: property operator JSON-array-of-strings",
39814
+ "filter-file": "Strict documented tag filter array; incompatible with --filter",
39815
+ sort: "property:asc or property:desc",
39816
+ "extra-properties": "Comma-separated property names"
39817
+ }
39818
+ },
39819
+ {
39820
+ command: "tag properties",
39821
+ effect: "read",
39822
+ flags: {
39823
+ config: "Config path; default platform path",
39824
+ profile: "Profile name; default credential precedence",
39825
+ fields: "Comma-separated output fields; default compact projection",
39826
+ full: "Full text; default false",
39827
+ help: "Show help; default false"
39828
+ }
39829
+ },
39830
+ {
39831
+ command: "tag value bulk-delete",
39832
+ effect: "write",
39833
+ flags: {
39834
+ config: "Config path; default platform path",
39835
+ profile: "Profile name; default credential precedence",
39836
+ fields: "Comma-separated output fields; default compact view",
39837
+ full: "Full text; default false",
39838
+ help: "Show help",
39839
+ execute: "Execute once; default preview",
39840
+ "dry-run": "Explicit preview; excludes --execute",
39841
+ confirm: "Exact confirmation from preview",
39842
+ "intent-id": "Unique execution intent for replay protection",
39843
+ "ids-file": "Required JSON UUID array; '-' for stdin; maximum 1 MiB"
39844
+ }
39845
+ },
39846
+ {
39847
+ command: "tag value create",
39848
+ effect: "write",
39849
+ flags: {
39850
+ config: "Config path; default platform path",
39851
+ profile: "Profile name; default credential precedence",
39852
+ fields: "Comma-separated output fields; default compact view",
39853
+ full: "Full text; default false",
39854
+ help: "Show help",
39855
+ "body-file": "Required strict tag JSON; '-' for stdin; maximum 1 MiB; no access_control",
39856
+ execute: "Execute once; default preview",
39857
+ "dry-run": "Explicit preview; excludes --execute",
39858
+ confirm: "Exact confirmation from preview",
39859
+ "intent-id": "Unique execution intent for replay protection"
39860
+ }
39861
+ },
39862
+ {
39863
+ command: "tag value delete",
39864
+ effect: "write",
39865
+ flags: {
39866
+ config: "Config path; default platform path",
39867
+ profile: "Profile name; default credential precedence",
39868
+ fields: "Comma-separated output fields; default compact view",
39869
+ full: "Full text; default false",
39870
+ help: "Show help",
39871
+ id: "Required exact UUID",
39872
+ execute: "Execute once; default preview",
39873
+ "dry-run": "Explicit preview; excludes --execute",
39874
+ confirm: "Exact confirmation from preview",
39875
+ "intent-id": "Unique execution intent for replay protection"
39876
+ }
39877
+ },
39878
+ {
39879
+ command: "tag value list",
39880
+ effect: "read",
39881
+ flags: {
39882
+ config: "Config path; default platform path",
39883
+ profile: "Profile name; default credential precedence",
39884
+ fields: "Comma-separated output fields; default compact view",
39885
+ full: "Full text; default false",
39886
+ help: "Show help",
39887
+ limit: "Output rows; default 100; maximum 10000",
39888
+ offset: "Starting record; default 0",
39889
+ cursor: "Resume the same scoped collection",
39890
+ all: "Read at most 10000 rows; excludes --limit",
39891
+ filter: "Repeatable field:operator:value",
39892
+ "filter-type": "and|or; API default and",
39893
+ sort: "Comma-separated field:asc|desc",
39894
+ with: "Wildcard search value (w)",
39895
+ "with-filter": "Comma-separated wildcard fields (wf)"
39896
+ }
39897
+ },
39898
+ {
39899
+ command: "tag value show",
39900
+ effect: "read",
39901
+ flags: {
39902
+ config: "Config path; default platform path",
39903
+ profile: "Profile name; default credential precedence",
39904
+ fields: "Comma-separated output fields; default compact view",
39905
+ full: "Full text; default false",
39906
+ help: "Show help",
39907
+ id: "Required exact UUID"
39908
+ }
39909
+ },
39910
+ {
39911
+ command: "tag value update",
39912
+ effect: "write",
39913
+ flags: {
39914
+ config: "Config path; default platform path",
39915
+ profile: "Profile name; default credential precedence",
39916
+ fields: "Comma-separated output fields; default compact view",
39917
+ full: "Full text; default false",
39918
+ help: "Show help",
39919
+ id: "Required exact UUID",
39920
+ "body-file": "Required strict tag JSON; '-' for stdin; maximum 1 MiB; no access_control",
39921
+ execute: "Execute once; default preview",
39922
+ "dry-run": "Explicit preview; excludes --execute",
39923
+ confirm: "Exact confirmation from preview",
39924
+ "intent-id": "Unique execution intent for replay protection"
39925
+ }
39926
+ }
39927
+ ]
39928
+ };
39929
+
38643
39930
  // src/shared/tool-manifests.ts
38644
- var toolManifests = { "falcon-axi": falcon_axi_default, "vectra-axi": vectra_axi_default, "az-axi": az_axi_default, "mg-axi": mg_axi_default, "ldap-axi": ldap_axi_default, "ado-axi": ado_axi_default, "awx-axi": awx_axi_default };
39931
+ var toolManifests = { "falcon-axi": falcon_axi_default, "vectra-axi": vectra_axi_default, "az-axi": az_axi_default, "mg-axi": mg_axi_default, "ldap-axi": ldap_axi_default, "ado-axi": ado_axi_default, "awx-axi": awx_axi_default, "tenable-axi": tenable_axi_default };
38645
39932
 
38646
39933
  // node_modules/.pnpm/@toon-format+toon@2.3.1/node_modules/@toon-format/toon/dist/index.mjs
38647
39934
  var NULL_LITERAL = "null";
@@ -40009,6 +41296,7 @@ function resolveDecodeOptions(options) {
40009
41296
 
40010
41297
  // src/cli/rewrite.ts
40011
41298
  var managedFlags = {
41299
+ "tenable-axi": tenable_axi_default.adapterBoundary.unsafeOverrides,
40012
41300
  "awx-axi": awx_axi_default.adapterBoundary.unsafeOverrides,
40013
41301
  "falcon-axi": falcon_axi_default.unsafeOverrides,
40014
41302
  "vectra-axi": vectra_axi_default.adapterBoundary.unsafeOverrides,
@@ -40071,6 +41359,13 @@ function rewriteSuggestions(output3, tool, truncated = false) {
40071
41359
  try {
40072
41360
  const json2 = output3.trimStart().startsWith("{");
40073
41361
  let parsed = json2 ? jsonHelp(output3) : toonHelp(output3);
41362
+ if (tool === "tenable-axi" && parsed.document.commands) {
41363
+ return encode3({
41364
+ description: "Investigate Tenable One with managed API keys.",
41365
+ commands: tenable_axi_default.commands.filter((route) => route.effect !== "blocked").map((route) => route.command),
41366
+ help: [tenable_axi_default.discovery.help.replaceAll("tenable-axi ", "artium-axi tenable-axi ")]
41367
+ }) + "\n";
41368
+ }
40074
41369
  if (tool === "ldap-axi" && parsed.document.description === "Read Active Directory and LDAPv3 directories safely with ldap-axi (read-only)" && Array.isArray(parsed.document.commands) && parsed.spans.length) {
40075
41370
  const home = {
40076
41371
  ...parsed.document,
@@ -40166,9 +41461,14 @@ function managedFlagRanges(command, tool) {
40166
41461
  return ranges;
40167
41462
  }
40168
41463
  function hostedHelp(help, tool, flags, commands2) {
41464
+ if (tool === "tenable-axi") {
41465
+ help = help.split("\n").filter((line) => !/TENABLE_AXI_|SecretRefs|tenable-axi (?:setup|config|profile|hook)|export (?:attack|inventory) download/.test(line)).join("\n");
41466
+ const guidance = "Artium manages both API keys and the fixed origin. Administrators enable write operations; native preview, execute, exact confirmation and journal gates remain required. Downloads are unavailable.";
41467
+ if (commands2 && !help.includes(guidance)) help = help.trimEnd() + "\n" + guidance + "\n";
41468
+ }
40169
41469
  if (tool === "awx-axi") {
40170
41470
  const guidance = "Artium manages the controller origin, verified TLS and token. Operational writes require administrator allowWrites and --confirm; configuration, deletion and security writes are blocked. No stdin or files. Ask an administrator to update the managed credential.";
40171
- help = help.split("\n").filter((line) => !/(?:\bAWX_AXI_[A-Z_]+\b|\bawx-axi (?:auth (?:login|logout)|setup|config|profile|update)\b|--(?:origin|profile|config|verify-ssl|allow-http)\b)/.test(line)).filter((line) => !/^(?:Run|Use) .*\bawx-axi job stdout\b.*--download\b/.test(line)).map((line) => (/^(?:artium-axi )?awx-axi job stdout\b/.test(line) ? line.replace(/ \[--(?:full|ansi)\]| \[--download <path>\]/g, "") : line).replace(/--timeout (?:600|3600)/g, "--timeout 50")).join("\n");
41471
+ help = help.split("\n").filter((line) => !/(?:\bAWX_AXI_[A-Z_]+\b|\bawx-axi (?:auth (?:login|logout)|setup|config|profile|update)\b|--(?:origin|profile|config|verify-ssl|allow-http)\b)/.test(line)).filter((line) => !/^(?:Run|Use) .*\bawx-axi job stdout\b.*--download\b/.test(line)).map((line) => (/^(?:artium-axi )?awx-axi job stdout\b/.test(line) ? line.replace(/ \[--(?:full|ansi)\]| \[--download <path>\]/g, "") : line).replace(/^((?:artium-axi )?awx-axi job list\b[^\n]*) \[--fields <fields>\]/, "$1").replace(/--timeout (?:600|3600)/g, "--timeout 50")).join("\n");
40172
41472
  if (!help.trim()) help = guidance;
40173
41473
  else if (commands2 && !help.includes(guidance)) help = help.trimEnd() + "\n" + guidance + "\n";
40174
41474
  }
@@ -40198,7 +41498,8 @@ function hostedHelp(help, tool, flags, commands2) {
40198
41498
  const filtered = help.replace(
40199
41499
  /^([ \t]*(?:(?:Flags|Globals|Global flags|Selector flags on every command|[Vv]alid flags for `[^`]+`): |(?=--)))([^\r\n]*)(\r?\n|$)/gm,
40200
41500
  (_, label, listed, ending) => {
40201
- const retained = listed.split(", ").filter((flag) => !flags.includes(/^--([\w-]+)/.exec(flag)?.[1] ?? "")).join(", ");
41501
+ const entries = label.trim() || /^--[\w-]+(?: <[^>]+>)?(?:, --[\w-]+(?: <[^>]+>)?)*\.?$/.test(listed) ? listed.split(", ") : [listed];
41502
+ const retained = entries.filter((flag) => !flags.includes(/^--([\w-]+)/.exec(flag)?.[1] ?? "")).join(", ");
40202
41503
  if (!retained && !label.trim()) return "";
40203
41504
  return label + retained + (listed.endsWith(".") && !retained.endsWith(".") ? "." : "") + ending;
40204
41505
  }
@@ -40321,9 +41622,16 @@ function identityView(user, server) {
40321
41622
  return `user: ${JSON.stringify(user.username)}
40322
41623
  server: ${JSON.stringify(server)}
40323
41624
  roles[${user.roles.length}]: ${user.roles.map((role) => JSON.stringify(role)).join(",")}
40324
- accessExpiresAt: ${user.accessExpiresAt}
41625
+ sessionExpiresAt: ${sessionExpiryView(user.sessionExpiresAt)}
41626
+ accessExpiresAt: ${sessionExpiryView(user.accessExpiresAt)}
41627
+ note: Access tokens refresh automatically when a refresh token is available.
40325
41628
  `;
40326
41629
  }
41630
+ function sessionExpiryView(expiresAt, now = Date.now()) {
41631
+ const minutes = Math.max(0, Math.floor((expiresAt - now) / 6e4));
41632
+ const remaining = expiresAt <= now ? "expired" : `in ${Math.floor(minutes / 60)}h ${minutes % 60}m`;
41633
+ return `${new Date(expiresAt).toISOString().replace(".000Z", "Z")} (${remaining})`;
41634
+ }
40327
41635
  function toolsView(tools) {
40328
41636
  if (!tools.length) return "tools: 0 available\nreason: No enabled runtime tool is available through your assigned roles.\ncontact: Ask an administrator to check your role assignments and enabled tools.\nnext[1]:\n - artium-axi whoami\n";
40329
41637
  return `tools[${tools.length}]{name,status,version,readOnly}:
@@ -40348,11 +41656,268 @@ upstreamHelp: ${JSON.stringify(help)}
40348
41656
  `;
40349
41657
  }
40350
41658
 
41659
+ // src/cli/doctor.ts
41660
+ var DIAGNOSTIC_REQUEST_DEADLINE_MS = 5e3;
41661
+ async function doctor(createClient = (deadline) => new Client(process.env, void 0, deadline), write = (text2) => {
41662
+ process.stdout.write(text2);
41663
+ }) {
41664
+ let failure2;
41665
+ const line = (name, pass, detail, error62) => {
41666
+ if (!pass) failure2 ??= error62 ?? new ArtiumError("INVALID_RESPONSE");
41667
+ write(`${pass ? "pass" : "fail"}: ${name}${detail ? ` (${detail})` : ""}
41668
+ `);
41669
+ };
41670
+ let client;
41671
+ try {
41672
+ client = createClient(DIAGNOSTIC_REQUEST_DEADLINE_MS);
41673
+ } catch (error62) {
41674
+ for (const name of ["server address", "certificate", "token", "CLI version"]) line(name, false, "CLIENT_CONFIG_INVALID");
41675
+ throw error62;
41676
+ }
41677
+ let addressOk = false;
41678
+ try {
41679
+ const live = await client.request("/health/live", "GET");
41680
+ addressOk = !!live && typeof live === "object" && "status" in live && live.status === "ok";
41681
+ line("server address", addressOk, client.serverUrlSource);
41682
+ line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : "test HTTP", new ArtiumError("CLIENT_CONFIG_INVALID"));
41683
+ } catch (error62) {
41684
+ const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41685
+ line("server address", cause.code === "CERTIFICATE_INVALID", `${client.serverUrlSource}: ${cause.code}`, cause);
41686
+ line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : cause.code, cause);
41687
+ }
41688
+ if (!addressOk && failure2) throw failure2;
41689
+ let versionOk = true;
41690
+ let versionError;
41691
+ try {
41692
+ await client.request("/v1/me", "GET");
41693
+ } catch (error62) {
41694
+ versionOk = error62 instanceof ArtiumError && error62.code === "TOKEN_INVALID";
41695
+ if (!versionOk) versionError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41696
+ }
41697
+ let tokenOk = false;
41698
+ let tokenError;
41699
+ let tokenDetail;
41700
+ try {
41701
+ const parsed = meResponseSchema.safeParse(await client.authenticated("/v1/me", "GET"));
41702
+ tokenOk = parsed.success;
41703
+ if (parsed.success) tokenDetail = `session expires ${sessionExpiryView(parsed.data.sessionExpiresAt)}`;
41704
+ } catch (error62) {
41705
+ tokenError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41706
+ }
41707
+ line("token", tokenOk, tokenDetail, tokenError);
41708
+ line("CLI version", versionOk, void 0, versionError);
41709
+ if (tokenOk && versionOk) {
41710
+ try {
41711
+ const parsed = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET"));
41712
+ if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
41713
+ for (const tool of parsed.data.tools) line(
41714
+ tool.name,
41715
+ tool.status === "ok",
41716
+ tool.status,
41717
+ new ArtiumError(tool.status === "unconfigured" ? "CREDENTIAL_NOT_CONFIGURED" : tool.status === "error" ? "TOOL_FAILED" : tool.status === "disabled" ? "TOOL_DISABLED" : "SERVER_UNAVAILABLE")
41718
+ );
41719
+ } catch (error62) {
41720
+ const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41721
+ line("tools", false, cause.code, cause);
41722
+ }
41723
+ }
41724
+ if (failure2) throw failure2;
41725
+ }
41726
+
41727
+ // src/cli/help.ts
41728
+ var commands = {
41729
+ home: { usage: "artium-axi [tools [show <tool>]|whoami|login|passwd|logout|doctor|setup|update|<tool> <args>]", purpose: "Show your identity, roles and available tools.", flags: ["--version (default false; print the client package version and exit)"], example: "artium-axi" },
41730
+ setup: {
41731
+ usage: "artium-axi setup --host <claude|codex|opencode|pi> [--hook] [--force]",
41732
+ purpose: "Install skills for your signed-in account\u2019s granted tools and an optional Claude Code session hook.",
41733
+ flags: ["--host <claude|codex|opencode|pi> (required)", "--hook (default false; Claude Code only)", "--force (default false; explicitly replace an edited skill)"],
41734
+ example: "artium-axi setup --host claude --hook"
41735
+ },
41736
+ tools: { usage: "artium-axi tools", purpose: "List available tools with their status and pinned version.", flags: [], example: "artium-axi tools" },
41737
+ "tools show": { usage: "artium-axi tools show <tool>", purpose: "Show one available tool and its vetted upstream help.", flags: [], example: "artium-axi tools show falcon-axi" },
41738
+ whoami: { usage: "artium-axi whoami", purpose: "Show your identity, roles, session expiry and server.", flags: [], example: "artium-axi whoami" },
41739
+ login: {
41740
+ usage: "artium-axi login --sso | --username <username> [--password-stdin]",
41741
+ purpose: "Sign in through browser SSO (8-hour session) or with a local account.",
41742
+ flags: ["--sso (default false; open the displayed URL in any browser and approve your terminal code; no password flags)", "--username <username> (required for local sign-in)", "--password-stdin (default false; local only; otherwise ARTIUM_AXI_PASSWORD or a terminal prompt)"],
41743
+ example: "artium-axi login --sso"
41744
+ },
41745
+ passwd: {
41746
+ usage: "artium-axi passwd [--password-stdin]",
41747
+ purpose: "Change your password, then sign in again.",
41748
+ flags: ["--password-stdin (default false; otherwise a terminal prompt; current password uses ARTIUM_AXI_CURRENT_PASSWORD or a terminal prompt)"],
41749
+ example: "artium-axi passwd --password-stdin"
41750
+ },
41751
+ logout: { usage: "artium-axi logout", purpose: "Remove local tokens and revoke the server session.", flags: [], example: "artium-axi logout" },
41752
+ doctor: { usage: "artium-axi doctor", purpose: "Check the server, certificate, token, CLI version and cached tool health.", flags: [], example: "artium-axi doctor" },
41753
+ update: { usage: "artium-axi update", purpose: "Download and verify the server\u2019s client, replace this file and keep a .bak backup. npm installations must use npm install -g @knowttl/artium-axi.", flags: [], example: "artium-axi update" },
41754
+ "falcon-axi": {
41755
+ usage: "artium-axi falcon-axi [<args>]",
41756
+ purpose: "Run Falcon commands with your managed credentials.",
41757
+ flags: ["Arguments after falcon-axi are forwarded upstream, including --help."],
41758
+ example: `artium-axi falcon-axi ${falcon_axi_default.discovery.example.join(" ")}`
41759
+ },
41760
+ "vectra-axi": {
41761
+ usage: "artium-axi vectra-axi [<args>]",
41762
+ purpose: "Run Vectra commands with your managed credentials.",
41763
+ flags: ["Arguments after vectra-axi are forwarded upstream, including --help."],
41764
+ example: `artium-axi vectra-axi ${vectra_axi_default.discovery.example.join(" ")}`
41765
+ },
41766
+ "ldap-axi": {
41767
+ usage: "artium-axi ldap-axi [<args>]",
41768
+ purpose: "Read directory data with the managed LDAP bind identity.",
41769
+ flags: ["Arguments after ldap-axi are forwarded upstream, including --help."],
41770
+ example: `artium-axi ldap-axi ${ldap_axi_default.discovery.example.join(" ")}`
41771
+ },
41772
+ "ado-axi": {
41773
+ usage: "artium-axi ado-axi [<args>]",
41774
+ purpose: "Run Azure DevOps commands with managed credentials.",
41775
+ flags: ["Arguments after ado-axi include --help. Organization and credentials are managed by Artium; api is GET only; writes are off by default."],
41776
+ example: "artium-axi ado-axi project list --limit 1"
41777
+ },
41778
+ "awx-axi": {
41779
+ usage: "artium-axi awx-axi [<args>]",
41780
+ purpose: "Inspect AWX automation with managed credentials.",
41781
+ flags: ["Arguments after awx-axi include --help. Operational writes are off by default; configuration, deletion and security writes are blocked."],
41782
+ example: "artium-axi awx-axi job list --limit 1"
41783
+ },
41784
+ "tenable-axi": {
41785
+ usage: "artium-axi tenable-axi [<args>]",
41786
+ purpose: "Investigate Tenable One with managed API keys.",
41787
+ flags: ["Writes and export jobs are off by default and require administrator-enabled operations, preview, --execute and exact --confirm. Downloads are blocked."],
41788
+ example: "artium-axi tenable-axi card list --limit 1"
41789
+ },
41790
+ "az-axi": {
41791
+ usage: "artium-axi az-axi [<args>]",
41792
+ purpose: "Run Azure commands with your managed identity.",
41793
+ flags: ["Arguments after az-axi are forwarded upstream, including --help."],
41794
+ example: "artium-axi az-axi sub list"
41795
+ },
41796
+ "mg-axi": {
41797
+ usage: "artium-axi mg-axi [<args>]",
41798
+ purpose: "Run Microsoft Graph commands with your managed identity.",
41799
+ flags: ["Arguments after mg-axi are forwarded upstream, including --help."],
41800
+ example: "artium-axi mg-axi entra user list"
41801
+ },
41802
+ "managed-session": {
41803
+ usage: "artium-axi --managed-session <command> [<args>]",
41804
+ purpose: "Let a caller supply and persist sessions through private pipes.",
41805
+ flags: [],
41806
+ example: "artium-axi --managed-session whoami"
41807
+ }
41808
+ };
41809
+ function commandHelp(command) {
41810
+ const entry = commands[command];
41811
+ const flags = [
41812
+ toolSchema.safeParse(command).success ? "--help before the tool name (default false)" : "--help (default false)",
41813
+ ...entry.flags,
41814
+ ...command === "update" ? [] : ["--managed-session before the command (default false; caller-owned sessions; see artium-axi --managed-session --help)"]
41815
+ ];
41816
+ const protocol = [
41817
+ "Session JSON on inherited pipe fd 3, new sessions and rotations as JSON lines on private pipe fd 4; no session file.",
41818
+ "Managed input: {serverUrl, accessToken, refreshToken?}; close fd 3 after JSON (64 KiB maximum). Output: {serverUrl, status, accessToken, refreshToken, accessExpiresAt, familyExpiresAt} per rotation, before retry, including on later failure.",
41819
+ "Managed login: fd 3 is unused; fd 4 must be a writable private pipe/socket. Local sign-in requires --username <username> --password-stdin with protected inherited stdin; password argv and ARTIUM_AXI_PASSWORD are refused. SSO uses login --sso and displays browser approval instructions immediately. New sessions use the rotation envelope; password-change-required returns {serverUrl, status, passwordChangeToken, passwordChangeExpiresAt} on fd 4 and exits 1.",
41820
+ "Managed exits: 0 success; 2 invalid JSON/descriptors or refused passwd/logout/setup/update; 1 authentication/transport failure; tool exit codes pass through. Only TOKEN_EXPIRED permits one refresh/retry; without refreshToken or on refusal, return control to the caller."
41821
+ ];
41822
+ const purposes = command === "home" ? `commands[${Object.keys(commands).length - 2}]{command,purpose}:
41823
+ ${Object.entries(commands).filter(([name]) => name !== "home" && name !== "managed-session").map(([name, value]) => ` ${name},${JSON.stringify(value.purpose)}`).join("\n")}
41824
+ ` : "";
41825
+ return `purpose: ${entry.purpose}
41826
+ usage: ${entry.usage}
41827
+ ${purposes}flags[${flags.length}]:
41828
+ ${flags.map((flag) => ` - ${JSON.stringify(flag)}`).join("\n")}
41829
+ example: ${entry.example}
41830
+ ` + (command === "login" || command === "managed-session" ? `managedSession[${protocol.length}]:
41831
+ ${protocol.map((line) => ` - ${JSON.stringify(line)}`).join("\n")}
41832
+ ` : "");
41833
+ }
41834
+ function validateArguments(args, prefixHelp) {
41835
+ const command = args[0];
41836
+ if (command === "tools") args = [...args.filter((arg) => arg !== "--help"), ...args.filter((arg) => arg === "--help")];
41837
+ const rootFlags = "--help, --version, --managed-session (before the command)";
41838
+ const rootCommands = Object.keys(commands).filter((name) => name !== "home" && name !== "managed-session" && name !== "tools show").join(", ");
41839
+ function fail(token, level2, choices2) {
41840
+ const kind = token?.startsWith("-") ? "flag" : "argument";
41841
+ const message = token === void 0 ? `Missing argument for ${level2}.` : command === "login" || command === "passwd" ? `Unexpected argument at position ${args.indexOf(token) + 1} for ${level2}. Password arguments are refused.` : `Unknown or unexpected ${kind} ${JSON.stringify(kind === "flag" ? token.split("=")[0] : token)} for ${level2}.`;
41842
+ throw new ArtiumError("INVALID_INPUT", message, choices2);
41843
+ }
41844
+ if (!command) return;
41845
+ if (command === "--version" && args.length === 1) return;
41846
+ if (!Object.hasOwn(commands, command) || command === "home" || command === "managed-session" || command === "tools show") {
41847
+ fail(command, "artium-axi", `Valid commands: ${rootCommands}. Valid flags: ${rootFlags}.`);
41848
+ }
41849
+ if (toolSchema.safeParse(command).success) {
41850
+ if (prefixHelp && args.length > 1) fail(args[1], command, `Use artium-axi --help ${command} for local help; artium-axi ${command} --help for upstream flags.`);
41851
+ return;
41852
+ }
41853
+ let level = command;
41854
+ let start = 1;
41855
+ if (command === "tools" && args[1] === "show") {
41856
+ level = "tools show";
41857
+ start = 2;
41858
+ }
41859
+ const entry = commands[level];
41860
+ const validFlags = ["--help", ...entry.flags.map((flag) => flag.split(" ")[0])];
41861
+ const choices = `Valid flags for ${level}: ${validFlags.join(", ")}.` + (level === "tools" ? " Valid subcommands: show <tool>." : level === "tools show" ? ` Valid tools: ${toolSchema.options.join(", ")}.` : "");
41862
+ let tool = false;
41863
+ const seen = /* @__PURE__ */ new Set();
41864
+ for (let index = start; index < args.length; index++) {
41865
+ const token = args[index];
41866
+ if (level === "tools show" && !token.startsWith("-") && !tool) {
41867
+ if (!toolSchema.safeParse(token).success) fail(token, level, choices);
41868
+ tool = true;
41869
+ } else {
41870
+ if (!validFlags.includes(token) || seen.has(token)) fail(token, level, choices);
41871
+ seen.add(token);
41872
+ if (token === "--username" || token === "--host") {
41873
+ const value = args[index + 1];
41874
+ if (!value) fail(value, `${level} ${token}`, `Supply ${token} ${token === "--host" ? "<claude|codex|opencode|pi>" : "<username>"}. ${choices}`);
41875
+ if (token === "--host" && !["claude", "codex", "opencode", "pi"].includes(value)) fail(value, `${level} --host`, `Valid hosts: claude, codex, opencode, pi. Use ${entry.usage}.`);
41876
+ index++;
41877
+ }
41878
+ }
41879
+ }
41880
+ if (level === "tools show" && !tool && !seen.has("--help") && !prefixHelp) fail(void 0, level, choices);
41881
+ }
41882
+ function helpCommand(args, prefixHelp = false) {
41883
+ if (args[0] === "setup" && args.includes("--help")) {
41884
+ const path2 = args.filter((arg) => arg !== "--help");
41885
+ for (let index = 1; index < path2.length; index++) {
41886
+ if (path2[index] === "--host" && ["claude", "codex", "opencode", "pi"].includes(path2[index + 1])) index++;
41887
+ else if (path2[index] !== "--hook" && path2[index] !== "--force") return void 0;
41888
+ }
41889
+ return "setup";
41890
+ }
41891
+ if (toolSchema.safeParse(args[0]).success) return prefixHelp && args.length === 2 ? args[0] : void 0;
41892
+ if (args[0] === "login" || args[0] === "passwd") {
41893
+ if (args[0] === "login" && args.length === 3 && args.includes("--sso") && args.includes("--help")) return "login";
41894
+ let requested = false;
41895
+ let username = false;
41896
+ let stdin = false;
41897
+ for (let index = 1; index < args.length; index++) {
41898
+ const option = args[index];
41899
+ if (option === "--username" && args[0] === "login" && !username && args[index + 1] !== void 0) {
41900
+ username = true;
41901
+ index++;
41902
+ } else if (option === "--password-stdin" && !stdin) stdin = true;
41903
+ else if (option === "--help" && !requested) requested = true;
41904
+ else return void 0;
41905
+ }
41906
+ return requested ? args[0] : void 0;
41907
+ }
41908
+ if (!args.includes("--help")) return void 0;
41909
+ const path = args.filter((arg) => arg !== "--help");
41910
+ if (path.length === 0) return "home";
41911
+ if (path[0] === "tools" && path[1] === "show" && (path.length === 2 || path.length === 3 && toolSchema.safeParse(path[2]).success)) return "tools show";
41912
+ if (path.length === 1 && path[0] !== "home" && Object.hasOwn(commands, path[0])) return path[0];
41913
+ return void 0;
41914
+ }
41915
+
40351
41916
  // src/cli/setup.ts
40352
41917
  import { createHash, randomUUID as randomUUID2 } from "node:crypto";
40353
41918
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync3, renameSync as renameSync2, rmSync as rmSync2, statSync as statSync2, writeFileSync as writeFileSync2 } from "node:fs";
40354
41919
  import { homedir as homedir2 } from "node:os";
40355
- import { dirname as dirname2, join as join2, resolve } from "node:path";
41920
+ import { dirname as dirname2, join as join2, resolve as resolve2 } from "node:path";
40356
41921
 
40357
41922
  // skill/artium-axi/SKILL.md
40358
41923
  var SKILL_default = "---\nname: artium-axi\ndescription: Discover and run managed commands through Artium, using the signed-in account and its granted tools.\n---\n\nUse artium-axi tools first for requests involving data from Artium-managed tools.\nRun `artium-axi tools` to discover the tools available to this account before choosing a tool.\nRun `artium-axi tools show <tool>` for its commands and a vetted example, then run `artium-axi <tool> <args>`.\nFollow the returned next commands; they already include the Artium prefix.\nKeep upstream arguments intact and use the managed credentials rather than configuring an upstream CLI directly.\n\nIf artium-axi is absent from PATH, use the installed command below in place of `artium-axi` in every example:\n\n<!-- artium-axi executable -->\nThe setup command records the standalone bundle's Node invocation here.\n<!-- /artium-axi executable -->\n\nIf sign-in is required, ask the user to follow `artium-axi login --help` for their SSO or local account.\nNever request or print tokens or put passwords in arguments.\nAn empty tool list means no enabled runtime tool is available through the account's roles; ask an administrator to check grants and enabled tools.\nUse `artium-axi doctor` for connection or cached health diagnostics.\nDo not retry an uncertain command outcome, especially a write.\n";
@@ -40451,7 +42016,7 @@ async function setup(args) {
40451
42016
  if (hook && host !== "claude") {
40452
42017
  throw new ArtiumError("INVALID_INPUT", `Hook installation is unsupported for ${host}: this installer has no verified ${host} hook implementation. No files were written.`, `Install the skill with artium-axi setup --host ${host} without --hook; Claude Code supports --hook.`);
40453
42018
  }
40454
- const executable = resolve(process.argv[1]);
42019
+ const executable = resolve2(process.argv[1]);
40455
42020
  const invocation = process.platform === "win32" ? `& '${process.execPath.replaceAll("'", "''")}' '${executable.replaceAll("'", "''")}'` : `${quote(process.execPath)} ${quote(executable)}`;
40456
42021
  const executableBlock = `<!-- artium-axi executable -->
40457
42022
 
@@ -40461,7 +42026,7 @@ ${invocation}
40461
42026
 
40462
42027
  <!-- /artium-axi executable -->`;
40463
42028
  const content = SKILL_default.replace(/<!-- artium-axi executable -->[\s\S]*?<!-- \/artium-axi executable -->/, () => executableBlock);
40464
- const hostDirectory = host === "claude" && process.env.CLAUDE_CONFIG_DIR ? resolve(process.env.CLAUDE_CONFIG_DIR) : host === "pi" && process.env.PI_CODING_AGENT_DIR ? resolve(process.env.PI_CODING_AGENT_DIR.replace(/^~(?=\/|$)/, () => homedir2())) : join2(homedir2(), ...hosts[host]);
42029
+ const hostDirectory = host === "claude" && process.env.CLAUDE_CONFIG_DIR ? resolve2(process.env.CLAUDE_CONFIG_DIR) : host === "pi" && process.env.PI_CODING_AGENT_DIR ? resolve2(process.env.PI_CODING_AGENT_DIR.replace(/^~(?=\/|$)/, () => homedir2())) : join2(homedir2(), ...hosts[host]);
40465
42030
  const client = new Client();
40466
42031
  const response = skillsResponseSchema.safeParse(await client.authenticated("/v1/skills", "GET"));
40467
42032
  if (!response.success) throw new ArtiumError("INVALID_RESPONSE");
@@ -40580,6 +42145,7 @@ expires: ${new Date(device.expiresAt).toISOString()}
40580
42145
  if (managed2) await managed2.emit(client.serverUrl, session);
40581
42146
  else await client.sessions.locked(async () => {
40582
42147
  client.sessions.write(session);
42148
+ client.sessions.writeClientConfig(client.caFile);
40583
42149
  });
40584
42150
  const message = `status: authenticated
40585
42151
  session-ends: ${new Date(session.familyExpiresAt).toISOString()}
@@ -40734,9 +42300,9 @@ var ManagedSession = class _ManagedSession {
40734
42300
  if (session.status === "authenticated") this.protect(session.accessToken, session.refreshToken);
40735
42301
  else this.protect(session.passwordChangeToken);
40736
42302
  try {
40737
- await new Promise((resolve3, reject) => {
42303
+ await new Promise((resolve4, reject) => {
40738
42304
  this.channel.write(`${JSON.stringify({ serverUrl, ...session })}
40739
- `, (error62) => error62 ? reject(error62) : resolve3());
42305
+ `, (error62) => error62 ? reject(error62) : resolve4());
40740
42306
  });
40741
42307
  } catch {
40742
42308
  throw new ArtiumError(
@@ -40760,9 +42326,45 @@ var ManagedSession = class _ManagedSession {
40760
42326
  }
40761
42327
  };
40762
42328
 
42329
+ // src/cli/update.ts
42330
+ import { createHash as createHash2, randomUUID as randomUUID3 } from "node:crypto";
42331
+ import { copyFileSync, existsSync as existsSync3, readFileSync as readFileSync4, realpathSync, renameSync as renameSync3, rmSync as rmSync3, statSync as statSync3, writeFileSync as writeFileSync3 } from "node:fs";
42332
+ import { dirname as dirname3, join as join3 } from "node:path";
42333
+ async function update() {
42334
+ const executable = realpathSync(process.argv[1]);
42335
+ const metadata = join3(dirname3(executable), "..", "package.json");
42336
+ if (existsSync3(metadata) && JSON.parse(readFileSync4(metadata, "utf8")).name === "@knowttl/artium-axi") {
42337
+ throw new ArtiumError("INVALID_INPUT", "This client was installed from npm.", "Run npm install -g @knowttl/artium-axi@latest.");
42338
+ }
42339
+ const client = new Client();
42340
+ const bundle = await client.request("/cli/artium-axi.mjs", "GET", void 0, void 0, true);
42341
+ const checksum2 = await client.request("/cli/artium-axi.mjs.sha256", "GET", void 0, void 0, true);
42342
+ const digest = checksum2.toString("utf8").trim().split(/\s+/)[0];
42343
+ if (!/^[a-fA-F0-9]{64}$/.test(digest) || createHash2("sha256").update(bundle).digest("hex") !== digest.toLowerCase()) {
42344
+ throw new ArtiumError("INVALID_RESPONSE", "The downloaded client failed SHA-256 verification.", "Run artium-axi update again after checking the server bundle and checksum.");
42345
+ }
42346
+ const temporary = `${executable}.${randomUUID3()}.tmp`;
42347
+ try {
42348
+ writeFileSync3(temporary, bundle, { flag: "wx", mode: statSync3(executable).mode & 511 });
42349
+ copyFileSync(executable, `${executable}.bak`);
42350
+ renameSync3(temporary, executable);
42351
+ } catch {
42352
+ throw new ArtiumError("INTERNAL_ERROR", "The client could not be replaced.", "Check write permissions for the client file and its directory, then run artium-axi update.");
42353
+ } finally {
42354
+ rmSync3(temporary, { force: true });
42355
+ }
42356
+ return "status: updated\nnext: artium-axi --version\n";
42357
+ }
42358
+
40763
42359
  // src/cli/main.ts
40764
42360
  var managed;
42361
+ for (const stream of [process.stdout, process.stderr]) {
42362
+ stream.on("error", (error62) => {
42363
+ if (error62.code !== "EPIPE") throw error62;
42364
+ });
42365
+ }
40765
42366
  function output2(stream, text2) {
42367
+ if (process[stream].destroyed) return;
40766
42368
  if (managed) managed.write(stream, text2);
40767
42369
  else process[stream].write(text2);
40768
42370
  }
@@ -40790,7 +42392,7 @@ async function main(args) {
40790
42392
  return;
40791
42393
  }
40792
42394
  if (managedMode) {
40793
- if (["passwd", "logout", "setup"].includes(args[0])) {
42395
+ if (["passwd", "logout", "setup", "update"].includes(args[0])) {
40794
42396
  throw new ArtiumError(
40795
42397
  "INVALID_INPUT",
40796
42398
  "This command is unavailable in managed session mode.",
@@ -40799,6 +42401,10 @@ async function main(args) {
40799
42401
  }
40800
42402
  managed = await ManagedSession.read(args[0] === "login");
40801
42403
  }
42404
+ if (command === "update") {
42405
+ output2("stdout", await update());
42406
+ return;
42407
+ }
40802
42408
  if (command === "setup") {
40803
42409
  output2("stdout", await setup(args.slice(1)));
40804
42410
  return;
@@ -40853,7 +42459,10 @@ async function main(args) {
40853
42459
  const parsed = loginResponseSchema.safeParse(await client2.request("/v1/auth/login", "POST", { username, password }));
40854
42460
  if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
40855
42461
  if (managed) await managed.emit(client2.serverUrl, parsed.data);
40856
- else client2.sessions.write(parsed.data);
42462
+ else {
42463
+ client2.sessions.write(parsed.data);
42464
+ client2.sessions.writeClientConfig(client2.caFile);
42465
+ }
40857
42466
  return parsed.data;
40858
42467
  };
40859
42468
  const session = await (managed ? signIn() : client2.sessions.locked(signIn));
@@ -40915,7 +42524,7 @@ remoteRevocation: ${verified ? "verified" : "unverified"}
40915
42524
  if (home) {
40916
42525
  const tools = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET", void 0, homeSession));
40917
42526
  if (!tools.success) throw new ArtiumError("INVALID_RESPONSE");
40918
- const executable = resolve2(process.argv[1]);
42527
+ const executable = resolve3(process.argv[1]);
40919
42528
  const local = relative(homedir3(), executable);
40920
42529
  const bin = local && !isAbsolute(local) && !local.startsWith(`..${sep}`) && local !== ".." ? `~${sep}${local}` : executable;
40921
42530
  view = `bin: ${JSON.stringify(bin)}
@@ -40949,11 +42558,11 @@ ${Object.entries(response.error).map(([key, value]) => ` ${key}: ${JSON.stringi
40949
42558
  `);
40950
42559
  process.exitCode = errors[response.error.code].exitCode;
40951
42560
  }
40952
- main(process.argv.slice(2)).catch((error62) => printError(errorResponse(error62 instanceof ArtiumError ? error62 : new ArtiumError("INTERNAL_ERROR"), randomUUID3()))).then(() => {
42561
+ main(process.argv.slice(2)).catch((error62) => printError(errorResponse(error62 instanceof ArtiumError ? error62 : new ArtiumError("INTERNAL_ERROR"), randomUUID4()))).then(() => {
40953
42562
  try {
40954
42563
  managed?.flush();
40955
42564
  } catch {
40956
42565
  managed = void 0;
40957
- printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID3()));
42566
+ printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID4()));
40958
42567
  }
40959
42568
  });