agenticpool 1.0.19 → 2.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 (132) hide show
  1. package/README.md +68 -118
  2. package/bin/agenticpool.js +6 -0
  3. package/dist/adapters/autogen.d.ts +33 -0
  4. package/dist/adapters/autogen.d.ts.map +1 -0
  5. package/dist/adapters/autogen.js +49 -0
  6. package/dist/adapters/autogen.js.map +1 -0
  7. package/dist/adapters/crewai.d.ts +30 -0
  8. package/dist/adapters/crewai.d.ts.map +1 -0
  9. package/dist/adapters/crewai.js +48 -0
  10. package/dist/adapters/crewai.js.map +1 -0
  11. package/dist/adapters/langchain.d.ts +30 -0
  12. package/dist/adapters/langchain.d.ts.map +1 -0
  13. package/dist/adapters/langchain.js +53 -0
  14. package/dist/adapters/langchain.js.map +1 -0
  15. package/dist/adapters/llamaindex.d.ts +29 -0
  16. package/dist/adapters/llamaindex.d.ts.map +1 -0
  17. package/dist/adapters/llamaindex.js +47 -0
  18. package/dist/adapters/llamaindex.js.map +1 -0
  19. package/dist/adapters/openai.d.ts +21 -0
  20. package/dist/adapters/openai.d.ts.map +1 -0
  21. package/dist/adapters/openai.js +51 -0
  22. package/dist/adapters/openai.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +187 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/client.d.ts +115 -0
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +251 -0
  30. package/dist/client.js.map +1 -0
  31. package/dist/commands/balance.d.ts +4 -0
  32. package/dist/commands/balance.d.ts.map +1 -0
  33. package/dist/commands/balance.js +34 -0
  34. package/dist/commands/balance.js.map +1 -0
  35. package/dist/commands/contract.d.ts +20 -0
  36. package/dist/commands/contract.d.ts.map +1 -0
  37. package/dist/commands/contract.js +188 -0
  38. package/dist/commands/contract.js.map +1 -0
  39. package/dist/commands/favor.d.ts +21 -0
  40. package/dist/commands/favor.d.ts.map +1 -0
  41. package/dist/commands/favor.js +144 -0
  42. package/dist/commands/favor.js.map +1 -0
  43. package/dist/commands/init.d.ts +5 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +77 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/reputation.d.ts +2 -0
  48. package/dist/commands/reputation.d.ts.map +1 -0
  49. package/dist/commands/reputation.js +38 -0
  50. package/dist/commands/reputation.js.map +1 -0
  51. package/dist/commands/serve.d.ts +7 -0
  52. package/dist/commands/serve.d.ts.map +1 -0
  53. package/dist/commands/serve.js +110 -0
  54. package/dist/commands/serve.js.map +1 -0
  55. package/dist/commands/services.d.ts +16 -0
  56. package/dist/commands/services.d.ts.map +1 -0
  57. package/dist/commands/services.js +93 -0
  58. package/dist/commands/services.js.map +1 -0
  59. package/dist/commands/trust.d.ts +2 -0
  60. package/dist/commands/trust.d.ts.map +1 -0
  61. package/dist/commands/trust.js +44 -0
  62. package/dist/commands/trust.js.map +1 -0
  63. package/dist/commands/whoami.d.ts +2 -0
  64. package/dist/commands/whoami.d.ts.map +1 -0
  65. package/dist/commands/whoami.js +32 -0
  66. package/dist/commands/whoami.js.map +1 -0
  67. package/dist/config.d.ts +30 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +72 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/economy/duckies.d.ts +75 -0
  72. package/dist/economy/duckies.d.ts.map +1 -0
  73. package/dist/economy/duckies.js +386 -0
  74. package/dist/economy/duckies.js.map +1 -0
  75. package/dist/index.d.ts +12 -2
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +12 -29
  78. package/dist/index.js.map +1 -0
  79. package/dist/types.d.ts +90 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +5 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +28 -38
  84. package/LICENSE +0 -1
  85. package/dist/api/ApiClient.d.ts +0 -37
  86. package/dist/api/ApiClient.js +0 -160
  87. package/dist/api/index.d.ts +0 -1
  88. package/dist/api/index.js +0 -6
  89. package/dist/auth/AuthHelper.d.ts +0 -17
  90. package/dist/auth/AuthHelper.js +0 -197
  91. package/dist/commands/auth.d.ts +0 -2
  92. package/dist/commands/auth.js +0 -206
  93. package/dist/commands/config.d.ts +0 -2
  94. package/dist/commands/config.js +0 -51
  95. package/dist/commands/connections.d.ts +0 -2
  96. package/dist/commands/connections.js +0 -244
  97. package/dist/commands/contacts.d.ts +0 -2
  98. package/dist/commands/contacts.js +0 -205
  99. package/dist/commands/conversations.d.ts +0 -2
  100. package/dist/commands/conversations.js +0 -251
  101. package/dist/commands/errors.d.ts +0 -2
  102. package/dist/commands/errors.js +0 -73
  103. package/dist/commands/humans.d.ts +0 -2
  104. package/dist/commands/humans.js +0 -161
  105. package/dist/commands/identities.d.ts +0 -2
  106. package/dist/commands/identities.js +0 -141
  107. package/dist/commands/index.d.ts +0 -11
  108. package/dist/commands/index.js +0 -26
  109. package/dist/commands/messages.d.ts +0 -2
  110. package/dist/commands/messages.js +0 -216
  111. package/dist/commands/networks.d.ts +0 -2
  112. package/dist/commands/networks.js +0 -430
  113. package/dist/commands/profile.d.ts +0 -2
  114. package/dist/commands/profile.js +0 -257
  115. package/dist/config/ConfigManager.d.ts +0 -47
  116. package/dist/config/ConfigManager.js +0 -234
  117. package/dist/config/index.d.ts +0 -1
  118. package/dist/config/index.js +0 -7
  119. package/dist/datamodel/index.d.ts +0 -3
  120. package/dist/datamodel/index.js +0 -20
  121. package/dist/datamodel/models/humans.d.ts +0 -81
  122. package/dist/datamodel/models/humans.js +0 -3
  123. package/dist/datamodel/models/index.d.ts +0 -110
  124. package/dist/datamodel/models/index.js +0 -3
  125. package/dist/datamodel/toon/index.d.ts +0 -5
  126. package/dist/datamodel/toon/index.js +0 -225
  127. package/dist/limits/LimitsManager.d.ts +0 -23
  128. package/dist/limits/LimitsManager.js +0 -99
  129. package/dist/utils/colors.d.ts +0 -16
  130. package/dist/utils/colors.js +0 -23
  131. package/dist/utils/logger.d.ts +0 -11
  132. package/dist/utils/logger.js +0 -34
