agentscore-mcp 1.0.3

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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/dist/adapters/demo/adapter.d.ts +22 -0
  4. package/dist/adapters/demo/adapter.d.ts.map +1 -0
  5. package/dist/adapters/demo/adapter.js +67 -0
  6. package/dist/adapters/demo/adapter.js.map +1 -0
  7. package/dist/adapters/demo/agents.d.ts +19 -0
  8. package/dist/adapters/demo/agents.d.ts.map +1 -0
  9. package/dist/adapters/demo/agents.js +480 -0
  10. package/dist/adapters/demo/agents.js.map +1 -0
  11. package/dist/adapters/github/adapter.d.ts +15 -0
  12. package/dist/adapters/github/adapter.d.ts.map +1 -0
  13. package/dist/adapters/github/adapter.js +75 -0
  14. package/dist/adapters/github/adapter.js.map +1 -0
  15. package/dist/adapters/github/client.d.ts +22 -0
  16. package/dist/adapters/github/client.d.ts.map +1 -0
  17. package/dist/adapters/github/client.js +220 -0
  18. package/dist/adapters/github/client.js.map +1 -0
  19. package/dist/adapters/github/mapper.d.ts +18 -0
  20. package/dist/adapters/github/mapper.d.ts.map +1 -0
  21. package/dist/adapters/github/mapper.js +132 -0
  22. package/dist/adapters/github/mapper.js.map +1 -0
  23. package/dist/adapters/github/types.d.ts +117 -0
  24. package/dist/adapters/github/types.d.ts.map +1 -0
  25. package/dist/adapters/github/types.js +3 -0
  26. package/dist/adapters/github/types.js.map +1 -0
  27. package/dist/adapters/json/adapter.d.ts +36 -0
  28. package/dist/adapters/json/adapter.d.ts.map +1 -0
  29. package/dist/adapters/json/adapter.js +149 -0
  30. package/dist/adapters/json/adapter.js.map +1 -0
  31. package/dist/adapters/moltbook/adapter.d.ts +18 -0
  32. package/dist/adapters/moltbook/adapter.d.ts.map +1 -0
  33. package/dist/adapters/moltbook/adapter.js +119 -0
  34. package/dist/adapters/moltbook/adapter.js.map +1 -0
  35. package/dist/adapters/moltbook/client.d.ts +14 -0
  36. package/dist/adapters/moltbook/client.d.ts.map +1 -0
  37. package/dist/adapters/moltbook/client.js +165 -0
  38. package/dist/adapters/moltbook/client.js.map +1 -0
  39. package/dist/adapters/moltbook/types.d.ts +57 -0
  40. package/dist/adapters/moltbook/types.d.ts.map +1 -0
  41. package/dist/adapters/moltbook/types.js +3 -0
  42. package/dist/adapters/moltbook/types.js.map +1 -0
  43. package/dist/adapters/types.d.ts +45 -0
  44. package/dist/adapters/types.d.ts.map +1 -0
  45. package/dist/adapters/types.js +2 -0
  46. package/dist/adapters/types.js.map +1 -0
  47. package/dist/cache/score-cache.d.ts +22 -0
  48. package/dist/cache/score-cache.d.ts.map +1 -0
  49. package/dist/cache/score-cache.js +48 -0
  50. package/dist/cache/score-cache.js.map +1 -0
  51. package/dist/config.d.ts +15 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +72 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/scoring/briefing.d.ts +5 -0
  56. package/dist/scoring/briefing.d.ts.map +1 -0
  57. package/dist/scoring/briefing.js +124 -0
  58. package/dist/scoring/briefing.js.map +1 -0
  59. package/dist/scoring/categories/account-health.d.ts +4 -0
  60. package/dist/scoring/categories/account-health.d.ts.map +1 -0
  61. package/dist/scoring/categories/account-health.js +67 -0
  62. package/dist/scoring/categories/account-health.js.map +1 -0
  63. package/dist/scoring/categories/behavioral-consistency.d.ts +4 -0
  64. package/dist/scoring/categories/behavioral-consistency.d.ts.map +1 -0
  65. package/dist/scoring/categories/behavioral-consistency.js +66 -0
  66. package/dist/scoring/categories/behavioral-consistency.js.map +1 -0
  67. package/dist/scoring/categories/community-standing.d.ts +4 -0
  68. package/dist/scoring/categories/community-standing.d.ts.map +1 -0
  69. package/dist/scoring/categories/community-standing.js +45 -0
  70. package/dist/scoring/categories/community-standing.js.map +1 -0
  71. package/dist/scoring/categories/content-quality.d.ts +4 -0
  72. package/dist/scoring/categories/content-quality.d.ts.map +1 -0
  73. package/dist/scoring/categories/content-quality.js +42 -0
  74. package/dist/scoring/categories/content-quality.js.map +1 -0
  75. package/dist/scoring/categories/interaction-quality.d.ts +4 -0
  76. package/dist/scoring/categories/interaction-quality.d.ts.map +1 -0
  77. package/dist/scoring/categories/interaction-quality.js +49 -0
  78. package/dist/scoring/categories/interaction-quality.js.map +1 -0
  79. package/dist/scoring/categories/risk-signals.d.ts +8 -0
  80. package/dist/scoring/categories/risk-signals.d.ts.map +1 -0
  81. package/dist/scoring/categories/risk-signals.js +69 -0
  82. package/dist/scoring/categories/risk-signals.js.map +1 -0
  83. package/dist/scoring/engine.d.ts +7 -0
  84. package/dist/scoring/engine.d.ts.map +1 -0
  85. package/dist/scoring/engine.js +165 -0
  86. package/dist/scoring/engine.js.map +1 -0
  87. package/dist/scoring/tiers.d.ts +11 -0
  88. package/dist/scoring/tiers.d.ts.map +1 -0
  89. package/dist/scoring/tiers.js +17 -0
  90. package/dist/scoring/tiers.js.map +1 -0
  91. package/dist/scoring/types.d.ts +39 -0
  92. package/dist/scoring/types.d.ts.map +1 -0
  93. package/dist/scoring/types.js +2 -0
  94. package/dist/scoring/types.js.map +1 -0
  95. package/dist/scoring/utils.d.ts +9 -0
  96. package/dist/scoring/utils.d.ts.map +1 -0
  97. package/dist/scoring/utils.js +48 -0
  98. package/dist/scoring/utils.js.map +1 -0
  99. package/dist/security/client-key.d.ts +6 -0
  100. package/dist/security/client-key.d.ts.map +1 -0
  101. package/dist/security/client-key.js +42 -0
  102. package/dist/security/client-key.js.map +1 -0
  103. package/dist/security/rate-limiter.d.ts +24 -0
  104. package/dist/security/rate-limiter.d.ts.map +1 -0
  105. package/dist/security/rate-limiter.js +47 -0
  106. package/dist/security/rate-limiter.js.map +1 -0
  107. package/dist/server.d.ts +3 -0
  108. package/dist/server.d.ts.map +1 -0
  109. package/dist/server.js +83 -0
  110. package/dist/server.js.map +1 -0
  111. package/dist/tools/agentscore.d.ts +5 -0
  112. package/dist/tools/agentscore.d.ts.map +1 -0
  113. package/dist/tools/agentscore.js +149 -0
  114. package/dist/tools/agentscore.js.map +1 -0
  115. package/dist/tools/sweep.d.ts +5 -0
  116. package/dist/tools/sweep.d.ts.map +1 -0
  117. package/dist/tools/sweep.js +280 -0
  118. package/dist/tools/sweep.js.map +1 -0
  119. package/dist/version.d.ts +2 -0
  120. package/dist/version.d.ts.map +1 -0
  121. package/dist/version.js +2 -0
  122. package/dist/version.js.map +1 -0
  123. package/package.json +58 -0
