talon-agent 1.0.0 → 1.2.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 (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/package.json +15 -11
  4. package/prompts/dream.md +7 -3
  5. package/prompts/heartbeat.md +30 -0
  6. package/prompts/identity.md +1 -0
  7. package/prompts/teams.md +3 -0
  8. package/prompts/telegram.md +1 -0
  9. package/src/__tests__/chat-settings.test.ts +108 -2
  10. package/src/__tests__/cleanup-registry.test.ts +58 -0
  11. package/src/__tests__/config.test.ts +118 -52
  12. package/src/__tests__/cron-store-extended.test.ts +661 -0
  13. package/src/__tests__/cron-store.test.ts +145 -11
  14. package/src/__tests__/daily-log.test.ts +224 -13
  15. package/src/__tests__/dispatcher.test.ts +424 -23
  16. package/src/__tests__/dream.test.ts +1028 -0
  17. package/src/__tests__/errors-extended.test.ts +428 -0
  18. package/src/__tests__/errors.test.ts +95 -3
  19. package/src/__tests__/fuzz.test.ts +87 -15
  20. package/src/__tests__/gateway-actions.test.ts +1174 -433
  21. package/src/__tests__/gateway-http.test.ts +210 -19
  22. package/src/__tests__/gateway-retry.test.ts +359 -0
  23. package/src/__tests__/gateway-withRetry-extended.test.ts +343 -0
  24. package/src/__tests__/graph.test.ts +830 -0
  25. package/src/__tests__/handlers-stream.test.ts +208 -0
  26. package/src/__tests__/handlers.test.ts +2539 -70
  27. package/src/__tests__/heartbeat.test.ts +364 -0
  28. package/src/__tests__/history-extended.test.ts +775 -0
  29. package/src/__tests__/history-persistence.test.ts +74 -19
  30. package/src/__tests__/history.test.ts +113 -79
  31. package/src/__tests__/integration.test.ts +43 -8
  32. package/src/__tests__/log-init.test.ts +129 -0
  33. package/src/__tests__/log.test.ts +23 -5
  34. package/src/__tests__/media-index.test.ts +317 -35
  35. package/src/__tests__/plugin.test.ts +314 -0
  36. package/src/__tests__/prompt-builder-extended.test.ts +296 -0
  37. package/src/__tests__/prompt-builder.test.ts +44 -9
  38. package/src/__tests__/sessions.test.ts +258 -4
  39. package/src/__tests__/storage-save-errors.test.ts +342 -0
  40. package/src/__tests__/teams-frontend.test.ts +526 -31
  41. package/src/__tests__/telegram-formatting.test.ts +82 -0
  42. package/src/__tests__/terminal-commands.test.ts +208 -1
  43. package/src/__tests__/terminal-renderer.test.ts +223 -0
  44. package/src/__tests__/time.test.ts +107 -0
  45. package/src/__tests__/workspace-migrate.test.ts +256 -0
  46. package/src/__tests__/workspace.test.ts +63 -1
  47. package/src/backend/claude-sdk/tools.ts +64 -18
  48. package/src/bootstrap.ts +14 -14
  49. package/src/cli.ts +440 -125
  50. package/src/core/cron.ts +20 -5
  51. package/src/core/dispatcher.ts +27 -9
  52. package/src/core/dream.ts +79 -24
  53. package/src/core/errors.ts +12 -2
  54. package/src/core/gateway-actions.ts +182 -46
  55. package/src/core/gateway.ts +93 -41
  56. package/src/core/heartbeat.ts +515 -0
  57. package/src/core/plugin.ts +1 -1
  58. package/src/core/prompt-builder.ts +1 -4
  59. package/src/core/pulse.ts +4 -3
  60. package/src/frontend/teams/actions.ts +3 -1
  61. package/src/frontend/teams/formatting.ts +47 -8
  62. package/src/frontend/teams/graph.ts +35 -11
  63. package/src/frontend/teams/index.ts +155 -57
  64. package/src/frontend/teams/tools.ts +4 -6
  65. package/src/frontend/telegram/actions.ts +358 -82
  66. package/src/frontend/telegram/admin.ts +162 -72
  67. package/src/frontend/telegram/callbacks.ts +16 -10
  68. package/src/frontend/telegram/commands.ts +37 -21
  69. package/src/frontend/telegram/formatting.ts +2 -4
  70. package/src/frontend/telegram/handlers.ts +262 -66
  71. package/src/frontend/telegram/index.ts +39 -14
  72. package/src/frontend/telegram/middleware.ts +14 -4
  73. package/src/frontend/telegram/userbot.ts +16 -4
  74. package/src/frontend/terminal/renderer.ts +1 -4
  75. package/src/index.ts +28 -4
  76. package/src/storage/chat-settings.ts +32 -9
  77. package/src/storage/cron-store.ts +53 -11
  78. package/src/storage/daily-log.ts +72 -19
  79. package/src/storage/history.ts +39 -21
  80. package/src/storage/media-index.ts +37 -12
  81. package/src/storage/sessions.ts +3 -2
  82. package/src/util/cleanup-registry.ts +34 -0
  83. package/src/util/config.ts +85 -23
  84. package/src/util/log.ts +47 -17
  85. package/src/util/paths.ts +10 -0
  86. package/src/util/time.ts +29 -6
  87. package/src/util/watchdog.ts +5 -1
  88. package/src/util/workspace.ts +51 -10
@@ -4,7 +4,19 @@
4
4
  * Includes periodic cleanup of old uploads to prevent disk exhaustion.
5
5
  */
6
6
 
7
- import { existsSync, mkdirSync, readdirSync, rmdirSync, renameSync, statSync, unlinkSync, copyFileSync, cpSync, rmSync, writeFileSync } from "node:fs";
7
+ import {
8
+ existsSync,
9
+ mkdirSync,
10
+ readdirSync,
11
+ rmdirSync,
12
+ renameSync,
13
+ statSync,
14
+ unlinkSync,
15
+ copyFileSync,
16
+ cpSync,
17
+ rmSync,
18
+ writeFileSync,
19
+ } from "node:fs";
8
20
  import { join, resolve } from "node:path";
9
21
  import { log } from "./log.js";
10
22
  import { dirs, files as pathFiles } from "./paths.js";
@@ -41,7 +53,10 @@ export function migrateLayout(): void {
41
53
  [join(oldRoot, "talon.json"), dirs.root + "/config.json"],
42
54
  [join(oldRoot, "sessions.json"), join(dirs.data, "sessions.json")],
43
55
  [join(oldRoot, "history.json"), join(dirs.data, "history.json")],
44
- [join(oldRoot, "chat-settings.json"), join(dirs.data, "chat-settings.json")],
56
+ [
57
+ join(oldRoot, "chat-settings.json"),
58
+ join(dirs.data, "chat-settings.json"),
59
+ ],
45
60
  [join(oldRoot, "cron.json"), join(dirs.data, "cron.json")],
46
61
  [join(oldRoot, "media-index.json"), join(dirs.data, "media-index.json")],
47
62
  [join(oldRoot, "talon.log"), join(dirs.root, "talon.log")],
@@ -92,9 +107,14 @@ export function migrateLayout(): void {
92
107
  rmdirSync(oldRoot);
93
108
  log("workspace", "Removed empty workspace/ directory");
94
109
  } else {
95
- log("workspace", `Old workspace/ still has ${remaining.length} item(s) — not removed`);
110
+ log(
111
+ "workspace",
112
+ `Old workspace/ still has ${remaining.length} item(s) — not removed`,
113
+ );
96
114
  }
97
- } catch { /* ignore */ }
115
+ } catch {
116
+ /* ignore */
117
+ }
98
118
 
