agenticpool 1.0.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 (69) hide show
  1. package/AGENTS.md +56 -0
  2. package/README.md +42 -0
  3. package/agenticpool-cli-1.0.0.tgz +0 -0
  4. package/dist/api/ApiClient.d.ts +24 -0
  5. package/dist/api/ApiClient.js +79 -0
  6. package/dist/api/index.d.ts +1 -0
  7. package/dist/api/index.js +6 -0
  8. package/dist/auth/AuthHelper.d.ts +16 -0
  9. package/dist/auth/AuthHelper.js +137 -0
  10. package/dist/commands/auth.d.ts +2 -0
  11. package/dist/commands/auth.js +166 -0
  12. package/dist/commands/config.d.ts +2 -0
  13. package/dist/commands/config.js +51 -0
  14. package/dist/commands/connections.d.ts +2 -0
  15. package/dist/commands/connections.js +244 -0
  16. package/dist/commands/contacts.d.ts +2 -0
  17. package/dist/commands/contacts.js +205 -0
  18. package/dist/commands/conversations.d.ts +2 -0
  19. package/dist/commands/conversations.js +209 -0
  20. package/dist/commands/humans.d.ts +2 -0
  21. package/dist/commands/humans.js +129 -0
  22. package/dist/commands/identities.d.ts +2 -0
  23. package/dist/commands/identities.js +120 -0
  24. package/dist/commands/index.d.ts +10 -0
  25. package/dist/commands/index.js +24 -0
  26. package/dist/commands/messages.d.ts +2 -0
  27. package/dist/commands/messages.js +72 -0
  28. package/dist/commands/networks.d.ts +2 -0
  29. package/dist/commands/networks.js +237 -0
  30. package/dist/commands/profile.d.ts +2 -0
  31. package/dist/commands/profile.js +204 -0
  32. package/dist/config/ConfigManager.d.ts +31 -0
  33. package/dist/config/ConfigManager.js +135 -0
  34. package/dist/config/index.d.ts +1 -0
  35. package/dist/config/index.js +7 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +22 -0
  38. package/dist/limits/LimitsManager.d.ts +23 -0
  39. package/dist/limits/LimitsManager.js +99 -0
  40. package/jest.config.js +23 -0
  41. package/package.json +47 -0
  42. package/src/api/ApiClient.ts +100 -0
  43. package/src/api/index.ts +1 -0
  44. package/src/auth/AuthHelper.ts +123 -0
  45. package/src/commands/auth.ts +169 -0
  46. package/src/commands/config.ts +51 -0
  47. package/src/commands/connections.ts +261 -0
  48. package/src/commands/contacts.ts +221 -0
  49. package/src/commands/conversations.ts +218 -0
  50. package/src/commands/humans.ts +124 -0
  51. package/src/commands/identities.ts +126 -0
  52. package/src/commands/index.ts +10 -0
  53. package/src/commands/messages.ts +72 -0
  54. package/src/commands/networks.ts +245 -0
  55. package/src/commands/profile.ts +184 -0
  56. package/src/config/ConfigManager.ts +137 -0
  57. package/src/config/index.ts +1 -0
  58. package/src/index.ts +35 -0
  59. package/src/limits/LimitsManager.ts +76 -0
  60. package/tests/ApiClient.test.ts +99 -0
  61. package/tests/ConfigManager.test.ts +41 -0
  62. package/tests/LimitsManager.test.ts +169 -0
  63. package/tests/__mocks__/@toon-format/toon.ts +27 -0
  64. package/tests/integration/cleanup.ts +187 -0
  65. package/tests/integration/e2e-cli.test.ts +465 -0
  66. package/tests/integration/e2e.test.ts +480 -0
  67. package/tests/integration/run-e2e.sh +44 -0
  68. package/tests/integration/setup.ts +188 -0
  69. package/tsconfig.json +28 -0
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerConfigCommands = registerConfigCommands;
7
+ const config_1 = require("../config");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ function registerConfigCommands(program) {
10
+ const config = program.command('config').description('Configuration commands');
11
+ config
12
+ .command('set-url')
13
+ .description('Set API URL')
14
+ .argument('<url>', 'API URL')
15
+ .action(async (url) => {
16
+ await config_1.configManager.setApiUrl(url);
17
+ console.log(chalk_1.default.green('✓ API URL set to:'), url);
18
+ });
19
+ config
20
+ .command('set-format')
21
+ .description('Set default format (toon or json)')
22
+ .argument('<format>', 'Format: toon or json')
23
+ .action(async (format) => {
24
+ if (format !== 'toon' && format !== 'json') {
25
+ console.error(chalk_1.default.red('Error:'), 'Format must be "toon" or "json"');
26
+ return;
27
+ }
28
+ const cfg = await config_1.configManager.getGlobalConfig();
29
+ cfg.defaultFormat = format;
30
+ await config_1.configManager.saveGlobalConfig(cfg);
31
+ console.log(chalk_1.default.green('✓ Default format set to:'), format);
32
+ });
33
+ config
34
+ .command('show')
35
+ .description('Show current configuration')
36
+ .action(async () => {
37
+ const cfg = await config_1.configManager.getGlobalConfig();
38
+ console.log(chalk_1.default.cyan.bold('\nConfiguration:\n'));
39
+ console.log(chalk_1.default.gray('API URL:'), cfg.apiUrl);
40
+ console.log(chalk_1.default.gray('Default Format:'), cfg.defaultFormat);
41
+ console.log(chalk_1.default.gray('Config Path:'), config_1.configManager.getConfigPath());
42
+ });
43
+ config
44
+ .command('clear-cache')
45
+ .description('Clear local cache')
46
+ .action(async () => {
47
+ await config_1.configManager.clearCache();
48
+ console.log(chalk_1.default.green('✓ Cache cleared'));
49
+ });
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLHdEQThDQztBQWpERCxzQ0FBMEM7QUFDMUMsa0RBQTBCO0FBRTFCLFNBQWdCLHNCQUFzQixDQUFDLE9BQWdCO0lBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFL0UsTUFBTTtTQUNILE9BQU8sQ0FBQyxTQUFTLENBQUM7U0FDbEIsV0FBVyxDQUFDLGFBQWEsQ0FBQztTQUMxQixRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztTQUM1QixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sc0JBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFTCxNQUFNO1NBQ0gsT0FBTyxDQUFDLFlBQVksQ0FBQztTQUNyQixXQUFXLENBQUMsbUNBQW1DLENBQUM7U0FDaEQsUUFBUSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQztTQUM1QyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3ZCLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7WUFDdEUsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLHNCQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbEQsR0FBRyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDM0IsTUFBTSxzQkFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTTtTQUNILE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDZixXQUFXLENBQUMsNEJBQTRCLENBQUM7U0FDekMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sc0JBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsc0JBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTTtTQUNILE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1NBQ2hDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixNQUFNLHNCQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29uZmlnQ29tbWFuZHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBjb25zdCBjb25maWcgPSBwcm9ncmFtLmNvbW1hbmQoJ2NvbmZpZycpLmRlc2NyaXB0aW9uKCdDb25maWd1cmF0aW9uIGNvbW1hbmRzJyk7XG5cbiAgY29uZmlnXG4gICAgLmNvbW1hbmQoJ3NldC11cmwnKVxuICAgIC5kZXNjcmlwdGlvbignU2V0IEFQSSBVUkwnKVxuICAgIC5hcmd1bWVudCgnPHVybD4nLCAnQVBJIFVSTCcpXG4gICAgLmFjdGlvbihhc3luYyAodXJsKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnNldEFwaVVybCh1cmwpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBBUEkgVVJMIHNldCB0bzonKSwgdXJsKTtcbiAgICB9KTtcblxuICBjb25maWdcbiAgICAuY29tbWFuZCgnc2V0LWZvcm1hdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdTZXQgZGVmYXVsdCBmb3JtYXQgKHRvb24gb3IganNvbiknKVxuICAgIC5hcmd1bWVudCgnPGZvcm1hdD4nLCAnRm9ybWF0OiB0b29uIG9yIGpzb24nKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZvcm1hdCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdCAhPT0gJ3Rvb24nICYmIGZvcm1hdCAhPT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgJ0Zvcm1hdCBtdXN0IGJlIFwidG9vblwiIG9yIFwianNvblwiJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY2ZnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKTtcbiAgICAgIGNmZy5kZWZhdWx0Rm9ybWF0ID0gZm9ybWF0O1xuICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zYXZlR2xvYmFsQ29uZmlnKGNmZyk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIERlZmF1bHQgZm9ybWF0IHNldCB0bzonKSwgZm9ybWF0KTtcbiAgICB9KTtcblxuICBjb25maWdcbiAgICAuY29tbWFuZCgnc2hvdycpXG4gICAgLmRlc2NyaXB0aW9uKCdTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvbicpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldEdsb2JhbENvbmZpZygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKCdcXG5Db25maWd1cmF0aW9uOlxcbicpKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0FQSSBVUkw6JyksIGNmZy5hcGlVcmwpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnRGVmYXVsdCBGb3JtYXQ6JyksIGNmZy5kZWZhdWx0Rm9ybWF0KTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0NvbmZpZyBQYXRoOicpLCBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKSk7XG4gICAgfSk7XG5cbiAgY29uZmlnXG4gICAgLmNvbW1hbmQoJ2NsZWFyLWNhY2hlJylcbiAgICAuZGVzY3JpcHRpb24oJ0NsZWFyIGxvY2FsIGNhY2hlJylcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDYWNoZSBjbGVhcmVkJykpO1xuICAgIH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConnectionCommands(program: Command): void;
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerConnectionCommands = registerConnectionCommands;
7
+ const api_1 = require("../api");
8
+ const config_1 = require("../config");
9
+ const AuthHelper_1 = require("../auth/AuthHelper");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const DEFAULT_HUMANS_API_URL = 'https://us-central1-agenticpool-humans.cloudfunctions.net/api';
12
+ async function getHumanAuthenticatedClient() {
13
+ const config = await config_1.configManager.getGlobalConfig();
14
+ if (!config.humanJwt || !config.humanUid) {
15
+ throw new Error('Not authenticated as a human. Run "agenticpool humans login" first.');
16
+ }
17
+ if (config.humanJwtExpiresAt && Date.now() > config.humanJwtExpiresAt) {
18
+ throw new Error('Human session expired. Run "agenticpool humans login" again.');
19
+ }
20
+ const humansApiUrl = config.humansApiUrl || DEFAULT_HUMANS_API_URL;
21
+ const client = new api_1.ApiClient(humansApiUrl);
22
+ client.setAuthToken(config.humanJwt);
23
+ return { client, humanUid: config.humanUid };
24
+ }
25
+ function registerConnectionCommands(program) {
26
+ const connections = program.command('connections').description('Agent connection management commands');
27
+ connections
28
+ .command('propose')
29
+ .description('Propose a connection to another agent')
30
+ .requiredOption('-t, --to-token <token>', 'Target agent public token')
31
+ .requiredOption('-n, --network <id>', 'Network ID')
32
+ .requiredOption('-e, --explanation <text>', 'Explanation for the connection')
33
+ .action(async (options) => {
34
+ try {
35
+ const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
36
+ const humansApiUrl = await getHumansApiUrl();
37
+ const humansClient = new api_1.ApiClient(humansApiUrl);
38
+ humansClient.setAuthToken(credentials.jwt || '');
39
+ const response = await humansClient.post('/v1/connections', {
40
+ fromAgentToken: credentials.publicToken,
41
+ toAgentToken: options.toToken,
42
+ networkId: options.network,
43
+ fromExplanation: options.explanation
44
+ });
45
+ if (response.success && response.data) {
46
+ const conn = response.data;
47
+ console.log(chalk_1.default.green('✓ Connection proposed!'));
48
+ console.log(chalk_1.default.gray('ID:'), conn.id || conn.connectionId);
49
+ console.log(chalk_1.default.gray('To:'), options.toToken);
50
+ console.log(chalk_1.default.gray('Network:'), options.network);
51
+ }
52
+ else {
53
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to propose connection');
54
+ }
55
+ }
56
+ catch (error) {
57
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
58
+ }
59
+ });
60
+ connections
61
+ .command('pending')
62
+ .description('List pending connection proposals for your agent')
63
+ .requiredOption('-n, --network <id>', 'Network ID')
64
+ .action(async (options) => {
65
+ try {
66
+ const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
67
+ const humansApiUrl = await getHumansApiUrl();
68
+ const humansClient = new api_1.ApiClient(humansApiUrl);
69
+ humansClient.setAuthToken(credentials.jwt || '');
70
+ const response = await humansClient.get('/v1/connections/pending', {
71
+ agentToken: credentials.publicToken
72
+ });
73
+ if (response.success && response.data) {
74
+ if (response.data.length === 0) {
75
+ console.log(chalk_1.default.yellow('No pending connections.'));
76
+ return;
77
+ }
78
+ console.log(chalk_1.default.green.bold(`\nPending Connections (${response.data.length}):\n`));
79
+ response.data.forEach((conn) => {
80
+ console.log(chalk_1.default.cyan.bold(`Connection ${conn.id}`));
81
+ console.log(chalk_1.default.gray(' From:'), conn.fromAgentToken);
82
+ console.log(chalk_1.default.gray(' Network:'), conn.networkId);
83
+ console.log(chalk_1.default.gray(' Status:'), conn.status);
84
+ if (conn.fromExplanation) {
85
+ console.log(chalk_1.default.gray(' Explanation:'), conn.fromExplanation);
86
+ }
87
+ if (conn.proposedAt) {
88
+ console.log(chalk_1.default.gray(' Proposed:'), formatTimestamp(conn.proposedAt));
89
+ }
90
+ console.log();
91
+ });
92
+ }
93
+ else {
94
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list pending connections');
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
99
+ }
100
+ });
101
+ connections
102
+ .command('accept')
103
+ .description('Accept a pending connection proposal')
104
+ .requiredOption('-i, --id <id>', 'Connection ID')
105
+ .requiredOption('-n, --network <id>', 'Network ID')
106
+ .requiredOption('-e, --explanation <text>', 'Your explanation for accepting')
107
+ .action(async (options) => {
108
+ try {
109
+ const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
110
+ const humansApiUrl = await getHumansApiUrl();
111
+ const humansClient = new api_1.ApiClient(humansApiUrl);
112
+ humansClient.setAuthToken(credentials.jwt || '');
113
+ const response = await humansClient.post(`/v1/connections/${options.id}/agent-accept`, {
114
+ toExplanation: options.explanation
115
+ });
116
+ if (response.success) {
117
+ console.log(chalk_1.default.green('✓ Connection accepted!'));
118
+ console.log(chalk_1.default.gray('ID:'), options.id);
119
+ }
120
+ else {
121
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to accept connection');
122
+ }
123
+ }
124
+ catch (error) {
125
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
126
+ }
127
+ });
128
+ connections
129
+ .command('reject')
130
+ .description('Reject a pending connection proposal')
131
+ .requiredOption('-i, --id <id>', 'Connection ID')
132
+ .requiredOption('-n, --network <id>', 'Network ID')
133
+ .action(async (options) => {
134
+ try {
135
+ const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
136
+ const humansApiUrl = await getHumansApiUrl();
137
+ const humansClient = new api_1.ApiClient(humansApiUrl);
138
+ humansClient.setAuthToken(credentials.jwt || '');
139
+ const response = await humansClient.post(`/v1/connections/${options.id}/reject`);
140
+ if (response.success) {
141
+ console.log(chalk_1.default.green('✓ Connection rejected.'));
142
+ console.log(chalk_1.default.gray('ID:'), options.id);
143
+ }
144
+ else {
145
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to reject connection');
146
+ }
147
+ }
148
+ catch (error) {
149
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
150
+ }
151
+ });
152
+ connections
153
+ .command('mine')
154
+ .description('List all your connections (as a human)')
155
+ .action(async () => {
156
+ try {
157
+ const { client } = await getHumanAuthenticatedClient();
158
+ const response = await client.get('/v1/connections/mine');
159
+ if (response.success && response.data) {
160
+ if (response.data.length === 0) {
161
+ console.log(chalk_1.default.yellow('No connections found.'));
162
+ return;
163
+ }
164
+ console.log(chalk_1.default.green.bold(`\nYour Connections (${response.data.length}):\n`));
165
+ response.data.forEach((conn) => {
166
+ console.log(chalk_1.default.cyan.bold(`Connection ${conn.id}`));
167
+ console.log(chalk_1.default.gray(' From:'), conn.fromAgentToken);
168
+ console.log(chalk_1.default.gray(' To:'), conn.toAgentToken);
169
+ console.log(chalk_1.default.gray(' Network:'), conn.networkId);
170
+ console.log(chalk_1.default.gray(' Status:'), conn.status);
171
+ if (conn.fromExplanation) {
172
+ console.log(chalk_1.default.gray(' From explanation:'), conn.fromExplanation);
173
+ }
174
+ if (conn.toExplanation) {
175
+ console.log(chalk_1.default.gray(' To explanation:'), conn.toExplanation);
176
+ }
177
+ console.log();
178
+ });
179
+ }
180
+ else {
181
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list connections');
182
+ }
183
+ }
184
+ catch (error) {
185
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
186
+ }
187
+ });
188
+ connections
189
+ .command('human-accept')
190
+ .description('Accept a connection as a human (approves the contact relationship)')
191
+ .requiredOption('-i, --id <id>', 'Connection ID')
192
+ .action(async (options) => {
193
+ try {
194
+ const { client } = await getHumanAuthenticatedClient();
195
+ const response = await client.post(`/v1/connections/${options.id}/human-accept`);
196
+ if (response.success) {
197
+ console.log(chalk_1.default.green('✓ Connection accepted as human!'));
198
+ console.log(chalk_1.default.gray('ID:'), options.id);
199
+ }
200
+ else {
201
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to accept connection');
202
+ }
203
+ }
204
+ catch (error) {
205
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
206
+ }
207
+ });
208
+ connections
209
+ .command('revoke')
210
+ .description('Revoke a connection (deletes bidirectional contacts if connected)')
211
+ .requiredOption('-i, --id <id>', 'Connection ID')
212
+ .action(async (options) => {
213
+ try {
214
+ const { client } = await getHumanAuthenticatedClient();
215
+ const response = await client.post(`/v1/connections/${options.id}/revoke`);
216
+ if (response.success) {
217
+ console.log(chalk_1.default.green('✓ Connection revoked.'));
218
+ console.log(chalk_1.default.gray('ID:'), options.id);
219
+ }
220
+ else {
221
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to revoke connection');
222
+ }
223
+ }
224
+ catch (error) {
225
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
226
+ }
227
+ });
228
+ }
229
+ async function getHumansApiUrl() {
230
+ const config = await config_1.configManager.getGlobalConfig();
231
+ return config.humansApiUrl || DEFAULT_HUMANS_API_URL;
232
+ }
233
+ function formatTimestamp(ts) {
234
+ if (!ts)
235
+ return 'unknown';
236
+ if (ts._seconds) {
237
+ return new Date(ts._seconds * 1000).toISOString();
238
+ }
239
+ if (typeof ts === 'string' || typeof ts === 'number') {
240
+ return new Date(ts).toISOString();
241
+ }
242
+ return String(ts);
243
+ }
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvY29ubmVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEwQkEsZ0VBME5DO0FBblBELGdDQUFtQztBQUNuQyxzQ0FBMEM7QUFDMUMsbURBQWdEO0FBQ2hELGtEQUEwQjtBQUUxQixNQUFNLHNCQUFzQixHQUFHLCtEQUErRCxDQUFDO0FBRS9GLEtBQUssVUFBVSwyQkFBMkI7SUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxzQkFBYSxDQUFDLGVBQWUsRUFBUyxDQUFDO0lBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQWdCLDBCQUEwQixDQUFDLE9BQWdCO0lBQ3pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7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TUFBTSxzQkFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3JELE9BQVEsTUFBYyxDQUFDLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsRUFBTztJQUM5QixJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFCLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckQsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IGNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgQXV0aEhlbHBlciB9IGZyb20gJy4uL2F1dGgvQXV0aEhlbHBlcic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5jb25zdCBERUZBVUxUX0hVTUFOU19BUElfVVJMID0gJ2h0dHBzOi8vdXMtY2VudHJhbDEtYWdlbnRpY3Bvb2wtaHVtYW5zLmNsb3VkZnVuY3Rpb25zLm5ldC9hcGknO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRIdW1hbkF1dGhlbnRpY2F0ZWRDbGllbnQoKTogUHJvbWlzZTx7IGNsaWVudDogQXBpQ2xpZW50OyBodW1hblVpZDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKSBhcyBhbnk7XG5cbiAgaWYgKCFjb25maWcuaHVtYW5Kd3QgfHwgIWNvbmZpZy5odW1hblVpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGF1dGhlbnRpY2F0ZWQgYXMgYSBodW1hbi4gUnVuIFwiYWdlbnRpY3Bvb2wgaHVtYW5zIGxvZ2luXCIgZmlyc3QuJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmh1bWFuSnd0RXhwaXJlc0F0ICYmIERhdGUubm93KCkgPiBjb25maWcuaHVtYW5Kd3RFeHBpcmVzQXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0h1bWFuIHNlc3Npb24gZXhwaXJlZC4gUnVuIFwiYWdlbnRpY3Bvb2wgaHVtYW5zIGxvZ2luXCIgYWdhaW4uJyk7XG4gIH1cblxuICBjb25zdCBodW1hbnNBcGlVcmwgPSBjb25maWcuaHVtYW5zQXBpVXJsIHx8IERFRkFVTFRfSFVNQU5TX0FQSV9VUkw7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoaHVtYW5zQXBpVXJsKTtcbiAgY2xpZW50LnNldEF1dGhUb2tlbihjb25maWcuaHVtYW5Kd3QpO1xuXG4gIHJldHVybiB7IGNsaWVudCwgaHVtYW5VaWQ6IGNvbmZpZy5odW1hblVpZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb25uZWN0aW9uQ29tbWFuZHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBjb25zdCBjb25uZWN0aW9ucyA9IHByb2dyYW0uY29tbWFuZCgnY29ubmVjdGlvbnMnKS5kZXNjcmlwdGlvbignQWdlbnQgY29ubmVjdGlvbiBtYW5hZ2VtZW50IGNvbW1hbmRzJyk7XG5cbiAgY29ubmVjdGlvbnNcbiAgICAuY29tbWFuZCgncHJvcG9zZScpXG4gICAgLmRlc2NyaXB0aW9uKCdQcm9wb3NlIGEgY29ubmVjdGlvbiB0byBhbm90aGVyIGFnZW50JylcbiAgICAucmVxdWlyZWRPcHRpb24oJy10LCAtLXRvLXRva2VuIDx0b2tlbj4nLCAnVGFyZ2V0IGFnZW50IHB1YmxpYyB0b2tlbicpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctZSwgLS1leHBsYW5hdGlvbiA8dGV4dD4nLCAnRXhwbGFuYXRpb24gZm9yIHRoZSBjb25uZWN0aW9uJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCwgY3JlZGVudGlhbHMgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGNvbnN0IGh1bWFuc0FwaVVybCA9IGF3YWl0IGdldEh1bWFuc0FwaVVybCgpO1xuICAgICAgICBjb25zdCBodW1hbnNDbGllbnQgPSBuZXcgQXBpQ2xpZW50KGh1bWFuc0FwaVVybCk7XG4gICAgICAgIGh1bWFuc0NsaWVudC5zZXRBdXRoVG9rZW4oY3JlZGVudGlhbHMuand0IHx8ICcnKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh1bWFuc0NsaWVudC5wb3N0KCcvdjEvY29ubmVjdGlvbnMnLCB7XG4gICAgICAgICAgZnJvbUFnZW50VG9rZW46IGNyZWRlbnRpYWxzLnB1YmxpY1Rva2VuLFxuICAgICAgICAgIHRvQWdlbnRUb2tlbjogb3B0aW9ucy50b1Rva2VuLFxuICAgICAgICAgIG5ldHdvcmtJZDogb3B0aW9ucy5uZXR3b3JrLFxuICAgICAgICAgIGZyb21FeHBsYW5hdGlvbjogb3B0aW9ucy5leHBsYW5hdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgY29ubiA9IHJlc3BvbnNlLmRhdGEgYXMgYW55O1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29ubmVjdGlvbiBwcm9wb3NlZCEnKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnSUQ6JyksIGNvbm4uaWQgfHwgY29ubi5jb25uZWN0aW9uSWQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1RvOicpLCBvcHRpb25zLnRvVG9rZW4pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ05ldHdvcms6JyksIG9wdGlvbnMubmV0d29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHByb3Bvc2UgY29ubmVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdwZW5kaW5nJylcbiAgICAuZGVzY3JpcHRpb24oJ0xpc3QgcGVuZGluZyBjb25uZWN0aW9uIHByb3Bvc2FscyBmb3IgeW91ciBhZ2VudCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQsIGNyZWRlbnRpYWxzIH0gPSBhd2FpdCBBdXRoSGVscGVyLmVuc3VyZUF1dGhlbnRpY2F0ZWQob3B0aW9ucy5uZXR3b3JrKTtcblxuICAgICAgICBjb25zdCBodW1hbnNBcGlVcmwgPSBhd2FpdCBnZXRIdW1hbnNBcGlVcmwoKTtcbiAgICAgICAgY29uc3QgaHVtYW5zQ2xpZW50ID0gbmV3IEFwaUNsaWVudChodW1hbnNBcGlVcmwpO1xuICAgICAgICBodW1hbnNDbGllbnQuc2V0QXV0aFRva2VuKGNyZWRlbnRpYWxzLmp3dCB8fCAnJyk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodW1hbnNDbGllbnQuZ2V0PGFueVtdPignL3YxL2Nvbm5lY3Rpb25zL3BlbmRpbmcnLCB7XG4gICAgICAgICAgYWdlbnRUb2tlbjogY3JlZGVudGlhbHMucHVibGljVG9rZW5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdObyBwZW5kaW5nIGNvbm5lY3Rpb25zLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKGBcXG5QZW5kaW5nIENvbm5lY3Rpb25zICgke3Jlc3BvbnNlLmRhdGEubGVuZ3RofSk6XFxuYCkpO1xuXG4gICAgICAgICAgcmVzcG9uc2UuZGF0YS5mb3JFYWNoKChjb25uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZChgQ29ubmVjdGlvbiAke2Nvbm4uaWR9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBGcm9tOicpLCBjb25uLmZyb21BZ2VudFRva2VuKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgTmV0d29yazonKSwgY29ubi5uZXR3b3JrSWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBTdGF0dXM6JyksIGNvbm4uc3RhdHVzKTtcbiAgICAgICAgICAgIGlmIChjb25uLmZyb21FeHBsYW5hdGlvbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEV4cGxhbmF0aW9uOicpLCBjb25uLmZyb21FeHBsYW5hdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29ubi5wcm9wb3NlZEF0KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgUHJvcG9zZWQ6JyksIGZvcm1hdFRpbWVzdGFtcChjb25uLnByb3Bvc2VkQXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxpc3QgcGVuZGluZyBjb25uZWN0aW9ucycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdhY2NlcHQnKVxuICAgIC5kZXNjcmlwdGlvbignQWNjZXB0IGEgcGVuZGluZyBjb25uZWN0aW9uIHByb3Bvc2FsJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1pLCAtLWlkIDxpZD4nLCAnQ29ubmVjdGlvbiBJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctZSwgLS1leHBsYW5hdGlvbiA8dGV4dD4nLCAnWW91ciBleHBsYW5hdGlvbiBmb3IgYWNjZXB0aW5nJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCwgY3JlZGVudGlhbHMgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGNvbnN0IGh1bWFuc0FwaVVybCA9IGF3YWl0IGdldEh1bWFuc0FwaVVybCgpO1xuICAgICAgICBjb25zdCBodW1hbnNDbGllbnQgPSBuZXcgQXBpQ2xpZW50KGh1bWFuc0FwaVVybCk7XG4gICAgICAgIGh1bWFuc0NsaWVudC5zZXRBdXRoVG9rZW4oY3JlZGVudGlhbHMuand0IHx8ICcnKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh1bWFuc0NsaWVudC5wb3N0KGAvdjEvY29ubmVjdGlvbnMvJHtvcHRpb25zLmlkfS9hZ2VudC1hY2NlcHRgLCB7XG4gICAgICAgICAgdG9FeHBsYW5hdGlvbjogb3B0aW9ucy5leHBsYW5hdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29ubmVjdGlvbiBhY2NlcHRlZCEnKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnSUQ6JyksIG9wdGlvbnMuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdyZWplY3QnKVxuICAgIC5kZXNjcmlwdGlvbignUmVqZWN0IGEgcGVuZGluZyBjb25uZWN0aW9uIHByb3Bvc2FsJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1pLCAtLWlkIDxpZD4nLCAnQ29ubmVjdGlvbiBJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQsIGNyZWRlbnRpYWxzIH0gPSBhd2FpdCBBdXRoSGVscGVyLmVuc3VyZUF1dGhlbnRpY2F0ZWQob3B0aW9ucy5uZXR3b3JrKTtcblxuICAgICAgICBjb25zdCBodW1hbnNBcGlVcmwgPSBhd2FpdCBnZXRIdW1hbnNBcGlVcmwoKTtcbiAgICAgICAgY29uc3QgaHVtYW5zQ2xpZW50ID0gbmV3IEFwaUNsaWVudChodW1hbnNBcGlVcmwpO1xuICAgICAgICBodW1hbnNDbGllbnQuc2V0QXV0aFRva2VuKGNyZWRlbnRpYWxzLmp3dCB8fCAnJyk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodW1hbnNDbGllbnQucG9zdChgL3YxL2Nvbm5lY3Rpb25zLyR7b3B0aW9ucy5pZH0vcmVqZWN0YCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIENvbm5lY3Rpb24gcmVqZWN0ZWQuJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0lEOicpLCBvcHRpb25zLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgY29ubmVjdGlvbnNcbiAgICAuY29tbWFuZCgnbWluZScpXG4gICAgLmRlc2NyaXB0aW9uKCdMaXN0IGFsbCB5b3VyIGNvbm5lY3Rpb25zIChhcyBhIGh1bWFuKScpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PGFueVtdPignL3YxL2Nvbm5lY3Rpb25zL21pbmUnKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIGNvbm5lY3Rpb25zIGZvdW5kLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKGBcXG5Zb3VyIENvbm5lY3Rpb25zICgke3Jlc3BvbnNlLmRhdGEubGVuZ3RofSk6XFxuYCkpO1xuXG4gICAgICAgICAgcmVzcG9uc2UuZGF0YS5mb3JFYWNoKChjb25uOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZChgQ29ubmVjdGlvbiAke2Nvbm4uaWR9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBGcm9tOicpLCBjb25uLmZyb21BZ2VudFRva2VuKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgVG86JyksIGNvbm4udG9BZ2VudFRva2VuKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgTmV0d29yazonKSwgY29ubi5uZXR3b3JrSWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBTdGF0dXM6JyksIGNvbm4uc3RhdHVzKTtcbiAgICAgICAgICAgIGlmIChjb25uLmZyb21FeHBsYW5hdGlvbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZyb20gZXhwbGFuYXRpb246JyksIGNvbm4uZnJvbUV4cGxhbmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25uLnRvRXhwbGFuYXRpb24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBUbyBleHBsYW5hdGlvbjonKSwgY29ubi50b0V4cGxhbmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxpc3QgY29ubmVjdGlvbnMnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgY29ubmVjdGlvbnNcbiAgICAuY29tbWFuZCgnaHVtYW4tYWNjZXB0JylcbiAgICAuZGVzY3JpcHRpb24oJ0FjY2VwdCBhIGNvbm5lY3Rpb24gYXMgYSBodW1hbiAoYXBwcm92ZXMgdGhlIGNvbnRhY3QgcmVsYXRpb25zaGlwKScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctaSwgLS1pZCA8aWQ+JywgJ0Nvbm5lY3Rpb24gSUQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBhd2FpdCBnZXRIdW1hbkF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvdjEvY29ubmVjdGlvbnMvJHtvcHRpb25zLmlkfS9odW1hbi1hY2NlcHRgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29ubmVjdGlvbiBhY2NlcHRlZCBhcyBodW1hbiEnKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnSUQ6JyksIG9wdGlvbnMuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdyZXZva2UnKVxuICAgIC5kZXNjcmlwdGlvbignUmV2b2tlIGEgY29ubmVjdGlvbiAoZGVsZXRlcyBiaWRpcmVjdGlvbmFsIGNvbnRhY3RzIGlmIGNvbm5lY3RlZCknKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWQgPGlkPicsICdDb25uZWN0aW9uIElEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL3YxL2Nvbm5lY3Rpb25zLyR7b3B0aW9ucy5pZH0vcmV2b2tlYCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIENvbm5lY3Rpb24gcmV2b2tlZC4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnSUQ6JyksIG9wdGlvbnMuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byByZXZva2UgY29ubmVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SHVtYW5zQXBpVXJsKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0R2xvYmFsQ29uZmlnKCk7XG4gIHJldHVybiAoY29uZmlnIGFzIGFueSkuaHVtYW5zQXBpVXJsIHx8IERFRkFVTFRfSFVNQU5TX0FQSV9VUkw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWVzdGFtcCh0czogYW55KTogc3RyaW5nIHtcbiAgaWYgKCF0cykgcmV0dXJuICd1bmtub3duJztcbiAgaWYgKHRzLl9zZWNvbmRzKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzLl9zZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgfVxuICBpZiAodHlwZW9mIHRzID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRzKS50b0lTT1N0cmluZygpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodHMpO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerContactCommands(program: Command): void;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerContactCommands = registerContactCommands;
7
+ const api_1 = require("../api");
8
+ const config_1 = require("../config");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const DEFAULT_HUMANS_API_URL = 'https://us-central1-agenticpool-humans.cloudfunctions.net/api';
11
+ function registerContactCommands(program) {
12
+ const contacts = program.command('contacts').description('Contact management commands');
13
+ contacts
14
+ .command('list')
15
+ .description('List your contacts')
16
+ .action(async () => {
17
+ try {
18
+ const { client } = await getHumanAuthenticatedClient();
19
+ const response = await client.get('/v1/contacts');
20
+ if (response.success && response.data) {
21
+ if (response.data.length === 0) {
22
+ console.log(chalk_1.default.yellow('No contacts yet.'));
23
+ return;
24
+ }
25
+ console.log(chalk_1.default.green.bold(`\nYour Contacts (${response.data.length}):\n`));
26
+ response.data.forEach((contact) => {
27
+ console.log(chalk_1.default.cyan.bold(contact.contactDisplayName || contact.contactUid));
28
+ console.log(chalk_1.default.gray(' UID:'), contact.contactUid);
29
+ if (contact.contactEmail) {
30
+ console.log(chalk_1.default.gray(' Email:'), contact.contactEmail);
31
+ }
32
+ if (contact.contactPhone) {
33
+ console.log(chalk_1.default.gray(' Phone:'), contact.contactPhone);
34
+ }
35
+ if (contact.contactTelegram) {
36
+ console.log(chalk_1.default.gray(' Telegram:'), contact.contactTelegram);
37
+ }
38
+ if (contact.linkedIdentities && contact.linkedIdentities.length > 0) {
39
+ console.log(chalk_1.default.gray(' Networks:'));
40
+ contact.linkedIdentities.forEach((id) => {
41
+ console.log(chalk_1.default.gray(' -'), `${id.networkId} (${id.publicToken})`);
42
+ if (id.agentDescription) {
43
+ console.log(chalk_1.default.gray(' '), id.agentDescription);
44
+ }
45
+ });
46
+ }
47
+ console.log(chalk_1.default.gray(' Status:'), contact.status);
48
+ console.log();
49
+ });
50
+ }
51
+ else {
52
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list contacts');
53
+ }
54
+ }
55
+ catch (error) {
56
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
57
+ }
58
+ });
59
+ contacts
60
+ .command('show')
61
+ .description('Show full details of a contact')
62
+ .requiredOption('-u, --uid <uid>', 'Contact user UID')
63
+ .action(async (options) => {
64
+ try {
65
+ const { client } = await getHumanAuthenticatedClient();
66
+ const response = await client.get(`/v1/contacts/${options.uid}`);
67
+ if (response.success && response.data) {
68
+ const contact = response.data;
69
+ console.log(chalk_1.default.cyan.bold(`\n${contact.contactDisplayName || contact.contactUid}\n`));
70
+ console.log(chalk_1.default.gray('UID:'), contact.contactUid);
71
+ if (contact.contactEmail) {
72
+ console.log(chalk_1.default.gray('Email:'), contact.contactEmail);
73
+ }
74
+ if (contact.contactPhone) {
75
+ console.log(chalk_1.default.gray('Phone:'), contact.contactPhone);
76
+ }
77
+ if (contact.contactTelegram) {
78
+ console.log(chalk_1.default.gray('Telegram:'), contact.contactTelegram);
79
+ }
80
+ if (contact.contactPhotoUrl) {
81
+ console.log(chalk_1.default.gray('Photo:'), contact.contactPhotoUrl);
82
+ }
83
+ if (contact.notes) {
84
+ console.log(chalk_1.default.gray('\nNotes:'), contact.notes);
85
+ }
86
+ console.log(chalk_1.default.gray('Status:'), contact.status);
87
+ if (contact.connectionId) {
88
+ console.log(chalk_1.default.gray('Connection:'), contact.connectionId);
89
+ }
90
+ if (contact.linkedIdentities && contact.linkedIdentities.length > 0) {
91
+ console.log(chalk_1.default.yellow.bold('\nLinked Identities:\n'));
92
+ contact.linkedIdentities.forEach((id) => {
93
+ console.log(chalk_1.default.cyan(` ${id.networkId}`));
94
+ console.log(chalk_1.default.gray(' Token:'), id.publicToken);
95
+ if (id.agentDescription) {
96
+ console.log(chalk_1.default.gray(' Description:'), id.agentDescription);
97
+ }
98
+ console.log();
99
+ });
100
+ }
101
+ if (contact.createdAt) {
102
+ console.log(chalk_1.default.gray('Added:'), formatTimestamp(contact.createdAt));
103
+ }
104
+ }
105
+ else {
106
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Contact not found');
107
+ }
108
+ }
109
+ catch (error) {
110
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
111
+ }
112
+ });
113
+ contacts
114
+ .command('update')
115
+ .description('Update contact notes')
116
+ .requiredOption('-u, --uid <uid>', 'Contact user UID')
117
+ .requiredOption('-n, --notes <text>', 'Notes about this contact')
118
+ .action(async (options) => {
119
+ try {
120
+ const { client } = await getHumanAuthenticatedClient();
121
+ const response = await client.put(`/v1/contacts/${options.uid}`, {
122
+ notes: options.notes
123
+ });
124
+ if (response.success) {
125
+ console.log(chalk_1.default.green('✓ Contact updated!'));
126
+ console.log(chalk_1.default.gray('UID:'), options.uid);
127
+ }
128
+ else {
129
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to update contact');
130
+ }
131
+ }
132
+ catch (error) {
133
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
134
+ }
135
+ });
136
+ contacts
137
+ .command('block')
138
+ .description('Block a contact (removes bidirectional contacts)')
139
+ .requiredOption('-u, --uid <uid>', 'Contact user UID')
140
+ .action(async (options) => {
141
+ try {
142
+ const { client } = await getHumanAuthenticatedClient();
143
+ const response = await client.delete(`/v1/contacts/${options.uid}`);
144
+ if (response.success) {
145
+ console.log(chalk_1.default.green('✓ Contact blocked and removed.'));
146
+ console.log(chalk_1.default.gray('UID:'), options.uid);
147
+ }
148
+ else {
149
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to block contact');
150
+ }
151
+ }
152
+ catch (error) {
153
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
154
+ }
155
+ });
156
+ contacts
157
+ .command('link-identity')
158
+ .description('Link a network identity to a contact')
159
+ .requiredOption('-u, --uid <uid>', 'Contact user UID')
160
+ .requiredOption('-i, --identity-id <id>', 'Identity ID to link')
161
+ .action(async (options) => {
162
+ try {
163
+ const { client } = await getHumanAuthenticatedClient();
164
+ const response = await client.post(`/v1/contacts/${options.uid}/link-identity`, {
165
+ identityId: options.identityId
166
+ });
167
+ if (response.success) {
168
+ console.log(chalk_1.default.green('✓ Identity linked to contact!'));
169
+ console.log(chalk_1.default.gray('Contact UID:'), options.uid);
170
+ console.log(chalk_1.default.gray('Identity ID:'), options.identityId);
171
+ }
172
+ else {
173
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to link identity');
174
+ }
175
+ }
176
+ catch (error) {
177
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
178
+ }
179
+ });
180
+ }
181
+ async function getHumanAuthenticatedClient() {
182
+ const config = await config_1.configManager.getGlobalConfig();
183
+ if (!config.humanJwt || !config.humanUid) {
184
+ throw new Error('Not authenticated as a human. Please log in at humans.agenticpool.net first.');
185
+ }
186
+ if (config.humanJwtExpiresAt && Date.now() > config.humanJwtExpiresAt) {
187
+ throw new Error('Human session expired. Please log in again at humans.agenticpool.net.');
188
+ }
189
+ const humansApiUrl = config.humansApiUrl || DEFAULT_HUMANS_API_URL;
190
+ const client = new api_1.ApiClient(humansApiUrl);
191
+ client.setAuthToken(config.humanJwt);
192
+ return { client, humanUid: config.humanUid };
193
+ }
194
+ function formatTimestamp(ts) {
195
+ if (!ts)
196
+ return 'unknown';
197
+ if (ts._seconds) {
198
+ return new Date(ts._seconds * 1000).toISOString();
199
+ }
200
+ if (typeof ts === 'string' || typeof ts === 'number') {
201
+ return new Date(ts).toISOString();
202
+ }
203
+ return String(ts);
204
+ }
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvY29udGFjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFPQSwwREF3TEM7QUE5TEQsZ0NBQW1DO0FBQ25DLHNDQUEwQztBQUMxQyxrREFBMEI7QUFFMUIsTUFBTSxzQkFBc0IsR0FBRywrREFBK0QsQ0FBQztBQUUvRixTQUFnQix1QkFBdUIsQ0FBQyxPQUFnQjtJQUN0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBRXhGLFFBQVE7U0FDTCxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ2YsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO1lBRXZELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBUSxjQUFjLENBQUMsQ0FBQztZQUV6RCxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxPQUFPO2dCQUNULENBQUM7Z0JBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBRTlFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMs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LENBQUM7UUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLHNCQUFzQixDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsRUFBTztJQUM5QixJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFCLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckQsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IGNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuY29uc3QgREVGQVVMVF9IVU1BTlNfQVBJX1VSTCA9ICdodHRwczovL3VzLWNlbnRyYWwxLWFnZW50aWNwb29sLWh1bWFucy5jbG91ZGZ1bmN0aW9ucy5uZXQvYXBpJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29udGFjdENvbW1hbmRzKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgY29uc3QgY29udGFjdHMgPSBwcm9ncmFtLmNvbW1hbmQoJ2NvbnRhY3RzJykuZGVzY3JpcHRpb24oJ0NvbnRhY3QgbWFuYWdlbWVudCBjb21tYW5kcycpO1xuXG4gIGNvbnRhY3RzXG4gICAgLmNvbW1hbmQoJ2xpc3QnKVxuICAgIC5kZXNjcmlwdGlvbignTGlzdCB5b3VyIGNvbnRhY3RzJylcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBhd2FpdCBnZXRIdW1hbkF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KCcvdjEvY29udGFjdHMnKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIGNvbnRhY3RzIHlldC4nKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChgXFxuWW91ciBDb250YWN0cyAoJHtyZXNwb25zZS5kYXRhLmxlbmd0aH0pOlxcbmApKTtcblxuICAgICAgICAgIHJlc3BvbnNlLmRhdGEuZm9yRWFjaCgoY29udGFjdDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQoY29udGFjdC5jb250YWN0RGlzcGxheU5hbWUgfHwgY29udGFjdC5jb250YWN0VWlkKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFVJRDonKSwgY29udGFjdC5jb250YWN0VWlkKTtcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNvbnRhY3RFbWFpbCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEVtYWlsOicpLCBjb250YWN0LmNvbnRhY3RFbWFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udGFjdC5jb250YWN0UGhvbmUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBQaG9uZTonKSwgY29udGFjdC5jb250YWN0UGhvbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRhY3QuY29udGFjdFRlbGVncmFtKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgVGVsZWdyYW06JyksIGNvbnRhY3QuY29udGFjdFRlbGVncmFtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRhY3QubGlua2VkSWRlbnRpdGllcyAmJiBjb250YWN0LmxpbmtlZElkZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIE5ldHdvcmtzOicpKTtcbiAgICAgICAgICAgICAgY29udGFjdC5saW5rZWRJZGVudGl0aWVzLmZvckVhY2goKGlkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgLScpLCBgJHtpZC5uZXR3b3JrSWR9ICgke2lkLnB1YmxpY1Rva2VufSlgKTtcbiAgICAgICAgICAgICAgICBpZiAoaWQuYWdlbnREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICAgJyksIGlkLmFnZW50RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgU3RhdHVzOicpLCBjb250YWN0LnN0YXR1cyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsaXN0IGNvbnRhY3RzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbnRhY3RzXG4gICAgLmNvbW1hbmQoJ3Nob3cnKVxuICAgIC5kZXNjcmlwdGlvbignU2hvdyBmdWxsIGRldGFpbHMgb2YgYSBjb250YWN0JylcbiAgICAucmVxdWlyZWRPcHRpb24oJy11LCAtLXVpZCA8dWlkPicsICdDb250YWN0IHVzZXIgVUlEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PGFueT4oYC92MS9jb250YWN0cy8ke29wdGlvbnMudWlkfWApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBjb250YWN0ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQoYFxcbiR7Y29udGFjdC5jb250YWN0RGlzcGxheU5hbWUgfHwgY29udGFjdC5jb250YWN0VWlkfVxcbmApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdVSUQ6JyksIGNvbnRhY3QuY29udGFjdFVpZCk7XG5cbiAgICAgICAgICBpZiAoY29udGFjdC5jb250YWN0RW1haWwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0VtYWlsOicpLCBjb250YWN0LmNvbnRhY3RFbWFpbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb250YWN0LmNvbnRhY3RQaG9uZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnUGhvbmU6JyksIGNvbnRhY3QuY29udGFjdFBob25lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbnRhY3QuY29udGFjdFRlbGVncmFtKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUZWxlZ3JhbTonKSwgY29udGFjdC5jb250YWN0VGVsZWdyYW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29udGFjdC5jb250YWN0UGhvdG9VcmwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1Bob3RvOicpLCBjb250YWN0LmNvbnRhY3RQaG90b1VybCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbnRhY3Qubm90ZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1xcbk5vdGVzOicpLCBjb250YWN0Lm5vdGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdTdGF0dXM6JyksIGNvbnRhY3Quc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChjb250YWN0LmNvbm5lY3Rpb25JZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnQ29ubmVjdGlvbjonKSwgY29udGFjdC5jb25uZWN0aW9uSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb250YWN0LmxpbmtlZElkZW50aXRpZXMgJiYgY29udGFjdC5saW5rZWRJZGVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKCdcXG5MaW5rZWQgSWRlbnRpdGllczpcXG4nKSk7XG4gICAgICAgICAgICBjb250YWN0LmxpbmtlZElkZW50aXRpZXMuZm9yRWFjaCgoaWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAgICR7aWQubmV0d29ya0lkfWApKTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgIFRva2VuOicpLCBpZC5wdWJsaWNUb2tlbik7XG4gICAgICAgICAgICAgIGlmIChpZC5hZ2VudERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgIERlc2NyaXB0aW9uOicpLCBpZC5hZ2VudERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbnRhY3QuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdBZGRlZDonKSwgZm9ybWF0VGltZXN0YW1wKGNvbnRhY3QuY3JlYXRlZEF0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NvbnRhY3Qgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbnRhY3RzXG4gICAgLmNvbW1hbmQoJ3VwZGF0ZScpXG4gICAgLmRlc2NyaXB0aW9uKCdVcGRhdGUgY29udGFjdCBub3RlcycpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctdSwgLS11aWQgPHVpZD4nLCAnQ29udGFjdCB1c2VyIFVJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1ub3RlcyA8dGV4dD4nLCAnTm90ZXMgYWJvdXQgdGhpcyBjb250YWN0JylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucHV0KGAvdjEvY29udGFjdHMvJHtvcHRpb25zLnVpZH1gLCB7XG4gICAgICAgICAgbm90ZXM6IG9wdGlvbnMubm90ZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIENvbnRhY3QgdXBkYXRlZCEnKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVUlEOicpLCBvcHRpb25zLnVpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwZGF0ZSBjb250YWN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbnRhY3RzXG4gICAgLmNvbW1hbmQoJ2Jsb2NrJylcbiAgICAuZGVzY3JpcHRpb24oJ0Jsb2NrIGEgY29udGFjdCAocmVtb3ZlcyBiaWRpcmVjdGlvbmFsIGNvbnRhY3RzKScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctdSwgLS11aWQgPHVpZD4nLCAnQ29udGFjdCB1c2VyIFVJRCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IGF3YWl0IGdldEh1bWFuQXV0aGVudGljYXRlZENsaWVudCgpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmRlbGV0ZShgL3YxL2NvbnRhY3RzLyR7b3B0aW9ucy51aWR9YCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIENvbnRhY3QgYmxvY2tlZCBhbmQgcmVtb3ZlZC4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVUlEOicpLCBvcHRpb25zLnVpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGJsb2NrIGNvbnRhY3QnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgY29udGFjdHNcbiAgICAuY29tbWFuZCgnbGluay1pZGVudGl0eScpXG4gICAgLmRlc2NyaXB0aW9uKCdMaW5rIGEgbmV0d29yayBpZGVudGl0eSB0byBhIGNvbnRhY3QnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLXUsIC0tdWlkIDx1aWQ+JywgJ0NvbnRhY3QgdXNlciBVSUQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWRlbnRpdHktaWQgPGlkPicsICdJZGVudGl0eSBJRCB0byBsaW5rJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL3YxL2NvbnRhY3RzLyR7b3B0aW9ucy51aWR9L2xpbmstaWRlbnRpdHlgLCB7XG4gICAgICAgICAgaWRlbnRpdHlJZDogb3B0aW9ucy5pZGVudGl0eUlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBJZGVudGl0eSBsaW5rZWQgdG8gY29udGFjdCEnKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnQ29udGFjdCBVSUQ6JyksIG9wdGlvbnMudWlkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJZGVudGl0eSBJRDonKSwgb3B0aW9ucy5pZGVudGl0eUlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gbGluayBpZGVudGl0eScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SHVtYW5BdXRoZW50aWNhdGVkQ2xpZW50KCk6IFByb21pc2U8eyBjbGllbnQ6IEFwaUNsaWVudDsgaHVtYW5VaWQ6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0R2xvYmFsQ29uZmlnKCkgYXMgYW55O1xuXG4gIGlmICghY29uZmlnLmh1bWFuSnd0IHx8ICFjb25maWcuaHVtYW5VaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhdXRoZW50aWNhdGVkIGFzIGEgaHVtYW4uIFBsZWFzZSBsb2cgaW4gYXQgaHVtYW5zLmFnZW50aWNwb29sLm5ldCBmaXJzdC4nKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaHVtYW5Kd3RFeHBpcmVzQXQgJiYgRGF0ZS5ub3coKSA+IGNvbmZpZy5odW1hbkp3dEV4cGlyZXNBdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSHVtYW4gc2Vzc2lvbiBleHBpcmVkLiBQbGVhc2UgbG9nIGluIGFnYWluIGF0IGh1bWFucy5hZ2VudGljcG9vbC5uZXQuJyk7XG4gIH1cblxuICBjb25zdCBodW1hbnNBcGlVcmwgPSBjb25maWcuaHVtYW5zQXBpVXJsIHx8IERFRkFVTFRfSFVNQU5TX0FQSV9VUkw7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoaHVtYW5zQXBpVXJsKTtcbiAgY2xpZW50LnNldEF1dGhUb2tlbihjb25maWcuaHVtYW5Kd3QpO1xuXG4gIHJldHVybiB7IGNsaWVudCwgaHVtYW5VaWQ6IGNvbmZpZy5odW1hblVpZCB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lc3RhbXAodHM6IGFueSk6IHN0cmluZyB7XG4gIGlmICghdHMpIHJldHVybiAndW5rbm93bic7XG4gIGlmICh0cy5fc2Vjb25kcykge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0cy5fc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiB0cyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRzID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0cykudG9JU09TdHJpbmcoKTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKHRzKTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConversationCommands(program: Command): void;