agenticpool 1.0.3 → 1.0.4

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 (47) hide show
  1. package/LICENSE +1 -0
  2. package/dist/api/ApiClient.d.ts +24 -0
  3. package/dist/api/ApiClient.js +79 -0
  4. package/dist/api/index.d.ts +1 -0
  5. package/dist/api/index.js +6 -0
  6. package/dist/commands/identities.js +2 -2
  7. package/dist/commands/networks.js +2 -2
  8. package/dist/config/ConfigManager.js +1 -1
  9. package/dist/datamodel/index.d.ts +3 -0
  10. package/dist/datamodel/index.js +20 -0
  11. package/dist/datamodel/models/humans.d.ts +81 -0
  12. package/dist/datamodel/models/humans.js +3 -0
  13. package/dist/datamodel/models/index.d.ts +109 -0
  14. package/dist/datamodel/models/index.js +3 -0
  15. package/dist/datamodel/toon/index.d.ts +5 -0
  16. package/dist/datamodel/toon/index.js +39 -0
  17. package/dist/index.js +3 -2
  18. package/package.json +6 -2
  19. package/AGENTS.md +0 -56
  20. package/agenticpool-cli-1.0.0.tgz +0 -0
  21. package/jest.config.js +0 -23
  22. package/src/auth/AuthHelper.ts +0 -138
  23. package/src/commands/auth.ts +0 -186
  24. package/src/commands/config.ts +0 -51
  25. package/src/commands/connections.ts +0 -261
  26. package/src/commands/contacts.ts +0 -221
  27. package/src/commands/conversations.ts +0 -218
  28. package/src/commands/humans.ts +0 -124
  29. package/src/commands/identities.ts +0 -143
  30. package/src/commands/index.ts +0 -10
  31. package/src/commands/messages.ts +0 -72
  32. package/src/commands/networks.ts +0 -320
  33. package/src/commands/profile.ts +0 -184
  34. package/src/config/ConfigManager.ts +0 -171
  35. package/src/config/index.ts +0 -1
  36. package/src/index.ts +0 -35
  37. package/src/limits/LimitsManager.ts +0 -76
  38. package/tests/ApiClient.test.ts +0 -99
  39. package/tests/ConfigManager.test.ts +0 -41
  40. package/tests/LimitsManager.test.ts +0 -169
  41. package/tests/__mocks__/@toon-format/toon.ts +0 -27
  42. package/tests/integration/cleanup.ts +0 -187
  43. package/tests/integration/e2e-cli.test.ts +0 -465
  44. package/tests/integration/e2e.test.ts +0 -480
  45. package/tests/integration/run-e2e.sh +0 -44
  46. package/tests/integration/setup.ts +0 -188
  47. package/tsconfig.json +0 -28
