@knowttl/artium-axi 0.0.9 → 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 +2507 -1005
  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(),
@@ -20177,6 +20197,26 @@ var adminCertificateRoutes = {
20177
20197
  }
20178
20198
  };
20179
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
+ },
20180
20220
  list: {
20181
20221
  method: "GET",
20182
20222
  path: "/v1/admin/tools",
@@ -20559,11 +20599,12 @@ import { readFileSync as readFileSync2 } from "node:fs";
20559
20599
  import { request as httpRequest } from "node:http";
20560
20600
  import { request as httpsRequest } from "node:https";
20561
20601
  import { rootCertificates } from "node:tls";
20602
+ import { resolve } from "node:path";
20562
20603
 
20563
20604
  // package.json
20564
20605
  var package_default = {
20565
20606
  name: "artium-axi",
20566
- version: "0.0.9",
20607
+ version: "0.0.10",
20567
20608
  private: true,
20568
20609
  license: "MIT",
20569
20610
  type: "module",
@@ -20641,8 +20682,20 @@ function sessionPath(platform = process.platform, environment = process.env, hom
20641
20682
  if (!base) throw new ArtiumError("CLIENT_CONFIG_INVALID", void 0, "Set APPDATA to your writable roaming configuration folder, then sign in again.");
20642
20683
  return paths.join(base, "artium-axi", "session.json");
20643
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
+ }
20644
20697
  function restrictWindowsAcl(path, directory) {
20645
- const script = `$ErrorActionPreference='Stop'; $path=$env:ARTIUM_AXI_SESSION_ACL_PATH; $directory=$env:ARTIUM_AXI_SESSION_ACL_KIND -eq 'directory'; $acl=if ($directory) { [System.Security.AccessControl.DirectorySecurity]::new() } else { [System.Security.AccessControl.FileSecurity]::new() }; $acl.SetAccessRuleProtection($true,$false); $user=[System.Security.Principal.WindowsIdentity]::GetCurrent().User; $inherit=if ($directory) { [System.Security.AccessControl.InheritanceFlags]'ContainerInherit,ObjectInherit' } else { [System.Security.AccessControl.InheritanceFlags]::None }; foreach ($sid in @($user,[System.Security.Principal.SecurityIdentifier]::new('S-1-5-18'),[System.Security.Principal.SecurityIdentifier]::new('S-1-5-32-544'))) { $acl.AddAccessRule([System.Security.AccessControl.FileSystemAccessRule]::new($sid,'FullControl',$inherit,'None','Allow')) }; Set-Acl -LiteralPath $path -AclObject $acl -ErrorAction Stop`;
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)`;
20646
20699
  execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-EncodedCommand", Buffer.from(script, "utf16le").toString("base64")], {
20647
20700
  stdio: "ignore",
20648
20701
  env: { ...process.env, ARTIUM_AXI_SESSION_ACL_PATH: path, ARTIUM_AXI_SESSION_ACL_KIND: directory ? "directory" : "file" }
@@ -20706,6 +20759,26 @@ var SessionStore = class {
20706
20759
  rmSync(temporary, { force: true });
20707
20760
  }
20708
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
+ }
20709
20782
  remove() {
20710
20783
  try {
20711
20784
  rmSync(this.file, { force: true });
@@ -20720,8 +20793,8 @@ var SessionStore = class {
20720
20793
  while (true) {
20721
20794
  const watcher = watch(this.directory);
20722
20795
  let timer;
20723
- const changed = new Promise((resolve3, reject) => {
20724
- watcher.once("change", () => resolve3());
20796
+ const changed = new Promise((resolve4, reject) => {
20797
+ watcher.once("change", () => resolve4());
20725
20798
  watcher.once("error", () => reject(new ArtiumError("SESSION_STORAGE_UNAVAILABLE")));
20726
20799
  timer = setTimeout(() => reject(new ArtiumError("SESSION_BUSY")), Math.max(0, deadline - Date.now()));
20727
20800
  });
@@ -20750,11 +20823,14 @@ var SessionStore = class {
20750
20823
  var DEFAULT_REQUEST_DEADLINE_MS = 9e4;
20751
20824
  var Client = class {
20752
20825
  constructor(environment = process.env, managed2, requestDeadlineMs = DEFAULT_REQUEST_DEADLINE_MS) {
20753
- this.environment = environment;
20754
20826
  this.managed = managed2;
20755
20827
  this.requestDeadlineMs = requestDeadlineMs;
20756
20828
  try {
20757
- 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 ?? "");
20758
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();
20759
20835
  this.serverUrl = url2.href.replace(/\/$/, "");
20760
20836
  if (!managed2) this.storedSessions = new SessionStore(this.serverUrl, sessionPath(process.platform, environment));
@@ -20764,21 +20840,22 @@ var Client = class {
20764
20840
  }
20765
20841
  managed2?.checkServer(this.serverUrl);
20766
20842
  }
20767
- environment;
20768
20843
  managed;
20769
20844
  requestDeadlineMs;
20770
20845
  serverUrl;
20846
+ serverUrlSource;
20847
+ caFile;
20771
20848
  storedSessions;
20772
20849
  get sessions() {
20773
20850
  if (!this.storedSessions) throw new ArtiumError("INVALID_INPUT", "Session-file operations are unavailable in managed mode.");
20774
20851
  return this.storedSessions;
20775
20852
  }
20776
20853
  certificateVerified = false;
20777
- async request(path, method, input2, token) {
20854
+ async request(path, method, input2, token, bytes = false) {
20778
20855
  this.certificateVerified = false;
20779
20856
  let ca;
20780
20857
  try {
20781
- 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")];
20782
20859
  } catch {
20783
20860
  throw new ArtiumError("CLIENT_CONFIG_INVALID");
20784
20861
  }
@@ -20786,7 +20863,7 @@ var Client = class {
20786
20863
  const controller = new AbortController();
20787
20864
  const deadline = setTimeout(() => controller.abort(), this.requestDeadlineMs);
20788
20865
  const url2 = new URL(`${this.serverUrl}${path}`);
20789
- const result = await new Promise((resolve3, reject) => {
20866
+ const result = await new Promise((resolve4, reject) => {
20790
20867
  const request = (url2.protocol === "https:" ? httpsRequest : httpRequest)(url2, {
20791
20868
  method,
20792
20869
  ca,
@@ -20804,9 +20881,9 @@ var Client = class {
20804
20881
  response.on("error", () => reject(new ArtiumError("SERVER_UNAVAILABLE")));
20805
20882
  response.on("end", () => {
20806
20883
  try {
20807
- resolve3({
20884
+ resolve4({
20808
20885
  status: response.statusCode,
20809
- 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")),
20810
20887
  serverVersion: typeof response.headers["x-artium-cli-version"] === "string" ? response.headers["x-artium-cli-version"] : void 0
20811
20888
  });
20812
20889
  } catch {
@@ -20842,7 +20919,7 @@ var Client = class {
20842
20919
  if (result.status !== 200 && result.status !== 204) throw new ArtiumError("INVALID_RESPONSE");
20843
20920
  if ((path === "/v1/auth/login" || path === "/v1/auth/device") && result.serverVersion && result.serverVersion !== cliVersion) {
20844
20921
  const version2 = result.serverVersion.replace(/[\x00-\x1f\x7f]/g, "");
20845
- const warning = `warning: CLI ${cliVersion} differs from server ${version2}; download the matching client from ${this.serverUrl}/cli/artium-axi.mjs and verify its .sha256, or run npm install -g @knowttl/artium-axi@${version2}.
20922
+ const warning = `warning: CLI ${cliVersion} differs from server ${version2}; run artium-axi update, or run npm install -g @knowttl/artium-axi@${version2}.
20846
20923
  `;
20847
20924
  if (this.managed) this.managed.write("stderr", warning);
20848
20925
  else process.stderr.write(warning);
@@ -20916,13 +20993,13 @@ async function readPassword(stdin, environmentVariable) {
20916
20993
  process.stdin.setRawMode(true);
20917
20994
  process.stdin.resume();
20918
20995
  try {
20919
- return await new Promise((resolve3, reject) => {
20996
+ return await new Promise((resolve4, reject) => {
20920
20997
  let password = "";
20921
20998
  const keypress = (text2, key) => {
20922
20999
  if (key.name === "return" || key.ctrl && key.name === "c") {
20923
21000
  process.stdin.off("keypress", keypress);
20924
21001
  if (key.ctrl) reject(new ArtiumError("CANCELLED"));
20925
- else resolve3(password);
21002
+ else resolve4(password);
20926
21003
  } else if (key.name === "backspace") password = Array.from(password).slice(0, -1).join("");
20927
21004
  else if (text2 && !key.ctrl && !new RegExp("\\p{Cc}", "u").test(text2)) password += text2;
20928
21005
  };
@@ -20936,82 +21013,17 @@ async function readPassword(stdin, environmentVariable) {
20936
21013
  }
20937
21014
  }
20938
21015
 
20939
- // src/cli/doctor.ts
20940
- var DIAGNOSTIC_REQUEST_DEADLINE_MS = 5e3;
20941
- async function doctor(createClient = (deadline) => new Client(process.env, void 0, deadline), write = (text2) => {
20942
- process.stdout.write(text2);
20943
- }) {
20944
- let failure2;
20945
- const line = (name, pass, detail, error62) => {
20946
- if (!pass) failure2 ??= error62 ?? new ArtiumError("INVALID_RESPONSE");
20947
- write(`${pass ? "pass" : "fail"}: ${name}${detail ? ` (${detail})` : ""}
20948
- `);
20949
- };
20950
- let client;
20951
- try {
20952
- client = createClient(DIAGNOSTIC_REQUEST_DEADLINE_MS);
20953
- } catch (error62) {
20954
- for (const name of ["server address", "certificate", "token", "CLI version"]) line(name, false, "CLIENT_CONFIG_INVALID");
20955
- throw error62;
20956
- }
20957
- let addressOk = false;
20958
- try {
20959
- const live = await client.request("/health/live", "GET");
20960
- addressOk = !!live && typeof live === "object" && "status" in live && live.status === "ok";
20961
- line("server address", addressOk);
20962
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : "test HTTP", new ArtiumError("CLIENT_CONFIG_INVALID"));
20963
- } catch (error62) {
20964
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20965
- line("server address", cause.code === "CERTIFICATE_INVALID", cause.code, cause);
20966
- line("certificate", client.certificateVerified, client.certificateVerified ? void 0 : cause.code, cause);
20967
- }
20968
- if (!addressOk && failure2) throw failure2;
20969
- let versionOk = true;
20970
- let versionError;
20971
- try {
20972
- await client.request("/v1/me", "GET");
20973
- } catch (error62) {
20974
- versionOk = error62 instanceof ArtiumError && error62.code === "TOKEN_INVALID";
20975
- if (!versionOk) versionError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20976
- }
20977
- let tokenOk = false;
20978
- let tokenError;
20979
- try {
20980
- tokenOk = meResponseSchema.safeParse(await client.authenticated("/v1/me", "GET")).success;
20981
- } catch (error62) {
20982
- tokenError = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20983
- }
20984
- line("token", tokenOk, void 0, tokenError);
20985
- line("CLI version", versionOk, void 0, versionError);
20986
- if (tokenOk && versionOk) {
20987
- try {
20988
- const parsed = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET"));
20989
- if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
20990
- for (const tool of parsed.data.tools) line(
20991
- tool.name,
20992
- tool.status === "ok",
20993
- tool.status,
20994
- new ArtiumError(tool.status === "unconfigured" ? "CREDENTIAL_NOT_CONFIGURED" : tool.status === "error" ? "TOOL_FAILED" : tool.status === "disabled" ? "TOOL_DISABLED" : "SERVER_UNAVAILABLE")
20995
- );
20996
- } catch (error62) {
20997
- const cause = error62 instanceof ArtiumError ? error62 : new ArtiumError("INVALID_RESPONSE");
20998
- line("tools", false, cause.code, cause);
20999
- }
21000
- }
21001
- if (failure2) throw failure2;
21002
- }
21003
-
21004
21016
  // tools/inventories/falcon-axi.json
21005
21017
  var falcon_axi_default = {
21006
21018
  generatedBy: "scripts/falcon-inventory.mjs",
21007
21019
  tool: "falcon-axi",
21008
21020
  repository: "https://github.com/knowttl/falcon-axi.git",
21009
- tag: "v0.5.0",
21010
- commit: "2676743a997442e50cef570fc406ca38a5943833",
21011
- version: "0.5.0",
21021
+ tag: "v0.5.1",
21022
+ commit: "b595b500681eee476ddeb2d8d459bb9f8ad2125f",
21023
+ version: "0.5.1",
21012
21024
  parser: {
21013
21025
  path: "falcon_axi/cli.py",
21014
- sha256: "ca8e5abef2ff056cf5cd08c37a5282851f5f858cf7a19feeae78ab1111ab95db",
21026
+ sha256: "2f7ee1d6601dafb63e5e40cc3b1fe28b295f67f7da2f9e23e747cca644caa09d",
21015
21027
  aliases: {},
21016
21028
  shortFlags: {},
21017
21029
  repeats: "last value wins",
@@ -21632,7 +21644,8 @@ var falcon_axi_default = {
21632
21644
  profile: "value",
21633
21645
  query: "value",
21634
21646
  repository: "value",
21635
- since: "value"
21647
+ since: "value",
21648
+ wait: "value"
21636
21649
  },
21637
21650
  input: "No file or raw URL input; cursors and queries remain native values"
21638
21651
  },
@@ -21646,7 +21659,8 @@ var falcon_axi_default = {
21646
21659
  "no-member-cid": "boolean",
21647
21660
  config: "value",
21648
21661
  profile: "value",
21649
- repository: "value"
21662
+ repository: "value",
21663
+ wait: "value"
21650
21664
  },
21651
21665
  input: "No file or raw URL input; cursors and queries remain native values"
21652
21666
  },
@@ -22477,10 +22491,10 @@ var falcon_axi_default = {
22477
22491
  var vectra_axi_default = {
22478
22492
  generatedBy: "scripts/upstream-inventory.mjs",
22479
22493
  tool: "vectra-axi",
22480
- version: "0.1.7",
22481
- integrity: "sha512-7gop8tQkTohKKoldYuHZ9Kz2Eq/vQNBqW0OZV8HLSPEKc3OVhdFt00osRb1kwRjB1h1Vr/ku0H0IWoKOxxticQ==",
22494
+ version: "0.1.8",
22495
+ integrity: "sha512-Wvn73g5hm4mzQQKhNnKvAjt6SfGFrPD2EAYMa4AXhoVqFfjXjxnQLk6tUw7E92jozeHtpZ+aDXSGMHaJhhTi1Q==",
22482
22496
  parserEvidence: "Installed pinned catalogue exports, provisional until adapter acceptance",
22483
- packageManifestSha256: "f9c6cbae6a861654398dd30d830ec5b048fad34f8b6bd5f8157dcf8a5cd3ed7e",
22497
+ packageManifestSha256: "0e2e4e616e06435582fcd96787a2088f7fda5b0b99c32daa4d6c7dc8c2b2f3fb",
22484
22498
  environment: [
22485
22499
  {
22486
22500
  name: "VECTRA_AXI_CONFIG",
@@ -22546,6 +22560,38 @@ var vectra_axi_default = {
22546
22560
  nativeWriteSettings: {
22547
22561
  default: "disabled",
22548
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
+ ],
22549
22595
  profileFields: {
22550
22596
  "writes.allowWrites": "boolean",
22551
22597
  "writes.operations": "string[]"
@@ -22597,12 +22643,13 @@ var vectra_axi_default = {
22597
22643
  help: {
22598
22644
  command: "vectra-axi detection list",
22599
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",
22600
22647
  flags: {
22601
22648
  "--help": "Show concise help; default false",
22602
22649
  "--state <state>": "Filter by server-side detection state",
22603
22650
  "--detection-type <type>": "Filter by server-side detection type",
22604
22651
  "--detection-category <category>": "Filter by server-side detection category",
22605
- "--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>",
22606
22653
  "--tags <tags>": "Filter by server-side tags",
22607
22654
  "--certainty-gte <score>": "Filter by server-side minimum certainty",
22608
22655
  "--threat-gte <score>": "Filter by server-side minimum threat",
@@ -22610,7 +22657,7 @@ var vectra_axi_default = {
22610
22657
  "--min-id <id>": "Server-side minimum detection ID (non-negative integer)",
22611
22658
  "--max-id <id>": "Server-side maximum detection ID (non-negative integer)",
22612
22659
  "--limit <rows>": "Row window for this read; default 100",
22613
- "--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",
22614
22661
  "--all": "Traverse pages within 10 requests, 8 MiB, 60 seconds and 10000 rows; cannot combine with --limit",
22615
22662
  "--cursor <cursor>": "Resume a capped list with its original filters"
22616
22663
  },
@@ -22642,7 +22689,7 @@ var vectra_axi_default = {
22642
22689
  },
22643
22690
  source: {
22644
22691
  path: "dist/src/catalogue.js",
22645
- sha256: "9c0a3783a91fb0fd4c2a2f4df00e477b8abdc3ea3cefe80dc20e98b4cebf55fd"
22692
+ sha256: "5fadea660c71fb4021a4c130699ae3883c54e801c8e3eb6c3f370a10b0a04930"
22646
22693
  }
22647
22694
  },
22648
22695
  flags: [
@@ -22973,6 +23020,7 @@ var vectra_axi_default = {
22973
23020
  profile: "value",
22974
23021
  config: "value",
22975
23022
  id: "value",
23023
+ fields: "value",
22976
23024
  full: "boolean"
22977
23025
  }
22978
23026
  },
@@ -22995,6 +23043,7 @@ var vectra_axi_default = {
22995
23043
  help: "boolean",
22996
23044
  profile: "value",
22997
23045
  config: "value",
23046
+ name: "value",
22998
23047
  "threat-gte": "value",
22999
23048
  "certainty-gte": "value",
23000
23049
  tags: "value",
@@ -23402,6 +23451,7 @@ var vectra_axi_default = {
23402
23451
  help: "boolean",
23403
23452
  profile: "value",
23404
23453
  config: "value",
23454
+ all: "boolean",
23405
23455
  account: "value",
23406
23456
  host: "value",
23407
23457
  assignee: "value",
@@ -23434,6 +23484,7 @@ var vectra_axi_default = {
23434
23484
  help: "boolean",
23435
23485
  profile: "value",
23436
23486
  config: "value",
23487
+ all: "boolean",
23437
23488
  limit: "value",
23438
23489
  fields: "value",
23439
23490
  cursor: "value"
@@ -23454,6 +23505,7 @@ var vectra_axi_default = {
23454
23505
  help: "boolean",
23455
23506
  profile: "value",
23456
23507
  config: "value",
23508
+ all: "boolean",
23457
23509
  username: "value",
23458
23510
  limit: "value",
23459
23511
  fields: "value",
@@ -23490,6 +23542,7 @@ var vectra_axi_default = {
23490
23542
  help: "boolean",
23491
23543
  profile: "value",
23492
23544
  config: "value",
23545
+ all: "boolean",
23493
23546
  name: "value",
23494
23547
  type: "value",
23495
23548
  limit: "value",
@@ -23512,6 +23565,7 @@ var vectra_axi_default = {
23512
23565
  help: "boolean",
23513
23566
  profile: "value",
23514
23567
  config: "value",
23568
+ all: "boolean",
23515
23569
  id: "value",
23516
23570
  name: "value",
23517
23571
  ordering: "value",
@@ -23527,6 +23581,7 @@ var vectra_axi_default = {
23527
23581
  help: "boolean",
23528
23582
  profile: "value",
23529
23583
  config: "value",
23584
+ all: "boolean",
23530
23585
  contains: "value",
23531
23586
  ordering: "value",
23532
23587
  limit: "value",
@@ -23611,727 +23666,6 @@ var vectra_axi_default = {
23611
23666
  ]
23612
23667
  };
23613
23668
 
23614
- // tools/inventories/ldap-axi.json
23615
- var ldap_axi_default = {
23616
- generatedBy: "scripts/ldap-inventory.mjs",
23617
- tool: "ldap-axi",
23618
- version: "0.2.0",
23619
- integrity: "sha512-w/gE4jHaUHE0iKh3ucDnDG0AVrhP0VwpFCEcw3wSTzLmTBMNZrJ9AFB06j2jnf4TFgK5+5NhF0EE0R69mv7crA==",
23620
- parserEvidence: "Installed pinned command schemas and reviewed CLI globals and entry routes",
23621
- sources: [
23622
- {
23623
- path: "package.json",
23624
- sha256: "7ee133bf0333fe975c905418c9ecdd542836dab39f52aa5f7f630776d2bcc0b0"
23625
- },
23626
- {
23627
- path: "README.md",
23628
- sha256: "3a1eeda8c376c39853e4835acf2a1d61f76f23a555651417d0d691459fbb3139"
23629
- },
23630
- {
23631
- path: "axi-credential.schema.json",
23632
- sha256: "76b9f5f449d844dcd4365b966ed907515582f72fc920b936dae825ebf1b7cc53"
23633
- },
23634
- {
23635
- path: "dist/src/cli.js",
23636
- sha256: "2cb024b2848c2c9e27c292205b3ed86a829cfed21d52e8fea06ef544a039ec2a"
23637
- },
23638
- {
23639
- path: "dist/src/schema.js",
23640
- sha256: "0d5946fa26efb55e8480e9a22f93cdb6b321c48697e77ca02c4c99630f11284f"
23641
- },
23642
- {
23643
- path: "dist/src/config.js",
23644
- sha256: "cbc48584b6ff2a2a70375e9e8e6242a87543a3e6e6f7e1c055a2d29c42b677f9"
23645
- },
23646
- {
23647
- path: "dist/src/secrets.js",
23648
- sha256: "9f2ccf86515cec1dd65f2dd5850188232374535f7fe56a788fdc7b94d91c8532"
23649
- },
23650
- {
23651
- path: "dist/src/directory/auth.js",
23652
- sha256: "d2b3a61cb9e63744462e3a6a2841fcddb2b48e7823c307841028288cfe9d688b"
23653
- },
23654
- {
23655
- path: "dist/src/directory/policy.js",
23656
- sha256: "a697dd78990493f7f1c19d22278ebb922c997e9cf88a51b12adfaca30fa8a01d"
23657
- }
23658
- ],
23659
- credentialSchema: {
23660
- $schema: "https://json-schema.org/draft/2020-12/schema",
23661
- title: "ldap-axi profile",
23662
- type: "object",
23663
- additionalProperties: false,
23664
- required: [
23665
- "url"
23666
- ],
23667
- properties: {
23668
- url: {
23669
- type: "string",
23670
- pattern: "^ldaps?://",
23671
- description: "LDAP URL without userinfo; use the server FQDN for ambient authentication"
23672
- },
23673
- auth: {
23674
- enum: [
23675
- "auto",
23676
- "gssapi",
23677
- "simple"
23678
- ],
23679
- default: "auto"
23680
- },
23681
- bindDn: {
23682
- type: "string",
23683
- minLength: 1,
23684
- description: "Simple-bind identity, required for simple authentication"
23685
- },
23686
- bindPassword: {
23687
- "x-secret": true,
23688
- description: "Simple-bind password reference; defaults to env LDAP_AXI_BIND_PASSWORD. No stored secrets.",
23689
- oneOf: [
23690
- {
23691
- type: "object",
23692
- additionalProperties: false,
23693
- required: [
23694
- "env"
23695
- ],
23696
- properties: {
23697
- env: {
23698
- type: "string",
23699
- pattern: "^[A-Za-z_][A-Za-z0-9_]*$"
23700
- }
23701
- }
23702
- },
23703
- {
23704
- type: "object",
23705
- additionalProperties: false,
23706
- required: [
23707
- "file"
23708
- ],
23709
- properties: {
23710
- file: {
23711
- type: "string",
23712
- pattern: "^(?:/|[A-Za-z]:[\\\\/])",
23713
- description: "Absolute local path to a private UTF-8 password file; UNC/device paths are forbidden on Windows"
23714
- }
23715
- }
23716
- }
23717
- ]
23718
- },
23719
- base: {
23720
- type: "string"
23721
- },
23722
- pageSize: {
23723
- type: "integer",
23724
- minimum: 1,
23725
- maximum: 1e3
23726
- },
23727
- caFile: {
23728
- type: "string",
23729
- minLength: 1
23730
- },
23731
- startTls: {
23732
- type: "boolean",
23733
- default: false
23734
- },
23735
- tlsMaxVersion: {
23736
- const: "1.2"
23737
- },
23738
- flavor: {
23739
- enum: [
23740
- "ad",
23741
- "adlds",
23742
- "ldapv3"
23743
- ]
23744
- },
23745
- gssapiService: {
23746
- type: "string",
23747
- minLength: 1
23748
- },
23749
- gssapiProtection: {
23750
- enum: [
23751
- "none",
23752
- "confidentiality"
23753
- ]
23754
- }
23755
- }
23756
- },
23757
- adapterBoundary: {
23758
- unsafeOverrides: [
23759
- "config",
23760
- "url",
23761
- "start-tls",
23762
- "ca-file",
23763
- "ca-only",
23764
- "tls-no-verify",
23765
- "tls-max-version",
23766
- "insecure-plaintext",
23767
- "anonymous",
23768
- "profile",
23769
- "auth",
23770
- "gssapi-service",
23771
- "gssapi-protection"
23772
- ],
23773
- blockedCommands: [
23774
- "config",
23775
- "profile",
23776
- "setup"
23777
- ],
23778
- sensitiveFlags: [
23779
- "base",
23780
- "filter",
23781
- "name",
23782
- "sam",
23783
- "upn",
23784
- "uid"
23785
- ],
23786
- authentication: "Stored simple-bind identity over verified LDAPS or StartTLS; no ambient ticket or keytab",
23787
- inputs: {
23788
- stdin: "unsupported",
23789
- files: "unsupported",
23790
- caFile: "stored PEM materialized privately by host"
23791
- },
23792
- resources: {
23793
- nodeHeapMiB: 128
23794
- },
23795
- nativeWrites: "read-only upstream design"
23796
- },
23797
- discovery: {
23798
- commands: [
23799
- "entry",
23800
- "user",
23801
- "group",
23802
- "computer",
23803
- "auth status",
23804
- "server"
23805
- ],
23806
- example: [
23807
- "user",
23808
- "list",
23809
- "--limit",
23810
- "1"
23811
- ],
23812
- help: "List user accounts.\nLDAPv3 users are inetOrgPerson or posixAccount entries; use ldap-axi entry search for account + simpleSecurityObject service accounts.\nUsage: ldap-axi user list [flags]\nFlags:\n --help show this help\n --base <dn> search base (default: environment, config, or server naming contexts)\n --disabled include disabled accounts (LDAPv3: permanent ppolicy locks)\n --enabled include enabled accounts (LDAPv3: exclude permanent ppolicy locks)\n --locked include current AD locks or recorded LDAPv3 ppolicy lock candidates\n --all read all pages up to --max-rows or --limit\n --name <pattern> match cn\n --sam <pattern> AD only: match sAMAccountName\n --upn <pattern> AD only: match userPrincipalName\n --uid <pattern> LDAPv3 only: match uid\n --filter <RFC4515> add a raw LDAP filter\n --scope <base|one|sub> search scope (default: sub)\n --max-rows <n> maximum output rows\n --page-size <1..1000> LDAP page size (default: AD 1000, LDAPv3 500; config overrides)\n --limit <n> alias for bounded list output\n --fields <name,...> select output fields\n --attributes <name,...> request and emit raw attributes\nActive Directory fields: sam, upn, name, dn, enabled, locked, last_logon, object_sid, when_created\nActive Directory defaults: sam, name, enabled, last_logon\nLDAPv3 fields: uid, name, mail, enabled, locked, account_state, dn, entry_uuid, when_created\nLDAPv3 defaults: uid, name, mail, enabled, locked, account_state\nExamples:\n ldap-axi user list --disabled --max-rows 25\n ldap-axi user list --name Alice --fields name,dn --limit 50"
23813
- },
23814
- suggestionFields: [
23815
- "help"
23816
- ],
23817
- format: "TOON",
23818
- commands: [
23819
- {
23820
- command: "home",
23821
- flags: {
23822
- help: "boolean",
23823
- config: "value",
23824
- url: "value",
23825
- base: "value",
23826
- "start-tls": "boolean",
23827
- "ca-file": "value",
23828
- "ca-only": "boolean",
23829
- "tls-no-verify": "boolean",
23830
- "tls-max-version": "value",
23831
- "insecure-plaintext": "boolean",
23832
- anonymous: "boolean",
23833
- profile: "value",
23834
- auth: "value",
23835
- "gssapi-service": "value",
23836
- "gssapi-protection": "value"
23837
- },
23838
- positionalInput: false
23839
- },
23840
- {
23841
- command: "auth status",
23842
- flags: {
23843
- help: "boolean",
23844
- config: "value",
23845
- url: "value",
23846
- base: "value",
23847
- "start-tls": "boolean",
23848
- "ca-file": "value",
23849
- "ca-only": "boolean",
23850
- "tls-no-verify": "boolean",
23851
- "tls-max-version": "value",
23852
- "insecure-plaintext": "boolean",
23853
- anonymous: "boolean",
23854
- profile: "value",
23855
- auth: "value",
23856
- "gssapi-service": "value",
23857
- "gssapi-protection": "value",
23858
- offline: "boolean"
23859
- },
23860
- positionalInput: false
23861
- },
23862
- {
23863
- command: "server",
23864
- flags: {
23865
- help: "boolean",
23866
- config: "value",
23867
- url: "value",
23868
- base: "value",
23869
- "start-tls": "boolean",
23870
- "ca-file": "value",
23871
- "ca-only": "boolean",
23872
- "tls-no-verify": "boolean",
23873
- "tls-max-version": "value",
23874
- "insecure-plaintext": "boolean",
23875
- anonymous: "boolean",
23876
- profile: "value",
23877
- auth: "value",
23878
- "gssapi-service": "value",
23879
- "gssapi-protection": "value"
23880
- },
23881
- positionalInput: false
23882
- },
23883
- {
23884
- command: "entry search",
23885
- flags: {
23886
- help: "boolean",
23887
- config: "value",
23888
- url: "value",
23889
- base: "value",
23890
- "start-tls": "boolean",
23891
- "ca-file": "value",
23892
- "ca-only": "boolean",
23893
- "tls-no-verify": "boolean",
23894
- "tls-max-version": "value",
23895
- "insecure-plaintext": "boolean",
23896
- anonymous: "boolean",
23897
- profile: "value",
23898
- auth: "value",
23899
- "gssapi-service": "value",
23900
- "gssapi-protection": "value",
23901
- filter: "value",
23902
- scope: "value",
23903
- attributes: "value",
23904
- "page-size": "value",
23905
- "max-rows": "value",
23906
- all: "boolean"
23907
- },
23908
- positionalInput: false
23909
- },
23910
- {
23911
- command: "entry show",
23912
- flags: {
23913
- help: "boolean",
23914
- config: "value",
23915
- url: "value",
23916
- base: "value",
23917
- "start-tls": "boolean",
23918
- "ca-file": "value",
23919
- "ca-only": "boolean",
23920
- "tls-no-verify": "boolean",
23921
- "tls-max-version": "value",
23922
- "insecure-plaintext": "boolean",
23923
- anonymous: "boolean",
23924
- profile: "value",
23925
- auth: "value",
23926
- "gssapi-service": "value",
23927
- "gssapi-protection": "value",
23928
- attributes: "value",
23929
- "page-size": "value"
23930
- },
23931
- positionalInput: true
23932
- },
23933
- {
23934
- command: "user list",
23935
- flags: {
23936
- help: "boolean",
23937
- config: "value",
23938
- url: "value",
23939
- base: "value",
23940
- "start-tls": "boolean",
23941
- "ca-file": "value",
23942
- "ca-only": "boolean",
23943
- "tls-no-verify": "boolean",
23944
- "tls-max-version": "value",
23945
- "insecure-plaintext": "boolean",
23946
- anonymous: "boolean",
23947
- profile: "value",
23948
- auth: "value",
23949
- "gssapi-service": "value",
23950
- "gssapi-protection": "value",
23951
- disabled: "boolean",
23952
- enabled: "boolean",
23953
- locked: "boolean",
23954
- all: "boolean",
23955
- name: "value",
23956
- sam: "value",
23957
- upn: "value",
23958
- uid: "value",
23959
- filter: "value",
23960
- scope: "value",
23961
- "max-rows": "value",
23962
- "page-size": "value",
23963
- limit: "value",
23964
- fields: "value",
23965
- attributes: "value"
23966
- },
23967
- positionalInput: false
23968
- },
23969
- {
23970
- command: "user show",
23971
- flags: {
23972
- help: "boolean",
23973
- config: "value",
23974
- url: "value",
23975
- base: "value",
23976
- "start-tls": "boolean",
23977
- "ca-file": "value",
23978
- "ca-only": "boolean",
23979
- "tls-no-verify": "boolean",
23980
- "tls-max-version": "value",
23981
- "insecure-plaintext": "boolean",
23982
- anonymous: "boolean",
23983
- profile: "value",
23984
- auth: "value",
23985
- "gssapi-service": "value",
23986
- "gssapi-protection": "value",
23987
- fields: "value",
23988
- attributes: "value"
23989
- },
23990
- positionalInput: true
23991
- },
23992
- {
23993
- command: "user groups",
23994
- flags: {
23995
- help: "boolean",
23996
- config: "value",
23997
- url: "value",
23998
- base: "value",
23999
- "start-tls": "boolean",
24000
- "ca-file": "value",
24001
- "ca-only": "boolean",
24002
- "tls-no-verify": "boolean",
24003
- "tls-max-version": "value",
24004
- "insecure-plaintext": "boolean",
24005
- anonymous: "boolean",
24006
- profile: "value",
24007
- auth: "value",
24008
- "gssapi-service": "value",
24009
- "gssapi-protection": "value",
24010
- nested: "boolean",
24011
- "max-rows": "value",
24012
- "page-size": "value",
24013
- fields: "value"
24014
- },
24015
- positionalInput: true
24016
- },
24017
- {
24018
- command: "group list",
24019
- flags: {
24020
- help: "boolean",
24021
- config: "value",
24022
- url: "value",
24023
- base: "value",
24024
- "start-tls": "boolean",
24025
- "ca-file": "value",
24026
- "ca-only": "boolean",
24027
- "tls-no-verify": "boolean",
24028
- "tls-max-version": "value",
24029
- "insecure-plaintext": "boolean",
24030
- anonymous: "boolean",
24031
- profile: "value",
24032
- auth: "value",
24033
- "gssapi-service": "value",
24034
- "gssapi-protection": "value",
24035
- all: "boolean",
24036
- name: "value",
24037
- sam: "value",
24038
- filter: "value",
24039
- scope: "value",
24040
- "max-rows": "value",
24041
- "page-size": "value",
24042
- limit: "value",
24043
- fields: "value",
24044
- attributes: "value"
24045
- },
24046
- positionalInput: false
24047
- },
24048
- {
24049
- command: "group show",
24050
- flags: {
24051
- help: "boolean",
24052
- config: "value",
24053
- url: "value",
24054
- base: "value",
24055
- "start-tls": "boolean",
24056
- "ca-file": "value",
24057
- "ca-only": "boolean",
24058
- "tls-no-verify": "boolean",
24059
- "tls-max-version": "value",
24060
- "insecure-plaintext": "boolean",
24061
- anonymous: "boolean",
24062
- profile: "value",
24063
- auth: "value",
24064
- "gssapi-service": "value",
24065
- "gssapi-protection": "value",
24066
- fields: "value",
24067
- attributes: "value"
24068
- },
24069
- positionalInput: true
24070
- },
24071
- {
24072
- command: "group members",
24073
- flags: {
24074
- help: "boolean",
24075
- config: "value",
24076
- url: "value",
24077
- base: "value",
24078
- "start-tls": "boolean",
24079
- "ca-file": "value",
24080
- "ca-only": "boolean",
24081
- "tls-no-verify": "boolean",
24082
- "tls-max-version": "value",
24083
- "insecure-plaintext": "boolean",
24084
- anonymous: "boolean",
24085
- profile: "value",
24086
- auth: "value",
24087
- "gssapi-service": "value",
24088
- "gssapi-protection": "value",
24089
- nested: "boolean",
24090
- "max-rows": "value",
24091
- "page-size": "value",
24092
- fields: "value"
24093
- },
24094
- positionalInput: true
24095
- },
24096
- {
24097
- command: "computer list",
24098
- flags: {
24099
- help: "boolean",
24100
- config: "value",
24101
- url: "value",
24102
- base: "value",
24103
- "start-tls": "boolean",
24104
- "ca-file": "value",
24105
- "ca-only": "boolean",
24106
- "tls-no-verify": "boolean",
24107
- "tls-max-version": "value",
24108
- "insecure-plaintext": "boolean",
24109
- anonymous: "boolean",
24110
- profile: "value",
24111
- auth: "value",
24112
- "gssapi-service": "value",
24113
- "gssapi-protection": "value",
24114
- all: "boolean",
24115
- name: "value",
24116
- sam: "value",
24117
- filter: "value",
24118
- scope: "value",
24119
- "max-rows": "value",
24120
- "page-size": "value",
24121
- limit: "value",
24122
- fields: "value",
24123
- attributes: "value"
24124
- },
24125
- positionalInput: false
24126
- },
24127
- {
24128
- command: "computer show",
24129
- flags: {
24130
- help: "boolean",
24131
- config: "value",
24132
- url: "value",
24133
- base: "value",
24134
- "start-tls": "boolean",
24135
- "ca-file": "value",
24136
- "ca-only": "boolean",
24137
- "tls-no-verify": "boolean",
24138
- "tls-max-version": "value",
24139
- "insecure-plaintext": "boolean",
24140
- anonymous: "boolean",
24141
- profile: "value",
24142
- auth: "value",
24143
- "gssapi-service": "value",
24144
- "gssapi-protection": "value",
24145
- fields: "value",
24146
- attributes: "value"
24147
- },
24148
- positionalInput: true
24149
- }
24150
- ]
24151
- };
24152
-
24153
- // src/cli/help.ts
24154
- var commands = {
24155
- home: { usage: "artium-axi [tools [show <tool>]|whoami|login|passwd|logout|doctor|setup|<tool> <args>]", purpose: "Show your identity, roles and available tools.", flags: ["--version (default false; print the client package version and exit)"], example: "artium-axi" },
24156
- setup: {
24157
- usage: "artium-axi setup --host <claude|codex|opencode|pi> [--hook] [--force]",
24158
- purpose: "Install skills for your signed-in account\u2019s granted tools and an optional Claude Code session hook.",
24159
- flags: ["--host <claude|codex|opencode|pi> (required)", "--hook (default false; Claude Code only)", "--force (default false; explicitly replace an edited skill)"],
24160
- example: "artium-axi setup --host claude --hook"
24161
- },
24162
- tools: { usage: "artium-axi tools", purpose: "List available tools with their status and pinned version.", flags: [], example: "artium-axi tools" },
24163
- "tools show": { usage: "artium-axi tools show <tool>", purpose: "Show one available tool and its vetted upstream help.", flags: [], example: "artium-axi tools show falcon-axi" },
24164
- whoami: { usage: "artium-axi whoami", purpose: "Show your identity, roles, access expiry and server.", flags: [], example: "artium-axi whoami" },
24165
- login: {
24166
- usage: "artium-axi login --sso | --username <username> [--password-stdin]",
24167
- purpose: "Sign in through browser SSO (8-hour session) or with a local account.",
24168
- flags: ["--sso (default false; open the displayed URL in any browser and approve your terminal code; no password flags)", "--username <username> (required for local sign-in)", "--password-stdin (default false; local only; otherwise ARTIUM_AXI_PASSWORD or a terminal prompt)"],
24169
- example: "artium-axi login --sso"
24170
- },
24171
- passwd: {
24172
- usage: "artium-axi passwd [--password-stdin]",
24173
- purpose: "Change your password, then sign in again.",
24174
- flags: ["--password-stdin (default false; otherwise a terminal prompt; current password uses ARTIUM_AXI_CURRENT_PASSWORD or a terminal prompt)"],
24175
- example: "artium-axi passwd --password-stdin"
24176
- },
24177
- logout: { usage: "artium-axi logout", purpose: "Remove local tokens and revoke the server session.", flags: [], example: "artium-axi logout" },
24178
- doctor: { usage: "artium-axi doctor", purpose: "Check the server, certificate, token, CLI version and cached tool health.", flags: [], example: "artium-axi doctor" },
24179
- "falcon-axi": {
24180
- usage: "artium-axi falcon-axi [<args>]",
24181
- purpose: "Run Falcon commands with your managed credentials.",
24182
- flags: ["Arguments after falcon-axi are forwarded upstream, including --help."],
24183
- example: `artium-axi falcon-axi ${falcon_axi_default.discovery.example.join(" ")}`
24184
- },
24185
- "vectra-axi": {
24186
- usage: "artium-axi vectra-axi [<args>]",
24187
- purpose: "Run Vectra commands with your managed credentials.",
24188
- flags: ["Arguments after vectra-axi are forwarded upstream, including --help."],
24189
- example: `artium-axi vectra-axi ${vectra_axi_default.discovery.example.join(" ")}`
24190
- },
24191
- "ldap-axi": {
24192
- usage: "artium-axi ldap-axi [<args>]",
24193
- purpose: "Read directory data with the managed LDAP bind identity.",
24194
- flags: ["Arguments after ldap-axi are forwarded upstream, including --help."],
24195
- example: `artium-axi ldap-axi ${ldap_axi_default.discovery.example.join(" ")}`
24196
- },
24197
- "ado-axi": {
24198
- usage: "artium-axi ado-axi [<args>]",
24199
- purpose: "Run Azure DevOps commands with managed credentials.",
24200
- flags: ["Arguments after ado-axi include --help. Organization and credentials are managed by Artium; api is GET only; writes are off by default."],
24201
- example: "artium-axi ado-axi project list --limit 1"
24202
- },
24203
- "awx-axi": {
24204
- usage: "artium-axi awx-axi [<args>]",
24205
- purpose: "Inspect AWX automation with managed credentials.",
24206
- flags: ["Arguments after awx-axi include --help. Operational writes are off by default; configuration, deletion and security writes are blocked."],
24207
- example: "artium-axi awx-axi job list --limit 1"
24208
- },
24209
- "az-axi": {
24210
- usage: "artium-axi az-axi [<args>]",
24211
- purpose: "Run Azure commands with your managed identity.",
24212
- flags: ["Arguments after az-axi are forwarded upstream, including --help."],
24213
- example: "artium-axi az-axi sub list"
24214
- },
24215
- "mg-axi": {
24216
- usage: "artium-axi mg-axi [<args>]",
24217
- purpose: "Run Microsoft Graph commands with your managed identity.",
24218
- flags: ["Arguments after mg-axi are forwarded upstream, including --help."],
24219
- example: "artium-axi mg-axi entra user list"
24220
- },
24221
- "managed-session": {
24222
- usage: "artium-axi --managed-session <command> [<args>]",
24223
- purpose: "Let a caller supply and persist sessions through private pipes.",
24224
- flags: [],
24225
- example: "artium-axi --managed-session whoami"
24226
- }
24227
- };
24228
- function commandHelp(command) {
24229
- const entry = commands[command];
24230
- const flags = [
24231
- toolSchema.safeParse(command).success ? "--help before the tool name (default false)" : "--help (default false)",
24232
- ...entry.flags,
24233
- "--managed-session before the command (default false; caller-owned sessions; see artium-axi --managed-session --help)"
24234
- ];
24235
- const protocol = [
24236
- "Session JSON on inherited pipe fd 3, new sessions and rotations as JSON lines on private pipe fd 4; no session file.",
24237
- "Managed input: {serverUrl, accessToken, refreshToken?}; close fd 3 after JSON (64 KiB maximum). Output: {serverUrl, status, accessToken, refreshToken, accessExpiresAt, familyExpiresAt} per rotation, before retry, including on later failure.",
24238
- "Managed login: fd 3 is unused; fd 4 must be a writable private pipe/socket. Local sign-in requires --username <username> --password-stdin with protected inherited stdin; password argv and ARTIUM_AXI_PASSWORD are refused. SSO uses login --sso and displays browser approval instructions immediately. New sessions use the rotation envelope; password-change-required returns {serverUrl, status, passwordChangeToken, passwordChangeExpiresAt} on fd 4 and exits 1.",
24239
- "Managed exits: 0 success; 2 invalid JSON/descriptors or refused passwd/logout/setup; 1 authentication/transport failure; tool exit codes pass through. Only TOKEN_EXPIRED permits one refresh/retry; without refreshToken or on refusal, return control to the caller."
24240
- ];
24241
- const purposes = command === "home" ? `commands[${Object.keys(commands).length - 2}]{command,purpose}:
24242
- ${Object.entries(commands).filter(([name]) => name !== "home" && name !== "managed-session").map(([name, value]) => ` ${name},${JSON.stringify(value.purpose)}`).join("\n")}
24243
- ` : "";
24244
- return `purpose: ${entry.purpose}
24245
- usage: ${entry.usage}
24246
- ${purposes}flags[${flags.length}]:
24247
- ${flags.map((flag) => ` - ${JSON.stringify(flag)}`).join("\n")}
24248
- example: ${entry.example}
24249
- ` + (command === "login" || command === "managed-session" ? `managedSession[${protocol.length}]:
24250
- ${protocol.map((line) => ` - ${JSON.stringify(line)}`).join("\n")}
24251
- ` : "");
24252
- }
24253
- function validateArguments(args, prefixHelp) {
24254
- const command = args[0];
24255
- if (command === "tools") args = [...args.filter((arg) => arg !== "--help"), ...args.filter((arg) => arg === "--help")];
24256
- const rootFlags = "--help, --version, --managed-session (before the command)";
24257
- const rootCommands = Object.keys(commands).filter((name) => name !== "home" && name !== "managed-session" && name !== "tools show").join(", ");
24258
- function fail(token, level2, choices2) {
24259
- const kind = token?.startsWith("-") ? "flag" : "argument";
24260
- const message = token === void 0 ? `Missing argument for ${level2}.` : command === "login" || command === "passwd" ? `Unexpected argument at position ${args.indexOf(token) + 1} for ${level2}. Password arguments are refused.` : `Unknown or unexpected ${kind} ${JSON.stringify(kind === "flag" ? token.split("=")[0] : token)} for ${level2}.`;
24261
- throw new ArtiumError("INVALID_INPUT", message, choices2);
24262
- }
24263
- if (!command) return;
24264
- if (command === "--version" && args.length === 1) return;
24265
- if (!Object.hasOwn(commands, command) || command === "home" || command === "managed-session" || command === "tools show") {
24266
- fail(command, "artium-axi", `Valid commands: ${rootCommands}. Valid flags: ${rootFlags}.`);
24267
- }
24268
- if (toolSchema.safeParse(command).success) {
24269
- if (prefixHelp && args.length > 1) fail(args[1], command, `Use artium-axi --help ${command} for local help; artium-axi ${command} --help for upstream flags.`);
24270
- return;
24271
- }
24272
- let level = command;
24273
- let start = 1;
24274
- if (command === "tools" && args[1] === "show") {
24275
- level = "tools show";
24276
- start = 2;
24277
- }
24278
- const entry = commands[level];
24279
- const validFlags = ["--help", ...entry.flags.map((flag) => flag.split(" ")[0])];
24280
- const choices = `Valid flags for ${level}: ${validFlags.join(", ")}.` + (level === "tools" ? " Valid subcommands: show <tool>." : level === "tools show" ? ` Valid tools: ${toolSchema.options.join(", ")}.` : "");
24281
- let tool = false;
24282
- const seen = /* @__PURE__ */ new Set();
24283
- for (let index = start; index < args.length; index++) {
24284
- const token = args[index];
24285
- if (level === "tools show" && !token.startsWith("-") && !tool) {
24286
- if (!toolSchema.safeParse(token).success) fail(token, level, choices);
24287
- tool = true;
24288
- } else {
24289
- if (!validFlags.includes(token) || seen.has(token)) fail(token, level, choices);
24290
- seen.add(token);
24291
- if (token === "--username" || token === "--host") {
24292
- const value = args[index + 1];
24293
- if (!value) fail(value, `${level} ${token}`, `Supply ${token} ${token === "--host" ? "<claude|codex|opencode|pi>" : "<username>"}. ${choices}`);
24294
- if (token === "--host" && !["claude", "codex", "opencode", "pi"].includes(value)) fail(value, `${level} --host`, `Valid hosts: claude, codex, opencode, pi. Use ${entry.usage}.`);
24295
- index++;
24296
- }
24297
- }
24298
- }
24299
- if (level === "tools show" && !tool && !seen.has("--help") && !prefixHelp) fail(void 0, level, choices);
24300
- }
24301
- function helpCommand(args, prefixHelp = false) {
24302
- if (args[0] === "setup" && args.includes("--help")) {
24303
- const path2 = args.filter((arg) => arg !== "--help");
24304
- for (let index = 1; index < path2.length; index++) {
24305
- if (path2[index] === "--host" && ["claude", "codex", "opencode", "pi"].includes(path2[index + 1])) index++;
24306
- else if (path2[index] !== "--hook" && path2[index] !== "--force") return void 0;
24307
- }
24308
- return "setup";
24309
- }
24310
- if (toolSchema.safeParse(args[0]).success) return prefixHelp && args.length === 2 ? args[0] : void 0;
24311
- if (args[0] === "login" || args[0] === "passwd") {
24312
- if (args[0] === "login" && args.length === 3 && args.includes("--sso") && args.includes("--help")) return "login";
24313
- let requested = false;
24314
- let username = false;
24315
- let stdin = false;
24316
- for (let index = 1; index < args.length; index++) {
24317
- const option = args[index];
24318
- if (option === "--username" && args[0] === "login" && !username && args[index + 1] !== void 0) {
24319
- username = true;
24320
- index++;
24321
- } else if (option === "--password-stdin" && !stdin) stdin = true;
24322
- else if (option === "--help" && !requested) requested = true;
24323
- else return void 0;
24324
- }
24325
- return requested ? args[0] : void 0;
24326
- }
24327
- if (!args.includes("--help")) return void 0;
24328
- const path = args.filter((arg) => arg !== "--help");
24329
- if (path.length === 0) return "home";
24330
- if (path[0] === "tools" && path[1] === "show" && (path.length === 2 || path.length === 3 && toolSchema.safeParse(path[2]).success)) return "tools show";
24331
- if (path.length === 1 && path[0] !== "home" && Object.hasOwn(commands, path[0])) return path[0];
24332
- return void 0;
24333
- }
24334
-
24335
23669
  // tools/inventories/az-axi.json
24336
23670
  var az_axi_default = {
24337
23671
  generatedBy: "scripts/upstream-inventory.mjs",
@@ -29064,6 +28398,13 @@ var mg_axi_default = {
29064
28398
  ],
29065
28399
  nativeWriteSettings: {
29066
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
+ ],
29067
28408
  profileFields: {
29068
28409
  "writes.allowWrites": "boolean",
29069
28410
  "writes.operations": "string[]"
@@ -33640,171 +32981,710 @@ var mg_axi_default = {
33640
32981
  positionalInput: false
33641
32982
  },
33642
32983
  {
33643
- 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",
33644
33381
  flags: {
33645
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",
33646
33393
  profile: "value",
33647
- "api-version": "value",
33648
- workflow: "value",
33649
- run: "value",
33650
- scopes: "value",
33651
- config: "value"
33394
+ auth: "value",
33395
+ "gssapi-service": "value",
33396
+ "gssapi-protection": "value",
33397
+ offline: "boolean"
33652
33398
  },
33653
33399
  positionalInput: false
33654
33400
  },
33655
33401
  {
33656
- command: "entra lifecycle run subject-processing-result list",
33402
+ command: "server",
33657
33403
  flags: {
33658
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",
33659
33415
  profile: "value",
33660
- "api-version": "value",
33661
- workflow: "value",
33662
- run: "value",
33663
- limit: "value",
33664
- all: "boolean",
33665
- filter: "value",
33666
- fields: "value",
33667
- full: "boolean",
33668
- cursor: "value",
33669
- scopes: "value",
33670
- config: "value"
33416
+ auth: "value",
33417
+ "gssapi-service": "value",
33418
+ "gssapi-protection": "value"
33671
33419
  },
33672
33420
  positionalInput: false
33673
33421
  },
33674
33422
  {
33675
- command: "entra lifecycle run subject-processing-result show",
33423
+ command: "entry search",
33676
33424
  flags: {
33677
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",
33678
33436
  profile: "value",
33679
- "api-version": "value",
33680
- workflow: "value",
33681
- run: "value",
33682
- id: "value",
33683
- fields: "value",
33684
- full: "boolean",
33685
- scopes: "value",
33686
- config: "value"
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"
33687
33446
  },
33688
33447
  positionalInput: false
33689
33448
  },
33690
33449
  {
33691
- command: "entra lifecycle run subject-processing-result count",
33450
+ command: "entry show",
33692
33451
  flags: {
33693
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",
33694
33463
  profile: "value",
33695
- "api-version": "value",
33696
- workflow: "value",
33697
- run: "value",
33698
- scopes: "value",
33699
- config: "value"
33464
+ auth: "value",
33465
+ "gssapi-service": "value",
33466
+ "gssapi-protection": "value",
33467
+ attributes: "value",
33468
+ "page-size": "value"
33700
33469
  },
33701
- positionalInput: false
33470
+ positionalInput: true
33702
33471
  },
33703
33472
  {
33704
- command: "entra lifecycle run task-processing-result list",
33473
+ command: "user list",
33705
33474
  flags: {
33706
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",
33707
33486
  profile: "value",
33708
- "api-version": "value",
33709
- workflow: "value",
33710
- run: "value",
33711
- limit: "value",
33487
+ auth: "value",
33488
+ "gssapi-service": "value",
33489
+ "gssapi-protection": "value",
33490
+ disabled: "boolean",
33491
+ enabled: "boolean",
33492
+ locked: "boolean",
33712
33493
  all: "boolean",
33494
+ name: "value",
33495
+ sam: "value",
33496
+ upn: "value",
33497
+ uid: "value",
33713
33498
  filter: "value",
33714
- select: "value",
33499
+ scope: "value",
33500
+ "max-rows": "value",
33501
+ "page-size": "value",
33502
+ limit: "value",
33715
33503
  fields: "value",
33716
- full: "boolean",
33717
- cursor: "value",
33718
- scopes: "value",
33719
- config: "value"
33504
+ attributes: "value"
33720
33505
  },
33721
33506
  positionalInput: false
33722
33507
  },
33723
33508
  {
33724
- command: "entra lifecycle run task-processing-result show",
33509
+ command: "user show",
33725
33510
  flags: {
33726
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",
33727
33522
  profile: "value",
33728
- "api-version": "value",
33729
- workflow: "value",
33730
- run: "value",
33731
- id: "value",
33523
+ auth: "value",
33524
+ "gssapi-service": "value",
33525
+ "gssapi-protection": "value",
33732
33526
  fields: "value",
33733
- full: "boolean",
33734
- scopes: "value",
33735
- config: "value"
33527
+ attributes: "value"
33736
33528
  },
33737
- positionalInput: false
33529
+ positionalInput: true
33738
33530
  },
33739
33531
  {
33740
- command: "entra lifecycle run task-processing-result count",
33532
+ command: "user groups",
33741
33533
  flags: {
33742
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",
33743
33545
  profile: "value",
33744
- "api-version": "value",
33745
- workflow: "value",
33746
- run: "value",
33747
- scopes: "value",
33748
- 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"
33749
33553
  },
33750
- positionalInput: false
33554
+ positionalInput: true
33751
33555
  },
33752
33556
  {
33753
- command: "api get",
33557
+ command: "group list",
33754
33558
  flags: {
33755
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",
33756
33570
  profile: "value",
33757
- "api-version": "value",
33758
- odata: "value",
33759
- cursor: "value",
33760
- scopes: "value",
33761
- limit: "value",
33571
+ auth: "value",
33572
+ "gssapi-service": "value",
33573
+ "gssapi-protection": "value",
33762
33574
  all: "boolean",
33763
- full: "boolean",
33764
- 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"
33765
33584
  },
33766
- positionalInput: {
33767
- name: "path",
33768
- description: "Server-relative Graph path, e.g. /users",
33769
- required: true
33770
- }
33585
+ positionalInput: false
33771
33586
  },
33772
33587
  {
33773
- command: "login",
33588
+ command: "group show",
33774
33589
  flags: {
33775
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",
33776
33601
  profile: "value",
33777
- method: "value",
33778
- scopes: "value",
33779
- config: "value"
33602
+ auth: "value",
33603
+ "gssapi-service": "value",
33604
+ "gssapi-protection": "value",
33605
+ fields: "value",
33606
+ attributes: "value"
33780
33607
  },
33781
- positionalInput: false
33608
+ positionalInput: true
33782
33609
  },
33783
33610
  {
33784
- command: "config path",
33611
+ command: "group members",
33785
33612
  flags: {
33786
33613
  help: "boolean",
33787
- 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"
33788
33632
  },
33789
- positionalInput: false
33633
+ positionalInput: true
33790
33634
  },
33791
33635
  {
33792
- command: "auth status",
33636
+ command: "computer list",
33793
33637
  flags: {
33794
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",
33795
33649
  profile: "value",
33796
- 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"
33797
33663
  },
33798
33664
  positionalInput: false
33799
33665
  },
33800
33666
  {
33801
- command: "auth logout",
33667
+ command: "computer show",
33802
33668
  flags: {
33803
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",
33804
33680
  profile: "value",
33805
- config: "value"
33681
+ auth: "value",
33682
+ "gssapi-service": "value",
33683
+ "gssapi-protection": "value",
33684
+ fields: "value",
33685
+ attributes: "value"
33806
33686
  },
33807
- positionalInput: false
33687
+ positionalInput: true
33808
33688
  }
33809
33689
  ]
33810
33690
  };
@@ -34879,8 +34759,8 @@ var ado_axi_default = {
34879
34759
  var awx_axi_default = {
34880
34760
  generatedBy: "scripts/awx-inventory.mjs",
34881
34761
  tool: "awx-axi",
34882
- version: "0.1.7",
34883
- integrity: "sha512-hZFvJnOhW+UZDeBTp+un1K1anUqEVC0njETANXbHjgXKwiGB3W1h5oEZzmf4fiPskZarr+ynlEaUaWafEHtnsA==",
34762
+ version: "0.1.8",
34763
+ integrity: "sha512-tkheZgSTjs6nZT3KWo0e/+SH43ZacfvZpo7COktmpIs8lNr8VLhUtrGARz+mvwj8pov4zscdfmxAHL/8V025Bw==",
34884
34764
  parserEvidence: "Published domain registry, reviewed plan effects and transport safety gates",
34885
34765
  sources: [
34886
34766
  {
@@ -34893,7 +34773,7 @@ var awx_axi_default = {
34893
34773
  },
34894
34774
  {
34895
34775
  path: "dist/commands/auth.js",
34896
- sha256: "5ccc0c9a226ab900bcc89a55aa71b22b64a41069e9f64d73c2c1fece79190a68"
34776
+ sha256: "cf8e52f33d6acb5091d009c23df4957da3d208d4e9417bdcbba547f4d7c8b690"
34897
34777
  },
34898
34778
  {
34899
34779
  path: "dist/commands/home.js",
@@ -34917,7 +34797,7 @@ var awx_axi_default = {
34917
34797
  },
34918
34798
  {
34919
34799
  path: "dist/core/flags.js",
34920
- sha256: "ae72d1964d63ef9fab92bb5ff561f584432c14b8d216b5f2e2b5967333b25fbb"
34800
+ sha256: "60d5c58ab68c3cc61e57c249b93db544d619469c6fbd1e3082ee573ed1b50498"
34921
34801
  },
34922
34802
  {
34923
34803
  path: "dist/core/mutations.js",
@@ -34925,11 +34805,11 @@ var awx_axi_default = {
34925
34805
  },
34926
34806
  {
34927
34807
  path: "dist/core/output.js",
34928
- sha256: "b8d4dc8dff76151b2af0e25caf5946c97ba98f8eb21939aab49ed1222d7c16dd"
34808
+ sha256: "7406df524ee329a3e2eb1f2b37295d8699de678e687525c8d55a3ce67d78dd0a"
34929
34809
  },
34930
34810
  {
34931
34811
  path: "dist/core/paginate.js",
34932
- sha256: "cd5b17961f1671e204a8087b96ef8a15dc8c4994b486f0b3027734c560e648b2"
34812
+ sha256: "d952bc390a4ac2da263b1d98c24f05e416652335904de37b26379576632059a3"
34933
34813
  },
34934
34814
  {
34935
34815
  path: "dist/core/poll.js",
@@ -34937,19 +34817,19 @@ var awx_axi_default = {
34937
34817
  },
34938
34818
  {
34939
34819
  path: "dist/core/private-file.js",
34940
- sha256: "eedc2a13e5e4470eb22b8e3d500cd971b376c57fff9220c12c4d507ceeb240f6"
34820
+ sha256: "30f44672d91f74b232ae6f7884b7daee6bd12ce6702ca57b3213a8a5da4bf992"
34941
34821
  },
34942
34822
  {
34943
34823
  path: "dist/core/profiles.js",
34944
- sha256: "72b3bfe669c5471222efb6a457d25daff793375399c406f47a112fc76b291dc4"
34824
+ sha256: "c3ac1d2a531115d253ed83020d88e3763108249a4a03ca710da40833db05bc7d"
34945
34825
  },
34946
34826
  {
34947
34827
  path: "dist/core/redact.js",
34948
- sha256: "dd8de047c53d06808f90f9c51324b737a51d83768c16d4e69f9af64f56bdf602"
34828
+ sha256: "4fa205b30a3165738578c01ecfa5787bb6993ee11b07dbcb74b6401d4441679f"
34949
34829
  },
34950
34830
  {
34951
34831
  path: "dist/core/registry.js",
34952
- sha256: "a1818f532b67b39c6402d694b982b688234fdfdec4df51782ef30783b7afe488"
34832
+ sha256: "89d3983928dd3a63712e9c78a4959c2e9c950097a3d200f6d1ccf2c3327bbdfd"
34953
34833
  },
34954
34834
  {
34955
34835
  path: "dist/core/resolve.js",
@@ -34965,95 +34845,95 @@ var awx_axi_default = {
34965
34845
  },
34966
34846
  {
34967
34847
  path: "dist/domains/activity-stream/index.js",
34968
- sha256: "b5e7094013f5626affc0bf756b96ad3edce3d1720d0698238bc703e749e8571a"
34848
+ sha256: "633995f66b7e24cb4c6d98341e943a7e8d61b3b271503cb1b191b161b3fb927f"
34969
34849
  },
34970
34850
  {
34971
34851
  path: "dist/domains/ad-hoc/index.js",
34972
- sha256: "8fdaf507ab0b4b4f7e9ae7713e36ae318d55882276cfe9e82dfdeff65417266d"
34852
+ sha256: "92f5395f74f449bb6fde43276764dfe965eaa8afb491a8f5e13323dc9a366084"
34973
34853
  },
34974
34854
  {
34975
34855
  path: "dist/domains/approval/index.js",
34976
- sha256: "139356c4fa1289f2694d55248b7f12e8b0267fa5acd39edb05b0f3ac4da0f64e"
34856
+ sha256: "741282a1143b776ba0850cd8cc0ec3da913e1d354cc08f671b51cdea58621b1b"
34977
34857
  },
34978
34858
  {
34979
34859
  path: "dist/domains/credential/index.js",
34980
- sha256: "554a36457a4d264f2361da766350ec6696aaace78280e978f56b6fb577447f6b"
34860
+ sha256: "00e5171e9b653f8266722cc53302748bbd54c874c07e60e2967f95797c7bcf05"
34981
34861
  },
34982
34862
  {
34983
34863
  path: "dist/domains/execution-environment/index.js",
34984
- sha256: "d068ff30cdf0eff1d8af2a53a564ed26e2843c544cd1d0d5c2643e8a9f07bdca"
34864
+ sha256: "0038065d8d51b9fe370e8e517ddcebfdb8ccf0b3ee512a89147eea413e918685"
34985
34865
  },
34986
34866
  {
34987
34867
  path: "dist/domains/group/index.js",
34988
- sha256: "6415d7548cc0220f423dd5da887b0fc6975be3cdb8367ed5df74f7af375fc5ef"
34868
+ sha256: "7fdd83edd141372fcc5486ba07968137f913ac9a73147aa748127b523c4cc785"
34989
34869
  },
34990
34870
  {
34991
34871
  path: "dist/domains/host/index.js",
34992
- sha256: "2faf483f269b39a12f759f46ff520ee97ac1009448062ccfb333c5a26ecd4591"
34872
+ sha256: "478ff268a6a6a8452aa206be7671e402782fbfde8504808d9cc4fe10205b6707"
34993
34873
  },
34994
34874
  {
34995
34875
  path: "dist/domains/inventory-source/index.js",
34996
- sha256: "1015ff818f4051828cd089ff603f6a1fe28ddb672061be021372c93f68053f56"
34876
+ sha256: "56d8f203514f688eb734c29c2db45930dcddb96bdb82424bf8cc835c493cb279"
34997
34877
  },
34998
34878
  {
34999
34879
  path: "dist/domains/inventory/index.js",
35000
- sha256: "8363397bbb0b9f90617442ae980d9900b536f7c17dec35d1b931c71546603f31"
34880
+ sha256: "0352fc474d38aed258ab069a6a80da83d3acf00c9cccd37c3d26b16e8b6d8e2d"
35001
34881
  },
35002
34882
  {
35003
34883
  path: "dist/domains/job/index.js",
35004
- sha256: "5a5c76bc626d83dc286b737416b8f44c0b5bf53b419f39cc07bb61ef65ae00bd"
34884
+ sha256: "db22aa5cd3c15da799d7aaea4430c9a6aa5e04e7f5fa1a5cacb340799f34f38c"
35005
34885
  },
35006
34886
  {
35007
34887
  path: "dist/domains/notification-template/index.js",
35008
- sha256: "8b6faa1fd012db6d2c66246dea378d8360aaa36dc1accfed367cb39f4679721a"
34888
+ sha256: "c3ddb6e7abcdc57583bc1ada57f30302f63b01a559381c2be196b7ee3bbfdc9b"
35009
34889
  },
35010
34890
  {
35011
34891
  path: "dist/domains/notification/index.js",
35012
- sha256: "4825216f22fb565de502165455dd23a3126573dcff584d5cf97915123680d3cf"
34892
+ sha256: "d9c46319aabe8187e3417710c3ebeda5650b55463f84fa9baa3d6fe91edc1ced"
35013
34893
  },
35014
34894
  {
35015
34895
  path: "dist/domains/organization/index.js",
35016
- sha256: "d79160904aca5909b3e83cee7a43d751566a49fcba7fd63595d2d10ecb473289"
34896
+ sha256: "65072b9afb1706b67b1f7c37c9d96bf12104d8ec56a214f06a512e6283fb0229"
35017
34897
  },
35018
34898
  {
35019
34899
  path: "dist/domains/project/index.js",
35020
- sha256: "8dcb5a74ed19511e9c53cfe0d9c67efe3cf78861019a559c60c19914d8d7cde2"
34900
+ sha256: "eafb98f7148e2a5e8c194af16ebbaa7569ddf74344e367531ba9f6946a39ef46"
35021
34901
  },
35022
34902
  {
35023
34903
  path: "dist/domains/role/index.js",
35024
- sha256: "63df014ea35ce97855e19fba126ccef8971756b2cc707a9c442f3fd6c094bdc9"
34904
+ sha256: "0e5ee47acb703d2f202f01450eb87330140b97c430440eff31c4f33bab28a647"
35025
34905
  },
35026
34906
  {
35027
34907
  path: "dist/domains/schedule/index.js",
35028
- sha256: "bcab018cfa8b38fa9c4b3509ba1ec1c10c4e4d10e3887e500e00baa794bbc8a6"
34908
+ sha256: "d3267a27432a6911027a2d5dc04177eb46db703ea012cc6d1cfe33c19be49694"
35029
34909
  },
35030
34910
  {
35031
34911
  path: "dist/domains/system-job-template/index.js",
35032
- sha256: "d9c8efd7b12054715e2a110bffa726dcb1bd34120521725c505b1179d7a49b45"
34912
+ sha256: "8f485966f9f290399dfaf2eedf21b4182d2dd712bb6833e1df377eabb53ebb04"
35033
34913
  },
35034
34914
  {
35035
34915
  path: "dist/domains/system-job/index.js",
35036
- sha256: "59e45fa7495ae48f1e9d8e551a80673cbfbe880d4c78c4221a168709a8247cff"
34916
+ sha256: "25bae07068cd93cf705c2bebcd8a4f6e5f6071c6b41951edb62527630e2c678f"
35037
34917
  },
35038
34918
  {
35039
34919
  path: "dist/domains/team/index.js",
35040
- sha256: "fd47ffaa541b5deede3994d16be4ad6683a2a8b0883d99846475f2e924453797"
34920
+ sha256: "eb3a4b5cff91f8ef1b07b64a934a3b9d9bc025cf2eb476f6aafa92086b9c07b6"
35041
34921
  },
35042
34922
  {
35043
34923
  path: "dist/domains/template/index.js",
35044
- sha256: "30801bdd67e37b105eefd4df3e7c0ece4a7257258e9087bf444a3383e12c93c8"
34924
+ sha256: "92dd83d5adbba8b572b2bcec6090630a34d572b4a1346906dafdc8499d6f7941"
35045
34925
  },
35046
34926
  {
35047
34927
  path: "dist/domains/user/index.js",
35048
- sha256: "b85dc53d942ffc9ed062bf948565c69d4cb046f718bb65118e3e27ce7533217c"
34928
+ sha256: "dc2de36112a32b61f34d631f642a134b317255a5f5a1c1f2da6f3cf6d09e7cf3"
35049
34929
  },
35050
34930
  {
35051
34931
  path: "dist/domains/workflow/index.js",
35052
- sha256: "d5734a2b8f937fca7e0660f8c2942fbcc0e543c105c4be5a16b3f3787e6530af"
34932
+ sha256: "811a3b1df2bfa7a2f76f6fb1c3464de91ed2b7c171788bc82ae4cd991ce4c52a"
35053
34933
  },
35054
34934
  {
35055
34935
  path: "dist/skill.js",
35056
- sha256: "65fe6713e288b6263bc74331969db46c39bd7d798b816266512de456427626a7"
34936
+ sha256: "c7280e3093b0f547c577d54dc1f861cac4ce13ec70afabf7a3d1d55e3dbd6247"
35057
34937
  }
35058
34938
  ],
35059
34939
  credentialSchema: {
@@ -35145,7 +35025,7 @@ var awx_axi_default = {
35145
35025
  }
35146
35026
  }
35147
35027
  },
35148
- skillSha256: "b3e128cd347128b36f949cf5641a4a1e3eeac47866e469d74d467f068cfb99c5",
35028
+ skillSha256: "71f03eed887e2a5189b1b08b692fc5fd7a4acfd274102bd925c27d1dd16177ce",
35149
35029
  adapterBoundary: {
35150
35030
  unsafeOverrides: [
35151
35031
  "config",
@@ -35218,7 +35098,9 @@ var awx_axi_default = {
35218
35098
  template: "value",
35219
35099
  failed: "boolean",
35220
35100
  since: "value",
35221
- limit: "value"
35101
+ limit: "value",
35102
+ all: "boolean",
35103
+ "max-rows": "value"
35222
35104
  },
35223
35105
  positionals: {
35224
35106
  names: [],
@@ -35263,7 +35145,9 @@ var awx_axi_default = {
35263
35145
  failed: "boolean",
35264
35146
  host: "value",
35265
35147
  task: "value",
35266
- limit: "value"
35148
+ limit: "value",
35149
+ all: "boolean",
35150
+ "max-rows": "value"
35267
35151
  },
35268
35152
  positionals: {
35269
35153
  names: [
@@ -35276,7 +35160,10 @@ var awx_axi_default = {
35276
35160
  command: "job hosts",
35277
35161
  effect: "read",
35278
35162
  flags: {
35279
- help: "boolean"
35163
+ help: "boolean",
35164
+ limit: "value",
35165
+ all: "boolean",
35166
+ "max-rows": "value"
35280
35167
  },
35281
35168
  positionals: {
35282
35169
  names: [
@@ -35366,7 +35253,9 @@ var awx_axi_default = {
35366
35253
  effect: "read",
35367
35254
  flags: {
35368
35255
  help: "boolean",
35369
- limit: "value"
35256
+ limit: "value",
35257
+ all: "boolean",
35258
+ "max-rows": "value"
35370
35259
  },
35371
35260
  positionals: {
35372
35261
  names: [
@@ -35593,7 +35482,9 @@ var awx_axi_default = {
35593
35482
  help: "boolean",
35594
35483
  project: "value",
35595
35484
  search: "value",
35596
- limit: "value"
35485
+ limit: "value",
35486
+ all: "boolean",
35487
+ "max-rows": "value"
35597
35488
  },
35598
35489
  positionals: {
35599
35490
  names: [],
@@ -35658,7 +35549,9 @@ var awx_axi_default = {
35658
35549
  effect: "read",
35659
35550
  flags: {
35660
35551
  help: "boolean",
35661
- limit: "value"
35552
+ limit: "value",
35553
+ all: "boolean",
35554
+ "max-rows": "value"
35662
35555
  },
35663
35556
  positionals: {
35664
35557
  names: [
@@ -36019,7 +35912,9 @@ var awx_axi_default = {
36019
35912
  flags: {
36020
35913
  help: "boolean",
36021
35914
  search: "value",
36022
- limit: "value"
35915
+ limit: "value",
35916
+ all: "boolean",
35917
+ "max-rows": "value"
36023
35918
  },
36024
35919
  positionals: {
36025
35920
  names: [],
@@ -36076,7 +35971,10 @@ var awx_axi_default = {
36076
35971
  command: "workflow nodes",
36077
35972
  effect: "read",
36078
35973
  flags: {
36079
- help: "boolean"
35974
+ help: "boolean",
35975
+ limit: "value",
35976
+ all: "boolean",
35977
+ "max-rows": "value"
36080
35978
  },
36081
35979
  positionals: {
36082
35980
  names: [
@@ -36090,7 +35988,9 @@ var awx_axi_default = {
36090
35988
  effect: "read",
36091
35989
  flags: {
36092
35990
  help: "boolean",
36093
- limit: "value"
35991
+ limit: "value",
35992
+ all: "boolean",
35993
+ "max-rows": "value"
36094
35994
  },
36095
35995
  positionals: {
36096
35996
  names: [
@@ -36103,8 +36003,7 @@ var awx_axi_default = {
36103
36003
  command: "workflow template-node",
36104
36004
  effect: "read",
36105
36005
  flags: {
36106
- help: "boolean",
36107
- limit: "value"
36006
+ help: "boolean"
36108
36007
  },
36109
36008
  positionals: {
36110
36009
  names: [
@@ -36430,7 +36329,9 @@ var awx_axi_default = {
36430
36329
  flags: {
36431
36330
  help: "boolean",
36432
36331
  search: "value",
36433
- limit: "value"
36332
+ limit: "value",
36333
+ all: "boolean",
36334
+ "max-rows": "value"
36434
36335
  },
36435
36336
  positionals: {
36436
36337
  names: [],
@@ -36472,7 +36373,9 @@ var awx_axi_default = {
36472
36373
  flags: {
36473
36374
  help: "boolean",
36474
36375
  search: "value",
36475
- limit: "value"
36376
+ limit: "value",
36377
+ all: "boolean",
36378
+ "max-rows": "value"
36476
36379
  },
36477
36380
  positionals: {
36478
36381
  names: [],
@@ -36515,7 +36418,9 @@ var awx_axi_default = {
36515
36418
  search: "value",
36516
36419
  template: "value",
36517
36420
  status: "value",
36518
- limit: "value"
36421
+ limit: "value",
36422
+ all: "boolean",
36423
+ "max-rows": "value"
36519
36424
  },
36520
36425
  positionals: {
36521
36426
  names: [],
@@ -36543,7 +36448,9 @@ var awx_axi_default = {
36543
36448
  failed: "boolean",
36544
36449
  host: "value",
36545
36450
  task: "value",
36546
- limit: "value"
36451
+ limit: "value",
36452
+ all: "boolean",
36453
+ "max-rows": "value"
36547
36454
  },
36548
36455
  positionals: {
36549
36456
  names: [
@@ -36557,7 +36464,9 @@ var awx_axi_default = {
36557
36464
  effect: "read",
36558
36465
  flags: {
36559
36466
  help: "boolean",
36560
- limit: "value"
36467
+ limit: "value",
36468
+ all: "boolean",
36469
+ "max-rows": "value"
36561
36470
  },
36562
36471
  positionals: {
36563
36472
  names: [
@@ -36571,7 +36480,9 @@ var awx_axi_default = {
36571
36480
  effect: "read",
36572
36481
  flags: {
36573
36482
  help: "boolean",
36574
- limit: "value"
36483
+ limit: "value",
36484
+ all: "boolean",
36485
+ "max-rows": "value"
36575
36486
  },
36576
36487
  positionals: {
36577
36488
  names: [
@@ -36658,7 +36569,9 @@ var awx_axi_default = {
36658
36569
  help: "boolean",
36659
36570
  search: "value",
36660
36571
  organization: "value",
36661
- limit: "value"
36572
+ limit: "value",
36573
+ all: "boolean",
36574
+ "max-rows": "value"
36662
36575
  },
36663
36576
  positionals: {
36664
36577
  names: [],
@@ -36684,7 +36597,9 @@ var awx_axi_default = {
36684
36597
  flags: {
36685
36598
  help: "boolean",
36686
36599
  "include-decided": "boolean",
36687
- limit: "value"
36600
+ limit: "value",
36601
+ all: "boolean",
36602
+ "max-rows": "value"
36688
36603
  },
36689
36604
  positionals: {
36690
36605
  names: [],
@@ -36766,7 +36681,9 @@ var awx_axi_default = {
36766
36681
  flags: {
36767
36682
  help: "boolean",
36768
36683
  search: "value",
36769
- limit: "value"
36684
+ limit: "value",
36685
+ all: "boolean",
36686
+ "max-rows": "value"
36770
36687
  },
36771
36688
  positionals: {
36772
36689
  names: [],
@@ -36793,7 +36710,9 @@ var awx_axi_default = {
36793
36710
  help: "boolean",
36794
36711
  host: "value",
36795
36712
  task: "value",
36796
- limit: "value"
36713
+ limit: "value",
36714
+ all: "boolean",
36715
+ "max-rows": "value"
36797
36716
  },
36798
36717
  positionals: {
36799
36718
  names: [
@@ -36932,7 +36851,9 @@ var awx_axi_default = {
36932
36851
  flags: {
36933
36852
  help: "boolean",
36934
36853
  search: "value",
36935
- limit: "value"
36854
+ limit: "value",
36855
+ all: "boolean",
36856
+ "max-rows": "value"
36936
36857
  },
36937
36858
  positionals: {
36938
36859
  names: [],
@@ -36970,7 +36891,9 @@ var awx_axi_default = {
36970
36891
  effect: "read",
36971
36892
  flags: {
36972
36893
  help: "boolean",
36973
- limit: "value"
36894
+ limit: "value",
36895
+ all: "boolean",
36896
+ "max-rows": "value"
36974
36897
  },
36975
36898
  positionals: {
36976
36899
  names: [
@@ -36983,7 +36906,10 @@ var awx_axi_default = {
36983
36906
  command: "project roles",
36984
36907
  effect: "read",
36985
36908
  flags: {
36986
- help: "boolean"
36909
+ help: "boolean",
36910
+ limit: "value",
36911
+ all: "boolean",
36912
+ "max-rows": "value"
36987
36913
  },
36988
36914
  positionals: {
36989
36915
  names: [
@@ -37415,7 +37341,9 @@ var awx_axi_default = {
37415
37341
  flags: {
37416
37342
  help: "boolean",
37417
37343
  search: "value",
37418
- limit: "value"
37344
+ limit: "value",
37345
+ all: "boolean",
37346
+ "max-rows": "value"
37419
37347
  },
37420
37348
  positionals: {
37421
37349
  names: [],
@@ -37441,7 +37369,9 @@ var awx_axi_default = {
37441
37369
  flags: {
37442
37370
  help: "boolean",
37443
37371
  search: "value",
37444
- limit: "value"
37372
+ limit: "value",
37373
+ all: "boolean",
37374
+ "max-rows": "value"
37445
37375
  },
37446
37376
  positionals: {
37447
37377
  names: [
@@ -37457,6 +37387,8 @@ var awx_axi_default = {
37457
37387
  help: "boolean",
37458
37388
  search: "value",
37459
37389
  limit: "value",
37390
+ all: "boolean",
37391
+ "max-rows": "value",
37460
37392
  facts: "boolean"
37461
37393
  },
37462
37394
  positionals: {
@@ -37472,7 +37404,9 @@ var awx_axi_default = {
37472
37404
  flags: {
37473
37405
  help: "boolean",
37474
37406
  search: "value",
37475
- limit: "value"
37407
+ limit: "value",
37408
+ all: "boolean",
37409
+ "max-rows": "value"
37476
37410
  },
37477
37411
  positionals: {
37478
37412
  names: [
@@ -37503,7 +37437,9 @@ var awx_axi_default = {
37503
37437
  flags: {
37504
37438
  help: "boolean",
37505
37439
  search: "value",
37506
- limit: "value"
37440
+ limit: "value",
37441
+ all: "boolean",
37442
+ "max-rows": "value"
37507
37443
  },
37508
37444
  positionals: {
37509
37445
  names: [],
@@ -37531,7 +37467,9 @@ var awx_axi_default = {
37531
37467
  search: "value",
37532
37468
  name: "value",
37533
37469
  inventory: "value",
37534
- limit: "value"
37470
+ limit: "value",
37471
+ all: "boolean",
37472
+ "max-rows": "value"
37535
37473
  },
37536
37474
  positionals: {
37537
37475
  names: [],
@@ -37559,7 +37497,9 @@ var awx_axi_default = {
37559
37497
  search: "value",
37560
37498
  name: "value",
37561
37499
  inventory: "value",
37562
- limit: "value"
37500
+ limit: "value",
37501
+ all: "boolean",
37502
+ "max-rows": "value"
37563
37503
  },
37564
37504
  positionals: {
37565
37505
  names: [],
@@ -37589,7 +37529,9 @@ var awx_axi_default = {
37589
37529
  inventory: "value",
37590
37530
  source: "value",
37591
37531
  status: "value",
37592
- limit: "value"
37532
+ limit: "value",
37533
+ all: "boolean",
37534
+ "max-rows": "value"
37593
37535
  },
37594
37536
  positionals: {
37595
37537
  names: [],
@@ -37781,7 +37723,9 @@ var awx_axi_default = {
37781
37723
  template: "value",
37782
37724
  enabled: "boolean",
37783
37725
  disabled: "boolean",
37784
- limit: "value"
37726
+ limit: "value",
37727
+ all: "boolean",
37728
+ "max-rows": "value"
37785
37729
  },
37786
37730
  positionals: {
37787
37731
  names: [],
@@ -37882,7 +37826,9 @@ var awx_axi_default = {
37882
37826
  search: "value",
37883
37827
  organization: "value",
37884
37828
  type: "value",
37885
- limit: "value"
37829
+ limit: "value",
37830
+ all: "boolean",
37831
+ "max-rows": "value"
37886
37832
  },
37887
37833
  positionals: {
37888
37834
  names: [],
@@ -38000,7 +37946,9 @@ var awx_axi_default = {
38000
37946
  flags: {
38001
37947
  help: "boolean",
38002
37948
  search: "value",
38003
- limit: "value"
37949
+ limit: "value",
37950
+ all: "boolean",
37951
+ "max-rows": "value"
38004
37952
  },
38005
37953
  positionals: {
38006
37954
  names: [],
@@ -38034,7 +37982,9 @@ var awx_axi_default = {
38034
37982
  "inventory-update": "value",
38035
37983
  "ad-hoc": "value",
38036
37984
  "system-job": "value",
38037
- limit: "value"
37985
+ limit: "value",
37986
+ all: "boolean",
37987
+ "max-rows": "value"
38038
37988
  },
38039
37989
  positionals: {
38040
37990
  names: [],
@@ -38152,7 +38102,9 @@ var awx_axi_default = {
38152
38102
  search: "value",
38153
38103
  type: "value",
38154
38104
  organization: "value",
38155
- limit: "value"
38105
+ limit: "value",
38106
+ all: "boolean",
38107
+ "max-rows": "value"
38156
38108
  },
38157
38109
  positionals: {
38158
38110
  names: [],
@@ -38189,7 +38141,9 @@ var awx_axi_default = {
38189
38141
  team: "value",
38190
38142
  user: "value",
38191
38143
  credential: "value",
38192
- limit: "value"
38144
+ limit: "value",
38145
+ all: "boolean",
38146
+ "max-rows": "value"
38193
38147
  },
38194
38148
  positionals: {
38195
38149
  names: [],
@@ -38317,7 +38271,9 @@ var awx_axi_default = {
38317
38271
  help: "boolean",
38318
38272
  search: "value",
38319
38273
  organization: "value",
38320
- limit: "value"
38274
+ limit: "value",
38275
+ all: "boolean",
38276
+ "max-rows": "value"
38321
38277
  },
38322
38278
  positionals: {
38323
38279
  names: [],
@@ -38342,7 +38298,9 @@ var awx_axi_default = {
38342
38298
  effect: "read",
38343
38299
  flags: {
38344
38300
  help: "boolean",
38345
- limit: "value"
38301
+ limit: "value",
38302
+ all: "boolean",
38303
+ "max-rows": "value"
38346
38304
  },
38347
38305
  positionals: {
38348
38306
  names: [
@@ -38356,7 +38314,9 @@ var awx_axi_default = {
38356
38314
  effect: "read",
38357
38315
  flags: {
38358
38316
  help: "boolean",
38359
- limit: "value"
38317
+ limit: "value",
38318
+ all: "boolean",
38319
+ "max-rows": "value"
38360
38320
  },
38361
38321
  positionals: {
38362
38322
  names: [
@@ -38370,7 +38330,9 @@ var awx_axi_default = {
38370
38330
  effect: "read",
38371
38331
  flags: {
38372
38332
  help: "boolean",
38373
- limit: "value"
38333
+ limit: "value",
38334
+ all: "boolean",
38335
+ "max-rows": "value"
38374
38336
  },
38375
38337
  positionals: {
38376
38338
  names: [
@@ -38384,7 +38346,9 @@ var awx_axi_default = {
38384
38346
  effect: "read",
38385
38347
  flags: {
38386
38348
  help: "boolean",
38387
- limit: "value"
38349
+ limit: "value",
38350
+ all: "boolean",
38351
+ "max-rows": "value"
38388
38352
  },
38389
38353
  positionals: {
38390
38354
  names: [
@@ -38398,7 +38362,9 @@ var awx_axi_default = {
38398
38362
  effect: "read",
38399
38363
  flags: {
38400
38364
  help: "boolean",
38401
- limit: "value"
38365
+ limit: "value",
38366
+ all: "boolean",
38367
+ "max-rows": "value"
38402
38368
  },
38403
38369
  positionals: {
38404
38370
  names: [
@@ -38412,7 +38378,9 @@ var awx_axi_default = {
38412
38378
  effect: "read",
38413
38379
  flags: {
38414
38380
  help: "boolean",
38415
- limit: "value"
38381
+ limit: "value",
38382
+ all: "boolean",
38383
+ "max-rows": "value"
38416
38384
  },
38417
38385
  positionals: {
38418
38386
  names: [
@@ -38462,7 +38430,9 @@ var awx_axi_default = {
38462
38430
  help: "boolean",
38463
38431
  search: "value",
38464
38432
  type: "value",
38465
- limit: "value"
38433
+ limit: "value",
38434
+ all: "boolean",
38435
+ "max-rows": "value"
38466
38436
  },
38467
38437
  positionals: {
38468
38438
  names: [],
@@ -38487,7 +38457,9 @@ var awx_axi_default = {
38487
38457
  effect: "read",
38488
38458
  flags: {
38489
38459
  help: "boolean",
38490
- limit: "value"
38460
+ limit: "value",
38461
+ all: "boolean",
38462
+ "max-rows": "value"
38491
38463
  },
38492
38464
  positionals: {
38493
38465
  names: [
@@ -38501,7 +38473,9 @@ var awx_axi_default = {
38501
38473
  effect: "read",
38502
38474
  flags: {
38503
38475
  help: "boolean",
38504
- limit: "value"
38476
+ limit: "value",
38477
+ all: "boolean",
38478
+ "max-rows": "value"
38505
38479
  },
38506
38480
  positionals: {
38507
38481
  names: [
@@ -38515,7 +38489,9 @@ var awx_axi_default = {
38515
38489
  effect: "read",
38516
38490
  flags: {
38517
38491
  help: "boolean",
38518
- limit: "value"
38492
+ limit: "value",
38493
+ all: "boolean",
38494
+ "max-rows": "value"
38519
38495
  },
38520
38496
  positionals: {
38521
38497
  names: [
@@ -38529,7 +38505,9 @@ var awx_axi_default = {
38529
38505
  effect: "read",
38530
38506
  flags: {
38531
38507
  help: "boolean",
38532
- limit: "value"
38508
+ limit: "value",
38509
+ all: "boolean",
38510
+ "max-rows": "value"
38533
38511
  },
38534
38512
  positionals: {
38535
38513
  names: [
@@ -38640,8 +38618,1210 @@ var awx_axi_default = {
38640
38618
  ]
38641
38619
  };
38642
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
+
38643
39823
  // src/shared/tool-manifests.ts
38644
- var toolManifests = { "falcon-axi": falcon_axi_default, "vectra-axi": vectra_axi_default, "az-axi": az_axi_default, "mg-axi": mg_axi_default, "ldap-axi": ldap_axi_default, "ado-axi": ado_axi_default, "awx-axi": awx_axi_default };
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 };
38645
39825
 
38646
39826
  // node_modules/.pnpm/@toon-format+toon@2.3.1/node_modules/@toon-format/toon/dist/index.mjs
38647
39827
  var NULL_LITERAL = "null";
@@ -40009,6 +41189,7 @@ function resolveDecodeOptions(options) {
40009
41189
 
40010
41190
  // src/cli/rewrite.ts
40011
41191
  var managedFlags = {
41192
+ "tenable-axi": tenable_axi_default.adapterBoundary.unsafeOverrides,
40012
41193
  "awx-axi": awx_axi_default.adapterBoundary.unsafeOverrides,
40013
41194
  "falcon-axi": falcon_axi_default.unsafeOverrides,
40014
41195
  "vectra-axi": vectra_axi_default.adapterBoundary.unsafeOverrides,
@@ -40071,6 +41252,13 @@ function rewriteSuggestions(output3, tool, truncated = false) {
40071
41252
  try {
40072
41253
  const json2 = output3.trimStart().startsWith("{");
40073
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
+ }
40074
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) {
40075
41263
  const home = {
40076
41264
  ...parsed.document,
@@ -40166,9 +41354,14 @@ function managedFlagRanges(command, tool) {
40166
41354
  return ranges;
40167
41355
  }
40168
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
+ }
40169
41362
  if (tool === "awx-axi") {
40170
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.";
40171
- help = help.split("\n").filter((line) => !/(?:\bAWX_AXI_[A-Z_]+\b|\bawx-axi (?:auth (?:login|logout)|setup|config|profile|update)\b|--(?:origin|profile|config|verify-ssl|allow-http)\b)/.test(line)).filter((line) => !/^(?:Run|Use) .*\bawx-axi job stdout\b.*--download\b/.test(line)).map((line) => (/^(?:artium-axi )?awx-axi job stdout\b/.test(line) ? line.replace(/ \[--(?:full|ansi)\]| \[--download <path>\]/g, "") : line).replace(/--timeout (?:600|3600)/g, "--timeout 50")).join("\n");
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");
40172
41365
  if (!help.trim()) help = guidance;
40173
41366
  else if (commands2 && !help.includes(guidance)) help = help.trimEnd() + "\n" + guidance + "\n";
40174
41367
  }
@@ -40198,7 +41391,8 @@ function hostedHelp(help, tool, flags, commands2) {
40198
41391
  const filtered = help.replace(
40199
41392
  /^([ \t]*(?:(?:Flags|Globals|Global flags|Selector flags on every command|[Vv]alid flags for `[^`]+`): |(?=--)))([^\r\n]*)(\r?\n|$)/gm,
40200
41393
  (_, label, listed, ending) => {
40201
- 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(", ");
40202
41396
  if (!retained && !label.trim()) return "";
40203
41397
  return label + retained + (listed.endsWith(".") && !retained.endsWith(".") ? "." : "") + ending;
40204
41398
  }
@@ -40321,9 +41515,16 @@ function identityView(user, server) {
40321
41515
  return `user: ${JSON.stringify(user.username)}
40322
41516
  server: ${JSON.stringify(server)}
40323
41517
  roles[${user.roles.length}]: ${user.roles.map((role) => JSON.stringify(role)).join(",")}
40324
- 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.
40325
41521
  `;
40326
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
+ }
40327
41528
  function toolsView(tools) {
40328
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";
40329
41530
  return `tools[${tools.length}]{name,status,version,readOnly}:
@@ -40348,11 +41549,268 @@ upstreamHelp: ${JSON.stringify(help)}
40348
41549
  `;
40349
41550
  }
40350
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
+
40351
41809
  // src/cli/setup.ts
40352
41810
  import { createHash, randomUUID as randomUUID2 } from "node:crypto";
40353
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";
40354
41812
  import { homedir as homedir2 } from "node:os";
40355
- 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";
40356
41814
 
40357
41815
  // skill/artium-axi/SKILL.md
40358
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";
@@ -40451,7 +41909,7 @@ async function setup(args) {
40451
41909
  if (hook && host !== "claude") {
40452
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.`);
40453
41911
  }
40454
- const executable = resolve(process.argv[1]);
41912
+ const executable = resolve2(process.argv[1]);
40455
41913
  const invocation = process.platform === "win32" ? `& '${process.execPath.replaceAll("'", "''")}' '${executable.replaceAll("'", "''")}'` : `${quote(process.execPath)} ${quote(executable)}`;
40456
41914
  const executableBlock = `<!-- artium-axi executable -->
40457
41915
 
@@ -40461,7 +41919,7 @@ ${invocation}
40461
41919
 
40462
41920
  <!-- /artium-axi executable -->`;
40463
41921
  const content = SKILL_default.replace(/<!-- artium-axi executable -->[\s\S]*?<!-- \/artium-axi executable -->/, () => executableBlock);
40464
- const hostDirectory = host === "claude" && process.env.CLAUDE_CONFIG_DIR ? resolve(process.env.CLAUDE_CONFIG_DIR) : host === "pi" && process.env.PI_CODING_AGENT_DIR ? resolve(process.env.PI_CODING_AGENT_DIR.replace(/^~(?=\/|$)/, () => homedir2())) : join2(homedir2(), ...hosts[host]);
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]);
40465
41923
  const client = new Client();
40466
41924
  const response = skillsResponseSchema.safeParse(await client.authenticated("/v1/skills", "GET"));
40467
41925
  if (!response.success) throw new ArtiumError("INVALID_RESPONSE");
@@ -40580,6 +42038,7 @@ expires: ${new Date(device.expiresAt).toISOString()}
40580
42038
  if (managed2) await managed2.emit(client.serverUrl, session);
40581
42039
  else await client.sessions.locked(async () => {
40582
42040
  client.sessions.write(session);
42041
+ client.sessions.writeClientConfig(client.caFile);
40583
42042
  });
40584
42043
  const message = `status: authenticated
40585
42044
  session-ends: ${new Date(session.familyExpiresAt).toISOString()}
@@ -40734,9 +42193,9 @@ var ManagedSession = class _ManagedSession {
40734
42193
  if (session.status === "authenticated") this.protect(session.accessToken, session.refreshToken);
40735
42194
  else this.protect(session.passwordChangeToken);
40736
42195
  try {
40737
- await new Promise((resolve3, reject) => {
42196
+ await new Promise((resolve4, reject) => {
40738
42197
  this.channel.write(`${JSON.stringify({ serverUrl, ...session })}
40739
- `, (error62) => error62 ? reject(error62) : resolve3());
42198
+ `, (error62) => error62 ? reject(error62) : resolve4());
40740
42199
  });
40741
42200
  } catch {
40742
42201
  throw new ArtiumError(
@@ -40760,9 +42219,45 @@ var ManagedSession = class _ManagedSession {
40760
42219
  }
40761
42220
  };
40762
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
+
40763
42252
  // src/cli/main.ts
40764
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
+ }
40765
42259
  function output2(stream, text2) {
42260
+ if (process[stream].destroyed) return;
40766
42261
  if (managed) managed.write(stream, text2);
40767
42262
  else process[stream].write(text2);
40768
42263
  }
@@ -40790,7 +42285,7 @@ async function main(args) {
40790
42285
  return;
40791
42286
  }
40792
42287
  if (managedMode) {
40793
- if (["passwd", "logout", "setup"].includes(args[0])) {
42288
+ if (["passwd", "logout", "setup", "update"].includes(args[0])) {
40794
42289
  throw new ArtiumError(
40795
42290
  "INVALID_INPUT",
40796
42291
  "This command is unavailable in managed session mode.",
@@ -40799,6 +42294,10 @@ async function main(args) {
40799
42294
  }
40800
42295
  managed = await ManagedSession.read(args[0] === "login");
40801
42296
  }
42297
+ if (command === "update") {
42298
+ output2("stdout", await update());
42299
+ return;
42300
+ }
40802
42301
  if (command === "setup") {
40803
42302
  output2("stdout", await setup(args.slice(1)));
40804
42303
  return;
@@ -40853,7 +42352,10 @@ async function main(args) {
40853
42352
  const parsed = loginResponseSchema.safeParse(await client2.request("/v1/auth/login", "POST", { username, password }));
40854
42353
  if (!parsed.success) throw new ArtiumError("INVALID_RESPONSE");
40855
42354
  if (managed) await managed.emit(client2.serverUrl, parsed.data);
40856
- else client2.sessions.write(parsed.data);
42355
+ else {
42356
+ client2.sessions.write(parsed.data);
42357
+ client2.sessions.writeClientConfig(client2.caFile);
42358
+ }
40857
42359
  return parsed.data;
40858
42360
  };
40859
42361
  const session = await (managed ? signIn() : client2.sessions.locked(signIn));
@@ -40915,7 +42417,7 @@ remoteRevocation: ${verified ? "verified" : "unverified"}
40915
42417
  if (home) {
40916
42418
  const tools = toolsResponseSchema.safeParse(await client.authenticated("/v1/tools", "GET", void 0, homeSession));
40917
42419
  if (!tools.success) throw new ArtiumError("INVALID_RESPONSE");
40918
- const executable = resolve2(process.argv[1]);
42420
+ const executable = resolve3(process.argv[1]);
40919
42421
  const local = relative(homedir3(), executable);
40920
42422
  const bin = local && !isAbsolute(local) && !local.startsWith(`..${sep}`) && local !== ".." ? `~${sep}${local}` : executable;
40921
42423
  view = `bin: ${JSON.stringify(bin)}
@@ -40949,11 +42451,11 @@ ${Object.entries(response.error).map(([key, value]) => ` ${key}: ${JSON.stringi
40949
42451
  `);
40950
42452
  process.exitCode = errors[response.error.code].exitCode;
40951
42453
  }
40952
- 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(() => {
40953
42455
  try {
40954
42456
  managed?.flush();
40955
42457
  } catch {
40956
42458
  managed = void 0;
40957
- printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID3()));
42459
+ printError(errorResponse(new ArtiumError("SECRET_IN_OUTPUT"), randomUUID4()));
40958
42460
  }
40959
42461
  });