@prosopo/cli 3.6.73 → 3.6.75

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 (59) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +37 -27
  2. package/.turbo/turbo-build$colon$tsc.log +27 -27
  3. package/.turbo/turbo-build.log +30 -27
  4. package/CHANGELOG.md +32 -0
  5. package/dist/RateLimiter.js +118 -118
  6. package/dist/_virtual/_rolldown/runtime.js +3 -0
  7. package/dist/argv.js +37 -36
  8. package/dist/bundle/decodeBehavior-BnJdECMR.js +233 -0
  9. package/dist/bundle/decodeSimd-hDznYwxo.js +218 -0
  10. package/dist/bundle/i18nBackend-C078WszN.js +3553 -0
  11. package/dist/bundle/i18nFrontend-pIqw8hl9.js +850 -0
  12. package/dist/bundle/i18next-q3w8LsnI.js +1213 -0
  13. package/dist/bundle/node-ponyfill-BXKwLYwg.js +1534 -0
  14. package/dist/bundle/provider.cli.bundle.js +102274 -131288
  15. package/dist/bundle/src-DhRyWllF.js +1880 -0
  16. package/dist/cjs/RateLimiter.cjs +118 -118
  17. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  18. package/dist/cjs/argv.cjs +41 -38
  19. package/dist/cjs/cli.cjs +32 -43
  20. package/dist/cjs/commands/ensureExternalIndexes.cjs +26 -27
  21. package/dist/cjs/commands/ensureIndexes.cjs +24 -25
  22. package/dist/cjs/commands/index.cjs +18 -20
  23. package/dist/cjs/commands/migrateAbuserScoreThreshold.cjs +54 -65
  24. package/dist/cjs/commands/providerSetDataset.cjs +45 -59
  25. package/dist/cjs/commands/siteKeyRegister.cjs +93 -105
  26. package/dist/cjs/commands/siteKeyRegisterApi.cjs +84 -102
  27. package/dist/cjs/commands/storeCaptchasExternally.cjs +24 -24
  28. package/dist/cjs/commands/updateSpamEmailDomains.cjs +42 -49
  29. package/dist/cjs/commands/validators.cjs +18 -37
  30. package/dist/cjs/commands/version.cjs +14 -15
  31. package/dist/cjs/files.cjs +32 -30
  32. package/dist/cjs/index.cjs +15 -17
  33. package/dist/cjs/process.env.cjs +14 -25
  34. package/dist/cjs/prosopo.config.cjs +108 -132
  35. package/dist/cjs/reloader.cjs +54 -63
  36. package/dist/cjs/start.cjs +59 -81
  37. package/dist/cli.js +27 -37
  38. package/dist/commands/ensureExternalIndexes.js +24 -26
  39. package/dist/commands/ensureIndexes.js +22 -24
  40. package/dist/commands/index.js +10 -20
  41. package/dist/commands/migrateAbuserScoreThreshold.js +52 -64
  42. package/dist/commands/providerSetDataset.js +41 -41
  43. package/dist/commands/siteKeyRegister.js +90 -103
  44. package/dist/commands/siteKeyRegisterApi.js +82 -101
  45. package/dist/commands/storeCaptchasExternally.js +22 -23
  46. package/dist/commands/updateSpamEmailDomains.js +40 -48
  47. package/dist/commands/validators.js +15 -37
  48. package/dist/commands/version.js +13 -15
  49. package/dist/files.js +28 -30
  50. package/dist/index.js +5 -16
  51. package/dist/process.env.js +14 -28
  52. package/dist/prosopo.config.js +108 -131
  53. package/dist/reloader.js +49 -61
  54. package/dist/start.js +57 -79
  55. package/package.json +16 -16
  56. package/dist/bundle/decodeBehavior-Btp_pZCR.js +0 -224
  57. package/dist/bundle/decodeSimd-Cz4sdHHN.js +0 -212
  58. package/dist/bundle/i18nBackend-BiuZSvrn.js +0 -5366
  59. package/dist/bundle/index-DUVLsNmB.js +0 -2371
@@ -1,27 +1,25 @@
1
+ import { LogLevel, getLogger } from "@prosopo/logger";
1
2
  import { ProviderEnvironment } from "@prosopo/env";
