memoryblock 0.1.4 → 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.
- package/README.md +73 -115
- package/bin/mblk.js +68 -71
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +48 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +5 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +147 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +209 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/permissions.d.ts +13 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +60 -0
- package/dist/commands/permissions.js.map +1 -0
- package/dist/commands/plugin-settings.d.ts +6 -0
- package/dist/commands/plugin-settings.d.ts.map +1 -0
- package/dist/commands/plugin-settings.js +118 -0
- package/dist/commands/plugin-settings.js.map +1 -0
- package/dist/commands/plugins.d.ts +3 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +83 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/reset.d.ts +8 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +96 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/server.d.ts +25 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +295 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/service.d.ts +18 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +309 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +11 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +794 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +78 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +9 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +83 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/web.d.ts +5 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +63 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/commands.d.ts +7 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +7 -0
- package/dist/commands.js.map +1 -0
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +81 -0
- package/dist/constants.js.map +1 -0
- package/dist/entry.d.ts +9 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +345 -0
- package/dist/entry.js.map +1 -0
- package/package.json +32 -11
- package/dist/engine/agent.d.ts +0 -15
- package/dist/engine/agent.d.ts.map +0 -1
- package/dist/engine/agent.js +0 -19
- package/dist/engine/agent.js.map +0 -1
- package/dist/engine/conversation-log.d.ts +0 -35
- package/dist/engine/conversation-log.d.ts.map +0 -1
- package/dist/engine/conversation-log.js +0 -83
- package/dist/engine/conversation-log.js.map +0 -1
- package/dist/engine/cost-tracker.d.ts +0 -52
- package/dist/engine/cost-tracker.d.ts.map +0 -1
- package/dist/engine/cost-tracker.js +0 -110
- package/dist/engine/cost-tracker.js.map +0 -1
- package/dist/engine/gatekeeper.d.ts +0 -20
- package/dist/engine/gatekeeper.d.ts.map +0 -1
- package/dist/engine/gatekeeper.js +0 -43
- package/dist/engine/gatekeeper.js.map +0 -1
- package/dist/engine/memory.d.ts +0 -28
- package/dist/engine/memory.d.ts.map +0 -1
- package/dist/engine/memory.js +0 -69
- package/dist/engine/memory.js.map +0 -1
- package/dist/engine/monitor.d.ts +0 -81
- package/dist/engine/monitor.d.ts.map +0 -1
- package/dist/engine/monitor.js +0 -610
- package/dist/engine/monitor.js.map +0 -1
- package/dist/engine/prompts.d.ts +0 -31
- package/dist/engine/prompts.d.ts.map +0 -1
- package/dist/engine/prompts.js +0 -93
- package/dist/engine/prompts.js.map +0 -1
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -14
- package/dist/index.js.map +0 -1
- package/dist/utils/config.d.ts +0 -24
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -86
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/fs.d.ts +0 -18
- package/dist/utils/fs.d.ts.map +0 -1
- package/dist/utils/fs.js +0 -65
- package/dist/utils/fs.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -12
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -40
- package/dist/utils/logger.js.map +0 -1
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { promises as fsp } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
/**
|
|
4
|
-
* Pricing per 1M tokens (USD) — system-level, zero model tokens used.
|
|
5
|
-
* Source: AWS Bedrock / Anthropic pricing pages.
|
|
6
|
-
*/
|
|
7
|
-
const MODEL_PRICING = {
|
|
8
|
-
// Opus
|
|
9
|
-
'us.anthropic.claude-opus-4-6-v1': { input: 15, output: 75 },
|
|
10
|
-
'us.anthropic.claude-opus-4-20250514-v1:0': { input: 15, output: 75 },
|
|
11
|
-
// Sonnet
|
|
12
|
-
'us.anthropic.claude-sonnet-4-20250514-v1:0': { input: 3, output: 15 },
|
|
13
|
-
'us.anthropic.claude-sonnet-4-5-20250929-v1:0': { input: 3, output: 15 },
|
|
14
|
-
// Haiku
|
|
15
|
-
'us.anthropic.claude-3-5-haiku-20241022-v1:0': { input: 0.80, output: 4 },
|
|
16
|
-
};
|
|
17
|
-
const DEFAULT_PRICING = { input: 3, output: 15 };
|
|
18
|
-
/**
|
|
19
|
-
* System-level cost tracker — tracks tokens and calculates USD cost.
|
|
20
|
-
* Persists to costs.json in the block directory.
|
|
21
|
-
* No model tokens wasted — this is pure system bookkeeping.
|
|
22
|
-
*/
|
|
23
|
-
export class CostTracker {
|
|
24
|
-
model;
|
|
25
|
-
pricing;
|
|
26
|
-
sessionInput = 0;
|
|
27
|
-
sessionOutput = 0;
|
|
28
|
-
totalInput = 0;
|
|
29
|
-
totalOutput = 0;
|
|
30
|
-
turnCount = 0;
|
|
31
|
-
lastTurnInput = 0;
|
|
32
|
-
lastTurnOutput = 0;
|
|
33
|
-
costFile;
|
|
34
|
-
constructor(blockPath, model) {
|
|
35
|
-
this.model = model;
|
|
36
|
-
this.costFile = join(blockPath, 'costs.json');
|
|
37
|
-
// Find pricing or use default
|
|
38
|
-
this.pricing = MODEL_PRICING[model] || DEFAULT_PRICING;
|
|
39
|
-
}
|
|
40
|
-
/** Load previous totals from costs.json. */
|
|
41
|
-
async load() {
|
|
42
|
-
try {
|
|
43
|
-
const raw = await fsp.readFile(this.costFile, 'utf-8');
|
|
44
|
-
const data = JSON.parse(raw);
|
|
45
|
-
this.totalInput = data.totalInput || 0;
|
|
46
|
-
this.totalOutput = data.totalOutput || 0;
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// First run — no file
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Track a single API call's usage. */
|
|
53
|
-
track(usage) {
|
|
54
|
-
this.lastTurnInput = usage.inputTokens;
|
|
55
|
-
this.lastTurnOutput = usage.outputTokens;
|
|
56
|
-
this.sessionInput += usage.inputTokens;
|
|
57
|
-
this.sessionOutput += usage.outputTokens;
|
|
58
|
-
this.totalInput += usage.inputTokens;
|
|
59
|
-
this.totalOutput += usage.outputTokens;
|
|
60
|
-
this.turnCount++;
|
|
61
|
-
}
|
|
62
|
-
/** Get session cost in USD. */
|
|
63
|
-
getSessionCost() {
|
|
64
|
-
return (this.sessionInput / 1_000_000) * this.pricing.input +
|
|
65
|
-
(this.sessionOutput / 1_000_000) * this.pricing.output;
|
|
66
|
-
}
|
|
67
|
-
/** Get total cost in USD (all sessions). */
|
|
68
|
-
getTotalCost() {
|
|
69
|
-
return (this.totalInput / 1_000_000) * this.pricing.input +
|
|
70
|
-
(this.totalOutput / 1_000_000) * this.pricing.output;
|
|
71
|
-
}
|
|
72
|
-
/** Format cost for display. */
|
|
73
|
-
formatCost(cost) {
|
|
74
|
-
return `$${cost.toFixed(4)}`;
|
|
75
|
-
}
|
|
76
|
-
/** Get formatted session report. */
|
|
77
|
-
getSessionReport() {
|
|
78
|
-
return `${this.sessionInput.toLocaleString()} in / ${this.sessionOutput.toLocaleString()} out`;
|
|
79
|
-
}
|
|
80
|
-
/** Get per-turn report for the last API call. */
|
|
81
|
-
getPerTurnReport() {
|
|
82
|
-
return `${this.lastTurnInput.toLocaleString()} in / ${this.lastTurnOutput.toLocaleString()} out`;
|
|
83
|
-
}
|
|
84
|
-
/** Get all-time total report. */
|
|
85
|
-
getTotalReport() {
|
|
86
|
-
return `${this.totalInput.toLocaleString()} in / ${this.totalOutput.toLocaleString()} out`;
|
|
87
|
-
}
|
|
88
|
-
/** Get turn count. */
|
|
89
|
-
getTurnCount() {
|
|
90
|
-
return this.turnCount;
|
|
91
|
-
}
|
|
92
|
-
/** Get snapshot for display / persistence. */
|
|
93
|
-
getSnapshot() {
|
|
94
|
-
return {
|
|
95
|
-
sessionInput: this.sessionInput,
|
|
96
|
-
sessionOutput: this.sessionOutput,
|
|
97
|
-
totalInput: this.totalInput,
|
|
98
|
-
totalOutput: this.totalOutput,
|
|
99
|
-
sessionCost: this.getSessionCost(),
|
|
100
|
-
totalCost: this.getTotalCost(),
|
|
101
|
-
lastUpdated: new Date().toISOString(),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/** Persist to costs.json. */
|
|
105
|
-
async save() {
|
|
106
|
-
const snapshot = this.getSnapshot();
|
|
107
|
-
await fsp.writeFile(this.costFile, JSON.stringify(snapshot, null, 2), 'utf-8');
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=cost-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/engine/cost-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Channel } from '@memoryblock/types';
|
|
2
|
-
/**
|
|
3
|
-
* Gatekeeper: The sovereign human approval system.
|
|
4
|
-
* When a tool requires approval (e.g., shell commands), execution pauses
|
|
5
|
-
* and the system requests explicit human approval via the active channel.
|
|
6
|
-
*/
|
|
7
|
-
export declare class Gatekeeper {
|
|
8
|
-
private channel;
|
|
9
|
-
private blockName;
|
|
10
|
-
private monitorName;
|
|
11
|
-
constructor(channel: Channel, blockName: string, monitorName: string);
|
|
12
|
-
/**
|
|
13
|
-
* Request human approval for a tool execution.
|
|
14
|
-
* Returns true if approved, false if denied.
|
|
15
|
-
*/
|
|
16
|
-
requestApproval(toolName: string, toolInput: Record<string, unknown>): Promise<boolean>;
|
|
17
|
-
/** Format a human-readable description of the action. */
|
|
18
|
-
private formatDescription;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=gatekeeper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gatekeeper.d.ts","sourceRoot":"","sources":["../../src/engine/gatekeeper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,oBAAoB,CAAC;AAGnE;;;;GAIG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAMpE;;;OAGG;IACG,eAAe,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;IAgBnB,yDAAyD;IACzD,OAAO,CAAC,iBAAiB;CAS5B"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { log } from '../utils/logger.js';
|
|
2
|
-
/**
|
|
3
|
-
* Gatekeeper: The sovereign human approval system.
|
|
4
|
-
* When a tool requires approval (e.g., shell commands), execution pauses
|
|
5
|
-
* and the system requests explicit human approval via the active channel.
|
|
6
|
-
*/
|
|
7
|
-
export class Gatekeeper {
|
|
8
|
-
channel;
|
|
9
|
-
blockName;
|
|
10
|
-
monitorName;
|
|
11
|
-
constructor(channel, blockName, monitorName) {
|
|
12
|
-
this.channel = channel;
|
|
13
|
-
this.blockName = blockName;
|
|
14
|
-
this.monitorName = monitorName;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Request human approval for a tool execution.
|
|
18
|
-
* Returns true if approved, false if denied.
|
|
19
|
-
*/
|
|
20
|
-
async requestApproval(toolName, toolInput) {
|
|
21
|
-
const description = this.formatDescription(toolName, toolInput);
|
|
22
|
-
const request = {
|
|
23
|
-
toolName,
|
|
24
|
-
toolInput,
|
|
25
|
-
description,
|
|
26
|
-
blockName: this.blockName,
|
|
27
|
-
monitorName: this.monitorName,
|
|
28
|
-
};
|
|
29
|
-
log.system(this.blockName, `Approval required: ${description}`);
|
|
30
|
-
return this.channel.requestApproval(request);
|
|
31
|
-
}
|
|
32
|
-
/** Format a human-readable description of the action. */
|
|
33
|
-
formatDescription(toolName, input) {
|
|
34
|
-
if (toolName === 'execute_command') {
|
|
35
|
-
return `Run command: ${input.command}`;
|
|
36
|
-
}
|
|
37
|
-
const params = Object.entries(input)
|
|
38
|
-
.map(([k, v]) => `${k}=${JSON.stringify(v)}`)
|
|
39
|
-
.join(', ');
|
|
40
|
-
return `${toolName}(${params})`;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=gatekeeper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gatekeeper.js","sourceRoot":"","sources":["../../src/engine/gatekeeper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACX,OAAO,CAAU;IACjB,SAAS,CAAS;IAClB,WAAW,CAAS;IAE5B,YAAY,OAAgB,EAAE,SAAiB,EAAE,WAAmB;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACjB,QAAgB,EAChB,SAAkC;QAElC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAoB;YAC7B,QAAQ;YACR,SAAS;YACT,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAChC,CAAC;QAEF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,WAAW,EAAE,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,yDAAyD;IACjD,iBAAiB,CAAC,QAAgB,EAAE,KAA8B;QACtE,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACjC,OAAO,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,GAAG,QAAQ,IAAI,MAAM,GAAG,CAAC;IACpC,CAAC;CACJ"}
|
package/dist/engine/memory.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { LLMAdapter, LLMMessage, TokenUsage } from '@memoryblock/types';
|
|
2
|
-
/**
|
|
3
|
-
* Memory Manager: Implements the 80% rule.
|
|
4
|
-
* When the active session hits the threshold, the LLM summarizes its learnings
|
|
5
|
-
* into memory.md, and the session is reborn with fresh context.
|
|
6
|
-
*/
|
|
7
|
-
export declare class MemoryManager {
|
|
8
|
-
private readonly maxTokens;
|
|
9
|
-
private readonly threshold;
|
|
10
|
-
private accumulatedTokens;
|
|
11
|
-
constructor(maxContextTokens: number, thresholdPercent: number);
|
|
12
|
-
/** Track token usage from a response. */
|
|
13
|
-
trackUsage(usage: TokenUsage): void;
|
|
14
|
-
/** Check if the accumulated tokens exceed the threshold. */
|
|
15
|
-
shouldSummarize(): boolean;
|
|
16
|
-
/** Get current token count. */
|
|
17
|
-
getTokenCount(): number;
|
|
18
|
-
/** Reset token tracking after a rebirth. */
|
|
19
|
-
reset(): void;
|
|
20
|
-
/** Load the block's memory.md. */
|
|
21
|
-
loadMemory(blockPath: string): Promise<string>;
|
|
22
|
-
/**
|
|
23
|
-
* Summarize the current session and write to memory.md.
|
|
24
|
-
* Asks the LLM to distill its learnings.
|
|
25
|
-
*/
|
|
26
|
-
summarize(adapter: LLMAdapter, messages: LLMMessage[], blockPath: string): Promise<string>;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/engine/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAK7E;;;;GAIG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,iBAAiB,CAAa;gBAE1B,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAK9D,yCAAyC;IACzC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAInC,4DAA4D;IAC5D,eAAe,IAAI,OAAO;IAI1B,+BAA+B;IAC/B,aAAa,IAAI,MAAM;IAIvB,4CAA4C;IAC5C,KAAK,IAAI,IAAI;IAIb,kCAAkC;IAC5B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpD;;;OAGG;IACG,SAAS,CACX,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,UAAU,EAAE,EACtB,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;CAiCrB"}
|
package/dist/engine/memory.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { readTextSafe, atomicWrite } from '../utils/fs.js';
|
|
2
|
-
import { log } from '../utils/logger.js';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
* Memory Manager: Implements the 80% rule.
|
|
6
|
-
* When the active session hits the threshold, the LLM summarizes its learnings
|
|
7
|
-
* into memory.md, and the session is reborn with fresh context.
|
|
8
|
-
*/
|
|
9
|
-
export class MemoryManager {
|
|
10
|
-
maxTokens;
|
|
11
|
-
threshold; // 0-1
|
|
12
|
-
accumulatedTokens = 0;
|
|
13
|
-
constructor(maxContextTokens, thresholdPercent) {
|
|
14
|
-
this.maxTokens = maxContextTokens;
|
|
15
|
-
this.threshold = thresholdPercent / 100;
|
|
16
|
-
}
|
|
17
|
-
/** Track token usage from a response. */
|
|
18
|
-
trackUsage(usage) {
|
|
19
|
-
this.accumulatedTokens += usage.totalTokens;
|
|
20
|
-
}
|
|
21
|
-
/** Check if the accumulated tokens exceed the threshold. */
|
|
22
|
-
shouldSummarize() {
|
|
23
|
-
return this.accumulatedTokens >= this.maxTokens * this.threshold;
|
|
24
|
-
}
|
|
25
|
-
/** Get current token count. */
|
|
26
|
-
getTokenCount() {
|
|
27
|
-
return this.accumulatedTokens;
|
|
28
|
-
}
|
|
29
|
-
/** Reset token tracking after a rebirth. */
|
|
30
|
-
reset() {
|
|
31
|
-
this.accumulatedTokens = 0;
|
|
32
|
-
}
|
|
33
|
-
/** Load the block's memory.md. */
|
|
34
|
-
async loadMemory(blockPath) {
|
|
35
|
-
return readTextSafe(join(blockPath, 'memory.md'), '');
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Summarize the current session and write to memory.md.
|
|
39
|
-
* Asks the LLM to distill its learnings.
|
|
40
|
-
*/
|
|
41
|
-
async summarize(adapter, messages, blockPath) {
|
|
42
|
-
const summarizePrompt = [
|
|
43
|
-
{
|
|
44
|
-
role: 'system',
|
|
45
|
-
content: 'You are a memory manager. Summarize the conversation into a structured memory document. ' +
|
|
46
|
-
'Include: key decisions made, important context, current goals, progress toward those goals, ' +
|
|
47
|
-
'and what should be done next. Write in markdown format. ' +
|
|
48
|
-
'CRITICAL: Keep the summary under 1500 words. Be concise. Omit pleasantries and redundancy.',
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
role: 'user',
|
|
52
|
-
content: 'Summarize this conversation for your future self. Focus on what was accomplished, ' +
|
|
53
|
-
'key learnings, and next steps:\n\n' +
|
|
54
|
-
messages
|
|
55
|
-
.filter((m) => m.role !== 'system')
|
|
56
|
-
.map((m) => `[${m.role}]: ${(m.content || '(tool interaction)').slice(0, 300)}`)
|
|
57
|
-
.join('\n'),
|
|
58
|
-
},
|
|
59
|
-
];
|
|
60
|
-
const response = await adapter.converse(summarizePrompt);
|
|
61
|
-
const summary = response.message.content || '';
|
|
62
|
-
const memoryContent = `# Monitor Memory\n\n> Last updated: ${new Date().toISOString()}\n\n${summary}\n`;
|
|
63
|
-
await atomicWrite(join(blockPath, 'memory.md'), memoryContent);
|
|
64
|
-
log.info(`Memory summarized (${this.accumulatedTokens} tokens → rebirth)`);
|
|
65
|
-
this.reset();
|
|
66
|
-
return memoryContent;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=memory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/engine/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACL,SAAS,CAAS;IAClB,SAAS,CAAS,CAAC,MAAM;IAClC,iBAAiB,GAAW,CAAC,CAAC;IAEtC,YAAY,gBAAwB,EAAE,gBAAwB;QAC1D,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,gBAAgB,GAAG,GAAG,CAAC;IAC5C,CAAC;IAED,yCAAyC;IACzC,UAAU,CAAC,KAAiB;QACxB,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,WAAW,CAAC;IAChD,CAAC;IAED,4DAA4D;IAC5D,eAAe;QACX,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACrE,CAAC;IAED,+BAA+B;IAC/B,aAAa;QACT,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,4CAA4C;IAC5C,KAAK;QACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,UAAU,CAAC,SAAiB;QAC9B,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACX,OAAmB,EACnB,QAAsB,EACtB,SAAiB;QAEjB,MAAM,eAAe,GAAiB;YAClC;gBACI,IAAI,EAAE,QAAQ;gBACd,OAAO,EACH,0FAA0F;oBAC1F,8FAA8F;oBAC9F,0DAA0D;oBAC1D,4FAA4F;aACnG;YACD;gBACI,IAAI,EAAE,MAAM;gBACZ,OAAO,EACH,oFAAoF;oBACpF,oCAAoC;oBACpC,QAAQ;yBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;yBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;yBAC/E,IAAI,CAAC,IAAI,CAAC;aACtB;SACJ,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAE/C,MAAM,aAAa,GAAG,uCAAuC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,OAAO,IAAI,CAAC;QACxG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;QAE/D,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,iBAAiB,oBAAoB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,OAAO,aAAa,CAAC;IACzB,CAAC;CACJ"}
|
package/dist/engine/monitor.d.ts
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import type { LLMAdapter, Channel, BlockConfig, IToolRegistry } from '@memoryblock/types';
|
|
2
|
-
export interface MonitorConfig {
|
|
3
|
-
blockPath: string;
|
|
4
|
-
blockConfig: BlockConfig;
|
|
5
|
-
adapter: LLMAdapter;
|
|
6
|
-
registry: IToolRegistry;
|
|
7
|
-
channel: Channel;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* The Monitor — a block's resident intelligence.
|
|
11
|
-
*
|
|
12
|
-
* Features:
|
|
13
|
-
* - Identity (name, emoji, personality) persisted to monitor.md
|
|
14
|
-
* - Conversation logging to logs/
|
|
15
|
-
* - System-level cost tracking (no model tokens wasted)
|
|
16
|
-
* - Smart memory: saves only key context at threshold/stop
|
|
17
|
-
* - Safe-command auto-execution (lint, build, test, grep — no approval needed)
|
|
18
|
-
* - Sandbox toggle: sandbox=false gives full filesystem access
|
|
19
|
-
*/
|
|
20
|
-
export declare class Monitor {
|
|
21
|
-
private memory;
|
|
22
|
-
private gatekeeper;
|
|
23
|
-
private logger;
|
|
24
|
-
private channel;
|
|
25
|
-
private blockPath;
|
|
26
|
-
private costTracker;
|
|
27
|
-
private messages;
|
|
28
|
-
private running;
|
|
29
|
-
private toolsDiscovered;
|
|
30
|
-
private toolsUsedThisCycle;
|
|
31
|
-
private monitorName;
|
|
32
|
-
private monitorEmoji;
|
|
33
|
-
private blockConfig;
|
|
34
|
-
private adapter;
|
|
35
|
-
private registry;
|
|
36
|
-
constructor(options: {
|
|
37
|
-
blockPath: string;
|
|
38
|
-
blockConfig: BlockConfig;
|
|
39
|
-
adapter: LLMAdapter;
|
|
40
|
-
registry: IToolRegistry;
|
|
41
|
-
channel: Channel;
|
|
42
|
-
});
|
|
43
|
-
start(): Promise<void>;
|
|
44
|
-
stop(): Promise<void>;
|
|
45
|
-
private handleUserMessage;
|
|
46
|
-
private runConversationLoop;
|
|
47
|
-
/** Save smart memory — only key context, not full conversation. For session resumption. */
|
|
48
|
-
private saveSmartMemory;
|
|
49
|
-
private getSystemStatus;
|
|
50
|
-
private createBlockNatively;
|
|
51
|
-
/**
|
|
52
|
-
* Trim tool results in message history to save tokens.
|
|
53
|
-
*
|
|
54
|
-
* This is SYSTEM-LEVEL compaction — no model calls, zero extra cost.
|
|
55
|
-
* Only the internal `this.messages` array is trimmed. Full content is
|
|
56
|
-
* preserved in ConversationLogger and CLIChannel output.
|
|
57
|
-
*
|
|
58
|
-
* Rules:
|
|
59
|
-
* - list_tools_available results → "(N tools discovered)"
|
|
60
|
-
* - read_file results > 500 chars → truncated with note
|
|
61
|
-
* - search_files results > 500 chars → truncated with note
|
|
62
|
-
* - write_file / replace_in_file → kept as-is (already compact)
|
|
63
|
-
* - execute_command output > 1000 chars → truncated
|
|
64
|
-
*/
|
|
65
|
-
private trimHistory;
|
|
66
|
-
/**
|
|
67
|
-
* Save trimmed session state for resumption.
|
|
68
|
-
* If the terminal crashes or the user restarts, we can pick up
|
|
69
|
-
* from the trimmed messages rather than starting from scratch.
|
|
70
|
-
* This is separate from memory.md (which is for cross-session context).
|
|
71
|
-
*/
|
|
72
|
-
private saveSessionState;
|
|
73
|
-
/** Sync monitor identity after tool calls (since background daemons never restart natively). */
|
|
74
|
-
private syncIdentityFromFiles;
|
|
75
|
-
private dispatchToolCalls;
|
|
76
|
-
private getToolDefinitions;
|
|
77
|
-
private sendToChannel;
|
|
78
|
-
private readFile;
|
|
79
|
-
private buildSystemPrompt;
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/engine/monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EAA8B,OAAO,EAAE,WAAW,EAC5D,aAAa,EAChB,MAAM,oBAAoB,CAAC;AAuB5B,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,OAAO,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,OAAO,EAAE,UAAU,CAAC;QACpB,QAAQ,EAAE,aAAa,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;KACpB;IAsBK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAoCb,iBAAiB;YA0EjB,mBAAmB;IA2EjC,2FAA2F;YAC7E,eAAe;YAuCf,eAAe;YA8Bf,mBAAmB;IA0CjC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IA6BnB;;;;;OAKG;YACW,gBAAgB;IA0B9B,gGAAgG;YAClF,qBAAqB;YAgDrB,iBAAiB;IAoE/B,OAAO,CAAC,kBAAkB;YAmBZ,aAAa;YAoBb,QAAQ;IAQtB,OAAO,CAAC,iBAAiB;CAgD5B"}
|