@chainpatrol/cli 0.21.0 → 0.23.0

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 (39) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/{breakdown-3LJBT3JQ.js → breakdown-XA6UUD3T.js} +1 -1
  3. package/dist/{check-G64UQCEL.js → check-NQZPNAUF.js} +1 -1
  4. package/dist/{chunk-2JZAPTY6.js → chunk-DVNTYW7L.js} +1 -1
  5. package/dist/{chunk-O7TMOF4W.js → chunk-GOQL7UCG.js} +3 -0
  6. package/dist/{chunk-4N2YKTJ5.js → chunk-LKITFBIG.js} +81 -6
  7. package/dist/cli.js +91 -43
  8. package/dist/{configs-update-MVX7Q5NW.js → configs-update-VDZVBTIF.js} +1 -1
  9. package/dist/{create-ANCO4FXB.js → create-DGCWT2YJ.js} +1 -1
  10. package/dist/{drift-SHPMEJDU.js → drift-YZHCIQ5O.js} +1 -1
  11. package/dist/{found-OPL4HWOW.js → found-6JAOLM6M.js} +1 -1
  12. package/dist/{get-XN752KSL.js → get-RC75EJFC.js} +25 -3
  13. package/dist/{healthcheck-QNLFKAXM.js → healthcheck-7YWSOY6Y.js} +1 -1
  14. package/dist/{list-X4Z3CPO7.js → list-4HX2R7HU.js} +1 -1
  15. package/dist/{list-XSIXAHOG.js → list-4KIZLIVN.js} +1 -1
  16. package/dist/{list-AQ7E23T3.js → list-EJDWUF6W.js} +1 -1
  17. package/dist/{list-WPPNX7G3.js → list-H7NVUX42.js} +1 -1
  18. package/dist/{list-FJBWSGTD.js → list-IDR7WH5J.js} +2 -2
  19. package/dist/{list-SWHKM5R6.js → list-Q3MMBL4Y.js} +1 -1
  20. package/dist/{list-MHICJ2TK.js → list-SRVNEUHC.js} +57 -5
  21. package/dist/{list-FVFF4VW3.js → list-UDT5MDQZ.js} +1 -1
  22. package/dist/{list-QHEFB4KE.js → list-WQFDRXHD.js} +1 -1
  23. package/dist/{list-Q5PRMAN5.js → list-YNQ6VSYV.js} +1 -1
  24. package/dist/{list-4VKMEKZS.js → list-ZARZ72DG.js} +1 -1
  25. package/dist/{list-FWXQUOCP.js → list-ZBC53OYA.js} +1 -1
  26. package/dist/{list-json-B5L5PXKH.js → list-json-7FDHNRYP.js} +1 -1
  27. package/dist/{organization-SOMHMGTM.js → organization-NEZA6JX2.js} +1 -1
  28. package/dist/{run-J5TQ2YC2.js → run-5QV3YD7V.js} +1 -1
  29. package/dist/{run-RV6P2OCD.js → run-CCVJIK7L.js} +1 -1
  30. package/dist/{run-YAAMSWKK.js → run-JLTNFOJK.js} +2 -2
  31. package/dist/{search-FQUR75WR.js → search-JXJLBV43.js} +1 -1
  32. package/dist/search-ZXTJPVM6.js +221 -0
  33. package/dist/{setup-skill-UEOROLCF.js → setup-skill-V3HDWN7T.js} +1 -1
  34. package/dist/{snapshot-2GDJMN3L.js → snapshot-NYOLPGRW.js} +1 -1
  35. package/dist/{summary-LF53KXRR.js → summary-FE6ROSOO.js} +1 -1
  36. package/dist/{types-PTMFLYUV.js → types-M6QMFNUS.js} +2 -1
  37. package/dist/{validate-UYKOMUEI.js → validate-RPQEEQ36.js} +1 -1
  38. package/dist/{whoami-OYOG63BX.js → whoami-ZIWZCBGI.js} +1 -1
  39. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @chainpatrol/cli
2
2
 
3
+ ## 0.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 689e094: Adds `chainpatrol asset search` command for looking up assets by content or by numeric ID. Supports bulk ID lookup via repeated `--id` flags in a single API call. Server-side work in @chainpatrol/external-trpc adds `assetIds` array support to the `/asset/search` endpoint.
8
+
9
+ ## 0.22.0
10
+
11
+ ### Minor Changes
12
+
13
+ - e2b28a5: Expose `contactUrl` (main communication channel) on `orgs list` and `orgs get` output. Add `organization.missing-contact-url` healthcheck. Server-side work in @chainpatrol/external-trpc and @chainpatrol/validation supports the new field and healthcheck; both are private packages and don't need version bumps.
14
+ - b1e35f0: Surface pending Wallet Blocking / Takedown approvals on `orgs list` and `orgs get`. Each org now reports `pendingServiceApprovals` — open requests by lower-level members to enable an approval-gated service (Wallet Blocking / Takedowns) that a higher-up at the org has not yet approved. Adds `--pending-approval-active`, `--pending-approval-inactive`, and `--pending-approval-service <protection|takedowns>` filters to `orgs list` so you can track which organizations are awaiting sign-off, distinct from which have the service turned off. Server-side work in @chainpatrol/external-trpc and @chainpatrol/validation backs the new field and filters; both are private packages and don't need version bumps.
15
+
3
16
  ## 0.21.0
