spora 0.3.1 → 0.3.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 (83) hide show
  1. package/package.json +1 -1
  2. package/dist/account-creator-SETL5CGT.js +0 -498
  3. package/dist/account-creator-SETL5CGT.js.map +0 -1
  4. package/dist/chunk-FCAK5FYQ.js +0 -127
  5. package/dist/chunk-FCAK5FYQ.js.map +0 -1
  6. package/dist/chunk-GJFBWIW3.js +0 -622
  7. package/dist/chunk-GJFBWIW3.js.map +0 -1
  8. package/dist/chunk-HERI4RPY.js +0 -156
  9. package/dist/chunk-HERI4RPY.js.map +0 -1
  10. package/dist/chunk-J7J557HV.js +0 -47
  11. package/dist/chunk-J7J557HV.js.map +0 -1
  12. package/dist/chunk-JWMADEQO.js +0 -57
  13. package/dist/chunk-JWMADEQO.js.map +0 -1
  14. package/dist/chunk-LRKBNKMQ.js +0 -79
  15. package/dist/chunk-LRKBNKMQ.js.map +0 -1
  16. package/dist/chunk-NLWU5432.js +0 -32
  17. package/dist/chunk-NLWU5432.js.map +0 -1
  18. package/dist/chunk-POEDIDM6.js +0 -56
  19. package/dist/chunk-POEDIDM6.js.map +0 -1
  20. package/dist/chunk-Q7YS3AIK.js +0 -63
  21. package/dist/chunk-Q7YS3AIK.js.map +0 -1
  22. package/dist/chunk-QHFM2YW6.js +0 -159
  23. package/dist/chunk-QHFM2YW6.js.map +0 -1
  24. package/dist/chunk-R7PAD4OL.js +0 -44
  25. package/dist/chunk-R7PAD4OL.js.map +0 -1
  26. package/dist/chunk-RNVEWVDN.js +0 -129
  27. package/dist/chunk-RNVEWVDN.js.map +0 -1
  28. package/dist/chunk-SUFTVQME.js +0 -82
  29. package/dist/chunk-SUFTVQME.js.map +0 -1
  30. package/dist/chunk-SXMDYUK3.js +0 -80
  31. package/dist/chunk-SXMDYUK3.js.map +0 -1
  32. package/dist/chunk-TQWLKICD.js +0 -660
  33. package/dist/chunk-TQWLKICD.js.map +0 -1
  34. package/dist/chunk-YZ7RWJ6Z.js +0 -262
  35. package/dist/chunk-YZ7RWJ6Z.js.map +0 -1
  36. package/dist/cli.js +0 -654
  37. package/dist/cli.js.map +0 -1
  38. package/dist/client-23THPNVL.js +0 -382
  39. package/dist/client-23THPNVL.js.map +0 -1
  40. package/dist/client-NVI3ZD4G.js +0 -411
  41. package/dist/client-NVI3ZD4G.js.map +0 -1
  42. package/dist/colony-J4EZQI37.js +0 -229
  43. package/dist/colony-J4EZQI37.js.map +0 -1
  44. package/dist/config-QRBOL4NX.js +0 -14
  45. package/dist/config-QRBOL4NX.js.map +0 -1
  46. package/dist/crypto-ZVWJLD2J.js +0 -14
  47. package/dist/crypto-ZVWJLD2J.js.map +0 -1
  48. package/dist/decision-engine-WBD36PZI.js +0 -19
  49. package/dist/decision-engine-WBD36PZI.js.map +0 -1
  50. package/dist/goals-IM4AEHS4.js +0 -12
  51. package/dist/goals-IM4AEHS4.js.map +0 -1
  52. package/dist/heartbeat-TUV5IREO.js +0 -317
  53. package/dist/heartbeat-TUV5IREO.js.map +0 -1
  54. package/dist/identity-LN2R4KJU.js +0 -26
  55. package/dist/identity-LN2R4KJU.js.map +0 -1
  56. package/dist/image-search-SZVMGWLN.js +0 -45
  57. package/dist/image-search-SZVMGWLN.js.map +0 -1
  58. package/dist/init-FR5OTDRJ.js +0 -403
  59. package/dist/init-FR5OTDRJ.js.map +0 -1
  60. package/dist/llm-MHZG2VHU.js +0 -16
  61. package/dist/llm-MHZG2VHU.js.map +0 -1
  62. package/dist/mcp-server.js +0 -773
  63. package/dist/mcp-server.js.map +0 -1
  64. package/dist/memory-J6AYZ5Y2.js +0 -26
  65. package/dist/memory-J6AYZ5Y2.js.map +0 -1
  66. package/dist/memory-JMXU3UXR.js +0 -26
  67. package/dist/memory-JMXU3UXR.js.map +0 -1
  68. package/dist/paths-KXOWF2B2.js +0 -13
  69. package/dist/paths-KXOWF2B2.js.map +0 -1
  70. package/dist/performance-7G6R6ELJ.js +0 -18
  71. package/dist/performance-7G6R6ELJ.js.map +0 -1
  72. package/dist/prompt-builder-EQYCNP63.js +0 -28
  73. package/dist/prompt-builder-EQYCNP63.js.map +0 -1
  74. package/dist/queue-MLRTMJRE.js +0 -14
  75. package/dist/queue-MLRTMJRE.js.map +0 -1
  76. package/dist/strategy-TOVFBIZQ.js +0 -12
  77. package/dist/strategy-TOVFBIZQ.js.map +0 -1
  78. package/dist/web-chat/chat.html +0 -1343
  79. package/dist/web-chat/logo.png +0 -0
  80. package/dist/web-chat-RZKDQYJ4.js +0 -802
  81. package/dist/web-chat-RZKDQYJ4.js.map +0 -1
  82. package/dist/x-client-HUXCQOAW.js +0 -12
  83. package/dist/x-client-HUXCQOAW.js.map +0 -1