99
119
  log("workspace", "Migration complete");
100
120
  }
@@ -112,7 +132,15 @@ export function initWorkspace(root: string): void {
112
132
  if (!existsSync(root)) mkdirSync(root, { recursive: true });
113
133
 
114
134
  // Ensure subdirectories exist
115
- for (const sub of [dirs.memory, dirs.uploads, dirs.logs, dirs.stickers, dirs.prompts, dirs.traces]) {
135
+ for (const sub of [
136
+ dirs.memory,
137
+ dirs.dailyMemory,
138
+ dirs.uploads,
139
+ dirs.logs,
140
+ dirs.stickers,
141
+ dirs.prompts,
142
+ dirs.traces,
143
+ ]) {
116
144
  if (!existsSync(sub)) mkdirSync(sub, { recursive: true });
117
145
  }
118
146
 
@@ -145,10 +173,16 @@ export function getWorkspaceDiskUsage(root: string): number {
145
173
  const full = join(dir, entry.name);
146
174
  if (entry.isDirectory()) walk(full);
147
175
  else if (entry.isFile()) {
148
- try { total += statSync(full).size; } catch { /* skip */ }
176
+ try {
177
+ total += statSync(full).size;
178
+ } catch {
179
+ /* skip */
180
+ }
149
181
  }
150
182
  }
151
- } catch { /* skip */ }
183
+ } catch {
184
+ /* skip */
185
+ }
152
186
  }
153
187
  walk(root);
154
188
  return total;
@@ -164,7 +198,10 @@ let cleanupTimer: ReturnType<typeof setInterval> | null = null;
164
198
  * Delete files in uploads/ older than maxAgeMs.
165
199
  * Returns number of files deleted.
166
200
  */
167
- export function cleanupUploads(root: string, maxAgeMs = DEFAULT_MAX_AGE_MS): number {
201
+ export function cleanupUploads(
202
+ root: string,
203
+ maxAgeMs = DEFAULT_MAX_AGE_MS,
204
+ ): number {
168
205
  const uploadsDir = join(root, "uploads");
169
206
  if (!existsSync(uploadsDir)) return 0;
170
207
 
@@ -181,9 +218,13 @@ export function cleanupUploads(root: string, maxAgeMs = DEFAULT_MAX_AGE_MS): num
181
218
  unlinkSync(filePath);
182
219
  deleted++;
183
220
  }
184
- } catch { /* skip individual file errors */ }
221
+ } catch {
222
+ /* skip individual file errors */
223
+ }
185
224
  }
186
- } catch { /* skip if directory unreadable */ }
225
+ } catch {
226
+ /* skip if directory unreadable */
227
+ }
187
228
 
188
229
  if (deleted > 0) {
189
230
  log("workspace", `Cleaned up ${deleted} old upload(s)`);