@chainpatrol/cli 0.23.1 → 0.25.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 (45) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +5 -0
  3. package/dist/{breakdown-XA6UUD3T.js → breakdown-5DJMXRK4.js} +2 -2
  4. package/dist/{check-NQZPNAUF.js → check-5P3EXVSN.js} +1 -2
  5. package/dist/chunk-MM5OAY2U.js +317 -0
  6. package/dist/chunk-OFUIYMPD.js +64 -0
  7. package/dist/{chunk-DVNTYW7L.js → chunk-PEX2A3IL.js} +1 -1
  8. package/dist/cli.js +38 -38
  9. package/dist/{configs-update-VDZVBTIF.js → configs-update-TAYT4JTU.js} +1 -2
  10. package/dist/{create-DGCWT2YJ.js → create-UXRULUR7.js} +1 -2
  11. package/dist/{drift-YZHCIQ5O.js → drift-TCZELVHO.js} +1 -2
  12. package/dist/{found-6JAOLM6M.js → found-NCP6H2SD.js} +2 -2
  13. package/dist/{get-RC75EJFC.js → get-4YHQ7ZE2.js} +1 -2
  14. package/dist/{healthcheck-7YWSOY6Y.js → healthcheck-5YEZCTXC.js} +1 -2
  15. package/dist/{list-IDR7WH5J.js → list-23C72EH4.js} +3 -3
  16. package/dist/{list-4HX2R7HU.js → list-2RHEVI2T.js} +1 -2
  17. package/dist/{list-ZARZ72DG.js → list-33ILIIXB.js} +1 -2
  18. package/dist/{list-4KIZLIVN.js → list-GEJQ6N2Y.js} +1 -2
  19. package/dist/{list-WQFDRXHD.js → list-MPSB2DYU.js} +1 -2
  20. package/dist/{list-EJDWUF6W.js → list-QJYRXPXM.js} +1 -2
  21. package/dist/{list-UDT5MDQZ.js → list-QLMFMYU6.js} +1 -2
  22. package/dist/{list-YNQ6VSYV.js → list-SCA73PLA.js} +1 -2
  23. package/dist/{list-SRVNEUHC.js → list-T2YIGGM6.js} +1 -2
  24. package/dist/{list-ZBC53OYA.js → list-TA4HYD66.js} +1 -2
  25. package/dist/{list-H7NVUX42.js → list-TULFPPG3.js} +5 -3
  26. package/dist/{list-Q3MMBL4Y.js → list-W6JZUNS2.js} +1 -2
  27. package/dist/{list-json-7FDHNRYP.js → list-json-NJ5IFRDE.js} +1 -2
  28. package/dist/{login-AMEXCOGT.js → login-2NRI3ECY.js} +2 -2
  29. package/dist/{login-json-MPLXCSP4.js → login-json-HOCNSQQ7.js} +2 -2
  30. package/dist/{login-plain-NIJDS3D2.js → login-plain-6ZJF5KA7.js} +2 -2
  31. package/dist/{organization-NEZA6JX2.js → organization-N6RMWKJM.js} +2 -2
  32. package/dist/{run-CCVJIK7L.js → run-KOZXEYTL.js} +1 -2
  33. package/dist/{run-5QV3YD7V.js → run-SE2SUE64.js} +1 -2
  34. package/dist/{run-JLTNFOJK.js → run-TUADYLU7.js} +3 -3
  35. package/dist/{search-JXJLBV43.js → search-5DOXBWPB.js} +1 -2
  36. package/dist/{search-ZXTJPVM6.js → search-Y37B2JVP.js} +1 -2
  37. package/dist/{setup-skill-V3HDWN7T.js → setup-skill-RRTDEOR4.js} +1 -1
  38. package/dist/{snapshot-NYOLPGRW.js → snapshot-RFGSAHO7.js} +1 -2
  39. package/dist/{summary-FE6ROSOO.js → summary-XCN3DRYP.js} +2 -2
  40. package/dist/{validate-RPQEEQ36.js → validate-OYTNB2ZM.js} +1 -2
  41. package/dist/{whoami-ZIWZCBGI.js → whoami-5WCW3FOZ.js} +1 -2
  42. package/package.json +2 -1
  43. package/dist/chunk-GOQL7UCG.js +0 -422
  44. package/dist/chunk-LKITFBIG.js +0 -1950
  45. package/dist/{chunk-PZV55KAR.js → chunk-GGBG2R63.js} +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @chainpatrol/cli