4
17
 
5
18
  ### Minor Changes
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VFT3TD3E.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-O7TMOF4W.js";
10
+ } from "./chunk-GOQL7UCG.js";
11
11
  import "./chunk-EGWK6SRQ.js";
12
12
  import "./chunk-TFCNKBRC.js";
13
13
  import "./chunk-U73SABXK.js";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-O7TMOF4W.js";
11
+ } from "./chunk-GOQL7UCG.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-O7TMOF4W.js";
11
+ } from "./chunk-GOQL7UCG.js";
12
12
  import {
13
13
  DateTime
14
14
  } from "./chunk-TFCNKBRC.js";
@@ -184,6 +184,9 @@ function createApiClient(options) {
184
184
  assetCheck(input) {
185
185
  return request("/asset/check", input);
186
186
  },
187
+ assetSearch(input) {
188
+ return request("/asset/search", input);
189
+ },
187
190
  listDetectionConfigs(slug) {
188
191
  return request("/detection/configs/list", { slug });
189
192
  },
@@ -205,6 +205,12 @@ description: |
205
205
  "orgs that require admin approval", "orgs requiring approval",
206
206
  "which orgs require approval for twitter", "approval scope",
207
207
  "admin approval asset types", "approval per asset type",
208
+ "pending approval", "pending approvals", "pending service approval",
209
+ "orgs with pending approval", "pending wallet blocking approval",
210
+ "pending takedown approval", "awaiting approval", "waiting for approval",
211
+ "is protection active approval", "wallet blocking approval",
212
+ "who needs to approve wallet blocking", "service change request",
213
+ "track orgs with pending approval", "orgs awaiting sign-off",
208
214
  "is this URL blocked", "is this domain blocked", "is this address blocked",
209
215
  "check this asset", "asset check", "lookup asset status",
210
216
  "what is ARCHIVE_ORG", "what does PAGE mean", "list asset types",
@@ -735,10 +741,48 @@ So per-org JSON looks like:
735
741
  "detection": { "active": true },
736
742
  "darkWebMonitoring": { "active": false }
737
743
  },
738
- "obligatoryAdminApproval": { "active": true, "assetTypes": ["TWITTER"] }
744
+ "obligatoryAdminApproval": { "active": true, "assetTypes": ["TWITTER"] },
745
+ "pendingServiceApprovals": [
746
+ {
747
+ "service": "protection",
748
+ "automated": false,
749
+ "serviceType": "isProtectionActive",
750
+ "serviceName": "Wallet Blocking",
751
+ "requestedAt": "2026-05-30T18:04:11.000Z"
752
+ }
753
+ ]
739
754
  }
