@bryti/agent 0.0.1 → 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 (228) hide show
  1. package/Dockerfile +27 -0
  2. package/README.md +77 -50
  3. package/config.example.yml +265 -0
  4. package/dist/active-hours.d.ts +23 -0
  5. package/dist/active-hours.d.ts.map +1 -0
  6. package/dist/active-hours.js +68 -0
  7. package/dist/active-hours.js.map +1 -0
  8. package/dist/agent.d.ts +84 -0
  9. package/dist/agent.d.ts.map +1 -0
  10. package/dist/agent.js +383 -0
  11. package/dist/agent.js.map +1 -0
  12. package/dist/channels/markdown/ir.d.ts +79 -0
  13. package/dist/channels/markdown/ir.d.ts.map +1 -0
  14. package/dist/channels/markdown/ir.js +824 -0
  15. package/dist/channels/markdown/ir.js.map +1 -0
  16. package/dist/channels/markdown/render.d.ts +35 -0
  17. package/dist/channels/markdown/render.d.ts.map +1 -0
  18. package/dist/channels/markdown/render.js +178 -0
  19. package/dist/channels/markdown/render.js.map +1 -0
  20. package/dist/channels/telegram-network-errors.d.ts +27 -0
  21. package/dist/channels/telegram-network-errors.d.ts.map +1 -0
  22. package/dist/channels/telegram-network-errors.js +156 -0
  23. package/dist/channels/telegram-network-errors.js.map +1 -0
  24. package/dist/channels/telegram.d.ts +76 -0
  25. package/dist/channels/telegram.d.ts.map +1 -0
  26. package/dist/channels/telegram.js +814 -0
  27. package/dist/channels/telegram.js.map +1 -0
  28. package/dist/channels/types.d.ts +59 -0
  29. package/dist/channels/types.d.ts.map +1 -0
  30. package/dist/channels/types.js +9 -0
  31. package/dist/channels/types.js.map +1 -0
  32. package/dist/channels/whatsapp.d.ts +45 -0
  33. package/dist/channels/whatsapp.d.ts.map +1 -0
  34. package/dist/channels/whatsapp.js +310 -0
  35. package/dist/channels/whatsapp.js.map +1 -0
  36. package/dist/cli.d.ts +13 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +635 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/commands.d.ts +35 -0
  41. package/dist/commands.d.ts.map +1 -0
  42. package/dist/commands.js +113 -0
  43. package/dist/commands.js.map +1 -0
  44. package/dist/compaction/history.d.ts +17 -0
  45. package/dist/compaction/history.d.ts.map +1 -0
  46. package/dist/compaction/history.js +35 -0
  47. package/dist/compaction/history.js.map +1 -0
  48. package/dist/compaction/index.d.ts +3 -0
  49. package/dist/compaction/index.d.ts.map +1 -0
  50. package/dist/compaction/index.js +3 -0
  51. package/dist/compaction/index.js.map +1 -0
  52. package/dist/compaction/proactive.d.ts +25 -0
  53. package/dist/compaction/proactive.d.ts.map +1 -0
  54. package/dist/compaction/proactive.js +87 -0
  55. package/dist/compaction/proactive.js.map +1 -0
  56. package/dist/compaction/transcript-repair.d.ts +55 -0
  57. package/dist/compaction/transcript-repair.d.ts.map +1 -0
  58. package/dist/compaction/transcript-repair.js +215 -0
  59. package/dist/compaction/transcript-repair.js.map +1 -0
  60. package/dist/config.d.ts +128 -0
  61. package/dist/config.d.ts.map +1 -0
  62. package/dist/config.js +317 -0
  63. package/dist/config.js.map +1 -0
  64. package/dist/crash-recovery.d.ts +23 -0
  65. package/dist/crash-recovery.d.ts.map +1 -0
  66. package/dist/crash-recovery.js +96 -0
  67. package/dist/crash-recovery.js.map +1 -0
  68. package/dist/defaults/extensions/EXTENSIONS.md +158 -0
  69. package/dist/defaults/extensions/documents-hedgedoc.ts +153 -0
  70. package/dist/history.d.ts +31 -0
  71. package/dist/history.d.ts.map +1 -0
  72. package/dist/history.js +49 -0
  73. package/dist/history.js.map +1 -0
  74. package/dist/index.d.ts +19 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +673 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/logger.d.ts +39 -0
  79. package/dist/logger.d.ts.map +1 -0
  80. package/dist/logger.js +143 -0
  81. package/dist/logger.js.map +1 -0
  82. package/dist/memory/conversation-search.d.ts +15 -0
  83. package/dist/memory/conversation-search.d.ts.map +1 -0
  84. package/dist/memory/conversation-search.js +60 -0
  85. package/dist/memory/conversation-search.js.map +1 -0
  86. package/dist/memory/core-memory.d.ts +28 -0
  87. package/dist/memory/core-memory.d.ts.map +1 -0
  88. package/dist/memory/core-memory.js +102 -0
  89. package/dist/memory/core-memory.js.map +1 -0
  90. package/dist/memory/embeddings.d.ts +44 -0
  91. package/dist/memory/embeddings.d.ts.map +1 -0
  92. package/dist/memory/embeddings.js +139 -0
  93. package/dist/memory/embeddings.js.map +1 -0
  94. package/dist/memory/search.d.ts +49 -0
  95. package/dist/memory/search.d.ts.map +1 -0
  96. package/dist/memory/search.js +97 -0
  97. package/dist/memory/search.js.map +1 -0
  98. package/dist/memory/store.d.ts +32 -0
  99. package/dist/memory/store.d.ts.map +1 -0
  100. package/dist/memory/store.js +205 -0
  101. package/dist/memory/store.js.map +1 -0
  102. package/dist/message-queue.d.ts +73 -0
  103. package/dist/message-queue.d.ts.map +1 -0
  104. package/dist/message-queue.js +188 -0
  105. package/dist/message-queue.js.map +1 -0
  106. package/dist/model-infra.d.ts +64 -0
  107. package/dist/model-infra.d.ts.map +1 -0
  108. package/dist/model-infra.js +202 -0
  109. package/dist/model-infra.js.map +1 -0
  110. package/dist/projection/format.d.ts +10 -0
  111. package/dist/projection/format.d.ts.map +1 -0
  112. package/dist/projection/format.js +30 -0
  113. package/dist/projection/format.js.map +1 -0
  114. package/dist/projection/index.d.ts +11 -0
  115. package/dist/projection/index.d.ts.map +1 -0
  116. package/dist/projection/index.js +9 -0
  117. package/dist/projection/index.js.map +1 -0
  118. package/dist/projection/reflection.d.ts +94 -0
  119. package/dist/projection/reflection.d.ts.map +1 -0
  120. package/dist/projection/reflection.js +334 -0
  121. package/dist/projection/reflection.js.map +1 -0
  122. package/dist/projection/store.d.ts +144 -0
  123. package/dist/projection/store.d.ts.map +1 -0
  124. package/dist/projection/store.js +519 -0
  125. package/dist/projection/store.js.map +1 -0
  126. package/dist/projection/tools.d.ts +11 -0
  127. package/dist/projection/tools.d.ts.map +1 -0
  128. package/dist/projection/tools.js +237 -0
  129. package/dist/projection/tools.js.map +1 -0
  130. package/dist/scheduler.d.ts +36 -0
  131. package/dist/scheduler.d.ts.map +1 -0
  132. package/dist/scheduler.js +286 -0
  133. package/dist/scheduler.js.map +1 -0
  134. package/dist/system-prompt.d.ts +41 -0
  135. package/dist/system-prompt.d.ts.map +1 -0
  136. package/dist/system-prompt.js +162 -0
  137. package/dist/system-prompt.js.map +1 -0
  138. package/dist/time.d.ts +52 -0
  139. package/dist/time.d.ts.map +1 -0
  140. package/dist/time.js +138 -0
  141. package/dist/time.js.map +1 -0
  142. package/dist/tools/archival-memory-tool.d.ts +8 -0
  143. package/dist/tools/archival-memory-tool.d.ts.map +1 -0
  144. package/dist/tools/archival-memory-tool.js +68 -0
  145. package/dist/tools/archival-memory-tool.js.map +1 -0
  146. package/dist/tools/conversation-search-tool.d.ts +6 -0
  147. package/dist/tools/conversation-search-tool.d.ts.map +1 -0
  148. package/dist/tools/conversation-search-tool.js +28 -0
  149. package/dist/tools/conversation-search-tool.js.map +1 -0
  150. package/dist/tools/core-memory-tool.d.ts +7 -0
  151. package/dist/tools/core-memory-tool.d.ts.map +1 -0
  152. package/dist/tools/core-memory-tool.js +59 -0
  153. package/dist/tools/core-memory-tool.js.map +1 -0
  154. package/dist/tools/fetch-url.d.ts +15 -0
  155. package/dist/tools/fetch-url.d.ts.map +1 -0
  156. package/dist/tools/fetch-url.js +76 -0
  157. package/dist/tools/fetch-url.js.map +1 -0
  158. package/dist/tools/files.d.ts +10 -0
  159. package/dist/tools/files.d.ts.map +1 -0
  160. package/dist/tools/files.js +127 -0
  161. package/dist/tools/files.js.map +1 -0
  162. package/dist/tools/index.d.ts +17 -0
  163. package/dist/tools/index.d.ts.map +1 -0
  164. package/dist/tools/index.js +118 -0
  165. package/dist/tools/index.js.map +1 -0
  166. package/dist/tools/result.d.ts +21 -0
  167. package/dist/tools/result.d.ts.map +1 -0
  168. package/dist/tools/result.js +36 -0
  169. package/dist/tools/result.js.map +1 -0
  170. package/dist/tools/skill-install.d.ts +17 -0
  171. package/dist/tools/skill-install.d.ts.map +1 -0
  172. package/dist/tools/skill-install.js +148 -0
  173. package/dist/tools/skill-install.js.map +1 -0
  174. package/dist/tools/web-search.d.ts +42 -0
  175. package/dist/tools/web-search.d.ts.map +1 -0
  176. package/dist/tools/web-search.js +237 -0
  177. package/dist/tools/web-search.js.map +1 -0
  178. package/dist/trust/guardrail.d.ts +60 -0
  179. package/dist/trust/guardrail.d.ts.map +1 -0
  180. package/dist/trust/guardrail.js +171 -0
  181. package/dist/trust/guardrail.js.map +1 -0
  182. package/dist/trust/index.d.ts +12 -0
  183. package/dist/trust/index.d.ts.map +1 -0
  184. package/dist/trust/index.js +12 -0
  185. package/dist/trust/index.js.map +1 -0
  186. package/dist/trust/store.d.ts +118 -0
  187. package/dist/trust/store.d.ts.map +1 -0
  188. package/dist/trust/store.js +209 -0
  189. package/dist/trust/store.js.map +1 -0
  190. package/dist/trust/wrapper.d.ts +36 -0
  191. package/dist/trust/wrapper.d.ts.map +1 -0
  192. package/dist/trust/wrapper.js +142 -0
  193. package/dist/trust/wrapper.js.map +1 -0
  194. package/dist/usage.d.ts +53 -0
  195. package/dist/usage.d.ts.map +1 -0
  196. package/dist/usage.js +124 -0
  197. package/dist/usage.js.map +1 -0
  198. package/dist/util/math.d.ts +9 -0
  199. package/dist/util/math.d.ts.map +1 -0
  200. package/dist/util/math.js +22 -0
  201. package/dist/util/math.js.map +1 -0
  202. package/dist/util/ssrf.d.ts +21 -0
  203. package/dist/util/ssrf.d.ts.map +1 -0
  204. package/dist/util/ssrf.js +77 -0
  205. package/dist/util/ssrf.js.map +1 -0
  206. package/dist/workers/index.d.ts +8 -0
  207. package/dist/workers/index.d.ts.map +1 -0
  208. package/dist/workers/index.js +7 -0
  209. package/dist/workers/index.js.map +1 -0
  210. package/dist/workers/registry.d.ts +53 -0
  211. package/dist/workers/registry.d.ts.map +1 -0
  212. package/dist/workers/registry.js +38 -0
  213. package/dist/workers/registry.js.map +1 -0
  214. package/dist/workers/scoped-tools.d.ts +21 -0
  215. package/dist/workers/scoped-tools.d.ts.map +1 -0
  216. package/dist/workers/scoped-tools.js +111 -0
  217. package/dist/workers/scoped-tools.js.map +1 -0
  218. package/dist/workers/spawn.d.ts +62 -0
  219. package/dist/workers/spawn.d.ts.map +1 -0
  220. package/dist/workers/spawn.js +314 -0
  221. package/dist/workers/spawn.js.map +1 -0
  222. package/dist/workers/tools.d.ts +26 -0
  223. package/dist/workers/tools.d.ts.map +1 -0
  224. package/dist/workers/tools.js +380 -0
  225. package/dist/workers/tools.js.map +1 -0
  226. package/docker-compose.yml +72 -0
  227. package/package.json +16 -1
  228. package/run.sh +27 -0
