@knowttl/artium-axi 0.0.19 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -169,10 +169,20 @@ Administrators can opt in to the single read-only `security hunting query` comma
169
169
  Hunting accepts exactly one UTF-8 plain-text upload named `query.kql`, at most 64 KiB, through `artium-axi mg-axi security hunting query --file query.kql`.
170
170
  See [client input handling](docs/client-reference.md#command-surface-and-subcommands) for local file paths and upload restrictions.
171
171
  Queries must use the upstream restricted read-only KQL subset.
172
+ Hunting parses KQL before the read-only allowlist and upstream authentication; syntax errors return positioned diagnostics without query excerpts or quoted literals.
173
+ Parsing does not check tables, columns, types or permissions; recognized Graph 400 errors expose only the error class and line/column, while unknown error shapes remain opaque.
172
174
  The existing mg-axi role grant is required; other security commands remain unavailable.
173
175
  See [Graph credential setup](docs/tool-credentials.md#microsoft-graph) for hunting permissions and consent; tenant acceptance remains unverified.
174
176
 
177
+ Azure Resource Graph and Log Analytics queries parse KQL before upstream authentication or requests, returning positioned syntax diagnostics and query excerpts on failure.
178
+ Successful parsing does not validate tables, columns, functions, permissions or service-specific restrictions.
179
+
175
180
  Falcon investigation reads include detection lineage, process details and trees, existing sandbox reports, FileVantage changes and device-control policy details.
181
+ NG-SIEM `search start` checks CQL structure before upstream authentication, reporting code, line, column and token class without echoing query text; function names, fields and semantics remain unchecked, and ambiguous syntax passes.
182
+ Rejected searches preserve redacted server diagnostics, completed searches include server warnings when present, and `search start --wait` advises when the normalized filter differs.
183
+
184
+ Vectra `host show` and `entity show --type host`, plus the matching raw host reads, retain every returned API field under `host`, separate from CLI metadata.
185
+ Use `--full` on host/entity detail commands for complete returned text; secret redaction still applies, and upstream omissions cannot be restored.
176
186
 
177
187
  Vectra supports selected QUX/RUX writes for detection close/open and mark-fixed, host/account close, key assets, tags, notes (including bulk notes), assignments and outcomes, triage labels and rules, groups and membership, proxies, threat feeds, internal-network settings, syslog/Kafka, notification destinations and Match, subject to deployment support in the [reviewed inventory](tools/inventories/vectra-axi.json).
178
188
  User, role, API-client and credential administration remains blocked.
@@ -20748,7 +20748,7 @@ import { resolve } from "node:path";
20748
20748
  // package.json
20749
20749
  var package_default = {
20750
20750
  name: "artium-axi",
20751
- version: "0.0.19",
20751
+ version: "0.0.20",
20752
20752
  private: true,
20753
20753
  license: "MIT",
20754
20754
  type: "module",
@@ -21236,17 +21236,18 @@ var falcon_axi_default = {
21236
21236
  generatedBy: "scripts/falcon-inventory.mjs",
21237
21237
  tool: "falcon-axi",
21238
21238
  repository: "https://github.com/knowttl/falcon-axi.git",
21239
- tag: "v0.7.4",
21240
- commit: "bca4a08c71beb415e3fabb37443aea8ad61bc08c",
21241
- version: "0.7.4",
21239
+ tag: "v0.8.0",
21240
+ commit: "4ba25f373a5c4df46506bdd0d306fa3ef205d965",
21241
+ version: "0.8.0",
21242
21242
  distribution: {
21243
- filename: "falcon_axi-0.7.4-py3-none-any.whl",
21244
- sha256: "bce4cfb033fd6537eb8a518fe3286799884f6b7a5ef95faffc347ac6c336d28e",
21245
- provenance: "https://pypi.org/integrity/falcon-axi/0.7.4/falcon_axi-0.7.4-py3-none-any.whl/provenance"
21243
+ filename: "falcon_axi-0.8.0-py3-none-any.whl",
21244
+ sha256: "8aad289fd58847cb6555f46b8e930c5904d6afda34a7b2e6965cdd60c8df06a4",
21245
+ provenance: "https://pypi.org/integrity/falcon-axi/0.8.0/falcon_axi-0.8.0-py3-none-any.whl/provenance"
21246
21246
  },
21247
+ skillSha256: "5d5fd1cd57ff1da68e37448c93fce57236f76448ec9a10984c01ea7300c6a8e0",
21247
21248
  parser: {
21248
21249
  path: "falcon_axi/cli.py",
21249
- sha256: "ef29404b26da085b96ace7ba1f708e928eb40c7aa99e071807d5003a3421b0cd",
21250
+ sha256: "9b3d42e3c00b3d302948e8937c6295bbdde9cb80384ebef253f9b8a077454909",
21250
21251
  aliases: {},
21251
21252
  shortFlags: {},
21252
21253
  repeats: "last value wins",
@@ -22972,10 +22973,11 @@ var falcon_axi_default = {
22972
22973
  var vectra_axi_default = {
22973
22974
  generatedBy: "scripts/upstream-inventory.mjs",
22974
22975
  tool: "vectra-axi",
22975
- version: "0.1.9",
22976
- integrity: "sha512-GUl24JV8lErGjZliTHcb6BcjjdpJhrzbbB8cBekKE6dM3b5ph9i9EteJHFRWUuGpnEPlVEPeu7X3l33V9DGKwQ==",
22976
+ version: "0.1.10",
22977
+ integrity: "sha512-X7yttDlwpQJW/j0eNox5vLf7nWlFejXjtaq90N7ezJ+ACNqEFspODrwQ/mYqbXFnqjpIugQnhSGcnaI8YNMeLw==",
22977
22978
  parserEvidence: "Installed pinned catalogue exports, provisional until adapter acceptance",
22978
- packageManifestSha256: "e7fe728c58d41a9ddd554b15c29de281dd06c2d7e6a6b044e43d75fb001aa53d",
22979
+ packageManifestSha256: "3f4d4e3ec1b37690087e3c8850ffd5390574e6686cafbd723fb01f83b775ea97",
22980
+ skillSha256: "58978bfd2468e9fac8d17644df1de46768572b1cd9a719a9eec64cdcb547ff9c",
22979
22981
  environment: [
22980
22982
  {
22981
22983
  name: "VECTRA_AXI_CONFIG",
@@ -23275,7 +23277,7 @@ var vectra_axi_default = {
23275
23277
  },
23276
23278
  source: {
23277
23279
  path: "dist/src/catalogue.js",
23278
- sha256: "e49354f34c86cd986d9cc166fc33f3c0423ab8eaa8044621131351c8f297e834"
23280
+ sha256: "02e2443a4b6d6aef9faae51e0c4418c0c565ac5b0f73969a34a4c33a110bfabf"
23279
23281
  }
23280
23282
  },
23281
23283
  flags: [
@@ -23755,7 +23757,8 @@ var vectra_axi_default = {
23755
23757
  help: "boolean",
23756
23758
  profile: "value",
23757
23759
  config: "value",
23758
- id: "value"
23760
+ id: "value",
23761
+ full: "boolean"
23759
23762
  }
23760
23763
  },
23761
23764
  {
@@ -23807,7 +23810,8 @@ var vectra_axi_default = {
23807
23810
  profile: "value",
23808
23811
  config: "value",
23809
23812
  type: "value",
23810
- id: "value"
23813
+ id: "value",
23814
+ full: "boolean"
23811
23815
  }
23812
23816
  },
23813
23817
  {
@@ -25027,10 +25031,11 @@ var vectra_axi_default = {
25027
25031
  var az_axi_default = {
25028
25032
  generatedBy: "scripts/upstream-inventory.mjs",
25029
25033
  tool: "az-axi",
25030
- version: "0.1.12",
25031
- integrity: "sha512-xPhoFLQ8XWjWqLR2e80apWA1pkCqQcFZ5r5V7XW+uj0zXKaO9RHfjG7gsxkrMa44jWqWLiU8ssZxWZPl6uj8KQ==",
25034
+ version: "0.1.13",
25035
+ integrity: "sha512-qltNokGPKFvUxFxNVf25gV2jtgw9MpxT5k6Zlbhz0b/Y5pvbc04SpORpUurDZNXE7runLZZhoBmm38qXcA3M7Q==",
25032
25036
  parserEvidence: "Installed pinned catalogue exports, provisional until adapter acceptance",
25033
- packageManifestSha256: "2d829dc31fd552a154b439ad40c39ff8fd53b35527d8134a0dd18f4ffab09334",
25037
+ packageManifestSha256: "dc09976ff76cdda672ba89f0a7689c39873a86a19213d46687c2a9af861d3ed2",
25038
+ skillSha256: "8a5bc0e8866ca55add8399376784a19e81671e6d036d10815e55b3c473540080",
25034
25039
  environment: [
25035
25040
  {
25036
25041
  name: "AZ_AXI_CONFIG",
@@ -25289,11 +25294,11 @@ var az_axi_default = {
25289
25294
  tokenResourceSources: [
25290
25295
  {
25291
25296
  path: "dist/lib/registry.js",
25292
- sha256: "67a29a57b906ee0a17dc0bf917123308ee2d160ef43106f5d15bf73f8cb874d3"
25297
+ sha256: "dc1eb46c43aa5232b58acfb1d174fe2728491a3a6da28fa3cca27fed79494efd"
25293
25298
  },
25294
25299
  {
25295
25300
  path: "dist/lib/client.js",
25296
- sha256: "322f09655f302f8f4292cbb6317ad192854ed412376ce9041126b25e24ed27ed"
25301
+ sha256: "156af240155e71c051a6a2f0c4235d51acaf3633d7a249736ff3b24ed541d2b6"
25297
25302
  },
25298
25303
  {
25299
25304
  path: "dist/lib/principals.js",
@@ -25317,7 +25322,7 @@ var az_axi_default = {
25317
25322
  },
25318
25323
  {
25319
25324
  path: "dist/commands/logs.js",
25320
- sha256: "f3c0112c4be7a8996163d323bd9945950ab1a212eae2cc42af044388adc77199"
25325
+ sha256: "1cfd781bd88e13ba1c70537263220c6bdd6932586e53edd6fc22fc75202bd938"
25321
25326
  },
25322
25327
  {
25323
25328
  path: "dist/commands/doctor.js",
@@ -29745,10 +29750,11 @@ var az_axi_default = {
29745
29750
  var mg_axi_default = {
29746
29751
  generatedBy: "scripts/upstream-inventory.mjs",
29747
29752
  tool: "mg-axi",
29748
- version: "0.1.12",
29749
- integrity: "sha512-TBt2y2rpfn8oi4YOq95uIo43RTsV/iOc0xFa3e3YCjhqd/ZL/y2is+7W0+B5/g1sdwb95yJbcU1eqeJEzmKJ5g==",
29753
+ version: "0.1.13",
29754
+ integrity: "sha512-V9f/H1xISbn1ar3ARVnYvtT4NDUDRgvhCkrnQd6lqNdj1MeQjF4JESS6PA6hY3epXKrqE+g/2nCfgJV1JDmDTQ==",
29750
29755
  parserEvidence: "Installed pinned catalogue exports",
29751
- packageManifestSha256: "e686938dd356bffe87d9884d656a139b91e7eb6d62370f6aba3b5fd14283fb45",
29756
+ packageManifestSha256: "2357d6568740146d05a0ad67fb8e0be3c871261726d3cf110fed83e216001dc9",
29757
+ skillSha256: "98ff12e741b04592afae76853a00f572940dee6edf0e868d2ccba04a742b24ad",
29752
29758
  environment: [
29753
29759
  {
29754
29760
  name: "MG_AXI_CONFIG"
@@ -29910,7 +29916,7 @@ var mg_axi_default = {
29910
29916
  },
29911
29917
  {
29912
29918
  path: "dist/cli.js",
29913
- sha256: "613fc3ac4870e5538d2c53b0760244c7e3bb3837fa3d97c1b89b7916c557af44"
29919
+ sha256: "723f00e5031068211b541ee43447fb559833bea924c91131e0d074349d5b9a4e"
29914
29920
  },
29915
29921
  {
29916
29922
  path: "dist/profiles.js",
@@ -29988,7 +29994,7 @@ var mg_axi_default = {
29988
29994
  },
29989
29995
  {
29990
29996
  path: "dist/cli.js",
29991
- sha256: "613fc3ac4870e5538d2c53b0760244c7e3bb3837fa3d97c1b89b7916c557af44"
29997
+ sha256: "723f00e5031068211b541ee43447fb559833bea924c91131e0d074349d5b9a4e"
29992
29998
  }
29993
29999
  ]
29994
30000
  },
@@ -44081,19 +44087,19 @@ var commands = {
44081
44087
  "tenable-axi": {
44082
44088
  usage: "artium-axi tenable-axi [<args>]",
44083
44089
  purpose: "Investigate Tenable One with managed API keys.",
44084
- flags: ["Writes and export jobs are off by default and require administrator-enabled operations, preview, --execute and exact --confirm. Downloads are blocked."],
44090
+ flags: ["Writes and export jobs are off by default and require administrator-enabled operations, preview, --execute and exact --confirm. Downloads are blocked.", "Declared file flags accept - to read stdin to EOF within 5 s; otherwise INVALID_INPUT. Close stdin or pass a local file path."],
44085
44091
  example: "artium-axi tenable-axi card list --limit 1"
44086
44092
  },
44087
44093
  "hybrid-axi": {
44088
44094
  usage: "artium-axi hybrid-axi [<args>]",
44089
44095
  purpose: "Investigate Hybrid Analysis with a managed API key.",
44090
- flags: ["Submissions, YARA mutations, consuming matches and four reviewed archive downloads are off by default and selected independently by an administrator. Native preview, --execute and exact --confirm remain required. Use artium-axi download --help for authenticated CLI verified saving.", transferWarning],
44096
+ flags: ["Submissions, YARA mutations, consuming matches and four reviewed archive downloads are off by default and selected independently by an administrator. Native preview, --execute and exact --confirm remain required. Use artium-axi download --help for authenticated CLI verified saving.", "--body-file - reads stdin to EOF within 5 s; otherwise INVALID_INPUT. Close stdin or pass a local file path.", transferWarning],
44091
44097
  example: "artium-axi hybrid-axi quota"
44092
44098
  },
44093
44099
  "az-axi": {
44094
44100
  usage: "artium-axi az-axi [<args>]",
44095
44101
  purpose: "Run Azure commands with your managed identity.",
44096
- flags: ["Arguments after az-axi are forwarded upstream, including --help."],
44102
+ flags: ["Arguments after az-axi are forwarded upstream, including --help.", "Query commands read non-terminal stdin to EOF only without a file, positional query or query flag. api reads stdin only without --body, --body-file or --data; method/path are not body sources. The pinned upstream accepts --body, not --data.", "Tool stdin must reach EOF within 5 s; otherwise INVALID_INPUT. Close stdin or pass --file for queries, --body or --body-file for api."],
44097
44103
  example: "artium-axi az-axi sub list"
44098
44104
  },
44099
44105
  "mg-axi": {
@@ -44380,9 +44386,12 @@ ${executableBlock}
44380
44386
  // src/cli/input.ts
44381
44387
  import { createReadStream } from "node:fs";
44382
44388
  import { basename } from "node:path";
44383
- async function readBounded(stream, limit) {
44389
+ async function readBounded(stream, limit, stdinAlternative) {
44384
44390
  const chunks = [];
44385
44391
  let bytes = 0;
44392
+ const deadline = stdinAlternative === void 0 ? void 0 : setTimeout(() => {
44393
+ stream.destroy(new ArtiumError("INVALID_INPUT", `no stdin EOF after 5 s; close stdin or pass ${stdinAlternative}`));
44394
+ }, 5e3);
44386
44395
  try {
44387
44396
  for await (const chunk of stream) {
44388
44397
  const buffer = Buffer.from(chunk);
@@ -44393,6 +44402,8 @@ async function readBounded(stream, limit) {
44393
44402
  } catch (error62) {
44394
44403
  if (error62 instanceof ArtiumError) throw error62;
44395
44404
  throw new ArtiumError("INVALID_INPUT", "Tool input could not be read.", "Check the local input file or stdin.");
44405
+ } finally {
44406
+ clearTimeout(deadline);
44396
44407
  }
44397
44408
  return Buffer.concat(chunks);
44398
44409
  }
@@ -44411,7 +44422,7 @@ async function toolInput(tool, original) {
44411
44422
  const equals = args[index].indexOf("=");
44412
44423
  const path = equals < 0 ? args[++index] : args[index].slice(equals + 1);
44413
44424
  if (path === "-" && (tool === "tenable-axi" || tool === "hybrid-axi" && flag === "--body-file")) {
44414
- input2.stdin = (await readBounded(process.stdin, inputLimits.stdinBytes)).toString("utf8");
44425
+ input2.stdin = (await readBounded(process.stdin, inputLimits.stdinBytes, flag)).toString("utf8");
44415
44426
  continue;
44416
44427
  }
44417
44428
  if (!path || path === "-") throw new ArtiumError("UNSUPPORTED_INPUT", "A file flag requires a local file path.");
@@ -44436,20 +44447,22 @@ async function toolInput(tool, original) {
44436
44447
  }
44437
44448
  const route = az_axi_default.commands.find((route2) => ["rg query", "logs query", "api"].includes(route2.handlerCommand) && route2.command.split(" ").every((word, index) => args[leading + index] === word));
44438
44449
  let positional = false;
44450
+ let explicitInput = false;
44439
44451
  if (route) {
44440
44452
  for (let index = leading + route.command.split(" ").length; index < args.length; index++) {
44441
44453
  const token = args[index];
44442
44454
  if (token === "--") {
44443
- positional = index + 1 < args.length;
44455
+ positional ||= index + 1 < args.length;
44444
44456
  break;
44445
44457
  }
44446
44458
  if (!token.startsWith("-") || token === "-") {
44447
44459
  positional = true;
44448
- break;
44460
+ continue;
44449
44461
  }
44450
44462
  const raw = token.slice(token.startsWith("--") ? 2 : 1).split("=")[0];
44451
44463
  const expanded = token.startsWith("--") ? raw : route.shortFlags[raw] ?? raw;
44452
44464
  const name = route.flagAliases[expanded] ?? expanded;
44465
+ if ((route.handlerCommand === "api" ? ["body", "body-file", "data"] : ["graph-query", "analytics-query"]).includes(name)) explicitInput = true;
44453
44466
  const kind = route.flags[name];
44454
44467
  if (token.includes("=") || !kind) continue;
44455
44468
  if (kind === "boolean") {
@@ -44462,8 +44475,8 @@ async function toolInput(tool, original) {
44462
44475
  }
44463
44476
  }
44464
44477
  }
44465
- if (tool === "az-axi" && route && !input2.files?.length && !positional && !process.stdin.isTTY) {
44466
- const stdin = await readBounded(process.stdin, inputLimits.stdinBytes);
44478
+ if (tool === "az-axi" && route && !input2.files?.length && !explicitInput && (route.handlerCommand === "api" || !positional) && !process.stdin.isTTY) {
44479
+ const stdin = await readBounded(process.stdin, inputLimits.stdinBytes, route.handlerCommand === "api" ? "--data (supported body flag: --body)" : "--file");
44467
44480
  if (stdin.length) input2.stdin = stdin.toString("utf8");
44468
44481
  }
44469
44482
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knowttl/artium-axi",
3
- "version": "0.0.19",
3
+ "version": "0.0.20",
4
4
  "description": "Client CLI and embedded skill for the Artium managed tools server.",
5
5
  "license": "MIT",
6
6
  "type": "module",