memoryblock 0.1.3 → 0.1.5

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 (111) hide show
  1. package/README.md +77 -123
  2. package/bin/mblk.js +85 -0
  3. package/dist/commands/create.d.ts +2 -0
  4. package/dist/commands/create.d.ts.map +1 -0
  5. package/dist/commands/create.js +48 -0
  6. package/dist/commands/create.js.map +1 -0
  7. package/dist/commands/delete.d.ts +5 -0
  8. package/dist/commands/delete.d.ts.map +1 -0
  9. package/dist/commands/delete.js +147 -0
  10. package/dist/commands/delete.js.map +1 -0
  11. package/dist/commands/init.d.ts +9 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +209 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/permissions.d.ts +13 -0
  16. package/dist/commands/permissions.d.ts.map +1 -0
  17. package/dist/commands/permissions.js +60 -0
  18. package/dist/commands/permissions.js.map +1 -0
  19. package/dist/commands/plugin-settings.d.ts +6 -0
  20. package/dist/commands/plugin-settings.d.ts.map +1 -0
  21. package/dist/commands/plugin-settings.js +118 -0
  22. package/dist/commands/plugin-settings.js.map +1 -0
  23. package/dist/commands/plugins.d.ts +3 -0
  24. package/dist/commands/plugins.d.ts.map +1 -0
  25. package/dist/commands/plugins.js +83 -0
  26. package/dist/commands/plugins.js.map +1 -0
  27. package/dist/commands/reset.d.ts +8 -0
  28. package/dist/commands/reset.d.ts.map +1 -0
  29. package/dist/commands/reset.js +96 -0
  30. package/dist/commands/reset.js.map +1 -0
  31. package/dist/commands/server.d.ts +25 -0
  32. package/dist/commands/server.d.ts.map +1 -0
  33. package/dist/commands/server.js +295 -0
  34. package/dist/commands/server.js.map +1 -0
  35. package/dist/commands/service.d.ts +18 -0
  36. package/dist/commands/service.d.ts.map +1 -0
  37. package/dist/commands/service.js +309 -0
  38. package/dist/commands/service.js.map +1 -0
  39. package/dist/commands/start.d.ts +11 -0
  40. package/dist/commands/start.d.ts.map +1 -0
  41. package/dist/commands/start.js +794 -0
  42. package/dist/commands/start.js.map +1 -0
  43. package/dist/commands/status.d.ts +2 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +78 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/stop.d.ts +9 -0
  48. package/dist/commands/stop.d.ts.map +1 -0
  49. package/dist/commands/stop.js +83 -0
  50. package/dist/commands/stop.js.map +1 -0
  51. package/dist/commands/web.d.ts +5 -0
  52. package/dist/commands/web.d.ts.map +1 -0
  53. package/dist/commands/web.js +63 -0
  54. package/dist/commands/web.js.map +1 -0
  55. package/dist/commands.d.ts +7 -0
  56. package/dist/commands.d.ts.map +1 -0
  57. package/dist/commands.js +7 -0
  58. package/dist/commands.js.map +1 -0
  59. package/dist/constants.d.ts +41 -0
  60. package/dist/constants.d.ts.map +1 -0
  61. package/dist/constants.js +81 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/entry.d.ts +9 -0
  64. package/dist/entry.d.ts.map +1 -0
  65. package/dist/entry.js +345 -0
  66. package/dist/entry.js.map +1 -0
  67. package/package.json +37 -12
  68. package/dist/engine/agent.d.ts +0 -15
  69. package/dist/engine/agent.d.ts.map +0 -1
  70. package/dist/engine/agent.js +0 -19
  71. package/dist/engine/agent.js.map +0 -1
  72. package/dist/engine/conversation-log.d.ts +0 -35
  73. package/dist/engine/conversation-log.d.ts.map +0 -1
  74. package/dist/engine/conversation-log.js +0 -83
  75. package/dist/engine/conversation-log.js.map +0 -1
  76. package/dist/engine/cost-tracker.d.ts +0 -52
  77. package/dist/engine/cost-tracker.d.ts.map +0 -1
  78. package/dist/engine/cost-tracker.js +0 -110
  79. package/dist/engine/cost-tracker.js.map +0 -1
  80. package/dist/engine/gatekeeper.d.ts +0 -20
  81. package/dist/engine/gatekeeper.d.ts.map +0 -1
  82. package/dist/engine/gatekeeper.js +0 -43
  83. package/dist/engine/gatekeeper.js.map +0 -1
  84. package/dist/engine/memory.d.ts +0 -28
  85. package/dist/engine/memory.d.ts.map +0 -1
  86. package/dist/engine/memory.js +0 -69
  87. package/dist/engine/memory.js.map +0 -1
  88. package/dist/engine/monitor.d.ts +0 -81
  89. package/dist/engine/monitor.d.ts.map +0 -1
  90. package/dist/engine/monitor.js +0 -610
  91. package/dist/engine/monitor.js.map +0 -1
  92. package/dist/engine/prompts.d.ts +0 -31
  93. package/dist/engine/prompts.d.ts.map +0 -1
  94. package/dist/engine/prompts.js +0 -93
  95. package/dist/engine/prompts.js.map +0 -1
  96. package/dist/index.d.ts +0 -10
  97. package/dist/index.d.ts.map +0 -1
  98. package/dist/index.js +0 -14
  99. package/dist/index.js.map +0 -1
  100. package/dist/utils/config.d.ts +0 -24
  101. package/dist/utils/config.d.ts.map +0 -1
  102. package/dist/utils/config.js +0 -86
  103. package/dist/utils/config.js.map +0 -1
  104. package/dist/utils/fs.d.ts +0 -18
  105. package/dist/utils/fs.d.ts.map +0 -1
  106. package/dist/utils/fs.js +0 -65
  107. package/dist/utils/fs.js.map +0 -1
  108. package/dist/utils/logger.d.ts +0 -12
  109. package/dist/utils/logger.d.ts.map +0 -1
  110. package/dist/utils/logger.js +0 -40
  111. package/dist/utils/logger.js.map +0 -1