package/package.json CHANGED
@@ -1,54 +1,44 @@
1
1
  {
2
2
  "name": "agenticpool",
3
- "version": "1.0.19",
4
- "description": "CLI for AgenticPool - Social Network for Agents",
3
+ "version": "2.0.0",
4
+ "type": "module",
5
+ "description": "AgenticPool.net — Decentralized AI agent favor exchange network powered by Duckies & A2A Trust Protocol",
5
6
  "main": "dist/index.js",
6
7
  "types": "dist/index.d.ts",
7
8
  "bin": {
8
- "agenticpool": "./dist/index.js"
9
+ "agenticpool": "bin/agenticpool.js"
9
10
  },
10
- "files": [
11
- "dist/",
12
- "README.md",
13
- "LICENSE"
14
- ],
15
11
  "scripts": {
16
- "build": "tsc",
17
- "start": "node dist/index.js",
18
- "dev": "ts-node src/index.ts",
19
- "test": "jest --runInBand",
20
- "test:unit": "jest tests/ApiClient.test.ts tests/ConfigManager.test.ts",
21
- "test:integration": "jest --runInBand tests/integration/",
22
- "test:e2e": "bash tests/integration/run-e2e.sh cli",
23
- "test:e2e:api": "bash tests/integration/run-e2e.sh api",
24
- "test:watch": "jest --watch",
25
- "test:coverage": "jest --coverage",
26
- "prepublishOnly": "npm run build"
12
+ "build": "tsc -p tsconfig.json",
13
+ "start": "node bin/agenticpool.js",
14
+ "test": "node --import tsx --test tests/**/*.test.ts",
15
+ "lint": "tsc --noEmit"
27
16
  },
28
17
  "keywords": [
29
18
  "agenticpool",
30
- "cli",
31
- "agents",
32
- "social-network"
19
+ "agora",
20
+ "ai-agents",
21
+ "duckies",
22
+ "favors",
23
+ "marketplace",
24
+ "a2a"
25
+ ],
26
+ "author": "2mes4",
27
+ "license": "Apache-2.0",
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "bin",
34
+ "README.md"
33
35
  ],
34
- "author": "AgenticPool",
35
- "license": "MIT",
36
36
  "dependencies": {
37
- "@toon-format/toon": "^2.1.0",
38
- "axios": "^1.14.0",
39
- "chalk": "^5.6.2",
40
- "cli-table3": "^0.6.5",
41
- "commander": "^14.0.3",
42
- "fs-extra": "^11.3.4"
37
+ "commander": "^13.1.0"
43
38
  },
44
39
  "devDependencies": {
45
- "@types/fs-extra": "^11.0.4",
46
- "@types/jest": "^30.0.0",
47
- "@types/node": "^25.5.2",
48
- "firebase-admin": "^13.7.0",
49
- "jest": "^30.3.0",
50
- "ts-jest": "^29.4.9",
51
- "ts-node": "^10.9.2",
52
- "typescript": "^6.0.2"
40
+ "@types/node": "^22.13.0",
41
+ "tsx": "^4.19.2",
42
+ "typescript": "^5.7.3"
53
43
  }
54
44
  }