package/dist/cli.js ADDED
@@ -0,0 +1,635 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bryti management CLI. Single entry point for all operator tasks.
4
+ * Run via: bryti <command> [options]
5
+ *
6
+ * The CLI bypasses the running application entirely and reads/writes SQLite
7
+ * directly. This is safe to do while the bot is running because SQLite WAL
8
+ * mode allows concurrent readers alongside a live writer without blocking.
9
+ *
10
+ * See `npm run cli -- help` for full command listing.
11
+ */
12
+ import fs from "node:fs";
13
+ import path from "node:path";
14
+ import crypto from "node:crypto";
15
+ import Database from "better-sqlite3";
16
+ import { loadConfig } from "./config.js";
17
+ import { runReflection } from "./projection/index.js";
18
+ // ---------------------------------------------------------------------------
19
+ // Arg parsing helpers
20
+ // ---------------------------------------------------------------------------
21
+ const argv = process.argv.slice(2);
22
+ function flag(name) {
23
+ return argv.includes(name);
24
+ }
25
+ function opt(name, fallback) {
26
+ const idx = argv.indexOf(name);
27
+ return idx !== -1 ? argv[idx + 1] : fallback;
28
+ }
29
+ function positional(afterFlags) {
30
+ // Return the Nth non-flag argument
31
+ const nonFlags = argv.filter((a) => !a.startsWith("--"));
32
+ return nonFlags[afterFlags];
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Config / environment
36
+ // ---------------------------------------------------------------------------
37
+ function resolveDataDir() {
38
+ return opt("--data-dir") ?? process.env.BRYTI_DATA_DIR ?? "./data";
39
+ }
40
+ function resolveUserId(dataDir) {
41
+ if (opt("--user-id"))
42
+ return opt("--user-id");
43
+ if (process.env.BRYTI_USER_ID)
44
+ return process.env.BRYTI_USER_ID;
45
+ // Try to read from config
46
+ try {
47
+ const config = loadConfig(path.join(dataDir, "config.yml"));
48
+ const first = config.telegram.allowed_users[0];
49
+ if (first)
50
+ return String(first);
51
+ }
52
+ catch {
53
+ // Config may not exist in dev environments
54
+ }
55
+ return "default-user";
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Display helpers
59
+ // ---------------------------------------------------------------------------
60
+ function hr(char = "─", width = 60) {
61
+ return char.repeat(width);
62
+ }
63
+ function section(title) {
64
+ console.log("\n" + hr());
65
+ console.log(` ${title}`);
66
+ console.log(hr());
67
+ }
68
+ function truncate(text, max = 200) {
69
+ return text.length > max ? text.slice(0, max) + "…" : text;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Command: memory core
73
+ // ---------------------------------------------------------------------------
74
+ function cmdMemoryCore(dataDir) {
75
+ section("CORE MEMORY");
76
+ const corePath = path.join(dataDir, "core-memory.md");
77
+ if (!fs.existsSync(corePath)) {
78
+ console.log(" (no core-memory.md)");
79
+ return;
80
+ }
81
+ const content = fs.readFileSync(corePath, "utf-8").trim();
82
+ console.log(content || " (empty)");
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Command: memory projections
86
+ // ---------------------------------------------------------------------------
87
+ function cmdMemoryProjections(dataDir, userId, showAll) {
88
+ section("PROJECTIONS");
89
+ const dbPath = path.join(dataDir, "users", userId, "memory.db");
90
+ if (!fs.existsSync(dbPath)) {
91
+ console.log(" (no memory.db)");
92
+ return;
93
+ }
94
+ const db = new Database(dbPath, { readonly: true });
95
+ const where = showAll ? "" : "WHERE status = 'pending'";
96
+ const rows = db.prepare(`SELECT id, summary, raw_when, resolved_when, resolution, context, status, created_at
97
+ FROM projections ${where}
98
+ ORDER BY
99
+ CASE status WHEN 'pending' THEN 0 ELSE 1 END,
100
+ CASE WHEN resolved_when IS NULL THEN 1 ELSE 0 END,
101
+ resolved_when ASC`).all();
102
+ db.close();
103
+ if (rows.length === 0) {
104
+ console.log(" (no projections)");
105
+ return;
106
+ }
107
+ const statusIcon = {
108
+ pending: "⏳",
109
+ done: "✅",
110
+ cancelled: "❌",
111
+ passed: "🔕",
112
+ };
113
+ for (const row of rows) {
114
+ const icon = statusIcon[row.status] ?? "?";
115
+ const when = row.resolved_when ?? row.raw_when ?? "someday";
116
+ console.log(`\n${icon} ${row.summary}`);
117
+ console.log(` when: ${when} [${row.resolution}]`);
118
+ if (row.context) {
119
+ console.log(` context: ${truncate(row.context, 120)}`);
120
+ }
121
+ console.log(` id: ${row.id}`);
122
+ console.log(` created: ${row.created_at}`);
123
+ }
124
+ const pending = rows.filter((r) => r.status === "pending").length;
125
+ console.log(`\n ${pending} pending, ${rows.length} total`);
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Command: memory archival
129
+ // ---------------------------------------------------------------------------
130
+ function cmdMemoryArchival(dataDir, userId, query, limit) {
131
+ section(query ? `ARCHIVAL MEMORY — search: "${query}"` : "ARCHIVAL MEMORY (recent)");
132
+ const dbPath = path.join(dataDir, "users", userId, "memory.db");
133
+ if (!fs.existsSync(dbPath)) {
134
+ console.log(" (no memory.db)");
135
+ return;
136
+ }
137
+ const db = new Database(dbPath, { readonly: true });
138
+ let rows;
139
+ if (query) {
140
+ try {
141
+ rows = db.prepare(`SELECT f.id, f.content, f.source, f.timestamp
142
+ FROM facts f
143
+ JOIN facts_fts fts ON f.rowid = fts.rowid
144
+ WHERE facts_fts MATCH ?
145
+ ORDER BY rank
146
+ LIMIT ?`).all(query, limit);
147
+ }
148
+ catch {
149
+ rows = db.prepare(`SELECT id, content, source, timestamp FROM facts
150
+ WHERE content LIKE ? ORDER BY timestamp DESC LIMIT ?`).all(`%${query}%`, limit);
151
+ }
152
+ }
153
+ else {
154
+ rows = db.prepare(`SELECT id, content, source, timestamp FROM facts ORDER BY timestamp DESC LIMIT ?`).all(limit);
155
+ }
156
+ db.close();
157
+ if (rows.length === 0) {
158
+ console.log(" (no results)");
159
+ return;
160
+ }
161
+ for (const row of rows) {
162
+ const date = new Date(Number(row.timestamp)).toISOString().slice(0, 10);
163
+ console.log(`\n[${date}] ${row.source}`);
164
+ console.log(truncate(String(row.content), 300));
165
+ console.log(` id: ${row.id}`);
166
+ }
167
+ console.log(`\n ${rows.length} result(s)`);
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // Command: reflect
171
+ // ---------------------------------------------------------------------------
172
+ async function cmdReflect(dataDir, userId, windowMinutes) {
173
+ console.log(`Running reflection pass (window: ${windowMinutes} min, user: ${userId})...`);
174
+ let config;
175
+ try {
176
+ config = loadConfig(path.join(dataDir, "config.yml"));
177
+ }
178
+ catch (err) {
179
+ console.error(`Failed to load config: ${err.message}`);
180
+ process.exit(1);
181
+ }
182
+ // Override data_dir in case --data-dir was passed
183
+ config.data_dir = dataDir;
184
+ const result = await runReflection(config, userId, windowMinutes);
185
+ if (result.skipped) {
186
+ console.log(`Skipped: ${result.skipReason}`);
187
+ }
188
+ else if (result.projectionsAdded === 0) {
189
+ console.log("No new projections found.");
190
+ }
191
+ else {
192
+ console.log(`Added ${result.projectionsAdded} projection(s):`);
193
+ for (const c of result.candidates) {
194
+ console.log(` + ${c.summary}${c.when ? ` [${c.when}]` : ""}`);
195
+ }
196
+ }
197
+ }
198
+ // ---------------------------------------------------------------------------
199
+ // Command: timeskip
200
+ // ---------------------------------------------------------------------------
201
+ function cmdTimeskipList(dataDir, userId) {
202
+ const dbPath = path.join(dataDir, "users", userId, "memory.db");
203
+ if (!fs.existsSync(dbPath)) {
204
+ console.error(`No memory.db found at ${dbPath}`);
205
+ process.exit(1);
206
+ }
207
+ const db = new Database(dbPath, { readonly: true });
208
+ const rows = db.prepare(`SELECT id, summary, resolved_when, resolution, status
209
+ FROM projections ORDER BY
210
+ CASE status WHEN 'pending' THEN 0 ELSE 1 END,
211
+ resolved_when ASC`).all();
212
+ db.close();
213
+ if (rows.length === 0) {
214
+ console.log("No projections found.");
215
+ return;
216
+ }
217
+ const statusIcon = { pending: "⏳", done: "✅", cancelled: "❌", passed: "🔕" };
218
+ console.log("Projections:\n");
219
+ for (const row of rows) {
220
+ const icon = statusIcon[row.status] ?? "?";
221
+ console.log(`${icon} [${row.resolution}] ${row.summary}`);
222
+ console.log(` id: ${row.id}`);
223
+ console.log(` when: ${row.resolved_when ?? "(someday)"}`);
224
+ console.log("");
225
+ }
226
+ }
227
+ function cmdTimeskip(dataDir, userId, summaryOrId, minutes) {
228
+ const dbPath = path.join(dataDir, "users", userId, "memory.db");
229
+ if (!fs.existsSync(dbPath)) {
230
+ console.error(`No memory.db found at ${dbPath}`);
231
+ process.exit(1);
232
+ }
233
+ const db = new Database(dbPath);
234
+ // Users may reference projections by summary substring (human-friendly) or
235
+ // by full UUID (copy-pasted from 'timeskip --list'). The regex distinguishes
236
+ // them: UUIDs match the standard 8-4-4-4-12 hex pattern, everything else is
237
+ // treated as a summary substring.
238
+ const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(summaryOrId);
239
+ const row = isUuid
240
+ ? db.prepare("SELECT * FROM projections WHERE id = ?").get(summaryOrId)
241
+ : db.prepare("SELECT * FROM projections WHERE summary LIKE ? AND status = 'pending' LIMIT 1")
242
+ .get(`%${summaryOrId}%`);
243
+ if (!row) {
244
+ console.error(`No pending projection found matching: ${summaryOrId}`);
245
+ db.close();
246
+ process.exit(1);
247
+ }
248
+ const newTime = new Date(Date.now() + minutes * 60 * 1000);
249
+ const newTimeStr = newTime.toISOString().slice(0, 16).replace("T", " ");
250
+ db.prepare("UPDATE projections SET resolved_when = ?, resolution = 'exact' WHERE id = ?").run(newTimeStr, row.id);
251
+ db.close();
252
+ console.log(`Timeskipped projection:`);
253
+ console.log(` Summary: ${row.summary}`);
254
+ console.log(` Old when: ${row.resolved_when ?? "(none)"}`);
255
+ console.log(` New when: ${newTimeStr} UTC (fires in ~${minutes} min)`);
256
+ console.log(`\nThe scheduler will pick it up on the next 5-minute tick.`);
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Command: import-openclaw
260
+ // ---------------------------------------------------------------------------
261
+ // One-time migration tool for importing Lars's OpenClaw memory files into
262
+ // bryti's archival memory. Specific to Lars's local setup (/home/lars/clawd).
263
+ // Not a general-purpose import command.
264
+ function cmdImportOpenclaw(dataDir, userId, dryRun) {
265
+ const clawdDir = "/home/lars/clawd";
266
+ console.log(`Importing OpenClaw memory into bryti`);
267
+ console.log(` User ID: ${userId}`);
268
+ console.log(` Data dir: ${dataDir}`);
269
+ console.log(` Dry run: ${dryRun}`);
270
+ console.log("");
271
+ // Core memory
272
+ const userMd = path.join(clawdDir, "USER.md");
273
+ if (!fs.existsSync(userMd)) {
274
+ console.log("[core] USER.md not found, skipping");
275
+ }
276
+ else {
277
+ const corePath = path.join(dataDir, "core-memory.md");
278
+ const existing = fs.existsSync(corePath) ? fs.readFileSync(corePath, "utf-8") : "";
279
+ if (existing.includes("## About Lars")) {
280
+ console.log("[core] Already contains Lars profile, skipping");
281
+ }
282
+ else {
283
+ const userContent = fs.readFileSync(userMd, "utf-8");
284
+ const sectionText = "\n\n## About Lars\n" + userContent.replace(/^# USER\.md.*\n/, "").trim();
285
+ if (dryRun) {
286
+ console.log("[core] DRY RUN — would append to core-memory.md:");
287
+ console.log(sectionText.slice(0, 300) + "...");
288
+ }
289
+ else {
290
+ fs.appendFileSync(corePath, sectionText, "utf-8");
291
+ console.log(`[core] Appended USER.md to core-memory.md (${sectionText.length} chars)`);
292
+ }
293
+ }
294
+ }
295
+ // Archival memory
296
+ const memoryDir = path.join(clawdDir, "memory");
297
+ if (!fs.existsSync(memoryDir)) {
298
+ console.log("[archival] memory/ directory not found, skipping");
299
+ console.log("\nDone.");
300
+ return;
301
+ }
302
+ const files = fs.readdirSync(memoryDir).filter((f) => f.endsWith(".md")).sort();
303
+ console.log(`[archival] Found ${files.length} memory files`);
304
+ if (dryRun) {
305
+ for (const file of files) {
306
+ const content = fs.readFileSync(path.join(memoryDir, file), "utf-8");
307
+ const sections = splitIntoSections(content, file);
308
+ console.log(`[archival] DRY RUN — ${file}: ${sections.length} section(s)`);
309
+ }
310
+ console.log("\nDone (dry run).");
311
+ return;
312
+ }
313
+ const userDir = path.join(dataDir, "users", userId);
314
+ fs.mkdirSync(userDir, { recursive: true });
315
+ const db = new Database(path.join(userDir, "memory.db"));
316
+ db.pragma("journal_mode = WAL");
317
+ db.exec(`
318
+ CREATE TABLE IF NOT EXISTS facts (
319
+ id TEXT PRIMARY KEY, content TEXT NOT NULL, source TEXT NOT NULL,
320
+ timestamp INTEGER NOT NULL, hash TEXT NOT NULL
321
+ );
322
+ CREATE VIRTUAL TABLE IF NOT EXISTS facts_fts USING fts5(content, content='facts', content_rowid='rowid');
323
+ CREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN
324
+ INSERT INTO facts_fts(rowid, content) VALUES (NEW.rowid, NEW.content);
325
+ END;
326
+ `);
327
+ const insertStmt = db.prepare("INSERT OR IGNORE INTO facts (id, content, source, timestamp, hash) VALUES (?, ?, ?, ?, ?)");
328
+ const existsStmt = db.prepare("SELECT hash FROM facts WHERE hash = ?");
329
+ let inserted = 0;
330
+ let skipped = 0;
331
+ for (const file of files) {
332
+ const filePath = path.join(memoryDir, file);
333
+ const content = fs.readFileSync(filePath, "utf-8");
334
+ const sections = splitIntoSections(content, file);
335
+ const timestamp = fs.statSync(filePath).mtimeMs;
336
+ for (const sec of sections) {
337
+ const hash = crypto.createHash("sha256").update(sec).digest("hex").slice(0, 16);
338
+ if (existsStmt.get(hash)) {
339
+ skipped++;
340
+ continue;
341
+ }
342
+ insertStmt.run(crypto.randomUUID(), sec, `openclaw:memory/${file}`, timestamp, hash);
343
+ inserted++;
344
+ }
345
+ console.log(`[archival] ${file}: ${sections.length} section(s)`);
346
+ }
347
+ db.close();
348
+ console.log(`[archival] Done: ${inserted} inserted, ${skipped} skipped`);
349
+ console.log("\nDone. Restart bryti for core memory changes to take effect.");
350
+ }
351
+ /**
352
+ * Split a markdown document into granular facts by ## headings.
353
+ *
354
+ * Each ## section is stored as a separate archival fact so that semantic
355
+ * search can retrieve the relevant section rather than returning the entire
356
+ * document. The date prefix (derived from the filename) is prepended to each
357
+ * section so temporal context is preserved after the split.
358
+ */
359
+ function splitIntoSections(content, filename) {
360
+ const date = path.basename(filename, ".md");
361
+ const parts = content.split(/^## /m);
362
+ const sections = [];
363
+ for (const part of parts) {
364
+ const trimmed = part.trim();
365
+ if (!trimmed || trimmed.length < 50)
366
+ continue;
367
+ sections.push(`[${date}] ## ${trimmed}`);
368
+ }
369
+ if (sections.length === 0 && content.trim().length > 50) {
370
+ sections.push(`[${date}] ${content.trim()}`);
371
+ }
372
+ return sections;
373
+ }
374
+ // ---------------------------------------------------------------------------
375
+ // Command: fill-context
376
+ // ---------------------------------------------------------------------------
377
+ const DEFAULT_DATASET = path.join("/home/lars/xithing/contextpatterns-content/synthetic-agent-conversations", "dataset/memory-context.jsonl");
378
+ /**
379
+ * Inject synthetic conversations into history for compaction testing.
380
+ * Back-dates entries so they look like real history. Prioritises
381
+ * context-window-pressure subcategory conversations.
382
+ *
383
+ * This is a testing/development tool only. It writes synthetic entries with
384
+ * _synthetic: true markers but those entries are otherwise indistinguishable
385
+ * from real history as far as the compaction and reflection passes are
386
+ * concerned. Do not run in production.
387
+ */
388
+ function cmdFillContext(dataDir, count, datasetPath, dryRun) {
389
+ if (!fs.existsSync(datasetPath)) {
390
+ console.error(`Dataset not found: ${datasetPath}`);
391
+ process.exit(1);
392
+ }
393
+ const lines = fs.readFileSync(datasetPath, "utf-8").split("\n").filter(Boolean);
394
+ const all = lines.map((l) => JSON.parse(l));
395
+ // Prefer context-window-pressure, then fall back to all
396
+ const pressure = all.filter((c) => c.subcategory === "context-window-pressure");
397
+ const pool = pressure.length >= count ? pressure : all;
398
+ const selected = pool.slice(0, count);
399
+ // Count total turns we'll inject
400
+ const totalTurns = selected.reduce((n, c) => n + c.turns.filter((t) => t.role === "user" || t.role === "assistant").length, 0);
401
+ console.log(`Injecting ${selected.length} conversation(s), ${totalTurns} turns total`);
402
+ if (dryRun)
403
+ console.log("(dry run — nothing will be written)\n");
404
+ // Back-date entries starting from 2 hours ago, spreading turns across time
405
+ const now = Date.now();
406
+ const startMs = now - 2 * 60 * 60 * 1000;
407
+ const stepMs = Math.floor((2 * 60 * 60 * 1000) / Math.max(totalTurns, 1));
408
+ const historyDir = path.join(dataDir, "history");
409
+ if (!dryRun)
410
+ fs.mkdirSync(historyDir, { recursive: true });
411
+ let turnIdx = 0;
412
+ const byDay = new Map();
413
+ for (const conv of selected) {
414
+ console.log(` [${conv.id}] ${conv.description}`);
415
+ for (const turn of conv.turns) {
416
+ if (turn.role !== "user" && turn.role !== "assistant")
417
+ continue;
418
+ const ts = new Date(startMs + turnIdx * stepMs);
419
+ const day = ts.toISOString().slice(0, 10);
420
+ const entry = JSON.stringify({
421
+ role: turn.role,
422
+ content: turn.content,
423
+ timestamp: ts.toISOString(),
424
+ _synthetic: true,
425
+ });
426
+ if (!byDay.has(day))
427
+ byDay.set(day, []);
428
+ byDay.get(day).push(entry);
429
+ turnIdx++;
430
+ }
431
+ }
432
+ if (!dryRun) {
433
+ for (const [day, entries] of byDay) {
434
+ const filePath = path.join(historyDir, `${day}.jsonl`);
435
+ fs.appendFileSync(filePath, entries.join("\n") + "\n", "utf-8");
436
+ console.log(` Written ${entries.length} entries to history/${day}.jsonl`);
437
+ }
438
+ console.log(`\nDone. Restart bryti to pick up the new history in context.`);
439
+ }
440
+ else {
441
+ for (const [day, entries] of byDay) {
442
+ console.log(` Would write ${entries.length} entries to history/${day}.jsonl`);
443
+ }
444
+ console.log("\nDone (dry run).");
445
+ }
446
+ }
447
+ // ---------------------------------------------------------------------------
448
+ // Command: archive-fact
449
+ // ---------------------------------------------------------------------------
450
+ async function cmdArchiveFact(dataDir, userId, content) {
451
+ console.log(`Archiving fact for user ${userId}...`);
452
+ console.log(`Content: "${content}"\n`);
453
+ // Lazy-import the embedding model and memory store. The embedding model is
454
+ // 300MB+ and takes several seconds to load. Importing at the top of the file
455
+ // would add that startup cost to every CLI command, including fast read-only
456
+ // ones like 'memory' and 'reflect'. Deferring to here keeps the CLI snappy.
457
+ const { embed } = await import("./memory/embeddings.js");
458
+ const { createMemoryStore } = await import("./memory/store.js");
459
+ const { createProjectionStore } = await import("./projection/index.js");
460
+ const modelsDir = path.join(dataDir, ".models");
461
+ const memoryStore = createMemoryStore(userId, dataDir);
462
+ const projStore = createProjectionStore(userId, dataDir);
463
+ try {
464
+ // Embed and store the fact.
465
+ const embedding = await embed(content, modelsDir);
466
+ memoryStore.addFact(content, "cli", embedding);
467
+ console.log("Fact archived.");
468
+ // Check triggers (keyword + embedding fallback).
469
+ const triggered = await projStore.checkTriggers(content, (text) => embed(text, modelsDir));
470
+ if (triggered.length > 0) {
471
+ console.log(`\nTriggered ${triggered.length} projection(s):`);
472
+ for (const p of triggered) {
473
+ console.log(` ✅ ${p.summary} (id: ${p.id})`);
474
+ }
475
+ console.log("\nThese projections are now active (resolution=exact, resolved_when=now).");
476
+ console.log("The scheduler will fire them on the next 5-minute tick.");
477
+ }
478
+ else {
479
+ console.log("\nNo triggers matched.");
480
+ }
481
+ }
482
+ finally {
483
+ memoryStore.close();
484
+ projStore.close();
485
+ }
486
+ }
487
+ // ---------------------------------------------------------------------------
488
+ // Help
489
+ // ---------------------------------------------------------------------------
490
+ function showHelp() {
491
+ console.log(`
492
+ bryti CLI — management commands
493
+
494
+ Usage:
495
+ npm run cli -- <command> [options]
496
+
497
+ Commands:
498
+ help
499
+ Show this help text.
500
+
501
+ memory
502
+ Inspect all memory tiers (core + projections + archival).
503
+
504
+ memory core
505
+ Show the core memory file.
506
+
507
+ memory projections [--all]
508
+ Show pending projections. Pass --all to include resolved ones.
509
+
510
+ memory archival [--query <text>] [--limit <n>]
511
+ Show recent archival facts, or search by keyword.
512
+ Default limit: 20.
513
+
514
+ reflect [--window <minutes>]
515
+ Run the reflection pass on demand. Scans recent conversation history
516
+ for future references the agent may have missed.
517
+ Default window: 30 minutes.
518
+
519
+ timeskip <summary|id> [--minutes <n>]
520
+ Move a projection's resolved_when to now + N minutes so the
521
+ exact-time scheduler fires it on the next 5-minute tick.
522
+ Matches by summary substring or exact UUID.
523
+ Default: 2 minutes.
524
+
525
+ timeskip --list
526
+ List all projections with their IDs and times.
527
+
528
+ import-openclaw [--dry-run]
529
+ Import /home/lars/clawd/USER.md into core memory and
530
+ /home/lars/clawd/memory/*.md into archival memory.
531
+
532
+ fill-context [--count <n>] [--dataset <path>] [--dry-run]
533
+ Inject synthetic conversations into history to fill the context window.
534
+ Used to test compaction and archival memory retrieval under context pressure.
535
+ Prioritises context-window-pressure conversations from the dataset.
536
+ Default count: 10. Default dataset: synthetic-agent-conversations/dataset/memory-context.jsonl
537
+
538
+ archive-fact "<content>"
539
+ Insert a fact into archival memory and check if any trigger-based
540
+ projections fire. Uses keyword matching + embedding similarity fallback.
541
+ Useful for testing trigger_on_fact without going through the agent.
542
+
543
+ Global options:
544
+ --user-id <id> User ID (default: first entry in telegram.allowed_users)
545
+ --data-dir <path> Data directory (default: BRYTI_DATA_DIR env or ./data)
546
+ `);
547
+ }
548
+ // ---------------------------------------------------------------------------
549
+ // Main dispatcher
550
+ // ---------------------------------------------------------------------------
551
+ async function main() {
552
+ const command = positional(0);
553
+ if (!command || command === "help" || flag("--help") || flag("-h")) {
554
+ showHelp();
555
+ return;
556
+ }
557
+ const dataDir = resolveDataDir();
558
+ const userId = resolveUserId(dataDir);
559
+ switch (command) {
560
+ case "memory": {
561
+ const sub = positional(1);
562
+ const showAll = flag("--all");
563
+ const query = opt("--query");
564
+ const limit = Number(opt("--limit", "20"));
565
+ if (!sub || sub === "all") {
566
+ cmdMemoryCore(dataDir);
567
+ cmdMemoryProjections(dataDir, userId, showAll);
568
+ cmdMemoryArchival(dataDir, userId, query, limit);
569
+ }
570
+ else if (sub === "core") {
571
+ cmdMemoryCore(dataDir);
572
+ }
573
+ else if (sub === "projections") {
574
+ cmdMemoryProjections(dataDir, userId, showAll);
575
+ }
576
+ else if (sub === "archival") {
577
+ cmdMemoryArchival(dataDir, userId, query, limit);
578
+ }
579
+ else {
580
+ console.error(`Unknown memory subcommand: ${sub}`);
581
+ console.error("Use: memory [core|projections|archival|all]");
582
+ process.exit(1);
583
+ }
584
+ break;
585
+ }
586
+ case "reflect": {
587
+ const window = Number(opt("--window", "30"));
588
+ await cmdReflect(dataDir, userId, window);
589
+ break;
590
+ }
591
+ case "timeskip": {
592
+ if (flag("--list")) {
593
+ cmdTimeskipList(dataDir, userId);
594
+ break;
595
+ }
596
+ const summaryOrId = positional(1);
597
+ if (!summaryOrId) {
598
+ console.error("Usage: timeskip <summary|id> [--minutes <n>] | timeskip --list");
599
+ process.exit(1);
600
+ }
601
+ const minutes = Number(opt("--minutes", "2"));
602
+ cmdTimeskip(dataDir, userId, summaryOrId, minutes);
603
+ break;
604
+ }
605
+ case "import-openclaw": {
606
+ cmdImportOpenclaw(dataDir, userId, flag("--dry-run"));
607
+ break;
608
+ }
609
+ case "fill-context": {
610
+ const count = Number(opt("--count", "10"));
611
+ const dataset = opt("--dataset", DEFAULT_DATASET);
612
+ cmdFillContext(dataDir, count, dataset, flag("--dry-run"));
613
+ break;
614
+ }
615
+ case "archive-fact": {
616
+ const content = positional(1);
617
+ if (!content) {
618
+ console.error('Usage: archive-fact "<content>"');
619
+ process.exit(1);
620
+ }
621
+ await cmdArchiveFact(dataDir, userId, content);
622
+ break;
623
+ }
624
+ default:
625
+ console.error(`Unknown command: ${command}`);
626
+ console.error("Run 'npm run cli -- help' for usage.");
627
+ process.exit(1);
628
+ }
629
+ console.log("");
630
+ }
631
+ main().catch((err) => {
632
+ console.error("Fatal:", err.message);
633
+ process.exit(1);
634
+ });
635
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}