2
2
 
3
+ ## 0.25.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ea72356: Restructure SDK as the canonical API client layer. The SDK now exports a full ~30-method `ChainPatrolApiClient` class at `@chainpatrol/sdk/api` with pluggable auth via `CredentialProvider`, and the Claude Code skill content at `@chainpatrol/sdk/skill` with a standalone `chainpatrol-skill` binary. The CLI is refactored to wrap the SDK instead of maintaining its own HTTP client.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [ea72356]
12
+ - @chainpatrol/sdk@0.9.0
13
+
14
+ ## 0.24.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 2824e5c: Add filter-aware `totalCount` to `reports list`. The reports list response (and
19
+ `chainpatrol --json reports list`) now returns `totalCount`: the number of
20
+ reports matching the same filters as the query, independent of `--limit` /
21
+ `--cursor`. Consumers can use it as a denominator when sampling (e.g. "sampled
22
+ 200 of ~4,235"), to decide whether to page through or narrow filters up front,
23
+ and to drive a progress indicator. Server-side work lives in `@chainpatrol/core`
24
+ and `@chainpatrol/external-trpc` (both private packages, no version bump needed).
25
+
3
26
  ## 0.23.1
4
27
 
5
28
  ### Patch Changes
package/README.md CHANGED
@@ -125,6 +125,11 @@ chainpatrol reports list --org my-org --limit 5
125
125
  chainpatrol reports list --org my-org --status TODO --search "Phishing report"
126
126
  ```
127
127
 
128
+ `reports list` responses include `totalCount` — the number of reports matching
129
+ the current filters, independent of `--limit`/`--cursor`. Use it as a
130
+ denominator when sampling (e.g. "sampled 200 of ~4,235") or to decide whether to
131
+ paginate vs. narrow filters before fetching.
132
+
128
133
  ### Operations commands
129
134
 
130
135
  ```bash
@@ -7,9 +7,9 @@ import {
7
7
  } from "./chunk-VFT3TD3E.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-GOQL7UCG.js";
11
- import "./chunk-EGWK6SRQ.js";
10
+ } from "./chunk-OFUIYMPD.js";
12
11
  import "./chunk-TFCNKBRC.js";
12
+ import "./chunk-EGWK6SRQ.js";
13
13
  import "./chunk-U73SABXK.js";
14
14
 
15
15
  // src/commands/metrics/breakdown.ts
@@ -8,9 +8,8 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-GOQL7UCG.js";
11
+ } from "./chunk-OFUIYMPD.js";
12
12
  import "./chunk-EGWK6SRQ.js";
13
- import "./chunk-TFCNKBRC.js";
14
13
  import "./chunk-U73SABXK.js";
15
14
 
16
15
  // src/commands/asset/check.ts