@@ -0,0 +1,117 @@
1
+ /** GitHub API response types — only fields we actually use. */
2
+ export interface GitHubUser {
3
+ login: string;
4
+ name: string | null;
5
+ bio: string | null;
6
+ company: string | null;
7
+ blog: string | null;
8
+ type: "User" | "Organization" | "Bot";
9
+ followers: number;
10
+ following: number;
11
+ public_repos: number;
12
+ created_at: string;
13
+ }
14
+ export interface GitHubRepo {
15
+ name: string;
16
+ stargazers_count: number;
17
+ }
18
+ export interface GitHubSearchResult {
19
+ total_count: number;
20
+ incomplete_results: boolean;
21
+ items: GitHubSearchIssue[];
22
+ }
23
+ export interface GitHubSearchIssue {
24
+ id: number;
25
+ title: string;
26
+ body: string | null;
27
+ html_url: string;
28
+ state: string;
29
+ comments: number;
30
+ created_at: string;
31
+ reactions: GitHubReactions;
32
+ repository_url: string;
33
+ }
34
+ export interface GitHubReactions {
35
+ "+1": number;
36
+ "-1": number;
37
+ laugh: number;
38
+ hooray: number;
39
+ confused: number;
40
+ heart: number;
41
+ rocket: number;
42
+ eyes: number;
43
+ }
44
+ export interface GitHubEvent {
45
+ id: string;
46
+ type: string;
47
+ created_at: string;
48
+ repo: {
49
+ name: string;
50
+ };
51
+ payload: {
52
+ action?: string;
53
+ comment?: {
54
+ body: string;
55
+ id: number;
56
+ created_at: string;
57
+ };
58
+ review?: {
59
+ body: string | null;
60
+ id: number;
61
+ state: string;
62
+ submitted_at: string;
63
+ };
64
+ };
65
+ }
66
+ export interface GitHubIssue {
67
+ id: number;
68
+ number: number;
69
+ title: string;
70
+ body: string | null;
71
+ state: string;
72
+ comments: number;
73
+ created_at: string;
74
+ user: {
75
+ login: string;
76
+ type: string;
77
+ };
78
+ reactions: GitHubReactions;
79
+ html_url: string;
80
+ }
81
+ export interface GitHubComment {
82
+ id: number;
83
+ body: string;
84
+ created_at: string;
85
+ user: {
86
+ login: string;
87
+ type: string;
88
+ };
89
+ reactions: GitHubReactions;
90
+ }
91
+ export interface GitHubRateLimit {
92
+ resources: {
93
+ core: {
94
+ limit: number;
95
+ remaining: number;
96
+ reset: number;
97
+ };
98
+ search: {
99
+ limit: number;
100
+ remaining: number;
101
+ reset: number;
102
+ };
103
+ };
104
+ }
105
+ export interface GitHubApp {
106
+ name: string;
107
+ slug: string;
108
+ owner: {
109
+ login: string;
110
+ type: string;
111
+ } | null;
112
+ }
113
+ export interface CacheEntry<T> {
114
+ data: T;
115
+ cachedAt: number;
116
+ }
117
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** GitHub API response types — only fields we actually use. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/github/types.ts"],"names":[],"mappings":"AAAA,+DAA+D"}
@@ -0,0 +1,36 @@
1
+ import type { AgentPlatformAdapter, AgentProfile, AgentContent } from "../types.js";
2
+ /**
3
+ * JSON adapter — reads agent data from a local JSON file.
4
+ * Lets businesses pipe in ANY data source without writing code.
5
+ *
6
+ * Expected file format:
7
+ * {
8
+ * "agents": [
9
+ * {
10
+ * "profile": { ...AgentProfile },
11
+ * "content": [ ...AgentContent[] ],
12
+ * "interactions": [ ...AgentContent[] ] // optional
13
+ * }
14
+ * ],
15
+ * "threads": [ // optional, enables sweep in JSON adapter
16
+ * {
17
+ * "id": "thread-123",
18
+ * "participantHandles": ["agent-a", "agent-b"], // optional but recommended
19
+ * "content": [ ...AgentContent[] ]
20
+ * }
21
+ * ]
22
+ * }
23
+ */
24
+ export declare class JSONAdapter implements AgentPlatformAdapter {
25
+ readonly name = "json";
26
+ readonly version = "1.0.3";
27
+ private data;
28
+ private loadData;
29
+ fetchProfile(handle: string): Promise<AgentProfile | null>;
30
+ fetchContent(handle: string, limit?: number): Promise<AgentContent[]>;
31
+ fetchInteractions(handle: string, limit?: number): Promise<AgentContent[]>;
32
+ fetchThreadContent(threadId: string): Promise<AgentContent[]>;
33
+ fetchThreadParticipants(threadId: string): Promise<AgentProfile[]>;
34
+ isAvailable(): Promise<boolean>;
35
+ }
36
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/json/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgEpF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,WAAY,YAAW,oBAAoB;IACtD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,OAAO,WAAsB;IACtC,OAAO,CAAC,IAAI,CAA6B;YAE3B,QAAQ;IAyBhB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQ1D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASrE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAS1E,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO7D,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBlE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
@@ -0,0 +1,149 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { z } from "zod";
3
+ import { getConfig } from "../../config.js";
4
+ import { AGENTSCORE_VERSION } from "../../version.js";
5
+ const AgentContentSchema = z.object({
6
+ id: z.string(),
7
+ type: z.enum(["post", "comment", "message", "reply"]),
8
+ content: z.string(),
9
+ title: z.string().optional(),
10
+ upvotes: z.number(),
11
+ downvotes: z.number(),
12
+ replyCount: z.number(),
13
+ channel: z.string().optional(),
14
+ createdAt: z.string(),
15
+ });
16
+ const AgentProfileSchema = z.object({
17
+ handle: z.string(),
18
+ displayName: z.string(),
19
+ description: z.string(),
20
+ platform: z.string(),
21
+ karma: z.number(),
22
+ followers: z.number(),
23
+ following: z.number(),
24
+ createdAt: z.string(),
25
+ claimed: z.boolean(),
26
+ owner: z.object({
27
+ username: z.string(),
28
+ verified: z.boolean(),
29
+ followers: z.number(),
30
+ }).optional(),
31
+ metadata: z.record(z.unknown()).optional(),
32
+ });
33
+ const JSONThreadSchema = z.object({
34
+ id: z.string(),
35
+ content: z.array(AgentContentSchema),
36
+ participantHandles: z.array(z.string()).optional(),
37
+ });
38
+ const JSONDataFileSchema = z.object({
39
+ agents: z.array(z.object({
40
+ profile: AgentProfileSchema,
41
+ content: z.array(AgentContentSchema),
42
+ interactions: z.array(AgentContentSchema).optional(),
43
+ })),
44
+ threads: z.array(JSONThreadSchema).optional(),
45
+ });
46
+ /**
47
+ * JSON adapter — reads agent data from a local JSON file.
48
+ * Lets businesses pipe in ANY data source without writing code.
49
+ *
50
+ * Expected file format:
51
+ * {
52
+ * "agents": [
53
+ * {
54
+ * "profile": { ...AgentProfile },
55
+ * "content": [ ...AgentContent[] ],
56
+ * "interactions": [ ...AgentContent[] ] // optional
57
+ * }
58
+ * ],
59
+ * "threads": [ // optional, enables sweep in JSON adapter
60
+ * {
61
+ * "id": "thread-123",
62
+ * "participantHandles": ["agent-a", "agent-b"], // optional but recommended
63
+ * "content": [ ...AgentContent[] ]
64
+ * }
65
+ * ]
66
+ * }
67
+ */
68
+ export class JSONAdapter {
69
+ name = "json";
70
+ version = AGENTSCORE_VERSION;
71
+ data = null;
72
+ async loadData() {
73
+ if (this.data)
74
+ return this.data;
75
+ const config = getConfig();
76
+ try {
77
+ const raw = await readFile(config.dataPath, "utf-8");
78
+ const parsed = JSON.parse(raw);
79
+ const result = JSONDataFileSchema.safeParse(parsed);
80
+ if (!result.success) {
81
+ const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
82
+ throw new Error(`Schema validation failed: ${issues}`);
83
+ }
84
+ this.data = result.data;
85
+ return this.data;
86
+ }
87
+ catch (error) {
88
+ console.error(`[agentscore] Failed to load JSON data from ${config.dataPath}:`, error);
89
+ if (error instanceof SyntaxError) {
90
+ throw new Error("Invalid JSON in data file.");
91
+ }
92
+ throw new Error(error instanceof Error ? error.message : "Invalid JSON in data file.");
93
+ }
94
+ }
95
+ async fetchProfile(handle) {
96
+ const data = await this.loadData();
97
+ const agent = data.agents.find((a) => a.profile.handle.toLowerCase() === handle.toLowerCase());
98
+ return agent?.profile ?? null;
99
+ }
100
+ async fetchContent(handle, limit) {
101
+ const data = await this.loadData();
102
+ const agent = data.agents.find((a) => a.profile.handle.toLowerCase() === handle.toLowerCase());
103
+ if (!agent)
104
+ return [];
105
+ return limit ? agent.content.slice(0, limit) : agent.content;
106
+ }
107
+ async fetchInteractions(handle, limit) {
108
+ const data = await this.loadData();
109
+ const agent = data.agents.find((a) => a.profile.handle.toLowerCase() === handle.toLowerCase());
110
+ if (!agent?.interactions)
111
+ return [];
112
+ return limit ? agent.interactions.slice(0, limit) : agent.interactions;
113
+ }
114
+ async fetchThreadContent(threadId) {
115
+ const data = await this.loadData();
116
+ const thread = data.threads?.find((t) => t.id === threadId);
117
+ if (!thread)
118
+ return [];
119
+ return thread.content;
120
+ }
121
+ async fetchThreadParticipants(threadId) {
122
+ const data = await this.loadData();
123
+ const thread = data.threads?.find((t) => t.id === threadId);
124
+ if (!thread?.participantHandles || thread.participantHandles.length === 0) {
125
+ return [];
126
+ }
127
+ const handles = new Set(thread.participantHandles
128
+ .map((h) => h.trim().toLowerCase())
129
+ .filter((h) => h.length > 0));
130
+ const profiles = [];
131
+ for (const handle of handles) {
132
+ const agent = data.agents.find((a) => a.profile.handle.toLowerCase() === handle);
133
+ if (agent) {
134
+ profiles.push(agent.profile);
135
+ }
136
+ }
137
+ return profiles;
138
+ }
139
+ async isAvailable() {
140
+ try {
141
+ await this.loadData();
142
+ return true;
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
148
+ }
149
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/json/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AgentPlatformAdapter, AgentProfile, AgentContent } from "../types.js";
2
+ /** Moltbook platform adapter — the default adapter. */
3
+ export declare class MoltbookAdapter implements AgentPlatformAdapter {
4
+ readonly name = "moltbook";
5
+ readonly version = "1.0.3";
6
+ private client;
7
+ constructor();
8
+ fetchProfile(handle: string): Promise<AgentProfile | null>;
9
+ fetchContent(handle: string, limit?: number): Promise<AgentContent[]>;
10
+ fetchInteractions(handle: string, limit?: number): Promise<AgentContent[]>;
11
+ fetchThreadParticipants(threadId: string): Promise<AgentProfile[]>;
12
+ fetchThreadContent(threadId: string): Promise<AgentContent[]>;
13
+ isAvailable(): Promise<boolean>;
14
+ private transformPost;
15
+ private transformComment;
16
+ private authorHandle;
17
+ }
18
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/moltbook/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKpF,uDAAuD;AACvD,qBAAa,eAAgB,YAAW,oBAAoB;IAC1D,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,OAAO,WAAsB;IACtC,OAAO,CAAC,MAAM,CAAiB;;IAMzB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA4B1D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQrE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQ1E,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBlE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAW7D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,YAAY;CAKrB"}
@@ -0,0 +1,119 @@
1
+ import { MoltbookClient } from "./client.js";
2
+ import { AGENTSCORE_VERSION } from "../../version.js";
3
+ /** Moltbook platform adapter — the default adapter. */
4
+ export class MoltbookAdapter {
5
+ name = "moltbook";
6
+ version = AGENTSCORE_VERSION;
7
+ client;
8
+ constructor() {
9
+ this.client = new MoltbookClient();
10
+ }
11
+ async fetchProfile(handle) {
12
+ const data = await this.client.fetchAgent(handle);
13
+ if (!data)
14
+ return null;
15
+ const agent = data.agent;
16
+ return {
17
+ handle: agent.name,
18
+ displayName: agent.displayName || agent.name,
19
+ description: agent.description || "",
20
+ platform: "moltbook",
21
+ karma: agent.karma,
22
+ followers: agent.followers,
23
+ following: agent.following,
24
+ createdAt: agent.createdAt,
25
+ claimed: agent.claimed,
26
+ owner: agent.owner
27
+ ? {
28
+ username: agent.owner.username,
29
+ verified: agent.owner.verified,
30
+ followers: agent.owner.followers,
31
+ }
32
+ : undefined,
33
+ metadata: {
34
+ profileImage: agent.profileImage,
35
+ },
36
+ };
37
+ }
38
+ async fetchContent(handle, limit) {
39
+ const data = await this.client.fetchAgent(handle);
40
+ if (!data)
41
+ return [];
42
+ const posts = data.recentPosts.map((p) => this.transformPost(p));
43
+ return limit ? posts.slice(0, limit) : posts;
44
+ }
45
+ async fetchInteractions(handle, limit) {
46
+ const data = await this.client.fetchAgent(handle);
47
+ if (!data)
48
+ return [];
49
+ const comments = data.recentComments.map((c) => this.transformComment(c));
50
+ return limit ? comments.slice(0, limit) : comments;
51
+ }
52
+ async fetchThreadParticipants(threadId) {
53
+ const data = await this.client.fetchThread(threadId);
54
+ if (!data)
55
+ return [];
56
+ const handles = new Set();
57
+ const postHandle = this.authorHandle(data.post.author);
58
+ if (postHandle)
59
+ handles.add(postHandle);
60
+ for (const comment of data.comments) {
61
+ const commentHandle = this.authorHandle(comment.author);
62
+ if (commentHandle)
63
+ handles.add(commentHandle);
64
+ }
65
+ if (handles.size === 0)
66
+ return [];
67
+ const profiles = [];
68
+ for (const handle of handles) {
69
+ const profile = await this.fetchProfile(handle);
70
+ if (profile)
71
+ profiles.push(profile);
72
+ }
73
+ return profiles;
74
+ }
75
+ async fetchThreadContent(threadId) {
76
+ const data = await this.client.fetchThread(threadId);
77
+ if (!data)
78
+ return [];
79
+ const content = [this.transformPost(data.post)];
80
+ for (const comment of data.comments) {
81
+ content.push(this.transformComment(comment));
82
+ }
83
+ return content;
84
+ }
85
+ async isAvailable() {
86
+ return this.client.isAvailable();
87
+ }
88
+ transformPost(post) {
89
+ return {
90
+ id: post._id,
91
+ type: "post",
92
+ content: post.content,
93
+ title: post.title,
94
+ upvotes: post.upvotes,
95
+ downvotes: post.downvotes,
96
+ replyCount: post.commentCount,
97
+ channel: post.submolt?.name,
98
+ createdAt: post.createdAt,
99
+ };
100
+ }
101
+ transformComment(comment) {
102
+ return {
103
+ id: comment._id,
104
+ type: "comment",
105
+ content: comment.content,
106
+ upvotes: comment.upvotes,
107
+ downvotes: comment.downvotes,
108
+ replyCount: comment.replyCount || 0,
109
+ createdAt: comment.createdAt,
110
+ };
111
+ }
112
+ authorHandle(author) {
113
+ if (!author)
114
+ return null;
115
+ const value = (author.name || author.username || "").trim();
116
+ return value.length > 0 ? value : null;
117
+ }
118
+ }
119
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/moltbook/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { MoltbookAgentResponse, MoltbookThreadResponse } from "./types.js";
2
+ /** Moltbook API client with retry and rate limiting. */
3
+ export declare class MoltbookClient {
4
+ private apiKey;
5
+ private rateLimitMs;
6
+ private lastRequest;
7
+ constructor();
8
+ private throttle;
9
+ private fetchWithRetry;
10
+ fetchAgent(handle: string): Promise<MoltbookAgentResponse | null>;
11
+ fetchThread(postId: string): Promise<MoltbookThreadResponse | null>;
12
+ isAvailable(): Promise<boolean>;
13
+ }
14
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/adapters/moltbook/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AA8DhF,wDAAwD;AACxD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAK;;YAQV,QAAQ;YAQR,cAAc;IAsCtB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAuBjE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAuBnE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWtC"}
@@ -0,0 +1,165 @@
1
+ import { z } from "zod";
2
+ import { getConfig } from "../../config.js";
3
+ const MoltbookPostSchema = z.object({
4
+ _id: z.string(),
5
+ title: z.string().optional(),
6
+ content: z.string(),
7
+ upvotes: z.number(),
8
+ downvotes: z.number(),
9
+ commentCount: z.number(),
10
+ submolt: z.object({ name: z.string() }).optional(),
11
+ author: z.object({
12
+ name: z.string().optional(),
13
+ username: z.string().optional(),
14
+ displayName: z.string().optional(),
15
+ }).passthrough().optional(),
16
+ createdAt: z.string(),
17
+ });
18
+ const MoltbookCommentSchema = z.object({
19
+ _id: z.string(),
20
+ content: z.string(),
21
+ upvotes: z.number(),
22
+ downvotes: z.number(),
23
+ replyCount: z.number().optional(),
24
+ post: z.object({ _id: z.string(), title: z.string().optional() }).optional(),
25
+ author: z.object({
26
+ name: z.string().optional(),
27
+ username: z.string().optional(),
28
+ displayName: z.string().optional(),
29
+ }).passthrough().optional(),
30
+ createdAt: z.string(),
31
+ });
32
+ const MoltbookAgentResponseSchema = z.object({
33
+ agent: z.object({
34
+ name: z.string(),
35
+ displayName: z.string().optional(),
36
+ description: z.string().optional(),
37
+ karma: z.number(),
38
+ followers: z.number(),
39
+ following: z.number(),
40
+ createdAt: z.string(),
41
+ claimed: z.boolean(),
42
+ profileImage: z.string().optional(),
43
+ owner: z.object({
44
+ username: z.string(),
45
+ verified: z.boolean(),
46
+ followers: z.number(),
47
+ }).optional(),
48
+ }),
49
+ recentPosts: z.array(MoltbookPostSchema),
50
+ recentComments: z.array(MoltbookCommentSchema),
51
+ });
52
+ const MoltbookThreadResponseSchema = z.object({
53
+ post: MoltbookPostSchema,
54
+ comments: z.array(MoltbookCommentSchema),
55
+ });
56
+ const BASE_URL = "https://www.moltbook.com/api/v1";
57
+ /** Moltbook API client with retry and rate limiting. */
58
+ export class MoltbookClient {
59
+ apiKey;
60
+ rateLimitMs;
61
+ lastRequest = 0;
62
+ constructor() {
63
+ const config = getConfig();
64
+ this.apiKey = config.moltbookApiKey;
65
+ this.rateLimitMs = config.rateLimitMs;
66
+ }
67
+ async throttle() {
68
+ const elapsed = Date.now() - this.lastRequest;
69
+ if (elapsed < this.rateLimitMs) {
70
+ await new Promise((resolve) => setTimeout(resolve, this.rateLimitMs - elapsed));
71
+ }
72
+ this.lastRequest = Date.now();
73
+ }
74
+ async fetchWithRetry(url, retries = 3) {
75
+ await this.throttle();
76
+ for (let attempt = 0; attempt <= retries; attempt++) {
77
+ try {
78
+ const response = await fetch(url, {
79
+ headers: {
80
+ Authorization: `Bearer ${this.apiKey}`,
81
+ "Content-Type": "application/json",
82
+ },
83
+ signal: AbortSignal.timeout(15_000),
84
+ });
85
+ if (response.status === 429) {
86
+ const retryAfter = parseInt(response.headers.get("Retry-After") || "5", 10);
87
+ if (attempt < retries) {
88
+ await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
89
+ continue;
90
+ }
91
+ }
92
+ if (!response.ok && attempt < retries) {
93
+ const backoff = Math.pow(2, attempt) * 1000;
94
+ await new Promise((resolve) => setTimeout(resolve, backoff));
95
+ continue;
96
+ }
97
+ return response;
98
+ }
99
+ catch (error) {
100
+ if (attempt === retries)
101
+ throw error;
102
+ const backoff = Math.pow(2, attempt) * 1000;
103
+ await new Promise((resolve) => setTimeout(resolve, backoff));
104
+ }
105
+ }
106
+ throw new Error("Max retries exceeded");
107
+ }
108
+ async fetchAgent(handle) {
109
+ try {
110
+ const response = await this.fetchWithRetry(`${BASE_URL}/agents/profile?name=${encodeURIComponent(handle)}`);
111
+ if (response.status === 404)
112
+ return null;
113
+ if (!response.ok) {
114
+ console.error(`[agentscore] Moltbook API error: ${response.status} for @${handle}`);
115
+ return null;
116
+ }
117
+ const json = await response.json();
118
+ const result = MoltbookAgentResponseSchema.safeParse(json);
119
+ if (!result.success) {
120
+ console.error(`[agentscore] Moltbook response validation failed for @${handle}:`, result.error.message);
121
+ return null;
122
+ }
123
+ return result.data;
124
+ }
125
+ catch (error) {
126
+ console.error(`[agentscore] Moltbook fetch error for @${handle}:`, error);
127
+ return null;
128
+ }
129
+ }
130
+ async fetchThread(postId) {
131
+ try {
132
+ const response = await this.fetchWithRetry(`${BASE_URL}/posts/${encodeURIComponent(postId)}/comments`);
133
+ if (response.status === 404)
134
+ return null;
135
+ if (!response.ok) {
136
+ console.error(`[agentscore] Moltbook API error: ${response.status} for thread ${postId}`);
137
+ return null;
138
+ }
139
+ const json = await response.json();
140
+ const result = MoltbookThreadResponseSchema.safeParse(json);
141
+ if (!result.success) {
142
+ console.error(`[agentscore] Moltbook thread response validation failed for ${postId}:`, result.error.message);
143
+ return null;
144
+ }
145
+ return result.data;
146
+ }
147
+ catch (error) {
148
+ console.error(`[agentscore] Moltbook thread fetch error for ${postId}:`, error);
149
+ return null;
150
+ }
151
+ }
152
+ async isAvailable() {
153
+ try {
154
+ const response = await fetch(`${BASE_URL}/posts?limit=1`, {
155
+ headers: { Authorization: `Bearer ${this.apiKey}` },
156
+ signal: AbortSignal.timeout(5_000),
157
+ });
158
+ return response.ok;
159
+ }
160
+ catch {
161
+ return false;
162
+ }
163
+ }
164
+ }
165
+ //# sourceMappingURL=client.js.map