2
- import { getLogger, LogLevel } from "@prosopo/logger";
3
3
  import { Tasks } from "@prosopo/provider";
4
- const commandEnsureIndexes = (pair, config, cmdArgs) => {
5
- const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.ensure_indexes");
6
- return {
7
- command: "ensure_indexes",
8
- describe: "Ensure indexes for internal database",
9
- handler: async () => {
10
- try {
11
- const env = new ProviderEnvironment(config, pair);
12
- await env.isReady();
13
- const tasks = new Tasks(env);
14
- if (!env.config.mongoCaptchaUri) {
15
- throw new Error("mongoCaptchaUri not set in config");
16
- }
17
- await tasks.db.ensureIndexes();
18
- } catch (err) {
19
- logger.error(() => ({ err }));
20
- }
21
- },
22
- middlewares: []
23
- };
24
- };
25
- export {
26
- commandEnsureIndexes as default
4
+ //#region src/commands/ensureIndexes.ts
5
+ var ensureIndexes_default = (pair, config, cmdArgs) => {
6
+ const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.ensure_indexes");
7
+ return {
8
+ command: "ensure_indexes",
9
+ describe: "Ensure indexes for internal database",
10
+ handler: async () => {
11
+ try {
12
+ const env = new ProviderEnvironment(config, pair);
13
+ await env.isReady();
14
+ const tasks = new Tasks(env);
15
+ if (!env.config.mongoCaptchaUri) throw new Error("mongoCaptchaUri not set in config");
16
+ await tasks.db.ensureIndexes();
17
+ } catch (err) {
18
+ logger.error(() => ({ err }));
19
+ }
20
+ },
21
+ middlewares: []
22
+ };
27
23
  };
24
+ //#endregion
25
+ export { ensureIndexes_default as default };
@@ -1,20 +1,10 @@
1
- import { default as default2 } from "./providerSetDataset.js";
2
- import { default as default3 } from "./storeCaptchasExternally.js";
3
- import { default as default4 } from "./updateSpamEmailDomains.js";
4
- import { default as default5 } from "./version.js";
5
- import { default as default6 } from "./siteKeyRegister.js";
6
- import { default as default7 } from "./siteKeyRegisterApi.js";
7
- import { default as default8 } from "./ensureExternalIndexes.js";
8
- import { default as default9 } from "./ensureIndexes.js";
9
- import { default as default10 } from "./migrateAbuserScoreThreshold.js";
10
- export {
11
- default8 as commandEnsureExternalIndexes,
12
- default9 as commandEnsureIndexes,
13
- default10 as commandMigrateAbuserScoreThreshold,
14
- default2 as commandProviderSetDataset,
15
- default6 as commandSiteKeyRegister,
16
- default7 as commandSiteKeyRegisterApi,
17
- default3 as commandStoreCaptchasExternally,
18
- default4 as commandUpdateSpamEmailDomains,
19
- default5 as commandVersion
20
- };
1
+ import providerSetDataset_default from "./providerSetDataset.js";
2
+ import storeCaptchasExternally_default from "./storeCaptchasExternally.js";
3
+ import updateSpamEmailDomains_default from "./updateSpamEmailDomains.js";
4
+ import version_default from "./version.js";
5
+ import siteKeyRegister_default from "./siteKeyRegister.js";
6
+ import siteKeyRegisterApi_default from "./siteKeyRegisterApi.js";
7
+ import ensureExternalIndexes_default from "./ensureExternalIndexes.js";
8
+ import ensureIndexes_default from "./ensureIndexes.js";
9
+ import migrateAbuserScoreThreshold_default from "./migrateAbuserScoreThreshold.js";
10
+ export { ensureExternalIndexes_default as commandEnsureExternalIndexes, ensureIndexes_default as commandEnsureIndexes, migrateAbuserScoreThreshold_default as commandMigrateAbuserScoreThreshold, providerSetDataset_default as commandProviderSetDataset, siteKeyRegister_default as commandSiteKeyRegister, siteKeyRegisterApi_default as commandSiteKeyRegisterApi, storeCaptchasExternally_default as commandStoreCaptchasExternally, updateSpamEmailDomains_default as commandUpdateSpamEmailDomains, version_default as commandVersion };
@@ -1,67 +1,55 @@
1
+ import { LogLevel, getLogger } from "@prosopo/logger";
1
2
  import { ProviderEnvironment } from "@prosopo/env";
2
- import { getLogger, LogLevel } from "@prosopo/logger";
3
3
  import { Tasks } from "@prosopo/provider";
4
- const commandMigrateAbuserScoreThreshold = (pair, config, cmdArgs) => {
5
- const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.migrate_abuser_score_threshold");
6
- return {
7
- command: "migrate_abuser_score_threshold",
8
- describe: "Add abuserScoreThreshold field (default 0) to trafficFilter in provider client records",
9
- builder: (yargs) => yargs.option("dryRun", {
10
- type: "boolean",
11
- default: false,
12
- description: "Run without making changes to verify the migration"
13
- }),
14
- handler: async (argv) => {
15
- try {
16
- const dryRun = argv.dryRun ?? false;
17
- logger.info(() => ({
18
- msg: "Starting abuserScoreThreshold migration on provider DB...",
19
- data: { dryRun }
20
- }));
21
- const env = new ProviderEnvironment(config, pair);
22
- await env.isReady();
23
- const tasks = new Tasks(env);
24
- const clientModel = tasks.db.tables.client;
25
- if (!clientModel) {
26
- throw new Error("Client table not available");
27
- }
28
- const filter = {
29
- "settings.trafficFilter": { $exists: true },
30
- "settings.trafficFilter.abuserScoreThreshold": { $exists: false }
31
- };
32
- const count = await clientModel.countDocuments(filter);
33
- logger.info(() => ({
34
- msg: `Found ${count} client records needing migration`
35
- }));
36
- if (!dryRun && count > 0) {
37
- const result = await clientModel.updateMany(filter, {
38
- $set: {
39
- "settings.trafficFilter.abuserScoreThreshold": 0
40
- }
41
- });
42
- logger.info(() => ({
43
- msg: `Updated ${result.modifiedCount} client records`
44
- }));
45
- }
46
- logger.info(() => ({
47
- msg: "Migration completed",
48
- data: { recordsFound: count, dryRun }
49
- }));
50
- if (dryRun) {
51
- logger.info(() => ({
52
- msg: "DRY RUN: No changes were made. Run without --dryRun to apply changes."
53
- }));
54
- }
55
- } catch (err) {
56
- logger.error(() => ({
57
- err,
58
- msg: "Failed to migrate abuserScoreThreshold"
59
- }));
60
- }
61
- },
62
- middlewares: []
63
- };
64
- };
65
- export {
66
- commandMigrateAbuserScoreThreshold as default
4
+ //#region src/commands/migrateAbuserScoreThreshold.ts
5
+ var migrateAbuserScoreThreshold_default = (pair, config, cmdArgs) => {
6
+ const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.migrate_abuser_score_threshold");
7
+ return {
8
+ command: "migrate_abuser_score_threshold",
9
+ describe: "Add abuserScoreThreshold field (default 0) to trafficFilter in provider client records",
10
+ builder: (yargs) => yargs.option("dryRun", {
11
+ type: "boolean",
12
+ default: false,
13
+ description: "Run without making changes to verify the migration"
14
+ }),
15
+ handler: async (argv) => {
16
+ try {
17
+ const dryRun = argv.dryRun ?? false;
18
+ logger.info(() => ({
19
+ msg: "Starting abuserScoreThreshold migration on provider DB...",
20
+ data: { dryRun }
21
+ }));
22
+ const env = new ProviderEnvironment(config, pair);
23
+ await env.isReady();
24
+ const clientModel = new Tasks(env).db.tables.client;
25
+ if (!clientModel) throw new Error("Client table not available");
26
+ const filter = {
27
+ "settings.trafficFilter": { $exists: true },
28
+ "settings.trafficFilter.abuserScoreThreshold": { $exists: false }
29
+ };
30
+ const count = await clientModel.countDocuments(filter);
31
+ logger.info(() => ({ msg: `Found ${count} client records needing migration` }));
32
+ if (!dryRun && count > 0) {
33
+ const result = await clientModel.updateMany(filter, { $set: { "settings.trafficFilter.abuserScoreThreshold": 0 } });
34
+ logger.info(() => ({ msg: `Updated ${result.modifiedCount} client records` }));
35
+ }
36
+ logger.info(() => ({
37
+ msg: "Migration completed",
38
+ data: {
39
+ recordsFound: count,
40
+ dryRun
41
+ }
42
+ }));
43
+ if (dryRun) logger.info(() => ({ msg: "DRY RUN: No changes were made. Run without --dryRun to apply changes." }));
44
+ } catch (err) {
45
+ logger.error(() => ({
46
+ err,
47
+ msg: "Failed to migrate abuserScoreThreshold"
48
+ }));
49
+ }
50
+ },
51
+ middlewares: []
52
+ };
67
53
  };
54
+ //#endregion
55
+ export { migrateAbuserScoreThreshold_default as default };
@@ -1,44 +1,44 @@
1
+ import { loadJSONFile } from "../files.js";
2
+ import { LogLevel, getLogger } from "@prosopo/logger";
1
3
  import { ProviderEnvironment } from "@prosopo/env";
2
- import { getLogger, LogLevel } from "@prosopo/logger";
3
4
  import { Tasks } from "@prosopo/provider";
4
- import * as z from "zod";
5
- import { loadJSONFile } from "../files.js";
6
- const commandProviderSetDataset = (pair, config, cmdArgs) => {
7
- const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.provider_set_data_set");
8
- return {
9
- command: "provider_set_data_set",
10
- describe: "Add a dataset as a Provider",
11
- builder: (yargs) => yargs.option("file", {
12
- type: "string",
13
- demand: true,
14
- desc: "The file path of a JSON dataset file"
15
- }),
16
- handler: async (argv) => {
17
- try {
18
- const env = new ProviderEnvironment(config, pair);
19
- await env.isReady();
20
- const tasks = new Tasks(env);
21
- const file = z.string().parse(argv.file);
22
- const jsonFile = loadJSONFile(file);
23
- logger.info(() => ({
24
- data: { file },
25
- msg: "Loading JSON"
26
- }));
27
- const result = await tasks.datasetManager.providerSetDatasetFromFile(jsonFile);
28
- logger.info(() => ({
29
- data: { file },
30
- msg: "Loaded JSON"
31
- }));
32
- } catch (err) {
33
- logger.error(() => ({
34
- err,
35
- msg: "Error loading JSON"
36
- }));
37
- }
38
- },
39
- middlewares: []
40
- };
41
- };
42
- export {
43
- commandProviderSetDataset as default
5
+ import * as z$1 from "zod";
6
+ //#region src/commands/providerSetDataset.ts
7
+ var providerSetDataset_default = (pair, config, cmdArgs) => {
8
+ const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.provider_set_data_set");
9
+ return {
10
+ command: "provider_set_data_set",
11
+ describe: "Add a dataset as a Provider",
12
+ builder: (yargs) => yargs.option("file", {
13
+ type: "string",
14
+ demand: true,
15
+ desc: "The file path of a JSON dataset file"
16
+ }),
17
+ handler: async (argv) => {
18
+ try {
19
+ const env = new ProviderEnvironment(config, pair);
20
+ await env.isReady();
21
+ const tasks = new Tasks(env);
22
+ const file = z$1.string().parse(argv.file);
23
+ const jsonFile = loadJSONFile(file);
24
+ logger.info(() => ({
25
+ data: { file },
26
+ msg: "Loading JSON"
27
+ }));
28
+ await tasks.datasetManager.providerSetDatasetFromFile(jsonFile);
29
+ logger.info(() => ({
30
+ data: { file },
31
+ msg: "Loaded JSON"
32
+ }));
33
+ } catch (err) {
34
+ logger.error(() => ({
35
+ err,
36
+ msg: "Error loading JSON"
37
+ }));
38
+ }
39
+ },
40
+ middlewares: []
41
+ };
44
42
  };
43
+ //#endregion
44
+ export { providerSetDataset_default as default };
@@ -1,108 +1,95 @@
1
+ import { validateSiteKey } from "./validators.js";
2
+ import { LogLevel, getLogger } from "@prosopo/logger";
1
3
  import { ProviderEnvironment } from "@prosopo/env";
2
- import { getLogger, LogLevel } from "@prosopo/logger";
3
4
  import { Tasks } from "@prosopo/provider";
4
- import { imageMaxRoundsDefault, CaptchaTypeSpec, Tier, ContextType, contextAwareThresholdDefault, puzzleToleranceDefault } from "@prosopo/types";
5
5
  import { z } from "zod";
6
- import { validateSiteKey } from "./validators.js";
7
- const SiteKeyRegisterCommandArgsSpec = z.object({
8
- sitekey: z.string(),
9
- tier: z.nativeEnum(Tier),
10
- captcha_type: CaptchaTypeSpec,
11
- frictionless_threshold: z.number().max(1).min(0),
12
- pow_difficulty: z.number(),
13
- domains: z.array(z.string()),
14
- image_threshold: z.number().max(1).min(0),
15
- image_max_rounds: z.number().int().positive().optional().default(imageMaxRoundsDefault)
6
+ import { CaptchaTypeSpec, ContextType, Tier, contextAwareThresholdDefault, imageMaxRoundsDefault, puzzleToleranceDefault } from "@prosopo/types";
7
+ //#region src/commands/siteKeyRegister.ts
8
+ var SiteKeyRegisterCommandArgsSpec = z.object({
9
+ sitekey: z.string(),
10
+ tier: z.nativeEnum(Tier),
11
+ captcha_type: CaptchaTypeSpec,
12
+ frictionless_threshold: z.number().max(1).min(0),
13
+ pow_difficulty: z.number(),
14
+ domains: z.array(z.string()),
15
+ image_threshold: z.number().max(1).min(0),
16
+ image_max_rounds: z.number().int().positive().optional().default(imageMaxRoundsDefault)
16
17
  });
17
- const commandSiteKeyRegister = (pair, config, cmdArgs) => {
18
- const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.dapp_register");
19
- return {
20
- command: "site_key_register <sitekey> <tier>",
21
- describe: "Register a Site Key",
22
- builder: (yargs) => yargs.positional("sitekey", {
23
- type: "string",
24
- demandOption: true,
25
- desc: "The AccountId of the application to register the Site Key with"
26
- }).option("tier", {
27
- type: "string",
28
- demandOption: false,
29
- desc: "The AccountId of the application to register the Site Key with"
30
- }).option("captcha_type", {
31
- type: "string",
32
- demandOption: false,
33
- desc: "Captcha type for settings"
34
- }).option("domains", {
35
- type: "array",
36
- demandOption: false,
37
- desc: "Domains for settings"
38
- }).option("frictionless_threshold", {
39
- type: "number",
40
- demandOption: false,
41
- desc: "Frictionless threshold for settings"
42
- }).option("pow_difficulty", {
43
- type: "number",
44
- demandOption: false,
45
- desc: "POW difficulty for settings"
46
- }).option("image_threshold", {
47
- type: "number",
48
- demandOption: false,
49
- desc: "Image threshold for settings"
50
- }).option("image_max_rounds", {
51
- type: "number",
52
- demandOption: false,
53
- desc: "Image max rounds for settings"
54
- }),
55
- handler: async (argv) => {
56
- try {
57
- const env = new ProviderEnvironment(config, pair);
58
- await env.isReady();
59
- const {
60
- sitekey,
61
- tier,
62
- captcha_type,
63
- frictionless_threshold,
64
- pow_difficulty,
65
- domains,
66
- image_threshold,
67
- image_max_rounds
68
- } = SiteKeyRegisterCommandArgsSpec.parse(argv);
69
- const tasks = new Tasks(env);
70
- await tasks.clientTaskManager.registerSiteKey(sitekey, tier, {
71
- captchaType: CaptchaTypeSpec.parse(captcha_type),
72
- frictionlessThreshold: frictionless_threshold,
73
- domains: domains || [],
74
- powDifficulty: pow_difficulty,
75
- imageThreshold: image_threshold,
76
- imageMaxRounds: image_max_rounds,
77
- puzzleTolerance: puzzleToleranceDefault,
78
- disallowWebView: false,
79
- contextAware: {
80
- enabled: false,
81
- contexts: {
82
- [ContextType.Default]: {
83
- type: ContextType.Default,
84
- threshold: contextAwareThresholdDefault
85
- }
86
- }
87
- },
88
- verifiedTimeout: 6e4,
89
- solutionTimeout: 6e4
90
- });
91
- logger.info(() => ({
92
- data: { sitekey },
93
- msg: "Site Key registered"
94
- }));
95
- } catch (err) {
96
- logger.error(() => ({
97
- err,
98
- msg: "Error registering Site Key"
99
- }));
100
- }
101
- },
102
- middlewares: [validateSiteKey]
103
- };
104
- };
105
- export {
106
- SiteKeyRegisterCommandArgsSpec,
107
- commandSiteKeyRegister as default
18
+ var siteKeyRegister_default = (pair, config, cmdArgs) => {
19
+ const logger = cmdArgs?.logger || getLogger(LogLevel.enum.info, "cli.dapp_register");
20
+ return {
21
+ command: "site_key_register <sitekey> <tier>",
22
+ describe: "Register a Site Key",
23
+ builder: (yargs) => yargs.positional("sitekey", {
24
+ type: "string",
25
+ demandOption: true,
26
+ desc: "The AccountId of the application to register the Site Key with"
27
+ }).option("tier", {
28
+ type: "string",
29
+ demandOption: false,
30
+ desc: "The AccountId of the application to register the Site Key with"
31
+ }).option("captcha_type", {
32
+ type: "string",
33
+ demandOption: false,
34
+ desc: "Captcha type for settings"
35
+ }).option("domains", {
36
+ type: "array",
37
+ demandOption: false,
38
+ desc: "Domains for settings"
39
+ }).option("frictionless_threshold", {
40
+ type: "number",
41
+ demandOption: false,
42
+ desc: "Frictionless threshold for settings"
43
+ }).option("pow_difficulty", {
44
+ type: "number",
45
+ demandOption: false,
46
+ desc: "POW difficulty for settings"
47
+ }).option("image_threshold", {
48
+ type: "number",
49
+ demandOption: false,
50
+ desc: "Image threshold for settings"
51
+ }).option("image_max_rounds", {
52
+ type: "number",
53
+ demandOption: false,
54
+ desc: "Image max rounds for settings"
55
+ }),
56
+ handler: async (argv) => {
57
+ try {
58
+ const env = new ProviderEnvironment(config, pair);
59
+ await env.isReady();
60
+ const { sitekey, tier, captcha_type, frictionless_threshold, pow_difficulty, domains, image_threshold, image_max_rounds } = SiteKeyRegisterCommandArgsSpec.parse(argv);
61
+ await new Tasks(env).clientTaskManager.registerSiteKey(sitekey, tier, {
62
+ captchaType: CaptchaTypeSpec.parse(captcha_type),
63
+ frictionlessThreshold: frictionless_threshold,
64
+ domains: domains || [],
65
+ powDifficulty: pow_difficulty,
66
+ imageThreshold: image_threshold,
67
+ imageMaxRounds: image_max_rounds,
68
+ puzzleTolerance: puzzleToleranceDefault,
69
+ disallowWebView: false,
70
+ contextAware: {
71
+ enabled: false,
72
+ contexts: { [ContextType.Default]: {
73
+ type: ContextType.Default,
74
+ threshold: contextAwareThresholdDefault
75
+ } }
76
+ },
77
+ verifiedTimeout: 6e4,
78
+ solutionTimeout: 6e4
79
+ });
80
+ logger.info(() => ({
81
+ data: { sitekey },
82
+ msg: "Site Key registered"
83
+ }));
84
+ } catch (err) {
85
+ logger.error(() => ({
86
+ err,
87
+ msg: "Error registering Site Key"
88
+ }));
89
+ }
90
+ },
91
+ middlewares: [validateSiteKey]
92
+ };
108
93
  };
94
+ //#endregion
95
+ export { SiteKeyRegisterCommandArgsSpec, siteKeyRegister_default as default };