@@ -0,0 +1,317 @@
1
+ import {
2
+ installCompletions,
3
+ uninstallCompletions
4
+ } from "./chunk-6VTWWGNV.js";
5
+
6
+ // src/commands/setup-skill.ts
7
+ import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, existsSync as existsSync2, readFileSync as readFileSync3, rmSync } from "fs";
8
+ import { join as join2 } from "path";
9
+ import { homedir as homedir2 } from "os";
10
+ import { buildSkillContent, parseSkillVersion } from "@chainpatrol/sdk/skill";
11
+ import { parseSkillVersion as parseSkillVersion2 } from "@chainpatrol/sdk/skill";
12
+
13
+ // src/commands/login-hook.ts
14
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, unlinkSync } from "fs";
15
+ import { homedir } from "os";
16
+ import { join, dirname } from "path";
17
+ var CLAUDE_DIR = join(homedir(), ".claude");
18
+ var HOOK_DIR = join(CLAUDE_DIR, "hooks");
19
+ var HOOK_FILE = join(HOOK_DIR, "chainpatrol-login.sh");
20
+ var SETTINGS_FILE = join(CLAUDE_DIR, "settings.json");
21
+ var HOOK_SCRIPT = `#!/bin/bash
22
+ # chainpatrol auto-login hook \u2014 installed by \`chainpatrol setup\`.
23
+ # On Claude Code session start, if the user has no chainpatrol credentials,
24
+ # emit additionalContext so Claude surfaces the device-code login URL on
25
+ # the first user turn. Safe to run repeatedly: no-ops once authenticated.
26
+ set -uo pipefail
27
+
28
+ CONFIG_DIR="\${CHAINPATROL_CONFIG_DIR:-$HOME/.chainpatrol}"
29
+ if [ -s "$CONFIG_DIR/credentials.json" ]; then
30
+ exit 0
31
+ fi
32
+
33
+ # Only nudge when the CLI is reachable \u2014 otherwise we'd ask Claude to run
34
+ # a command that isn't installed.
35
+ if ! command -v chainpatrol >/dev/null 2>&1 \\
36
+ && [ ! -x /usr/local/bin/chainpatrol ] \\
37
+ && ! ls /opt/node*/bin/chainpatrol >/dev/null 2>&1; then
38
+ exit 0
39
+ fi
40
+
41
+ cat <<'JSON'
42
+ {"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"chainpatrol auto-login: the user is not authenticated with ChainPatrol (no credentials.json found). If the user's task involves ChainPatrol or the chainpatrol CLI, start \`chainpatrol login\` in the background per the /chainpatrol skill's headless runbook (background + tail /tmp/cp-login.out) and surface the verification URL before doing anything else. If the user's task is unrelated, ignore this notice."}}
43
+ JSON
44
+ exit 0
45
+ `;
46
+ function installLoginHook() {
47
+ mkdirSync(HOOK_DIR, { recursive: true });
48
+ const hookWritten = !existsSync(HOOK_FILE) || readFileSync(HOOK_FILE, "utf-8") !== HOOK_SCRIPT;
49
+ if (hookWritten) {
50
+ writeFileSync(HOOK_FILE, HOOK_SCRIPT, { mode: 493 });
51
+ }
52
+ const settingsUpdated = registerHookInSettings();
53
+ return {
54
+ hookPath: HOOK_FILE,
55
+ hookWritten,
56
+ settingsPath: SETTINGS_FILE,
57
+ settingsUpdated
58
+ };
59
+ }
60
+ function uninstallLoginHook() {
61
+ let hookRemoved = false;
62
+ if (existsSync(HOOK_FILE)) {
63
+ unlinkSync(HOOK_FILE);
64
+ hookRemoved = true;
65
+ }
66
+ const settingsUpdated = unregisterHookFromSettings();
67
+ return { hookRemoved, settingsUpdated };
68
+ }
69
+ function readSettings() {
70
+ if (!existsSync(SETTINGS_FILE)) return {};
71
+ const raw = readFileSync(SETTINGS_FILE, "utf-8");
72
+ if (raw.trim() === "") return {};
73
+ return JSON.parse(raw);
74
+ }
75
+ function writeSettings(settings) {
76
+ mkdirSync(dirname(SETTINGS_FILE), { recursive: true });
77
+ writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2) + "\n", {
78
+ mode: 420
79
+ });
80
+ }
81
+ function hasHookEntry(settings) {
82
+ const matchers = settings.hooks?.SessionStart;
83
+ if (!Array.isArray(matchers)) return false;
84
+ return matchers.some(
85
+ (matcher) => Array.isArray(matcher?.hooks) && matcher.hooks.some((h) => h?.command === HOOK_FILE)
86
+ );
87
+ }
88
+ function registerHookInSettings() {
89
+ const settings = readSettings();
90
+ if (hasHookEntry(settings)) return false;
91
+ const hooks = settings.hooks ??= {};
92
+ const sessionStart = hooks.SessionStart ??= [];
93
+ sessionStart.push({
94
+ hooks: [{ type: "command", command: HOOK_FILE }]
95
+ });
96
+ writeSettings(settings);
97
+ return true;
98
+ }
99
+ function unregisterHookFromSettings() {
100
+ if (!existsSync(SETTINGS_FILE)) return false;
101
+ const settings = readSettings();
102
+ const sessionStart = settings.hooks?.SessionStart;
103
+ if (!Array.isArray(sessionStart)) return false;
104
+ let changed = false;
105
+ const filtered = sessionStart.map((matcher) => {
106
+ if (!Array.isArray(matcher?.hooks)) return matcher;
107
+ const remaining = matcher.hooks.filter((h) => h?.command !== HOOK_FILE);
108
+ if (remaining.length === matcher.hooks.length) return matcher;
109
+ changed = true;
110
+ return remaining.length > 0 ? { ...matcher, hooks: remaining } : null;
111
+ }).filter((m) => m !== null);
112
+ if (!changed) return false;
113
+ if (filtered.length === 0) {
114
+ delete settings.hooks.SessionStart;
115
+ if (Object.keys(settings.hooks).length === 0) {
116
+ delete settings.hooks;
117
+ }
118
+ } else {
119
+ settings.hooks.SessionStart = filtered;
120
+ }
121
+ writeSettings(settings);
122
+ return true;
123
+ }
124
+
125
+ // src/lib/version.ts
126
+ import { readFileSync as readFileSync2 } from "fs";
127
+ import { dirname as dirname2, resolve } from "path";
128
+ import { fileURLToPath } from "url";
129
+ var PACKAGE_NAME = "@chainpatrol/cli";
130
+ var cached;
131
+ function getCliVersion() {
132
+ if (cached !== void 0) return cached;
133
+ cached = resolveCliVersion();
134
+ return cached;
135
+ }
136
+ function resolveCliVersion() {
137
+ try {
138
+ const here = dirname2(fileURLToPath(import.meta.url));
139
+ const candidates = [
140
+ resolve(here, "..", "package.json"),
141
+ resolve(here, "..", "..", "package.json")
142
+ ];
143
+ for (const candidate of candidates) {
144
+ const version = tryReadVersion(candidate);
145
+ if (version) return version;
146
+ }
147
+ } catch {
148
+ }
149
+ return "0.0.0";
150
+ }
151
+ function tryReadVersion(path) {
152
+ try {
153
+ const raw = readFileSync2(path, "utf-8");
154
+ const pkg = JSON.parse(raw);
155
+ if (pkg.name === PACKAGE_NAME && typeof pkg.version === "string") {
156
+ return pkg.version;
157
+ }
158
+ } catch {
159
+ }
160
+ return void 0;
161
+ }
162
+ function compareVersions(a, b) {
163
+ const parsed = (value) => {
164
+ const hyphenIndex = value.indexOf("-");
165
+ const main = hyphenIndex >= 0 ? value.slice(0, hyphenIndex) : value;
166
+ const pre = hyphenIndex >= 0 ? value.slice(hyphenIndex + 1) : "";
167
+ const parts = main.split(".").map((n) => Number.parseInt(n, 10) || 0);
168
+ while (parts.length < 3) parts.push(0);
169
+ return { parts, pre };
170
+ };
171
+ const va = parsed(a);
172
+ const vb = parsed(b);
173
+ for (let i = 0; i < 3; i += 1) {
174
+ if (va.parts[i] !== vb.parts[i]) return va.parts[i] - vb.parts[i];
175
+ }
176
+ if (va.pre === vb.pre) return 0;
177
+ if (va.pre === "") return 1;
178
+ if (vb.pre === "") return -1;
179
+ return va.pre < vb.pre ? -1 : 1;
180
+ }
181
+
182
+ // src/commands/setup-skill.ts
183
+ var SKILL_DIR = join2(homedir2(), ".claude", "skills", "chainpatrol");
184
+ var SKILL_FILE = join2(SKILL_DIR, "SKILL.md");
185
+ function getBundledSkillVersion() {
186
+ return getCliVersion();
187
+ }
188
+ function getBundledSkillContent() {
189
+ return buildSkillContent(getCliVersion());
190
+ }
191
+ function readInstalledSkillVersion() {
192
+ if (!existsSync2(SKILL_FILE)) return void 0;
193
+ try {
194
+ const raw = readFileSync3(SKILL_FILE, "utf-8");
195
+ return parseSkillVersion(raw);
196
+ } catch {
197
+ return void 0;
198
+ }
199
+ }
200
+ function isSkillInstalled() {
201
+ return existsSync2(SKILL_FILE);
202
+ }
203
+ var LOGO = `
204
+ \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557
205
+ \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
206
+ \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D
207
+ \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u255D
208
+ \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551
209
+ \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D
210
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
211
+ C H A I N P A T R O L
212
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
213
+ `;
214
+ function setupSkill(options) {
215
+ const skillContent = buildSkillContent(getCliVersion());
216
+ const skillAlreadyExists = existsSync2(SKILL_FILE);
217
+ const skillUpToDate = skillAlreadyExists && readFileSync3(SKILL_FILE, "utf-8") === skillContent;
218
+ let skillStatus;
219
+ if (!skillAlreadyExists) {
220
+ mkdirSync2(SKILL_DIR, { recursive: true });
221
+ writeFileSync2(SKILL_FILE, skillContent, { mode: 420 });
222
+ skillStatus = "installed";
223
+ } else if (!skillUpToDate) {
224
+ writeFileSync2(SKILL_FILE, skillContent, { mode: 420 });
225
+ skillStatus = "updated";
226
+ } else {
227
+ skillStatus = "up-to-date";
228
+ }
229
+ const completionResult = installCompletions();
230
+ const loginHookResult = options.cloud ? installLoginHook() : null;
231
+ const completionsChanged = completionResult.installed || completionResult.configuredShellRc;
232
+ const loginHookChanged = loginHookResult != null && (loginHookResult.hookWritten || loginHookResult.settingsUpdated);
233
+ const overallStatus = skillStatus !== "up-to-date" ? skillStatus : completionsChanged || loginHookChanged ? "updated" : "up-to-date";
234
+ if (options.json) {
235
+ console.log(
236
+ JSON.stringify({
237
+ status: overallStatus,
238
+ path: SKILL_FILE,
239
+ skill: { status: skillStatus, path: SKILL_FILE },
240
+ completions: completionResult,
241
+ loginHook: loginHookResult
242
+ })
243
+ );
244
+ return;
245
+ }
246
+ if (overallStatus === "up-to-date") {
247
+ console.log("Claude Code skill, completions, and login hook are already up to date.");
248
+ return;
249
+ }
250
+ console.log(LOGO);
251
+ if (skillStatus === "installed") {
252
+ console.log(`Installed Claude Code skill at ${SKILL_FILE}`);
253
+ } else if (skillStatus === "updated") {
254
+ console.log(`Updated Claude Code skill at ${SKILL_FILE}`);
255
+ }
256
+ console.log("You can now use /chainpatrol in Claude Code from any project.");
257
+ if (loginHookChanged && loginHookResult) {
258
+ console.log(`Installed auto-login hook at ${loginHookResult.hookPath}`);
259
+ if (loginHookResult.settingsUpdated) {
260
+ console.log(`Registered SessionStart hook in ${loginHookResult.settingsPath}`);
261
+ }
262
+ }
263
+ if (completionResult.installed) {
264
+ console.log(
265
+ `Installed ${completionResult.shell} completions at ${completionResult.path}`
266
+ );
267
+ if (completionResult.configuredShellRc) {
268
+ console.log("Added completion config to ~/.zshrc");
269
+ }
270
+ console.log('Run "exec zsh" or open a new terminal to enable tab completion.');
271
+ }
272
+ }
273
+ function uninstallSkill(options) {
274
+ const skillInstalled = existsSync2(SKILL_FILE);
275
+ if (skillInstalled) {
276
+ rmSync(SKILL_DIR, { recursive: true });
277
+ }
278
+ const removedCompletions = uninstallCompletions();
279
+ const loginHookResult = uninstallLoginHook();
280
+ const removedAnything = skillInstalled || removedCompletions || loginHookResult.hookRemoved || loginHookResult.settingsUpdated;
281
+ if (options.json) {
282
+ console.log(
283
+ JSON.stringify({
284
+ status: removedAnything ? "uninstalled" : "not-installed",
285
+ path: SKILL_FILE,
286
+ removedCompletions,
287
+ loginHook: loginHookResult
288
+ })
289
+ );
290
+ return;
291
+ }
292
+ if (!removedAnything) {
293
+ console.log("Claude Code skill is not installed.");
294
+ return;
295
+ }
296
+ if (skillInstalled) {
297
+ console.log("Removed Claude Code skill from " + SKILL_DIR);
298
+ }
299
+ if (loginHookResult.hookRemoved || loginHookResult.settingsUpdated) {
300
+ console.log("Removed chainpatrol auto-login hook.");
301
+ }
302
+ if (removedCompletions) {
303
+ console.log("Removed shell completions.");
304
+ }
305
+ }
306
+
307
+ export {
308
+ getCliVersion,
309
+ compareVersions,
310
+ getBundledSkillVersion,
311
+ getBundledSkillContent,
312
+ readInstalledSkillVersion,
313
+ isSkillInstalled,
314
+ setupSkill,
315
+ uninstallSkill,
316
+ parseSkillVersion2 as parseSkillVersion
317
+ };
@@ -0,0 +1,64 @@
1
+ import {
2
+ getValidCredentials
3
+ } from "./chunk-EGWK6SRQ.js";
4
+ import {
5
+ getConfig
6
+ } from "./chunk-U73SABXK.js";
7
+
8
+ // src/lib/api-client.ts
9
+ import { ChainPatrolApiClient } from "@chainpatrol/sdk/api";
10
+
11
+ // src/lib/credential-provider.ts
12
+ function createCliCredentialProvider() {
13
+ return () => {
14
+ const envKey = process.env.CHAINPATROL_API_KEY;
15
+ if (envKey && envKey.trim().length > 0) {
16
+ return { kind: "api-key", value: envKey.trim() };
17
+ }
18
+ return { kind: "bearer", value: getValidCredentials().accessToken };
19
+ };
20
+ }
21
+
22
+ // src/lib/api-client.ts
23
+ import {
24
+ DETECTION_CONFIDENCE_LEVELS,
25
+ DETECTION_REPORTED_FILTERS,
26
+ LIVENESS_FILTER_VALUES,
27
+ LIVENESS_STATUSES,
28
+ ORGANIZATION_METRICS_INCLUDE_FIELDS,
29
+ REPORT_REVIEW_DECISIONS,
30
+ REPORT_STATUSES,
31
+ TAKEDOWN_SORT_KEYS,
32
+ TAKEDOWN_STATUSES,
33
+ WATCHLIST_FILTER_VALUES
34
+ } from "@chainpatrol/sdk/api";
35
+ function createApiClient(options) {
36
+ const config = getConfig();
37
+ let credential;
38
+ if (options?.getCredential) {
39
+ credential = options.getCredential;
40
+ } else if (options?.getToken) {
41
+ const getToken = options.getToken;
42
+ credential = () => ({ kind: "bearer", value: getToken() });
43
+ } else {
44
+ credential = createCliCredentialProvider();
45
+ }
46
+ return new ChainPatrolApiClient({
47
+ baseUrl: options?.apiUrl ?? config.apiUrl,
48
+ credential
49
+ });
50
+ }
51
+
52
+ export {
53
+ createApiClient,
54
+ DETECTION_CONFIDENCE_LEVELS,
55
+ DETECTION_REPORTED_FILTERS,
56
+ LIVENESS_FILTER_VALUES,
57
+ LIVENESS_STATUSES,
58
+ ORGANIZATION_METRICS_INCLUDE_FIELDS,
59
+ REPORT_REVIEW_DECISIONS,
60
+ REPORT_STATUSES,
61
+ TAKEDOWN_SORT_KEYS,
62
+ TAKEDOWN_STATUSES,
63
+ WATCHLIST_FILTER_VALUES
64
+ };
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-VFT3TD3E.js";
9
9
  import {
10
10
  createApiClient
11
- } from "./chunk-GOQL7UCG.js";
11
+ } from "./chunk-OFUIYMPD.js";
12
12
  import {
13
13
  DateTime
14
14
  } from "./chunk-TFCNKBRC.js";