agenticpool 1.0.1 → 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 (50) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +98 -20
  3. package/dist/auth/AuthHelper.d.ts +2 -2
  4. package/dist/auth/AuthHelper.js +25 -8
  5. package/dist/commands/auth.js +27 -11
  6. package/dist/commands/identities.js +41 -20
  7. package/dist/commands/networks.js +169 -75
  8. package/dist/config/ConfigManager.d.ts +2 -0
  9. package/dist/config/ConfigManager.js +29 -1
  10. package/dist/datamodel/index.d.ts +3 -0
  11. package/dist/datamodel/index.js +20 -0
  12. package/dist/datamodel/models/humans.d.ts +81 -0
  13. package/dist/datamodel/models/humans.js +3 -0
  14. package/dist/datamodel/models/index.d.ts +109 -0
  15. package/dist/datamodel/models/index.js +3 -0
  16. package/dist/datamodel/toon/index.d.ts +5 -0
  17. package/dist/datamodel/toon/index.js +39 -0
  18. package/dist/index.js +3 -2
  19. package/package.json +8 -2
  20. package/AGENTS.md +0 -56
  21. package/agenticpool-cli-1.0.0.tgz +0 -0
  22. package/jest.config.js +0 -23
  23. package/src/api/ApiClient.ts +0 -100
  24. package/src/api/index.ts +0 -1
  25. package/src/auth/AuthHelper.ts +0 -123
  26. package/src/commands/auth.ts +0 -169
  27. package/src/commands/config.ts +0 -51
  28. package/src/commands/connections.ts +0 -261
  29. package/src/commands/contacts.ts +0 -221
  30. package/src/commands/conversations.ts +0 -218
  31. package/src/commands/humans.ts +0 -124
  32. package/src/commands/identities.ts +0 -126
  33. package/src/commands/index.ts +0 -10
  34. package/src/commands/messages.ts +0 -72
  35. package/src/commands/networks.ts +0 -245
  36. package/src/commands/profile.ts +0 -184
  37. package/src/config/ConfigManager.ts +0 -137
  38. package/src/config/index.ts +0 -1
  39. package/src/index.ts +0 -35
  40. package/src/limits/LimitsManager.ts +0 -76
  41. package/tests/ApiClient.test.ts +0 -99
  42. package/tests/ConfigManager.test.ts +0 -41
  43. package/tests/LimitsManager.test.ts +0 -169
  44. package/tests/__mocks__/@toon-format/toon.ts +0 -27
  45. package/tests/integration/cleanup.ts +0 -187
  46. package/tests/integration/e2e-cli.test.ts +0 -465
  47. package/tests/integration/e2e.test.ts +0 -480
  48. package/tests/integration/run-e2e.sh +0 -44
  49. package/tests/integration/setup.ts +0 -188
  50. package/tsconfig.json +0 -28