@@ -1,127 +0,0 @@
1
- import {
2
- paths
3
- } from "./chunk-Q7YS3AIK.js";
4
-
5
- // src/memory/performance.ts
6
- import { existsSync, readFileSync, writeFileSync } from "fs";
7
- function loadPerformance() {
8
- if (!existsSync(paths.performance)) {
9
- return { trackedPosts: [], selfMetrics: [] };
10
- }
11
- try {
12
- return JSON.parse(readFileSync(paths.performance, "utf-8"));
13
- } catch {
14
- return { trackedPosts: [], selfMetrics: [] };
15
- }
16
- }
17
- function savePerformance(data) {
18
- writeFileSync(paths.performance, JSON.stringify(data, null, 2));
19
- }
20
- function trackPost(tweetId, content, type) {
21
- const data = loadPerformance();
22
- if (data.trackedPosts.some((p) => p.tweetId === tweetId)) return;
23
- data.trackedPosts.push({
24
- tweetId,
25
- content,
26
- type,
27
- postedAt: (/* @__PURE__ */ new Date()).toISOString(),
28
- metrics: [],
29
- retired: false
30
- });
31
- savePerformance(data);
32
- }
33
- function getActiveTrackedPosts() {
34
- const data = loadPerformance();
35
- return data.trackedPosts.filter((p) => !p.retired);
36
- }
37
- function updatePostMetrics(tweetId, metric) {
38
- const data = loadPerformance();
39
- const post = data.trackedPosts.find((p) => p.tweetId === tweetId);
40
- if (!post) return;
41
- post.metrics.push(metric);
42
- savePerformance(data);
43
- }
44
- function retireOldPosts() {
45
- const data = loadPerformance();
46
- const cutoff = Date.now() - 72 * 60 * 60 * 1e3;
47
- let changed = false;
48
- for (const post of data.trackedPosts) {
49
- if (!post.retired && new Date(post.postedAt).getTime() < cutoff) {
50
- post.retired = true;
51
- changed = true;
52
- }
53
- }
54
- const pruneCutoff = Date.now() - 30 * 24 * 60 * 60 * 1e3;
55
- const before = data.trackedPosts.length;
56
- data.trackedPosts = data.trackedPosts.filter(
57
- (p) => !p.retired || new Date(p.postedAt).getTime() > pruneCutoff
58
- );
59
- if (data.trackedPosts.length !== before) changed = true;
60
- if (changed) savePerformance(data);
61
- }
62
- function updateSelfMetrics(metric) {
63
- const data = loadPerformance();
64
- data.selfMetrics.push(metric);
65
- if (data.selfMetrics.length > 100) {
66
- data.selfMetrics = data.selfMetrics.slice(-100);
67
- }
68
- savePerformance(data);
69
- }
70
- function getPerformanceSummary() {
71
- const data = loadPerformance();
72
- const lines = [];
73
- const oneDayAgo = Date.now() - 24 * 60 * 60 * 1e3;
74
- const recentPosts = data.trackedPosts.filter(
75
- (p) => new Date(p.postedAt).getTime() > oneDayAgo
76
- );
77
- if (recentPosts.length > 0) {
78
- const postStats = recentPosts.map((p) => {
79
- const latest = p.metrics.length > 0 ? p.metrics[p.metrics.length - 1] : null;
80
- return {
81
- content: p.content,
82
- type: p.type,
83
- likes: latest?.likes ?? 0,
84
- retweets: latest?.retweets ?? 0,
85
- replies: latest?.replies ?? 0
86
- };
87
- });
88
- const totalLikes = postStats.reduce((s, p) => s + p.likes, 0);
89
- const totalRTs = postStats.reduce((s, p) => s + p.retweets, 0);
90
- const avgLikes = Math.round(totalLikes / postStats.length);
91
- lines.push(`- Last 24h: ${postStats.length} posts, avg ${avgLikes} likes, ${totalRTs} total retweets`);
92
- const sorted = [...postStats].sort((a, b) => b.likes - a.likes);
93
- if (sorted.length > 0 && sorted[0].likes > 0) {
94
- lines.push(`- Best performing: "${sorted[0].content.slice(0, 60)}..." (${sorted[0].likes} likes, ${sorted[0].retweets} RTs)`);
95
- }
96
- if (sorted.length > 1) {
97
- const worst = sorted[sorted.length - 1];
98
- lines.push(`- Lowest performing: "${worst.content.slice(0, 60)}..." (${worst.likes} likes)`);
99
- }
100
- } else {
101
- lines.push("- No tracked posts in the last 24 hours yet.");
102
- }
103
- if (data.selfMetrics.length > 0) {
104
- const latest = data.selfMetrics[data.selfMetrics.length - 1];
105
- lines.push(`- Followers: ${latest.followers} | Following: ${latest.following} | Total tweets: ${latest.totalTweets}`);
106
- const dayAgoMetric = data.selfMetrics.find(
107
- (m) => Math.abs(new Date(m.checkedAt).getTime() - (Date.now() - 24 * 60 * 60 * 1e3)) < 12 * 60 * 60 * 1e3
108
- );
109
- if (dayAgoMetric) {
110
- const diff = latest.followers - dayAgoMetric.followers;
111
- if (diff !== 0) {
112
- lines.push(`- Follower trend: ${diff > 0 ? "+" : ""}${diff} in the last ~24h`);
113
- }
114
- }
115
- }
116
- return lines.length > 0 ? lines.join("\n") : "";
117
- }
118
-
119
- export {
120
- trackPost,
121
- getActiveTrackedPosts,
122
- updatePostMetrics,
123
- retireOldPosts,
124
- updateSelfMetrics,
125
- getPerformanceSummary
126
- };
127
- //# sourceMappingURL=chunk-FCAK5FYQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory/performance.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { paths } from \"../utils/paths.js\";\n\nexport interface EngagementMetric {\n checkedAt: string;\n likes: number;\n retweets: number;\n replies: number;\n}\n\nexport interface TrackedPost {\n tweetId: string;\n content: string;\n type: \"post\" | \"reply\";\n postedAt: string;\n metrics: EngagementMetric[];\n retired: boolean;\n}\n\nexport interface SelfMetric {\n checkedAt: string;\n followers: number;\n following: number;\n totalTweets: number;\n}\n\nexport interface PerformanceData {\n trackedPosts: TrackedPost[];\n selfMetrics: SelfMetric[];\n}\n\nfunction loadPerformance(): PerformanceData {\n if (!existsSync(paths.performance)) {\n return { trackedPosts: [], selfMetrics: [] };\n }\n try {\n return JSON.parse(readFileSync(paths.performance, \"utf-8\"));\n } catch {\n return { trackedPosts: [], selfMetrics: [] };\n }\n}\n\nfunction savePerformance(data: PerformanceData): void {\n writeFileSync(paths.performance, JSON.stringify(data, null, 2));\n}\n\nexport function trackPost(tweetId: string, content: string, type: \"post\" | \"reply\"): void {\n const data = loadPerformance();\n // Don't double-track\n if (data.trackedPosts.some(p => p.tweetId === tweetId)) return;\n data.trackedPosts.push({\n tweetId,\n content,\n type,\n postedAt: new Date().toISOString(),\n metrics: [],\n retired: false,\n });\n savePerformance(data);\n}\n\nexport function getActiveTrackedPosts(): TrackedPost[] {\n const data = loadPerformance();\n return data.trackedPosts.filter(p => !p.retired);\n}\n\nexport function updatePostMetrics(tweetId: string, metric: EngagementMetric): void {\n const data = loadPerformance();\n const post = data.trackedPosts.find(p => p.tweetId === tweetId);\n if (!post) return;\n post.metrics.push(metric);\n savePerformance(data);\n}\n\nexport function retireOldPosts(): void {\n const data = loadPerformance();\n const cutoff = Date.now() - 72 * 60 * 60 * 1000; // 72 hours\n let changed = false;\n for (const post of data.trackedPosts) {\n if (!post.retired && new Date(post.postedAt).getTime() < cutoff) {\n post.retired = true;\n changed = true;\n }\n }\n // Also prune very old retired posts (older than 30 days) to prevent file bloat\n const pruneCutoff = Date.now() - 30 * 24 * 60 * 60 * 1000;\n const before = data.trackedPosts.length;\n data.trackedPosts = data.trackedPosts.filter(\n p => !p.retired || new Date(p.postedAt).getTime() > pruneCutoff\n );\n if (data.trackedPosts.length !== before) changed = true;\n if (changed) savePerformance(data);\n}\n\nexport function updateSelfMetrics(metric: SelfMetric): void {\n const data = loadPerformance();\n data.selfMetrics.push(metric);\n // Keep only last 100 snapshots\n if (data.selfMetrics.length > 100) {\n data.selfMetrics = data.selfMetrics.slice(-100);\n }\n savePerformance(data);\n}\n\nexport function getPerformanceSummary(): string {\n const data = loadPerformance();\n const lines: string[] = [];\n\n // Post performance (last 24h)\n const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;\n const recentPosts = data.trackedPosts.filter(\n p => new Date(p.postedAt).getTime() > oneDayAgo\n );\n\n if (recentPosts.length > 0) {\n // Get latest metrics for each post\n const postStats = recentPosts.map(p => {\n const latest = p.metrics.length > 0 ? p.metrics[p.metrics.length - 1] : null;\n return {\n content: p.content,\n type: p.type,\n likes: latest?.likes ?? 0,\n retweets: latest?.retweets ?? 0,\n replies: latest?.replies ?? 0,\n };\n });\n\n const totalLikes = postStats.reduce((s, p) => s + p.likes, 0);\n const totalRTs = postStats.reduce((s, p) => s + p.retweets, 0);\n const avgLikes = Math.round(totalLikes / postStats.length);\n\n lines.push(`- Last 24h: ${postStats.length} posts, avg ${avgLikes} likes, ${totalRTs} total retweets`);\n\n // Best and worst performing\n const sorted = [...postStats].sort((a, b) => b.likes - a.likes);\n if (sorted.length > 0 && sorted[0].likes > 0) {\n lines.push(`- Best performing: \"${sorted[0].content.slice(0, 60)}...\" (${sorted[0].likes} likes, ${sorted[0].retweets} RTs)`);\n }\n if (sorted.length > 1) {\n const worst = sorted[sorted.length - 1];\n lines.push(`- Lowest performing: \"${worst.content.slice(0, 60)}...\" (${worst.likes} likes)`);\n }\n } else {\n lines.push(\"- No tracked posts in the last 24 hours yet.\");\n }\n\n // Self metrics\n if (data.selfMetrics.length > 0) {\n const latest = data.selfMetrics[data.selfMetrics.length - 1];\n lines.push(`- Followers: ${latest.followers} | Following: ${latest.following} | Total tweets: ${latest.totalTweets}`);\n\n // Trend: compare to 24h ago\n const dayAgoMetric = data.selfMetrics.find(m =>\n Math.abs(new Date(m.checkedAt).getTime() - (Date.now() - 24 * 60 * 60 * 1000)) < 12 * 60 * 60 * 1000\n );\n if (dayAgoMetric) {\n const diff = latest.followers - dayAgoMetric.followers;\n if (diff !== 0) {\n lines.push(`- Follower trend: ${diff > 0 ? \"+\" : \"\"}${diff} in the last ~24h`);\n }\n }\n }\n\n return lines.length > 0 ? lines.join(\"\\n\") : \"\";\n}\n"],"mappings":"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","names":[]}