@grantex/cli 0.1.5 → 0.1.7

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 (85) hide show
  1. package/README.md +177 -52
  2. package/dist/commands/agents.d.ts.map +1 -1
  3. package/dist/commands/agents.js +50 -11
  4. package/dist/commands/agents.js.map +1 -1
  5. package/dist/commands/anomalies.d.ts.map +1 -1
  6. package/dist/commands/anomalies.js +10 -2
  7. package/dist/commands/anomalies.js.map +1 -1
  8. package/dist/commands/audit.d.ts.map +1 -1
  9. package/dist/commands/audit.js +65 -3
  10. package/dist/commands/audit.js.map +1 -1
  11. package/dist/commands/authorize.d.ts +3 -0
  12. package/dist/commands/authorize.d.ts.map +1 -0
  13. package/dist/commands/authorize.js +42 -0
  14. package/dist/commands/authorize.js.map +1 -0
  15. package/dist/commands/billing.d.ts.map +1 -1
  16. package/dist/commands/billing.js +10 -2
  17. package/dist/commands/billing.js.map +1 -1
  18. package/dist/commands/budgets.d.ts +3 -0
  19. package/dist/commands/budgets.d.ts.map +1 -0
  20. package/dist/commands/budgets.js +83 -0
  21. package/dist/commands/budgets.js.map +1 -0
  22. package/dist/commands/compliance.d.ts.map +1 -1
  23. package/dist/commands/compliance.js +13 -3
  24. package/dist/commands/compliance.js.map +1 -1
  25. package/dist/commands/credentials.d.ts +3 -0
  26. package/dist/commands/credentials.d.ts.map +1 -0
  27. package/dist/commands/credentials.js +106 -0
  28. package/dist/commands/credentials.js.map +1 -0
  29. package/dist/commands/domains.d.ts +3 -0
  30. package/dist/commands/domains.d.ts.map +1 -0
  31. package/dist/commands/domains.js +70 -0
  32. package/dist/commands/domains.js.map +1 -0
  33. package/dist/commands/events.d.ts +3 -0
  34. package/dist/commands/events.d.ts.map +1 -0
  35. package/dist/commands/events.js +34 -0
  36. package/dist/commands/events.js.map +1 -0
  37. package/dist/commands/grants.d.ts.map +1 -1
  38. package/dist/commands/grants.js +58 -3
  39. package/dist/commands/grants.js.map +1 -1
  40. package/dist/commands/me.d.ts +3 -0
  41. package/dist/commands/me.d.ts.map +1 -0
  42. package/dist/commands/me.js +46 -0
  43. package/dist/commands/me.js.map +1 -0
  44. package/dist/commands/passports.d.ts +3 -0
  45. package/dist/commands/passports.d.ts.map +1 -0
  46. package/dist/commands/passports.js +89 -0
  47. package/dist/commands/passports.js.map +1 -0
  48. package/dist/commands/policies.d.ts.map +1 -1
  49. package/dist/commands/policies.js +18 -2
  50. package/dist/commands/policies.js.map +1 -1
  51. package/dist/commands/principal-sessions.d.ts +3 -0
  52. package/dist/commands/principal-sessions.d.ts.map +1 -0
  53. package/dist/commands/principal-sessions.js +31 -0
  54. package/dist/commands/principal-sessions.js.map +1 -0
  55. package/dist/commands/scim.d.ts.map +1 -1
  56. package/dist/commands/scim.js +96 -4
  57. package/dist/commands/scim.js.map +1 -1
  58. package/dist/commands/sso.d.ts.map +1 -1
  59. package/dist/commands/sso.js +25 -2
  60. package/dist/commands/sso.js.map +1 -1
  61. package/dist/commands/tokens.d.ts.map +1 -1
  62. package/dist/commands/tokens.js +60 -2
  63. package/dist/commands/tokens.js.map +1 -1
  64. package/dist/commands/usage.d.ts +3 -0
  65. package/dist/commands/usage.d.ts.map +1 -0
  66. package/dist/commands/usage.js +44 -0
  67. package/dist/commands/usage.js.map +1 -0
  68. package/dist/commands/vault.d.ts +3 -0
  69. package/dist/commands/vault.d.ts.map +1 -0
  70. package/dist/commands/vault.js +117 -0
  71. package/dist/commands/vault.js.map +1 -0
  72. package/dist/commands/webauthn.d.ts +3 -0
  73. package/dist/commands/webauthn.d.ts.map +1 -0
  74. package/dist/commands/webauthn.js +78 -0
  75. package/dist/commands/webauthn.js.map +1 -0
  76. package/dist/commands/webhooks.d.ts.map +1 -1
  77. package/dist/commands/webhooks.js +10 -2
  78. package/dist/commands/webhooks.js.map +1 -1
  79. package/dist/format.d.ts +13 -5
  80. package/dist/format.d.ts.map +1 -1
  81. package/dist/format.js +42 -8
  82. package/dist/format.js.map +1 -1
  83. package/dist/index.js +36 -7
  84. package/dist/index.js.map +1 -1
  85. package/package.json +1 -1
