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.
- package/AGENTS.md +56 -0
- package/README.md +42 -0
- package/agenticpool-cli-1.0.0.tgz +0 -0
- package/dist/api/ApiClient.d.ts +24 -0
- package/dist/api/ApiClient.js +79 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +6 -0
- package/dist/auth/AuthHelper.d.ts +16 -0
- package/dist/auth/AuthHelper.js +137 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +166 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +51 -0
- package/dist/commands/connections.d.ts +2 -0
- package/dist/commands/connections.js +244 -0
- package/dist/commands/contacts.d.ts +2 -0
- package/dist/commands/contacts.js +205 -0
- package/dist/commands/conversations.d.ts +2 -0
- package/dist/commands/conversations.js +209 -0
- package/dist/commands/humans.d.ts +2 -0
- package/dist/commands/humans.js +129 -0
- package/dist/commands/identities.d.ts +2 -0
- package/dist/commands/identities.js +120 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.js +24 -0
- package/dist/commands/messages.d.ts +2 -0
- package/dist/commands/messages.js +72 -0
- package/dist/commands/networks.d.ts +2 -0
- package/dist/commands/networks.js +237 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.js +204 -0
- package/dist/config/ConfigManager.d.ts +31 -0
- package/dist/config/ConfigManager.js +135 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +7 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +22 -0
- package/dist/limits/LimitsManager.d.ts +23 -0
- package/dist/limits/LimitsManager.js +99 -0
- package/jest.config.js +23 -0
- package/package.json +47 -0
- package/src/api/ApiClient.ts +100 -0
- package/src/api/index.ts +1 -0
- package/src/auth/AuthHelper.ts +123 -0
- package/src/commands/auth.ts +169 -0
- package/src/commands/config.ts +51 -0
- package/src/commands/connections.ts +261 -0
- package/src/commands/contacts.ts +221 -0
- package/src/commands/conversations.ts +218 -0
- package/src/commands/humans.ts +124 -0
- package/src/commands/identities.ts +126 -0
- package/src/commands/index.ts +10 -0
- package/src/commands/messages.ts +72 -0
- package/src/commands/networks.ts +245 -0
- package/src/commands/profile.ts +184 -0
- package/src/config/ConfigManager.ts +137 -0
- package/src/config/index.ts +1 -0
- package/src/index.ts +35 -0
- package/src/limits/LimitsManager.ts +76 -0
- package/tests/ApiClient.test.ts +99 -0
- package/tests/ConfigManager.test.ts +41 -0
- package/tests/LimitsManager.test.ts +169 -0
- package/tests/__mocks__/@toon-format/toon.ts +27 -0
- package/tests/integration/cleanup.ts +187 -0
- package/tests/integration/e2e-cli.test.ts +465 -0
- package/tests/integration/e2e.test.ts +480 -0
- package/tests/integration/run-e2e.sh +44 -0
- package/tests/integration/setup.ts +188 -0
- 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,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,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==
|