@knowttl/artium-axi 0.0.8 → 0.0.10

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 +24 -16
  2. package/bin/artium-axi.mjs +2509 -1008
  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." },
@@ -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)
@@ -20046,6 +20047,10 @@ var adminAuditRoute = {
20046
20047
  auditEvent: null
20047
20048
  };
20048
20049
  var nativeSettingsSchemas = {
20050
+ "tenable-axi": external_exports.strictObject({ writes: external_exports.strictObject({
20051
+ allowWrites: external_exports.boolean(),
20052
+ operations: external_exports.array(external_exports.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/)).min(1).max(64)
20053
+ }).optional() }),
20049
20054
  "awx-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional() }),
20050
20055
  "ldap-axi": external_exports.strictObject({}),
20051
20056
  "ado-axi": external_exports.strictObject({ allowWrites: external_exports.boolean().optional() }),
@@ -20091,10 +20096,25 @@ var healthSchema = external_exports.strictObject({
20091
20096
  credentialRevision: external_exports.number().int().nullable(),
20092
20097
  errorCode: external_exports.enum(Object.keys(errors)).nullable()
20093
20098
  });
20099
+ var toolWriteStateSchema = external_exports.strictObject({
20100
+ capable: external_exports.boolean(),
20101
+ enabled: external_exports.boolean(),
20102
+ reason: external_exports.string().nullable(),
20103
+ supportedOperations: external_exports.array(external_exports.string()).nullable(),
20104
+ allowedOperations: external_exports.array(external_exports.string()),
20105
+ unlocks: external_exports.string(),
20106
+ blocked: external_exports.string()
20107
+ });
20108
+ var writeAccessInputSchema = external_exports.strictObject({
20109
+ enabled: external_exports.boolean(),
20110
+ operations: external_exports.array(external_exports.string().min(1).max(256)).max(64).refine((operations) => new Set(operations).size === operations.length).optional(),
20111
+ expectedRevision: external_exports.number().int().positive()
20112
+ });
20094
20113
  var adminToolSchema = external_exports.strictObject({
20095
20114
  name: toolSchema,
20096
20115
  enabled: external_exports.boolean(),
20097
20116
  version: external_exports.string(),
20117
+ writeAccess: toolWriteStateSchema,
20098
20118
  readOnly: external_exports.boolean().default(true),
20099
20119
  nativeSettings: external_exports.record(external_exports.string(), external_exports.unknown()),
20100
20120
  revision: external_exports.number().int().positive(),
@@ -20140,7 +20160,6 @@ var certificateInspectionSchema = external_exports.strictObject({
20140
20160
  warnings: external_exports.array(external_exports.string()),
20141
20161
  reason: external_exports.string(),
20142
20162
  verificationError: external_exports.string().nullable(),
20143
- repairAvailable: external_exports.boolean(),
20144
20163
  previousFingerprints: external_exports.array(external_exports.string())
20145
20164
  });
20146
20165
  var trustedCredentialCertificateSchema = external_exports.strictObject({
@@ -20148,7 +20167,7 @@ var trustedCredentialCertificateSchema = external_exports.strictObject({
20148
20167
  endpoint: external_exports.string(),
20149
20168
  certificate: certificateDetailsSchema,
20150
20169
  leaf: certificateDetailsSchema,
20151
- mode: external_exports.enum(["pin", "intermediate"]),
20170
+ mode: external_exports.enum(["ca", "pin"]),
20152
20171
  createdAt: external_exports.number().int()
20153
20172
  });
20154
20173
  var adminCertificateRoutes = {
@@ -20167,7 +20186,7 @@ var adminCertificateRoutes = {
20167
20186
  trust: {
20168
20187
  method: "POST",
20169
20188
  path: "/v1/admin/tools/:tool/certificates/trust",
20170
- input: external_exports.strictObject({ inspectionId: external_exports.string() }),
20189
+ input: external_exports.strictObject({ inspectionId: external_exports.string(), mode: external_exports.enum(["ca", "pin"]).default("ca") }),
20171
20190
  response: external_exports.strictObject({ trusted: external_exports.literal(true) })
20172
20191
  },
20173
20192
  remove: {
@@ -20178,6 +20197,26 @@ var adminCertificateRoutes = {
20178
20197
  }
20179
20198
  };
20180
20199
  var adminToolRoutes = {
20200
+ get: {
20201
+ method: "GET",
20202
+ path: "/v1/admin/tools/:tool",
20203
+ input: external_exports.strictObject({}),
20204
+ response: adminToolSchema,
20205
+ authorization: "administrator-and-recent-auth",
20206
+ auditEvent: null
20207
+ },
20208
+ // Changes only write policy. Omitted operations retain the current allow-list; an empty
20209
+ // list clears it while disabling. Graph and Vectra require a supported nonempty allow-list
20210
+ // when enabling; tools without an allow-list reject operations input.
20211
+ // Other native settings and credentials are preserved. Revision conflicts never mutate.
20212
+ writeAccess: {
20213
+ method: "PATCH",
20214
+ path: "/v1/admin/tools/:tool/write-access",
20215
+ input: writeAccessInputSchema,
20216
+ response: adminToolSchema,
20217
+ authorization: "administrator-and-recent-auth",
20218
+ auditEvent: "tool-write-access"
20219
+ },
20181
20220
  list: {
20182
20221
  method: "GET",
20183
20222
  path: "/v1/admin/tools",
@@ -20560,11 +20599,12 @@ import { readFileSync as readFileSync2 } from "node:fs";
20560
20599
  import { request as httpRequest } from "node:http";
20561
20600
  import { request as httpsRequest } from "node:https";
20562
20601
  import { rootCertificates } from "node:tls";
20602
+ import { resolve } from "node:path";
20563
20603
 
20564
20604
  // package.json
20565
20605
  var package_default = {
20566
20606
  name: "artium-axi",
20567
- version: "0.0.8",
20607
+ version: "0.0.10",
20568
20608
  private: true,
20569
20609
  license: "MIT",
20570
20610
  type: "module",
@@ -20642,8 +20682,20 @@ function sessionPath(platform = process.platform, environment = process.env, hom
20642
20682
  if (!base) throw new ArtiumError("CLIENT_CONFIG_INVALID", void 0, "Set APPDATA to your writable roaming configuration folder, then sign in again.");
20643
20683
  return paths.join(base, "artium-axi", "session.json");
20644
20684
  }
20685
+ function clientConfigPath(platform = process.platform, environment = process.env, home = homedir()) {
20686
+ return sessionPath(platform, environment, home).replace(/session\.json$/, "config.json");
20687
+ }
20688
+ function readClientConfig(environment = process.env) {
20689
+ try {
20690
+ return external_exports.object({ serverUrl: external_exports.string(), caFile: external_exports.string().optional() }).parse(JSON.parse(readFileSync(clientConfigPath(process.platform, environment), "utf8")));
20691
+ } catch (error62) {
20692
+ if (error62.code === "ENOENT") return void 0;
20693
+ if (error62 instanceof ArtiumError) throw error62;
20694
+ throw new ArtiumError("CLIENT_CONFIG_INVALID");
20695
+ }
20696
+ }
20645
20697
  function restrictWindowsAcl(path, directory) {
20646
- 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`;
20698
+ 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)`;
20647
20699
  execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-EncodedCommand", Buffer.from(script, "utf16le").toString("base64")], {
20648
20700
  stdio: "ignore",
20649
20701
  env: { ...process.env, ARTIUM_AXI_SESSION_ACL_PATH: path, ARTIUM_AXI_SESSION_ACL_KIND: directory ? "directory" : "file" }
@@ -20707,6 +20759,26 @@ var SessionStore = class {
20707
20759
  rmSync(temporary, { force: true });
20708
20760
  }
20709
20761
  }
20762
+ writeClientConfig(caFile) {
20763
+ this.secureDirectory();
20764
+ const temporary = join(this.directory, `${randomUUID()}.tmp`);
20765
+ try {
20766
+ const file2 = openSync(temporary, "wx", 384);
20767
+ try {
20768
+ if (this.platform === "win32") this.acl(temporary, false);
20769
+ else fchmodSync(file2, 384);
20770
+ writeFileSync(file2, JSON.stringify({ serverUrl: this.serverUrl, caFile }));
20771
+ fsyncSync(file2);
20772
+ } finally {
20773
+ closeSync(file2);
20774
+ }
20775
+ renameSync(temporary, join(this.directory, "config.json"));
20776
+ } catch {
20777
+ throw new ArtiumError("SESSION_STORAGE_UNAVAILABLE");
20778
+ } finally {
20779
+ rmSync(temporary, { force: true });
20780
+ }
20781
+ }
20710
20782
  remove() {
20711
20783
  try {
20712
20784
  rmSync(this.file, { force: true });
@@ -20721,8 +20793,8 @@ var SessionStore = class {
20721
20793
  while (true) {
20722
20794
  const watcher = watch(this.directory);
20723
20795
  let timer;
20724
- const changed = new Promise((resolve3, reject) => {
20725
- watcher.once("change", () => resolve3());
20796
+ const changed = new Promise((resolve4, reject) => {
20797
+ watcher.once("change", () => resolve4());
20726
20798
  watcher.once("error", () => reject(new ArtiumError("SESSION_STORAGE_UNAVAILABLE")));
20727
20799
  timer = setTimeout(() => reject(new ArtiumError("SESSION_BUSY")), Math.max(0, deadline - Date.now()));
20728
20800
  });
@@ -20751,11 +20823,14 @@ var SessionStore = class {
20751
20823
  var DEFAULT_REQUEST_DEADLINE_MS = 9e4;
20752
20824
  var Client = class {
20753
20825
  constructor(environment = process.env, managed2, requestDeadlineMs = DEFAULT_REQUEST_DEADLINE_MS) {
20754
- this.environment = environment;
20755
20826
  this.managed = managed2;
20756
20827
  this.requestDeadlineMs = requestDeadlineMs;
20757
20828
  try {
20758
- const url2 = new URL(environment.ARTIUM_AXI_URL);
20829
+ const config2 = !managed2 && (environment.ARTIUM_AXI_URL === void 0 || environment.ARTIUM_AXI_CA_FILE === void 0) ? readClientConfig(environment) : void 0;
20830
+ this.serverUrlSource = environment.ARTIUM_AXI_URL === void 0 ? "config.json" : "ARTIUM_AXI_URL";
20831
+ const caFile = environment.ARTIUM_AXI_CA_FILE ?? config2?.caFile;
20832
+ this.caFile = caFile ? resolve(caFile) : void 0;
20833
+ const url2 = new URL(environment.ARTIUM_AXI_URL ?? config2?.serverUrl ?? "");
20759
20834
  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();
20760
20835
  this.serverUrl = url2.href.replace(/\/$/, "");
20761
20836
  if (!managed2) this.storedSessions = new SessionStore(this.serverUrl, sessionPath(process.platform, environment));
@@ -20765,21 +20840,22 @@ var Client = class {
20765
20840
  }
20766
20841
  managed2?.checkServer(this.serverUrl);
20767
20842
  }
20768
- environment;
20769
20843
  managed;
20770
20844
  requestDeadlineMs;
20771
20845
  serverUrl;
20846
+ serverUrlSource;
20847
+ caFile;
20772
20848
  storedSessions;
20773
20849
  get sessions() {
20774
20850
  if (!this.storedSessions) throw new ArtiumError("INVALID_INPUT", "Session-file operations are unavailable in managed mode.");
20775
20851
  return this.storedSessions;
20776
20852
  }
20777
20853
  certificateVerified = false;
20778
- async request(path, method, input2, token) {
20854
+ async request(path, method, input2, token, bytes = false) {
20779
20855
  this.certificateVerified = false;
20780
20856
  let ca;
20781
20857
  try {
20782
- if (this.environment.ARTIUM_AXI_CA_FILE) ca = [...rootCertificates, readFileSync2(this.environment.ARTIUM_AXI_CA_FILE, "utf8")];
20858
+ if (this.caFile) ca = [...rootCertificates, readFileSync2(this.caFile, "utf8")];
20783
20859
  } catch {
20784
20860
  throw new ArtiumError("CLIENT_CONFIG_INVALID");
20785
20861
  }
@@ -20787,7 +20863,7 @@ var Client = class {
20787
20863
  const controller = new AbortController();
20788
20864
  const deadline = setTimeout(() => controller.abort(), this.requestDeadlineMs);
20789
20865
  const url2 = new URL(`${this.serverUrl}${path}`);
20790
- const result = await new Promise((resolve3, reject) => {
20866
+ const result = await new Promise((resolve4, reject) => {
20791
20867
  const request = (url2.protocol === "https:" ? httpsRequest : httpRequest)(url2, {
20792
20868
  method,
20793
20869
  ca,
@@ -20805,9 +20881,9 @@ var Client = class {
20805
20881
  response.on("error", () => reject(new ArtiumError("SERVER_UNAVAILABLE")));
20806
20882
  response.on("end", () => {
20807
20883
  try {
20808
- resolve3({
20884
+ resolve4({
20809
20885
  status: response.statusCode,
20810
- body: response.statusCode === 204 ? void 0 : JSON.parse(Buffer.concat(chunks).toString("utf8")),
20886
+ body: bytes ? Buffer.concat(chunks) : response.statusCode === 204 ? void 0 : JSON.parse(Buffer.concat(chunks).toString("utf8")),
20811
20887
  serverVersion: typeof response.headers["x-artium-cli-version"] === "string" ? response.headers["x-artium-cli-version"] : void 0
20812
20888
  });
20813
20889
  } catch {
@@ -20843,7 +20919,7 @@ var Client = class {
20843
20919
  if (result.status !== 200 && result.status !== 204) throw new ArtiumError("INVALID_RESPONSE");
20844
20920
  if ((path === "/v1/auth/login" || path === "/v1/auth/device") && result.serverVersion && result.serverVersion !== cliVersion) {
20845
20921
  const version2 = result.serverVersion.replace(/[\x00-\x1f\x7f]/g, "");
20846
- 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}.
20922
+ const warning = `warning: CLI ${cliVersion} differs from server ${version2}; run artium-axi update, or run npm install -g @knowttl/artium-axi@${version2}.
20847
20923
  `;
20848
20924
  if (this.managed) this.managed.write("stderr", warning);
20849
20925
  else process.stderr.write(warning);
@@ -20917,13 +20993,13 @@ async function readPassword(stdin, environmentVariable) {
20917
20993
  process.stdin.setRawMode(true);
20918
20994
  process.stdin.resume();
20919
20995
  try {
20920
- return await new Promise((resolve3, reject) => {
20996
+ return await new Promise((resolve4, reject) => {
20921
20997
  let password = "";
20922
20998
  const keypress = (text2, key) => {
20923
20999
  if (key.name === "return" || key.ctrl && key.name === "c") {
20924
21000
  process.stdin.off("keypress", keypress);
20925
21001
  if (key.ctrl) reject(new ArtiumError("CANCELLED"));
20926
- else resolve3(password);
21002
+ else resolve4(password);
20927
21003
  } else if (key.name === "backspace") password = Array.from(password).slice(0, -1).join("");
20928
21004
  else if (text2 && !key.ctrl && !new RegExp("\\p{Cc}", "u").test(text2)) password += text2;
20929
21005
  };
@@ -20937,82 +21013,17 @@ async function readPassword(stdin, environmentVariable) {
20937
21013
  }
20938
21014
  }
20939
21015
 
20940
- // src/cli/doctor.ts
20941
- var DIAGNOSTIC_REQUEST_DEADLINE_MS = 5e3;
20942
- async function doctor(createClient = (deadline) => new Client(process.env, void 0, deadline), write = (text2) => {
20943
- process.stdout.write(text2);
20944
- }) {
20945
- let failure2;
20946
- const line = (name, pass, detail, error62) => {
20947
- if (!pass) failure2 ??= error62 ?? new ArtiumError("INVALID_RESPONSE");
20948
- write(`${pass ? "pass" : "fail"}: ${name}${detail ? ` (${detail})` : ""}
20949
- `);
20950
- };
20951
- let client;
20952
- try {
20953
- client = createClient(DIAGNOSTIC_REQUEST_DEADLINE_MS);
20954
- } catch (error62) {
20955
- for (const name of ["server address", "certificate", "token", "CLI version"]) line(name, false, "CLIENT_CONFIG_INVALID");
20956
- throw error62;
20957
- }
20958
- let addressOk = false;
20959
- try {
20960
- const live = await client.request("/health/live", "GET");
20961
- addressOk = !!live && typeof live === "object" && "status" in live && live.status === "ok";
20962
- line("server address", addressOk);
20963
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : "test HTTP", new ArtiumError("CLIENT_CONFIG_INVALID"));
20964
- } catch (error62) {
20965
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20966
- line("server address", cause.code === "CERTIFICATE_INVALID", cause.code, cause);
20967
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : cause.code, cause);
20968
- }
20969
- if (!addressOk && failure2) throw failure2;
20970
- let versionOk = true;
20971
- let versionError;
20972
- try {
20973
- await client.request("/v1/me", "GET");
20974
- } catch (error62) {
20975
- versionOk = error62 instanceof ArtiumError && error62.code === "TOKEN_INVALID";
20976
- if (!versionOk) versionError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20977
- }
20978
- let tokenOk = false;
20979
- let tokenError;
20980
- try {
20981
- tokenOk = meResponseSchema.safeParse(await client.authenticated("/v1/me", "GET")).success;
20982
- } catch (error62) {
20983
- tokenError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20984
- }
20985
- line("token", tokenOk, void 0, tokenError);
20986
- line("CLI version", versionOk, void 0, versionError);
20987
- if (tokenOk && versionOk) {
20988
- try {
20989
- const parsed = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET"));
20990
- if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
20991
- for (const tool of parsed.data.tools) line(
20992
- tool.name,
20993
- tool.status === "ok",
20994
- tool.status,
20995
- new ArtiumError(tool.status === "unconfigured" ? "CREDENTIAL_NOT_CONFIGURED" : tool.status === "error" ? "TOOL_FAILED" : tool.status === "disabled" ? "TOOL_DISABLED" : "SERVER_UNAVAILABLE")
20996
- );
20997
- } catch (error62) {
20998
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20999
- line("tools", false, cause.code, cause);
21000
- }
21001
- }
21002
- if (failure2) throw failure2;
21003
- }
21004
-
21005
21016
  // tools/inventories/falcon-axi.json
21006
21017
  var falcon_axi_default = {
21007
21018
  generatedBy: "scripts/falcon-inventory.mjs",
21008
21019
  tool: "falcon-axi",
21009
21020
  repository: "https://github.com/knowttl/falcon-axi.git",
21010
- tag: "v0.5.0",
21011
- commit: "2676743a997442e50cef570fc406ca38a5943833",
21012
- version: "0.5.0",
21021
+ tag: "v0.5.1",
21022
+ commit: "b595b500681eee476ddeb2d8d459bb9f8ad2125f",
21023
+ version: "0.5.1",
21013
21024
  parser: {
21014
21025
  path: "falcon_axi/cli.py",
21015
- sha256: "ca8e5abef2ff056cf5cd08c37a5282851f5f858cf7a19feeae78ab1111ab95db",
21026
+ sha256: "2f7ee1d6601dafb63e5e40cc3b1fe28b295f67f7da2f9e23e747cca644caa09d",
21016
21027
  aliases: {},
21017
21028
  shortFlags: {},
21018
21029
  repeats: "last value wins",
@@ -21633,7 +21644,8 @@ var falcon_axi_default = {
21633
21644
  profile: "value",
21634
21645
  query: "value",
21635
21646
  repository: "value",
21636
- since: "value"
21647
+ since: "value",
21648
+ wait: "value"
21637
21649
  },
21638
21650
  input: "No file or raw URL input; cursors and queries remain native values"
21639
21651
  },
@@ -21647,7 +21659,8 @@ var falcon_axi_default = {
21647
21659
  "no-member-cid": "boolean",
21648
21660
  config: "value",
21649
21661
  profile: "value",
21650
- repository: "value"
21662
+ repository: "value",
21663
+ wait: "value"
21651
21664
  },
21652
21665
  input: "No file or raw URL input; cursors and queries remain native values"
21653
21666
  },
@@ -22478,10 +22491,10 @@ var falcon_axi_default = {
22478
22491
  var vectra_axi_default = {
22479
22492
  generatedBy: "scripts/upstream-inventory.mjs",
22480
22493
  tool: "vectra-axi",
22481
- version: "0.1.7",
22482
- integrity: "sha512-7gop8tQkTohKKoldYuHZ9Kz2Eq/vQNBqW0OZV8HLSPEKc3OVhdFt00osRb1kwRjB1h1Vr/ku0H0IWoKOxxticQ==",
22494
+ version: "0.1.8",
22495
+ integrity: "sha512-Wvn73g5hm4mzQQKhNnKvAjt6SfGFrPD2EAYMa4AXhoVqFfjXjxnQLk6tUw7E92jozeHtpZ+aDXSGMHaJhhTi1Q==",
22483
22496
  parserEvidence: "Installed pinned catalogue exports, provisional until adapter acceptance",
22484
- packageManifestSha256: "f9c6cbae6a861654398dd30d830ec5b048fad34f8b6bd5f8157dcf8a5cd3ed7e",
22497
+ packageManifestSha256: "0e2e4e616e06435582fcd96787a2088f7fda5b0b99c32daa4d6c7dc8c2b2f3fb",
22485
22498
  environment: [
22486
22499
  {
22487
22500
  name: "VECTRA_AXI_CONFIG",
@@ -22547,6 +22560,38 @@ var vectra_axi_default = {
22547
22560
  nativeWriteSettings: {
22548
22561
  default: "disabled",
22549
22562
  disposition: "server-owned",
22563
+ supportedOperations: [
22564
+ "qux.account.assignment.create",
22565
+ "qux.account.assignment.reassign",
22566
+ "qux.account.assignment.unassign",
22567
+ "qux.account.note.add",
22568
+ "qux.account.note.delete",
22569
+ "qux.account.note.edit",
22570
+ "qux.account.tag.bulk-delete",
22571
+ "qux.account.tag.bulk-set",
22572
+ "qux.account.tag.set",
22573
+ "qux.detection.note.add",
22574
+ "qux.detection.note.delete",
22575
+ "qux.detection.note.edit",
22576
+ "qux.detection.tag.bulk-delete",
22577
+ "qux.detection.tag.bulk-set",
22578
+ "qux.detection.tag.set",
22579
+ "qux.host.assignment.create",
22580
+ "qux.host.assignment.reassign",
22581
+ "qux.host.assignment.unassign",
22582
+ "qux.host.note.add",
22583
+ "qux.host.note.delete",
22584
+ "qux.host.note.edit",
22585
+ "qux.host.tag.bulk-delete",
22586
+ "qux.host.tag.bulk-set",
22587
+ "qux.host.tag.set",
22588
+ "rux.account.note.delete",
22589
+ "rux.account.note.edit",
22590
+ "rux.detection.note.delete",
22591
+ "rux.detection.note.edit",
22592
+ "rux.host.note.delete",
22593
+ "rux.host.note.edit"
22594
+ ],
22550
22595
  profileFields: {
22551
22596
  "writes.allowWrites": "boolean",
22552
22597
  "writes.operations": "string[]"
@@ -22598,12 +22643,13 @@ var vectra_axi_default = {
22598
22643
  help: {
22599
22644
  command: "vectra-axi detection list",
22600
22645
  description: "List detections on QUX v2.5 or RUX v3.4 with server-side filters and a bounded window",
22646
+ pagination: "QUX: collection pages; bounded --all supported; RUX: collection pages; bounded --all supported",
22601
22647
  flags: {
22602
22648
  "--help": "Show concise help; default false",
22603
22649
  "--state <state>": "Filter by server-side detection state",
22604
22650
  "--detection-type <type>": "Filter by server-side detection type",
22605
22651
  "--detection-category <category>": "Filter by server-side detection category",
22606
- "--host-id <id>": "Filter by server-side host ID (non-negative integer)",
22652
+ "--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>",
22607
22653
  "--tags <tags>": "Filter by server-side tags",
22608
22654
  "--certainty-gte <score>": "Filter by server-side minimum certainty",
22609
22655
  "--threat-gte <score>": "Filter by server-side minimum threat",
@@ -22611,7 +22657,7 @@ var vectra_axi_default = {
22611
22657
  "--min-id <id>": "Server-side minimum detection ID (non-negative integer)",
22612
22658
  "--max-id <id>": "Server-side maximum detection ID (non-negative integer)",
22613
22659
  "--limit <rows>": "Row window for this read; default 100",
22614
- "--fields <list>": "Comma-separated projection over id,detection_type,state,threat,certainty",
22660
+ "--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",
22615
22661
  "--all": "Traverse pages within 10 requests, 8 MiB, 60 seconds and 10000 rows; cannot combine with --limit",
22616
22662
  "--cursor <cursor>": "Resume a capped list with its original filters"
22617
22663
  },
@@ -22643,7 +22689,7 @@ var vectra_axi_default = {
22643
22689
  },
22644
22690
  source: {
22645
22691
  path: "dist/src/catalogue.js",
22646
- sha256: "9c0a3783a91fb0fd4c2a2f4df00e477b8abdc3ea3cefe80dc20e98b4cebf55fd"
22692
+ sha256: "5fadea660c71fb4021a4c130699ae3883c54e801c8e3eb6c3f370a10b0a04930"
22647
22693
  }
22648
22694
  },
22649
22695
  flags: [
@@ -22974,6 +23020,7 @@ var vectra_axi_default = {
22974
23020
  profile: "value",
22975
23021
  config: "value",
22976
23022
  id: "value",
23023
+ fields: "value",
22977
23024
  full: "boolean"
22978
23025
  }
22979
23026
  },
@@ -22996,6 +23043,7 @@ var vectra_axi_default = {
22996
23043
  help: "boolean",
22997
23044
  profile: "value",
22998
23045
  config: "value",
23046
+ name: "value",
22999
23047
  "threat-gte": "value",
23000
23048
  "certainty-gte": "value",
23001
23049
  tags: "value",
@@ -23403,6 +23451,7 @@ var vectra_axi_default = {
23403
23451
  help: "boolean",
23404
23452
  profile: "value",
23405
23453
  config: "value",
23454
+ all: "boolean",
23406
23455
  account: "value",
23407
23456
  host: "value",
23408
23457
  assignee: "value",
@@ -23435,6 +23484,7 @@ var vectra_axi_default = {
23435
23484
  help: "boolean",
23436
23485
  profile: "value",
23437
23486
  config: "value",
23487
+ all: "boolean",
23438
23488
  limit: "value",
23439
23489
  fields: "value",
23440
23490
  cursor: "value"
@@ -23455,6 +23505,7 @@ var vectra_axi_default = {
23455
23505
  help: "boolean",
23456
23506
  profile: "value",
23457
23507
  config: "value",
23508
+ all: "boolean",
23458
23509
  username: "value",
23459
23510
  limit: "value",
23460
23511
  fields: "value",
@@ -23491,6 +23542,7 @@ var vectra_axi_default = {
23491
23542
  help: "boolean",
23492
23543
  profile: "value",
23493
23544
  config: "value",
23545
+ all: "boolean",
23494
23546
  name: "value",
23495
23547
  type: "value",
23496
23548
  limit: "value",
@@ -23513,6 +23565,7 @@ var vectra_axi_default = {
23513
23565
  help: "boolean",
23514
23566
  profile: "value",
23515
23567
  config: "value",
23568
+ all: "boolean",
23516
23569
  id: "value",
23517
23570
  name: "value",
23518
23571
  ordering: "value",
@@ -23528,6 +23581,7 @@ var vectra_axi_default = {
23528
23581
  help: "boolean",
23529
23582
  profile: "value",
23530
23583
  config: "value",
23584
+ all: "boolean",
23531
23585
  contains: "value",
23532
23586
  ordering: "value",
23533
23587
  limit: "value",
@@ -23612,727 +23666,6 @@ var vectra_axi_default = {
23612
23666
  ]
23613
23667
  };
23614
23668
 
23615
- // tools/inventories/ldap-axi.json
23616
- var ldap_axi_default = {
23617
- generatedBy: "scripts/ldap-inventory.mjs",
23618
- tool: "ldap-axi",
23619
- version: "0.2.0",
23620
- integrity: "sha512-w/gE4jHaUHE0iKh3ucDnDG0AVrhP0VwpFCEcw3wSTzLmTBMNZrJ9AFB06j2jnf4TFgK5+5NhF0EE0R69mv7crA==",
23621
- parserEvidence: "Installed pinned command schemas and reviewed CLI globals and entry routes",
23622
- sources: [
23623
- {
23624
- path: "package.json",
23625
- sha256: "7ee133bf0333fe975c905418c9ecdd542836dab39f52aa5f7f630776d2bcc0b0"
23626
- },
23627
- {
23628
- path: "README.md",
23629
- sha256: "3a1eeda8c376c39853e4835acf2a1d61f76f23a555651417d0d691459fbb3139"
23630
- },
23631
- {
23632
- path: "axi-credential.schema.json",
23633
- sha256: "76b9f5f449d844dcd4365b966ed907515582f72fc920b936dae825ebf1b7cc53"
23634
- },
23635
- {
23636
- path: "dist/src/cli.js",
23637
- sha256: "2cb024b2848c2c9e27c292205b3ed86a829cfed21d52e8fea06ef544a039ec2a"
23638
- },
23639
- {
23640
- path: "dist/src/schema.js",
23641
- sha256: "0d5946fa26efb55e8480e9a22f93cdb6b321c48697e77ca02c4c99630f11284f"
23642
- },
23643
- {
23644
- path: "dist/src/config.js",
23645
- sha256: "cbc48584b6ff2a2a70375e9e8e6242a87543a3e6e6f7e1c055a2d29c42b677f9"
23646
- },
23647
- {
23648
- path: "dist/src/secrets.js",
23649
- sha256: "9f2ccf86515cec1dd65f2dd5850188232374535f7fe56a788fdc7b94d91c8532"
23650
- },
23651
- {
23652
- path: "dist/src/directory/auth.js",
23653
- sha256: "d2b3a61cb9e63744462e3a6a2841fcddb2b48e7823c307841028288cfe9d688b"
23654
- },
23655
- {
23656
- path: "dist/src/directory/policy.js",
23657
- sha256: "a697dd78990493f7f1c19d22278ebb922c997e9cf88a51b12adfaca30fa8a01d"
23658
- }
23659
- ],
23660
- credentialSchema: {
23661
- $schema: "https://json-schema.org/draft/2020-12/schema",
23662
- title: "ldap-axi profile",
23663
- type: "object",
23664
- additionalProperties: false,
23665
- required: [
23666
- "url"
23667
- ],
23668
- properties: {
23669
- url: {
23670
- type: "string",
23671
- pattern: "^ldaps?://",
23672
- description: "LDAP URL without userinfo; use the server FQDN for ambient authentication"
23673
- },
23674
- auth: {
23675
- enum: [
23676
- "auto",
23677
- "gssapi",
23678
- "simple"
23679
- ],
23680
- default: "auto"
23681
- },
23682
- bindDn: {
23683
- type: "string",
23684
- minLength: 1,
23685
- description: "Simple-bind identity, required for simple authentication"
23686
- },
23687
- bindPassword: {
23688
- "x-secret": true,
23689
- description: "Simple-bind password reference; defaults to env LDAP_AXI_BIND_PASSWORD. No stored secrets.",
23690
- oneOf: [
23691
- {
23692
- type: "object",
23693
- additionalProperties: false,
23694
- required: [
23695
- "env"
23696
- ],
23697
- properties: {
23698
- env: {
23699
- type: "string",
23700
- pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
23701
- }
23702
- }
23703
- },
23704
- {
23705
- type: "object",
23706
- additionalProperties: false,
23707
- required: [
23708
- "file"
23709
- ],
23710
- properties: {
23711
- file: {
23712
- type: "string",
23713
- pattern: "^(?:/|[A-Za-z]:[\\\\/])",
23714
- description: "Absolute local path to a private UTF-8 password file; UNC/device paths are forbidden on Windows"
23715
- }
23716
- }
23717
- }
23718
- ]
23719
- },
23720
- base: {
23721
- type: "string"
23722
- },
23723
- pageSize: {
23724
- type: "integer",
23725
- minimum: 1,
23726
- maximum: 1e3
23727
- },
23728
- caFile: {
23729
- type: "string",
23730
- minLength: 1
23731
- },
23732
- startTls: {
23733
- type: "boolean",
23734
- default: false
23735
- },
23736
- tlsMaxVersion: {
23737
- const: "1.2"
23738
- },
23739
- flavor: {
23740
- enum: [
23741
- "ad",
23742
- "adlds",
23743
- "ldapv3"
23744
- ]
23745
- },
23746
- gssapiService: {
23747
- type: "string",
23748
- minLength: 1
23749
- },
23750
- gssapiProtection: {
23751
- enum: [
23752
- "none",
23753
- "confidentiality"
23754
- ]
23755
- }
23756
- }
23757
- },
23758
- adapterBoundary: {
23759
- unsafeOverrides: [
23760
- "config",
23761
- "url",
23762
- "start-tls",
23763
- "ca-file",
23764
- "ca-only",
23765
- "tls-no-verify",
23766
- "tls-max-version",
23767
- "insecure-plaintext",
23768
- "anonymous",
23769
- "profile",
23770
- "auth",
23771
- "gssapi-service",
23772
- "gssapi-protection"
23773
- ],
23774
- blockedCommands: [
23775
- "config",
23776
- "profile",
23777
- "setup"
23778
- ],
23779
- sensitiveFlags: [
23780
- "base",
23781
- "filter",
23782
- "name",
23783
- "sam",
23784
- "upn",
23785
- "uid"
23786
- ],
23787
- authentication: "Stored simple-bind identity over verified LDAPS or StartTLS; no ambient ticket or keytab",
23788
- inputs: {
23789
- stdin: "unsupported",
23790
- files: "unsupported",
23791
- caFile: "stored PEM materialized privately by host"
23792
- },
23793
- resources: {
23794
- nodeHeapMiB: 128
23795
- },
23796
- nativeWrites: "read-only upstream design"
23797
- },
23798
- discovery: {
23799
- commands: [
23800
- "entry",
23801
- "user",
23802
- "group",
23803
- "computer",
23804
- "auth status",
23805
- "server"
23806
- ],
23807
- example: [
23808
- "user",
23809
- "list",
23810
- "--limit",
23811
- "1"
23812
- ],
23813
- 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"
23814
- },
23815
- suggestionFields: [
23816
- "help"
23817
- ],
23818
- format: "TOON",
23819
- commands: [
23820
- {
23821
- command: "home",
23822
- flags: {
23823
- help: "boolean",
23824
- config: "value",
23825
- url: "value",
23826
- base: "value",
23827
- "start-tls": "boolean",
23828
- "ca-file": "value",
23829
- "ca-only": "boolean",
23830
- "tls-no-verify": "boolean",
23831
- "tls-max-version": "value",
23832
- "insecure-plaintext": "boolean",
23833
- anonymous: "boolean",
23834
- profile: "value",
23835
- auth: "value",
23836
- "gssapi-service": "value",
23837
- "gssapi-protection": "value"
23838
- },
23839
- positionalInput: false
23840
- },
23841
- {
23842
- command: "auth status",
23843
- flags: {
23844
- help: "boolean",
23845
- config: "value",
23846
- url: "value",
23847
- base: "value",
23848
- "start-tls": "boolean",
23849
- "ca-file": "value",
23850
- "ca-only": "boolean",
23851
- "tls-no-verify": "boolean",
23852
- "tls-max-version": "value",
23853
- "insecure-plaintext": "boolean",
23854
- anonymous: "boolean",
23855
- profile: "value",
23856
- auth: "value",
23857
- "gssapi-service": "value",
23858
- "gssapi-protection": "value",
23859
- offline: "boolean"
23860
- },
23861
- positionalInput: false
23862
- },
23863
- {
23864
- command: "server",
23865
- flags: {
23866
- help: "boolean",
23867
- config: "value",
23868
- url: "value",
23869
- base: "value",
23870
- "start-tls": "boolean",
23871
- "ca-file": "value",
23872
- "ca-only": "boolean",
23873
- "tls-no-verify": "boolean",
23874
- "tls-max-version": "value",
23875
- "insecure-plaintext": "boolean",
23876
- anonymous: "boolean",
23877
- profile: "value",
23878
- auth: "value",
23879
- "gssapi-service": "value",
23880
- "gssapi-protection": "value"
23881
- },
23882
- positionalInput: false
23883
- },
23884
- {
23885
- command: "entry search",
23886
- flags: {
23887
- help: "boolean",
23888
- config: "value",
23889
- url: "value",
23890
- base: "value",
23891
- "start-tls": "boolean",
23892
- "ca-file": "value",
23893
- "ca-only": "boolean",
23894
- "tls-no-verify": "boolean",
23895
- "tls-max-version": "value",
23896
- "insecure-plaintext": "boolean",
23897
- anonymous: "boolean",
23898
- profile: "value",
23899
- auth: "value",
23900
- "gssapi-service": "value",
23901
- "gssapi-protection": "value",
23902
- filter: "value",
23903
- scope: "value",
23904
- attributes: "value",
23905
- "page-size": "value",
23906
- "max-rows": "value",
23907
- all: "boolean"
23908
- },
23909
- positionalInput: false
23910
- },
23911
- {
23912
- command: "entry show",
23913
- flags: {
23914
- help: "boolean",
23915
- config: "value",
23916
- url: "value",
23917
- base: "value",
23918
- "start-tls": "boolean",
23919
- "ca-file": "value",
23920
- "ca-only": "boolean",
23921
- "tls-no-verify": "boolean",
23922
- "tls-max-version": "value",
23923
- "insecure-plaintext": "boolean",
23924
- anonymous: "boolean",
23925
- profile: "value",
23926
- auth: "value",
23927
- "gssapi-service": "value",
23928
- "gssapi-protection": "value",
23929
- attributes: "value",
23930
- "page-size": "value"
23931
- },
23932
- positionalInput: true
23933
- },
23934
- {
23935
- command: "user list",
23936
- flags: {
23937
- help: "boolean",
23938
- config: "value",
23939
- url: "value",
23940
- base: "value",
23941
- "start-tls": "boolean",
23942
- "ca-file": "value",
23943
- "ca-only": "boolean",
23944
- "tls-no-verify": "boolean",
23945
- "tls-max-version": "value",
23946
- "insecure-plaintext": "boolean",
23947
- anonymous: "boolean",
23948
- profile: "value",
23949
- auth: "value",
23950
- "gssapi-service": "value",
23951
- "gssapi-protection": "value",
23952
- disabled: "boolean",
23953
- enabled: "boolean",
23954
- locked: "boolean",
23955
- all: "boolean",
23956
- name: "value",
23957
- sam: "value",
23958
- upn: "value",
23959
- uid: "value",
23960
- filter: "value",
23961
- scope: "value",
23962
- "max-rows": "value",
23963
- "page-size": "value",
23964
- limit: "value",
23965
- fields: "value",
23966
- attributes: "value"
23967
- },
23968
- positionalInput: false
23969
- },
23970
- {
23971
- command: "user show",
23972
- flags: {
23973
- help: "boolean",
23974
- config: "value",
23975
- url: "value",
23976
- base: "value",
23977
- "start-tls": "boolean",
23978
- "ca-file": "value",
23979
- "ca-only": "boolean",
23980
- "tls-no-verify": "boolean",
23981
- "tls-max-version": "value",
23982
- "insecure-plaintext": "boolean",
23983
- anonymous: "boolean",
23984
- profile: "value",
23985
- auth: "value",
23986
- "gssapi-service": "value",
23987
- "gssapi-protection": "value",
23988
- fields: "value",
23989
- attributes: "value"
23990
- },
23991
- positionalInput: true
23992
- },
23993
- {
23994
- command: "user groups",
23995
- flags: {
23996
- help: "boolean",
23997
- config: "value",
23998
- url: "value",
23999
- base: "value",
24000
- "start-tls": "boolean",
24001
- "ca-file": "value",
24002
- "ca-only": "boolean",
24003
- "tls-no-verify": "boolean",
24004
- "tls-max-version": "value",
24005
- "insecure-plaintext": "boolean",
24006
- anonymous: "boolean",
24007
- profile: "value",
24008
- auth: "value",
24009
- "gssapi-service": "value",
24010
- "gssapi-protection": "value",
24011
- nested: "boolean",
24012
- "max-rows": "value",
24013
- "page-size": "value",
24014
- fields: "value"
24015
- },
24016
- positionalInput: true
24017
- },
24018
- {
24019
- command: "group list",
24020
- flags: {
24021
- help: "boolean",
24022
- config: "value",
24023
- url: "value",
24024
- base: "value",
24025
- "start-tls": "boolean",
24026
- "ca-file": "value",
24027
- "ca-only": "boolean",
24028
- "tls-no-verify": "boolean",
24029
- "tls-max-version": "value",
24030
- "insecure-plaintext": "boolean",
24031
- anonymous: "boolean",
24032
- profile: "value",
24033
- auth: "value",
24034
- "gssapi-service": "value",
24035
- "gssapi-protection": "value",
24036
- all: "boolean",
24037
- name: "value",
24038
- sam: "value",
24039
- filter: "value",
24040
- scope: "value",
24041
- "max-rows": "value",
24042
- "page-size": "value",
24043
- limit: "value",
24044
- fields: "value",
24045
- attributes: "value"
24046
- },
24047
- positionalInput: false
24048
- },
24049
- {
24050
- command: "group show",
24051
- flags: {
24052
- help: "boolean",
24053
- config: "value",
24054
- url: "value",
24055
- base: "value",
24056
- "start-tls": "boolean",
24057
- "ca-file": "value",
24058
- "ca-only": "boolean",
24059
- "tls-no-verify": "boolean",
24060
- "tls-max-version": "value",
24061
- "insecure-plaintext": "boolean",
24062
- anonymous: "boolean",
24063
- profile: "value",
24064
- auth: "value",
24065
- "gssapi-service": "value",
24066
- "gssapi-protection": "value",
24067
- fields: "value",
24068
- attributes: "value"
24069
- },
24070
- positionalInput: true
24071
- },
24072
- {
24073
- command: "group members",
24074
- flags: {
24075
- help: "boolean",
24076
- config: "value",
24077
- url: "value",
24078
- base: "value",
24079
- "start-tls": "boolean",
24080
- "ca-file": "value",
24081
- "ca-only": "boolean",
24082
- "tls-no-verify": "boolean",
24083
- "tls-max-version": "value",
24084
- "insecure-plaintext": "boolean",
24085
- anonymous: "boolean",
24086
- profile: "value",
24087
- auth: "value",
24088
- "gssapi-service": "value",
24089
- "gssapi-protection": "value",
24090
- nested: "boolean",
24091
- "max-rows": "value",
24092
- "page-size": "value",
24093
- fields: "value"
24094
- },
24095
- positionalInput: true
24096
- },
24097
- {
24098
- command: "computer list",
24099
- flags: {
24100
- help: "boolean",
24101
- config: "value",
24102
- url: "value",
24103
- base: "value",
24104
- "start-tls": "boolean",
24105
- "ca-file": "value",
24106
- "ca-only": "boolean",
24107
- "tls-no-verify": "boolean",
24108
- "tls-max-version": "value",
24109
- "insecure-plaintext": "boolean",
24110
- anonymous: "boolean",
24111
- profile: "value",
24112
- auth: "value",
24113
- "gssapi-service": "value",
24114
- "gssapi-protection": "value",
24115
- all: "boolean",
24116
- name: "value",
24117
- sam: "value",
24118
- filter: "value",
24119
- scope: "value",
24120
- "max-rows": "value",
24121
- "page-size": "value",
24122
- limit: "value",
24123
- fields: "value",
24124
- attributes: "value"
24125
- },
24126
- positionalInput: false
24127
- },
24128
- {
24129
- command: "computer show",
24130
- flags: {
24131
- help: "boolean",
24132
- config: "value",
24133
- url: "value",
24134
- base: "value",
24135
- "start-tls": "boolean",
24136
- "ca-file": "value",
24137
- "ca-only": "boolean",
24138
- "tls-no-verify": "boolean",
24139
- "tls-max-version": "value",
24140
- "insecure-plaintext": "boolean",
24141
- anonymous: "boolean",
24142
- profile: "value",
24143
- auth: "value",
24144
- "gssapi-service": "value",
24145
- "gssapi-protection": "value",
24146
- fields: "value",
24147
- attributes: "value"
24148
- },
24149
- positionalInput: true
24150
- }
24151
- ]
24152
- };
24153
-
24154
- // src/cli/help.ts
24155
- var commands = {
24156
- 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" },
24157
- setup: {
24158
- usage: "artium-axi setup --host <claude|codex|opencode|pi> [--hook] [--force]",
24159
- purpose: "Install skills for your signed-in account\u2019s granted tools and an optional Claude Code session hook.",
24160
- flags: ["--host <claude|codex|opencode|pi> (required)", "--hook (default false; Claude Code only)", "--force (default false; explicitly replace an edited skill)"],
24161
- example: "artium-axi setup --host claude --hook"
24162
- },
24163
- tools: { usage: "artium-axi tools", purpose: "List available tools with their status and pinned version.", flags: [], example: "artium-axi tools" },
24164
- "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" },
24165
- whoami: { usage: "artium-axi whoami", purpose: "Show your identity, roles, access expiry and server.", flags: [], example: "artium-axi whoami" },
24166
- login: {
24167
- usage: "artium-axi login --sso | --username <username> [--password-stdin]",
24168
- purpose: "Sign in through browser SSO (8-hour session) or with a local account.",
24169
- 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)"],
24170
- example: "artium-axi login --sso"
24171
- },
24172
- passwd: {
24173
- usage: "artium-axi passwd [--password-stdin]",
24174
- purpose: "Change your password, then sign in again.",
24175
- flags: ["--password-stdin (default false; otherwise a terminal prompt; current password uses ARTIUM_AXI_CURRENT_PASSWORD or a terminal prompt)"],
24176
- example: "artium-axi passwd --password-stdin"
24177
- },
24178
- logout: { usage: "artium-axi logout", purpose: "Remove local tokens and revoke the server session.", flags: [], example: "artium-axi logout" },
24179
- doctor: { usage: "artium-axi doctor", purpose: "Check the server, certificate, token, CLI version and cached tool health.", flags: [], example: "artium-axi doctor" },
24180
- "falcon-axi": {
24181
- usage: "artium-axi falcon-axi [<args>]",
24182
- purpose: "Run Falcon commands with your managed credentials.",
24183
- flags: ["Arguments after falcon-axi are forwarded upstream, including --help."],
24184
- example: `artium-axi falcon-axi ${falcon_axi_default.discovery.example.join(" ")}`
24185
- },
24186
- "vectra-axi": {
24187
- usage: "artium-axi vectra-axi [<args>]",
24188
- purpose: "Run Vectra commands with your managed credentials.",
24189
- flags: ["Arguments after vectra-axi are forwarded upstream, including --help."],
24190
- example: `artium-axi vectra-axi ${vectra_axi_default.discovery.example.join(" ")}`
24191
- },
24192
- "ldap-axi": {
24193
- usage: "artium-axi ldap-axi [<args>]",
24194
- purpose: "Read directory data with the managed LDAP bind identity.",
24195
- flags: ["Arguments after ldap-axi are forwarded upstream, including --help."],
24196
- example: `artium-axi ldap-axi ${ldap_axi_default.discovery.example.join(" ")}`
24197
- },
24198
- "ado-axi": {
24199
- usage: "artium-axi ado-axi [<args>]",
24200
- purpose: "Run Azure DevOps commands with managed credentials.",
24201
- flags: ["Arguments after ado-axi include --help. Organization and credentials are managed by Artium; api is GET only; writes are off by default."],
24202
- example: "artium-axi ado-axi project list --limit 1"
24203
- },
24204
- "awx-axi": {
24205
- usage: "artium-axi awx-axi [<args>]",
24206
- purpose: "Inspect AWX automation with managed credentials.",
24207
- flags: ["Arguments after awx-axi include --help. Operational writes are off by default; configuration, deletion and security writes are blocked."],
24208
- example: "artium-axi awx-axi job list --limit 1"
24209
- },
24210
- "az-axi": {
24211
- usage: "artium-axi az-axi [<args>]",
24212
- purpose: "Run Azure commands with your managed identity.",
24213
- flags: ["Arguments after az-axi are forwarded upstream, including --help."],
24214
- example: "artium-axi az-axi sub list"
24215
- },
24216
- "mg-axi": {
24217
- usage: "artium-axi mg-axi [<args>]",
24218
- purpose: "Run Microsoft Graph commands with your managed identity.",
24219
- flags: ["Arguments after mg-axi are forwarded upstream, including --help."],
24220
- example: "artium-axi mg-axi entra user list"
24221
- },
24222
- "managed-session": {
24223
- usage: "artium-axi --managed-session <command> [<args>]",
24224
- purpose: "Let a caller supply and persist sessions through private pipes.",
24225
- flags: [],
24226
- example: "artium-axi --managed-session whoami"
24227
- }
24228
- };
24229
- function commandHelp(command) {
24230
- const entry = commands[command];
24231
- const flags = [
24232
- toolSchema.safeParse(command).success ? "--help before the tool name (default false)" : "--help (default false)",
24233
- ...entry.flags,
24234
- "--managed-session before the command (default false; caller-owned sessions; see artium-axi --managed-session --help)"
24235
- ];
24236
- const protocol = [
24237
- "Session JSON on inherited pipe fd 3, new sessions and rotations as JSON lines on private pipe fd 4; no session file.",
24238
- "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.",
24239
- "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.",
24240
- "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."
24241
- ];
24242
- const purposes = command === "home" ? `commands[${Object.keys(commands).length - 2}]{command,purpose}:
24243
- ${Object.entries(commands).filter(([name]) => name !== "home" && name !== "managed-session").map(([name, value]) => ` ${name},${JSON.stringify(value.purpose)}`).join("\n")}
24244
- ` : "";
24245
- return `purpose: ${entry.purpose}
24246
- usage: ${entry.usage}
24247
- ${purposes}flags[${flags.length}]:
24248
- ${flags.map((flag) => ` - ${JSON.stringify(flag)}`).join("\n")}
24249
- example: ${entry.example}
24250
- ` + (command === "login" || command === "managed-session" ? `managedSession[${protocol.length}]:
24251
- ${protocol.map((line) => ` - ${JSON.stringify(line)}`).join("\n")}
24252
- ` : "");
24253
- }
24254
- function validateArguments(args, prefixHelp) {
24255
- const command = args[0];
24256
- if (command === "tools") args = [...args.filter((arg) => arg !== "--help"), ...args.filter((arg) => arg === "--help")];
24257
- const rootFlags = "--help, --version, --managed-session (before the command)";
24258
- const rootCommands = Object.keys(commands).filter((name) => name !== "home" && name !== "managed-session" && name !== "tools show").join(", ");
24259
- function fail(token, level2, choices2) {
24260
- const kind = token?.startsWith("-") ? "flag" : "argument";
24261
- 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}.`;
24262
- throw new ArtiumError("INVALID_INPUT", message, choices2);
24263
- }
24264
- if (!command) return;
24265
- if (command === "--version" && args.length === 1) return;
24266
- if (!Object.hasOwn(commands, command) || command === "home" || command === "managed-session" || command === "tools show") {
24267
- fail(command, "artium-axi", `Valid commands: ${rootCommands}. Valid flags: ${rootFlags}.`);
24268
- }
24269
- if (toolSchema.safeParse(command).success) {
24270
- if (prefixHelp && args.length > 1) fail(args[1], command, `Use artium-axi --help ${command} for local help; artium-axi ${command} --help for upstream flags.`);
24271
- return;
24272
- }
24273
- let level = command;
24274
- let start = 1;
24275
- if (command === "tools" && args[1] === "show") {
24276
- level = "tools show";
24277
- start = 2;
24278
- }
24279
- const entry = commands[level];
24280
- const validFlags = ["--help", ...entry.flags.map((flag) => flag.split(" ")[0])];
24281
- const choices = `Valid flags for ${level}: ${validFlags.join(", ")}.` + (level === "tools" ? " Valid subcommands: show <tool>." : level === "tools show" ? ` Valid tools: ${toolSchema.options.join(", ")}.` : "");
24282
- let tool = false;
24283
- const seen = /* @__PURE__ */ new Set();
24284
- for (let index = start; index < args.length; index++) {
24285
- const token = args[index];
24286
- if (level === "tools show" && !token.startsWith("-") && !tool) {
24287
- if (!toolSchema.safeParse(token).success) fail(token, level, choices);
24288
- tool = true;
24289
- } else {
24290
- if (!validFlags.includes(token) || seen.has(token)) fail(token, level, choices);
24291
- seen.add(token);
24292
- if (token === "--username" || token === "--host") {
24293
- const value = args[index + 1];
24294
- if (!value) fail(value, `${level} ${token}`, `Supply ${token} ${token === "--host" ? "<claude|codex|opencode|pi>" : "<username>"}. ${choices}`);
24295
- if (token === "--host" && !["claude", "codex", "opencode", "pi"].includes(value)) fail(value, `${level} --host`, `Valid hosts: claude, codex, opencode, pi. Use ${entry.usage}.`);
24296
- index++;
24297
- }
24298
- }
24299
- }
24300
- if (level === "tools show" && !tool && !seen.has("--help") && !prefixHelp) fail(void 0, level, choices);
24301
- }
24302
- function helpCommand(args, prefixHelp = false) {
24303
- if (args[0] === "setup" && args.includes("--help")) {
24304
- const path2 = args.filter((arg) => arg !== "--help");
24305
- for (let index = 1; index < path2.length; index++) {
24306
- if (path2[index] === "--host" && ["claude", "codex", "opencode", "pi"].includes(path2[index + 1])) index++;
24307
- else if (path2[index] !== "--hook" && path2[index] !== "--force") return void 0;
24308
- }
24309
- return "setup";
24310
- }
24311
- if (toolSchema.safeParse(args[0]).success) return prefixHelp && args.length === 2 ? args[0] : void 0;
24312
- if (args[0] === "login" || args[0] === "passwd") {
24313
- if (args[0] === "login" && args.length === 3 && args.includes("--sso") && args.includes("--help")) return "login";
24314
- let requested = false;
24315
- let username = false;
24316
- let stdin = false;
24317
- for (let index = 1; index < args.length; index++) {
24318
- const option = args[index];
24319
- if (option === "--username" && args[0] === "login" && !username && args[index + 1] !== void 0) {
24320
- username = true;
24321
- index++;
24322
- } else if (option === "--password-stdin" && !stdin) stdin = true;
24323
- else if (option === "--help" && !requested) requested = true;
24324
- else return void 0;
24325
- }
24326
- return requested ? args[0] : void 0;
24327
- }
24328
- if (!args.includes("--help")) return void 0;
24329
- const path = args.filter((arg) => arg !== "--help");
24330
- if (path.length === 0) return "home";
24331
- if (path[0] === "tools" && path[1] === "show" && (path.length === 2 || path.length === 3 && toolSchema.safeParse(path[2]).success)) return "tools show";
24332
- if (path.length === 1 && path[0] !== "home" && Object.hasOwn(commands, path[0])) return path[0];
24333
- return void 0;
24334
- }
24335
-
24336
23669
  // tools/inventories/az-axi.json
24337
23670
  var az_axi_default = {
24338
23671
  generatedBy: "scripts/upstream-inventory.mjs",
@@ -29065,6 +28398,13 @@ var mg_axi_default = {
29065
28398
  ],
29066
28399
  nativeWriteSettings: {
29067
28400
  default: "disabled",
28401
+ supportedOperations: [
28402
+ "entra.conditional-access.policy.update",
28403
+ "entra.risky-user.dismiss",
28404
+ "entra.user.revokeSessions",
28405
+ "entra.user.update",
28406
+ "mg.entra.group.member.add"
28407
+ ],
29068
28408
  profileFields: {
29069
28409
  "writes.allowWrites": "boolean",
29070
28410
  "writes.operations": "string[]"
@@ -33641,171 +32981,710 @@ var mg_axi_default = {
33641
32981
  positionalInput: false
33642
32982
  },
33643
32983
  {
33644
- command: "entra lifecycle run user-processing-result count",
32984
+ command: "entra lifecycle run user-processing-result count",
32985
+ flags: {
32986
+ help: "boolean",
32987
+ profile: "value",
32988
+ "api-version": "value",
32989
+ workflow: "value",
32990
+ run: "value",
32991
+ scopes: "value",
32992
+ config: "value"
32993
+ },
32994
+ positionalInput: false
32995
+ },
32996
+ {
32997
+ command: "entra lifecycle run subject-processing-result list",
32998
+ flags: {
32999
+ help: "boolean",
33000
+ profile: "value",
33001
+ "api-version": "value",
33002
+ workflow: "value",
33003
+ run: "value",
33004
+ limit: "value",
33005
+ all: "boolean",
33006
+ filter: "value",
33007
+ fields: "value",
33008
+ full: "boolean",
33009
+ cursor: "value",
33010
+ scopes: "value",
33011
+ config: "value"
33012
+ },
33013
+ positionalInput: false
33014
+ },
33015
+ {
33016
+ command: "entra lifecycle run subject-processing-result show",
33017
+ flags: {
33018
+ help: "boolean",
33019
+ profile: "value",
33020
+ "api-version": "value",
33021
+ workflow: "value",
33022
+ run: "value",
33023
+ id: "value",
33024
+ fields: "value",
33025
+ full: "boolean",
33026
+ scopes: "value",
33027
+ config: "value"
33028
+ },
33029
+ positionalInput: false
33030
+ },
33031
+ {
33032
+ command: "entra lifecycle run subject-processing-result count",
33033
+ flags: {
33034
+ help: "boolean",
33035
+ profile: "value",
33036
+ "api-version": "value",
33037
+ workflow: "value",
33038
+ run: "value",
33039
+ scopes: "value",
33040
+ config: "value"
33041
+ },
33042
+ positionalInput: false
33043
+ },
33044
+ {
33045
+ command: "entra lifecycle run task-processing-result list",
33046
+ flags: {
33047
+ help: "boolean",
33048
+ profile: "value",
33049
+ "api-version": "value",
33050
+ workflow: "value",
33051
+ run: "value",
33052
+ limit: "value",
33053
+ all: "boolean",
33054
+ filter: "value",
33055
+ select: "value",
33056
+ fields: "value",
33057
+ full: "boolean",
33058
+ cursor: "value",
33059
+ scopes: "value",
33060
+ config: "value"
33061
+ },
33062
+ positionalInput: false
33063
+ },
33064
+ {
33065
+ command: "entra lifecycle run task-processing-result show",
33066
+ flags: {
33067
+ help: "boolean",
33068
+ profile: "value",
33069
+ "api-version": "value",
33070
+ workflow: "value",
33071
+ run: "value",
33072
+ id: "value",
33073
+ fields: "value",
33074
+ full: "boolean",
33075
+ scopes: "value",
33076
+ config: "value"
33077
+ },
33078
+ positionalInput: false
33079
+ },
33080
+ {
33081
+ command: "entra lifecycle run task-processing-result count",
33082
+ flags: {
33083
+ help: "boolean",
33084
+ profile: "value",
33085
+ "api-version": "value",
33086
+ workflow: "value",
33087
+ run: "value",
33088
+ scopes: "value",
33089
+ config: "value"
33090
+ },
33091
+ positionalInput: false
33092
+ },
33093
+ {
33094
+ command: "api get",
33095
+ flags: {
33096
+ help: "boolean",
33097
+ profile: "value",
33098
+ "api-version": "value",
33099
+ odata: "value",
33100
+ cursor: "value",
33101
+ scopes: "value",
33102
+ limit: "value",
33103
+ all: "boolean",
33104
+ full: "boolean",
33105
+ config: "value"
33106
+ },
33107
+ positionalInput: {
33108
+ name: "path",
33109
+ description: "Server-relative Graph path, e.g. /users",
33110
+ required: true
33111
+ }
33112
+ },
33113
+ {
33114
+ command: "login",
33115
+ flags: {
33116
+ help: "boolean",
33117
+ profile: "value",
33118
+ method: "value",
33119
+ scopes: "value",
33120
+ config: "value"
33121
+ },
33122
+ positionalInput: false
33123
+ },
33124
+ {
33125
+ command: "config path",
33126
+ flags: {
33127
+ help: "boolean",
33128
+ config: "value"
33129
+ },
33130
+ positionalInput: false
33131
+ },
33132
+ {
33133
+ command: "auth status",
33134
+ flags: {
33135
+ help: "boolean",
33136
+ profile: "value",
33137
+ config: "value"
33138
+ },
33139
+ positionalInput: false
33140
+ },
33141
+ {
33142
+ command: "auth logout",
33143
+ flags: {
33144
+ help: "boolean",
33145
+ profile: "value",
33146
+ config: "value"
33147
+ },
33148
+ positionalInput: false
33149
+ }
33150
+ ]
33151
+ };
33152
+
33153
+ // tools/inventories/ldap-axi.json
33154
+ var ldap_axi_default = {
33155
+ generatedBy: "scripts/ldap-inventory.mjs",
33156
+ tool: "ldap-axi",
33157
+ version: "0.3.0",
33158
+ integrity: "sha512-QVectHNsRxYWNBf0im5DjeN78mcgK0Te0Sxh7uXGNb+AhQjsS5ywiCrnKAk0/INA/oxiZ1TiXaDX7jHAg5OvDg==",
33159
+ parserEvidence: "Installed pinned command schemas and reviewed CLI globals and entry routes",
33160
+ sources: [
33161
+ {
33162
+ path: "package.json",
33163
+ sha256: "9fa26acd15443dad0857c7468f570164e436f7b25aef3df733da3c4d859917a9"
33164
+ },
33165
+ {
33166
+ path: "README.md",
33167
+ sha256: "cd05d13da53b80aa651a5207b680e7fa6a0fb0c975244e4cc135d26b13391204"
33168
+ },
33169
+ {
33170
+ path: "axi-credential.schema.json",
33171
+ sha256: "76b9f5f449d844dcd4365b966ed907515582f72fc920b936dae825ebf1b7cc53"
33172
+ },
33173
+ {
33174
+ path: "dist/src/cli.js",
33175
+ sha256: "2cb024b2848c2c9e27c292205b3ed86a829cfed21d52e8fea06ef544a039ec2a"
33176
+ },
33177
+ {
33178
+ path: "dist/src/schema.js",
33179
+ sha256: "ba2285cbda6e5994c536b2f9de65736df1b43b0b10c5d5b7a1c2d7124ab198a0"
33180
+ },
33181
+ {
33182
+ path: "dist/src/config.js",
33183
+ sha256: "cbc48584b6ff2a2a70375e9e8e6242a87543a3e6e6f7e1c055a2d29c42b677f9"
33184
+ },
33185
+ {
33186
+ path: "dist/src/secrets.js",
33187
+ sha256: "9f2ccf86515cec1dd65f2dd5850188232374535f7fe56a788fdc7b94d91c8532"
33188
+ },
33189
+ {
33190
+ path: "dist/src/directory/auth.js",
33191
+ sha256: "64885ea4bc5067c58dcb4d432610f99eedfa9af65fa46273b68d503d26ec3214"
33192
+ },
33193
+ {
33194
+ path: "dist/src/directory/policy.js",
33195
+ sha256: "a697dd78990493f7f1c19d22278ebb922c997e9cf88a51b12adfaca30fa8a01d"
33196
+ }
33197
+ ],
33198
+ credentialSchema: {
33199
+ $schema: "https://json-schema.org/draft/2020-12/schema",
33200
+ title: "ldap-axi profile",
33201
+ type: "object",
33202
+ additionalProperties: false,
33203
+ required: [
33204
+ "url"
33205
+ ],
33206
+ properties: {
33207
+ url: {
33208
+ type: "string",
33209
+ pattern: "^ldaps?://",
33210
+ description: "LDAP URL without userinfo; use the server FQDN for ambient authentication"
33211
+ },
33212
+ auth: {
33213
+ enum: [
33214
+ "auto",
33215
+ "gssapi",
33216
+ "simple"
33217
+ ],
33218
+ default: "auto"
33219
+ },
33220
+ bindDn: {
33221
+ type: "string",
33222
+ minLength: 1,
33223
+ description: "Simple-bind identity, required for simple authentication"
33224
+ },
33225
+ bindPassword: {
33226
+ "x-secret": true,
33227
+ description: "Simple-bind password reference; defaults to env LDAP_AXI_BIND_PASSWORD. No stored secrets.",
33228
+ oneOf: [
33229
+ {
33230
+ type: "object",
33231
+ additionalProperties: false,
33232
+ required: [
33233
+ "env"
33234
+ ],
33235
+ properties: {
33236
+ env: {
33237
+ type: "string",
33238
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
33239
+ }
33240
+ }
33241
+ },
33242
+ {
33243
+ type: "object",
33244
+ additionalProperties: false,
33245
+ required: [
33246
+ "file"
33247
+ ],
33248
+ properties: {
33249
+ file: {
33250
+ type: "string",
33251
+ pattern: "^(?:/|[A-Za-z]:[\\\\/])",
33252
+ description: "Absolute local path to a private UTF-8 password file; UNC/device paths are forbidden on Windows"
33253
+ }
33254
+ }
33255
+ }
33256
+ ]
33257
+ },
33258
+ base: {
33259
+ type: "string"
33260
+ },
33261
+ pageSize: {
33262
+ type: "integer",
33263
+ minimum: 1,
33264
+ maximum: 1e3
33265
+ },
33266
+ caFile: {
33267
+ type: "string",
33268
+ minLength: 1
33269
+ },
33270
+ startTls: {
33271
+ type: "boolean",
33272
+ default: false
33273
+ },
33274
+ tlsMaxVersion: {
33275
+ const: "1.2"
33276
+ },
33277
+ flavor: {
33278
+ enum: [
33279
+ "ad",
33280
+ "adlds",
33281
+ "ldapv3"
33282
+ ]
33283
+ },
33284
+ gssapiService: {
33285
+ type: "string",
33286
+ minLength: 1
33287
+ },
33288
+ gssapiProtection: {
33289
+ enum: [
33290
+ "none",
33291
+ "confidentiality"
33292
+ ]
33293
+ }
33294
+ }
33295
+ },
33296
+ adapterBoundary: {
33297
+ unsafeOverrides: [
33298
+ "config",
33299
+ "url",
33300
+ "start-tls",
33301
+ "ca-file",
33302
+ "ca-only",
33303
+ "tls-no-verify",
33304
+ "tls-max-version",
33305
+ "insecure-plaintext",
33306
+ "anonymous",
33307
+ "profile",
33308
+ "auth",
33309
+ "gssapi-service",
33310
+ "gssapi-protection"
33311
+ ],
33312
+ blockedCommands: [
33313
+ "config",
33314
+ "profile",
33315
+ "setup"
33316
+ ],
33317
+ sensitiveFlags: [
33318
+ "base",
33319
+ "filter",
33320
+ "name",
33321
+ "sam",
33322
+ "upn",
33323
+ "uid"
33324
+ ],
33325
+ authentication: "Stored simple-bind identity over verified LDAPS or StartTLS; no ambient ticket or keytab",
33326
+ inputs: {
33327
+ stdin: "unsupported",
33328
+ files: "unsupported",
33329
+ caFile: "stored PEM materialized privately by host"
33330
+ },
33331
+ resources: {
33332
+ nodeHeapMiB: 128
33333
+ },
33334
+ nativeWrites: "read-only upstream design"
33335
+ },
33336
+ discovery: {
33337
+ commands: [
33338
+ "entry",
33339
+ "user",
33340
+ "group",
33341
+ "computer",
33342
+ "auth status",
33343
+ "server"
33344
+ ],
33345
+ example: [
33346
+ "user",
33347
+ "list",
33348
+ "--limit",
33349
+ "1"
33350
+ ],
33351
+ 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"
33352
+ },
33353
+ suggestionFields: [
33354
+ "help"
33355
+ ],
33356
+ format: "TOON",
33357
+ commands: [
33358
+ {
33359
+ command: "home",
33360
+ flags: {
33361
+ help: "boolean",
33362
+ config: "value",
33363
+ url: "value",
33364
+ base: "value",
33365
+ "start-tls": "boolean",
33366
+ "ca-file": "value",
33367
+ "ca-only": "boolean",
33368
+ "tls-no-verify": "boolean",
33369
+ "tls-max-version": "value",
33370
+ "insecure-plaintext": "boolean",
33371
+ anonymous: "boolean",
33372
+ profile: "value",
33373
+ auth: "value",
33374
+ "gssapi-service": "value",
33375
+ "gssapi-protection": "value"
33376
+ },
33377
+ positionalInput: false
33378
+ },
33379
+ {
33380
+ command: "auth status",
33645
33381
  flags: {
33646
33382
  help: "boolean",
33383
+ config: "value",
33384
+ url: "value",
33385
+ base: "value",
33386
+ "start-tls": "boolean",
33387
+ "ca-file": "value",
33388
+ "ca-only": "boolean",
33389
+ "tls-no-verify": "boolean",
33390
+ "tls-max-version": "value",
33391
+ "insecure-plaintext": "boolean",
33392
+ anonymous: "boolean",
33647
33393
  profile: "value",
33648
- "api-version": "value",
33649
- workflow: "value",
33650
- run: "value",
33651
- scopes: "value",
33652
- config: "value"
33394
+ auth: "value",
33395
+ "gssapi-service": "value",
33396
+ "gssapi-protection": "value",
33397
+ offline: "boolean"
33653
33398
  },
33654
33399
  positionalInput: false
33655
33400
  },
33656
33401
  {
33657
- command: "entra lifecycle run subject-processing-result list",
33402
+ command: "server",
33658
33403
  flags: {
33659
33404
  help: "boolean",
33405
+ config: "value",
33406
+ url: "value",
33407
+ base: "value",
33408
+ "start-tls": "boolean",
33409
+ "ca-file": "value",
33410
+ "ca-only": "boolean",
33411
+ "tls-no-verify": "boolean",
33412
+ "tls-max-version": "value",
33413
+ "insecure-plaintext": "boolean",
33414
+ anonymous: "boolean",
33660
33415
  profile: "value",
33661
- "api-version": "value",
33662
- workflow: "value",
33663
- run: "value",
33664
- limit: "value",
33665
- all: "boolean",
33666
- filter: "value",
33667
- fields: "value",
33668
- full: "boolean",
33669
- cursor: "value",
33670
- scopes: "value",
33671
- config: "value"
33416
+ auth: "value",
33417
+ "gssapi-service": "value",
33418
+ "gssapi-protection": "value"
33672
33419
  },
33673
33420
  positionalInput: false
33674
33421
  },
33675
33422
  {
33676
- command: "entra lifecycle run subject-processing-result show",
33423
+ command: "entry search",
33677
33424
  flags: {
33678
33425
  help: "boolean",
33426
+ config: "value",
33427
+ url: "value",
33428
+ base: "value",
33429
+ "start-tls": "boolean",
33430
+ "ca-file": "value",
33431
+ "ca-only": "boolean",
33432
+ "tls-no-verify": "boolean",
33433
+ "tls-max-version": "value",
33434
+ "insecure-plaintext": "boolean",
33435
+ anonymous: "boolean",
33679
33436
  profile: "value",
33680
- "api-version": "value",
33681
- workflow: "value",
33682
- run: "value",
33683
- id: "value",
33684
- fields: "value",
33685
- full: "boolean",
33686
- scopes: "value",
33687
- config: "value"
33437
+ auth: "value",
33438
+ "gssapi-service": "value",
33439
+ "gssapi-protection": "value",
33440
+ filter: "value",
33441
+ scope: "value",
33442
+ attributes: "value",
33443
+ "page-size": "value",
33444
+ "max-rows": "value",
33445
+ all: "boolean"
33688
33446
  },
33689
33447
  positionalInput: false
33690
33448
  },
33691
33449
  {
33692
- command: "entra lifecycle run subject-processing-result count",
33450
+ command: "entry show",
33693
33451
  flags: {
33694
33452
  help: "boolean",
33453
+ config: "value",
33454
+ url: "value",
33455
+ base: "value",
33456
+ "start-tls": "boolean",
33457
+ "ca-file": "value",
33458
+ "ca-only": "boolean",
33459
+ "tls-no-verify": "boolean",
33460
+ "tls-max-version": "value",
33461
+ "insecure-plaintext": "boolean",
33462
+ anonymous: "boolean",
33695
33463
  profile: "value",
33696
- "api-version": "value",
33697
- workflow: "value",
33698
- run: "value",
33699
- scopes: "value",
33700
- config: "value"
33464
+ auth: "value",
33465
+ "gssapi-service": "value",
33466
+ "gssapi-protection": "value",
33467
+ attributes: "value",
33468
+ "page-size": "value"
33701
33469
  },
33702
- positionalInput: false
33470
+ positionalInput: true
33703
33471
  },
33704
33472
  {
33705
- command: "entra lifecycle run task-processing-result list",
33473
+ command: "user list",
33706
33474
  flags: {
33707
33475
  help: "boolean",
33476
+ config: "value",
33477
+ url: "value",
33478
+ base: "value",
33479
+ "start-tls": "boolean",
33480
+ "ca-file": "value",
33481
+ "ca-only": "boolean",
33482
+ "tls-no-verify": "boolean",
33483
+ "tls-max-version": "value",
33484
+ "insecure-plaintext": "boolean",
33485
+ anonymous: "boolean",
33708
33486
  profile: "value",
33709
- "api-version": "value",
33710
- workflow: "value",
33711
- run: "value",
33712
- limit: "value",
33487
+ auth: "value",
33488
+ "gssapi-service": "value",
33489
+ "gssapi-protection": "value",
33490
+ disabled: "boolean",
33491
+ enabled: "boolean",
33492
+ locked: "boolean",
33713
33493
  all: "boolean",
33494
+ name: "value",
33495
+ sam: "value",
33496
+ upn: "value",
33497
+ uid: "value",
33714
33498
  filter: "value",
33715
- select: "value",
33499
+ scope: "value",
33500
+ "max-rows": "value",
33501
+ "page-size": "value",
33502
+ limit: "value",
33716
33503
  fields: "value",
33717
- full: "boolean",
33718
- cursor: "value",
33719
- scopes: "value",
33720
- config: "value"
33504
+ attributes: "value"
33721
33505
  },
33722
33506
  positionalInput: false
33723
33507
  },
33724
33508
  {
33725
- command: "entra lifecycle run task-processing-result show",
33509
+ command: "user show",
33726
33510
  flags: {
33727
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",
33728
33522
  profile: "value",
33729
- "api-version": "value",
33730
- workflow: "value",
33731
- run: "value",
33732
- id: "value",
33523
+ auth: "value",
33524
+ "gssapi-service": "value",
33525
+ "gssapi-protection": "value",
33733
33526
  fields: "value",
33734
- full: "boolean",
33735
- scopes: "value",
33736
- config: "value"
33527
+ attributes: "value"
33737
33528
  },
33738
- positionalInput: false
33529
+ positionalInput: true
33739
33530
  },
33740
33531
  {
33741
- command: "entra lifecycle run task-processing-result count",
33532
+ command: "user groups",
33742
33533
  flags: {
33743
33534
  help: "boolean",
33535
+ config: "value",
33536
+ url: "value",
33537
+ base: "value",
33538
+ "start-tls": "boolean",
33539
+ "ca-file": "value",
33540
+ "ca-only": "boolean",
33541
+ "tls-no-verify": "boolean",
33542
+ "tls-max-version": "value",
33543
+ "insecure-plaintext": "boolean",
33544
+ anonymous: "boolean",
33744
33545
  profile: "value",
33745
- "api-version": "value",
33746
- workflow: "value",
33747
- run: "value",
33748
- scopes: "value",
33749
- config: "value"
33546
+ auth: "value",
33547
+ "gssapi-service": "value",
33548
+ "gssapi-protection": "value",
33549
+ nested: "boolean",
33550
+ "max-rows": "value",
33551
+ "page-size": "value",
33552
+ fields: "value"
33750
33553
  },
33751
- positionalInput: false
33554
+ positionalInput: true
33752
33555
  },
33753
33556
  {
33754
- command: "api get",
33557
+ command: "group list",
33755
33558
  flags: {
33756
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",
33757
33570
  profile: "value",
33758
- "api-version": "value",
33759
- odata: "value",
33760
- cursor: "value",
33761
- scopes: "value",
33762
- limit: "value",
33571
+ auth: "value",
33572
+ "gssapi-service": "value",
33573
+ "gssapi-protection": "value",
33763
33574
  all: "boolean",
33764
- full: "boolean",
33765
- config: "value"
33575
+ name: "value",
33576
+ sam: "value",
33577
+ filter: "value",
33578
+ scope: "value",
33579
+ "max-rows": "value",
33580
+ "page-size": "value",
33581
+ limit: "value",
33582
+ fields: "value",
33583
+ attributes: "value"
33766
33584
  },
33767
- positionalInput: {
33768
- name: "path",
33769
- description: "Server-relative Graph path, e.g. /users",
33770
- required: true
33771
- }
33585
+ positionalInput: false
33772
33586
  },
33773
33587
  {
33774
- command: "login",
33588
+ command: "group show",
33775
33589
  flags: {
33776
33590
  help: "boolean",
33591
+ config: "value",
33592
+ url: "value",
33593
+ base: "value",
33594
+ "start-tls": "boolean",
33595
+ "ca-file": "value",
33596
+ "ca-only": "boolean",
33597
+ "tls-no-verify": "boolean",
33598
+ "tls-max-version": "value",
33599
+ "insecure-plaintext": "boolean",
33600
+ anonymous: "boolean",
33777
33601
  profile: "value",
33778
- method: "value",
33779
- scopes: "value",
33780
- config: "value"
33602
+ auth: "value",
33603
+ "gssapi-service": "value",
33604
+ "gssapi-protection": "value",
33605
+ fields: "value",
33606
+ attributes: "value"
33781
33607
  },
33782
- positionalInput: false
33608
+ positionalInput: true
33783
33609
  },
33784
33610
  {
33785
- command: "config path",
33611
+ command: "group members",
33786
33612
  flags: {
33787
33613
  help: "boolean",
33788
- config: "value"
33614
+ config: "value",
33615
+ url: "value",
33616
+ base: "value",
33617
+ "start-tls": "boolean",
33618
+ "ca-file": "value",
33619
+ "ca-only": "boolean",
33620
+ "tls-no-verify": "boolean",
33621
+ "tls-max-version": "value",
33622
+ "insecure-plaintext": "boolean",
33623
+ anonymous: "boolean",
33624
+ profile: "value",
33625
+ auth: "value",
33626
+ "gssapi-service": "value",
33627
+ "gssapi-protection": "value",
33628
+ nested: "boolean",
33629
+ "max-rows": "value",
33630
+ "page-size": "value",
33631
+ fields: "value"
33789
33632
  },
33790
- positionalInput: false
33633
+ positionalInput: true
33791
33634
  },
33792
33635
  {
33793
- command: "auth status",
33636
+ command: "computer list",
33794
33637
  flags: {
33795
33638
  help: "boolean",
33639
+ config: "value",
33640
+ url: "value",
33641
+ base: "value",
33642
+ "start-tls": "boolean",
33643
+ "ca-file": "value",
33644
+ "ca-only": "boolean",
33645
+ "tls-no-verify": "boolean",
33646
+ "tls-max-version": "value",
33647
+ "insecure-plaintext": "boolean",
33648
+ anonymous: "boolean",
33796
33649
  profile: "value",
33797
- config: "value"
33650
+ auth: "value",
33651
+ "gssapi-service": "value",
33652
+ "gssapi-protection": "value",
33653
+ all: "boolean",
33654
+ name: "value",
33655
+ sam: "value",
33656
+ filter: "value",
33657
+ scope: "value",
33658
+ "max-rows": "value",
33659
+ "page-size": "value",
33660
+ limit: "value",
33661
+ fields: "value",
33662
+ attributes: "value"
33798
33663
  },
33799
33664
  positionalInput: false
33800
33665
  },
33801
33666
  {
33802
- command: "auth logout",
33667
+ command: "computer show",
33803
33668
  flags: {
33804
33669
  help: "boolean",
33670
+ config: "value",
33671
+ url: "value",
33672
+ base: "value",
33673
+ "start-tls": "boolean",
33674
+ "ca-file": "value",
33675
+ "ca-only": "boolean",
33676
+ "tls-no-verify": "boolean",
33677
+ "tls-max-version": "value",
33678
+ "insecure-plaintext": "boolean",
33679
+ anonymous: "boolean",
33805
33680
  profile: "value",
33806
- config: "value"
33681
+ auth: "value",
33682
+ "gssapi-service": "value",
33683
+ "gssapi-protection": "value",
33684
+ fields: "value",
33685
+ attributes: "value"
33807
33686
  },
33808
- positionalInput: false
33687
+ positionalInput: true
33809
33688
  }
33810
33689
  ]
33811
33690
  };
@@ -34880,8 +34759,8 @@ var ado_axi_default = {
34880
34759
  var awx_axi_default = {
34881
34760
  generatedBy: "scripts/awx-inventory.mjs",
34882
34761
  tool: "awx-axi",
34883
- version: "0.1.7",
34884
- integrity: "sha512-hZFvJnOhW+UZDeBTp+un1K1anUqEVC0njETANXbHjgXKwiGB3W1h5oEZzmf4fiPskZarr+ynlEaUaWafEHtnsA==",
34762
+ version: "0.1.8",
34763
+ integrity: "sha512-tkheZgSTjs6nZT3KWo0e/+SH43ZacfvZpo7COktmpIs8lNr8VLhUtrGARz+mvwj8pov4zscdfmxAHL/8V025Bw==",
34885
34764
  parserEvidence: "Published domain registry, reviewed plan effects and transport safety gates",
34886
34765
  sources: [
34887
34766
  {
@@ -34894,7 +34773,7 @@ var awx_axi_default = {
34894
34773
  },
34895
34774
  {
34896
34775
  path: "dist/commands/auth.js",
34897
- sha256: "5ccc0c9a226ab900bcc89a55aa71b22b64a41069e9f64d73c2c1fece79190a68"
34776
+ sha256: "cf8e52f33d6acb5091d009c23df4957da3d208d4e9417bdcbba547f4d7c8b690"
34898
34777
  },
34899
34778
  {
34900
34779
  path: "dist/commands/home.js",
@@ -34918,7 +34797,7 @@ var awx_axi_default = {
34918
34797
  },
34919
34798
  {
34920
34799
  path: "dist/core/flags.js",
34921
- sha256: "ae72d1964d63ef9fab92bb5ff561f584432c14b8d216b5f2e2b5967333b25fbb"
34800
+ sha256: "60d5c58ab68c3cc61e57c249b93db544d619469c6fbd1e3082ee573ed1b50498"
34922
34801
  },
34923
34802
  {
34924
34803
  path: "dist/core/mutations.js",
@@ -34926,11 +34805,11 @@ var awx_axi_default = {
34926
34805
  },
34927
34806
  {
34928
34807
  path: "dist/core/output.js",
34929
- sha256: "b8d4dc8dff76151b2af0e25caf5946c97ba98f8eb21939aab49ed1222d7c16dd"
34808
+ sha256: "7406df524ee329a3e2eb1f2b37295d8699de678e687525c8d55a3ce67d78dd0a"
34930
34809
  },
34931
34810
  {
34932
34811
  path: "dist/core/paginate.js",
34933
- sha256: "cd5b17961f1671e204a8087b96ef8a15dc8c4994b486f0b3027734c560e648b2"
34812
+ sha256: "d952bc390a4ac2da263b1d98c24f05e416652335904de37b26379576632059a3"
34934
34813
  },
34935
34814
  {
34936
34815
  path: "dist/core/poll.js",
@@ -34938,19 +34817,19 @@ var awx_axi_default = {
34938
34817
  },
34939
34818
  {
34940
34819
  path: "dist/core/private-file.js",
34941
- sha256: "eedc2a13e5e4470eb22b8e3d500cd971b376c57fff9220c12c4d507ceeb240f6"
34820
+ sha256: "30f44672d91f74b232ae6f7884b7daee6bd12ce6702ca57b3213a8a5da4bf992"
34942
34821
  },
34943
34822
  {
34944
34823
  path: "dist/core/profiles.js",
34945
- sha256: "72b3bfe669c5471222efb6a457d25daff793375399c406f47a112fc76b291dc4"
34824
+ sha256: "c3ac1d2a531115d253ed83020d88e3763108249a4a03ca710da40833db05bc7d"
34946
34825
  },
34947
34826
  {
34948
34827
  path: "dist/core/redact.js",
34949
- sha256: "dd8de047c53d06808f90f9c51324b737a51d83768c16d4e69f9af64f56bdf602"
34828
+ sha256: "4fa205b30a3165738578c01ecfa5787bb6993ee11b07dbcb74b6401d4441679f"
34950
34829
  },
34951
34830
  {
34952
34831
  path: "dist/core/registry.js",
34953
- sha256: "a1818f532b67b39c6402d694b982b688234fdfdec4df51782ef30783b7afe488"
34832
+ sha256: "89d3983928dd3a63712e9c78a4959c2e9c950097a3d200f6d1ccf2c3327bbdfd"
34954
34833
  },
34955
34834
  {
34956
34835
  path: "dist/core/resolve.js",
@@ -34966,95 +34845,95 @@ var awx_axi_default = {
34966
34845
  },
34967
34846
  {
34968
34847
  path: "dist/domains/activity-stream/index.js",
34969
- sha256: "b5e7094013f5626affc0bf756b96ad3edce3d1720d0698238bc703e749e8571a"
34848
+ sha256: "633995f66b7e24cb4c6d98341e943a7e8d61b3b271503cb1b191b161b3fb927f"
34970
34849
  },
34971
34850
  {
34972
34851
  path: "dist/domains/ad-hoc/index.js",
34973
- sha256: "8fdaf507ab0b4b4f7e9ae7713e36ae318d55882276cfe9e82dfdeff65417266d"
34852
+ sha256: "92f5395f74f449bb6fde43276764dfe965eaa8afb491a8f5e13323dc9a366084"
34974
34853
  },
34975
34854
  {
34976
34855
  path: "dist/domains/approval/index.js",
34977
- sha256: "139356c4fa1289f2694d55248b7f12e8b0267fa5acd39edb05b0f3ac4da0f64e"
34856
+ sha256: "741282a1143b776ba0850cd8cc0ec3da913e1d354cc08f671b51cdea58621b1b"
34978
34857
  },
34979
34858
  {
34980
34859
  path: "dist/domains/credential/index.js",
34981
- sha256: "554a36457a4d264f2361da766350ec6696aaace78280e978f56b6fb577447f6b"
34860
+ sha256: "00e5171e9b653f8266722cc53302748bbd54c874c07e60e2967f95797c7bcf05"
34982
34861
  },
34983
34862
  {
34984
34863
  path: "dist/domains/execution-environment/index.js",
34985
- sha256: "d068ff30cdf0eff1d8af2a53a564ed26e2843c544cd1d0d5c2643e8a9f07bdca"
34864
+ sha256: "0038065d8d51b9fe370e8e517ddcebfdb8ccf0b3ee512a89147eea413e918685"
34986
34865
  },
34987
34866
  {
34988
34867
  path: "dist/domains/group/index.js",
34989
- sha256: "6415d7548cc0220f423dd5da887b0fc6975be3cdb8367ed5df74f7af375fc5ef"
34868
+ sha256: "7fdd83edd141372fcc5486ba07968137f913ac9a73147aa748127b523c4cc785"
34990
34869
  },
34991
34870
  {
34992
34871
  path: "dist/domains/host/index.js",
34993
- sha256: "2faf483f269b39a12f759f46ff520ee97ac1009448062ccfb333c5a26ecd4591"
34872
+ sha256: "478ff268a6a6a8452aa206be7671e402782fbfde8504808d9cc4fe10205b6707"
34994
34873
  },
34995
34874
  {
34996
34875
  path: "dist/domains/inventory-source/index.js",
34997
- sha256: "1015ff818f4051828cd089ff603f6a1fe28ddb672061be021372c93f68053f56"
34876
+ sha256: "56d8f203514f688eb734c29c2db45930dcddb96bdb82424bf8cc835c493cb279"
34998
34877
  },
34999
34878
  {
35000
34879
  path: "dist/domains/inventory/index.js",
35001
- sha256: "8363397bbb0b9f90617442ae980d9900b536f7c17dec35d1b931c71546603f31"
34880
+ sha256: "0352fc474d38aed258ab069a6a80da83d3acf00c9cccd37c3d26b16e8b6d8e2d"
35002
34881
  },
35003
34882
  {
35004
34883
  path: "dist/domains/job/index.js",
35005
- sha256: "5a5c76bc626d83dc286b737416b8f44c0b5bf53b419f39cc07bb61ef65ae00bd"
34884
+ sha256: "db22aa5cd3c15da799d7aaea4430c9a6aa5e04e7f5fa1a5cacb340799f34f38c"
35006
34885
  },
35007
34886
  {
35008
34887
  path: "dist/domains/notification-template/index.js",
35009
- sha256: "8b6faa1fd012db6d2c66246dea378d8360aaa36dc1accfed367cb39f4679721a"
34888
+ sha256: "c3ddb6e7abcdc57583bc1ada57f30302f63b01a559381c2be196b7ee3bbfdc9b"
35010
34889
  },
35011
34890
  {
35012
34891
  path: "dist/domains/notification/index.js",
35013
- sha256: "4825216f22fb565de502165455dd23a3126573dcff584d5cf97915123680d3cf"
34892
+ sha256: "d9c46319aabe8187e3417710c3ebeda5650b55463f84fa9baa3d6fe91edc1ced"
35014
34893
  },
35015
34894
  {
35016
34895
  path: "dist/domains/organization/index.js",
35017
- sha256: "d79160904aca5909b3e83cee7a43d751566a49fcba7fd63595d2d10ecb473289"
34896
+ sha256: "65072b9afb1706b67b1f7c37c9d96bf12104d8ec56a214f06a512e6283fb0229"
35018
34897
  },
35019
34898
  {
35020
34899
  path: "dist/domains/project/index.js",
35021
- sha256: "8dcb5a74ed19511e9c53cfe0d9c67efe3cf78861019a559c60c19914d8d7cde2"
34900
+ sha256: "eafb98f7148e2a5e8c194af16ebbaa7569ddf74344e367531ba9f6946a39ef46"
35022
34901
  },
35023
34902
  {
35024
34903
  path: "dist/domains/role/index.js",
35025
- sha256: "63df014ea35ce97855e19fba126ccef8971756b2cc707a9c442f3fd6c094bdc9"
34904
+ sha256: "0e5ee47acb703d2f202f01450eb87330140b97c430440eff31c4f33bab28a647"
35026
34905
  },
35027
34906
  {
35028
34907
  path: "dist/domains/schedule/index.js",
35029
- sha256: "bcab018cfa8b38fa9c4b3509ba1ec1c10c4e4d10e3887e500e00baa794bbc8a6"
34908
+ sha256: "d3267a27432a6911027a2d5dc04177eb46db703ea012cc6d1cfe33c19be49694"
35030
34909
  },
35031
34910
  {
35032
34911
  path: "dist/domains/system-job-template/index.js",
35033
- sha256: "d9c8efd7b12054715e2a110bffa726dcb1bd34120521725c505b1179d7a49b45"
34912
+ sha256: "8f485966f9f290399dfaf2eedf21b4182d2dd712bb6833e1df377eabb53ebb04"
35034
34913
  },
35035
34914
  {
35036
34915
  path: "dist/domains/system-job/index.js",
35037
- sha256: "59e45fa7495ae48f1e9d8e551a80673cbfbe880d4c78c4221a168709a8247cff"
34916
+ sha256: "25bae07068cd93cf705c2bebcd8a4f6e5f6071c6b41951edb62527630e2c678f"
35038
34917
  },
35039
34918
  {
35040
34919
  path: "dist/domains/team/index.js",
35041
- sha256: "fd47ffaa541b5deede3994d16be4ad6683a2a8b0883d99846475f2e924453797"
34920
+ sha256: "eb3a4b5cff91f8ef1b07b64a934a3b9d9bc025cf2eb476f6aafa92086b9c07b6"
35042
34921
  },
35043
34922
  {
35044
34923
  path: "dist/domains/template/index.js",
35045
- sha256: "30801bdd67e37b105eefd4df3e7c0ece4a7257258e9087bf444a3383e12c93c8"
34924
+ sha256: "92dd83d5adbba8b572b2bcec6090630a34d572b4a1346906dafdc8499d6f7941"
35046
34925
  },
35047
34926
  {
35048
34927
  path: "dist/domains/user/index.js",
35049
- sha256: "b85dc53d942ffc9ed062bf948565c69d4cb046f718bb65118e3e27ce7533217c"
34928
+ sha256: "dc2de36112a32b61f34d631f642a134b317255a5f5a1c1f2da6f3cf6d09e7cf3"
35050
34929
  },
35051
34930
  {
35052
34931
  path: "dist/domains/workflow/index.js",
35053
- sha256: "d5734a2b8f937fca7e0660f8c2942fbcc0e543c105c4be5a16b3f3787e6530af"
34932
+ sha256: "811a3b1df2bfa7a2f76f6fb1c3464de91ed2b7c171788bc82ae4cd991ce4c52a"
35054
34933
  },
35055
34934
  {
35056
34935
  path: "dist/skill.js",
35057
- sha256: "65fe6713e288b6263bc74331969db46c39bd7d798b816266512de456427626a7"
34936
+ sha256: "c7280e3093b0f547c577d54dc1f861cac4ce13ec70afabf7a3d1d55e3dbd6247"
35058
34937
  }
35059
34938
  ],
35060
34939
  credentialSchema: {
@@ -35146,7 +35025,7 @@ var awx_axi_default = {
35146
35025
  }
35147
35026
  }
35148
35027
  },
35149
- skillSha256: "b3e128cd347128b36f949cf5641a4a1e3eeac47866e469d74d467f068cfb99c5",
35028
+ skillSha256: "71f03eed887e2a5189b1b08b692fc5fd7a4acfd274102bd925c27d1dd16177ce",
35150
35029
  adapterBoundary: {
35151
35030
  unsafeOverrides: [
35152
35031
  "config",
@@ -35219,7 +35098,9 @@ var awx_axi_default = {
35219
35098
  template: "value",
35220
35099
  failed: "boolean",
35221
35100
  since: "value",
35222
- limit: "value"
35101
+ limit: "value",
35102
+ all: "boolean",
35103
+ "max-rows": "value"
35223
35104
  },
35224
35105
  positionals: {
35225
35106
  names: [],
@@ -35264,7 +35145,9 @@ var awx_axi_default = {
35264
35145
  failed: "boolean",
35265
35146
  host: "value",
35266
35147
  task: "value",
35267
- limit: "value"
35148
+ limit: "value",
35149
+ all: "boolean",
35150
+ "max-rows": "value"
35268
35151
  },
35269
35152
  positionals: {
35270
35153
  names: [
@@ -35277,7 +35160,10 @@ var awx_axi_default = {
35277
35160
  command: "job hosts",
35278
35161
  effect: "read",
35279
35162
  flags: {
35280
- help: "boolean"
35163
+ help: "boolean",
35164
+ limit: "value",
35165
+ all: "boolean",
35166
+ "max-rows": "value"
35281
35167
  },
35282
35168
  positionals: {
35283
35169
  names: [
@@ -35367,7 +35253,9 @@ var awx_axi_default = {
35367
35253
  effect: "read",
35368
35254
  flags: {
35369
35255
  help: "boolean",
35370
- limit: "value"
35256
+ limit: "value",
35257
+ all: "boolean",
35258
+ "max-rows": "value"
35371
35259
  },
35372
35260
  positionals: {
35373
35261
  names: [
@@ -35594,7 +35482,9 @@ var awx_axi_default = {
35594
35482
  help: "boolean",
35595
35483
  project: "value",
35596
35484
  search: "value",
35597
- limit: "value"
35485
+ limit: "value",
35486
+ all: "boolean",
35487
+ "max-rows": "value"
35598
35488
  },
35599
35489
  positionals: {
35600
35490
  names: [],
@@ -35659,7 +35549,9 @@ var awx_axi_default = {
35659
35549
  effect: "read",
35660
35550
  flags: {
35661
35551
  help: "boolean",
35662
- limit: "value"
35552
+ limit: "value",
35553
+ all: "boolean",
35554
+ "max-rows": "value"
35663
35555
  },
35664
35556
  positionals: {
35665
35557
  names: [
@@ -36020,7 +35912,9 @@ var awx_axi_default = {
36020
35912
  flags: {
36021
35913
  help: "boolean",
36022
35914
  search: "value",
36023
- limit: "value"
35915
+ limit: "value",
35916
+ all: "boolean",
35917
+ "max-rows": "value"
36024
35918
  },
36025
35919
  positionals: {
36026
35920
  names: [],
@@ -36077,7 +35971,10 @@ var awx_axi_default = {
36077
35971
  command: "workflow nodes",
36078
35972
  effect: "read",
36079
35973
  flags: {
36080
- help: "boolean"
35974
+ help: "boolean",
35975
+ limit: "value",
35976
+ all: "boolean",
35977
+ "max-rows": "value"
36081
35978
  },
36082
35979
  positionals: {
36083
35980
  names: [
@@ -36091,7 +35988,9 @@ var awx_axi_default = {
36091
35988
  effect: "read",
36092
35989
  flags: {
36093
35990
  help: "boolean",
36094
- limit: "value"
35991
+ limit: "value",
35992
+ all: "boolean",
35993
+ "max-rows": "value"
36095
35994
  },
36096
35995
  positionals: {
36097
35996
  names: [
@@ -36104,8 +36003,7 @@ var awx_axi_default = {
36104
36003
  command: "workflow template-node",
36105
36004
  effect: "read",
36106
36005
  flags: {
36107
- help: "boolean",
36108
- limit: "value"
36006
+ help: "boolean"
36109
36007
  },
36110
36008
  positionals: {
36111
36009
  names: [
@@ -36431,7 +36329,9 @@ var awx_axi_default = {
36431
36329
  flags: {
36432
36330
  help: "boolean",
36433
36331
  search: "value",
36434
- limit: "value"
36332
+ limit: "value",
36333
+ all: "boolean",
36334
+ "max-rows": "value"
36435
36335
  },
36436
36336
  positionals: {
36437
36337
  names: [],
@@ -36473,7 +36373,9 @@ var awx_axi_default = {
36473
36373
  flags: {
36474
36374
  help: "boolean",
36475
36375
  search: "value",
36476
- limit: "value"
36376
+ limit: "value",
36377
+ all: "boolean",
36378
+ "max-rows": "value"
36477
36379
  },
36478
36380
  positionals: {
36479
36381
  names: [],
@@ -36516,7 +36418,9 @@ var awx_axi_default = {
36516
36418
  search: "value",
36517
36419
  template: "value",
36518
36420
  status: "value",
36519
- limit: "value"
36421
+ limit: "value",
36422
+ all: "boolean",
36423
+ "max-rows": "value"
36520
36424
  },
36521
36425
  positionals: {
36522
36426
  names: [],
@@ -36544,7 +36448,9 @@ var awx_axi_default = {
36544
36448
  failed: "boolean",
36545
36449
  host: "value",
36546
36450
  task: "value",
36547
- limit: "value"
36451
+ limit: "value",
36452
+ all: "boolean",
36453
+ "max-rows": "value"
36548
36454
  },
36549
36455
  positionals: {
36550
36456
  names: [
@@ -36558,7 +36464,9 @@ var awx_axi_default = {
36558
36464
  effect: "read",
36559
36465
  flags: {
36560
36466
  help: "boolean",
36561
- limit: "value"
36467
+ limit: "value",
36468
+ all: "boolean",
36469
+ "max-rows": "value"
36562
36470
  },
36563
36471
  positionals: {
36564
36472
  names: [
@@ -36572,7 +36480,9 @@ var awx_axi_default = {
36572
36480
  effect: "read",
36573
36481
  flags: {
36574
36482
  help: "boolean",
36575
- limit: "value"
36483
+ limit: "value",
36484
+ all: "boolean",
36485
+ "max-rows": "value"
36576
36486
  },
36577
36487
  positionals: {
36578
36488
  names: [
@@ -36659,7 +36569,9 @@ var awx_axi_default = {
36659
36569
  help: "boolean",
36660
36570
  search: "value",
36661
36571
  organization: "value",
36662
- limit: "value"
36572
+ limit: "value",
36573
+ all: "boolean",
36574
+ "max-rows": "value"
36663
36575
  },
36664
36576
  positionals: {
36665
36577
  names: [],
@@ -36685,7 +36597,9 @@ var awx_axi_default = {
36685
36597
  flags: {
36686
36598
  help: "boolean",
36687
36599
  "include-decided": "boolean",
36688
- limit: "value"
36600
+ limit: "value",
36601
+ all: "boolean",
36602
+ "max-rows": "value"
36689
36603
  },
36690
36604
  positionals: {
36691
36605
  names: [],
@@ -36767,7 +36681,9 @@ var awx_axi_default = {
36767
36681
  flags: {
36768
36682
  help: "boolean",
36769
36683
  search: "value",
36770
- limit: "value"
36684
+ limit: "value",
36685
+ all: "boolean",
36686
+ "max-rows": "value"
36771
36687
  },
36772
36688
  positionals: {
36773
36689
  names: [],
@@ -36794,7 +36710,9 @@ var awx_axi_default = {
36794
36710
  help: "boolean",
36795
36711
  host: "value",
36796
36712
  task: "value",
36797
- limit: "value"
36713
+ limit: "value",
36714
+ all: "boolean",
36715
+ "max-rows": "value"
36798
36716
  },
36799
36717
  positionals: {
36800
36718
  names: [
@@ -36933,7 +36851,9 @@ var awx_axi_default = {
36933
36851
  flags: {
36934
36852
  help: "boolean",
36935
36853
  search: "value",
36936
- limit: "value"
36854
+ limit: "value",
36855
+ all: "boolean",
36856
+ "max-rows": "value"
36937
36857
  },
36938
36858
  positionals: {
36939
36859
  names: [],
@@ -36971,7 +36891,9 @@ var awx_axi_default = {
36971
36891
  effect: "read",
36972
36892
  flags: {
36973
36893
  help: "boolean",
36974
- limit: "value"
36894
+ limit: "value",
36895
+ all: "boolean",
36896
+ "max-rows": "value"
36975
36897
  },
36976
36898
  positionals: {
36977
36899
  names: [
@@ -36984,7 +36906,10 @@ var awx_axi_default = {
36984
36906
  command: "project roles",
36985
36907
  effect: "read",
36986
36908
  flags: {
36987
- help: "boolean"
36909
+ help: "boolean",
36910
+ limit: "value",
36911
+ all: "boolean",
36912
+ "max-rows": "value"
36988
36913
  },
36989
36914
  positionals: {
36990
36915
  names: [
@@ -37416,7 +37341,9 @@ var awx_axi_default = {
37416
37341
  flags: {
37417
37342
  help: "boolean",
37418
37343
  search: "value",
37419
- limit: "value"
37344
+ limit: "value",
37345
+ all: "boolean",
37346
+ "max-rows": "value"
37420
37347
  },
37421
37348
  positionals: {
37422
37349
  names: [],
@@ -37442,7 +37369,9 @@ var awx_axi_default = {
37442
37369
  flags: {
37443
37370
  help: "boolean",
37444
37371
  search: "value",
37445
- limit: "value"
37372
+ limit: "value",
37373
+ all: "boolean",
37374
+ "max-rows": "value"
37446
37375
  },
37447
37376
  positionals: {
37448
37377
  names: [
@@ -37458,6 +37387,8 @@ var awx_axi_default = {
37458
37387
  help: "boolean",
37459
37388
  search: "value",
37460
37389
  limit: "value",
37390
+ all: "boolean",
37391
+ "max-rows": "value",
37461
37392
  facts: "boolean"
37462
37393
  },
37463
37394
  positionals: {
@@ -37473,7 +37404,9 @@ var awx_axi_default = {
37473
37404
  flags: {
37474
37405
  help: "boolean",
37475
37406
  search: "value",
37476
- limit: "value"
37407
+ limit: "value",
37408
+ all: "boolean",
37409
+ "max-rows": "value"
37477
37410
  },
37478
37411
  positionals: {
37479
37412
  names: [
@@ -37504,7 +37437,9 @@ var awx_axi_default = {
37504
37437
  flags: {
37505
37438
  help: "boolean",
37506
37439
  search: "value",
37507
- limit: "value"
37440
+ limit: "value",
37441
+ all: "boolean",
37442
+ "max-rows": "value"
37508
37443
  },
37509
37444
  positionals: {
37510
37445
  names: [],
@@ -37532,7 +37467,9 @@ var awx_axi_default = {
37532
37467
  search: "value",
37533
37468
  name: "value",
37534
37469
  inventory: "value",
37535
- limit: "value"
37470
+ limit: "value",
37471
+ all: "boolean",
37472
+ "max-rows": "value"
37536
37473
  },
37537
37474
  positionals: {
37538
37475
  names: [],
@@ -37560,7 +37497,9 @@ var awx_axi_default = {
37560
37497
  search: "value",
37561
37498
  name: "value",
37562
37499
  inventory: "value",
37563
- limit: "value"
37500
+ limit: "value",
37501
+ all: "boolean",
37502
+ "max-rows": "value"
37564
37503
  },
37565
37504
  positionals: {
37566
37505
  names: [],
@@ -37590,7 +37529,9 @@ var awx_axi_default = {
37590
37529
  inventory: "value",
37591
37530
  source: "value",
37592
37531
  status: "value",
37593
- limit: "value"
37532
+ limit: "value",
37533
+ all: "boolean",
37534
+ "max-rows": "value"
37594
37535
  },
37595
37536
  positionals: {
37596
37537
  names: [],
@@ -37782,7 +37723,9 @@ var awx_axi_default = {
37782
37723
  template: "value",
37783
37724
  enabled: "boolean",
37784
37725
  disabled: "boolean",
37785
- limit: "value"
37726
+ limit: "value",
37727
+ all: "boolean",
37728
+ "max-rows": "value"
37786
37729
  },
37787
37730
  positionals: {
37788
37731
  names: [],
@@ -37883,7 +37826,9 @@ var awx_axi_default = {
37883
37826
  search: "value",
37884
37827
  organization: "value",
37885
37828
  type: "value",
37886
- limit: "value"
37829
+ limit: "value",
37830
+ all: "boolean",
37831
+ "max-rows": "value"
37887
37832
  },
37888
37833
  positionals: {
37889
37834
  names: [],
@@ -38001,7 +37946,9 @@ var awx_axi_default = {
38001
37946
  flags: {
38002
37947
  help: "boolean",
38003
37948
  search: "value",
38004
- limit: "value"
37949
+ limit: "value",
37950
+ all: "boolean",
37951
+ "max-rows": "value"
38005
37952
  },
38006
37953
  positionals: {
38007
37954
  names: [],
@@ -38035,7 +37982,9 @@ var awx_axi_default = {
38035
37982
  "inventory-update": "value",
38036
37983
  "ad-hoc": "value",
38037
37984
  "system-job": "value",
38038
- limit: "value"
37985
+ limit: "value",
37986
+ all: "boolean",
37987
+ "max-rows": "value"
38039
37988
  },
38040
37989
  positionals: {
38041
37990
  names: [],
@@ -38153,7 +38102,9 @@ var awx_axi_default = {
38153
38102
  search: "value",
38154
38103
  type: "value",
38155
38104
  organization: "value",
38156
- limit: "value"
38105
+ limit: "value",
38106
+ all: "boolean",
38107
+ "max-rows": "value"
38157
38108
  },
38158
38109
  positionals: {
38159
38110
  names: [],
@@ -38190,7 +38141,9 @@ var awx_axi_default = {
38190
38141
  team: "value",
38191
38142
  user: "value",
38192
38143
  credential: "value",
38193
- limit: "value"
38144
+ limit: "value",
38145
+ all: "boolean",
38146
+ "max-rows": "value"
38194
38147
  },
38195
38148
  positionals: {
38196
38149
  names: [],
@@ -38318,7 +38271,9 @@ var awx_axi_default = {
38318
38271
  help: "boolean",
38319
38272
  search: "value",
38320
38273
  organization: "value",
38321
- limit: "value"
38274
+ limit: "value",
38275
+ all: "boolean",
38276
+ "max-rows": "value"
38322
38277
  },
38323
38278
  positionals: {
38324
38279
  names: [],
@@ -38343,7 +38298,9 @@ var awx_axi_default = {
38343
38298
  effect: "read",
38344
38299
  flags: {
38345
38300
  help: "boolean",
38346
- limit: "value"
38301
+ limit: "value",
38302
+ all: "boolean",
38303
+ "max-rows": "value"
38347
38304
  },
38348
38305
  positionals: {
38349
38306
  names: [
@@ -38357,7 +38314,9 @@ var awx_axi_default = {
38357
38314
  effect: "read",
38358
38315
  flags: {
38359
38316
  help: "boolean",
38360
- limit: "value"
38317
+ limit: "value",
38318
+ all: "boolean",
38319
+ "max-rows": "value"
38361
38320
  },
38362
38321
  positionals: {
38363
38322
  names: [
@@ -38371,7 +38330,9 @@ var awx_axi_default = {
38371
38330
  effect: "read",
38372
38331
  flags: {
38373
38332
  help: "boolean",
38374
- limit: "value"
38333
+ limit: "value",
38334
+ all: "boolean",
38335
+ "max-rows": "value"
38375
38336
  },
38376
38337
  positionals: {
38377
38338
  names: [
@@ -38385,7 +38346,9 @@ var awx_axi_default = {
38385
38346
  effect: "read",
38386
38347
  flags: {
38387
38348
  help: "boolean",
38388
- limit: "value"
38349
+ limit: "value",
38350
+ all: "boolean",
38351
+ "max-rows": "value"
38389
38352
  },
38390
38353
  positionals: {
38391
38354
  names: [
@@ -38399,7 +38362,9 @@ var awx_axi_default = {
38399
38362
  effect: "read",
38400
38363
  flags: {
38401
38364
  help: "boolean",
38402
- limit: "value"
38365
+ limit: "value",
38366
+ all: "boolean",
38367
+ "max-rows": "value"
38403
38368
  },
38404
38369
  positionals: {
38405
38370
  names: [
@@ -38413,7 +38378,9 @@ var awx_axi_default = {
38413
38378
  effect: "read",
38414
38379
  flags: {
38415
38380
  help: "boolean",
38416
- limit: "value"
38381
+ limit: "value",
38382
+ all: "boolean",
38383
+ "max-rows": "value"
38417
38384
  },
38418
38385
  positionals: {
38419
38386
  names: [
@@ -38463,7 +38430,9 @@ var awx_axi_default = {
38463
38430
  help: "boolean",
38464
38431
  search: "value",
38465
38432
  type: "value",
38466
- limit: "value"
38433
+ limit: "value",
38434
+ all: "boolean",
38435
+ "max-rows": "value"
38467
38436
  },
38468
38437
  positionals: {
38469
38438
  names: [],
@@ -38488,7 +38457,9 @@ var awx_axi_default = {
38488
38457
  effect: "read",
38489
38458
  flags: {
38490
38459
  help: "boolean",
38491
- limit: "value"
38460
+ limit: "value",
38461
+ all: "boolean",
38462
+ "max-rows": "value"
38492
38463
  },
38493
38464
  positionals: {
38494
38465
  names: [
@@ -38502,7 +38473,9 @@ var awx_axi_default = {
38502
38473
  effect: "read",
38503
38474
  flags: {
38504
38475
  help: "boolean",
38505
- limit: "value"
38476
+ limit: "value",
38477
+ all: "boolean",
38478
+ "max-rows": "value"
38506
38479
  },
38507
38480
  positionals: {
38508
38481
  names: [
@@ -38516,7 +38489,9 @@ var awx_axi_default = {
38516
38489
  effect: "read",
38517
38490
  flags: {
38518
38491
  help: "boolean",
38519
- limit: "value"
38492
+ limit: "value",
38493
+ all: "boolean",
38494
+ "max-rows": "value"
38520
38495
  },
38521
38496
  positionals: {
38522
38497
  names: [
@@ -38530,7 +38505,9 @@ var awx_axi_default = {
38530
38505
  effect: "read",
38531
38506
  flags: {
38532
38507
  help: "boolean",
38533
- limit: "value"
38508
+ limit: "value",
38509
+ all: "boolean",
38510
+ "max-rows": "value"
38534
38511
  },
38535
38512
  positionals: {
38536
38513
  names: [
@@ -38641,8 +38618,1210 @@ var awx_axi_default = {
38641
38618
  ]
38642
38619
  };
38643
38620
 
38621
+ // tools/inventories/tenable-axi.json
38622
+ var tenable_axi_default = {
38623
+ generatedBy: "scripts/tenable-inventory.mjs",
38624
+ tool: "tenable-axi",
38625
+ version: "0.1.0",
38626
+ integrity: "sha512-nw1HLOmUZdeo/x1po1uOmFQhZsg0rP1eMGrcwLj+Pd2UkdwKodAQjDCjgBdl5DNLIqaafkUEV6mPMJmkFLQpzw==",
38627
+ parserEvidence: "Published command catalogue, mutation registry and reviewed native parsers and transport gates",
38628
+ sources: [
38629
+ {
38630
+ path: "dist/src/attack-catalogue.js",
38631
+ sha256: "022f9d46c0e0a76b62ed528b17552fccae9634208698e541146f8af2f6107316"
38632
+ },
38633
+ {
38634
+ path: "dist/src/attack-export-catalogue.js",
38635
+ sha256: "7127a33fdbb01db34886b2c91b36bdc174131819b5753c1201c56999389584ee"
38636
+ },
38637
+ {
38638
+ path: "dist/src/attack-export.js",
38639
+ sha256: "38adf6d13ab1afe4f8d0123803257c2f10a1c47b9a7f9b216ee9107ea30368c8"
38640
+ },
38641
+ {
38642
+ path: "dist/src/attack.js",
38643
+ sha256: "76905fe54d1038ffbaa6b4a82b4cb4fadb6473462d28679319a98ab7cdd08650"
38644
+ },
38645
+ {
38646
+ path: "dist/src/catalogue.js",
38647
+ sha256: "d05c8dfebce3219c2ee0a305888fa336e62db5fc3b3b4bc95a27c0588943587b"
38648
+ },
38649
+ {
38650
+ path: "dist/src/cli.js",
38651
+ sha256: "df6dfee98019af2da15ac7a3c4d1ea7b3860c73021cbf2f08ac52386a64f441c"
38652
+ },
38653
+ {
38654
+ path: "dist/src/export-file.js",
38655
+ sha256: "2eb4f73e2d9a3361283a62e887c6cf95de70d5d3f353441bcd4de738377d57df"
38656
+ },
38657
+ {
38658
+ path: "dist/src/exposure-contracts.js",
38659
+ sha256: "febe68635d243ce801607d76af753d21f2ff30712c0efe9c3a2805209cc4b915"
38660
+ },
38661
+ {
38662
+ path: "dist/src/exposure.js",
38663
+ sha256: "0278853a917eb583c721c69d10c5e466aed9d18c8d910f20991dcfe33faac738"
38664
+ },
38665
+ {
38666
+ path: "dist/src/hook-install.js",
38667
+ sha256: "74fce246ea8fd1ee83bc89f06ab71b3bbf10b2b6ebce0701d24c95eae7755668"
38668
+ },
38669
+ {
38670
+ path: "dist/src/inventory-catalogue.js",
38671
+ sha256: "2a4b4338917af9060b6859eaa2cfc94cc5ccb936bf96f744b51755d4d92d98a7"
38672
+ },
38673
+ {
38674
+ path: "dist/src/inventory-export-catalogue.js",
38675
+ sha256: "a85ef57098bdec74dccd587b7065ebb4c84b3902043fc87c8aedd878d74b375f"
38676
+ },
38677
+ {
38678
+ path: "dist/src/inventory-export.js",
38679
+ sha256: "5422b59008eecad8476d8c0ce5f287188a2f1ad4fcfe763450ac187423d7d0f2"
38680
+ },
38681
+ {
38682
+ path: "dist/src/inventory.js",
38683
+ sha256: "12ad8effb2728fea7791e5f62716d079484b377c56f8b9cdb83d500842258b7d"
38684
+ },
38685
+ {
38686
+ path: "dist/src/inventory/schema.js",
38687
+ sha256: "1dc7cf0f1fb0e07dcf79bcac7e41450e1394345fc4fcd410119ab639064926af"
38688
+ },
38689
+ {
38690
+ path: "dist/src/local-commands.js",
38691
+ sha256: "4bb2769049b72126c47857f850b3cd008a371f952c479e0b288d5279d7aaa77a"
38692
+ },
38693
+ {
38694
+ path: "dist/src/platform-tag-catalogue.js",
38695
+ sha256: "9c887c06dd1179a877696deae8873ffce5e3b3e001f2c61ae7968f883eafe314"
38696
+ },
38697
+ {
38698
+ path: "dist/src/platform-tag.js",
38699
+ sha256: "ff31eb9a454ba20d2e378403fd4cb29b097e8de4b8b241b3af13197598a66972"
38700
+ },
38701
+ {
38702
+ path: "dist/src/private-file.js",
38703
+ sha256: "a5f01182fe09394ecf508deb46d54c9fb0b39c9fd205094d155ace212bbd1c8b"
38704
+ },
38705
+ {
38706
+ path: "dist/src/profiles.js",
38707
+ sha256: "12defbf234e4da8584e1f6ba601eb3826733ff85c76445197b0162ac52299b4a"
38708
+ },
38709
+ {
38710
+ path: "dist/src/redact.js",
38711
+ sha256: "e88631746e63a7fc08f206b58ddf3754ecea6f0ec21011c37ded0114dfbb6830"
38712
+ },
38713
+ {
38714
+ path: "dist/src/response-catalogue.js",
38715
+ sha256: "6f0eb3f6ba860e59e7bfd764a0d3932b52101e4013acea4ee5aa63081a1f83db"
38716
+ },
38717
+ {
38718
+ path: "dist/src/response.js",
38719
+ sha256: "44277f2a0c28b3e6801c47578603270ed59c76aac5214c6428fd2dbf8a83f1d4"
38720
+ },
38721
+ {
38722
+ path: "dist/src/setup.js",
38723
+ sha256: "2e9c8430b4fbf0f95e0e31267ba828107fd054e9d525a5c970f7c9c2e20d5348"
38724
+ },
38725
+ {
38726
+ path: "dist/src/transport-core.js",
38727
+ sha256: "db13c1c33aa1716bc8a32e3ebc6459421c64f078ea4641f248e552c5b74a621d"
38728
+ },
38729
+ {
38730
+ path: "dist/src/transport.js",
38731
+ sha256: "c3639f96d71c80217da15fe7449b586ee797c94e9f4f6b3f22d0472613d28ee1"
38732
+ },
38733
+ {
38734
+ path: "dist/src/writes-core.js",
38735
+ sha256: "55a76961512751653c8d14778b6b74094318ba1527b50dedf2167127f1e7c1f9"
38736
+ },
38737
+ {
38738
+ path: "dist/src/writes.js",
38739
+ sha256: "43099c373b451991102515f0f583c9a7678edb89a5b6bc9ad7e261a1c1f4a5dd"
38740
+ }
38741
+ ],
38742
+ credentialSchema: {
38743
+ $schema: "https://json-schema.org/draft/2020-12/schema",
38744
+ $id: "https://github.com/knowttl/tenable-axi/axi-credential.schema.json",
38745
+ title: "Tenable AXI credential profile",
38746
+ type: "object",
38747
+ additionalProperties: false,
38748
+ properties: {
38749
+ origin: {
38750
+ const: "https://cloud.tenable.com",
38751
+ default: "https://cloud.tenable.com"
38752
+ },
38753
+ accessKey: {
38754
+ $ref: "#/$defs/secretRef",
38755
+ "x-secret": true,
38756
+ default: {
38757
+ env: "TENABLE_AXI_ACCESS_KEY"
38758
+ }
38759
+ },
38760
+ secretKey: {
38761
+ $ref: "#/$defs/secretRef",
38762
+ "x-secret": true,
38763
+ default: {
38764
+ env: "TENABLE_AXI_SECRET_KEY"
38765
+ }
38766
+ },
38767
+ writes: {
38768
+ type: "object",
38769
+ additionalProperties: false,
38770
+ required: [
38771
+ "allowWrites",
38772
+ "operations"
38773
+ ],
38774
+ default: {
38775
+ allowWrites: false,
38776
+ operations: []
38777
+ },
38778
+ properties: {
38779
+ allowWrites: {
38780
+ type: "boolean"
38781
+ },
38782
+ operations: {
38783
+ type: "array",
38784
+ items: {
38785
+ type: "string",
38786
+ pattern: "^[A-Za-z0-9][A-Za-z0-9_-]*$"
38787
+ }
38788
+ }
38789
+ }
38790
+ }
38791
+ },
38792
+ $defs: {
38793
+ secretRef: {
38794
+ oneOf: [
38795
+ {
38796
+ type: "object",
38797
+ additionalProperties: false,
38798
+ required: [
38799
+ "env"
38800
+ ],
38801
+ properties: {
38802
+ env: {
38803
+ type: "string",
38804
+ pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
38805
+ }
38806
+ }
38807
+ },
38808
+ {
38809
+ type: "object",
38810
+ additionalProperties: false,
38811
+ required: [
38812
+ "file"
38813
+ ],
38814
+ properties: {
38815
+ file: {
38816
+ type: "string",
38817
+ pattern: "^(?:/|[A-Za-z]:[\\\\/])"
38818
+ }
38819
+ }
38820
+ }
38821
+ ]
38822
+ }
38823
+ }
38824
+ },
38825
+ skillSha256: "ea35fe90d39fee3982f731ccc3c717c92aabd0799ff2371f6f3cc5e12d7aea9a",
38826
+ nativeWriteSettings: {
38827
+ supportedOperations: [
38828
+ "apa-export-attack-path",
38829
+ "apa-export-attack-technique",
38830
+ "apa-export-mitre-heatmap",
38831
+ "combinations-create",
38832
+ "combinations-delete",
38833
+ "combinations-update",
38834
+ "initiatives-create",
38835
+ "initiatives-delete",
38836
+ "initiatives-update",
38837
+ "inventory-export-assets",
38838
+ "inventory-export-findings",
38839
+ "tags-assign-asset-tags",
38840
+ "tags-create-tag-category",
38841
+ "tags-create-tag-value",
38842
+ "tags-delete-tag-category",
38843
+ "tags-delete-tag-value",
38844
+ "tags-delete-tag-values-bulk",
38845
+ "tags-edit-tag-category",
38846
+ "tags-update-tag-value"
38847
+ ]
38848
+ },
38849
+ adapterBoundary: {
38850
+ unsafeOverrides: [
38851
+ "config",
38852
+ "profile",
38853
+ "origin",
38854
+ "output"
38855
+ ],
38856
+ inputFileFlags: [
38857
+ "filter-file",
38858
+ "body-file",
38859
+ "ids-file",
38860
+ "asset-ids-file",
38861
+ "tag-ids-file"
38862
+ ],
38863
+ blockedCommands: [
38864
+ "setup hooks",
38865
+ "config path",
38866
+ "profile list",
38867
+ "hook",
38868
+ "export attack download",
38869
+ "export inventory download"
38870
+ ],
38871
+ inputs: {
38872
+ stdin: "explicit file flag with - only",
38873
+ files: "uploaded leaves only",
38874
+ downloads: "unsupported"
38875
+ },
38876
+ nativeWrites: "native preview, operation allow-list, execute, exact confirm and durable journal"
38877
+ },
38878
+ discovery: {
38879
+ commands: [
38880
+ "asset",
38881
+ "attack-path",
38882
+ "attack-technique",
38883
+ "auth",
38884
+ "card",
38885
+ "combination",
38886
+ "connector",
38887
+ "doctor",
38888
+ "export",
38889
+ "finding",
38890
+ "home",
38891
+ "initiative",
38892
+ "software",
38893
+ "tag"
38894
+ ],
38895
+ example: [
38896
+ "card",
38897
+ "list",
38898
+ "--limit",
38899
+ "1"
38900
+ ],
38901
+ 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"
38902
+ },
38903
+ suggestionFields: [
38904
+ "help"
38905
+ ],
38906
+ format: "TOON",
38907
+ commands: [
38908
+ {
38909
+ command: "asset list",
38910
+ effect: "read",
38911
+ flags: {
38912
+ config: "Config path; default credential precedence",
38913
+ profile: "Profile name; default credential precedence",
38914
+ fields: "Comma-separated display or wire properties; default compact view",
38915
+ full: "Show full text; default false",
38916
+ help: "Show help",
38917
+ limit: "Maximum emitted rows, 1-10000; default 100",
38918
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
38919
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
38920
+ query: "Simple query text",
38921
+ filter: "Repeatable: <property> <operator> <JSON string array>",
38922
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
38923
+ sort: "Wire property:asc|desc",
38924
+ "extra-properties": "Comma-separated extra wire properties",
38925
+ offset: "Starting record; default 0; excludes --cursor",
38926
+ class: "Server-side asset class filter"
38927
+ }
38928
+ },
38929
+ {
38930
+ command: "asset properties",
38931
+ effect: "read",
38932
+ flags: {
38933
+ config: "Config path; default credential precedence",
38934
+ profile: "Profile name; default credential precedence",
38935
+ fields: "Comma-separated display or wire properties; default compact view",
38936
+ full: "Show full text; default false",
38937
+ help: "Show help",
38938
+ limit: "Maximum emitted rows, 1-10000; default 100",
38939
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
38940
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
38941
+ "asset-classes": "Comma-separated documented asset classes"
38942
+ }
38943
+ },
38944
+ {
38945
+ command: "asset show",
38946
+ effect: "read",
38947
+ flags: {
38948
+ config: "Config path; default credential precedence",
38949
+ profile: "Profile name; default credential precedence",
38950
+ fields: "Comma-separated display or wire properties; default compact view",
38951
+ full: "Show full text; default false",
38952
+ help: "Show help",
38953
+ id: "Required exact inventory ID",
38954
+ "extra-properties": "Comma-separated extra wire properties"
38955
+ }
38956
+ },
38957
+ {
38958
+ command: "attack-path list",
38959
+ effect: "read",
38960
+ flags: {
38961
+ config: "Config path; default credential precedence",
38962
+ profile: "Profile name; default credential precedence",
38963
+ fields: "Comma-separated display or wire fields; default compact view",
38964
+ full: "Show full text; default false",
38965
+ help: "Show help",
38966
+ limit: "Maximum emitted rows, 1-10000; default 100",
38967
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
38968
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
38969
+ offset: "Starting record; default 0; excludes --cursor",
38970
+ sort: "Documented wire property:direction",
38971
+ filter: "Repeatable: <property> <operator> <JSON-value>; combines with AND (paths) or and (techniques)",
38972
+ "filter-file": "Documented single or nested JSON filter, at most two logical levels; '-' reads stdin; excludes --filter",
38973
+ "include-resolved": "Include resolved records; default false (exclude_resolved=true)",
38974
+ "run-ai-summarization": "true|false; default false"
38975
+ }
38976
+ },
38977
+ {
38978
+ command: "attack-technique list",
38979
+ effect: "read",
38980
+ flags: {
38981
+ config: "Config path; default credential precedence",
38982
+ profile: "Profile name; default credential precedence",
38983
+ fields: "Comma-separated display or wire fields; default compact view",
38984
+ full: "Show full text; default false",
38985
+ help: "Show help",
38986
+ limit: "Maximum emitted rows, 1-10000; default 100",
38987
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
38988
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
38989
+ offset: "Starting record; default 0; excludes --cursor",
38990
+ sort: "Documented wire property:direction",
38991
+ filter: "Repeatable: <property> <operator> <JSON-value>; combines with AND (paths) or and (techniques)",
38992
+ "filter-file": "Documented single or nested JSON filter, at most two logical levels; '-' reads stdin; excludes --filter",
38993
+ "include-resolved": "Include resolved records; default false (exclude_resolved=true)"
38994
+ }
38995
+ },
38996
+ {
38997
+ command: "auth status",
38998
+ effect: "read",
38999
+ flags: {
39000
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39001
+ profile: "Profile name; default credential precedence",
39002
+ fields: "Comma-separated output fields; default all",
39003
+ full: "Show full text; default false",
39004
+ help: "Show help; default false"
39005
+ }
39006
+ },
39007
+ {
39008
+ command: "card list",
39009
+ effect: "read",
39010
+ flags: {
39011
+ config: "Config path; default platform path",
39012
+ profile: "Profile name; default credential precedence",
39013
+ fields: "Comma-separated output fields; default compact projection",
39014
+ full: "Full text; default false",
39015
+ help: "Show help; default false",
39016
+ limit: "Output rows; default 100",
39017
+ offset: "Starting record; default 0",
39018
+ cursor: "Resume the same scoped collection",
39019
+ all: "Read up to 10000 rows; incompatible with --limit",
39020
+ global: "true or false; default all cards",
39021
+ query: "Card name search",
39022
+ "sorting-order": "asc or desc; default API order"
39023
+ }
39024
+ },
39025
+ {
39026
+ command: "card show",
39027
+ effect: "read",
39028
+ flags: {
39029
+ config: "Config path; default platform path",
39030
+ profile: "Profile name; default credential precedence",
39031
+ fields: "Comma-separated output fields; default compact projection",
39032
+ full: "Full text; default false",
39033
+ help: "Show help; default false",
39034
+ id: "Required card ID",
39035
+ "trend-start-date": "UTC ISO timestamp",
39036
+ "trend-end-date": "UTC ISO timestamp",
39037
+ "sla-efficiency-start-date": "UTC ISO timestamp",
39038
+ "sla-efficiency-end-date": "UTC ISO timestamp",
39039
+ "sla-breakdown-filter": "ANY, REMEDIATED or NON_REMEDIATED; default ANY",
39040
+ "include-trend-events": "true or false; default false"
39041
+ }
39042
+ },
39043
+ {
39044
+ command: "combination create",
39045
+ effect: "write",
39046
+ flags: {
39047
+ config: "Config path; default credential precedence",
39048
+ profile: "Profile name; default credential precedence",
39049
+ fields: "Comma-separated fields; default compact view",
39050
+ full: "Full text; default false",
39051
+ help: "Show help",
39052
+ execute: "Send once; default preview",
39053
+ "dry-run": "Preview only; excludes --execute",
39054
+ confirm: "Exact preview confirmation; required to execute",
39055
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39056
+ }
39057
+ },
39058
+ {
39059
+ command: "combination delete",
39060
+ effect: "write",
39061
+ flags: {
39062
+ config: "Config path; default credential precedence",
39063
+ profile: "Profile name; default credential precedence",
39064
+ fields: "Comma-separated fields; default compact view",
39065
+ full: "Full text; default false",
39066
+ help: "Show help",
39067
+ id: "Required exact UUID",
39068
+ execute: "Send once; default preview",
39069
+ "dry-run": "Preview only; excludes --execute",
39070
+ confirm: "Exact preview confirmation; required to execute"
39071
+ }
39072
+ },
39073
+ {
39074
+ command: "combination filters",
39075
+ effect: "read",
39076
+ flags: {
39077
+ config: "Config path; default credential precedence",
39078
+ profile: "Profile name; default credential precedence",
39079
+ fields: "Comma-separated fields; default compact view",
39080
+ full: "Full text; default false",
39081
+ help: "Show help",
39082
+ limit: "Output rows; default 100, maximum 10000",
39083
+ all: "Up to 10000 rows; excludes --limit",
39084
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors"
39085
+ }
39086
+ },
39087
+ {
39088
+ command: "combination list",
39089
+ effect: "read",
39090
+ flags: {
39091
+ config: "Config path; default credential precedence",
39092
+ profile: "Profile name; default credential precedence",
39093
+ fields: "Comma-separated fields; default compact view",
39094
+ full: "Full text; default false",
39095
+ help: "Show help",
39096
+ limit: "Output rows; default 100, maximum 10000",
39097
+ all: "Up to 10000 rows; excludes --limit",
39098
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors",
39099
+ type: "private, shared or tenable; default all accessible"
39100
+ }
39101
+ },
39102
+ {
39103
+ command: "combination show",
39104
+ effect: "read",
39105
+ flags: {
39106
+ config: "Config path; default credential precedence",
39107
+ profile: "Profile name; default credential precedence",
39108
+ fields: "Comma-separated fields; default compact view",
39109
+ full: "Full text; default false",
39110
+ help: "Show help",
39111
+ id: "Required exact UUID"
39112
+ }
39113
+ },
39114
+ {
39115
+ command: "combination update",
39116
+ effect: "write",
39117
+ flags: {
39118
+ config: "Config path; default credential precedence",
39119
+ profile: "Profile name; default credential precedence",
39120
+ fields: "Comma-separated fields; default compact view",
39121
+ full: "Full text; default false",
39122
+ help: "Show help",
39123
+ id: "Required exact UUID",
39124
+ execute: "Send once; default preview",
39125
+ "dry-run": "Preview only; excludes --execute",
39126
+ confirm: "Exact preview confirmation; required to execute",
39127
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39128
+ }
39129
+ },
39130
+ {
39131
+ command: "config path",
39132
+ effect: "blocked",
39133
+ flags: {
39134
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39135
+ profile: "Common selector; paths are independent of profile",
39136
+ fields: "Comma-separated output fields; default all",
39137
+ full: "Show full text; default false",
39138
+ help: "Show help; default false"
39139
+ }
39140
+ },
39141
+ {
39142
+ command: "connector logs",
39143
+ effect: "read",
39144
+ flags: {
39145
+ config: "Config path; default credential precedence",
39146
+ profile: "Profile name; default credential precedence",
39147
+ fields: "Comma-separated display or wire fields; default compact view",
39148
+ full: "Show full text; default false",
39149
+ help: "Show help",
39150
+ limit: "Maximum emitted rows, 1-10000; default 100",
39151
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39152
+ cursor: "Bounded resume cursor; retain original selectors, filters, sort and fields",
39153
+ "connector-id": "Nonnegative numeric connector ID",
39154
+ status: "SUCCEEDED|FAILED",
39155
+ "start-date": "Inclusive YYYY-MM-DD; requires --end-date",
39156
+ "end-date": "Exclusive YYYY-MM-DD; requires --start-date"
39157
+ }
39158
+ },
39159
+ {
39160
+ command: "doctor",
39161
+ effect: "read",
39162
+ flags: {
39163
+ config: "Config path; default platform path",
39164
+ profile: "Profile name; default credential precedence",
39165
+ fields: "Comma-separated output fields; default compact projection",
39166
+ full: "Full text; default false",
39167
+ help: "Show help; default false"
39168
+ }
39169
+ },
39170
+ {
39171
+ command: "export asset jobs",
39172
+ effect: "read",
39173
+ flags: {
39174
+ config: "Config path; default platform path",
39175
+ profile: "Profile name; default credential precedence",
39176
+ fields: "Comma-separated output fields; default compact view",
39177
+ full: "Full output; default false",
39178
+ help: "Show help",
39179
+ status: "QUEUED|PROCESSING|FINISHED|ERROR",
39180
+ limit: "1-1000; default 100; last three days only"
39181
+ }
39182
+ },
39183
+ {
39184
+ command: "export asset start",
39185
+ effect: "write",
39186
+ flags: {
39187
+ config: "Config path; default platform path",
39188
+ profile: "Profile name; default credential precedence",
39189
+ fields: "Comma-separated output fields; default compact view",
39190
+ full: "Full output; default false",
39191
+ help: "Show help",
39192
+ "body-file": "Optional strict query/filters JSON file, '-' for stdin; maximum 1 MiB",
39193
+ properties: "Comma-separated property names",
39194
+ "use-readable-name": "true|false; API default true",
39195
+ "max-chunk-file-size": "5242880-104857600 bytes; API default 20971520",
39196
+ sort: "property:asc|desc",
39197
+ "file-format": "JSON|CSV; API default JSON",
39198
+ compress: "true|false; API default false",
39199
+ execute: "Create once; default preview",
39200
+ "dry-run": "Explicit preview; excludes --execute",
39201
+ confirm: "Exact confirmation from preview",
39202
+ "intent-id": "Unique execution intent for replay protection"
39203
+ }
39204
+ },
39205
+ {
39206
+ command: "export attack download",
39207
+ effect: "blocked",
39208
+ flags: {
39209
+ config: "Config path; default credential precedence",
39210
+ profile: "Profile name; default credential precedence",
39211
+ fields: "Comma-separated metadata fields; default compact view",
39212
+ full: "Full metadata text; default false",
39213
+ help: "Show help",
39214
+ id: "Required attack export UUID",
39215
+ output: "Required new output file; overwrite refused"
39216
+ }
39217
+ },
39218
+ {
39219
+ command: "export attack status",
39220
+ effect: "read",
39221
+ flags: {
39222
+ config: "Config path; default credential precedence",
39223
+ profile: "Profile name; default credential precedence",
39224
+ fields: "Comma-separated metadata fields; default compact view",
39225
+ full: "Full metadata text; default false",
39226
+ help: "Show help",
39227
+ id: "Required attack export UUID",
39228
+ wait: "Poll once per second within 20-second/20-request budgets; default false"
39229
+ }
39230
+ },
39231
+ {
39232
+ command: "export attack-path start",
39233
+ effect: "write",
39234
+ flags: {
39235
+ config: "Config path; default credential precedence",
39236
+ profile: "Profile name; default credential precedence",
39237
+ fields: "Comma-separated metadata fields; default compact view",
39238
+ full: "Full metadata text; default false",
39239
+ help: "Show help",
39240
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39241
+ execute: "Create the previewed job once; default false",
39242
+ "dry-run": "Preview only; excludes --execute",
39243
+ confirm: "Exact confirmation string from preview; required with --execute"
39244
+ }
39245
+ },
39246
+ {
39247
+ command: "export attack-technique start",
39248
+ effect: "write",
39249
+ flags: {
39250
+ config: "Config path; default credential precedence",
39251
+ profile: "Profile name; default credential precedence",
39252
+ fields: "Comma-separated metadata fields; default compact view",
39253
+ full: "Full metadata text; default false",
39254
+ help: "Show help",
39255
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39256
+ execute: "Create the previewed job once; default false",
39257
+ "dry-run": "Preview only; excludes --execute",
39258
+ confirm: "Exact confirmation string from preview; required with --execute"
39259
+ }
39260
+ },
39261
+ {
39262
+ command: "export finding jobs",
39263
+ effect: "read",
39264
+ flags: {
39265
+ config: "Config path; default platform path",
39266
+ profile: "Profile name; default credential precedence",
39267
+ fields: "Comma-separated output fields; default compact view",
39268
+ full: "Full output; default false",
39269
+ help: "Show help",
39270
+ status: "QUEUED|PROCESSING|FINISHED|ERROR",
39271
+ limit: "1-1000; default 100; last three days only"
39272
+ }
39273
+ },
39274
+ {
39275
+ command: "export finding start",
39276
+ effect: "write",
39277
+ flags: {
39278
+ config: "Config path; default platform path",
39279
+ profile: "Profile name; default credential precedence",
39280
+ fields: "Comma-separated output fields; default compact view",
39281
+ full: "Full output; default false",
39282
+ help: "Show help",
39283
+ "body-file": "Optional strict query/filters JSON file, '-' for stdin; maximum 1 MiB",
39284
+ properties: "Comma-separated property names",
39285
+ "use-readable-name": "true|false; API default true",
39286
+ "max-chunk-file-size": "5242880-104857600 bytes; API default 20971520",
39287
+ sort: "property:asc|desc",
39288
+ "file-format": "JSON|CSV; API default JSON",
39289
+ compress: "true|false; API default false",
39290
+ execute: "Create once; default preview",
39291
+ "dry-run": "Explicit preview; excludes --execute",
39292
+ confirm: "Exact confirmation from preview",
39293
+ "intent-id": "Unique execution intent for replay protection"
39294
+ }
39295
+ },
39296
+ {
39297
+ command: "export inventory download",
39298
+ effect: "blocked",
39299
+ flags: {
39300
+ config: "Config path; default platform path",
39301
+ profile: "Profile name; default credential precedence",
39302
+ fields: "Comma-separated output fields; default compact view",
39303
+ full: "Full output; default false",
39304
+ help: "Show help",
39305
+ id: "Required export UUID",
39306
+ chunk: "Required nonnegative chunk number from status",
39307
+ output: "Required new output file; refuses overwrite"
39308
+ }
39309
+ },
39310
+ {
39311
+ command: "export inventory status",
39312
+ effect: "read",
39313
+ flags: {
39314
+ config: "Config path; default platform path",
39315
+ profile: "Profile name; default credential precedence",
39316
+ fields: "Comma-separated output fields; default compact view",
39317
+ full: "Full output; default false",
39318
+ help: "Show help",
39319
+ id: "Required export UUID"
39320
+ }
39321
+ },
39322
+ {
39323
+ command: "export mitre-heatmap start",
39324
+ effect: "write",
39325
+ flags: {
39326
+ config: "Config path; default credential precedence",
39327
+ profile: "Profile name; default credential precedence",
39328
+ fields: "Comma-separated metadata fields; default compact view",
39329
+ full: "Full metadata text; default false",
39330
+ help: "Show help",
39331
+ "body-file": "Required strict operation-specific JSON file, at most 1 MiB; '-' reads stdin",
39332
+ execute: "Create the previewed job once; default false",
39333
+ "dry-run": "Preview only; excludes --execute",
39334
+ confirm: "Exact confirmation string from preview; required with --execute"
39335
+ }
39336
+ },
39337
+ {
39338
+ command: "finding list",
39339
+ effect: "read",
39340
+ flags: {
39341
+ config: "Config path; default credential precedence",
39342
+ profile: "Profile name; default credential precedence",
39343
+ fields: "Comma-separated display or wire properties; default compact view",
39344
+ full: "Show full text; default false",
39345
+ help: "Show help",
39346
+ limit: "Maximum emitted rows, 1-10000; default 100",
39347
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39348
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39349
+ query: "Simple query text",
39350
+ filter: "Repeatable: <property> <operator> <JSON string array>",
39351
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
39352
+ sort: "Wire property:asc|desc",
39353
+ "extra-properties": "Comma-separated extra wire properties",
39354
+ offset: "Starting record; default 0; excludes --cursor"
39355
+ }
39356
+ },
39357
+ {
39358
+ command: "finding properties",
39359
+ effect: "read",
39360
+ flags: {
39361
+ config: "Config path; default credential precedence",
39362
+ profile: "Profile name; default credential precedence",
39363
+ fields: "Comma-separated display or wire properties; default compact view",
39364
+ full: "Show full text; default false",
39365
+ help: "Show help",
39366
+ limit: "Maximum emitted rows, 1-10000; default 100",
39367
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39368
+ cursor: "Opaque resume cursor; retain the original selectors and filters"
39369
+ }
39370
+ },
39371
+ {
39372
+ command: "finding show",
39373
+ effect: "read",
39374
+ flags: {
39375
+ config: "Config path; default credential precedence",
39376
+ profile: "Profile name; default credential precedence",
39377
+ fields: "Comma-separated display or wire properties; default compact view",
39378
+ full: "Show full text; default false",
39379
+ help: "Show help",
39380
+ id: "Required exact inventory ID",
39381
+ "extra-properties": "Comma-separated extra wire properties"
39382
+ }
39383
+ },
39384
+ {
39385
+ command: "home",
39386
+ effect: "read",
39387
+ flags: {
39388
+ config: "Config path; default platform path",
39389
+ profile: "Profile name; default credential precedence",
39390
+ fields: "Card fields; default id,name,score",
39391
+ full: "Full text; default false",
39392
+ help: "Show help; default false"
39393
+ }
39394
+ },
39395
+ {
39396
+ command: "hook",
39397
+ effect: "blocked",
39398
+ flags: {
39399
+ config: "Config path; default platform path",
39400
+ profile: "Profile name; default credential precedence",
39401
+ fields: "Comma-separated output fields; default compact projection",
39402
+ full: "Full text; default false",
39403
+ help: "Show help; default false"
39404
+ }
39405
+ },
39406
+ {
39407
+ command: "initiative create",
39408
+ effect: "write",
39409
+ flags: {
39410
+ config: "Config path; default credential precedence",
39411
+ profile: "Profile name; default credential precedence",
39412
+ fields: "Comma-separated fields; default compact view",
39413
+ full: "Full text; default false",
39414
+ help: "Show help",
39415
+ execute: "Send once; default preview",
39416
+ "dry-run": "Preview only; excludes --execute",
39417
+ confirm: "Exact preview confirmation; required to execute",
39418
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39419
+ }
39420
+ },
39421
+ {
39422
+ command: "initiative delete",
39423
+ effect: "write",
39424
+ flags: {
39425
+ config: "Config path; default credential precedence",
39426
+ profile: "Profile name; default credential precedence",
39427
+ fields: "Comma-separated fields; default compact view",
39428
+ full: "Full text; default false",
39429
+ help: "Show help",
39430
+ id: "Required exact UUID",
39431
+ execute: "Send once; default preview",
39432
+ "dry-run": "Preview only; excludes --execute",
39433
+ confirm: "Exact preview confirmation; required to execute"
39434
+ }
39435
+ },
39436
+ {
39437
+ command: "initiative list",
39438
+ effect: "read",
39439
+ flags: {
39440
+ config: "Config path; default credential precedence",
39441
+ profile: "Profile name; default credential precedence",
39442
+ fields: "Comma-separated fields; default compact view",
39443
+ full: "Full text; default false",
39444
+ help: "Show help",
39445
+ limit: "Output rows; default 100, maximum 10000",
39446
+ all: "Up to 10000 rows; excludes --limit",
39447
+ cursor: "Re-fetch and resume an unchanged unpaged collection; requires original selectors"
39448
+ }
39449
+ },
39450
+ {
39451
+ command: "initiative show",
39452
+ effect: "read",
39453
+ flags: {
39454
+ config: "Config path; default credential precedence",
39455
+ profile: "Profile name; default credential precedence",
39456
+ fields: "Comma-separated fields; default compact view",
39457
+ full: "Full text; default false",
39458
+ help: "Show help",
39459
+ id: "Required exact UUID"
39460
+ }
39461
+ },
39462
+ {
39463
+ command: "initiative update",
39464
+ effect: "write",
39465
+ flags: {
39466
+ config: "Config path; default credential precedence",
39467
+ profile: "Profile name; default credential precedence",
39468
+ fields: "Comma-separated fields; default compact view",
39469
+ full: "Full text; default false",
39470
+ help: "Show help",
39471
+ id: "Required exact UUID",
39472
+ execute: "Send once; default preview",
39473
+ "dry-run": "Preview only; excludes --execute",
39474
+ confirm: "Exact preview confirmation; required to execute",
39475
+ "body-file": "Required strict JSON, at most 1 MiB; '-' reads stdin"
39476
+ }
39477
+ },
39478
+ {
39479
+ command: "profile list",
39480
+ effect: "blocked",
39481
+ flags: {
39482
+ config: "Config path; default TENABLE_AXI_CONFIG or platform path",
39483
+ profile: "Common selector; list still shows all profiles",
39484
+ fields: "Comma-separated output fields; default all",
39485
+ full: "Show full text; default false",
39486
+ help: "Show help; default false"
39487
+ }
39488
+ },
39489
+ {
39490
+ command: "setup hooks",
39491
+ effect: "blocked",
39492
+ flags: {
39493
+ scope: "user or project; default user; project targets the current directory",
39494
+ help: "Show help; default false"
39495
+ }
39496
+ },
39497
+ {
39498
+ command: "software list",
39499
+ effect: "read",
39500
+ flags: {
39501
+ config: "Config path; default credential precedence",
39502
+ profile: "Profile name; default credential precedence",
39503
+ fields: "Comma-separated display or wire properties; default compact view",
39504
+ full: "Show full text; default false",
39505
+ help: "Show help",
39506
+ limit: "Maximum emitted rows, 1-10000; default 100",
39507
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39508
+ cursor: "Opaque resume cursor; retain the original selectors and filters",
39509
+ query: "Simple query text",
39510
+ filter: "Repeatable: <property> <operator> <JSON string array>",
39511
+ "filter-file": "JSON flat array of {property, operator, value: string[]}; '-' reads stdin; excludes --filter",
39512
+ sort: "Wire property:asc|desc",
39513
+ "extra-properties": "Comma-separated extra wire properties",
39514
+ offset: "Starting record; default 0; excludes --cursor"
39515
+ }
39516
+ },
39517
+ {
39518
+ command: "software properties",
39519
+ effect: "read",
39520
+ flags: {
39521
+ config: "Config path; default credential precedence",
39522
+ profile: "Profile name; default credential precedence",
39523
+ fields: "Comma-separated display or wire properties; default compact view",
39524
+ full: "Show full text; default false",
39525
+ help: "Show help",
39526
+ limit: "Maximum emitted rows, 1-10000; default 100",
39527
+ all: "Read up to 10000 rows within invocation budgets; excludes --limit",
39528
+ cursor: "Opaque resume cursor; retain the original selectors and filters"
39529
+ }
39530
+ },
39531
+ {
39532
+ command: "tag asset-filter list",
39533
+ effect: "read",
39534
+ flags: {
39535
+ config: "Config path; default platform path",
39536
+ profile: "Profile name; default credential precedence",
39537
+ fields: "Comma-separated output fields; default compact view",
39538
+ full: "Full text; default false",
39539
+ help: "Show help",
39540
+ limit: "Output rows; default 100; maximum 10000",
39541
+ cursor: "Resume the same scoped collection",
39542
+ all: "Read at most 10000 rows; excludes --limit"
39543
+ }
39544
+ },
39545
+ {
39546
+ command: "tag assignment add",
39547
+ effect: "write",
39548
+ flags: {
39549
+ config: "Config path; default platform path",
39550
+ profile: "Profile name; default credential precedence",
39551
+ fields: "Comma-separated output fields; default compact view",
39552
+ full: "Full text; default false",
39553
+ help: "Show help",
39554
+ execute: "Execute once; default preview",
39555
+ "dry-run": "Explicit preview; excludes --execute",
39556
+ confirm: "Exact confirmation from preview",
39557
+ "intent-id": "Unique execution intent for replay protection",
39558
+ "asset-ids-file": "Required JSON asset UUID array; '-' for stdin",
39559
+ "tag-ids-file": "Required JSON tag UUID array; '-' for stdin"
39560
+ }
39561
+ },
39562
+ {
39563
+ command: "tag assignment list",
39564
+ effect: "read",
39565
+ flags: {
39566
+ config: "Config path; default platform path",
39567
+ profile: "Profile name; default credential precedence",
39568
+ fields: "Comma-separated output fields; default compact view",
39569
+ full: "Full text; default false",
39570
+ help: "Show help",
39571
+ "asset-id": "Required exact asset UUID",
39572
+ limit: "Output rows; default 100; maximum 10000",
39573
+ cursor: "Resume the same scoped collection",
39574
+ all: "Read at most 10000 rows; excludes --limit"
39575
+ }
39576
+ },
39577
+ {
39578
+ command: "tag assignment remove",
39579
+ effect: "write",
39580
+ flags: {
39581
+ config: "Config path; default platform path",
39582
+ profile: "Profile name; default credential precedence",
39583
+ fields: "Comma-separated output fields; default compact view",
39584
+ full: "Full text; default false",
39585
+ help: "Show help",
39586
+ execute: "Execute once; default preview",
39587
+ "dry-run": "Explicit preview; excludes --execute",
39588
+ confirm: "Exact confirmation from preview",
39589
+ "intent-id": "Unique execution intent for replay protection",
39590
+ "asset-ids-file": "Required JSON asset UUID array; '-' for stdin",
39591
+ "tag-ids-file": "Required JSON tag UUID array; '-' for stdin"
39592
+ }
39593
+ },
39594
+ {
39595
+ command: "tag category create",
39596
+ effect: "write",
39597
+ flags: {
39598
+ config: "Config path; default platform path",
39599
+ profile: "Profile name; default credential precedence",
39600
+ fields: "Comma-separated output fields; default compact view",
39601
+ full: "Full text; default false",
39602
+ help: "Show help",
39603
+ name: "Required category name, at most 127 characters, no colon",
39604
+ description: "Optional description, at most 3000 characters",
39605
+ execute: "Execute once; default preview",
39606
+ "dry-run": "Explicit preview; excludes --execute",
39607
+ confirm: "Exact confirmation from preview",
39608
+ "intent-id": "Unique execution intent for replay protection"
39609
+ }
39610
+ },
39611
+ {
39612
+ command: "tag category delete",
39613
+ effect: "write",
39614
+ flags: {
39615
+ config: "Config path; default platform path",
39616
+ profile: "Profile name; default credential precedence",
39617
+ fields: "Comma-separated output fields; default compact view",
39618
+ full: "Full text; default false",
39619
+ help: "Show help",
39620
+ id: "Required exact UUID",
39621
+ execute: "Execute once; default preview",
39622
+ "dry-run": "Explicit preview; excludes --execute",
39623
+ confirm: "Exact confirmation from preview",
39624
+ "intent-id": "Unique execution intent for replay protection"
39625
+ }
39626
+ },
39627
+ {
39628
+ command: "tag category list",
39629
+ effect: "read",
39630
+ flags: {
39631
+ config: "Config path; default platform path",
39632
+ profile: "Profile name; default credential precedence",
39633
+ fields: "Comma-separated output fields; default compact view",
39634
+ full: "Full text; default false",
39635
+ help: "Show help",
39636
+ limit: "Output rows; default 100; maximum 10000",
39637
+ offset: "Starting record; default 0",
39638
+ cursor: "Resume the same scoped collection",
39639
+ all: "Read at most 10000 rows; excludes --limit",
39640
+ filter: "Repeatable field:operator:value",
39641
+ "filter-type": "and|or; API default and",
39642
+ sort: "Comma-separated field:asc|desc"
39643
+ }
39644
+ },
39645
+ {
39646
+ command: "tag category show",
39647
+ effect: "read",
39648
+ flags: {
39649
+ config: "Config path; default platform path",
39650
+ profile: "Profile name; default credential precedence",
39651
+ fields: "Comma-separated output fields; default compact view",
39652
+ full: "Full text; default false",
39653
+ help: "Show help",
39654
+ id: "Required exact UUID"
39655
+ }
39656
+ },
39657
+ {
39658
+ command: "tag category update",
39659
+ effect: "write",
39660
+ flags: {
39661
+ config: "Config path; default platform path",
39662
+ profile: "Profile name; default credential precedence",
39663
+ fields: "Comma-separated output fields; default compact view",
39664
+ full: "Full text; default false",
39665
+ help: "Show help",
39666
+ id: "Required exact UUID",
39667
+ name: "Required category name, at most 127 characters, no colon",
39668
+ description: "Optional description, at most 3000 characters",
39669
+ execute: "Execute once; default preview",
39670
+ "dry-run": "Explicit preview; excludes --execute",
39671
+ confirm: "Exact confirmation from preview",
39672
+ "intent-id": "Unique execution intent for replay protection"
39673
+ }
39674
+ },
39675
+ {
39676
+ command: "tag exclusion list",
39677
+ effect: "read",
39678
+ flags: {
39679
+ config: "Config path; default platform path",
39680
+ profile: "Profile name; default credential precedence",
39681
+ fields: "Comma-separated output fields; default compact view",
39682
+ full: "Full text; default false",
39683
+ help: "Show help",
39684
+ limit: "Output rows; default 100; maximum 10000",
39685
+ offset: "Starting record; default 0",
39686
+ cursor: "Resume the same scoped collection",
39687
+ all: "Read at most 10000 rows; excludes --limit",
39688
+ "tag-id": "Required exact dynamic tag UUID",
39689
+ "target-type": "assets; API default assets"
39690
+ }
39691
+ },
39692
+ {
39693
+ command: "tag list",
39694
+ effect: "read",
39695
+ flags: {
39696
+ config: "Config path; default platform path",
39697
+ profile: "Profile name; default credential precedence",
39698
+ fields: "Comma-separated output fields; default compact projection",
39699
+ full: "Full text; default false",
39700
+ help: "Show help; default false",
39701
+ limit: "Output rows; default 100",
39702
+ offset: "Starting record; default 0",
39703
+ cursor: "Resume the same scoped collection",
39704
+ all: "Read up to 10000 rows; incompatible with --limit",
39705
+ query: "Simple text search",
39706
+ filter: "Repeatable: property operator JSON-array-of-strings",
39707
+ "filter-file": "Strict documented tag filter array; incompatible with --filter",
39708
+ sort: "property:asc or property:desc",
39709
+ "extra-properties": "Comma-separated property names"
39710
+ }
39711
+ },
39712
+ {
39713
+ command: "tag properties",
39714
+ effect: "read",
39715
+ flags: {
39716
+ config: "Config path; default platform path",
39717
+ profile: "Profile name; default credential precedence",
39718
+ fields: "Comma-separated output fields; default compact projection",
39719
+ full: "Full text; default false",
39720
+ help: "Show help; default false"
39721
+ }
39722
+ },
39723
+ {
39724
+ command: "tag value bulk-delete",
39725
+ effect: "write",
39726
+ flags: {
39727
+ config: "Config path; default platform path",
39728
+ profile: "Profile name; default credential precedence",
39729
+ fields: "Comma-separated output fields; default compact view",
39730
+ full: "Full text; default false",
39731
+ help: "Show help",
39732
+ execute: "Execute once; default preview",
39733
+ "dry-run": "Explicit preview; excludes --execute",
39734
+ confirm: "Exact confirmation from preview",
39735
+ "intent-id": "Unique execution intent for replay protection",
39736
+ "ids-file": "Required JSON UUID array; '-' for stdin; maximum 1 MiB"
39737
+ }
39738
+ },
39739
+ {
39740
+ command: "tag value create",
39741
+ effect: "write",
39742
+ flags: {
39743
+ config: "Config path; default platform path",
39744
+ profile: "Profile name; default credential precedence",
39745
+ fields: "Comma-separated output fields; default compact view",
39746
+ full: "Full text; default false",
39747
+ help: "Show help",
39748
+ "body-file": "Required strict tag JSON; '-' for stdin; maximum 1 MiB; no access_control",
39749
+ execute: "Execute once; default preview",
39750
+ "dry-run": "Explicit preview; excludes --execute",
39751
+ confirm: "Exact confirmation from preview",
39752
+ "intent-id": "Unique execution intent for replay protection"
39753
+ }
39754
+ },
39755
+ {
39756
+ command: "tag value delete",
39757
+ effect: "write",
39758
+ flags: {
39759
+ config: "Config path; default platform path",
39760
+ profile: "Profile name; default credential precedence",
39761
+ fields: "Comma-separated output fields; default compact view",
39762
+ full: "Full text; default false",
39763
+ help: "Show help",
39764
+ id: "Required exact UUID",
39765
+ execute: "Execute once; default preview",
39766
+ "dry-run": "Explicit preview; excludes --execute",
39767
+ confirm: "Exact confirmation from preview",
39768
+ "intent-id": "Unique execution intent for replay protection"
39769
+ }
39770
+ },
39771
+ {
39772
+ command: "tag value list",
39773
+ effect: "read",
39774
+ flags: {
39775
+ config: "Config path; default platform path",
39776
+ profile: "Profile name; default credential precedence",
39777
+ fields: "Comma-separated output fields; default compact view",
39778
+ full: "Full text; default false",
39779
+ help: "Show help",
39780
+ limit: "Output rows; default 100; maximum 10000",
39781
+ offset: "Starting record; default 0",
39782
+ cursor: "Resume the same scoped collection",
39783
+ all: "Read at most 10000 rows; excludes --limit",
39784
+ filter: "Repeatable field:operator:value",
39785
+ "filter-type": "and|or; API default and",
39786
+ sort: "Comma-separated field:asc|desc",
39787
+ with: "Wildcard search value (w)",
39788
+ "with-filter": "Comma-separated wildcard fields (wf)"
39789
+ }
39790
+ },
39791
+ {
39792
+ command: "tag value show",
39793
+ effect: "read",
39794
+ flags: {
39795
+ config: "Config path; default platform path",
39796
+ profile: "Profile name; default credential precedence",
39797
+ fields: "Comma-separated output fields; default compact view",
39798
+ full: "Full text; default false",
39799
+ help: "Show help",
39800
+ id: "Required exact UUID"
39801
+ }
39802
+ },
39803
+ {
39804
+ command: "tag value update",
39805
+ effect: "write",
39806
+ flags: {
39807
+ config: "Config path; default platform path",
39808
+ profile: "Profile name; default credential precedence",
39809
+ fields: "Comma-separated output fields; default compact view",
39810
+ full: "Full text; default false",
39811
+ help: "Show help",
39812
+ id: "Required exact UUID",
39813
+ "body-file": "Required strict tag JSON; '-' for stdin; maximum 1 MiB; no access_control",
39814
+ execute: "Execute once; default preview",
39815
+ "dry-run": "Explicit preview; excludes --execute",
39816
+ confirm: "Exact confirmation from preview",
39817
+ "intent-id": "Unique execution intent for replay protection"
39818
+ }
39819
+ }
39820
+ ]
39821
+ };
39822
+
38644
39823
  // src/shared/tool-manifests.ts
38645
- 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 };
39824
+ 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 };
38646
39825
 
38647
39826
  // node_modules/.pnpm/@toon-format+toon@2.3.1/node_modules/@toon-format/toon/dist/index.mjs
38648
39827
  var NULL_LITERAL = "null";
@@ -40010,6 +41189,7 @@ function resolveDecodeOptions(options) {
40010
41189
 
40011
41190
  // src/cli/rewrite.ts
40012
41191
  var managedFlags = {
41192
+ "tenable-axi": tenable_axi_default.adapterBoundary.unsafeOverrides,
40013
41193
  "awx-axi": awx_axi_default.adapterBoundary.unsafeOverrides,
40014
41194
  "falcon-axi": falcon_axi_default.unsafeOverrides,
40015
41195
  "vectra-axi": vectra_axi_default.adapterBoundary.unsafeOverrides,
@@ -40072,6 +41252,13 @@ function rewriteSuggestions(output3, tool, truncated = false) {
40072
41252
  try {
40073
41253
  const json2 = output3.trimStart().startsWith("{");
40074
41254
  let parsed = json2 ? jsonHelp(output3) : toonHelp(output3);
41255
+ if (tool === "tenable-axi" && parsed.document.commands) {
41256
+ return encode3({
41257
+ description: "Investigate Tenable One with managed API keys.",
41258
+ commands: tenable_axi_default.commands.filter((route) => route.effect !== "blocked").map((route) => route.command),
41259
+ help: [tenable_axi_default.discovery.help.replaceAll("tenable-axi ", "artium-axi tenable-axi ")]
41260
+ }) + "\n";
41261
+ }
40075
41262
  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) {
40076
41263
  const home = {
40077
41264
  ...parsed.document,
@@ -40167,9 +41354,14 @@ function managedFlagRanges(command, tool) {
40167
41354
  return ranges;
40168
41355
  }
40169
41356
  function hostedHelp(help, tool, flags, commands2) {
41357
+ if (tool === "tenable-axi") {
41358
+ help = help.split("\n").filter((line) => !/TENABLE_AXI_|SecretRefs|tenable-axi (?:setup|config|profile|hook)|export (?:attack|inventory) download/.test(line)).join("\n");
41359
+ 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.";
41360
+ if (commands2 && !help.includes(guidance)) help = help.trimEnd() + "\n" + guidance + "\n";
41361
+ }
40170
41362
  if (tool === "awx-axi") {
40171
41363
  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.";
40172
- 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");
41364
+ 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");
40173
41365
  if (!help.trim()) help = guidance;
40174
41366
  else if (commands2 && !help.includes(guidance)) help = help.trimEnd() + "\n" + guidance + "\n";
40175
41367
  }
@@ -40199,7 +41391,8 @@ function hostedHelp(help, tool, flags, commands2) {
40199
41391
  const filtered = help.replace(
40200
41392
  /^([ \t]*(?:(?:Flags|Globals|Global flags|Selector flags on every command|[Vv]alid flags for `[^`]+`): |(?=--)))([^\r\n]*)(\r?\n|$)/gm,
40201
41393
  (_, label, listed, ending) => {
40202
- const retained = listed.split(", ").filter((flag) => !flags.includes(/^--([\w-]+)/.exec(flag)?.[1] ?? "")).join(", ");
41394
+ const entries = label.trim() || /^--[\w-]+(?: <[^>]+>)?(?:, --[\w-]+(?: <[^>]+>)?)*\.?$/.test(listed) ? listed.split(", ") : [listed];
41395
+ const retained = entries.filter((flag) => !flags.includes(/^--([\w-]+)/.exec(flag)?.[1] ?? "")).join(", ");
40203
41396
  if (!retained && !label.trim()) return "";
40204
41397
  return label + retained + (listed.endsWith(".") && !retained.endsWith(".") ? "." : "") + ending;
40205
41398
  }
@@ -40322,9 +41515,16 @@ function identityView(user, server) {
40322
41515
  return `user: ${JSON.stringify(user.username)}
40323
41516
  server: ${JSON.stringify(server)}
40324
41517
  roles[${user.roles.length}]: ${user.roles.map((role) => JSON.stringify(role)).join(",")}
40325
- accessExpiresAt: ${user.accessExpiresAt}
41518
+ sessionExpiresAt: ${sessionExpiryView(user.sessionExpiresAt)}
41519
+ accessExpiresAt: ${sessionExpiryView(user.accessExpiresAt)}
41520
+ note: Access tokens refresh automatically when a refresh token is available.
40326
41521
  `;
40327
41522
  }
41523
+ function sessionExpiryView(expiresAt, now = Date.now()) {
41524
+ const minutes = Math.max(0, Math.floor((expiresAt - now) / 6e4));
41525
+ const remaining = expiresAt <= now ? "expired" : `in ${Math.floor(minutes / 60)}h ${minutes % 60}m`;
41526
+ return `${new Date(expiresAt).toISOString().replace(".000Z", "Z")} (${remaining})`;
41527
+ }
40328
41528
  function toolsView(tools) {
40329
41529
  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";
40330
41530
  return `tools[${tools.length}]{name,status,version,readOnly}:
@@ -40349,11 +41549,268 @@ upstreamHelp: ${JSON.stringify(help)}
40349
41549
  `;
40350
41550
  }
40351
41551
 
41552
+ // src/cli/doctor.ts
41553
+ var DIAGNOSTIC_REQUEST_DEADLINE_MS = 5e3;
41554
+ async function doctor(createClient = (deadline) => new Client(process.env, void 0, deadline), write = (text2) => {
41555
+ process.stdout.write(text2);
41556
+ }) {
41557
+ let failure2;
41558
+ const line = (name, pass, detail, error62) => {
41559
+ if (!pass) failure2 ??= error62 ?? new ArtiumError("INVALID_RESPONSE");
41560
+ write(`${pass ? "pass" : "fail"}: ${name}${detail ? ` (${detail})` : ""}
41561
+ `);
41562
+ };
41563
+ let client;
41564
+ try {
41565
+ client = createClient(DIAGNOSTIC_REQUEST_DEADLINE_MS);
41566
+ } catch (error62) {
41567
+ for (const name of ["server address", "certificate", "token", "CLI version"]) line(name, false, "CLIENT_CONFIG_INVALID");
41568
+ throw error62;
41569
+ }
41570
+ let addressOk = false;
41571
+ try {
41572
+ const live = await client.request("/health/live", "GET");
41573
+ addressOk = !!live && typeof live === "object" && "status" in live && live.status === "ok";
41574
+ line("server address", addressOk, client.serverUrlSource);
41575
+ line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : "test HTTP", new ArtiumError("CLIENT_CONFIG_INVALID"));
41576
+ } catch (error62) {
41577
+ const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41578
+ line("server address", cause.code === "CERTIFICATE_INVALID", `${client.serverUrlSource}: ${cause.code}`, cause);
41579
+ line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : cause.code, cause);
41580
+ }
41581
+ if (!addressOk && failure2) throw failure2;
41582
+ let versionOk = true;
41583
+ let versionError;
41584
+ try {
41585
+ await client.request("/v1/me", "GET");
41586
+ } catch (error62) {
41587
+ versionOk = error62 instanceof ArtiumError && error62.code === "TOKEN_INVALID";
41588
+ if (!versionOk) versionError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41589
+ }
41590
+ let tokenOk = false;
41591
+ let tokenError;
41592
+ let tokenDetail;
41593
+ try {
41594
+ const parsed = meResponseSchema.safeParse(await client.authenticated("/v1/me", "GET"));
41595
+ tokenOk = parsed.success;
41596
+ if (parsed.success) tokenDetail = `session expires ${sessionExpiryView(parsed.data.sessionExpiresAt)}`;
41597
+ } catch (error62) {
41598
+ tokenError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41599
+ }
41600
+ line("token", tokenOk, tokenDetail, tokenError);
41601
+ line("CLI version", versionOk, void 0, versionError);
41602
+ if (tokenOk && versionOk) {
41603
+ try {
41604
+ const parsed = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET"));
41605
+ if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
41606
+ for (const tool of parsed.data.tools) line(
41607
+ tool.name,
41608
+ tool.status === "ok",
41609
+ tool.status,
41610
+ new ArtiumError(tool.status === "unconfigured" ? "CREDENTIAL_NOT_CONFIGURED" : tool.status === "error" ? "TOOL_FAILED" : tool.status === "disabled" ? "TOOL_DISABLED" : "SERVER_UNAVAILABLE")
41611
+ );
41612
+ } catch (error62) {
41613
+ const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
41614
+ line("tools", false, cause.code, cause);
41615
+ }
41616
+ }
41617
+ if (failure2) throw failure2;
41618
+ }
41619
+
41620
+ // src/cli/help.ts
41621
+ var commands = {
41622
+ 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" },
41623
+ setup: {
41624
+ usage: "artium-axi setup --host <claude|codex|opencode|pi> [--hook] [--force]",
41625
+ purpose: "Install skills for your signed-in account\u2019s granted tools and an optional Claude Code session hook.",
41626
+ flags: ["--host <claude|codex|opencode|pi> (required)", "--hook (default false; Claude Code only)", "--force (default false; explicitly replace an edited skill)"],
41627
+ example: "artium-axi setup --host claude --hook"
41628
+ },
41629
+ tools: { usage: "artium-axi tools", purpose: "List available tools with their status and pinned version.", flags: [], example: "artium-axi tools" },
41630
+ "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" },
41631
+ whoami: { usage: "artium-axi whoami", purpose: "Show your identity, roles, session expiry and server.", flags: [], example: "artium-axi whoami" },
41632
+ login: {
41633
+ usage: "artium-axi login --sso | --username <username> [--password-stdin]",
41634
+ purpose: "Sign in through browser SSO (8-hour session) or with a local account.",
41635
+ 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)"],
41636
+ example: "artium-axi login --sso"
41637
+ },
41638
+ passwd: {
41639
+ usage: "artium-axi passwd [--password-stdin]",
41640
+ purpose: "Change your password, then sign in again.",
41641
+ flags: ["--password-stdin (default false; otherwise a terminal prompt; current password uses ARTIUM_AXI_CURRENT_PASSWORD or a terminal prompt)"],
41642
+ example: "artium-axi passwd --password-stdin"
41643
+ },
41644
+ logout: { usage: "artium-axi logout", purpose: "Remove local tokens and revoke the server session.", flags: [], example: "artium-axi logout" },
41645
+ doctor: { usage: "artium-axi doctor", purpose: "Check the server, certificate, token, CLI version and cached tool health.", flags: [], example: "artium-axi doctor" },
41646
+ 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" },
41647
+ "falcon-axi": {
41648
+ usage: "artium-axi falcon-axi [<args>]",
41649
+ purpose: "Run Falcon commands with your managed credentials.",
41650
+ flags: ["Arguments after falcon-axi are forwarded upstream, including --help."],
41651
+ example: `artium-axi falcon-axi ${falcon_axi_default.discovery.example.join(" ")}`
41652
+ },
41653
+ "vectra-axi": {
41654
+ usage: "artium-axi vectra-axi [<args>]",
41655
+ purpose: "Run Vectra commands with your managed credentials.",
41656
+ flags: ["Arguments after vectra-axi are forwarded upstream, including --help."],
41657
+ example: `artium-axi vectra-axi ${vectra_axi_default.discovery.example.join(" ")}`
41658
+ },
41659
+ "ldap-axi": {
41660
+ usage: "artium-axi ldap-axi [<args>]",
41661
+ purpose: "Read directory data with the managed LDAP bind identity.",
41662
+ flags: ["Arguments after ldap-axi are forwarded upstream, including --help."],
41663
+ example: `artium-axi ldap-axi ${ldap_axi_default.discovery.example.join(" ")}`
41664
+ },
41665
+ "ado-axi": {
41666
+ usage: "artium-axi ado-axi [<args>]",
41667
+ purpose: "Run Azure DevOps commands with managed credentials.",
41668
+ flags: ["Arguments after ado-axi include --help. Organization and credentials are managed by Artium; api is GET only; writes are off by default."],
41669
+ example: "artium-axi ado-axi project list --limit 1"
41670
+ },
41671
+ "awx-axi": {
41672
+ usage: "artium-axi awx-axi [<args>]",
41673
+ purpose: "Inspect AWX automation with managed credentials.",
41674
+ flags: ["Arguments after awx-axi include --help. Operational writes are off by default; configuration, deletion and security writes are blocked."],
41675
+ example: "artium-axi awx-axi job list --limit 1"
41676
+ },
41677
+ "tenable-axi": {
41678
+ usage: "artium-axi tenable-axi [<args>]",
41679
+ purpose: "Investigate Tenable One with managed API keys.",
41680
+ flags: ["Writes and export jobs are off by default and require administrator-enabled operations, preview, --execute and exact --confirm. Downloads are blocked."],
41681
+ example: "artium-axi tenable-axi card list --limit 1"
41682
+ },
41683
+ "az-axi": {
41684
+ usage: "artium-axi az-axi [<args>]",
41685
+ purpose: "Run Azure commands with your managed identity.",
41686
+ flags: ["Arguments after az-axi are forwarded upstream, including --help."],
41687
+ example: "artium-axi az-axi sub list"
41688
+ },
41689
+ "mg-axi": {
41690
+ usage: "artium-axi mg-axi [<args>]",
41691
+ purpose: "Run Microsoft Graph commands with your managed identity.",
41692
+ flags: ["Arguments after mg-axi are forwarded upstream, including --help."],
41693
+ example: "artium-axi mg-axi entra user list"
41694
+ },
41695
+ "managed-session": {
41696
+ usage: "artium-axi --managed-session <command> [<args>]",
41697
+ purpose: "Let a caller supply and persist sessions through private pipes.",
41698
+ flags: [],
41699
+ example: "artium-axi --managed-session whoami"
41700
+ }
41701
+ };
41702
+ function commandHelp(command) {
41703
+ const entry = commands[command];
41704
+ const flags = [
41705
+ toolSchema.safeParse(command).success ? "--help before the tool name (default false)" : "--help (default false)",
41706
+ ...entry.flags,
41707
+ ...command === "update" ? [] : ["--managed-session before the command (default false; caller-owned sessions; see artium-axi --managed-session --help)"]
41708
+ ];
41709
+ const protocol = [
41710
+ "Session JSON on inherited pipe fd 3, new sessions and rotations as JSON lines on private pipe fd 4; no session file.",
41711
+ "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.",
41712
+ "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.",
41713
+ "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."
41714
+ ];
41715
+ const purposes = command === "home" ? `commands[${Object.keys(commands).length - 2}]{command,purpose}:
41716
+ ${Object.entries(commands).filter(([name]) => name !== "home" && name !== "managed-session").map(([name, value]) => ` ${name},${JSON.stringify(value.purpose)}`).join("\n")}
41717
+ ` : "";
41718
+ return `purpose: ${entry.purpose}
41719
+ usage: ${entry.usage}
41720
+ ${purposes}flags[${flags.length}]:
41721
+ ${flags.map((flag) => ` - ${JSON.stringify(flag)}`).join("\n")}
41722
+ example: ${entry.example}
41723
+ ` + (command === "login" || command === "managed-session" ? `managedSession[${protocol.length}]:
41724
+ ${protocol.map((line) => ` - ${JSON.stringify(line)}`).join("\n")}
41725
+ ` : "");
41726
+ }
41727
+ function validateArguments(args, prefixHelp) {
41728
+ const command = args[0];
41729
+ if (command === "tools") args = [...args.filter((arg) => arg !== "--help"), ...args.filter((arg) => arg === "--help")];
41730
+ const rootFlags = "--help, --version, --managed-session (before the command)";
41731
+ const rootCommands = Object.keys(commands).filter((name) => name !== "home" && name !== "managed-session" && name !== "tools show").join(", ");
41732
+ function fail(token, level2, choices2) {
41733
+ const kind = token?.startsWith("-") ? "flag" : "argument";
41734
+ 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}.`;
41735
+ throw new ArtiumError("INVALID_INPUT", message, choices2);
41736
+ }
41737
+ if (!command) return;
41738
+ if (command === "--version" && args.length === 1) return;
41739
+ if (!Object.hasOwn(commands, command) || command === "home" || command === "managed-session" || command === "tools show") {
41740
+ fail(command, "artium-axi", `Valid commands: ${rootCommands}. Valid flags: ${rootFlags}.`);
41741
+ }
41742
+ if (toolSchema.safeParse(command).success) {
41743
+ if (prefixHelp && args.length > 1) fail(args[1], command, `Use artium-axi --help ${command} for local help; artium-axi ${command} --help for upstream flags.`);
41744
+ return;
41745
+ }
41746
+ let level = command;
41747
+ let start = 1;
41748
+ if (command === "tools" && args[1] === "show") {
41749
+ level = "tools show";
41750
+ start = 2;
41751
+ }
41752
+ const entry = commands[level];
41753
+ const validFlags = ["--help", ...entry.flags.map((flag) => flag.split(" ")[0])];
41754
+ const choices = `Valid flags for ${level}: ${validFlags.join(", ")}.` + (level === "tools" ? " Valid subcommands: show <tool>." : level === "tools show" ? ` Valid tools: ${toolSchema.options.join(", ")}.` : "");
41755
+ let tool = false;
41756
+ const seen = /* @__PURE__ */ new Set();
41757
+ for (let index = start; index < args.length; index++) {
41758
+ const token = args[index];
41759
+ if (level === "tools show" && !token.startsWith("-") && !tool) {
41760
+ if (!toolSchema.safeParse(token).success) fail(token, level, choices);
41761
+ tool = true;
41762
+ } else {
41763
+ if (!validFlags.includes(token) || seen.has(token)) fail(token, level, choices);
41764
+ seen.add(token);
41765
+ if (token === "--username" || token === "--host") {
41766
+ const value = args[index + 1];
41767
+ if (!value) fail(value, `${level} ${token}`, `Supply ${token} ${token === "--host" ? "<claude|codex|opencode|pi>" : "<username>"}. ${choices}`);
41768
+ if (token === "--host" && !["claude", "codex", "opencode", "pi"].includes(value)) fail(value, `${level} --host`, `Valid hosts: claude, codex, opencode, pi. Use ${entry.usage}.`);
41769
+ index++;
41770
+ }
41771
+ }
41772
+ }
41773
+ if (level === "tools show" && !tool && !seen.has("--help") && !prefixHelp) fail(void 0, level, choices);
41774
+ }
41775
+ function helpCommand(args, prefixHelp = false) {
41776
+ if (args[0] === "setup" && args.includes("--help")) {
41777
+ const path2 = args.filter((arg) => arg !== "--help");
41778
+ for (let index = 1; index < path2.length; index++) {
41779
+ if (path2[index] === "--host" && ["claude", "codex", "opencode", "pi"].includes(path2[index + 1])) index++;
41780
+ else if (path2[index] !== "--hook" && path2[index] !== "--force") return void 0;
41781
+ }
41782
+ return "setup";
41783
+ }
41784
+ if (toolSchema.safeParse(args[0]).success) return prefixHelp && args.length === 2 ? args[0] : void 0;
41785
+ if (args[0] === "login" || args[0] === "passwd") {
41786
+ if (args[0] === "login" && args.length === 3 && args.includes("--sso") && args.includes("--help")) return "login";
41787
+ let requested = false;
41788
+ let username = false;
41789
+ let stdin = false;
41790
+ for (let index = 1; index < args.length; index++) {
41791
+ const option = args[index];
41792
+ if (option === "--username" && args[0] === "login" && !username && args[index + 1] !== void 0) {
41793
+ username = true;
41794
+ index++;
41795
+ } else if (option === "--password-stdin" && !stdin) stdin = true;
41796
+ else if (option === "--help" && !requested) requested = true;
41797
+ else return void 0;
41798
+ }
41799
+ return requested ? args[0] : void 0;
41800
+ }
41801
+ if (!args.includes("--help")) return void 0;
41802
+ const path = args.filter((arg) => arg !== "--help");
41803
+ if (path.length === 0) return "home";
41804
+ if (path[0] === "tools" && path[1] === "show" && (path.length === 2 || path.length === 3 && toolSchema.safeParse(path[2]).success)) return "tools show";
41805
+ if (path.length === 1 && path[0] !== "home" && Object.hasOwn(commands, path[0])) return path[0];
41806
+ return void 0;
41807
+ }
41808
+
40352
41809
  // src/cli/setup.ts
40353
41810
  import { createHash, randomUUID as randomUUID2 } from "node:crypto";
40354
41811
  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";
40355
41812
  import { homedir as homedir2 } from "node:os";
40356
- import { dirname as dirname2, join as join2, resolve } from "node:path";
41813
+ import { dirname as dirname2, join as join2, resolve as resolve2 } from "node:path";
40357
41814
 
40358
41815
  // skill/artium-axi/SKILL.md
40359
41816
  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";
@@ -40452,7 +41909,7 @@ async function setup(args) {
40452
41909
  if (hook && host !== "claude") {
40453
41910
  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.`);
40454
41911
  }
40455
- const executable = resolve(process.argv[1]);
41912
+ const executable = resolve2(process.argv[1]);
40456
41913
  const invocation = process.platform === "win32" ? `& '${process.execPath.replaceAll("'", "''")}' '${executable.replaceAll("'", "''")}'` : `${quote(process.execPath)} ${quote(executable)}`;
40457
41914
  const executableBlock = `<!-- artium-axi executable -->
40458
41915
 
@@ -40462,7 +41919,7 @@ ${invocation}
40462
41919
 
40463
41920
  <!-- /artium-axi executable -->`;
40464
41921
  const content = SKILL_default.replace(/<!-- artium-axi executable -->[\s\S]*?<!-- \/artium-axi executable -->/, () => executableBlock);
40465
- 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]);
41922
+ 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]);
40466
41923
  const client = new Client();
40467
41924
  const response = skillsResponseSchema.safeParse(await client.authenticated("/v1/skills", "GET"));
40468
41925
  if (!response.success) throw new ArtiumError("INVALID_RESPONSE");
@@ -40581,6 +42038,7 @@ expires: ${new Date(device.expiresAt).toISOString()}
40581
42038
  if (managed2) await managed2.emit(client.serverUrl, session);
40582
42039
  else await client.sessions.locked(async () => {
40583
42040
  client.sessions.write(session);
42041
+ client.sessions.writeClientConfig(client.caFile);
40584
42042
  });
40585
42043
  const message = `status: authenticated
40586
42044
  session-ends: ${new Date(session.familyExpiresAt).toISOString()}
@@ -40735,9 +42193,9 @@ var ManagedSession = class _ManagedSession {
40735
42193
  if (session.status === "authenticated") this.protect(session.accessToken, session.refreshToken);
40736
42194
  else this.protect(session.passwordChangeToken);
40737
42195
  try {
40738
- await new Promise((resolve3, reject) => {
42196
+ await new Promise((resolve4, reject) => {
40739
42197
  this.channel.write(`${JSON.stringify({ serverUrl, ...session })}
40740
- `, (error62) => error62 ? reject(error62) : resolve3());
42198
+ `, (error62) => error62 ? reject(error62) : resolve4());
40741
42199
  });
40742
42200
  } catch {
40743
42201
  throw new ArtiumError(
@@ -40761,9 +42219,45 @@ var ManagedSession = class _ManagedSession {
40761
42219
  }
40762
42220
  };
40763
42221
 
42222
+ // src/cli/update.ts
42223
+ import { createHash as createHash2, randomUUID as randomUUID3 } from "node:crypto";
42224
+ import { copyFileSync, existsSync as existsSync3, readFileSync as readFileSync4, realpathSync, renameSync as renameSync3, rmSync as rmSync3, statSync as statSync3, writeFileSync as writeFileSync3 } from "node:fs";
42225
+ import { dirname as dirname3, join as join3 } from "node:path";
42226
+ async function update() {
42227
+ const executable = realpathSync(process.argv[1]);
42228
+ const metadata = join3(dirname3(executable), "..", "package.json");
42229
+ if (existsSync3(metadata) && JSON.parse(readFileSync4(metadata, "utf8")).name === "@knowttl/artium-axi") {
42230
+ throw new ArtiumError("INVALID_INPUT", "This client was installed from npm.", "Run npm install -g @knowttl/artium-axi@latest.");
42231
+ }
42232
+ const client = new Client();
42233
+ const bundle = await client.request("/cli/artium-axi.mjs", "GET", void 0, void 0, true);
42234
+ const checksum2 = await client.request("/cli/artium-axi.mjs.sha256", "GET", void 0, void 0, true);
42235
+ const digest = checksum2.toString("utf8").trim().split(/\s+/)[0];
42236
+ if (!/^[a-fA-F0-9]{64}$/.test(digest) || createHash2("sha256").update(bundle).digest("hex") !== digest.toLowerCase()) {
42237
+ throw new ArtiumError("INVALID_RESPONSE", "The downloaded client failed SHA-256 verification.", "Run artium-axi update again after checking the server bundle and checksum.");
42238
+ }
42239
+ const temporary = `${executable}.${randomUUID3()}.tmp`;
42240
+ try {
42241
+ writeFileSync3(temporary, bundle, { flag: "wx", mode: statSync3(executable).mode & 511 });
42242
+ copyFileSync(executable, `${executable}.bak`);
42243
+ renameSync3(temporary, executable);
42244
+ } catch {
42245
+ 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.");
42246
+ } finally {
42247
+ rmSync3(temporary, { force: true });
42248
+ }
42249
+ return "status: updated\nnext: artium-axi --version\n";
42250
+ }
42251
+
40764
42252
  // src/cli/main.ts
40765
42253
  var managed;
42254
+ for (const stream of [process.stdout, process.stderr]) {
42255
+ stream.on("error", (error62) => {
42256
+ if (error62.code !== "EPIPE") throw error62;
42257
+ });
42258
+ }
40766
42259
  function output2(stream, text2) {
42260
+ if (process[stream].destroyed) return;
40767
42261
  if (managed) managed.write(stream, text2);
40768
42262
  else process[stream].write(text2);
40769
42263
  }
@@ -40791,7 +42285,7 @@ async function main(args) {
40791
42285
  return;
40792
42286
  }
40793
42287
  if (managedMode) {
40794
- if (["passwd", "logout", "setup"].includes(args[0])) {
42288
+ if (["passwd", "logout", "setup", "update"].includes(args[0])) {
40795
42289
  throw new ArtiumError(
40796
42290
  "INVALID_INPUT",
40797
42291
  "This command is unavailable in managed session mode.",
@@ -40800,6 +42294,10 @@ async function main(args) {
40800
42294
  }
40801
42295
  managed = await ManagedSession.read(args[0] === "login");
40802
42296
  }
42297
+ if (command === "update") {
42298
+ output2("stdout", await update());
42299
+ return;
42300
+ }
40803
42301
  if (command === "setup") {
40804
42302
  output2("stdout", await setup(args.slice(1)));
40805
42303
  return;
@@ -40854,7 +42352,10 @@ async function main(args) {
40854
42352
  const parsed = loginResponseSchema.safeParse(await client2.request("/v1/auth/login", "POST", { username, password }));
40855
42353
  if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
40856
42354
  if (managed) await managed.emit(client2.serverUrl, parsed.data);
40857
- else client2.sessions.write(parsed.data);
42355
+ else {
42356
+ client2.sessions.write(parsed.data);
42357
+ client2.sessions.writeClientConfig(client2.caFile);
42358
+ }
40858
42359
  return parsed.data;
40859
42360
  };
40860
42361
  const session = await (managed ? signIn() : client2.sessions.locked(signIn));
@@ -40916,7 +42417,7 @@ remoteRevocation: ${verified ? "verified" : "unverified"}
40916
42417
  if (home) {
40917
42418
  const tools = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET", void 0, homeSession));
40918
42419
  if (!tools.success) throw new ArtiumError("INVALID_RESPONSE");
40919
- const executable = resolve2(process.argv[1]);
42420
+ const executable = resolve3(process.argv[1]);
40920
42421
  const local = relative(homedir3(), executable);
40921
42422
  const bin = local && !isAbsolute(local) && !local.startsWith(`..${sep}`) && local !== ".." ? `~${sep}${local}` : executable;
40922
42423
  view = `bin: ${JSON.stringify(bin)}
@@ -40950,11 +42451,11 @@ ${Object.entries(response.error).map(([key, value]) => ` ${key}: ${JSON.stringi
40950
42451
  `);
40951
42452
  process.exitCode = errors[response.error.code].exitCode;
40952
42453
  }
40953
- main(process.argv.slice(2)).catch((error62) => printError(errorResponse(error62 instanceof ArtiumError ? error62 : new ArtiumError("INTERNAL_ERROR"), randomUUID3()))).then(() => {
42454
+ main(process.argv.slice(2)).catch((error62) => printError(errorResponse(error62 instanceof ArtiumError ? error62 : new ArtiumError("INTERNAL_ERROR"), randomUUID4()))).then(() => {
40954
42455
  try {
40955
42456
  managed?.flush();
40956
42457
  } catch {
40957
42458
  managed = void 0;
40958
- printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID3()));
42459
+ printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID4()));
40959
42460
  }
40960
42461
  });