@@ -0,0 +1,20 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./models"), exports);
18
+ __exportStar(require("./models/humans"), exports);
19
+ __exportStar(require("./toon"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YW1vZGVsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUI7QUFDekIsa0RBQWdDO0FBQ2hDLHlDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWxzL2h1bWFucyc7XG5leHBvcnQgKiBmcm9tICcuL3Rvb24nO1xuIl19
@@ -0,0 +1,81 @@
1
+ import type { Timestamp } from './index';
2
+ export type ConnectionStatus = 'proposed' | 'agent_accepted' | 'human_pending' | 'connected' | 'rejected' | 'revoked';
3
+ export interface HumanProfile {
4
+ uid?: string;
5
+ displayName: string;
6
+ phone: string;
7
+ email: string;
8
+ telegram: string;
9
+ photoUrl: string;
10
+ notes: string;
11
+ createdAt?: Timestamp;
12
+ updatedAt?: Timestamp;
13
+ }
14
+ export interface NetworkIdentity {
15
+ id?: string;
16
+ humanUid: string;
17
+ networkId: string;
18
+ publicToken: string;
19
+ agentDescription: string;
20
+ addedAt?: Timestamp;
21
+ }
22
+ export interface ConnectionProposal {
23
+ id?: string;
24
+ fromHumanUid: string;
25
+ toHumanUid: string;
26
+ fromAgentToken: string;
27
+ toAgentToken: string;
28
+ networkId: string;
29
+ fromExplanation: string;
30
+ toExplanation: string;
31
+ status: ConnectionStatus;
32
+ proposedAt?: Timestamp;
33
+ agentAcceptedAt?: Timestamp;
34
+ humanAcceptedAt?: Timestamp;
35
+ revokedAt?: Timestamp;
36
+ revokedBy?: string;
37
+ }
38
+ export interface Contact {
39
+ id?: string;
40
+ ownerUid: string;
41
+ contactUid: string;
42
+ contactDisplayName: string;
43
+ contactPhone: string;
44
+ contactEmail: string;
45
+ contactTelegram: string;
46
+ contactPhotoUrl: string;
47
+ notes: string;
48
+ linkedIdentities: ContactIdentity[];
49
+ connectionId: string;
50
+ status: 'active' | 'blocked';
51
+ createdAt?: Timestamp;
52
+ updatedAt?: Timestamp;
53
+ }
54
+ export interface ContactIdentity {
55
+ networkId: string;
56
+ publicToken: string;
57
+ agentDescription: string;
58
+ }
59
+ export interface HumanAuthCredentials {
60
+ humanUid: string;
61
+ email: string;
62
+ jwt?: string;
63
+ expiresAt?: number;
64
+ }
65
+ export interface ConnectionProposalInput {
66
+ toAgentToken: string;
67
+ networkId: string;
68
+ fromExplanation: string;
69
+ }
70
+ export interface ConnectionAcceptInput {
71
+ toExplanation: string;
72
+ }
73
+ export interface IdentityRegisterInput {
74
+ networkId: string;
75
+ publicToken: string;
76
+ agentDescription: string;
77
+ }
78
+ export interface ContactUpdateInput {
79
+ notes?: string;
80
+ linkIdentity?: ContactIdentity;
81
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFtb2RlbC9tb2RlbHMvaHVtYW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRpbWVzdGFtcCB9IGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzID1cbiAgfCAncHJvcG9zZWQnXG4gIHwgJ2FnZW50X2FjY2VwdGVkJ1xuICB8ICdodW1hbl9wZW5kaW5nJ1xuICB8ICdjb25uZWN0ZWQnXG4gIHwgJ3JlamVjdGVkJ1xuICB8ICdyZXZva2VkJztcblxuZXhwb3J0IGludGVyZmFjZSBIdW1hblByb2ZpbGUge1xuICB1aWQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHBob25lOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIHRlbGVncmFtOiBzdHJpbmc7XG4gIHBob3RvVXJsOiBzdHJpbmc7XG4gIG5vdGVzOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgdXBkYXRlZEF0PzogVGltZXN0YW1wO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJZGVudGl0eSB7XG4gIGlkPzogc3RyaW5nO1xuICBodW1hblVpZDogc3RyaW5nO1xuICBuZXR3b3JrSWQ6IHN0cmluZztcbiAgcHVibGljVG9rZW46IHN0cmluZztcbiAgYWdlbnREZXNjcmlwdGlvbjogc3RyaW5nO1xuICBhZGRlZEF0PzogVGltZXN0YW1wO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9wb3NhbCB7XG4gIGlkPzogc3RyaW5nO1xuICBmcm9tSHVtYW5VaWQ6IHN0cmluZztcbiAgdG9IdW1hblVpZDogc3RyaW5nO1xuICBmcm9tQWdlbnRUb2tlbjogc3RyaW5nO1xuICB0b0FnZW50VG9rZW46IHN0cmluZztcbiAgbmV0d29ya0lkOiBzdHJpbmc7XG4gIGZyb21FeHBsYW5hdGlvbjogc3RyaW5nO1xuICB0b0V4cGxhbmF0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogQ29ubmVjdGlvblN0YXR1cztcbiAgcHJvcG9zZWRBdD86IFRpbWVzdGFtcDtcbiAgYWdlbnRBY2NlcHRlZEF0PzogVGltZXN0YW1wO1xuICBodW1hbkFjY2VwdGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHJldm9rZWRBdD86IFRpbWVzdGFtcDtcbiAgcmV2b2tlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhY3Qge1xuICBpZD86IHN0cmluZztcbiAgb3duZXJVaWQ6IHN0cmluZztcbiAgY29udGFjdFVpZDogc3RyaW5nO1xuICBjb250YWN0RGlzcGxheU5hbWU6IHN0cmluZztcbiAgY29udGFjdFBob25lOiBzdHJpbmc7XG4gIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICBjb250YWN0VGVsZWdyYW06IHN0cmluZztcbiAgY29udGFjdFBob3RvVXJsOiBzdHJpbmc7XG4gIG5vdGVzOiBzdHJpbmc7XG4gIGxpbmtlZElkZW50aXRpZXM6IENvbnRhY3RJZGVudGl0eVtdO1xuICBjb25uZWN0aW9uSWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnYWN0aXZlJyB8ICdibG9ja2VkJztcbiAgY3JlYXRlZEF0PzogVGltZXN0YW1wO1xuICB1cGRhdGVkQXQ/OiBUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFjdElkZW50aXR5IHtcbiAgbmV0d29ya0lkOiBzdHJpbmc7XG4gIHB1YmxpY1Rva2VuOiBzdHJpbmc7XG4gIGFnZW50RGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdW1hbkF1dGhDcmVkZW50aWFscyB7XG4gIGh1bWFuVWlkOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGp3dD86IHN0cmluZztcbiAgZXhwaXJlc0F0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9wb3NhbElucHV0IHtcbiAgdG9BZ2VudFRva2VuOiBzdHJpbmc7XG4gIG5ldHdvcmtJZDogc3RyaW5nO1xuICBmcm9tRXhwbGFuYXRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uQWNjZXB0SW5wdXQge1xuICB0b0V4cGxhbmF0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlSZWdpc3RlcklucHV0IHtcbiAgbmV0d29ya0lkOiBzdHJpbmc7XG4gIHB1YmxpY1Rva2VuOiBzdHJpbmc7XG4gIGFnZW50RGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250YWN0VXBkYXRlSW5wdXQge1xuICBub3Rlcz86IHN0cmluZztcbiAgbGlua0lkZW50aXR5PzogQ29udGFjdElkZW50aXR5O1xufVxuIl19
@@ -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.1",
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,6 +34,7 @@
29
34
  "author": "AgenticPool",
30
35
  "license": "MIT",
31
36
  "dependencies": {
37
+ "@toon-format/toon": "^1.0.0",
32
38
  "axios": "^1.6.5",
33
39
  "chalk": "^4.1.2",
34
40
  "commander": "^11.1.0",
@@ -38,7 +44,7 @@
38
44
  "@types/fs-extra": "^11.0.4",
39
45
  "@types/jest": "^29.5.12",
40
46
  "@types/node": "^20.11.0",
41
- "firebase-admin": "^13.7.0",
47
+ "firebase-admin": "^10.3.0",
42
48
  "jest": "^29.7.0",
43
49
  "ts-jest": "^29.1.2",
44
50
  "ts-node": "^10.9.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,100 +0,0 @@
1
- import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';
2
- import { configManager, GlobalConfig } from '../config';
3
-
4
- export interface ApiError {
5
- code: string;
6
- message: string;
7
- details?: Record<string, unknown>;
8
- }
9
-
10
- export interface ApiResponse<T> {
11
- success: boolean;
12
- data?: T;
13
- error?: ApiError;
14
- }
15
-
16
- function encode(data: unknown): string {
17
- return JSON.stringify(data);
18
- }
19
-
20
- function decode<T = unknown>(str: string): T {
21
- return JSON.parse(str) as T;
22
- }
23
-
24
- export class ApiClient {
25
- private client: AxiosInstance;
26
- private format: 'toon' | 'json' = 'toon';
27
-
28
- constructor(baseUrl: string) {
29
- this.client = axios.create({
30
- baseURL: baseUrl,
31
- timeout: 30000
32
- });
33
- }
34
-
35
- static async create(): Promise<ApiClient> {
36
- const config = await configManager.getGlobalConfig();
37
- const client = new ApiClient(config.apiUrl);
38
- client.format = config.defaultFormat;
39
- return client;
40
- }
41
-
42
- setAuthToken(token: string): void {
43
- this.client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
44
- }
45
-
46
- clearAuthToken(): void {
47
- delete this.client.defaults.headers.common['Authorization'];
48
- }
49
-
50
- setFormat(format: 'toon' | 'json'): void {
51
- this.format = format;
52
- }
53
-
54
- async get<T>(path: string, params?: Record<string, unknown>): Promise<ApiResponse<T>> {
55
- const config: AxiosRequestConfig = { params: { ...params, format: this.format } };
56
-
57
- const response = await this.client.get(path, config);
58
- return this.parseResponse<T>(response.data);
59
- }
60
-
61
- async post<T>(path: string, data?: unknown): Promise<ApiResponse<T>> {
62
- const body = this.format === 'toon' && data ? encode(data) : JSON.stringify(data);
63
- const config: AxiosRequestConfig = {
64
- params: { format: this.format },
65
- headers: { 'Content-Type': 'text/plain' }
66
- };
67
-
68
- const response = await this.client.post(path, body, config);
69
- return this.parseResponse<T>(response.data);
70
- }
71
-
72
- async put<T>(path: string, data?: unknown): Promise<ApiResponse<T>> {
73
- const body = this.format === 'toon' && data ? encode(data) : JSON.stringify(data);
74
- const config: AxiosRequestConfig = {
75
- params: { format: this.format },
76
- headers: { 'Content-Type': 'text/plain' }
77
- };
78
-
79
- const response = await this.client.put(path, body, config);
80
- return this.parseResponse<T>(response.data);
81
- }
82
-
83
- async delete<T>(path: string): Promise<ApiResponse<T>> {
84
- const config: AxiosRequestConfig = { params: { format: this.format } };
85
-
86
- const response = await this.client.delete(path, config);
87
- return this.parseResponse<T>(response.data);
88
- }
89
-
90
- private parseResponse<T>(data: string | object): ApiResponse<T> {
91
- if (typeof data === 'string') {
92
- try {
93
- return decode<ApiResponse<T>>(data);
94
- } catch {
95
- return { success: false, error: { code: 'PARSE_ERROR', message: 'Failed to parse response' } };
96
- }
97
- }
98
- return data as ApiResponse<T>;
99
- }
100
- }
package/src/api/index.ts DELETED
@@ -1 +0,0 @@
1
- export { ApiClient } from './ApiClient';
@@ -1,123 +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): 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
- return { client, credentials: existingCreds, isNewUser: false };
27
- }
28
- }
29
-
30
- if (existingCreds && existingCreds.privateKey) {
31
- try {
32
- const response = await client.post<{ jwt: string; expiresAt: number; publicToken: string }>('/v1/auth/login', {
33
- networkId,
34
- publicToken: existingCreds.publicToken,
35
- privateKey: existingCreds.privateKey
36
- });
37
-
38
- if (response.success && response.data) {
39
- const updatedCreds: NetworkCredentials = {
40
- ...existingCreds,
41
- jwt: response.data.jwt,
42
- expiresAt: response.data.expiresAt
43
- };
44
-
45
- await configManager.saveCredentials(networkId, updatedCreds);
46
- client.setAuthToken(response.data.jwt);
47
-
48
- return { client, credentials: updatedCreds, isNewUser: false };
49
- }
50
- } catch (error) {
51
- // Login failed, will try to register
52
- }
53
- }
54
-
55
- const keysResponse = await client.get<{ publicToken: string; privateKey: string }>('/v1/auth/generate-keys');
56
-
57
- if (!keysResponse.success || !keysResponse.data) {
58
- throw new Error('Failed to generate keys');
59
- }
60
-
61
- const keys = keysResponse.data;
62
-
63
- const registerResponse = await client.post<{ member: any; tokens: { jwt: string; expiresAt: number; publicToken: string } }>('/v1/auth/register', {
64
- networkId,
65
- publicToken: keys.publicToken,
66
- privateKey: keys.privateKey
67
- });
68
-
69
- if (registerResponse.success && registerResponse.data) {
70
- const newCreds: NetworkCredentials = {
71
- publicToken: keys.publicToken,
72
- privateKey: keys.privateKey,
73
- jwt: registerResponse.data.tokens.jwt,
74
- expiresAt: registerResponse.data.tokens.expiresAt
75
- };
76
-
77
- await configManager.saveCredentials(networkId, newCreds);
78
- client.setAuthToken(registerResponse.data.tokens.jwt);
79
-
80
- console.log(chalk.green('✓ Auto-registered in network:'), networkId);
81
- console.log(chalk.gray('Public Token:'), keys.publicToken);
82
-
83
- return { client, credentials: newCreds, isNewUser: true };
84
- }
85
-
86
- throw new Error('Failed to authenticate');
87
- }
88
-
89
- static async getApiClient(): Promise<ApiClient> {
90
- const config = await configManager.getGlobalConfig();
91
- const client = new ApiClient(config.apiUrl);
92
- client.setFormat(config.defaultFormat);
93
- return client;
94
- }
95
-
96
- static async getAuthenticatedClient(networkId: string): Promise<ApiClient> {
97
- const result = await this.ensureAuthenticated(networkId);
98
- return result.client;
99
- }
100
-
101
- static async getFirstAuthenticatedClient(): Promise<{ client: ApiClient; networkId: string }> {
102
- const credentialsDir = path.join(os.homedir(), '.agenticpool', 'credentials');
103
-
104
- if (!(await fs.pathExists(credentialsDir))) {
105
- throw new Error('No stored credentials found. Run "agenticpool auth connect <networkId>" first.');
106
- }
107
-
108
- const files = await fs.readdir(credentialsDir);
109
- const jsonFiles = files.filter(f => f.endsWith('.json'));
110
-
111
- for (const file of jsonFiles) {
112
- const networkId = file.replace('.json', '');
113
- try {
114
- const result = await this.ensureAuthenticated(networkId);
115
- return { client: result.client, networkId };
116
- } catch {
117
- continue;
118
- }
119
- }
120
-
121
- throw new Error('No valid credentials found. Run "agenticpool auth connect <networkId>" first.');
122
- }
123
- }