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.
- package/LICENSE +1 -0
- package/README.md +98 -20
- package/dist/auth/AuthHelper.d.ts +2 -2
- package/dist/auth/AuthHelper.js +25 -8
- package/dist/commands/auth.js +27 -11
- package/dist/commands/identities.js +41 -20
- package/dist/commands/networks.js +169 -75
- package/dist/config/ConfigManager.d.ts +2 -0
- package/dist/config/ConfigManager.js +29 -1
- package/dist/datamodel/index.d.ts +3 -0
- package/dist/datamodel/index.js +20 -0
- package/dist/datamodel/models/humans.d.ts +81 -0
- package/dist/datamodel/models/humans.js +3 -0
- package/dist/datamodel/models/index.d.ts +109 -0
- package/dist/datamodel/models/index.js +3 -0
- package/dist/datamodel/toon/index.d.ts +5 -0
- package/dist/datamodel/toon/index.js +39 -0
- package/dist/index.js +3 -2
- package/package.json +8 -2
- package/AGENTS.md +0 -56
- package/agenticpool-cli-1.0.0.tgz +0 -0
- package/jest.config.js +0 -23
- package/src/api/ApiClient.ts +0 -100
- package/src/api/index.ts +0 -1
- package/src/auth/AuthHelper.ts +0 -123
- package/src/commands/auth.ts +0 -169
- package/src/commands/config.ts +0 -51
- package/src/commands/connections.ts +0 -261
- package/src/commands/contacts.ts +0 -221
- package/src/commands/conversations.ts +0 -218
- package/src/commands/humans.ts +0 -124
- package/src/commands/identities.ts +0 -126
- package/src/commands/index.ts +0 -10
- package/src/commands/messages.ts +0 -72
- package/src/commands/networks.ts +0 -245
- package/src/commands/profile.ts +0 -184
- package/src/config/ConfigManager.ts +0 -137
- package/src/config/index.ts +0 -1
- package/src/index.ts +0 -35
- package/src/limits/LimitsManager.ts +0 -76
- package/tests/ApiClient.test.ts +0 -99
- package/tests/ConfigManager.test.ts +0 -41
- package/tests/LimitsManager.test.ts +0 -169
- package/tests/__mocks__/@toon-format/toon.ts +0 -27
- package/tests/integration/cleanup.ts +0 -187
- package/tests/integration/e2e-cli.test.ts +0 -465
- package/tests/integration/e2e.test.ts +0 -480
- package/tests/integration/run-e2e.sh +0 -44
- package/tests/integration/setup.ts +0 -188
- 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(
|
|
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,
|
|
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
|
+
"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": "^
|
|
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
|
-
};
|
package/src/api/ApiClient.ts
DELETED
|
@@ -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';
|
package/src/auth/AuthHelper.ts
DELETED
|
@@ -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
|
-
}
|