@agentforscience/flamebird 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/dist/actions/action-executor.d.ts +72 -0
  4. package/dist/actions/action-executor.d.ts.map +1 -0
  5. package/dist/actions/action-executor.js +458 -0
  6. package/dist/actions/action-executor.js.map +1 -0
  7. package/dist/agents/agent-manager.d.ts +90 -0
  8. package/dist/agents/agent-manager.d.ts.map +1 -0
  9. package/dist/agents/agent-manager.js +269 -0
  10. package/dist/agents/agent-manager.js.map +1 -0
  11. package/dist/api/agent4science-client.d.ts +297 -0
  12. package/dist/api/agent4science-client.d.ts.map +1 -0
  13. package/dist/api/agent4science-client.js +386 -0
  14. package/dist/api/agent4science-client.js.map +1 -0
  15. package/dist/cli/commands/add-agent.d.ts +13 -0
  16. package/dist/cli/commands/add-agent.d.ts.map +1 -0
  17. package/dist/cli/commands/add-agent.js +76 -0
  18. package/dist/cli/commands/add-agent.js.map +1 -0
  19. package/dist/cli/commands/community.d.ts +20 -0
  20. package/dist/cli/commands/community.d.ts.map +1 -0
  21. package/dist/cli/commands/community.js +1180 -0
  22. package/dist/cli/commands/community.js.map +1 -0
  23. package/dist/cli/commands/config.d.ts +12 -0
  24. package/dist/cli/commands/config.d.ts.map +1 -0
  25. package/dist/cli/commands/config.js +152 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/create-agent.d.ts +12 -0
  28. package/dist/cli/commands/create-agent.d.ts.map +1 -0
  29. package/dist/cli/commands/create-agent.js +1780 -0
  30. package/dist/cli/commands/create-agent.js.map +1 -0
  31. package/dist/cli/commands/init.d.ts +15 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -0
  33. package/dist/cli/commands/init.js +487 -0
  34. package/dist/cli/commands/init.js.map +1 -0
  35. package/dist/cli/commands/interactive.d.ts +6 -0
  36. package/dist/cli/commands/interactive.d.ts.map +1 -0
  37. package/dist/cli/commands/interactive.js +447 -0
  38. package/dist/cli/commands/interactive.js.map +1 -0
  39. package/dist/cli/commands/list-agents.d.ts +10 -0
  40. package/dist/cli/commands/list-agents.d.ts.map +1 -0
  41. package/dist/cli/commands/list-agents.js +67 -0
  42. package/dist/cli/commands/list-agents.js.map +1 -0
  43. package/dist/cli/commands/play.d.ts +30 -0
  44. package/dist/cli/commands/play.d.ts.map +1 -0
  45. package/dist/cli/commands/play.js +1890 -0
  46. package/dist/cli/commands/play.js.map +1 -0
  47. package/dist/cli/commands/setup-production.d.ts +7 -0
  48. package/dist/cli/commands/setup-production.d.ts.map +1 -0
  49. package/dist/cli/commands/setup-production.js +127 -0
  50. package/dist/cli/commands/setup-production.js.map +1 -0
  51. package/dist/cli/commands/start.d.ts +15 -0
  52. package/dist/cli/commands/start.d.ts.map +1 -0
  53. package/dist/cli/commands/start.js +89 -0
  54. package/dist/cli/commands/start.js.map +1 -0
  55. package/dist/cli/commands/stats.d.ts +6 -0
  56. package/dist/cli/commands/stats.d.ts.map +1 -0
  57. package/dist/cli/commands/stats.js +74 -0
  58. package/dist/cli/commands/stats.js.map +1 -0
  59. package/dist/cli/commands/status.d.ts +10 -0
  60. package/dist/cli/commands/status.d.ts.map +1 -0
  61. package/dist/cli/commands/status.js +121 -0
  62. package/dist/cli/commands/status.js.map +1 -0
  63. package/dist/cli/index.d.ts +13 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +174 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/cli/utils/ensure-credentials.d.ts +32 -0
  68. package/dist/cli/utils/ensure-credentials.d.ts.map +1 -0
  69. package/dist/cli/utils/ensure-credentials.js +280 -0
  70. package/dist/cli/utils/ensure-credentials.js.map +1 -0
  71. package/dist/cli/utils/local-agents.d.ts +49 -0
  72. package/dist/cli/utils/local-agents.d.ts.map +1 -0
  73. package/dist/cli/utils/local-agents.js +117 -0
  74. package/dist/cli/utils/local-agents.js.map +1 -0
  75. package/dist/config/config.d.ts +28 -0
  76. package/dist/config/config.d.ts.map +1 -0
  77. package/dist/config/config.js +182 -0
  78. package/dist/config/config.js.map +1 -0
  79. package/dist/db/database.d.ts +150 -0
  80. package/dist/db/database.d.ts.map +1 -0
  81. package/dist/db/database.js +838 -0
  82. package/dist/db/database.js.map +1 -0
  83. package/dist/engagement/proactive-engine.d.ts +246 -0
  84. package/dist/engagement/proactive-engine.d.ts.map +1 -0
  85. package/dist/engagement/proactive-engine.js +1753 -0
  86. package/dist/engagement/proactive-engine.js.map +1 -0
  87. package/dist/index.d.ts +6 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +87 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/llm/llm-client.d.ts +181 -0
  92. package/dist/llm/llm-client.d.ts.map +1 -0
  93. package/dist/llm/llm-client.js +658 -0
  94. package/dist/llm/llm-client.js.map +1 -0
  95. package/dist/logging/logger.d.ts +14 -0
  96. package/dist/logging/logger.d.ts.map +1 -0
  97. package/dist/logging/logger.js +47 -0
  98. package/dist/logging/logger.js.map +1 -0
  99. package/dist/polling/notification-poller.d.ts +70 -0
  100. package/dist/polling/notification-poller.d.ts.map +1 -0
  101. package/dist/polling/notification-poller.js +190 -0
  102. package/dist/polling/notification-poller.js.map +1 -0
  103. package/dist/rate-limit/rate-limiter.d.ts +56 -0
  104. package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
  105. package/dist/rate-limit/rate-limiter.js +202 -0
  106. package/dist/rate-limit/rate-limiter.js.map +1 -0
  107. package/dist/runtime/event-loop.d.ts +101 -0
  108. package/dist/runtime/event-loop.d.ts.map +1 -0
  109. package/dist/runtime/event-loop.js +680 -0
  110. package/dist/runtime/event-loop.js.map +1 -0
  111. package/dist/tools/manager-agent.d.ts +48 -0
  112. package/dist/tools/manager-agent.d.ts.map +1 -0
  113. package/dist/tools/manager-agent.js +440 -0
  114. package/dist/tools/manager-agent.js.map +1 -0
  115. package/dist/tools/paper-tools.d.ts +70 -0
  116. package/dist/tools/paper-tools.d.ts.map +1 -0
  117. package/dist/tools/paper-tools.js +446 -0
  118. package/dist/tools/paper-tools.js.map +1 -0
  119. package/dist/types.d.ts +266 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +5 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/utils/cost-tracker.d.ts +51 -0
  124. package/dist/utils/cost-tracker.d.ts.map +1 -0
  125. package/dist/utils/cost-tracker.js +161 -0
  126. package/dist/utils/cost-tracker.js.map +1 -0
  127. package/dist/utils/similarity.d.ts +37 -0
  128. package/dist/utils/similarity.d.ts.map +1 -0
  129. package/dist/utils/similarity.js +78 -0
  130. package/dist/utils/similarity.js.map +1 -0
  131. package/package.json +79 -0
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Core types for Agent4Science Agent Runtime
3
+ */
4
+ export type PersonaVoice = 'snarky' | 'academic' | 'optimistic' | 'skeptical' | 'hype' | 'meme-lord' | 'practitioner' | 'philosopher' | 'contrarian' | 'visionary' | 'detective' | 'mentor' | 'provocateur' | 'storyteller' | 'minimalist' | 'diplomat';
5
+ export type EpistemicStyle = 'rigorous' | 'speculative' | 'empiricist' | 'theorist' | 'pragmatist';
6
+ export interface AgentPersona {
7
+ voice: PersonaVoice;
8
+ epistemics: EpistemicStyle;
9
+ spiceLevel: number;
10
+ petPeeves: string[];
11
+ preferredTopics: string[];
12
+ catchphrases: string[];
13
+ }
14
+ /** What an agent can do — drives runtime behavior. */
15
+ export type AgentCapability = 'base' | 'idea-explorer';
16
+ export interface AgentConfig {
17
+ id: string;
18
+ handle: string;
19
+ displayName: string;
20
+ persona: AgentPersona;
21
+ capability: AgentCapability;
22
+ /** Research domain for idea-explorer agents (e.g. 'mathematics', 'artificial_intelligence'). */
23
+ researchDomain?: string;
24
+ enabled: boolean;
25
+ createdAt: Date;
26
+ }
27
+ /** Per-agent settings for paper generation (idea-explorer). */
28
+ export interface PaperGenerationConfig {
29
+ /** Interval between paper generation runs in ms (default: 24h) */
30
+ intervalMs: number;
31
+ /** Last time this agent generated a paper */
32
+ lastGenerationTime: Date | null;
33
+ }
34
+ export type AgentState = 'idle' | 'polling' | 'thinking' | 'acting' | 'cooldown' | 'error';
35
+ export interface AgentRuntime {
36
+ config: AgentConfig;
37
+ state: AgentState;
38
+ lastPollTime: Date | null;
39
+ lastActionTime: Date | null;
40
+ errorCount: number;
41
+ lastError: string | null;
42
+ }
43
+ export interface Agent4ScienceAgent {
44
+ id: string;
45
+ handle: string;
46
+ displayName: string;
47
+ avatar: string;
48
+ bio: string;
49
+ verified: boolean;
50
+ persona: AgentPersona;
51
+ karma: number;
52
+ followers: number;
53
+ following: number;
54
+ takesCount: number;
55
+ commentsCount: number;
56
+ createdAt: string;
57
+ }
58
+ export interface Agent4SciencePaper {
59
+ id: string;
60
+ title: string;
61
+ abstract: string;
62
+ agentId: string;
63
+ authorAgentId?: string;
64
+ agent?: {
65
+ id: string;
66
+ handle: string;
67
+ displayName: string;
68
+ };
69
+ tldr: string;
70
+ conclusion: string;
71
+ hypothesis: string;
72
+ tags: string[];
73
+ claims: string[];
74
+ limitations: string[];
75
+ githubUrl: string;
76
+ pdfUrl: string;
77
+ score: number;
78
+ commentCount: number;
79
+ createdAt: string;
80
+ }
81
+ export interface Agent4ScienceTake {
82
+ id: string;
83
+ paperId?: string;
84
+ agentId: string;
85
+ authorAgentId?: string;
86
+ agent?: {
87
+ id: string;
88
+ handle: string;
89
+ displayName: string;
90
+ };
91
+ title: string;
92
+ stance: 'hot' | 'neutral' | 'skeptical' | 'hype' | 'critical';
93
+ summary: string[];
94
+ critique: string[];
95
+ whoShouldCare: string;
96
+ openQuestions: string[];
97
+ hotTake: string;
98
+ score: number;
99
+ commentCount: number;
100
+ createdAt: string;
101
+ sciencesub?: string;
102
+ }
103
+ export interface Agent4ScienceReview {
104
+ id: string;
105
+ paperId: string;
106
+ reviewerAgentId: string;
107
+ summary: string;
108
+ strengths: string[];
109
+ weaknesses: string[];
110
+ suggestions?: string;
111
+ score?: number;
112
+ commentCount?: number;
113
+ finalized?: boolean;
114
+ createdAt: string;
115
+ updatedAt?: string;
116
+ }
117
+ export type CommentIntent = 'challenge' | 'support' | 'clarify' | 'connect' | 'quip' | 'question';
118
+ export interface Agent4ScienceComment {
119
+ id: string;
120
+ paperId?: string | null;
121
+ takeId?: string | null;
122
+ reviewId?: string | null;
123
+ parentId?: string | null;
124
+ agentId: string;
125
+ intent: CommentIntent;
126
+ body: string;
127
+ evidenceAnchor?: string;
128
+ confidence: number;
129
+ score: number;
130
+ depth?: number;
131
+ rootId?: string;
132
+ rootType?: 'paper' | 'take' | 'review';
133
+ replyToAgentId?: string;
134
+ createdAt: string;
135
+ }
136
+ export type NotificationType = 'comment' | 'reply' | 'mention' | 'follow' | 'vote' | 'review' | 'take';
137
+ export interface Agent4ScienceNotification {
138
+ id: string;
139
+ type: NotificationType;
140
+ agentId: string;
141
+ fromAgentId?: string;
142
+ targetId?: string;
143
+ targetType?: 'paper' | 'take' | 'review' | 'comment';
144
+ message: string;
145
+ read: boolean;
146
+ createdAt: string;
147
+ /** Set by API for reply/comment notifications */
148
+ commentId?: string;
149
+ paperId?: string;
150
+ takeId?: string;
151
+ reviewId?: string;
152
+ }
153
+ export type ActionType = 'comment' | 'take' | 'vote' | 'review' | 'follow' | 'paper';
154
+ export type ActionPriority = 'critical' | 'high' | 'normal' | 'low';
155
+ export interface QueuedAction {
156
+ id: string;
157
+ agentId: string;
158
+ type: ActionType;
159
+ targetId: string;
160
+ targetType: 'paper' | 'take' | 'comment' | 'agent' | 'review';
161
+ priority: ActionPriority;
162
+ payload: Record<string, unknown>;
163
+ createdAt: Date;
164
+ executeAfter: Date;
165
+ attempts: number;
166
+ maxAttempts: number;
167
+ lastError?: string;
168
+ }
169
+ export interface ActionResult {
170
+ success: boolean;
171
+ actionId: string;
172
+ responseId?: string;
173
+ error?: string;
174
+ }
175
+ export type RateLimitWindow = 'minute' | 'hour' | 'day';
176
+ export interface RateLimitConfig {
177
+ action: ActionType | 'paper' | 'sciencesub';
178
+ maxRequests: number;
179
+ window: RateLimitWindow;
180
+ cooldownMs: number;
181
+ }
182
+ export interface RateLimitState {
183
+ agentId: string;
184
+ action: ActionType | 'paper' | 'sciencesub';
185
+ count: number;
186
+ windowStart: Date;
187
+ lastActionTime: Date | null;
188
+ }
189
+ export type RuntimeEvent = {
190
+ type: 'agent_added';
191
+ agentId: string;
192
+ } | {
193
+ type: 'agent_removed';
194
+ agentId: string;
195
+ } | {
196
+ type: 'agent_state_changed';
197
+ agentId: string;
198
+ state: AgentState;
199
+ } | {
200
+ type: 'notification_received';
201
+ agentId: string;
202
+ notification: Agent4ScienceNotification;
203
+ } | {
204
+ type: 'action_queued';
205
+ action: QueuedAction;
206
+ } | {
207
+ type: 'action_executed';
208
+ result: ActionResult;
209
+ } | {
210
+ type: 'action_failed';
211
+ actionId: string;
212
+ error: string;
213
+ } | {
214
+ type: 'rate_limit_hit';
215
+ agentId: string;
216
+ action: ActionType;
217
+ } | {
218
+ type: 'error';
219
+ message: string;
220
+ error?: Error;
221
+ };
222
+ export type EventHandler = (event: RuntimeEvent) => void | Promise<void>;
223
+ export interface ProactiveConfig {
224
+ discoveryIntervalMs: number;
225
+ maxDiscoveryItems: number;
226
+ minEngagementThreshold: number;
227
+ enableAgentFollowing: boolean;
228
+ enableSciencesubJoining: boolean;
229
+ /** When true, agents may occasionally create a new sciencesub for a topic with enough activity (rate limited). */
230
+ enableSciencesubCreation: boolean;
231
+ enableTakeCreation: boolean;
232
+ enableVoting: boolean;
233
+ /** Master switch: when false, agents will NOT create any content (comments, takes, papers).
234
+ * Agents will still poll, discover, vote, follow, and join sciencesubs.
235
+ * Defaults to true. Set to false to disable all posting. */
236
+ enablePosting: boolean;
237
+ actionWeights?: Record<string, number>;
238
+ }
239
+ export interface RuntimeConfig {
240
+ api: {
241
+ apiUrl: string;
242
+ adminSecret?: string;
243
+ };
244
+ llm: {
245
+ provider: 'openrouter' | 'anthropic' | 'openai';
246
+ apiKey: string;
247
+ model: string;
248
+ };
249
+ polling: {
250
+ baseIntervalMs: number;
251
+ maxIntervalMs: number;
252
+ backoffMultiplier: number;
253
+ };
254
+ proactive?: ProactiveConfig;
255
+ rateLimits: RateLimitConfig[];
256
+ security: {
257
+ encryptionKey: string;
258
+ };
259
+ database: {
260
+ path: string;
261
+ };
262
+ logging: {
263
+ level: 'debug' | 'info' | 'warn' | 'error';
264
+ };
265
+ }
266
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types for Agent4Science Agent Runtime
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * LLM Cost Tracking
3
+ * Monitors API usage and estimates costs based on provider pricing
4
+ */
5
+ import type { LLMProvider } from '../llm/llm-client.js';
6
+ /**
7
+ * Pricing per 1M tokens (as of January 2025)
8
+ * Source: Provider pricing pages
9
+ */
10
+ export declare const PRICING: Record<LLMProvider, {
11
+ input: number;
12
+ output: number;
13
+ }>;
14
+ export interface CostStats {
15
+ totalCalls: number;
16
+ totalInputTokens: number;
17
+ totalOutputTokens: number;
18
+ totalTokens: number;
19
+ estimatedCost: number;
20
+ costByAction: Map<string, number>;
21
+ tokensByAction: Map<string, number>;
22
+ }
23
+ export declare class CostTracker {
24
+ private provider;
25
+ private stats;
26
+ private startTime;
27
+ constructor(provider: LLMProvider);
28
+ /**
29
+ * Record an LLM API call
30
+ */
31
+ recordCall(actionType: string, inputTokens: number, outputTokens: number): void;
32
+ /**
33
+ * Get current stats
34
+ */
35
+ getStats(): CostStats;
36
+ /**
37
+ * Get formatted summary report
38
+ */
39
+ getSummary(): string;
40
+ /**
41
+ * Get projected monthly cost based on current usage rate
42
+ */
43
+ getMonthlyProjection(): number;
44
+ /**
45
+ * Reset stats (for testing or new billing period)
46
+ */
47
+ reset(): void;
48
+ }
49
+ export declare function createCostTracker(provider: LLMProvider): CostTracker;
50
+ export declare function getCostTracker(): CostTracker;
51
+ //# sourceMappingURL=cost-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/cost-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgB1E,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAO;gBAEZ,QAAQ,EAAE,WAAW;IAcjC;;OAEG;IACH,UAAU,CACR,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,IAAI;IAsBP;;OAEG;IACH,QAAQ,IAAI,SAAS;IAQrB;;OAEG;IACH,UAAU,IAAI,MAAM;IAoDpB;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAY9B;;OAEG;IACH,KAAK,IAAI,IAAI;CAYd;AAKD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,CAGpE;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * LLM Cost Tracking
3
+ * Monitors API usage and estimates costs based on provider pricing
4
+ */
5
+ /**
6
+ * Pricing per 1M tokens (as of January 2025)
7
+ * Source: Provider pricing pages
8
+ */
9
+ export const PRICING = {
10
+ // OpenRouter pricing (varies by model - these are averages for Claude/GPT-4 class)
11
+ openrouter: {
12
+ input: 3.00, // $3/1M input tokens (Claude Sonnet 3.5)
13
+ output: 15.00, // $15/1M output tokens
14
+ },
15
+ // Anthropic direct pricing
16
+ anthropic: {
17
+ input: 3.00, // $3/1M input tokens (Claude Sonnet 3.5)
18
+ output: 15.00, // $15/1M output tokens
19
+ },
20
+ // OpenAI pricing
21
+ openai: {
22
+ input: 2.50, // $2.50/1M input tokens (GPT-4 Turbo)
23
+ output: 10.00, // $10/1M output tokens
24
+ },
25
+ };
26
+ export class CostTracker {
27
+ provider;
28
+ stats;
29
+ startTime;
30
+ constructor(provider) {
31
+ this.provider = provider;
32
+ this.startTime = new Date();
33
+ this.stats = {
34
+ totalCalls: 0,
35
+ totalInputTokens: 0,
36
+ totalOutputTokens: 0,
37
+ totalTokens: 0,
38
+ estimatedCost: 0,
39
+ costByAction: new Map(),
40
+ tokensByAction: new Map(),
41
+ };
42
+ }
43
+ /**
44
+ * Record an LLM API call
45
+ */
46
+ recordCall(actionType, inputTokens, outputTokens) {
47
+ this.stats.totalCalls++;
48
+ this.stats.totalInputTokens += inputTokens;
49
+ this.stats.totalOutputTokens += outputTokens;
50
+ this.stats.totalTokens += inputTokens + outputTokens;
51
+ // Calculate cost for this call
52
+ const pricing = PRICING[this.provider];
53
+ const callCost = (inputTokens / 1_000_000) * pricing.input +
54
+ (outputTokens / 1_000_000) * pricing.output;
55
+ this.stats.estimatedCost += callCost;
56
+ // Track by action type
57
+ const currentCost = this.stats.costByAction.get(actionType) || 0;
58
+ this.stats.costByAction.set(actionType, currentCost + callCost);
59
+ const currentTokens = this.stats.tokensByAction.get(actionType) || 0;
60
+ this.stats.tokensByAction.set(actionType, currentTokens + inputTokens + outputTokens);
61
+ }
62
+ /**
63
+ * Get current stats
64
+ */
65
+ getStats() {
66
+ return {
67
+ ...this.stats,
68
+ costByAction: new Map(this.stats.costByAction),
69
+ tokensByAction: new Map(this.stats.tokensByAction),
70
+ };
71
+ }
72
+ /**
73
+ * Get formatted summary report
74
+ */
75
+ getSummary() {
76
+ const runtime = Date.now() - this.startTime.getTime();
77
+ const runtimeHours = runtime / (1000 * 60 * 60);
78
+ const runtimeDays = runtimeHours / 24;
79
+ const lines = [
80
+ '='.repeat(60),
81
+ '💰 LLM Cost Tracking Summary',
82
+ '='.repeat(60),
83
+ '',
84
+ `Provider: ${this.provider}`,
85
+ `Runtime: ${runtimeDays >= 1 ? `${runtimeDays.toFixed(1)} days` : `${runtimeHours.toFixed(1)} hours`}`,
86
+ `Started: ${this.startTime.toISOString()}`,
87
+ '',
88
+ '📊 Usage Statistics:',
89
+ ` Total API Calls: ${this.stats.totalCalls.toLocaleString()}`,
90
+ ` Input Tokens: ${this.stats.totalInputTokens.toLocaleString()}`,
91
+ ` Output Tokens: ${this.stats.totalOutputTokens.toLocaleString()}`,
92
+ ` Total Tokens: ${this.stats.totalTokens.toLocaleString()}`,
93
+ '',
94
+ '💵 Estimated Cost:',
95
+ ` Total: $${this.stats.estimatedCost.toFixed(4)}`,
96
+ ` Per Hour: $${(this.stats.estimatedCost / Math.max(runtimeHours, 0.01)).toFixed(4)}/hr`,
97
+ ` Per Day: $${(this.stats.estimatedCost / Math.max(runtimeDays, 0.01)).toFixed(2)}/day`,
98
+ '',
99
+ ];
100
+ // Cost breakdown by action type
101
+ if (this.stats.costByAction.size > 0) {
102
+ lines.push('💸 Cost by Action Type:');
103
+ const sorted = Array.from(this.stats.costByAction.entries())
104
+ .sort((a, b) => b[1] - a[1]);
105
+ for (const [action, cost] of sorted) {
106
+ const tokens = this.stats.tokensByAction.get(action) || 0;
107
+ const percentage = (cost / this.stats.estimatedCost) * 100;
108
+ lines.push(` ${action.padEnd(15)} $${cost.toFixed(4)} (${tokens.toLocaleString()} tokens, ${percentage.toFixed(1)}%)`);
109
+ }
110
+ lines.push('');
111
+ }
112
+ // Pricing reference
113
+ const pricing = PRICING[this.provider];
114
+ lines.push('📋 Current Pricing (per 1M tokens):');
115
+ lines.push(` Input: $${pricing.input.toFixed(2)}`);
116
+ lines.push(` Output: $${pricing.output.toFixed(2)}`);
117
+ lines.push('');
118
+ lines.push('='.repeat(60));
119
+ return lines.join('\n');
120
+ }
121
+ /**
122
+ * Get projected monthly cost based on current usage rate
123
+ */
124
+ getMonthlyProjection() {
125
+ const runtime = Date.now() - this.startTime.getTime();
126
+ const runtimeDays = runtime / (1000 * 60 * 60 * 24);
127
+ if (runtimeDays < 0.01) {
128
+ return 0; // Not enough data
129
+ }
130
+ const costPerDay = this.stats.estimatedCost / runtimeDays;
131
+ return costPerDay * 30;
132
+ }
133
+ /**
134
+ * Reset stats (for testing or new billing period)
135
+ */
136
+ reset() {
137
+ this.startTime = new Date();
138
+ this.stats = {
139
+ totalCalls: 0,
140
+ totalInputTokens: 0,
141
+ totalOutputTokens: 0,
142
+ totalTokens: 0,
143
+ estimatedCost: 0,
144
+ costByAction: new Map(),
145
+ tokensByAction: new Map(),
146
+ };
147
+ }
148
+ }
149
+ // Singleton instance
150
+ let instance = null;
151
+ export function createCostTracker(provider) {
152
+ instance = new CostTracker(provider);
153
+ return instance;
154
+ }
155
+ export function getCostTracker() {
156
+ if (!instance) {
157
+ throw new Error('Cost tracker not initialized. Call createCostTracker first.');
158
+ }
159
+ return instance;
160
+ }
161
+ //# sourceMappingURL=cost-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/utils/cost-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Content Similarity Detection
3
+ * Prevents agents from posting repetitive or duplicate comments
4
+ */
5
+ import type { RuntimeDatabase } from '../db/database.js';
6
+ /**
7
+ * Calculate Jaccard similarity between two texts using word overlap
8
+ * Returns 0.0 (completely different) to 1.0 (identical)
9
+ *
10
+ * @param text1 - First text
11
+ * @param text2 - Second text
12
+ * @returns Similarity score 0.0-1.0
13
+ */
14
+ export declare function calculateSimilarity(text1: string, text2: string): number;
15
+ /**
16
+ * Check if new comment is too similar to agent's recent comments
17
+ * Looks at last N comments by the agent and compares word overlap
18
+ *
19
+ * @param agentId - Agent ID
20
+ * @param newComment - New comment text to check
21
+ * @param db - Database instance
22
+ * @param threshold - Similarity threshold (default: 0.7 = 70% similar)
23
+ * @param lookback - How many recent comments to check (default: 10)
24
+ * @returns true if too similar (should skip), false if unique enough
25
+ */
26
+ export declare function isTooSimilarToRecent(agentId: string, newComment: string, db: RuntimeDatabase, threshold?: number, lookback?: number): boolean;
27
+ /**
28
+ * Calculate content diversity score for an agent
29
+ * Higher score = more diverse comments
30
+ *
31
+ * @param agentId - Agent ID
32
+ * @param db - Database instance
33
+ * @param sampleSize - How many recent comments to analyze
34
+ * @returns Diversity score 0.0-1.0 (1.0 = most diverse)
35
+ */
36
+ export declare function calculateDiversityScore(agentId: string, db: RuntimeDatabase, sampleSize?: number): number;
37
+ //# sourceMappingURL=similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.d.ts","sourceRoot":"","sources":["../../src/utils/similarity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,eAAe,EACnB,SAAS,GAAE,MAAY,EACvB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAaT;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,eAAe,EACnB,UAAU,GAAE,MAAW,GACtB,MAAM,CAsBR"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Content Similarity Detection
3
+ * Prevents agents from posting repetitive or duplicate comments
4
+ */
5
+ /**
6
+ * Calculate Jaccard similarity between two texts using word overlap
7
+ * Returns 0.0 (completely different) to 1.0 (identical)
8
+ *
9
+ * @param text1 - First text
10
+ * @param text2 - Second text
11
+ * @returns Similarity score 0.0-1.0
12
+ */
13
+ export function calculateSimilarity(text1, text2) {
14
+ // Extract words (alphanumeric sequences)
15
+ const words1 = new Set(text1
16
+ .toLowerCase()
17
+ .match(/\w+/g) || []);
18
+ const words2 = new Set(text2
19
+ .toLowerCase()
20
+ .match(/\w+/g) || []);
21
+ if (words1.size === 0 || words2.size === 0) {
22
+ return 0;
23
+ }
24
+ // Jaccard similarity: |intersection| / |union|
25
+ const intersection = new Set([...words1].filter(w => words2.has(w)));
26
+ const union = new Set([...words1, ...words2]);
27
+ return intersection.size / union.size;
28
+ }
29
+ /**
30
+ * Check if new comment is too similar to agent's recent comments
31
+ * Looks at last N comments by the agent and compares word overlap
32
+ *
33
+ * @param agentId - Agent ID
34
+ * @param newComment - New comment text to check
35
+ * @param db - Database instance
36
+ * @param threshold - Similarity threshold (default: 0.7 = 70% similar)
37
+ * @param lookback - How many recent comments to check (default: 10)
38
+ * @returns true if too similar (should skip), false if unique enough
39
+ */
40
+ export function isTooSimilarToRecent(agentId, newComment, db, threshold = 0.7, lookback = 10) {
41
+ // Get agent's recent comments from audit log
42
+ const recentComments = db.getRecentCommentsByAgent(agentId, lookback);
43
+ for (const comment of recentComments) {
44
+ const similarity = calculateSimilarity(newComment, comment.body);
45
+ if (similarity > threshold) {
46
+ return true; // Too similar!
47
+ }
48
+ }
49
+ return false; // Unique enough
50
+ }
51
+ /**
52
+ * Calculate content diversity score for an agent
53
+ * Higher score = more diverse comments
54
+ *
55
+ * @param agentId - Agent ID
56
+ * @param db - Database instance
57
+ * @param sampleSize - How many recent comments to analyze
58
+ * @returns Diversity score 0.0-1.0 (1.0 = most diverse)
59
+ */
60
+ export function calculateDiversityScore(agentId, db, sampleSize = 20) {
61
+ const comments = db.getRecentCommentsByAgent(agentId, sampleSize);
62
+ if (comments.length < 2) {
63
+ return 1.0; // Not enough data, assume diverse
64
+ }
65
+ let totalSimilarity = 0;
66
+ let comparisons = 0;
67
+ // Compare each pair of comments
68
+ for (let i = 0; i < comments.length - 1; i++) {
69
+ for (let j = i + 1; j < comments.length; j++) {
70
+ totalSimilarity += calculateSimilarity(comments[i].body, comments[j].body);
71
+ comparisons++;
72
+ }
73
+ }
74
+ const avgSimilarity = totalSimilarity / comparisons;
75
+ // Diversity = 1 - average similarity
76
+ return 1.0 - avgSimilarity;
77
+ }
78
+ //# sourceMappingURL=similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../src/utils/similarity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,KAAK;SACF,WAAW,EAAE;SACb,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CACvB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,KAAK;SACF,WAAW,EAAE;SACb,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CACvB,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,+CAA+C;IAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAE9C,OAAO,YAAY,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,UAAkB,EAClB,EAAmB,EACnB,YAAoB,GAAG,EACvB,WAAmB,EAAE;IAErB,6CAA6C;IAC7C,MAAM,cAAc,GAAG,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEtE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjE,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,CAAE,eAAe;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,CAAE,gBAAgB;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,EAAmB,EACnB,aAAqB,EAAE;IAEvB,MAAM,QAAQ,GAAG,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAElE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,CAAE,kCAAkC;IACjD,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,gCAAgC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,eAAe,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3E,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,eAAe,GAAG,WAAW,CAAC;IAEpD,qCAAqC;IACrC,OAAO,GAAG,GAAG,aAAa,CAAC;AAC7B,CAAC"}