@@ -1,15 +1,45 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
3
  import { requireClient } from '../client.js';
4
- import { printRecord, shortDate } from '../format.js';
4
+ import { printRecord, shortDate, isJsonMode } from '../format.js';
5
5
  export function tokensCommand() {
6
- const cmd = new Command('tokens').description('Verify and revoke grant tokens');
6
+ const cmd = new Command('tokens').description('Exchange, verify, refresh, and revoke grant tokens');
7
+ cmd
8
+ .command('exchange')
9
+ .description('Exchange an authorization code for a grant token')
10
+ .requiredOption('--code <code>', 'Authorization code from consent approval')
11
+ .requiredOption('--agent-id <agentId>', 'Agent ID that was authorized')
12
+ .option('--code-verifier <verifier>', 'PKCE code verifier (if challenge was sent)')
13
+ .action(async (opts) => {
14
+ const client = await requireClient();
15
+ const res = await client.tokens.exchange({
16
+ code: opts.code,
17
+ agentId: opts.agentId,
18
+ ...(opts.codeVerifier !== undefined ? { codeVerifier: opts.codeVerifier } : {}),
19
+ });
20
+ if (isJsonMode()) {
21
+ console.log(JSON.stringify(res, null, 2));
22
+ return;
23
+ }
24
+ console.log(chalk.green('✓') + ' Token exchanged successfully.');
25
+ printRecord({
26
+ grantToken: res.grantToken.slice(0, 40) + '...',
27
+ grantId: res.grantId,
28
+ scopes: res.scopes.join(', '),
29
+ refreshToken: res.refreshToken,
30
+ expiresAt: shortDate(res.expiresAt),
31
+ });
32
+ });
7
33
  cmd
8
34
  .command('verify <token>')
9
35
  .description('Verify a grant token (online check)')
10
36
  .action(async (token) => {
11
37
  const client = await requireClient();
12
38
  const res = await client.tokens.verify(token);
39
+ if (isJsonMode()) {
40
+ console.log(JSON.stringify(res, null, 2));
41
+ return;
42
+ }
13
43
  if (!res.valid) {
14
44
  console.error(chalk.red('✗') + ' Token is invalid or has been revoked.');
15
45
  process.exit(1);
@@ -23,12 +53,40 @@ export function tokensCommand() {
23
53
  expiresAt: res.expiresAt ? shortDate(res.expiresAt) : '',
24
54
  });
25
55
  });
56
+ cmd
57
+ .command('refresh')
58
+ .description('Refresh a grant token (rotates refresh token)')
59
+ .requiredOption('--refresh-token <token>', 'Current refresh token')
60
+ .requiredOption('--agent-id <agentId>', 'Agent ID for the grant')
61
+ .action(async (opts) => {
62
+ const client = await requireClient();
63
+ const res = await client.tokens.refresh({
64
+ refreshToken: opts.refreshToken,
65
+ agentId: opts.agentId,
66
+ });
67
+ if (isJsonMode()) {
68
+ console.log(JSON.stringify(res, null, 2));
69
+ return;
70
+ }
71
+ console.log(chalk.green('✓') + ' Token refreshed successfully.');
72
+ printRecord({
73
+ grantToken: res.grantToken.slice(0, 40) + '...',
74
+ grantId: res.grantId,
75
+ scopes: res.scopes.join(', '),
76
+ refreshToken: res.refreshToken,
77
+ expiresAt: shortDate(res.expiresAt),
78
+ });
79
+ });
26
80
  cmd
27
81
  .command('revoke <jti>')
28
82
  .description('Revoke a grant token by JTI')
29
83
  .action(async (jti) => {
30
84
  const client = await requireClient();
31
85
  await client.tokens.revoke(jti);
86
+ if (isJsonMode()) {
87
+ console.log(JSON.stringify({ revoked: jti }));
88
+ return;
89
+ }
32
90
  console.log(chalk.green('✓') + ` Token ${jti} revoked.`);
33
91
  });
34
92
  return cmd;
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEhF,GAAG;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,wCAAwC,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;QACnD,WAAW,CAAC;YACV,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;YAC9B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;SACzD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function usageCommand(): Command;
3
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,IAAI,OAAO,CA8CtC"}
@@ -0,0 +1,44 @@
1
+ import { Command } from 'commander';
2
+ import { requireClient } from '../client.js';
3
+ import { printRecord, printTable, isJsonMode } from '../format.js';
4
+ export function usageCommand() {
5
+ const cmd = new Command('usage').description('View API usage metrics');
6
+ cmd
7
+ .command('current')
8
+ .description('Get current period usage')
9
+ .action(async () => {
10
+ const client = await requireClient();
11
+ const res = await client.usage.current();
12
+ if (isJsonMode()) {
13
+ console.log(JSON.stringify(res, null, 2));
14
+ return;
15
+ }
16
+ printRecord({
17
+ developerId: res.developerId,
18
+ period: res.period,
19
+ tokenExchanges: String(res.tokenExchanges),
20
+ authorizations: String(res.authorizations),
21
+ verifications: String(res.verifications),
22
+ totalRequests: String(res.totalRequests),
23
+ });
24
+ });
25
+ cmd
26
+ .command('history')
27
+ .description('Get historical usage')
28
+ .option('--days <n>', 'Number of days to look back (default: 30)', parseInt)
29
+ .action(async (opts) => {
30
+ const client = await requireClient();
31
+ const res = await client.usage.history({
32
+ ...(opts.days !== undefined ? { days: opts.days } : {}),
33
+ });
34
+ printTable(res.entries.map((e) => ({
35
+ DATE: e.date,
36
+ EXCHANGES: String(e.tokenExchanges),
37
+ AUTHORIZATIONS: String(e.authorizations),
38
+ VERIFICATIONS: String(e.verifications),
39
+ TOTAL: String(e.totalRequests),
40
+ })), ['DATE', 'EXCHANGES', 'AUTHORIZATIONS', 'VERIFICATIONS', 'TOTAL'], res.entries.map((e) => ({ ...e })));
41
+ });
42
+ return cmd;
43
+ }
44
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAEvE,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,WAAW,CAAC;YACV,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;YAC1C,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;YAC1C,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;YACxC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,YAAY,EAAE,2CAA2C,EAAE,QAAQ,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAC;QACH,UAAU,CACR,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;YACnC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;YACxC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;SAC/B,CAAC,CAAC,EACH,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,CAAC,EACjE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function vaultCommand(): Command;
3
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,YAAY,IAAI,OAAO,CAmItC"}
@@ -0,0 +1,117 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { requireClient } from '../client.js';
4
+ import { printTable, printRecord, shortDate, isJsonMode } from '../format.js';
5
+ export function vaultCommand() {
6
+ const cmd = new Command('vault').description('Manage encrypted credential storage');
7
+ cmd
8
+ .command('list')
9
+ .description('List stored credentials')
10
+ .option('--principal <principalId>', 'Filter by principal ID')
11
+ .option('--service <service>', 'Filter by service name')
12
+ .action(async (opts) => {
13
+ const client = await requireClient();
14
+ const res = await client.vault.list({
15
+ ...(opts.principal !== undefined ? { principalId: opts.principal } : {}),
16
+ ...(opts.service !== undefined ? { service: opts.service } : {}),
17
+ });
18
+ printTable(res.credentials.map((c) => ({
19
+ ID: c.id,
20
+ PRINCIPAL: c.principalId,
21
+ SERVICE: c.service,
22
+ TYPE: c.credentialType,
23
+ EXPIRES: c.tokenExpiresAt ? shortDate(c.tokenExpiresAt) : '—',
24
+ CREATED: shortDate(c.createdAt),
25
+ })), ['ID', 'PRINCIPAL', 'SERVICE', 'TYPE', 'EXPIRES', 'CREATED'], res.credentials.map((c) => ({ ...c })));
26
+ });
27
+ cmd
28
+ .command('get <credentialId>')
29
+ .description('Get a stored credential by ID')
30
+ .action(async (credentialId) => {
31
+ const client = await requireClient();
32
+ const cred = await client.vault.get(credentialId);
33
+ if (isJsonMode()) {
34
+ console.log(JSON.stringify(cred, null, 2));
35
+ return;
36
+ }
37
+ printRecord({
38
+ id: cred.id,
39
+ principalId: cred.principalId,
40
+ service: cred.service,
41
+ credentialType: cred.credentialType,
42
+ tokenExpiresAt: cred.tokenExpiresAt ? shortDate(cred.tokenExpiresAt) : '—',
43
+ createdAt: shortDate(cred.createdAt),
44
+ updatedAt: shortDate(cred.updatedAt),
45
+ });
46
+ });
47
+ cmd
48
+ .command('store')
49
+ .description('Store a credential in the vault')
50
+ .requiredOption('--principal-id <principalId>', 'Principal who owns this credential')
51
+ .requiredOption('--service <service>', 'Service name (e.g. google, slack)')
52
+ .requiredOption('--access-token <token>', 'OAuth access token')
53
+ .option('--refresh-token <token>', 'OAuth refresh token')
54
+ .option('--credential-type <type>', 'Credential type (default: oauth2)')
55
+ .option('--token-expires-at <iso>', 'Token expiration (ISO date)')
56
+ .option('--metadata <json>', 'JSON metadata object')
57
+ .action(async (opts) => {
58
+ const client = await requireClient();
59
+ let metadata;
60
+ if (opts.metadata !== undefined) {
61
+ try {
62
+ metadata = JSON.parse(opts.metadata);
63
+ }
64
+ catch {
65
+ console.error('Error: --metadata must be valid JSON.');
66
+ process.exit(1);
67
+ }
68
+ }
69
+ const res = await client.vault.store({
70
+ principalId: opts.principalId,
71
+ service: opts.service,
72
+ accessToken: opts.accessToken,
73
+ ...(opts.refreshToken !== undefined ? { refreshToken: opts.refreshToken } : {}),
74
+ ...(opts.credentialType !== undefined ? { credentialType: opts.credentialType } : {}),
75
+ ...(opts.tokenExpiresAt !== undefined ? { tokenExpiresAt: opts.tokenExpiresAt } : {}),
76
+ ...(metadata !== undefined ? { metadata } : {}),
77
+ });
78
+ if (isJsonMode()) {
79
+ console.log(JSON.stringify(res, null, 2));
80
+ return;
81
+ }
82
+ console.log(chalk.green('✓') + ` Credential stored: ${res.id}`);
83
+ });
84
+ cmd
85
+ .command('delete <credentialId>')
86
+ .description('Delete a stored credential')
87
+ .action(async (credentialId) => {
88
+ const client = await requireClient();
89
+ await client.vault.delete(credentialId);
90
+ if (isJsonMode()) {
91
+ console.log(JSON.stringify({ deleted: credentialId }));
92
+ return;
93
+ }
94
+ console.log(chalk.green('✓') + ` Credential ${credentialId} deleted.`);
95
+ });
96
+ cmd
97
+ .command('exchange')
98
+ .description('Exchange a grant token for a stored service credential')
99
+ .requiredOption('--grant-token <jwt>', 'Grant token (JWT)')
100
+ .requiredOption('--service <service>', 'Service name to exchange for')
101
+ .action(async (opts) => {
102
+ const client = await requireClient();
103
+ const res = await client.vault.exchange(opts.grantToken, { service: opts.service });
104
+ if (isJsonMode()) {
105
+ console.log(JSON.stringify(res, null, 2));
106
+ return;
107
+ }
108
+ printRecord({
109
+ service: res.service,
110
+ credentialType: res.credentialType,
111
+ accessToken: res.accessToken.slice(0, 20) + '...',
112
+ tokenExpiresAt: res.tokenExpiresAt ?? '—',
113
+ });
114
+ });
115
+ return cmd;
116
+ }
117
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/commands/vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function webauthnCommand(): Command;
3
+ //# sourceMappingURL=webauthn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/commands/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,eAAe,IAAI,OAAO,CAmFzC"}
@@ -0,0 +1,78 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { requireClient } from '../client.js';
4
+ import { printTable, shortDate, isJsonMode } from '../format.js';
5
+ export function webauthnCommand() {
6
+ const cmd = new Command('webauthn').description('Manage FIDO2/WebAuthn credentials');
7
+ cmd
8
+ .command('register-options')
9
+ .description('Generate a WebAuthn registration challenge')
10
+ .requiredOption('--principal-id <principalId>', 'Principal to register for')
11
+ .action(async (opts) => {
12
+ const client = await requireClient();
13
+ const res = await client.webauthn.registerOptions({ principalId: opts.principalId });
14
+ if (isJsonMode()) {
15
+ console.log(JSON.stringify(res, null, 2));
16
+ return;
17
+ }
18
+ console.log(chalk.green('✓') + ` Registration challenge created: ${res.challengeId}`);
19
+ console.log('\nPass the publicKey options to your WebAuthn client:');
20
+ console.log(JSON.stringify(res.publicKey, null, 2));
21
+ });
22
+ cmd
23
+ .command('register-verify')
24
+ .description('Verify a WebAuthn registration response')
25
+ .requiredOption('--challenge-id <id>', 'Challenge ID from register-options')
26
+ .requiredOption('--response <json>', 'JSON attestation response from browser')
27
+ .option('--device-name <name>', 'Human-readable device name')
28
+ .action(async (opts) => {
29
+ const client = await requireClient();
30
+ let response;
31
+ try {
32
+ response = JSON.parse(opts.response);
33
+ }
34
+ catch {
35
+ console.error('Error: --response must be valid JSON.');
36
+ process.exit(1);
37
+ }
38
+ const res = await client.webauthn.registerVerify({
39
+ challengeId: opts.challengeId,
40
+ response,
41
+ ...(opts.deviceName !== undefined ? { deviceName: opts.deviceName } : {}),
42
+ });
43
+ if (isJsonMode()) {
44
+ console.log(JSON.stringify(res, null, 2));
45
+ return;
46
+ }
47
+ console.log(chalk.green('✓') + ` Credential registered: ${res.id}`);
48
+ });
49
+ cmd
50
+ .command('list <principalId>')
51
+ .description('List WebAuthn credentials for a principal')
52
+ .action(async (principalId) => {
53
+ const client = await requireClient();
54
+ const res = await client.webauthn.listCredentials(principalId);
55
+ printTable(res.credentials.map((c) => ({
56
+ ID: c.id,
57
+ DEVICE: c.deviceName ?? '—',
58
+ BACKED_UP: c.backedUp ? 'yes' : 'no',
59
+ TRANSPORTS: c.transports.join(', '),
60
+ CREATED: shortDate(c.createdAt),
61
+ LAST_USED: c.lastUsedAt ? shortDate(c.lastUsedAt) : '—',
62
+ })), ['ID', 'DEVICE', 'BACKED_UP', 'TRANSPORTS', 'CREATED', 'LAST_USED'], res.credentials.map((c) => ({ ...c })));
63
+ });
64
+ cmd
65
+ .command('delete <credentialId>')
66
+ .description('Delete a WebAuthn credential')
67
+ .action(async (credentialId) => {
68
+ const client = await requireClient();
69
+ await client.webauthn.deleteCredential(credentialId);
70
+ if (isJsonMode()) {
71
+ console.log(JSON.stringify({ deleted: credentialId }));
72
+ return;
73
+ }
74
+ console.log(chalk.green('✓') + ` Credential ${credentialId} deleted.`);
75
+ });
76
+ return cmd;
77
+ }
78
+ //# sourceMappingURL=webauthn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../../src/commands/webauthn.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,IAAI,OAAO,CAwDzC"}
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,IAAI,OAAO,CAiEzC"}
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
3
  import { requireClient } from '../client.js';
4
- import { printTable, shortDate } from '../format.js';
4
+ import { printTable, shortDate, isJsonMode } from '../format.js';
5
5
  const VALID_EVENTS = ['grant.created', 'grant.revoked', 'token.issued'];
6
6
  export function webhooksCommand() {
7
7
  const cmd = new Command('webhooks').description('Manage webhook endpoints');
@@ -16,7 +16,7 @@ export function webhooksCommand() {
16
16
  URL: w.url,
17
17
  EVENTS: w.events.join(', '),
18
18
  CREATED: shortDate(w.createdAt),
19
- })), ['ID', 'URL', 'EVENTS', 'CREATED']);
19
+ })), ['ID', 'URL', 'EVENTS', 'CREATED'], webhooks.map((w) => ({ ...w })));
20
20
  });