740
755
  \`\`\`
741
756
 
757
+ #### Pending service approvals (Wallet Blocking / Takedowns)
758
+
759
+ Turning on **Wallet Blocking** (\`protection\`, the "is protection active"
760
+ toggle) or **Takedowns** is approval-gated: when a lower-level org member
761
+ tries to enable one, ChainPatrol records a pending request that a higher-up
762
+ at the org \u2014 an org OWNER, or ChainPatrol staff acting as owner \u2014 must
763
+ approve before the service actually turns on. \`pendingServiceApprovals\`
764
+ lists those open, awaiting-sign-off requests per org.
765
+
766
+ This is the answer to "which organizations have a pending approval for
767
+ Wallet blocking or Takedown services?" \u2014 it is NOT the same as "which orgs
768
+ have Wallet Blocking turned off". An org can have \`protection.active=false\`
769
+ with **no** pending approval (nobody has asked) OR **with** a pending
770
+ approval (someone asked and it's waiting on an owner). Only
771
+ \`pendingServiceApprovals\` distinguishes the two.
772
+
773
+ Each entry:
774
+
775
+ - \`service\` \u2014 \`protection\` (Wallet Blocking) or \`takedowns\`, matching the
776
+ \`services\` keys.
777
+ - \`automated\` \u2014 \`true\` when the request is for the automated variant
778
+ (e.g. "Automated Wallet Blocking").
779
+ - \`serviceType\` \u2014 raw enum, e.g. \`isProtectionActive\`.
780
+ - \`serviceName\` \u2014 human label, e.g. \`Wallet Blocking\`.
781
+ - \`requestedAt\` \u2014 when the enable request was submitted (ISO 8601, UTC).
782
+
783
+ An **empty array means nothing is awaiting approval** \u2014 read \`services\` for
784
+ the current on/off state, never infer it from this field.
785
+
742
786
  When a user asks about "automated reporting / reviewing / protection",
743
787
  explain that the flag exists in the DB but has no operational effect and
744
788
  isn't exposed by the public API \u2014 only \`takedowns.automated\` carries a
@@ -767,6 +811,15 @@ Filter flags (all optional, all comma-separated lists where noted):
767
811
  \`--obligatory-approval-inactive\`. Use the canonical asset-type enum
768
812
  names (\`TWITTER\`, \`URL\`, \`PAGE\`, \u2026); run \`chainpatrol asset types\`
769
813
  to see them all.
814
+ - \`--pending-approval-active\` \u2014 only orgs with at least one open
815
+ service-enable approval awaiting a higher-up's sign-off.
816
+ - \`--pending-approval-inactive\` \u2014 only orgs with no pending approvals.
817
+ - \`--pending-approval-service <list>\` \u2014 only orgs with a pending approval
818
+ for one of the listed services. Accepts \`protection\` (Wallet Blocking)
819
+ and/or \`takedowns\` \u2014 those are the only approval-gated services.
820
+ Matches both the manual and automated variant. Passing this flag implies
821
+ a pending approval exists, so it can't be combined with
822
+ \`--pending-approval-inactive\`.
770
823
 
771
824
  Service names: \`reporting\`, \`reviewing\`, \`protection\`, \`takedowns\`,
772
825
  \`detection\`, \`darkWebMonitoring\`.
@@ -794,17 +847,39 @@ chainpatrol --json orgs list --obligatory-approval-active \\
794
847
  | jq '.organizations[] | select(.obligatoryAdminApproval.assetTypes | length == 0) | .slug'
795
848
  \`\`\`
796
849
 
850
+ #### Use case: tracking orgs with a pending Wallet Blocking / Takedown approval
851
+
852
+ When a user asks "which organizations have a pending approval for Wallet
853
+ blocking or Takedown services?", do NOT reach for \`--service-inactive
854
+ protection\` \u2014 that lists orgs with the service turned OFF, which is a
855
+ different question. Use the pending-approval filter, which surfaces
856
+ staff-initiated enable requests still waiting on a higher-up:
857
+
858
+ \`\`\`bash
859
+ # Every org with a pending Wallet Blocking OR Takedown approval:
860
+ chainpatrol --json orgs list --pending-approval-service protection,takedowns
861
+
862
+ # Just Wallet Blocking:
863
+ chainpatrol --json orgs list --pending-approval-service protection
864
+
865
+ # Any pending approval at all, then read each org's pendingServiceApprovals:
866
+ chainpatrol --json orgs list --pending-approval-active \\
867
+ | jq '.organizations[] | {slug, pending: [.pendingServiceApprovals[].serviceName]}'
868
+ \`\`\`
869
+
797
870
  ### \`orgs get\` \u2014 Get a single organization by slug
798
871
 
799
872
  Look up one organization the caller has access to. Returns the same per-org
800
873
  shape as a single row from \`orgs list\` \u2014 \`active\` for every service,
801
874
  plus \`automated\` on \`takedowns\` only (see the note above on why other
802
875
  services don't expose an automation flag), plus \`obligatoryAdminApproval\`
803
- (\`active\` + \`assetTypes\`). Anything you could read from \`orgs list\` you
804
- can also read here without paging or filtering. Use it when the user
805
- names a specific customer ("show me acme's setup", "is takedowns
806
- automation on for morpho?", "does this org require admin approval for
807
- Twitter?") and you don't need the rest of the catalogue.
876
+ (\`active\` + \`assetTypes\`) and \`pendingServiceApprovals\` (open Wallet
877
+ Blocking / Takedown enable requests awaiting a higher-up's sign-off).
878
+ Anything you could read from \`orgs list\` you can also read here without
879
+ paging or filtering. Use it when the user names a specific customer ("show
880
+ me acme's setup", "is takedowns automation on for morpho?", "does this org
881
+ require admin approval for Twitter?", "is morpho waiting on a Wallet
882
+ Blocking approval?") and you don't need the rest of the catalogue.
808
883
 
809
884
  \`\`\`bash
810
885
  chainpatrol orgs get <slug>
package/dist/cli.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  getCliVersion,
14
14
  isSkillInstalled,
15
15
  readInstalledSkillVersion
16
- } from "./chunk-4N2YKTJ5.js";
16
+ } from "./chunk-LKITFBIG.js";
17
17
  import "./chunk-6VTWWGNV.js";
18
18
  import {
19
19
  DateTime
@@ -92,10 +92,11 @@ var HELP = {
92
92
  usage: "chainpatrol logout"
93
93
  },
94
94
  asset: {
95
- description: "Check asset status, list blocked/allowed assets across the global ChainPatrol blocklist, or list every supported asset type.",
96
- usage: "chainpatrol asset <check|list|types>",
95
+ description: "Check asset status, search assets by content or ID, list blocked/allowed assets across the global ChainPatrol blocklist, or list every supported asset type.",
96
+ usage: "chainpatrol asset <check|list|search|types>",
97
97
  examples: [
98
98
  "chainpatrol asset check https://phish.example",
99
+ "chainpatrol asset search --id 12345",
99
100
  "chainpatrol asset list --asset-type URL --from 2026-05-01",
100
101
  "chainpatrol asset types",
101
102
  "chainpatrol --json asset check 0xabc123\u2026"
@@ -142,6 +143,21 @@ var HELP = {
142
143
  "chainpatrol --json asset check 0xabc123\u2026"
143
144
  ]
144
145
  },
146
+ "asset search": {
147
+ description: "Search for assets by content or by numeric ID. Returns detailed asset information including status, associated reports, takedown details, and which platforms have consumed (blocked) the asset. Supports bulk lookup by passing multiple --id flags. Unlike `asset check` (which queries the public blocklist aggregation), `asset search` queries the internal asset database directly and returns richer context.",
148
+ usage: "chainpatrol asset search [<content> ...] [--id <id> ...]",
149
+ options: [
150
+ "--id <number> Asset ID (repeatable for bulk lookup)",
151
+ "--asset <content> Asset content (repeatable; alternative to positional args)"
152
+ ],
153
+ examples: [
154
+ "chainpatrol asset search https://phish.example",
155
+ "chainpatrol asset search --id 4175269",
156
+ "chainpatrol asset search --id 4175269 --id 4144496 --id 4642520",
157
+ "chainpatrol --json asset search --id 4175269 --id 4144496 --id 4642520",
158
+ "chainpatrol asset search --id 12345 --output markdown"
159
+ ]
160
+ },
145
161
  configs: {
146
162
  description: "Manage detection configs for an organization.",
147
163
  usage: "chainpatrol configs <list>",
@@ -532,12 +548,16 @@ var HELP = {
532
548
  "--service-active <l> Comma-separated services that must be active",
533
549
  "--service-inactive <l> Comma-separated services that must be inactive",
534
550
  "--service-automated <l> Services whose automation must be ON (only `takedowns` is accepted \u2014 the other services have no meaningful automation toggle)",
535
- "--service-manual <l> Services whose automation must be OFF (only `takedowns` is accepted)"
551
+ "--service-manual <l> Services whose automation must be OFF (only `takedowns` is accepted)",
552
+ "--pending-approval-active Only orgs with an open service-enable approval awaiting a higher-up's sign-off",
553
+ "--pending-approval-inactive Only orgs with no pending service-enable approvals",
554
+ "--pending-approval-service <l> Only orgs with a pending approval for the listed service(s) \u2014 `protection` (Wallet Blocking) and/or `takedowns`"
536
555
  ],
537
556
  examples: [
538
557
  "chainpatrol orgs list --subscription-status ACTIVE",
539
558
  "chainpatrol orgs list --service-active takedowns --service-manual takedowns",
540
- "chainpatrol --json orgs list --subscription-status ACTIVE,TRIAL --service-active detection"
559
+ "chainpatrol --json orgs list --subscription-status ACTIVE,TRIAL --service-active detection",
560
+ "chainpatrol --json orgs list --pending-approval-service protection,takedowns"
541
561
  ]
542
562
  },
543
563
  "orgs get": {
@@ -647,7 +667,7 @@ function getTopLevelHelp() {
647
667
  " login Authenticate with ChainPatrol",
648
668
  " logout Clear stored credentials",
649
669
  " whoami Show the current authenticated identity",
650
- " asset Check or list assets, or list supported asset types",
670
+ " asset Check, search, or list assets, or list supported asset types",
651
671
  " configs Manage detection configs",
652
672
  " detections Validate, run, list, update detection configs and results",
653
673
  " healthchecks List and run organization healthchecks",
@@ -919,6 +939,9 @@ ${getTopLevelHelp()}
919
939
  obligatoryApprovalActive: { type: "boolean" },
920
940
  obligatoryApprovalInactive: { type: "boolean" },
921
941
  obligatoryApprovalAssetType: { type: "string" },
942
+ pendingApprovalActive: { type: "boolean" },
943
+ pendingApprovalInactive: { type: "boolean" },
944
+ pendingApprovalService: { type: "string" },
922
945
  query: { type: "string" },
923
946
  assetType: { type: "string" },
924
947
  takedownStatus: { type: "string" },
@@ -954,7 +977,8 @@ ${getTopLevelHelp()}
954
977
  quiet: { type: "boolean", default: false, shortFlag: "q" },
955
978
  noInput: { type: "boolean", default: false },
956
979
  noColor: { type: "boolean", default: false },
957
- cloud: { type: "boolean", default: false }
980
+ cloud: { type: "boolean", default: false },
981
+ id: { type: "string" }
958
982
  }
959
983
  });
960
984
  var [command, subcommand, action] = cli.input;
@@ -1069,12 +1093,12 @@ function parseAttachmentUrls() {
1069
1093
  }
1070
1094
  async function handleConfigsList(org) {
1071
1095
  if (jsonMode) {
1072
- const { listConfigsJson } = await import("./list-json-B5L5PXKH.js");
1096
+ const { listConfigsJson } = await import("./list-json-7FDHNRYP.js");
1073
1097
  await listConfigsJson({ org });
1074
1098
  return;
1075
1099
  }
1076
1100
  const { render } = await import("ink");
1077
- const { default: ConfigsList } = await import("./list-X4Z3CPO7.js");
1101
+ const { default: ConfigsList } = await import("./list-4HX2R7HU.js");
1078
1102
  const { default: React } = await import("react");
1079
1103
  render(React.createElement(ConfigsList, { org }));
1080
1104
  }
@@ -1174,7 +1198,7 @@ async function main() {
1174
1198
  const positionals = cli.input.slice(2);
1175
1199
  const flagAssets = parseAssetInputs();
1176
1200
  const contents = [...positionals, ...flagAssets];
1177
- const { runAssetCheck } = await import("./check-G64UQCEL.js");
1201
+ const { runAssetCheck } = await import("./check-NQZPNAUF.js");
1178
1202
  await runAssetCheck({
1179
1203
  contents,
1180
1204
  json: jsonMode,
@@ -1184,7 +1208,7 @@ async function main() {
1184
1208
  break;
1185
1209
  }
1186
1210
  if (subcommand === "list") {
1187
- const { runAssetList } = await import("./list-XSIXAHOG.js");
1211
+ const { runAssetList } = await import("./list-4KIZLIVN.js");
1188
1212
  await runAssetList({
1189
1213
  type: cli.flags.type ?? cli.flags.assetType,
1190
1214
  status: cli.flags.assetStatus ?? cli.flags.status,
@@ -1197,23 +1221,44 @@ async function main() {
1197
1221
  });
1198
1222
  break;
1199
1223
  }
1224
+ if (subcommand === "search") {
1225
+ const positionals = cli.input.slice(2);
1226
+ const flagAssets = parseAssetInputs();
1227
+ const contents = [...positionals, ...flagAssets];
1228
+ const rawIds = getRepeatedFlag("id");
1229
+ const ids = rawIds.map((v) => {
1230
+ const n = Number(v);
1231
+ if (!Number.isInteger(n) || n <= 0) {
1232
+ throw new Error(`Invalid asset ID: ${v}. IDs must be positive integers.`);
1233
+ }
1234
+ return n;
1235
+ });
1236
+ const { runAssetSearch } = await import("./search-ZXTJPVM6.js");
1237
+ await runAssetSearch({
1238
+ contents: contents.length > 0 ? contents : void 0,
1239
+ ids: ids.length > 0 ? ids : void 0,
1240
+ json: jsonMode,
1241
+ outputFormat: cliContext.outputFormat
1242
+ });
1243
+ break;
1244
+ }
1200
1245
  if (subcommand === "types") {
1201
- const { runAssetTypes } = await import("./types-PTMFLYUV.js");
1246
+ const { runAssetTypes } = await import("./types-M6QMFNUS.js");
1202
1247
  runAssetTypes({
1203
1248
  json: jsonMode,
1204
1249
  outputFormat: cliContext.outputFormat
1205
1250
  });
1206
1251
  break;
1207
1252
  }
1208
- const hint = subcommand ? suggest(subcommand, ["check", "list", "types"]) : null;
1253
+ const hint = subcommand ? suggest(subcommand, ["check", "list", "search", "types"]) : null;
1209
1254
  throw new Error(
1210
- subcommand ? `Unknown subcommand: asset ${subcommand}${hint ? `. Did you mean "asset ${hint}"?` : ""}` : "Usage: chainpatrol asset <check|list|types>"
1255
+ subcommand ? `Unknown subcommand: asset ${subcommand}${hint ? `. Did you mean "asset ${hint}"?` : ""}` : "Usage: chainpatrol asset <check|list|search|types>"
1211
1256
  );
1212
1257
  }
1213
1258
  case "detections": {
1214
1259
  const org = await resolveOrg();
1215
1260
  if (subcommand === "healthcheck") {
1216
- const { runDetectionsHealthcheck } = await import("./healthcheck-QNLFKAXM.js");
1261
+ const { runDetectionsHealthcheck } = await import("./healthcheck-7YWSOY6Y.js");
1217
1262
  await runDetectionsHealthcheck({
1218
1263
  org,
1219
1264
  source: cli.flags.source,
@@ -1228,7 +1273,7 @@ async function main() {
1228
1273
  break;
1229
1274
  }
1230
1275
  if (subcommand === "validate") {
1231
- const { runDetectionsValidate } = await import("./validate-UYKOMUEI.js");
1276
+ const { runDetectionsValidate } = await import("./validate-RPQEEQ36.js");
1232
1277
  await runDetectionsValidate({
1233
1278
  org,
1234
1279
  source: cli.flags.source,
@@ -1243,7 +1288,7 @@ async function main() {
1243
1288
  break;
1244
1289
  }
1245
1290
  if (subcommand === "drift") {
1246
- const { runDetectionsDrift } = await import("./drift-SHPMEJDU.js");
1291
+ const { runDetectionsDrift } = await import("./drift-YZHCIQ5O.js");
1247
1292
  await runDetectionsDrift({
1248
1293
  org,
1249
1294
  source: cli.flags.source,
@@ -1257,7 +1302,7 @@ async function main() {
1257
1302
  break;
1258
1303
  }
1259
1304
  if (subcommand === "run") {
1260
- const { runDetectionsRun } = await import("./run-RV6P2OCD.js");
1305
+ const { runDetectionsRun } = await import("./run-CCVJIK7L.js");
1261
1306
  await runDetectionsRun({
1262
1307
  org,
1263
1308
  configId: cli.flags.configId,
@@ -1271,7 +1316,7 @@ async function main() {
1271
1316
  break;
1272
1317
  }
1273
1318
  if (subcommand === "list") {
1274
- const { runDetectionsList } = await import("./list-SWHKM5R6.js");
1319
+ const { runDetectionsList } = await import("./list-Q3MMBL4Y.js");
1275
1320
  await runDetectionsList({
1276
1321
  org,
1277
1322
  cursor: cli.flags.cursor,
@@ -1300,7 +1345,7 @@ async function main() {
1300
1345
  break;
1301
1346
  }
1302
1347
  if (action === "run") {
1303
- const { runDetectionsRun } = await import("./run-RV6P2OCD.js");
1348
+ const { runDetectionsRun } = await import("./run-CCVJIK7L.js");
1304
1349
  await runDetectionsRun({
1305
1350
  org,
1306
1351
  configId: cli.flags.configId,
@@ -1318,7 +1363,7 @@ async function main() {
1318
1363
  throw new Error("detections configs update requires --config-id");
1319
1364
  }
1320
1365
  const configPatch = getConfigPatchFromSetFlags();
1321
- const { runDetectionsConfigsUpdate } = await import("./configs-update-MVX7Q5NW.js");
1366
+ const { runDetectionsConfigsUpdate } = await import("./configs-update-VDZVBTIF.js");
1322
1367
  await runDetectionsConfigsUpdate({
1323
1368
  org,
1324
1369
  configId: cli.flags.configId,
@@ -1354,7 +1399,7 @@ async function main() {
1354
1399
  const slugs = parseCsvList(cli.flags.slugs);
1355
1400
  const allMyOrgs = cli.flags.allMyOrgs;
1356
1401
  const org2 = slugs && slugs.length > 0 || allMyOrgs ? void 0 : await tryResolveOrg();
1357
- const { runMetricsOrganization } = await import("./organization-SOMHMGTM.js");
1402
+ const { runMetricsOrganization } = await import("./organization-NEZA6JX2.js");
1358
1403
  await runMetricsOrganization({
1359
1404
  org: org2,
1360
1405
  slugs,
@@ -1373,7 +1418,7 @@ async function main() {
1373
1418
  }
1374
1419
  const org = await resolveOrg();
1375
1420
  if (subcommand === "summary") {
1376
- const { runMetricsSummary } = await import("./summary-LF53KXRR.js");
1421
+ const { runMetricsSummary } = await import("./summary-FE6ROSOO.js");
1377
1422
  await runMetricsSummary({
1378
1423
  org,
1379
1424
  from: cli.flags.from,
@@ -1386,7 +1431,7 @@ async function main() {
1386
1431
  break;
1387
1432
  }
1388
1433
  if (subcommand === "found") {
1389
- const { runMetricsFound } = await import("./found-OPL4HWOW.js");
1434
+ const { runMetricsFound } = await import("./found-6JAOLM6M.js");
1390
1435
  await runMetricsFound({
1391
1436
  org,
1392
1437
  from: cli.flags.from,
@@ -1403,7 +1448,7 @@ async function main() {
1403
1448
  if (!by || !["day", "type", "brand"].includes(by)) {
1404
1449
  throw new Error("metrics breakdown requires --by <day|type|brand>");
1405
1450
  }
1406
- const { runMetricsBreakdown } = await import("./breakdown-3LJBT3JQ.js");
1451
+ const { runMetricsBreakdown } = await import("./breakdown-XA6UUD3T.js");
1407
1452
  await runMetricsBreakdown({
1408
1453
  org,
1409
1454
  by,
@@ -1424,7 +1469,7 @@ async function main() {
1424
1469
  case "reports": {
1425
1470
  if (subcommand === "list") {
1426
1471
  const org = await resolveOrg();
1427
- const { runReportsList } = await import("./list-WPPNX7G3.js");
1472
+ const { runReportsList } = await import("./list-H7NVUX42.js");
1428
1473
  await runReportsList({
1429
1474
  org,
1430
1475
  limit: cli.flags.limit,
@@ -1452,7 +1497,7 @@ async function main() {
1452
1497
  }
1453
1498
  if (subcommand === "create") {
1454
1499
  const org = await tryResolveOrg();
1455
- const { runReportsCreate } = await import("./create-ANCO4FXB.js");
1500
+ const { runReportsCreate } = await import("./create-DGCWT2YJ.js");
1456
1501
  await runReportsCreate({
1457
1502
  org,
1458
1503
  title: cli.flags.title,
@@ -1473,7 +1518,7 @@ async function main() {
1473
1518
  const positionals = cli.input.slice(2);
1474
1519
  const flagAssets = parseAssetInputs();
1475
1520
  const assetContents = [...positionals, ...flagAssets];
1476
- const { runReportsSearch } = await import("./search-FQUR75WR.js");
1521
+ const { runReportsSearch } = await import("./search-JXJLBV43.js");
1477
1522
  await runReportsSearch({
1478
1523
  assetContents,
1479
1524
  reportedByCustomer: cli.flags.reportedByCustomer,
@@ -1489,7 +1534,7 @@ async function main() {
1489
1534
  }
1490
1535
  case "threats": {
1491
1536
  if (subcommand === "list") {
1492
- const { runThreatsList } = await import("./list-Q5PRMAN5.js");
1537
+ const { runThreatsList } = await import("./list-YNQ6VSYV.js");
1493
1538
  await runThreatsList({
1494
1539
  query: cli.flags.query,
1495
1540
  from: cli.flags.from,
@@ -1512,7 +1557,7 @@ async function main() {
1512
1557
  case "takedowns": {
1513
1558
  if (subcommand === "list") {
1514
1559
  const org = await tryResolveOrg();
1515
- const { runTakedownsList } = await import("./list-FWXQUOCP.js");
1560
+ const { runTakedownsList } = await import("./list-ZBC53OYA.js");
1516
1561
  await runTakedownsList({
1517
1562
  org,
1518
1563
  query: cli.flags.query,
@@ -1543,7 +1588,7 @@ async function main() {
1543
1588
  }
1544
1589
  case "queues": {
1545
1590
  if (subcommand === "snapshot") {
1546
- const { runQueuesSnapshot } = await import("./snapshot-2GDJMN3L.js");
1591
+ const { runQueuesSnapshot } = await import("./snapshot-NYOLPGRW.js");
1547
1592
  await runQueuesSnapshot({
1548
1593
  org: cli.flags.org,
1549
1594
  all: cli.flags.all,
@@ -1561,7 +1606,7 @@ async function main() {
1561
1606
  }
1562
1607
  case "orgs": {
1563
1608
  if (subcommand === "list") {
1564
- const { runOrgsList } = await import("./list-MHICJ2TK.js");
1609
+ const { runOrgsList } = await import("./list-SRVNEUHC.js");
1565
1610
  await runOrgsList({
1566
1611
  query: cli.flags.query,
1567
1612
  subscriptionStatus: cli.flags.subscriptionStatus,
@@ -1572,6 +1617,9 @@ async function main() {
1572
1617
  obligatoryApprovalActive: cli.flags.obligatoryApprovalActive,
1573
1618
  obligatoryApprovalInactive: cli.flags.obligatoryApprovalInactive,
1574
1619
  obligatoryApprovalAssetType: cli.flags.obligatoryApprovalAssetType,
1620
+ pendingApprovalActive: cli.flags.pendingApprovalActive,
1621
+ pendingApprovalInactive: cli.flags.pendingApprovalInactive,
1622
+ pendingApprovalService: cli.flags.pendingApprovalService,
1575
1623
  json: jsonMode,
1576
1624
  outputFormat: cliContext.outputFormat
1577
1625
  });
@@ -1580,7 +1628,7 @@ async function main() {
1580
1628
  if (subcommand === "get") {
1581
1629
  const positionalSlug = action;
1582
1630
  const slug = positionalSlug ?? await tryResolveOrg();
1583
- const { runOrgsGet } = await import("./get-XN752KSL.js");
1631
+ const { runOrgsGet } = await import("./get-RC75EJFC.js");
1584
1632
  await runOrgsGet({
1585
1633
  slug,
1586
1634
  json: jsonMode,
@@ -1590,7 +1638,7 @@ async function main() {
1590
1638
  }
1591
1639
  if (subcommand === "assets") {
1592
1640
  if (action === "list") {
1593
- const { runOrgsAssetsList } = await import("./list-QHEFB4KE.js");
1641
+ const { runOrgsAssetsList } = await import("./list-WQFDRXHD.js");
1594
1642
  await runOrgsAssetsList({
1595
1643
  type: cli.flags.type ?? cli.flags.assetType,
1596
1644
  groupId: cli.flags.groupId,
@@ -1606,7 +1654,7 @@ async function main() {
1606
1654
  }
1607
1655
  if (subcommand === "asset-groups") {
1608
1656
  if (action === "list") {
1609
- const { runOrgsAssetGroupsList } = await import("./list-FVFF4VW3.js");
1657
+ const { runOrgsAssetGroupsList } = await import("./list-UDT5MDQZ.js");
1610
1658
  await runOrgsAssetGroupsList({
1611
1659
  json: jsonMode,
1612
1660
  outputFormat: cliContext.outputFormat
@@ -1628,7 +1676,7 @@ async function main() {
1628
1676
  "brands list --type must be ORGANIZATION or INDIVIDUAL (case-insensitive)."
1629
1677
  );
1630
1678
  }
1631
- const { runBrandsList } = await import("./list-4VKMEKZS.js");
1679
+ const { runBrandsList } = await import("./list-ZARZ72DG.js");
1632
1680
  await runBrandsList({
1633
1681
  type: rawType,
1634
1682
  json: jsonMode,
@@ -1642,7 +1690,7 @@ async function main() {
1642
1690
  );
1643
1691
  }
1644
1692
  case "whoami": {
1645
- const { runWhoami } = await import("./whoami-OYOG63BX.js");
1693
+ const { runWhoami } = await import("./whoami-ZIWZCBGI.js");
1646
1694
  await runWhoami({
1647
1695
  json: jsonMode,
1648
1696
  outputFormat: cliContext.outputFormat
@@ -1651,7 +1699,7 @@ async function main() {
1651
1699
  }
1652
1700
  case "healthchecks": {
1653
1701
  if (subcommand === "list") {
1654
- const { runHealthchecksList } = await import("./list-AQ7E23T3.js");
1702
+ const { runHealthchecksList } = await import("./list-EJDWUF6W.js");
1655
1703
  await runHealthchecksList({
1656
1704
  json: jsonMode,
1657
1705
  outputFormat: cliContext.outputFormat
@@ -1665,7 +1713,7 @@ async function main() {
1665
1713
  thresholds.minResults = cli.flags.minResults;
1666
1714
  if (cli.flags.lookbackHours !== void 0)
1667
1715
  thresholds.lookbackHours = cli.flags.lookbackHours;
1668
- const { runHealthchecksRun } = await import("./run-J5TQ2YC2.js");
1716
+ const { runHealthchecksRun } = await import("./run-5QV3YD7V.js");
1669
1717
  await runHealthchecksRun({
1670
1718
  org,
1671
1719
  id: action,
@@ -1683,7 +1731,7 @@ async function main() {
1683
1731
  }
1684
1732
  case "presets": {
1685
1733
  if (subcommand === "list") {
1686
- const { runPresetsList } = await import("./list-FJBWSGTD.js");
1734
+ const { runPresetsList } = await import("./list-IDR7WH5J.js");
1687
1735
  await runPresetsList({ outputFormat: cliContext.outputFormat });
1688
1736
  break;
1689
1737
  }
@@ -1694,7 +1742,7 @@ async function main() {
1694
1742
  );
1695
1743
  }
1696
1744
  const org = await resolveOrg();
1697
- const { runPresetsRun } = await import("./run-YAAMSWKK.js");
1745
+ const { runPresetsRun } = await import("./run-JLTNFOJK.js");
1698
1746
  await runPresetsRun({
1699
1747
  presetId: action,
1700
1748
  org,
@@ -1711,12 +1759,12 @@ async function main() {
1711
1759
  case "setup":
1712
1760
  case "install":
1713
1761
  case "i": {
1714
- const { setupSkill } = await import("./setup-skill-UEOROLCF.js");
1762
+ const { setupSkill } = await import("./setup-skill-V3HDWN7T.js");
1715
1763
  setupSkill({ json: jsonMode, cloud: cli.flags.cloud });
1716
1764
  break;
1717
1765
  }
1718
1766
  case "uninstall": {
1719
- const { uninstallSkill } = await import("./setup-skill-UEOROLCF.js");
1767
+ const { uninstallSkill } = await import("./setup-skill-V3HDWN7T.js");
1720
1768
  uninstallSkill({ json: jsonMode });
1721
1769
  break;
1722
1770
  }
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VFT3TD3E.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-O7TMOF4W.js";
10
+ } from "./chunk-GOQL7UCG.js";
11
11
  import "./chunk-EGWK6SRQ.js";
12
12
  import "./chunk-TFCNKBRC.js";
13
13
  import "./chunk-U73SABXK.js";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-O7TMOF4W.js";
11
+ } from "./chunk-GOQL7UCG.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-O7TMOF4W.js";
11
+ } from "./chunk-GOQL7UCG.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-TFCNKBRC.js";
14
14
  import "./chunk-U73SABXK.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VFT3TD3E.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-O7TMOF4W.js";
10
+ } from "./chunk-GOQL7UCG.js";
11
11
  import "./chunk-EGWK6SRQ.js";
12
12
  import "./chunk-TFCNKBRC.js";
13
13
  import "./chunk-U73SABXK.js";