@@ -1,610 +0,0 @@
1
- import { MemoryManager } from './memory.js';
2
- import { Gatekeeper } from './gatekeeper.js';
3
- import { ConversationLogger } from './conversation-log.js';
4
- import { CostTracker } from './cost-tracker.js';
5
- import { savePulseState, saveBlockConfig, loadGlobalConfig, resolveBlocksDir, getWsRoot } from '../utils/config.js';
6
- import { ensureDir, pathExists } from '../utils/fs.js';
7
- import { log } from '../utils/logger.js';
8
- import { t } from '@memoryblock/locale';
9
- import { SYSTEM_PROMPTS } from './prompts.js';
10
- import { promises as fsp } from 'node:fs';
11
- import { join } from 'node:path';
12
- // Safe commands that skip approval — monitor can auto-execute these
13
- const SAFE_PREFIXES = [
14
- 'ls', 'cat', 'head', 'tail', 'wc', 'find', 'grep', 'which', 'echo', 'pwd',
15
- 'node --version', 'bun --version', 'pnpm --version', 'npm --version',
16
- 'git status', 'git log', 'git diff', 'git branch',
17
- 'tsc --noEmit', 'npx eslint', 'pnpm lint', 'npm run lint',
18
- 'pnpm build', 'npm run build', 'pnpm test', 'npm test',
19
- ];
20
- /**
21
- * The Monitor — a block's resident intelligence.
22
- *
23
- * Features:
24
- * - Identity (name, emoji, personality) persisted to monitor.md
25
- * - Conversation logging to logs/
26
- * - System-level cost tracking (no model tokens wasted)
27
- * - Smart memory: saves only key context at threshold/stop
28
- * - Safe-command auto-execution (lint, build, test, grep — no approval needed)
29
- * - Sandbox toggle: sandbox=false gives full filesystem access
30
- */
31
- export class Monitor {
32
- memory;
33
- gatekeeper;
34
- logger;
35
- channel;
36
- blockPath;
37
- costTracker;
38
- messages = [];
39
- running = false;
40
- toolsDiscovered = false;
41
- toolsUsedThisCycle = false; // Track when tools have been used after discovery
42
- monitorName;
43
- monitorEmoji;
44
- blockConfig;
45
- adapter;
46
- registry;
47
- constructor(options) {
48
- this.blockPath = options.blockPath;
49
- this.blockConfig = options.blockConfig;
50
- this.adapter = options.adapter;
51
- this.registry = options.registry;
52
- this.channel = options.channel;
53
- this.monitorName = options.blockConfig.monitorName || 'Monitor';
54
- this.monitorEmoji = options.blockConfig.monitorEmoji || '✨';
55
- this.memory = new MemoryManager(options.blockConfig.memory.maxContextTokens, options.blockConfig.memory.thresholdPercent);
56
- this.gatekeeper = new Gatekeeper(options.channel, options.blockConfig.name, this.monitorName);
57
- this.logger = new ConversationLogger(options.blockPath);
58
- this.costTracker = new CostTracker(options.blockPath, options.blockConfig.adapter.model);
59
- }
60
- async start() {
61
- this.running = true;
62
- const { blockConfig, blockPath } = this;
63
- // Load previous cost totals
64
- await this.costTracker.load();
65
- await savePulseState(blockPath, {
66
- status: 'ACTIVE',
67
- lastRun: new Date().toISOString(),
68
- nextWakeUp: null,
69
- currentTask: 'Online',
70
- error: null,
71
- });
72
- // founder.md lives at the workspace root (~/.memoryblock/ws/), shared across blocks
73
- const wsRoot = getWsRoot();
74
- const [monitorContent, memoryContent, founderContent] = await Promise.all([
75
- this.readFile(join(blockPath, 'monitor.md')),
76
- this.readFile(join(blockPath, 'memory.md')),
77
- this.readFile(join(wsRoot, 'founder.md')),
78
- ]);
79
- const isFirstRun = !blockConfig.monitorName;
80
- const systemPrompt = this.buildSystemPrompt(blockConfig, monitorContent, memoryContent, founderContent, isFirstRun);
81
- // System prompt pushed ONCE at session start, never re-sent per message
82
- this.messages = [{ role: 'system', content: systemPrompt }];
83
- await this.logger.init(blockConfig.name, this.monitorName, this.channel.name);
84
- const displayName = `${this.monitorEmoji} ${this.monitorName}`;
85
- log.monitor(blockConfig.name, displayName, 'Online. Listening...');
86
- this.channel.onMessage(async (msg) => {
87
- if (!this.running)
88
- return;
89
- await this.handleUserMessage(msg.content, msg._sourceChannel);
90
- });
91
- await this.channel.start();
92
- }
93
- async stop() {
94
- this.running = false;
95
- // Save smart memory summary before shutdown
96
- await this.saveSmartMemory();
97
- // Persist cost data
98
- await this.costTracker.save();
99
- await this.logger.close();
100
- await this.channel.stop();
101
- // Only write SLEEPING state if we still own the lock
102
- let isSuperseded = false;
103
- try {
104
- const pidStr = await fsp.readFile(join(this.blockPath, '.lock'), 'utf8');
105
- if (Number(pidStr.trim()) !== process.pid)
106
- isSuperseded = true;
107
- }
108
- catch { /* proceed if no lock */ }
109
- if (!isSuperseded) {
110
- await savePulseState(this.blockPath, {
111
- status: 'SLEEPING',
112
- lastRun: new Date().toISOString(),
113
- nextWakeUp: null,
114
- currentTask: null,
115
- error: null,
116
- });
117
- }
118
- const sessionReport = this.costTracker.getSessionReport();
119
- const totalReport = this.costTracker.getTotalReport();
120
- console.log('');
121
- log.monitor(this.blockConfig.name, this.monitorName, t.monitor.goingToSleep);
122
- log.dim(` ${t.monitor.currentSession}: ${sessionReport}`);
123
- log.dim(` ${t.monitor.completeSession}: ${totalReport}`);
124
- }
125
- async handleUserMessage(content, sourceChannel) {
126
- this.logger.logUser(content, {
127
- channel: sourceChannel || this.blockConfig.channel.type,
128
- chatId: this.blockConfig.channel.telegram?.chatId,
129
- });
130
- let llmContent = content;
131
- // Native Slash Commands Interception
132
- const text = content.trim();
133
- if (text.startsWith('/')) {
134
- const parts = text.split(/\s+/);
135
- const cmd = parts[0].toLowerCase();
136
- let handled = false;
137
- let output = '';
138
- let shouldContinue = false;
139
- if (cmd === '/status') {
140
- handled = true;
141
- output = await this.getSystemStatus();
142
- shouldContinue = parts.length > 1;
143
- llmContent = text.substring(cmd.length).trim();
144
- }
145
- else if (cmd === '/create-block') {
146
- handled = true;
147
- if (parts.length < 2) {
148
- output = 'Usage: /create-block <name> [optional instructions]';
149
- }
150
- else {
151
- const name = parts[1];
152
- if (!/^[a-z0-9][a-z0-9-]{0,31}$/.test(name)) {
153
- output = 'Invalid block name. Use lowercase letters, numbers, hyphens (max 32).';
154
- }
155
- else {
156
- output = await this.createBlockNatively(name);
157
- shouldContinue = parts.length > 2;
158
- llmContent = text.substring(cmd.length + name.length + 1).trim();
159
- }
160
- }
161
- }
162
- else if (cmd.startsWith('/switch')) {
163
- handled = true;
164
- const target = cmd.startsWith('/switch-') ? cmd.slice(8) : parts[1];
165
- if (!target) {
166
- output = 'Usage: /switch-<block> or /switch <block>';
167
- }
168
- else {
169
- output = `To switch to \`${target}\`, suspend this session (Ctrl+C) and run:\n\`mblk start ${target}\``;
170
- }
171
- }
172
- if (handled) {
173
- if (output) {
174
- // Send directly back to where it came from if multi-channel
175
- await this.sendToChannel(`⚙️ **System:**\n${output}`, sourceChannel);
176
- }
177
- if (!shouldContinue)
178
- return;
179
- }
180
- }
181
- // Apply source headers for multi-channel differentiation before sending to LLM
182
- if (sourceChannel) {
183
- llmContent = `[Source: channel:${sourceChannel}]\n${llmContent || content}`;
184
- }
185
- else {
186
- llmContent = llmContent || content;
187
- }
188
- // If command had trailing text (or wasn't a command), let the AI respond.
189
- this.messages.push({ role: 'user', content: llmContent });
190
- try {
191
- await this.runConversationLoop(sourceChannel);
192
- }
193
- catch (err) {
194
- const message = err instanceof Error ? err.message : String(err);
195
- log.error(`Monitor error: ${message}`);
196
- const errMsg = `Something went wrong on my end. Give me a moment and try again.\n\n_${message}_`;
197
- await this.sendToChannel(errMsg);
198
- }
199
- }
200
- async runConversationLoop(sourceChannel) {
201
- const { adapter, blockConfig, blockPath } = this;
202
- while (this.running) {
203
- const tools = this.getToolDefinitions();
204
- const streamCb = this.channel.streamChunk ? (chunk) => this.channel.streamChunk(chunk) : undefined;
205
- const response = adapter.converseStream && streamCb
206
- ? await adapter.converseStream(this.messages, tools, streamCb)
207
- : await adapter.converse(this.messages, tools);
208
- // System-level cost tracking — no model tokens used
209
- this.memory.trackUsage(response.usage);
210
- this.costTracker.track(response.usage);
211
- this.messages.push(response.message);
212
- if (response.stopReason === 'tool_use' && response.message.toolCalls) {
213
- // Log tool calls compactly in a single dim line
214
- const toolNames = response.message.toolCalls.map(tc => `[${tc.name}]`).join(' ');
215
- log.system(blockConfig.name, `\nTOOLS: ${toolNames}`);
216
- const toolResults = await this.dispatchToolCalls(response.message.toolCalls);
217
- // CRITICAL: Every tool_use must have a corresponding tool_result in the very next message
218
- this.messages.push({ role: 'tool', toolResults });
219
- if (response.message.toolCalls.some((tc) => tc.name === 'list_tools_available')) {
220
- this.toolsDiscovered = true;
221
- this.toolsUsedThisCycle = false;
222
- }
223
- else if (this.toolsDiscovered) {
224
- this.toolsUsedThisCycle = true;
225
- }
226
- // Trim tool results in history to save tokens on next turn
227
- this.trimHistory();
228
- await this.syncIdentityFromFiles();
229
- continue;
230
- }
231
- if (response.message.content) {
232
- // Send response (token info passed as metadata)
233
- await this.sendToChannel(response.message.content, sourceChannel, this.costTracker.getPerTurnReport());
234
- }
235
- // Trim history AFTER sending response — keeps API messages lean
236
- this.trimHistory();
237
- // Save trimmed session state for resumption on crash/restart
238
- await this.saveSessionState();
239
- if (this.memory.shouldSummarize()) {
240
- this.logger.logSystem('Memory threshold reached — summarizing context.');
241
- log.system(blockConfig.name, 'Memory threshold. Smart-saving context...');
242
- // Save smart memory (key info only, not full conversation)
243
- const freshMemory = await this.memory.summarize(adapter, this.messages, blockPath);
244
- const monitorContent = await this.readFile(join(blockPath, 'monitor.md'));
245
- const wsRoot = getWsRoot();
246
- const founderContent = await this.readFile(join(wsRoot, 'founder.md'));
247
- const systemPrompt = this.buildSystemPrompt(blockConfig, monitorContent, freshMemory, founderContent, false);
248
- this.messages = [{ role: 'system', content: systemPrompt }];
249
- this.toolsDiscovered = false;
250
- // Save costs on threshold
251
- await this.costTracker.save();
252
- }
253
- break;
254
- }
255
- }
256
- /** Save smart memory — only key context, not full conversation. For session resumption. */
257
- async saveSmartMemory() {
258
- const { blockPath } = this;
259
- const memoryPath = join(blockPath, 'memory.md');
260
- // Only save if we had meaningful conversation
261
- if (this.messages.length <= 2)
262
- return;
263
- try {
264
- // Extract key context from conversation (last user messages and assistant responses)
265
- const keyMessages = this.messages
266
- .filter((m) => m.role === 'user' || (m.role === 'assistant' && m.content))
267
- .slice(-10); // Last 10 meaningful exchanges
268
- const summary = [
269
- '# Memory',
270
- '',
271
- `> Last session: ${new Date().toISOString()}`,
272
- `> Session cost: ${this.costTracker.getSessionReport()}`,
273
- '',
274
- '## Recent Context',
275
- ];
276
- for (const msg of keyMessages) {
277
- if (msg.role === 'user') {
278
- summary.push(`- **User:** ${(msg.content || '').slice(0, 200)}`);
279
- }
280
- else if (msg.content) {
281
- summary.push(`- **Monitor:** ${msg.content.slice(0, 200)}`);
282
- }
283
- }
284
- summary.push('', '## Notes');
285
- summary.push('(Search logs/ for full conversation history)');
286
- await fsp.writeFile(memoryPath, summary.join('\n'), 'utf-8');
287
- }
288
- catch {
289
- // Non-critical — don't crash on memory save failure
290
- }
291
- }
292
- async getSystemStatus() {
293
- try {
294
- const globalConfig = await loadGlobalConfig();
295
- const blocksDir = resolveBlocksDir(globalConfig);
296
- const dirs = await fsp.readdir(blocksDir);
297
- let out = '🚥 **System Status**\n\n';
298
- for (const d of dirs) {
299
- if (d.startsWith('_') || d.startsWith('.'))
300
- continue;
301
- const bPath = join(blocksDir, d);
302
- const isDir = await fsp.stat(bPath).then(s => s.isDirectory()).catch(() => false);
303
- if (!isDir)
304
- continue;
305
- try {
306
- const blockCfgStr = await fsp.readFile(join(bPath, 'config.json'), 'utf8');
307
- const blockCfg = JSON.parse(blockCfgStr);
308
- const pulseStr = await fsp.readFile(join(bPath, 'pulse.json'), 'utf8').catch(() => '{}');
309
- const pulse = JSON.parse(pulseStr);
310
- const status = pulse.status || 'UNKNOWN';
311
- const icon = status === 'ACTIVE' ? '🟢' : '💤';
312
- out += `${icon} **${blockCfg.name}** — ${blockCfg.description || 'No description'} _(${status})_\n`;
313
- }
314
- catch {
315
- // ignore corrupted blocks
316
- }
317
- }
318
- return out;
319
- }
320
- catch (err) {
321
- return `Failed to read status: ${err.message}`;
322
- }
323
- }
324
- async createBlockNatively(name) {
325
- try {
326
- const globalConfig = await loadGlobalConfig();
327
- const blocksDir = resolveBlocksDir(globalConfig);
328
- const blockPath = join(blocksDir, name);
329
- if (await pathExists(blockPath)) {
330
- return `Block \`${name}\` already exists.`;
331
- }
332
- await ensureDir(blockPath);
333
- await ensureDir(join(blockPath, 'agents'));
334
- await ensureDir(join(blockPath, 'logs'));
335
- const config = {
336
- name,
337
- description: 'Created via slash command',
338
- adapter: globalConfig.defaults.adapter,
339
- memory: globalConfig.defaults.memory,
340
- pulse: globalConfig.defaults.pulse,
341
- channel: { type: 'cli' },
342
- tools: { enabled: ['*'], sandbox: false }
343
- };
344
- await saveBlockConfig(blockPath, config);
345
- await savePulseState(blockPath, {
346
- status: 'SLEEPING',
347
- lastRun: new Date().toISOString(),
348
- nextWakeUp: null,
349
- currentTask: null,
350
- error: null
351
- });
352
- await fsp.writeFile(join(blockPath, 'memory.md'), `# ${name}\n\n(no memory yet)`, 'utf8');
353
- await fsp.writeFile(join(blockPath, 'monitor.md'), `You are an AI assistant in the block: ${name}.`, 'utf8');
354
- return `✅ Block \`${name}\` created natively.`;
355
- }
356
- catch (err) {
357
- return `Failed to create block: ${err.message}`;
358
- }
359
- }
360
- /**
361
- * Trim tool results in message history to save tokens.
362
- *
363
- * This is SYSTEM-LEVEL compaction — no model calls, zero extra cost.
364
- * Only the internal `this.messages` array is trimmed. Full content is
365
- * preserved in ConversationLogger and CLIChannel output.
366
- *
367
- * Rules:
368
- * - list_tools_available results → "(N tools discovered)"
369
- * - read_file results > 500 chars → truncated with note
370
- * - search_files results > 500 chars → truncated with note
371
- * - write_file / replace_in_file → kept as-is (already compact)
372
- * - execute_command output > 1000 chars → truncated
373
- */
374
- trimHistory() {
375
- // Max chars for different tool types in history
376
- const TRIM_LIMITS = {
377
- list_tools_available: { limit: 50, hint: '' },
378
- read_file: { limit: 500, hint: 'call read_file again if you need the full content' },
379
- search_files: { limit: 500, hint: 'call search_files again to see more results' },
380
- execute_command: { limit: 1000, hint: 're-run the command if you need the full output' },
381
- };
382
- for (const msg of this.messages) {
383
- if (msg.role !== 'tool' || !msg.toolResults)
384
- continue;
385
- for (const result of msg.toolResults) {
386
- // Special case: list_tools_available → ultra compact
387
- if (result.name === 'list_tools_available') {
388
- const toolCount = (result.content.match(/^- /gm) || []).length;
389
- result.content = `(${toolCount} tools discovered)`;
390
- continue;
391
- }
392
- const config = TRIM_LIMITS[result.name];
393
- if (config && result.content.length > config.limit) {
394
- result.content = result.content.slice(0, config.limit) +
395
- `\n...(trimmed for efficiency — ${config.hint})`;
396
- }
397
- }
398
- }
399
- }
400
- /**
401
- * Save trimmed session state for resumption.
402
- * If the terminal crashes or the user restarts, we can pick up
403
- * from the trimmed messages rather than starting from scratch.
404
- * This is separate from memory.md (which is for cross-session context).
405
- */
406
- async saveSessionState() {
407
- const sessionPath = join(this.blockPath, 'session.json');
408
- try {
409
- // Only save user/assistant messages (not system — rebuilt on start)
410
- const sessionMessages = this.messages
411
- .filter((m) => m.role !== 'system')
412
- .map((m) => ({
413
- role: m.role,
414
- content: m.content,
415
- toolCalls: m.toolCalls,
416
- toolResults: m.toolResults,
417
- }));
418
- await fsp.writeFile(sessionPath, JSON.stringify({
419
- monitorName: this.monitorName,
420
- monitorEmoji: this.monitorEmoji,
421
- toolsDiscovered: this.toolsDiscovered,
422
- toolsUsedThisCycle: this.toolsUsedThisCycle,
423
- messages: sessionMessages,
424
- savedAt: new Date().toISOString(),
425
- }, null, 2), 'utf-8');
426
- }
427
- catch {
428
- // Non-critical — session state is a convenience, not a requirement
429
- }
430
- }
431
- /** Sync monitor identity after tool calls (since background daemons never restart natively). */
432
- async syncIdentityFromFiles() {
433
- const { blockPath } = this;
434
- let identityChanged = false;
435
- // 1. Always prioritize reading the latest config.json (updated by tools)
436
- try {
437
- const configStr = await this.readFile(join(blockPath, 'config.json'));
438
- const diskConfig = JSON.parse(configStr);
439
- // Check if identity changed in config
440
- if (diskConfig.monitorName && diskConfig.monitorName !== this.monitorName) {
441
- this.monitorName = diskConfig.monitorName;
442
- identityChanged = true;
443
- }
444
- if (diskConfig.monitorEmoji && diskConfig.monitorEmoji !== this.monitorEmoji) {
445
- this.monitorEmoji = diskConfig.monitorEmoji;
446
- identityChanged = true;
447
- }
448
- // Apply all config updates to the local running map
449
- this.blockConfig = diskConfig;
450
- }
451
- catch { /* ignore parse errors */ }
452
- // 2. Fallback check for manual edits to monitor.md
453
- const content = await this.readFile(join(blockPath, 'monitor.md'));
454
- const nameMatch = content.match(/^\*\*Name:\*\*\s+(.+)$/m);
455
- const emojiMatch = content.match(/^\*\*Emoji:\*\*\s+(.+)$/m);
456
- const mdName = nameMatch?.[1]?.trim();
457
- const mdEmoji = emojiMatch?.[1]?.trim();
458
- if (mdName && mdName !== '(not set — will be chosen on first run)' &&
459
- (mdName !== this.monitorName || (mdEmoji && mdEmoji !== this.monitorEmoji))) {
460
- this.monitorName = mdName;
461
- this.monitorEmoji = mdEmoji || this.monitorEmoji;
462
- identityChanged = true;
463
- // Reflect markdown-driven identity changes back into the config
464
- this.blockConfig = { ...this.blockConfig, monitorName: this.monitorName, monitorEmoji: this.monitorEmoji };
465
- await saveBlockConfig(blockPath, this.blockConfig);
466
- }
467
- if (identityChanged) {
468
- log.monitor(this.blockConfig.name, `${this.monitorEmoji} ${this.monitorName}`, 'Identity updated dynamically.');
469
- }
470
- }
471
- async dispatchToolCalls(toolCalls) {
472
- const { registry, blockPath, blockConfig } = this;
473
- const results = [];
474
- const sandbox = blockConfig.tools.sandbox;
475
- const workingDir = blockConfig.tools.workingDir || blockPath;
476
- for (const tc of toolCalls) {
477
- try {
478
- const toolDef = registry.listTools().find((t) => t.name === tc.name);
479
- // Smart approval: skip approval for safe commands
480
- if (toolDef?.requiresApproval && tc.name === 'execute_command') {
481
- const cmd = tc.input.command || '';
482
- const isSafe = SAFE_PREFIXES.some((p) => cmd.trim().startsWith(p));
483
- if (!isSafe) {
484
- const approved = await this.gatekeeper.requestApproval(tc.name, tc.input);
485
- if (!approved) {
486
- results.push({ toolCallId: tc.id, name: tc.name, content: 'Action denied by user.', isError: true });
487
- continue;
488
- }
489
- }
490
- }
491
- else if (toolDef?.requiresApproval) {
492
- const approved = await this.gatekeeper.requestApproval(tc.name, tc.input);
493
- if (!approved) {
494
- results.push({ toolCallId: tc.id, name: tc.name, content: 'Action denied by user.', isError: true });
495
- continue;
496
- }
497
- }
498
- const result = await registry.execute(tc.name, tc.input, {
499
- blockPath,
500
- blockName: blockConfig.name,
501
- workingDir,
502
- sandbox,
503
- dispatchMessage: async (target, content) => {
504
- // Log it to the conversation history
505
- this.logger.logMonitor(content, {
506
- channel: target,
507
- monitorName: this.monitorName,
508
- emoji: this.monitorEmoji,
509
- });
510
- // Dispatch selectively via multi-channel manager overrides
511
- await this.channel.send({
512
- blockName: this.blockConfig.name,
513
- monitorName: `${this.monitorEmoji} ${this.monitorName}`,
514
- content,
515
- isSystem: false,
516
- timestamp: new Date().toISOString(),
517
- _targetChannel: target,
518
- });
519
- }
520
- });
521
- results.push({ toolCallId: tc.id, name: tc.name, content: result.content, isError: result.isError });
522
- }
523
- catch (err) {
524
- // Return errors as tool results to keep history healthy
525
- results.push({
526
- toolCallId: tc.id,
527
- name: tc.name,
528
- content: `Tool error: ${err instanceof Error ? err.message : String(err)}`,
529
- isError: true,
530
- });
531
- }
532
- }
533
- return results;
534
- }
535
- getToolDefinitions() {
536
- // ALWAYS provide the discovery tool.
537
- const discoveryTool = this.registry.getDiscoveryTool();
538
- if (!this.toolsDiscovered) {
539
- // First contact: only provide discovery tool
540
- return [discoveryTool];
541
- }
542
- if (!this.toolsUsedThisCycle) {
543
- // Discovered but not yet used — send full schemas for ONE cycle
544
- return [discoveryTool, ...this.registry.listTools()];
545
- }
546
- // After tools have been used: only provide discovery tool + compact reminder
547
- // This saves ~2,500 tokens per turn by not re-sending all 11 tool schemas
548
- return [discoveryTool];
549
- }
550
- async sendToChannel(content, targetChannel, costReport, sessionReport, totalReport) {
551
- this.logger.logMonitor(content, {
552
- channel: targetChannel || this.blockConfig.channel.type,
553
- monitorName: this.monitorName,
554
- emoji: this.monitorEmoji,
555
- });
556
- await this.channel.send({
557
- blockName: this.blockConfig.name,
558
- monitorName: `${this.monitorEmoji} ${this.monitorName}`,
559
- content,
560
- isSystem: false,
561
- timestamp: new Date().toISOString(),
562
- _targetChannel: targetChannel,
563
- costReport,
564
- sessionReport,
565
- totalReport,
566
- });
567
- }
568
- async readFile(path) {
569
- try {
570
- return await fsp.readFile(path, 'utf-8');
571
- }
572
- catch {
573
- return '';
574
- }
575
- }
576
- buildSystemPrompt(config, monitorMd, memoryMd, founderMd, isFirstRun) {
577
- const goals = config.goals.length > 0
578
- ? config.goals.map((g, i) => `${i + 1}. ${g}`).join('\n')
579
- : 'No specific goals set yet.';
580
- const parts = [];
581
- const absoluteMonitorPath = join(this.blockPath, 'monitor.md');
582
- const absoluteMemoryPath = join(this.blockPath, 'memory.md');
583
- const absoluteFounderPath = join(getWsRoot(), 'founder.md');
584
- if (isFirstRun) {
585
- parts.push(SYSTEM_PROMPTS.MONITOR_FIRST_RUN(config.name, absoluteMonitorPath, absoluteMemoryPath, absoluteFounderPath));
586
- }
587
- else {
588
- parts.push(SYSTEM_PROMPTS.MONITOR_RESUME(this.monitorName, this.monitorEmoji, config.name));
589
- }
590
- if (config.description) {
591
- parts.push(`\n**Block:** ${config.description}`);
592
- }
593
- parts.push(`\n## Your Goals\n${goals}`);
594
- parts.push(`\n${SYSTEM_PROMPTS.OPERATING_GUIDELINES(this.channel.getActiveChannels?.() || [this.channel.name])}`);
595
- if (monitorMd && !monitorMd.includes('(not set')) {
596
- parts.push(`\n## Your Identity\n${monitorMd}`);
597
- }
598
- if (founderMd && !founderMd.includes('(unknown)')) {
599
- parts.push(`\n## The Founder\n${founderMd}`);
600
- }
601
- if (memoryMd && !memoryMd.includes('No history yet')) {
602
- parts.push(`\n## Memory (Previous Context)\n${memoryMd}`);
603
- }
604
- if (this.toolsDiscovered && this.toolsUsedThisCycle) {
605
- parts.push(`\n${SYSTEM_PROMPTS.TOOL_REMINDER(this.registry.listTools().length)}`);
606
- }
607
- return parts.join('\n');
608
- }
609
- }
610
- //# sourceMappingURL=monitor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/engine/monitor.ts"],"names":[],"mappings":"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"}