21
21
  cmd
22
22
  .command('create')
@@ -34,6 +34,10 @@ export function webhooksCommand() {
34
34
  }
35
35
  const client = await requireClient();
36
36
  const wh = await client.webhooks.create({ url: opts.url, events });
37
+ if (isJsonMode()) {
38
+ console.log(JSON.stringify(wh, null, 2));
39
+ return;
40
+ }
37
41
  console.log(chalk.green('✓') + ` Webhook registered: ${wh.id}`);
38
42
  console.log(`Secret: ${chalk.bold(wh.secret)} (shown once — store it securely)`);
39
43
  });
@@ -43,6 +47,10 @@ export function webhooksCommand() {
43
47
  .action(async (webhookId) => {
44
48
  const client = await requireClient();
45
49
  await client.webhooks.delete(webhookId);
50
+ if (isJsonMode()) {
51
+ console.log(JSON.stringify({ deleted: webhookId }));
52
+ return;
53
+ }
46
54
  console.log(chalk.green('✓') + ` Webhook ${webhookId} deleted.`);
47
55
  });
48
56
  return cmd;
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,YAAY,GAAuB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;AAE5F,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE5E,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,UAAU,CACR,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,cAAc,CAAC,aAAa,EAAE,yCAAyC,CAAC;SACxE,cAAc,CACb,mBAAmB,EACnB,gCAAgC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3D;SACA,MAAM,CAAC,KAAK,EAAE,IAAqC,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAuB,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACjB,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACjD,iBAAiB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,wBAAwB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,SAAS,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
package/dist/format.d.ts CHANGED
@@ -1,10 +1,18 @@
1
1
  /**
2
- * Minimal table formatter for CLI output.
3
- * Prints a header row + divider + data rows, padded to column widths.
2
+ * Output formatting for CLI.
3
+ * Supports --json global flag for machine-readable output (AI agent friendly).
4
4
  */
5
- export declare function printTable(rows: Record<string, string>[], columns: string[]): void;
5
+ export declare function setJsonMode(enabled: boolean): void;
6
+ export declare function isJsonMode(): boolean;
7
+ /**
8
+ * Print data as JSON array (if --json) or ASCII table.
9
+ * `rawRows` contains unformatted data for JSON output; `displayRows`/`columns` are for tables.
10
+ */
11
+ export declare function printTable(displayRows: Record<string, string>[], columns: string[], rawRows?: Record<string, unknown>[]): void;
6
12
  /** Format an ISO date string to a short local representation. */
7
13
  export declare function shortDate(iso: string): string;
8
- /** Print a labelled key-value block (for single-record views). */
9
- export declare function printRecord(record: Record<string, string>): void;
14
+ /** Print a single record as JSON object (if --json) or key-value block. */
15
+ export declare function printRecord(record: Record<string, string>, raw?: Record<string, unknown>): void;
16
+ /** Build table string without printing (for file writing in compliance). */
17
+ export declare function tableToString(rows: Record<string, string>[], columns: string[]): string;
10
18
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAkBlF;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKhE"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACrC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAClC,IAAI,CAuBN;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAU/F;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAcvF"}
package/dist/format.js CHANGED
@@ -1,18 +1,34 @@
1
1
  /**
2
- * Minimal table formatter for CLI output.
3
- * Prints a header row + divider + data rows, padded to column widths.
2
+ * Output formatting for CLI.
3
+ * Supports --json global flag for machine-readable output (AI agent friendly).
4
4
  */