package/LICENSE DELETED
@@ -1 +0,0 @@
1
- MIT License
@@ -1,37 +0,0 @@
1
- export interface ApiError {
2
- code: string;
3
- message: string;
4
- details?: Record<string, unknown>;
5
- }
6
- export interface ApiResponse<T> {
7
- success: boolean;
8
- data?: T;
9
- error?: ApiError;
10
- }
11
- export declare class ApiClient {
12
- private client;
13
- private format;
14
- constructor(baseUrl: string);
15
- static create(): Promise<ApiClient>;
16
- setAuthToken(token: string): void;
17
- clearAuthToken(): void;
18
- setFormat(format: 'toon' | 'json'): void;
19
- get<T>(path: string, params?: Record<string, unknown>): Promise<ApiResponse<T>>;
20
- post<T>(path: string, data?: unknown): Promise<ApiResponse<T>>;
21
- put<T>(path: string, data?: unknown): Promise<ApiResponse<T>>;
22
- delete<T>(path: string): Promise<ApiResponse<T>>;
23
- private parseResponse;
24
- reportError(errorContext: {
25
- command: string;
26
- errorCode: string;
27
- errorMessage: string;
28
- stackTrace?: string;
29
- cliVersion: string;
30
- nodeVersion: string;
31
- os: string;
32
- arch: string;
33
- agentModel?: string;
34
- agentName?: string;
35
- tags?: string[];
36
- }): Promise<void>;
37
- }
@@ -1,160 +0,0 @@
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.ApiClient = void 0;
7
- const axios_1 = __importDefault(require("axios"));
8
- const config_1 = require("../config");
9
- const logger_1 = require("../utils/logger");
10
- const datamodel_1 = require("../datamodel");
11
- class ApiClient {
12
- constructor(baseUrl) {
13
- this.format = 'toon';
14
- logger_1.logger.debug(`Initializing ApiClient with baseUrl: ${baseUrl}`);
15
- this.client = axios_1.default.create({
16
- baseURL: baseUrl,
17
- timeout: 30000
18
- });
19
- // Add request interceptor for logging
20
- this.client.interceptors.request.use(config => {
21
- logger_1.logger.debug(`API Request: ${config.method?.toUpperCase()} ${config.url}`);
22
- if (config.params)
23
- logger_1.logger.debug(`Params: ${JSON.stringify(config.params)}`);
24
- return config;
25
- });
26
- // Add response interceptor for logging
27
- this.client.interceptors.response.use(response => {
28
- logger_1.logger.debug(`API Response: ${response.status} ${response.config.url}`);
29
- return response;
30
- }, error => {
31
- logger_1.logger.debug(`API Error: ${error.message}`);
32
- if (error.response) {
33
- logger_1.logger.debug(`Status: ${error.response.status}`);
34
- logger_1.logger.debug(`Data: ${JSON.stringify(error.response.data)}`);
35
- }
36
- return Promise.reject(error);
37
- });
38
- }
39
- static async create() {
40
- logger_1.logger.debug('ApiClient.create() called');
41
- const config = await config_1.configManager.getGlobalConfig();
42
- const client = new ApiClient(config.apiUrl);
43
- client.format = config.defaultFormat;
44
- return client;
45
- }
46
- setAuthToken(token) {
47
- logger_1.logger.debug('Setting Auth Token');
48
- this.client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
49
- }
50
- clearAuthToken() {
51
- logger_1.logger.debug('Clearing Auth Token');
52
- delete this.client.defaults.headers.common['Authorization'];
53
- }
54
- setFormat(format) {
55
- logger_1.logger.debug(`Setting format to: ${format}`);
56
- this.format = format;
57
- }
58
- async get(path, params) {
59
- const config = { params: { ...params, format: this.format } };
60
- try {
61
- const response = await this.client.get(path, config);
62
- return this.parseResponse(response.data);
63
- }
64
- catch (e) {
65
- if (e.response && e.response.data) {
66
- return this.parseResponse(e.response.data);
67
- }
68
- return { success: false, error: { code: 'REQUEST_FAILED', message: e instanceof Error ? e.message : 'Unknown error' } };
69
- }
70
- }
71
- async post(path, data) {
72
- const body = this.format === 'toon' && data ? (0, datamodel_1.encode)(data) : JSON.stringify(data);
73
- const config = {
74
- params: { format: this.format },
75
- headers: { 'Content-Type': 'text/plain' }
76
- };
77
- try {
78
- const response = await this.client.post(path, body, config);
79
- return this.parseResponse(response.data);
80
- }
81
- catch (e) {
82
- if (e.response && e.response.data) {
83
- return this.parseResponse(e.response.data);
84
- }
85
- return { success: false, error: { code: 'REQUEST_FAILED', message: e instanceof Error ? e.message : 'Unknown error' } };
86
- }
87
- }
88
- async put(path, data) {
89
- const body = this.format === 'toon' && data ? (0, datamodel_1.encode)(data) : JSON.stringify(data);
90
- const config = {
91
- params: { format: this.format },
92
- headers: { 'Content-Type': 'text/plain' }
93
- };
94
- try {
95
- const response = await this.client.put(path, body, config);
96
- return this.parseResponse(response.data);
97
- }
98
- catch (e) {
99
- if (e.response && e.response.data) {
100
- return this.parseResponse(e.response.data);
101
- }
102
- return { success: false, error: { code: 'REQUEST_FAILED', message: e instanceof Error ? e.message : 'Unknown error' } };
103
- }
104
- }
105
- async delete(path) {
106
- const config = { params: { format: this.format } };
107
- try {
108
- const response = await this.client.delete(path, config);
109
- return this.parseResponse(response.data);
110
- }
111
- catch (e) {
112
- if (e.response && e.response.data) {
113
- return this.parseResponse(e.response.data);
114
- }
115
- return { success: false, error: { code: 'REQUEST_FAILED', message: e instanceof Error ? e.message : 'Unknown error' } };
116
- }
117
- }
118
- parseResponse(data) {
119
- logger_1.logger.debug(`Parsing response data (type: ${typeof data})`);
120
- if (typeof data !== 'string') {
121
- return data;
122
- }
123
- const trimmed = data.trim();
124
- if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
125
- try {
126
- return JSON.parse(trimmed);
127
- }
128
- catch {
129
- return { success: false, error: { code: 'PARSE_ERROR', message: 'Failed to parse JSON response' } };
130
- }
131
- }
132
- if (trimmed.startsWith('<') || trimmed.startsWith('<!DOCTYPE')) {
133
- return { success: false, error: { code: 'PARSE_ERROR', message: 'Received HTML instead of API response' } };
134
- }
135
- try {
136
- return (0, datamodel_1.decode)(trimmed);
137
- }
138
- catch {
139
- try {
140
- return JSON.parse(trimmed);
141
- }
142
- catch {
143
- return { success: false, error: { code: 'PARSE_ERROR', message: 'Failed to parse response' } };
144
- }
145
- }
146
- }
147
- async reportError(errorContext) {
148
- try {
149
- const savedFormat = this.format;
150
- this.format = 'json';
151
- await this.post('/v1/errors', errorContext);
152
- this.format = savedFormat;
153
- }
154
- catch {
155
- // Silent — never block CLI for error reporting
156
- }
157
- }
158
- }
159
- exports.ApiClient = ApiClient;
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9BcGlDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQWlFO0FBQ2pFLHNDQUF3RDtBQUN4RCw0Q0FBeUM7QUFDekMsNENBQThDO0FBYzlDLE1BQWEsU0FBUztJQUlwQixZQUFZLE9BQWU7UUFGbkIsV0FBTSxHQUFvQixNQUFNLENBQUM7UUFHdkMsZUFBTSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQUM7WUFDekIsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDLENBQUM7UUFFSCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QyxlQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLElBQUksTUFBTSxDQUFDLE1BQU07Z0JBQUUsZUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILHVDQUF1QztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNuQyxRQUFRLENBQUMsRUFBRTtZQUNULGVBQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lB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bmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGNvbmZpZ01hbmFnZXIsIEdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgZW5jb2RlLCBkZWNvZGUgfSBmcm9tICcuLi9kYXRhbW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yIHtcbiAgY29kZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlSZXNwb25zZTxUPiB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE/OiBUO1xuICBlcnJvcj86IEFwaUVycm9yO1xufVxuXG5leHBvcnQgY2xhc3MgQXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSBjbGllbnQ6IEF4aW9zSW5zdGFuY2U7XG4gIHByaXZhdGUgZm9ybWF0OiAndG9vbicgfCAnanNvbicgPSAndG9vbic7XG5cbiAgY29uc3RydWN0b3IoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBJbml0aWFsaXppbmcgQXBpQ2xpZW50IHdpdGggYmFzZVVybDogJHtiYXNlVXJsfWApO1xuICAgIHRoaXMuY2xpZW50ID0gYXhpb3MuY3JlYXRlKHtcbiAgICAgIGJhc2VVUkw6IGJhc2VVcmwsXG4gICAgICB0aW1lb3V0OiAzMDAwMFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHJlcXVlc3QgaW50ZXJjZXB0b3IgZm9yIGxvZ2dpbmdcbiAgICB0aGlzLmNsaWVudC5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoY29uZmlnID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQVBJIFJlcXVlc3Q6ICR7Y29uZmlnLm1ldGhvZD8udG9VcHBlckNhc2UoKX0gJHtjb25maWcudXJsfWApO1xuICAgICAgaWYgKGNvbmZpZy5wYXJhbXMpIGxvZ2dlci5kZWJ1ZyhgUGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy5wYXJhbXMpfWApO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9KTtcblxuICAgIC8vIEFkZCByZXNwb25zZSBpbnRlcmNlcHRvciBmb3IgbG9nZ2luZ1xuICAgIHRoaXMuY2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG4gICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQVBJIFJlc3BvbnNlOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5jb25maWcudXJsfWApO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEFQSSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFN0YXR1czogJHtlcnJvci5yZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEYXRhOiAke0pTT04uc3RyaW5naWZ5KGVycm9yLnJlc3BvbnNlLmRhdGEpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoKTogUHJvbWlzZTxBcGlDbGllbnQ+IHtcbiAgICBsb2dnZXIuZGVidWcoJ0FwaUNsaWVudC5jcmVhdGUoKSBjYWxsZWQnKTtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldEdsb2JhbENvbmZpZygpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBBcGlDbGllbnQoY29uZmlnLmFwaVVybCk7XG4gICAgY2xpZW50LmZvcm1hdCA9IGNvbmZpZy5kZWZhdWx0Rm9ybWF0O1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICBzZXRBdXRoVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZygnU2V0dGluZyBBdXRoIFRva2VuJyk7XG4gICAgdGhpcy5jbGllbnQuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICB9XG5cbiAgY2xlYXJBdXRoVG9rZW4oKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDbGVhcmluZyBBdXRoIFRva2VuJyk7XG4gICAgZGVsZXRlIHRoaXMuY2xpZW50LmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydBdXRob3JpemF0aW9uJ107XG4gIH1cblxuICBzZXRGb3JtYXQoZm9ybWF0OiAndG9vbicgfCAnanNvbicpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYFNldHRpbmcgZm9ybWF0IHRvOiAke2Zvcm1hdH1gKTtcbiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgfVxuXG4gIGFzeW5jIGdldDxUPihwYXRoOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGNvbmZpZzogQXhpb3NSZXF1ZXN0Q29uZmlnID0geyBwYXJhbXM6IHsgLi4ucGFyYW1zLCBmb3JtYXQ6IHRoaXMuZm9ybWF0IH0gfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXQocGF0aCwgY29uZmlnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UuZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZS5yZXNwb25zZSAmJiBlLnJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihlLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiB7IGNvZGU6ICdSRVFVRVNUX0ZBSUxFRCcsIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyB9IH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcG9zdDxUPihwYXRoOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZvcm1hdCA9PT0gJ3Rvb24nICYmIGRhdGEgPyBlbmNvZGUoZGF0YSkgOiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICBjb25zdCBjb25maWc6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHsgXG4gICAgICBwYXJhbXM6IHsgZm9ybWF0OiB0aGlzLmZvcm1hdCB9LFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIH1cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnBvc3QocGF0aCwgYm9keSwgY29uZmlnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UuZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZS5yZXNwb25zZSAmJiBlLnJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihlLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiB7IGNvZGU6ICdSRVFVRVNUX0ZBSUxFRCcsIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyB9IH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHV0PFQ+KHBhdGg6IHN0cmluZywgZGF0YT86IHVua25vd24pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYm9keSA9IHRoaXMuZm9ybWF0ID09PSAndG9vbicgJiYgZGF0YSA/IGVuY29kZShkYXRhKSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGNvbnN0IGNvbmZpZzogQXhpb3NSZXF1ZXN0Q29uZmlnID0geyBcbiAgICAgIHBhcmFtczogeyBmb3JtYXQ6IHRoaXMuZm9ybWF0IH0sXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicgfVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucHV0KHBhdGgsIGJvZHksIGNvbmZpZyk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlLmRhdGEpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUucmVzcG9uc2UgJiYgZS5yZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4oZS5yZXNwb25zZS5kYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogeyBjb2RlOiAnUkVRVUVTVF9GQUlMRUQnLCBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicgfSB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgY29uZmlnOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7IHBhcmFtczogeyBmb3JtYXQ6IHRoaXMuZm9ybWF0IH0gfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgY29uZmlnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVzcG9uc2U8VD4ocmVzcG9uc2UuZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZS5yZXNwb25zZSAmJiBlLnJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXNwb25zZTxUPihlLnJlc3BvbnNlLmRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiB7IGNvZGU6ICdSRVFVRVNUX0ZBSUxFRCcsIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyB9IH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVJlc3BvbnNlPFQ+KGRhdGE6IHN0cmluZyB8IG9iamVjdCk6IEFwaVJlc3BvbnNlPFQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFBhcnNpbmcgcmVzcG9uc2UgZGF0YSAodHlwZTogJHt0eXBlb2YgZGF0YX0pYCk7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGRhdGEgYXMgQXBpUmVzcG9uc2U8VD47XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZCA9IGRhdGEudHJpbSgpO1xuXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgneycpIHx8IHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyBBcGlSZXNwb25zZTxUPjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IHsgY29kZTogJ1BBUlNFX0VSUk9SJywgbWVzc2FnZTogJ0ZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlJyB9IH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnPCcpIHx8IHRyaW1tZWQuc3RhcnRzV2l0aCgnPCFET0NUWVBFJykpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogeyBjb2RlOiAnUEFSU0VfRVJST1InLCBtZXNzYWdlOiAnUmVjZWl2ZWQgSFRNTCBpbnN0ZWFkIG9mIEFQSSByZXNwb25zZScgfSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjb2RlPEFwaVJlc3BvbnNlPFQ+Pih0cmltbWVkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRyaW1tZWQpIGFzIEFwaVJlc3BvbnNlPFQ+O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogeyBjb2RlOiAnUEFSU0VfRVJST1InLCBtZXNzYWdlOiAnRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlJyB9IH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVwb3J0RXJyb3IoZXJyb3JDb250ZXh0OiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGVycm9yQ29kZTogc3RyaW5nO1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICAgIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG4gICAgY2xpVmVyc2lvbjogc3RyaW5nO1xuICAgIG5vZGVWZXJzaW9uOiBzdHJpbmc7XG4gICAgb3M6IHN0cmluZztcbiAgICBhcmNoOiBzdHJpbmc7XG4gICAgYWdlbnRNb2RlbD86IHN0cmluZztcbiAgICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhdmVkRm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgICB0aGlzLmZvcm1hdCA9ICdqc29uJztcbiAgICAgIGF3YWl0IHRoaXMucG9zdCgnL3YxL2Vycm9ycycsIGVycm9yQ29udGV4dCk7XG4gICAgICB0aGlzLmZvcm1hdCA9IHNhdmVkRm9ybWF0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU2lsZW50IOKAlCBuZXZlciBibG9jayBDTEkgZm9yIGVycm9yIHJlcG9ydGluZ1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1 +0,0 @@
1
- export { ApiClient } from './ApiClient';
package/dist/api/index.js DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiClient = void 0;
4
- var ApiClient_1 = require("./ApiClient");
5
- Object.defineProperty(exports, "ApiClient", { enumerable: true, get: function () { return ApiClient_1.ApiClient; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUEvQixzR0FBQSxTQUFTLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuL0FwaUNsaWVudCc7XG4iXX0=
@@ -1,17 +0,0 @@
1
- import { ApiClient } from '../api/ApiClient';
2
- import { NetworkCredentials } from '../config/ConfigManager';
3
- export interface AuthResult {
4
- client: ApiClient;
5
- credentials: NetworkCredentials;
6
- isNewUser: boolean;
7
- }
8
- export declare class AuthHelper {
9
- static ensureAuthenticated(networkId: string, reason?: string): Promise<AuthResult>;
10
- private static handleAuthResponse;
11
- static getApiClient(): Promise<ApiClient>;
12
- static getAuthenticatedClient(networkId: string, reason?: string): Promise<ApiClient>;
13
- static getFirstAuthenticatedClient(): Promise<{
14
- client: ApiClient;
15
- networkId: string;
16
- }>;
17
- }
@@ -1,197 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.AuthHelper = void 0;
40
- const logger_1 = require("../utils/logger");
41
- const path = __importStar(require("path"));
42
- const os = __importStar(require("os"));
43
- const fs = __importStar(require("fs-extra"));
44
- const ApiClient_1 = require("../api/ApiClient");
45
- const ConfigManager_1 = require("../config/ConfigManager");
46
- const colors_1 = __importDefault(require("../utils/colors"));
47
- class AuthHelper {
48
- static async ensureAuthenticated(networkId, reason) {
49
- const config = await ConfigManager_1.configManager.getGlobalConfig();
50
- const client = new ApiClient_1.ApiClient(config.apiUrl);
51
- client.setFormat(config.defaultFormat);
52
- const existingCreds = await ConfigManager_1.configManager.getCredentials(networkId);
53
- if (existingCreds && existingCreds.jwt && existingCreds.expiresAt) {
54
- const bufferTime = 5 * 60 * 1000;
55
- if (Date.now() < (existingCreds.expiresAt - bufferTime)) {
56
- client.setAuthToken(existingCreds.jwt);
57
- if (reason) {
58
- try {
59
- await client.post('/v1/auth/login', {
60
- networkId,
61
- publicToken: existingCreds.publicToken,
62
- privateKey: existingCreds.privateKey,
63
- reason
64
- });
65
- }
66
- catch (e) {
67
- // Ignore background reason update failures
68
- }
69
- }
70
- return { client, credentials: existingCreds, isNewUser: false };
71
- }
72
- }
73
- if (existingCreds && existingCreds.privateKey) {
74
- console.log(colors_1.default.gray(` Attempting login for ${networkId}...`));
75
- try {
76
- const response = await client.post('/v1/auth/login', {
77
- networkId,
78
- publicToken: existingCreds.publicToken,
79
- privateKey: existingCreds.privateKey,
80
- reason
81
- });
82
- if (response.success && response.data) {
83
- const updatedCreds = {
84
- ...existingCreds,
85
- jwt: response.data.jwt,
86
- expiresAt: response.data.expiresAt
87
- };
88
- await ConfigManager_1.configManager.saveCredentials(networkId, updatedCreds);
89
- client.setAuthToken(response.data.jwt);
90
- return { client, credentials: updatedCreds, isNewUser: false };
91
- }
92
- }
93
- catch (error) {
94
- // Login failed, will try to register
95
- }
96
- }
97
- // Try to use global identity if it exists
98
- const defaultIdentity = await ConfigManager_1.configManager.getDefaultIdentity();
99
- let keys = defaultIdentity;
100
- if (!keys) {
101
- console.log(colors_1.default.gray(' Generating new identity keys...'));
102
- const keysResponse = await client.get('/v1/auth/generate-keys');
103
- if (!keysResponse.success || !keysResponse.data) {
104
- throw new Error('Failed to generate keys');
105
- }
106
- keys = keysResponse.data;
107
- // Save as default for future use
108
- await ConfigManager_1.configManager.saveDefaultIdentity(keys);
109
- }
110
- console.log(colors_1.default.gray(` Registering in network ${networkId}...`));
111
- const registerResponse = await client.post('/v1/auth/register', {
112
- networkId,
113
- publicToken: keys.publicToken,
114
- privateKey: keys.privateKey,
115
- reason
116
- });
117
- if (registerResponse.success && registerResponse.data) {
118
- return this.handleAuthResponse(networkId, keys, registerResponse.data, client, true);
119
- }
120
- // Fallback: If already registered (or any 400-like error), try login instead
121
- const errorMessage = registerResponse.error?.message || '';
122
- const isAlreadyRegistered = errorMessage.toLowerCase().includes('already registered');
123
- if (isAlreadyRegistered || !registerResponse.success) {
124
- console.log(colors_1.default.gray(` Registration failed (likely already registered). Attempting login for ${networkId}...`));
125
- const loginResponse = await client.post('/v1/auth/login', {
126
- networkId,
127
- publicToken: keys.publicToken,
128
- privateKey: keys.privateKey,
129
- reason
130
- });
131
- if (loginResponse.success && loginResponse.data) {
132
- return this.handleAuthResponse(networkId, keys, loginResponse.data, client, false);
133
- }
134
- }
135
- throw new Error(registerResponse.error?.message || 'Failed to authenticate');
136
- }
137
- static async handleAuthResponse(networkId, keys, responseData, client, isNewUser) {
138
- // Search for JWT in different possible locations due to TOON decoding variations
139
- const jwt = responseData.jwt ||
140
- (responseData.data && responseData.data.jwt) ||
141
- (responseData.tokens && responseData.tokens.jwt) ||
142
- (responseData.data && responseData.data.tokens && responseData.data.tokens.jwt);
143
- const expiresAt = responseData.expiresAt ||
144
- (responseData.data && responseData.data.expiresAt) ||
145
- (responseData.tokens && responseData.tokens.expiresAt);
146
- if (!jwt) {
147
- logger_1.logger.debug('Auth Response Data:', JSON.stringify(responseData));
148
- throw new Error('Authentication succeeded but no JWT found in response');
149
- }
150
- const newCreds = {
151
- publicToken: keys.publicToken,
152
- privateKey: keys.privateKey,
153
- jwt: jwt,
154
- expiresAt: expiresAt || (Date.now() + 24 * 3600 * 1000) // Default 24h if missing
155
- };
156
- await ConfigManager_1.configManager.saveCredentials(networkId, newCreds);
157
- client.setAuthToken(jwt);
158
- if (isNewUser) {
159
- console.log(colors_1.default.green(` ✓ Auto-registered in network: ${networkId}`));
160
- }
161
- else {
162
- console.log(colors_1.default.green(` ✓ Logged into network: ${networkId}`));
163
- }
164
- return { client, credentials: newCreds, isNewUser };
165
- }
166
- static async getApiClient() {
167
- const config = await ConfigManager_1.configManager.getGlobalConfig();
168
- const client = new ApiClient_1.ApiClient(config.apiUrl);
169
- client.setFormat(config.defaultFormat);
170
- return client;
171
- }
172
- static async getAuthenticatedClient(networkId, reason) {
173
- const result = await this.ensureAuthenticated(networkId, reason);
174
- return result.client;
175
- }
176
- static async getFirstAuthenticatedClient() {
177
- const credentialsDir = path.join(os.homedir(), '.agenticpool', 'credentials');
178
- if (!(await fs.pathExists(credentialsDir))) {
179
- throw new Error('No stored credentials found. Run "agenticpool auth connect <networkId>" first.');
180
- }
181
- const files = await fs.readdir(credentialsDir);
182
- const jsonFiles = files.filter(f => f.endsWith('.json'));
183
- for (const file of jsonFiles) {
184
- const networkId = file.replace('.json', '');
185
- try {
186
- const result = await this.ensureAuthenticated(networkId);
187
- return { client: result.client, networkId };
188
- }
189
- catch {
190
- continue;
191
- }
192
- }
193
- throw new Error('No valid credentials found. Run "agenticpool auth connect <networkId>" first.');
194
- }
195
- }
196
- exports.AuthHelper = AuthHelper;
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXV0aEhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL0F1dGhIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQXlDO0FBQ3pDLDJDQUE2QjtBQUM3Qix1Q0FBeUI7QUFDekIsNkNBQStCO0FBQy9CLGdEQUE2QztBQUM3QywyREFBNEU7QUFDNUUsNkRBQW9DO0FBUXBDLE1BQWEsVUFBVTtJQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQWlCLEVBQUUsTUFBZTtRQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLDZCQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV2QyxNQUFNLGFBQWEsR0FBRyxNQUFNLDZCQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxJQUFJLENBQUM7d0JBQ0gsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFOzRCQUNsQyxTQUFTOzRCQUNULFdB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LElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRXpELEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDOUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7SUFDbkcsQ0FBQztDQUNGO0FBckxELGdDQXFMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi4vYXBpL0FwaUNsaWVudCc7XG5pbXBvcnQgeyBjb25maWdNYW5hZ2VyLCBOZXR3b3JrQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9jb25maWcvQ29uZmlnTWFuYWdlcic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnLi4vdXRpbHMvY29sb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoUmVzdWx0IHtcbiAgY2xpZW50OiBBcGlDbGllbnQ7XG4gIGNyZWRlbnRpYWxzOiBOZXR3b3JrQ3JlZGVudGlhbHM7XG4gIGlzTmV3VXNlcjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhIZWxwZXIge1xuICBzdGF0aWMgYXN5bmMgZW5zdXJlQXV0aGVudGljYXRlZChuZXR3b3JrSWQ6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzdWx0PiB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQXBpQ2xpZW50KGNvbmZpZy5hcGlVcmwpO1xuICAgIGNsaWVudC5zZXRGb3JtYXQoY29uZmlnLmRlZmF1bHRGb3JtYXQpO1xuXG4gICAgY29uc3QgZXhpc3RpbmdDcmVkcyA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0Q3JlZGVudGlhbHMobmV0d29ya0lkKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdDcmVkcyAmJiBleGlzdGluZ0NyZWRzLmp3dCAmJiBleGlzdGluZ0NyZWRzLmV4cGlyZXNBdCkge1xuICAgICAgY29uc3QgYnVmZmVyVGltZSA9IDUgKiA2MCAqIDEwMDA7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IChleGlzdGluZ0NyZWRzLmV4cGlyZXNBdCAtIGJ1ZmZlclRpbWUpKSB7XG4gICAgICAgIGNsaWVudC5zZXRBdXRoVG9rZW4oZXhpc3RpbmdDcmVkcy5qd3QpO1xuICAgICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KCcvdjEvYXV0aC9sb2dpbicsIHtcbiAgICAgICAgICAgICAgbmV0d29ya0lkLFxuICAgICAgICAgICAgICBwdWJsaWNUb2tlbjogZXhpc3RpbmdDcmVkcy5wdWJsaWNUb2tlbixcbiAgICAgICAgICAgICAgcHJpdmF0ZUtleTogZXhpc3RpbmdDcmVkcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBiYWNrZ3JvdW5kIHJlYXNvbiB1cGRhdGUgZmFpbHVyZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2xpZW50LCBjcmVkZW50aWFsczogZXhpc3RpbmdDcmVkcywgaXNOZXdVc2VyOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGlzdGluZ0NyZWRzICYmIGV4aXN0aW5nQ3JlZHMucHJpdmF0ZUtleSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBBdHRlbXB0aW5nIGxvZ2luIGZvciAke25ldHdvcmtJZH0uLi5gKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHsgand0OiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyBwdWJsaWNUb2tlbjogc3RyaW5nIH0+KCcvdjEvYXV0aC9sb2dpbicsIHtcbiAgICAgICAgICBuZXR3b3JrSWQsXG4gICAgICAgICAgcHVibGljVG9rZW46IGV4aXN0aW5nQ3JlZHMucHVibGljVG9rZW4sXG4gICAgICAgICAgcHJpdmF0ZUtleTogZXhpc3RpbmdDcmVkcy5wcml2YXRlS2V5LFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZENyZWRzOiBOZXR3b3JrQ3JlZGVudGlhbHMgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ0NyZWRzLFxuICAgICAgICAgICAgand0OiByZXNwb25zZS5kYXRhLmp3dCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogcmVzcG9uc2UuZGF0YS5leHBpcmVzQXRcbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuc2F2ZUNyZWRlbnRpYWxzKG5ldHdvcmtJZCwgdXBkYXRlZENyZWRzKTtcbiAgICAgICAgICBjbGllbnQuc2V0QXV0aFRva2VuKHJlc3BvbnNlLmRhdGEuand0KTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4geyBjbGllbnQsIGNyZWRlbnRpYWxzOiB1cGRhdGVkQ3JlZHMsIGlzTmV3VXNlcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9naW4gZmFpbGVkLCB3aWxsIHRyeSB0byByZWdpc3RlclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyeSB0byB1c2UgZ2xvYmFsIGlkZW50aXR5IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IGRlZmF1bHRJZGVudGl0eSA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdElkZW50aXR5KCk7XG4gICAgbGV0IGtleXMgPSBkZWZhdWx0SWRlbnRpdHk7XG5cbiAgICBpZiAoIWtleXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgR2VuZXJhdGluZyBuZXcgaWRlbnRpdHkga2V5cy4uLicpKTtcbiAgICAgIGNvbnN0IGtleXNSZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8eyBwdWJsaWNUb2tlbjogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfT4oJy92MS9hdXRoL2dlbmVyYXRlLWtleXMnKTtcbiAgICAgIFxuICAgICAgaWYgKCFrZXlzUmVzcG9uc2Uuc3VjY2VzcyB8fCAha2V5c1Jlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUga2V5cycpO1xuICAgICAgfVxuXG4gICAgICBrZXlzID0ga2V5c1Jlc3BvbnNlLmRhdGE7XG4gICAgICAvLyBTYXZlIGFzIGRlZmF1bHQgZm9yIGZ1dHVyZSB1c2VcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuc2F2ZURlZmF1bHRJZGVudGl0eShrZXlzKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIFJlZ2lzdGVyaW5nIGluIG5ldHdvcmsgJHtuZXR3b3JrSWR9Li4uYCkpO1xuXG4gICAgY29uc3QgcmVnaXN0ZXJSZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PGFueT4oJy92MS9hdXRoL3JlZ2lzdGVyJywge1xuICAgICAgbmV0d29ya0lkLFxuICAgICAgcHVibGljVG9rZW46IGtleXMucHVibGljVG9rZW4sXG4gICAgICBwcml2YXRlS2V5OiBrZXlzLnByaXZhdGVLZXksXG4gICAgICByZWFzb25cbiAgICB9KTtcblxuICAgIGlmIChyZWdpc3RlclJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVnaXN0ZXJSZXNwb25zZS5kYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdXRoUmVzcG9uc2UobmV0d29ya0lkLCBrZXlzLCByZWdpc3RlclJlc3BvbnNlLmRhdGEsIGNsaWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IElmIGFscmVhZHkgcmVnaXN0ZXJlZCAob3IgYW55IDQwMC1saWtlIGVycm9yKSwgdHJ5IGxvZ2luIGluc3RlYWRcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSByZWdpc3RlclJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICcnO1xuICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZWQgPSBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYWxyZWFkeSByZWdpc3RlcmVkJyk7XG4gICAgXG4gICAgaWYgKGlzQWxyZWFkeVJlZ2lzdGVyZWQgfHwgIXJlZ2lzdGVyUmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBSZWdpc3RyYXRpb24gZmFpbGVkIChsaWtlbHkgYWxyZWFkeSByZWdpc3RlcmVkKS4gQXR0ZW1wdGluZyBsb2dpbiBmb3IgJHtuZXR3b3JrSWR9Li4uYCkpO1xuICAgICAgY29uc3QgbG9naW5SZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PGFueT4oJy92MS9hdXRoL2xvZ2luJywge1xuICAgICAgICBuZXR3b3JrSWQsXG4gICAgICAgIHB1YmxpY1Rva2VuOiBrZXlzLnB1YmxpY1Rva2VuLFxuICAgICAgICBwcml2YXRlS2V5OiBrZXlzLnByaXZhdGVLZXksXG4gICAgICAgIHJlYXNvblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChsb2dpblJlc3BvbnNlLnN1Y2Nlc3MgJiYgbG9naW5SZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhSZXNwb25zZShuZXR3b3JrSWQsIGtleXMsIGxvZ2luUmVzcG9uc2UuZGF0YSwgY2xpZW50LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKHJlZ2lzdGVyUmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhdXRoZW50aWNhdGUnKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGhhbmRsZUF1dGhSZXNwb25zZShcbiAgICBuZXR3b3JrSWQ6IHN0cmluZywgXG4gICAga2V5czogeyBwdWJsaWNUb2tlbjogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSwgXG4gICAgcmVzcG9uc2VEYXRhOiBhbnksIFxuICAgIGNsaWVudDogQXBpQ2xpZW50LFxuICAgIGlzTmV3VXNlcjogYm9vbGVhblxuICApOiBQcm9taXNlPEF1dGhSZXN1bHQ+IHtcbiAgICAvLyBTZWFyY2ggZm9yIEpXVCBpbiBkaWZmZXJlbnQgcG9zc2libGUgbG9jYXRpb25zIGR1ZSB0byBUT09OIGRlY29kaW5nIHZhcmlhdGlvbnNcbiAgICBjb25zdCBqd3QgPSByZXNwb25zZURhdGEuand0IHx8IFxuICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEuZGF0YSAmJiByZXNwb25zZURhdGEuZGF0YS5qd3QpIHx8IFxuICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEudG9rZW5zICYmIHJlc3BvbnNlRGF0YS50b2tlbnMuand0KSB8fFxuICAgICAgICAgICAgICAgIChyZXNwb25zZURhdGEuZGF0YSAmJiByZXNwb25zZURhdGEuZGF0YS50b2tlbnMgJiYgcmVzcG9uc2VEYXRhLmRhdGEudG9rZW5zLmp3dCk7XG4gICAgXG4gICAgY29uc3QgZXhwaXJlc0F0ID0gcmVzcG9uc2VEYXRhLmV4cGlyZXNBdCB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VEYXRhLmRhdGEgJiYgcmVzcG9uc2VEYXRhLmRhdGEuZXhwaXJlc0F0KSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VEYXRhLnRva2VucyAmJiByZXNwb25zZURhdGEudG9rZW5zLmV4cGlyZXNBdCk7XG5cbiAgICBpZiAoIWp3dCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdBdXRoIFJlc3BvbnNlIERhdGE6JywgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2VEYXRhKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCBidXQgbm8gSldUIGZvdW5kIGluIHJlc3BvbnNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q3JlZHM6IE5ldHdvcmtDcmVkZW50aWFscyA9IHtcbiAgICAgIHB1YmxpY1Rva2VuOiBrZXlzLnB1YmxpY1Rva2VuLFxuICAgICAgcHJpdmF0ZUtleToga2V5cy5wcml2YXRlS2V5LFxuICAgICAgand0OiBqd3QsXG4gICAgICBleHBpcmVzQXQ6IGV4cGlyZXNBdCB8fCAoRGF0ZS5ub3coKSArIDI0ICogMzYwMCAqIDEwMDApIC8vIERlZmF1bHQgMjRoIGlmIG1pc3NpbmdcbiAgICB9O1xuXG4gICAgYXdhaXQgY29uZmlnTWFuYWdlci5zYXZlQ3JlZGVudGlhbHMobmV0d29ya0lkLCBuZXdDcmVkcyk7XG4gICAgY2xpZW50LnNldEF1dGhUb2tlbihqd3QpO1xuXG4gICAgaWYgKGlzTmV3VXNlcikge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAg4pyTIEF1dG8tcmVnaXN0ZXJlZCBpbiBuZXR3b3JrOiAke25ldHdvcmtJZH1gKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAgIOKckyBMb2dnZWQgaW50byBuZXR3b3JrOiAke25ldHdvcmtJZH1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xpZW50LCBjcmVkZW50aWFsczogbmV3Q3JlZHMsIGlzTmV3VXNlciB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEFwaUNsaWVudCgpOiBQcm9taXNlPEFwaUNsaWVudD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0R2xvYmFsQ29uZmlnKCk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEFwaUNsaWVudChjb25maWcuYXBpVXJsKTtcbiAgICBjbGllbnQuc2V0Rm9ybWF0KGNvbmZpZy5kZWZhdWx0Rm9ybWF0KTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldEF1dGhlbnRpY2F0ZWRDbGllbnQobmV0d29ya0lkOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8QXBpQ2xpZW50PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lbnN1cmVBdXRoZW50aWNhdGVkKG5ldHdvcmtJZCwgcmVhc29uKTtcbiAgICByZXR1cm4gcmVzdWx0LmNsaWVudDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGaXJzdEF1dGhlbnRpY2F0ZWRDbGllbnQoKTogUHJvbWlzZTx7IGNsaWVudDogQXBpQ2xpZW50OyBuZXR3b3JrSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHNEaXIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmFnZW50aWNwb29sJywgJ2NyZWRlbnRpYWxzJyk7XG4gICAgXG4gICAgaWYgKCEoYXdhaXQgZnMucGF0aEV4aXN0cyhjcmVkZW50aWFsc0RpcikpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN0b3JlZCBjcmVkZW50aWFscyBmb3VuZC4gUnVuIFwiYWdlbnRpY3Bvb2wgYXV0aCBjb25uZWN0IDxuZXR3b3JrSWQ+XCIgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGNyZWRlbnRpYWxzRGlyKTtcbiAgICBjb25zdCBqc29uRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcuanNvbicpKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBqc29uRmlsZXMpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmtJZCA9IGZpbGUucmVwbGFjZSgnLmpzb24nLCAnJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVuc3VyZUF1dGhlbnRpY2F0ZWQobmV0d29ya0lkKTtcbiAgICAgICAgcmV0dXJuIHsgY2xpZW50OiByZXN1bHQuY2xpZW50LCBuZXR3b3JrSWQgfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZhbGlkIGNyZWRlbnRpYWxzIGZvdW5kLiBSdW4gXCJhZ2VudGljcG9vbCBhdXRoIGNvbm5lY3QgPG5ldHdvcmtJZD5cIiBmaXJzdC4nKTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerAuthCommands(program: Command): void;