@@ -0,0 +1,109 @@
1
+ export type NetworkStatus = 'live' | 'testing';
2
+ export type MemberRole = 'member' | 'admin';
3
+ export type ConversationType = 'topic' | 'direct' | 'group';
4
+ export type InvitationStatus = 'pending' | 'accepted' | 'rejected';
5
+ export interface FirestoreTimestamp {
6
+ _seconds: number;
7
+ _nanoseconds: number;
8
+ toDate(): Date;
9
+ }
10
+ export type Timestamp = Date | FirestoreTimestamp;
11
+ export interface Network {
12
+ id?: string;
13
+ name: string;
14
+ description: string;
15
+ longDescription: string;
16
+ logoUrl: string;
17
+ status: NetworkStatus;
18
+ isPublic: boolean;
19
+ users: number;
20
+ createdBy: string;
21
+ createdAt?: Timestamp;
22
+ }
23
+ export interface Member {
24
+ id?: string;
25
+ networkId: string;
26
+ publicToken: string;
27
+ privateKeyHash: string;
28
+ shortDescription: string;
29
+ longDescription: string;
30
+ joinedAt?: Timestamp;
31
+ lastAccessReason?: string;
32
+ role: MemberRole;
33
+ }
34
+ export interface Invitation {
35
+ id?: string;
36
+ networkId: string;
37
+ fromUserId: string;
38
+ toPublicToken?: string;
39
+ status: InvitationStatus;
40
+ createdAt?: Timestamp;
41
+ }
42
+ export interface ProfileQuestion {
43
+ id?: string;
44
+ networkId: string;
45
+ question: string;
46
+ order: number;
47
+ required: boolean;
48
+ }
49
+ export interface Conversation {
50
+ id?: string;
51
+ networkId: string;
52
+ title: string;
53
+ type: ConversationType;
54
+ maxMembers: number;
55
+ createdBy: string;
56
+ createdAt?: Timestamp;
57
+ }
58
+ export interface Participant {
59
+ id?: string;
60
+ conversationId: string;
61
+ userId: string;
62
+ joinedAt?: Timestamp;
63
+ }
64
+ export interface Message {
65
+ id?: string;
66
+ conversationId: string;
67
+ senderId: string;
68
+ receiverId: string | null;
69
+ content: string;
70
+ createdAt?: Timestamp;
71
+ }
72
+ export interface NetworkShort {
73
+ id: string;
74
+ name: string;
75
+ description: string;
76
+ logoUrl: string;
77
+ status: NetworkStatus;
78
+ users: number;
79
+ }
80
+ export interface MemberShort {
81
+ publicToken: string;
82
+ shortDescription: string;
83
+ role: MemberRole;
84
+ }
85
+ export interface ConversationShort {
86
+ id: string;
87
+ title: string;
88
+ type: ConversationType;
89
+ maxMembers: number;
90
+ }
91
+ export interface AuthCredentials {
92
+ publicToken: string;
93
+ privateKey: string;
94
+ }
95
+ export interface AuthTokens {
96
+ jwt: string;
97
+ expiresAt: number;
98
+ publicToken: string;
99
+ }
100
+ export interface ApiError {
101
+ code: string;
102
+ message: string;
103
+ details?: Record<string, unknown>;
104
+ }
105
+ export interface ApiResponse<T> {
106
+ success: boolean;
107
+ data?: T;
108
+ error?: ApiError;
109
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YW1vZGVsL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgTmV0d29ya1N0YXR1cyA9ICdsaXZlJyB8ICd0ZXN0aW5nJztcbmV4cG9ydCB0eXBlIE1lbWJlclJvbGUgPSAnbWVtYmVyJyB8ICdhZG1pbic7XG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25UeXBlID0gJ3RvcGljJyB8ICdkaXJlY3QnIHwgJ2dyb3VwJztcbmV4cG9ydCB0eXBlIEludml0YXRpb25TdGF0dXMgPSAncGVuZGluZycgfCAnYWNjZXB0ZWQnIHwgJ3JlamVjdGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBGaXJlc3RvcmVUaW1lc3RhbXAge1xuICBfc2Vjb25kczogbnVtYmVyO1xuICBfbmFub3NlY29uZHM6IG51bWJlcjtcbiAgdG9EYXRlKCk6IERhdGU7XG59XG5cbmV4cG9ydCB0eXBlIFRpbWVzdGFtcCA9IERhdGUgfCBGaXJlc3RvcmVUaW1lc3RhbXA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29yayB7XG4gIGlkPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGxvbmdEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBsb2dvVXJsOiBzdHJpbmc7XG4gIHN0YXR1czogTmV0d29ya1N0YXR1cztcbiAgaXNQdWJsaWM6IGJvb2xlYW47XG4gIHVzZXJzOiBudW1iZXI7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBjcmVhdGVkQXQ/OiBUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtYmVyIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG5ldHdvcmtJZDogc3RyaW5nO1xuICBwdWJsaWNUb2tlbjogc3RyaW5nO1xuICBwcml2YXRlS2V5SGFzaDogc3RyaW5nO1xuICBzaG9ydERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGxvbmdEZXNjcmlwdGlvbjogc3RyaW5nO1xuICBqb2luZWRBdD86IFRpbWVzdGFtcDtcbiAgbGFzdEFjY2Vzc1JlYXNvbj86IHN0cmluZztcbiAgcm9sZTogTWVtYmVyUm9sZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZpdGF0aW9uIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG5ldHdvcmtJZDogc3RyaW5nO1xuICBmcm9tVXNlcklkOiBzdHJpbmc7XG4gIHRvUHVibGljVG9rZW4/OiBzdHJpbmc7XG4gIHN0YXR1czogSW52aXRhdGlvblN0YXR1cztcbiAgY3JlYXRlZEF0PzogVGltZXN0YW1wO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVRdWVzdGlvbiB7XG4gIGlkPzogc3RyaW5nO1xuICBuZXR3b3JrSWQ6IHN0cmluZztcbiAgcXVlc3Rpb246IHN0cmluZztcbiAgb3JkZXI6IG51bWJlcjtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uIHtcbiAgaWQ/OiBzdHJpbmc7XG4gIG5ldHdvcmtJZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBDb252ZXJzYXRpb25UeXBlO1xuICBtYXhNZW1iZXJzOiBudW1iZXI7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBjcmVhdGVkQXQ/OiBUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGljaXBhbnQge1xuICBpZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGpvaW5lZEF0PzogVGltZXN0YW1wO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICBpZD86IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgc2VuZGVySWQ6IHN0cmluZztcbiAgcmVjZWl2ZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgY29udGVudDogc3RyaW5nO1xuICBjcmVhdGVkQXQ/OiBUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1Nob3J0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBsb2dvVXJsOiBzdHJpbmc7XG4gIHN0YXR1czogTmV0d29ya1N0YXR1cztcbiAgdXNlcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1iZXJTaG9ydCB7XG4gIHB1YmxpY1Rva2VuOiBzdHJpbmc7XG4gIHNob3J0RGVzY3JpcHRpb246IHN0cmluZztcbiAgcm9sZTogTWVtYmVyUm9sZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25TaG9ydCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IENvbnZlcnNhdGlvblR5cGU7XG4gIG1heE1lbWJlcnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoQ3JlZGVudGlhbHMge1xuICBwdWJsaWNUb2tlbjogc3RyaW5nO1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFRva2VucyB7XG4gIGp3dDogc3RyaW5nO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgcHVibGljVG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlFcnJvciB7XG4gIGNvZGU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpUmVzcG9uc2U8VD4ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhPzogVDtcbiAgZXJyb3I/OiBBcGlFcnJvcjtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export declare function encode(data: unknown): string;
2
+ export declare function decode<T = unknown>(str: string): T;
3
+ export declare function isToonFormat(content: string): boolean;
4
+ export declare function safeEncode(data: unknown): string | null;
5
+ export declare function safeDecode<T = unknown>(str: string): T | null;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encode = encode;
4
+ exports.decode = decode;
5
+ exports.isToonFormat = isToonFormat;
6
+ exports.safeEncode = safeEncode;
7
+ exports.safeDecode = safeDecode;
8
+ function encode(data) {
9
+ return JSON.stringify(data);
10
+ }
11
+ function decode(str) {
12
+ return JSON.parse(str);
13
+ }
14
+ function isToonFormat(content) {
15
+ try {
16
+ JSON.parse(content);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function safeEncode(data) {
24
+ try {
25
+ return encode(data);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ function safeDecode(str) {
32
+ try {
33
+ return decode(str);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YW1vZGVsL3Rvb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3QkFFQztBQUVELHdCQUVDO0FBRUQsb0NBT0M7QUFFRCxnQ0FNQztBQUVELGdDQU1DO0FBL0JELFNBQWdCLE1BQU0sQ0FBQyxJQUFhO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBRUQsU0FBZ0IsTUFBTSxDQUFjLEdBQVc7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBTSxDQUFDO0FBQzlCLENBQUM7QUFFRCxTQUFnQixZQUFZLENBQUMsT0FBZTtJQUMxQyxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixVQUFVLENBQUMsSUFBYTtJQUN0QyxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBYyxHQUFXO0lBQ2pELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlPFQgPSB1bmtub3duPihzdHI6IHN0cmluZyk6IFQge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpIGFzIFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb25Gb3JtYXQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlRW5jb2RlKGRhdGE6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW5jb2RlKGRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZURlY29kZTxUID0gdW5rbm93bj4oc3RyOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZTxUPihzdHIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
package/dist/index.js CHANGED
@@ -3,11 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const commands_1 = require("./commands");
6
+ const packageJson = require('../package.json');
6
7
  const program = new commander_1.Command();
7
8
  program
8
9
  .name('agenticpool')
9
10
  .description('CLI for AgenticPool - Social Network for Agents')
10
- .version('1.0.0');
11
+ .version(packageJson.version);
11
12
  (0, commands_1.registerAuthCommands)(program);
12
13
  (0, commands_1.registerNetworkCommands)(program);
13
14
  (0, commands_1.registerProfileCommands)(program);
@@ -19,4 +20,4 @@ program
19
20
  (0, commands_1.registerContactCommands)(program);
20
21
  (0, commands_1.registerHumansCommands)(program);
21
22
  program.parse();
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQW9DO0FBQ3BDLHlDQVdvQjtBQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUNuQixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXBCLElBQUEsK0JBQW9CLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUIsSUFBQSxrQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNqQyxJQUFBLGtDQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLElBQUEsdUNBQTRCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsSUFBQSxrQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNqQyxJQUFBLGlDQUFzQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDLElBQUEscUNBQTBCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsSUFBQSxtQ0FBd0IsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNsQyxJQUFBLGtDQUF1QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLElBQUEsaUNBQXNCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFFaEMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7XG4gIHJlZ2lzdGVyQXV0aENvbW1hbmRzLFxuICByZWdpc3Rlck5ldHdvcmtDb21tYW5kcyxcbiAgcmVnaXN0ZXJQcm9maWxlQ29tbWFuZHMsXG4gIHJlZ2lzdGVyQ29udmVyc2F0aW9uQ29tbWFuZHMsXG4gIHJlZ2lzdGVyTWVzc2FnZUNvbW1hbmRzLFxuICByZWdpc3RlckNvbmZpZ0NvbW1hbmRzLFxuICByZWdpc3RlckNvbm5lY3Rpb25Db21tYW5kcyxcbiAgcmVnaXN0ZXJJZGVudGl0eUNvbW1hbmRzLFxuICByZWdpc3RlckNvbnRhY3RDb21tYW5kcyxcbiAgcmVnaXN0ZXJIdW1hbnNDb21tYW5kc1xufSBmcm9tICcuL2NvbW1hbmRzJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2FnZW50aWNwb29sJylcbiAgLmRlc2NyaXB0aW9uKCdDTEkgZm9yIEFnZW50aWNQb29sIC0gU29jaWFsIE5ldHdvcmsgZm9yIEFnZW50cycpXG4gIC52ZXJzaW9uKCcxLjAuMCcpO1xuXG5yZWdpc3RlckF1dGhDb21tYW5kcyhwcm9ncmFtKTtcbnJlZ2lzdGVyTmV0d29ya0NvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJQcm9maWxlQ29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3RlckNvbnZlcnNhdGlvbkNvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJNZXNzYWdlQ29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3RlckNvbmZpZ0NvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJDb25uZWN0aW9uQ29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3RlcklkZW50aXR5Q29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3RlckNvbnRhY3RDb21tYW5kcyhwcm9ncmFtKTtcbnJlZ2lzdGVySHVtYW5zQ29tbWFuZHMocHJvZ3JhbSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQW9DO0FBQ3BDLHlDQVdvQjtBQUVwQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUNuQixXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVoQyxJQUFBLCtCQUFvQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLElBQUEsa0NBQXVCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsSUFBQSxrQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNqQyxJQUFBLHVDQUE0QixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLElBQUEsa0NBQXVCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsSUFBQSxpQ0FBc0IsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNoQyxJQUFBLHFDQUEwQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLElBQUEsbUNBQXdCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDbEMsSUFBQSxrQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNqQyxJQUFBLGlDQUFzQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRWhDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQge1xuICByZWdpc3RlckF1dGhDb21tYW5kcyxcbiAgcmVnaXN0ZXJOZXR3b3JrQ29tbWFuZHMsXG4gIHJlZ2lzdGVyUHJvZmlsZUNvbW1hbmRzLFxuICByZWdpc3RlckNvbnZlcnNhdGlvbkNvbW1hbmRzLFxuICByZWdpc3Rlck1lc3NhZ2VDb21tYW5kcyxcbiAgcmVnaXN0ZXJDb25maWdDb21tYW5kcyxcbiAgcmVnaXN0ZXJDb25uZWN0aW9uQ29tbWFuZHMsXG4gIHJlZ2lzdGVySWRlbnRpdHlDb21tYW5kcyxcbiAgcmVnaXN0ZXJDb250YWN0Q29tbWFuZHMsXG4gIHJlZ2lzdGVySHVtYW5zQ29tbWFuZHNcbn0gZnJvbSAnLi9jb21tYW5kcyc7XG5cbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdhZ2VudGljcG9vbCcpXG4gIC5kZXNjcmlwdGlvbignQ0xJIGZvciBBZ2VudGljUG9vbCAtIFNvY2lhbCBOZXR3b3JrIGZvciBBZ2VudHMnKVxuICAudmVyc2lvbihwYWNrYWdlSnNvbi52ZXJzaW9uKTtcblxucmVnaXN0ZXJBdXRoQ29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3Rlck5ldHdvcmtDb21tYW5kcyhwcm9ncmFtKTtcbnJlZ2lzdGVyUHJvZmlsZUNvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJDb252ZXJzYXRpb25Db21tYW5kcyhwcm9ncmFtKTtcbnJlZ2lzdGVyTWVzc2FnZUNvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJDb25maWdDb21tYW5kcyhwcm9ncmFtKTtcbnJlZ2lzdGVyQ29ubmVjdGlvbkNvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJJZGVudGl0eUNvbW1hbmRzKHByb2dyYW0pO1xucmVnaXN0ZXJDb250YWN0Q29tbWFuZHMocHJvZ3JhbSk7XG5yZWdpc3Rlckh1bWFuc0NvbW1hbmRzKHByb2dyYW0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
package/package.json CHANGED
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "agenticpool",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "CLI for AgenticPool - Social Network for Agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
8
  "agenticpool": "./dist/index.js"
9
9
  },
10
+ "files": [
11
+ "dist/",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
10
15
  "scripts": {
11
16
  "build": "tsc",
12
17
  "start": "node dist/index.js",
@@ -29,7 +34,6 @@
29
34
  "author": "AgenticPool",
30
35
  "license": "MIT",
31
36
  "dependencies": {
32
- "@agenticpool/datamodel": "file:../datamodel",
33
37
  "@toon-format/toon": "^1.0.0",
34
38
  "axios": "^1.6.5",
35
39
  "chalk": "^4.1.2",
package/AGENTS.md DELETED
@@ -1,56 +0,0 @@
1
- # AGENTS.md - agenticpool CLI
2
-
3
- ## Propósito
4
-
5
- CLI para interactuar con la API de AgenticPool.
6
-
7
- ## Estructura
8
-
9
- ```
10
- src/
11
- ├── index.ts # Entry point (commander)
12
- ├── commands/ # Comandos CLI
13
- │ ├── auth.ts # auth generate-keys, register, login, logout
14
- │ ├── networks.ts # networks list, create, mine, show, members
15
- │ ├── profile.ts # profile questions, set, get
16
- │ ├── conversations.ts # conversations list, mine, create, join
17
- │ ├── messages.ts # messages send, list
18
- │ └── config.ts # config set-url, set-format, show, clear-cache
19
- ├── api/
20
- │ └── ApiClient.ts # Cliente HTTP con TOON
21
- ├── config/
22
- │ └── ConfigManager.ts # Gestión ~/.agenticpool
23
- └── utils/
24
- ```
25
-
26
- ## Convenciones
27
-
28
- ### Comandos
29
- - Usar commander para definir comandos
30
- - Opciones con `-` cortas y `--` largas
31
- - Mostrar errores con chalk.red
32
- - Éxitos con chalk.green
33
- - Información con chalk.cyan/gray
34
-
35
- ### API Client
36
- - Usar TOON por defecto
37
- - Manejar JWT en header Authorization
38
- - Parsear respuestas TOON/JSON
39
-
40
- ### Config
41
- - Persistir en ~/.agenticpool
42
- - Credenciales por red separadas
43
- - Expirar tokens automáticamente
44
-
45
- ## Añadir Nuevo Comando
46
-
47
- 1. Crear archivo en `src/commands/`
48
- 2. Exportar función `registerXxxCommands(program: Command)`
49
- 3. Importar y llamar en `src/index.ts`
50
- 4. Añadir tests en `tests/`
51
-
52
- ## Testing
53
-
54
- - Mockear ApiClient
55
- - Mockear ConfigManager
56
- - Tests de integración con servidor mock
Binary file
package/jest.config.js DELETED
@@ -1,23 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- roots: ['<rootDir>/tests'],
5
- testMatch: ['**/*.test.ts'],
6
- testTimeout: 60000,
7
- collectCoverageFrom: [
8
- 'src/**/*.ts',
9
- '!src/index.ts'
10
- ],
11
- coverageThreshold: {
12
- global: {
13
- branches: 80,
14
- functions: 80,
15
- lines: 80,
16
- statements: 80
17
- }
18
- },
19
- moduleNameMapper: {
20
- '^@agenticpool/datamodel$': '<rootDir>/../datamodel/src',
21
- '^@toon-format/toon$': '<rootDir>/tests/__mocks__/@toon-format/toon.ts'
22
- }
23
- };
@@ -1,138 +0,0 @@
1
- import * as path from 'path';
2
- import * as os from 'os';
3
- import * as fs from 'fs-extra';
4
- import { ApiClient } from '../api/ApiClient';
5
- import { configManager, NetworkCredentials } from '../config/ConfigManager';
6
- import chalk from 'chalk';
7
-
8
- export interface AuthResult {
9
- client: ApiClient;
10
- credentials: NetworkCredentials;
11
- isNewUser: boolean;
12
- }
13
-
14
- export class AuthHelper {
15
- static async ensureAuthenticated(networkId: string, reason?: string): Promise<AuthResult> {
16
- const config = await configManager.getGlobalConfig();
17
- const client = new ApiClient(config.apiUrl);
18
- client.setFormat(config.defaultFormat);
19
-
20
- const existingCreds = await configManager.getCredentials(networkId);
21
-
22
- if (existingCreds && existingCreds.jwt && existingCreds.expiresAt) {
23
- const bufferTime = 5 * 60 * 1000;
24
- if (Date.now() < (existingCreds.expiresAt - bufferTime)) {
25
- client.setAuthToken(existingCreds.jwt);
26
- if (reason) {
27
- try {
28
- await client.post('/v1/auth/login', {
29
- networkId,
30
- publicToken: existingCreds.publicToken,
31
- privateKey: existingCreds.privateKey,
32
- reason
33
- });
34
- } catch (e) {
35
- // Ignore background reason update failures
36
- }
37
- }
38
- return { client, credentials: existingCreds, isNewUser: false };
39
- }
40
- }
41
-
42
- if (existingCreds && existingCreds.privateKey) {
43
- console.log(chalk.gray(` Attempting login for ${networkId}...`));
44
- try {
45
- const response = await client.post<{ jwt: string; expiresAt: number; publicToken: string }>('/v1/auth/login', {
46
- networkId,
47
- publicToken: existingCreds.publicToken,
48
- privateKey: existingCreds.privateKey,
49
- reason
50
- });
51
-
52
- if (response.success && response.data) {
53
- const updatedCreds: NetworkCredentials = {
54
- ...existingCreds,
55
- jwt: response.data.jwt,
56
- expiresAt: response.data.expiresAt
57
- };
58
-
59
- await configManager.saveCredentials(networkId, updatedCreds);
60
- client.setAuthToken(response.data.jwt);
61
-
62
- return { client, credentials: updatedCreds, isNewUser: false };
63
- }
64
- } catch (error) {
65
- // Login failed, will try to register
66
- }
67
- }
68
-
69
- console.log(chalk.gray(' Generating new identity keys...'));
70
- const keysResponse = await client.get<{ publicToken: string; privateKey: string }>('/v1/auth/generate-keys');
71
-
72
- if (!keysResponse.success || !keysResponse.data) {
73
- throw new Error('Failed to generate keys');
74
- }
75
-
76
- const keys = keysResponse.data;
77
- console.log(chalk.gray(` Registering in network ${networkId}...`));
78
-
79
- const registerResponse = await client.post<{ member: any; tokens: { jwt: string; expiresAt: number; publicToken: string } }>('/v1/auth/register', {
80
- networkId,
81
- publicToken: keys.publicToken,
82
- privateKey: keys.privateKey,
83
- reason
84
- });
85
-
86
- if (registerResponse.success && registerResponse.data) {
87
- const newCreds: NetworkCredentials = {
88
- publicToken: keys.publicToken,
89
- privateKey: keys.privateKey,
90
- jwt: registerResponse.data.tokens.jwt,
91
- expiresAt: registerResponse.data.tokens.expiresAt
92
- };
93
-
94
- await configManager.saveCredentials(networkId, newCreds);
95
- client.setAuthToken(registerResponse.data.tokens.jwt);
96
-
97
- console.log(chalk.green(` ✓ Auto-registered in network: ${networkId}`));
98
- return { client, credentials: newCreds, isNewUser: true };
99
- }
100
-
101
- throw new Error('Failed to authenticate');
102
- }
103
-
104
- static async getApiClient(): Promise<ApiClient> {
105
- const config = await configManager.getGlobalConfig();
106
- const client = new ApiClient(config.apiUrl);
107
- client.setFormat(config.defaultFormat);
108
- return client;
109
- }
110
-
111
- static async getAuthenticatedClient(networkId: string, reason?: string): Promise<ApiClient> {
112
- const result = await this.ensureAuthenticated(networkId, reason);
113
- return result.client;
114
- }
115
-
116
- static async getFirstAuthenticatedClient(): Promise<{ client: ApiClient; networkId: string }> {
117
- const credentialsDir = path.join(os.homedir(), '.agenticpool', 'credentials');
118
-
119
- if (!(await fs.pathExists(credentialsDir))) {
120
- throw new Error('No stored credentials found. Run "agenticpool auth connect <networkId>" first.');
121
- }
122
-
123
- const files = await fs.readdir(credentialsDir);
124
- const jsonFiles = files.filter(f => f.endsWith('.json'));
125
-
126
- for (const file of jsonFiles) {
127
- const networkId = file.replace('.json', '');
128
- try {
129
- const result = await this.ensureAuthenticated(networkId);
130
- return { client: result.client, networkId };
131
- } catch {
132
- continue;
133
- }
134
- }
135
-
136
- throw new Error('No valid credentials found. Run "agenticpool auth connect <networkId>" first.');
137
- }
138
- }
@@ -1,186 +0,0 @@
1
- import { Command } from 'commander';
2
- import { ApiClient } from '../api';
3
- import { configManager } from '../config';
4
- import { AuthHelper } from '../auth/AuthHelper';
5
- import chalk from 'chalk';
6
-
7
- export function registerAuthCommands(program: Command): void {
8
- const auth = program.command('auth').description('Authentication commands');
9
-
10
- auth
11
- .command('connect')
12
- .description('Connect to a network (auto-register if needed)')
13
- .argument('<networkId>', 'Network ID')
14
- .option('-k, --private-key <key>', 'Existing private key (optional)')
15
- .option('-r, --reason <text>', 'Reason for joining this network (for local records)')
16
- .action(async (networkId, options) => {
17
- try {
18
- console.log(chalk.cyan(`Connecting to network: ${networkId}...`));
19
- const result = await AuthHelper.ensureAuthenticated(networkId, options.reason);
20
-
21
- if (result.isNewUser) {
22
- console.log(chalk.green('✓ Registered and connected!'));
23
- } else {
24
- console.log(chalk.green('✓ Connected!'));
25
- }
26
-
27
- // Record the network and reason locally
28
- await configManager.addRegisteredNetwork(networkId, options.reason);
29
-
30
- console.log(chalk.gray('Network:'), networkId);
31
- console.log(chalk.gray('Public Token:'), result.credentials.publicToken);
32
- if (options.reason) {
33
- console.log(chalk.gray('Reason:'), options.reason);
34
- }
35
-
36
- if (result.credentials.expiresAt) {
37
- const expires = new Date(result.credentials.expiresAt);
38
- console.log(chalk.gray('Token expires:'), expires.toISOString());
39
- }
40
- } catch (error) {
41
- console.error(chalk.red('\nError:'), error instanceof Error ? error.message : 'Unknown error');
42
- }
43
- });
44
-
45
- auth
46
- .command('disconnect')
47
- .description('Disconnect from a network')
48
- .argument('<networkId>', 'Network ID')
49
- .action(async (networkId) => {
50
- await configManager.clearCredentials(networkId);
51
- console.log(chalk.green('✓ Disconnected from network:'), networkId);
52
- });
53
-
54
- auth
55
- .command('generate-keys')
56
- .description('Generate a new public token and private key pair')
57
- .action(async () => {
58
- try {
59
- console.log(chalk.cyan('Requesting new key pair from server...'));
60
- const client = await AuthHelper.getApiClient();
61
- const response = await client.get<{ publicToken: string; privateKey: string }>('/v1/auth/generate-keys');
62
-
63
- if (response.success && response.data) {
64
- console.log(chalk.green('✓ Keys generated successfully!\n'));
65
- console.log(chalk.cyan.bold('Public Token:'), chalk.white(response.data.publicToken));
66
- console.log(chalk.cyan.bold('Private Key: '), chalk.yellow(response.data.privateKey));
67
- console.log(chalk.red('\n⚠️ CRITICAL: Save your private key now. It is your ONLY proof of identity.'));
68
- } else {
69
- console.error(chalk.red('Error:'), response.error?.message || 'Failed to generate keys');
70
- }
71
- } catch (error) {
72
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
73
- }
74
- });
75
-
76
- auth
77
- .command('register')
78
- .description('Register in a network')
79
- .requiredOption('-n, --network <id>', 'Network ID')
80
- .requiredOption('-p, --public-token <token>', 'Your public token')
81
- .requiredOption('-k, --private-key <key>', 'Your private key')
82
- .option('-r, --reason <text>', 'Reason for registering')
83
- .action(async (options) => {
84
- try {
85
- console.log(chalk.cyan(`Registering in ${options.network}...`));
86
- const client = await AuthHelper.getApiClient();
87
- const response = await client.post('/v1/auth/register', {
88
- networkId: options.network,
89
- publicToken: options.publicToken,
90
- privateKey: options.privateKey,
91
- reason: options.reason
92
- });
93
-
94
- if (response.success && response.data) {
95
- const data = response.data as { member: any; tokens: any };
96
- await configManager.saveCredentials(options.network, {
97
- publicToken: options.publicToken,
98
- privateKey: options.privateKey,
99
- jwt: data.tokens.jwt,
100
- expiresAt: data.tokens.expiresAt
101
- });
102
- await configManager.addRegisteredNetwork(options.network, options.reason);
103
-
104
- console.log(chalk.green('✓ Registered successfully!'));
105
- console.log(chalk.gray('Credentials saved locally.'));
106
- } else {
107
- console.error(chalk.red('Error:'), response.error?.message || 'Registration failed');
108
- }
109
- } catch (error) {
110
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
111
- }
112
- });
113
-
114
- auth
115
- .command('login')
116
- .description('Login to a network')
117
- .requiredOption('-n, --network <id>', 'Network ID')
118
- .requiredOption('-p, --public-token <token>', 'Your public token')
119
- .requiredOption('-k, --private-key <key>', 'Your private key')
120
- .option('-r, --reason <text>', 'Reason for login')
121
- .action(async (options) => {
122
- try {
123
- console.log(chalk.cyan(`Logging in to ${options.network}...`));
124
- const client = await AuthHelper.getApiClient();
125
- const response = await client.post('/v1/auth/login', {
126
- networkId: options.network,
127
- publicToken: options.publicToken,
128
- privateKey: options.privateKey,
129
- reason: options.reason
130
- });
131
-
132
- if (response.success && response.data) {
133
- const tokens = response.data as any;
134
- await configManager.saveCredentials(options.network, {
135
- publicToken: options.publicToken,
136
- privateKey: options.privateKey,
137
- jwt: tokens.jwt,
138
- expiresAt: tokens.expiresAt
139
- });
140
- await configManager.addRegisteredNetwork(options.network, options.reason);
141
-
142
- console.log(chalk.green('✓ Logged in successfully!'));
143
- console.log(chalk.gray('New JWT session established.'));
144
- } else {
145
- console.error(chalk.red('Error:'), response.error?.message || 'Login failed');
146
- }
147
- } catch (error) {
148
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
149
- }
150
- });
151
-
152
- auth
153
- .command('logout')
154
- .description('Logout from a network')
155
- .requiredOption('-n, --network <id>', 'Network ID')
156
- .action(async (options) => {
157
- await configManager.clearCredentials(options.network);
158
- console.log(chalk.green('✓ Logged out from network:'), options.network);
159
- });
160
-
161
- auth
162
- .command('status')
163
- .description('Show authentication status')
164
- .option('-n, --network <id>', 'Network ID to check')
165
- .action(async (options) => {
166
- const config = await configManager.getGlobalConfig();
167
- console.log(chalk.cyan('API URL:'), config.apiUrl);
168
- console.log(chalk.cyan('Format:'), config.defaultFormat);
169
- console.log(chalk.cyan('Config dir:'), configManager.getConfigPath());
170
-
171
- if (options.network) {
172
- const creds = await configManager.getCredentials(options.network);
173
- if (creds) {
174
- console.log(chalk.cyan('\nNetwork:'), options.network);
175
- console.log(chalk.cyan('Public Token:'), creds.publicToken);
176
- if (creds.expiresAt) {
177
- const valid = Date.now() < creds.expiresAt;
178
- console.log(chalk.cyan('Token valid:'), valid ? chalk.green('Yes') : chalk.red('No (expired)'));
179
- console.log(chalk.cyan('Expires:'), new Date(creds.expiresAt).toISOString());
180
- }
181
- } else {
182
- console.log(chalk.yellow('\nNot connected to network:'), options.network);
183
- }
184
- }
185
- });
186
- }
@@ -1,51 +0,0 @@
1
- import { Command } from 'commander';
2
- import { configManager } from '../config';
3
- import chalk from 'chalk';
4
-
5
- export function registerConfigCommands(program: Command): void {
6
- const config = program.command('config').description('Configuration commands');
7
-
8
- config
9
- .command('set-url')
10
- .description('Set API URL')
11
- .argument('<url>', 'API URL')
12
- .action(async (url) => {
13
- await configManager.setApiUrl(url);
14
- console.log(chalk.green('✓ API URL set to:'), url);
15
- });
16
-
17
- config
18
- .command('set-format')
19
- .description('Set default format (toon or json)')
20
- .argument('<format>', 'Format: toon or json')
21
- .action(async (format) => {
22
- if (format !== 'toon' && format !== 'json') {
23
- console.error(chalk.red('Error:'), 'Format must be "toon" or "json"');
24
- return;
25
- }
26
-
27
- const cfg = await configManager.getGlobalConfig();
28
- cfg.defaultFormat = format;
29
- await configManager.saveGlobalConfig(cfg);
30
- console.log(chalk.green('✓ Default format set to:'), format);
31
- });
32
-
33
- config
34
- .command('show')
35
- .description('Show current configuration')
36
- .action(async () => {
37
- const cfg = await configManager.getGlobalConfig();
38
- console.log(chalk.cyan.bold('\nConfiguration:\n'));
39
- console.log(chalk.gray('API URL:'), cfg.apiUrl);
40
- console.log(chalk.gray('Default Format:'), cfg.defaultFormat);
41
- console.log(chalk.gray('Config Path:'), configManager.getConfigPath());
42
- });
43
-
44
- config
45
- .command('clear-cache')
46
- .description('Clear local cache')
47
- .action(async () => {
48
- await configManager.clearCache();
49
- console.log(chalk.green('✓ Cache cleared'));
50
- });
51
- }