5
- export function printTable(rows, columns) {
6
- if (rows.length === 0) {
5
+ /** Whether --json was passed globally. Set by index.ts before commands run. */
6
+ let jsonMode = false;
7
+ export function setJsonMode(enabled) {
8
+ jsonMode = enabled;
9
+ }
10
+ export function isJsonMode() {
11
+ return jsonMode;
12
+ }
13
+ /**
14
+ * Print data as JSON array (if --json) or ASCII table.
15
+ * `rawRows` contains unformatted data for JSON output; `displayRows`/`columns` are for tables.
16
+ */
17
+ export function printTable(displayRows, columns, rawRows) {
18
+ if (jsonMode) {
19
+ console.log(JSON.stringify(rawRows ?? displayRows, null, 2));
20
+ return;
21
+ }
22
+ if (displayRows.length === 0) {
7
23
  console.log('(no results)');
8
24
  return;
9
25
  }
10
- const widths = columns.map((col) => Math.max(col.length, ...rows.map((r) => (r[col] ?? '').length)));
26
+ const widths = columns.map((col) => Math.max(col.length, ...displayRows.map((r) => (r[col] ?? '').length)));
11
27
  const pad = (s, w) => s.padEnd(w);
12
28
  const divider = widths.map((w) => '-'.repeat(w)).join(' ');
13
29
  console.log(columns.map((c, i) => pad(c.toUpperCase(), widths[i] ?? c.length)).join(' '));
14
30
  console.log(divider);
15
- for (const row of rows) {
31
+ for (const row of displayRows) {
16
32
  console.log(columns.map((c, i) => pad(row[c] ?? '', widths[i] ?? 0)).join(' '));
17
33
  }
18
34
  }
@@ -26,11 +42,29 @@ export function shortDate(iso) {
26
42
  minute: '2-digit',
27
43
  });
28
44
  }
29
- /** Print a labelled key-value block (for single-record views). */
30
- export function printRecord(record) {
45
+ /** Print a single record as JSON object (if --json) or key-value block. */
46
+ export function printRecord(record, raw) {
47
+ if (jsonMode) {
48
+ console.log(JSON.stringify(raw ?? record, null, 2));
49
+ return;
50
+ }
31
51
  const keyWidth = Math.max(...Object.keys(record).map((k) => k.length));
32
52
  for (const [k, v] of Object.entries(record)) {
33
53
  console.log(`${k.padEnd(keyWidth)} ${v}`);
34
54
  }
35
55
  }
56
+ /** Build table string without printing (for file writing in compliance). */
57
+ export function tableToString(rows, columns) {
58
+ if (rows.length === 0)
59
+ return '(no results)';
60
+ const widths = columns.map((col) => Math.max(col.length, ...rows.map((r) => (r[col] ?? '').length)));
61
+ const pad = (s, w) => s.padEnd(w);
62
+ const lines = [];
63
+ lines.push(columns.map((c, i) => pad(c.toUpperCase(), widths[i] ?? c.length)).join(' '));
64
+ lines.push(widths.map((w) => '-'.repeat(w)).join(' '));
65
+ for (const row of rows) {
66
+ lines.push(columns.map((c, i) => pad(row[c] ?? '', widths[i] ?? 0)).join(' '));
67
+ }
68
+ return lines.join('\n');
69
+ }
36
70
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAA8B,EAAE,OAAiB;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAChE,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE;QAC7C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,MAA8B;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}