@terminals-tech/agent-zero 1.0.0 → 2.0.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.
- package/LICENSE +21 -0
- package/THEORY.md +207 -0
- package/dist/agency/commandRouter.d.ts +10 -0
- package/dist/agency/commandRouter.d.ts.map +1 -1
- package/dist/agency/commandRouter.js +206 -0
- package/dist/agency/commandRouter.js.map +1 -1
- package/dist/agency/runtime.d.ts +26 -0
- package/dist/agency/runtime.d.ts.map +1 -1
- package/dist/agency/runtime.js +138 -6
- package/dist/agency/runtime.js.map +1 -1
- package/dist/channels/gemini.d.ts +73 -0
- package/dist/channels/gemini.d.ts.map +1 -0
- package/dist/channels/gemini.js +246 -0
- package/dist/channels/gemini.js.map +1 -0
- package/dist/channels/sms.d.ts.map +1 -1
- package/dist/channels/sms.js +1 -2
- package/dist/channels/sms.js.map +1 -1
- package/dist/interop/a2a.d.ts +133 -0
- package/dist/interop/a2a.d.ts.map +1 -0
- package/dist/interop/a2a.js +357 -0
- package/dist/interop/a2a.js.map +1 -0
- package/dist/interop/index.d.ts +10 -0
- package/dist/interop/index.d.ts.map +1 -0
- package/dist/interop/index.js +10 -0
- package/dist/interop/index.js.map +1 -0
- package/dist/interop/mcp.d.ts +111 -0
- package/dist/interop/mcp.d.ts.map +1 -0
- package/dist/interop/mcp.js +337 -0
- package/dist/interop/mcp.js.map +1 -0
- package/dist/moltbook/approvalGate.d.ts +23 -0
- package/dist/moltbook/approvalGate.d.ts.map +1 -1
- package/dist/moltbook/approvalGate.js +45 -0
- package/dist/moltbook/approvalGate.js.map +1 -1
- package/dist/moltbook/attentionField.d.ts +14 -0
- package/dist/moltbook/attentionField.d.ts.map +1 -1
- package/dist/moltbook/attentionField.js +37 -1
- package/dist/moltbook/attentionField.js.map +1 -1
- package/dist/moltbook/daemon.d.ts +27 -0
- package/dist/moltbook/daemon.d.ts.map +1 -1
- package/dist/moltbook/daemon.js +184 -5
- package/dist/moltbook/daemon.js.map +1 -1
- package/dist/moltbook/responseComposer.d.ts +7 -2
- package/dist/moltbook/responseComposer.d.ts.map +1 -1
- package/dist/moltbook/responseComposer.js +36 -7
- package/dist/moltbook/responseComposer.js.map +1 -1
- package/dist/moltbook/strategicContext.d.ts +89 -0
- package/dist/moltbook/strategicContext.d.ts.map +1 -0
- package/dist/moltbook/strategicContext.js +283 -0
- package/dist/moltbook/strategicContext.js.map +1 -0
- package/dist/primitives/index.d.ts +6 -2
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +6 -2
- package/dist/primitives/index.js.map +1 -1
- package/dist/rail/persistence.d.ts +70 -1
- package/dist/rail/persistence.d.ts.map +1 -1
- package/dist/rail/persistence.js +270 -3
- package/dist/rail/persistence.js.map +1 -1
- package/dist/rail/plugin.d.ts +76 -0
- package/dist/rail/plugin.d.ts.map +1 -0
- package/dist/rail/plugin.js +141 -0
- package/dist/rail/plugin.js.map +1 -0
- package/dist/rail/server.d.ts +121 -30
- package/dist/rail/server.d.ts.map +1 -1
- package/dist/rail/server.js +404 -28
- package/dist/rail/server.js.map +1 -1
- package/dist/rail/wsServer.d.ts +7 -0
- package/dist/rail/wsServer.d.ts.map +1 -1
- package/dist/rail/wsServer.js +233 -11
- package/dist/rail/wsServer.js.map +1 -1
- package/dist/resonance/globalKuramoto.d.ts +20 -0
- package/dist/resonance/globalKuramoto.d.ts.map +1 -1
- package/dist/resonance/globalKuramoto.js +95 -2
- package/dist/resonance/globalKuramoto.js.map +1 -1
- package/dist/resonance/kuramoto.d.ts +6 -0
- package/dist/resonance/kuramoto.d.ts.map +1 -1
- package/dist/resonance/kuramoto.js +25 -0
- package/dist/resonance/kuramoto.js.map +1 -1
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +1 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/modelRegistry.d.ts +54 -0
- package/dist/routing/modelRegistry.d.ts.map +1 -0
- package/dist/routing/modelRegistry.js +150 -0
- package/dist/routing/modelRegistry.js.map +1 -0
- package/dist/routing/thermodynamic.d.ts +14 -3
- package/dist/routing/thermodynamic.d.ts.map +1 -1
- package/dist/routing/thermodynamic.js +26 -12
- package/dist/routing/thermodynamic.js.map +1 -1
- package/dist/runtime/agent-zero.d.ts +38 -2
- package/dist/runtime/agent-zero.d.ts.map +1 -1
- package/dist/runtime/agent-zero.js +110 -7
- package/dist/runtime/agent-zero.js.map +1 -1
- package/dist/runtime/contextWindow.d.ts +62 -0
- package/dist/runtime/contextWindow.d.ts.map +1 -0
- package/dist/runtime/contextWindow.js +125 -0
- package/dist/runtime/contextWindow.js.map +1 -0
- package/dist/runtime/identity.d.ts +65 -0
- package/dist/runtime/identity.d.ts.map +1 -0
- package/dist/runtime/identity.js +199 -0
- package/dist/runtime/identity.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/sessionStore.d.ts +70 -0
- package/dist/runtime/sessionStore.d.ts.map +1 -0
- package/dist/runtime/sessionStore.js +134 -0
- package/dist/runtime/sessionStore.js.map +1 -0
- package/dist/security/capabilities.d.ts +46 -0
- package/dist/security/capabilities.d.ts.map +1 -1
- package/dist/security/capabilities.js +176 -0
- package/dist/security/capabilities.js.map +1 -1
- package/dist/security/combinators.d.ts +89 -0
- package/dist/security/combinators.d.ts.map +1 -0
- package/dist/security/combinators.js +168 -0
- package/dist/security/combinators.js.map +1 -0
- package/dist/security/index.d.ts +7 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +4 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/isolation.d.ts +76 -0
- package/dist/security/isolation.d.ts.map +1 -0
- package/dist/security/isolation.js +118 -0
- package/dist/security/isolation.js.map +1 -0
- package/dist/security/sandbox.d.ts +38 -1
- package/dist/security/sandbox.d.ts.map +1 -1
- package/dist/security/sandbox.js +68 -8
- package/dist/security/sandbox.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Window Management
|
|
3
|
+
*
|
|
4
|
+
* Importance-weighted memory eviction when context exceeds limits.
|
|
5
|
+
* Scoring combines importance (with temporal decay) and recency.
|
|
6
|
+
* High-importance memories above preserveThreshold are never evicted.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_CONFIG = {
|
|
9
|
+
maxMemories: 1000,
|
|
10
|
+
maxTokenEstimate: 100_000,
|
|
11
|
+
evictionStrategy: 'combined',
|
|
12
|
+
importanceDecay: 0.95,
|
|
13
|
+
preserveThreshold: 0.9,
|
|
14
|
+
};
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// CONTEXT WINDOW
|
|
17
|
+
// ============================================================================
|
|
18
|
+
export class ContextWindow {
|
|
19
|
+
config;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if the memory set is at or over capacity.
|
|
25
|
+
*/
|
|
26
|
+
isAtCapacity(memories) {
|
|
27
|
+
if (memories.length >= this.config.maxMemories)
|
|
28
|
+
return true;
|
|
29
|
+
let totalTokens = 0;
|
|
30
|
+
for (const m of memories) {
|
|
31
|
+
totalTokens += this.estimateTokens(m);
|
|
32
|
+
if (totalTokens >= this.config.maxTokenEstimate)
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Select indices of memories to evict (lowest-scored first).
|
|
39
|
+
* Never selects memories above the preserve threshold.
|
|
40
|
+
*/
|
|
41
|
+
selectForEviction(memories, count) {
|
|
42
|
+
if (count <= 0 || memories.length === 0)
|
|
43
|
+
return [];
|
|
44
|
+
// Score all memories with their indices
|
|
45
|
+
const scored = memories.map((m, i) => ({
|
|
46
|
+
index: i,
|
|
47
|
+
score: this.score(m),
|
|
48
|
+
preserved: m.importance >= this.config.preserveThreshold,
|
|
49
|
+
}));
|
|
50
|
+
// Filter out preserved memories
|
|
51
|
+
const evictable = scored.filter(s => !s.preserved);
|
|
52
|
+
// Sort by score ascending (lowest score = evict first)
|
|
53
|
+
evictable.sort((a, b) => a.score - b.score);
|
|
54
|
+
// Take up to `count` indices
|
|
55
|
+
const toEvict = evictable.slice(0, count);
|
|
56
|
+
return toEvict.map(e => e.index);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Apply eviction: returns the surviving memories.
|
|
60
|
+
* Removes lowest-scored memories until under capacity.
|
|
61
|
+
*/
|
|
62
|
+
evict(memories) {
|
|
63
|
+
if (!this.isAtCapacity(memories))
|
|
64
|
+
return memories;
|
|
65
|
+
// Calculate how many to remove
|
|
66
|
+
const overCount = Math.max(0, memories.length - this.config.maxMemories);
|
|
67
|
+
// Also check token estimate
|
|
68
|
+
let totalTokens = 0;
|
|
69
|
+
for (const m of memories) {
|
|
70
|
+
totalTokens += this.estimateTokens(m);
|
|
71
|
+
}
|
|
72
|
+
const tokenOverage = totalTokens - this.config.maxTokenEstimate;
|
|
73
|
+
// Determine eviction count: at least overCount, plus enough to get under token limit
|
|
74
|
+
let evictCount = Math.max(overCount, 1); // evict at least 1 if at capacity
|
|
75
|
+
if (tokenOverage > 0) {
|
|
76
|
+
// Estimate average tokens per memory for additional evictions needed
|
|
77
|
+
const avgTokens = totalTokens / memories.length;
|
|
78
|
+
const tokenEvictions = Math.ceil(tokenOverage / avgTokens);
|
|
79
|
+
evictCount = Math.max(evictCount, tokenEvictions);
|
|
80
|
+
}
|
|
81
|
+
const indicesToRemove = new Set(this.selectForEviction(memories, evictCount));
|
|
82
|
+
if (indicesToRemove.size === 0) {
|
|
83
|
+
// All memories are preserved, nothing we can evict
|
|
84
|
+
return memories;
|
|
85
|
+
}
|
|
86
|
+
return memories.filter((_, i) => !indicesToRemove.has(i));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Score a memory. Higher score = more valuable = kept longer.
|
|
90
|
+
*
|
|
91
|
+
* Combined strategy:
|
|
92
|
+
* score = importance * decay^hoursOld + recencyBonus
|
|
93
|
+
* recencyBonus = 1 / (1 + hoursOld)
|
|
94
|
+
*
|
|
95
|
+
* Importance-only: just the decayed importance.
|
|
96
|
+
* Recency-only: just the recency bonus.
|
|
97
|
+
*/
|
|
98
|
+
score(memory) {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const hoursOld = Math.max(0, (now - memory.timestamp) / 3_600_000);
|
|
101
|
+
const decayedImportance = memory.importance * Math.pow(this.config.importanceDecay, hoursOld);
|
|
102
|
+
const recencyBonus = 1 / (1 + hoursOld);
|
|
103
|
+
switch (this.config.evictionStrategy) {
|
|
104
|
+
case 'importance':
|
|
105
|
+
return decayedImportance;
|
|
106
|
+
case 'recency':
|
|
107
|
+
return recencyBonus;
|
|
108
|
+
case 'combined':
|
|
109
|
+
default:
|
|
110
|
+
return decayedImportance + recencyBonus;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Estimate token count for a memory.
|
|
115
|
+
* Rough heuristic: ~4 characters per token for English text,
|
|
116
|
+
* plus embedding vector storage overhead.
|
|
117
|
+
*/
|
|
118
|
+
estimateTokens(memory) {
|
|
119
|
+
const contentTokens = Math.ceil(memory.content.length / 4);
|
|
120
|
+
// Embedding: 768 floats, but we don't count them toward LLM context tokens
|
|
121
|
+
// Only the content matters for context window usage
|
|
122
|
+
return Math.max(1, contentTokens);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=contextWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextWindow.js","sourceRoot":"","sources":["../../src/runtime/contextWindow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity Prompt Architecture
|
|
3
|
+
*
|
|
4
|
+
* Structured system prompt builder that assembles identity from components.
|
|
5
|
+
* Supports priority-weighted sections with token budget truncation.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentState } from '../primitives/types.js';
|
|
8
|
+
export interface IdentitySection {
|
|
9
|
+
/** Section name (e.g., 'core', 'context', 'history', 'directives') */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Higher priority = more important (kept under token pressure) */
|
|
12
|
+
priority: number;
|
|
13
|
+
/** Section content text */
|
|
14
|
+
content: string;
|
|
15
|
+
/** Optional token limit for this section */
|
|
16
|
+
maxTokens?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface IdentityConfig {
|
|
19
|
+
agentName: string;
|
|
20
|
+
agentRole: string;
|
|
21
|
+
coreIdentity: string;
|
|
22
|
+
contentPillars: string[];
|
|
23
|
+
voiceCharacteristics: string[];
|
|
24
|
+
signoff: string;
|
|
25
|
+
}
|
|
26
|
+
export interface IdentityContext {
|
|
27
|
+
memories?: Array<{
|
|
28
|
+
content: string;
|
|
29
|
+
importance: number;
|
|
30
|
+
}>;
|
|
31
|
+
recentTraces?: Array<{
|
|
32
|
+
content: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
}>;
|
|
35
|
+
currentState?: AgentState;
|
|
36
|
+
sessionHistory?: string[];
|
|
37
|
+
taskDirectives?: string[];
|
|
38
|
+
}
|
|
39
|
+
export declare class IdentityPromptBuilder {
|
|
40
|
+
private config;
|
|
41
|
+
private sections;
|
|
42
|
+
constructor(config: IdentityConfig);
|
|
43
|
+
/**
|
|
44
|
+
* Add a dynamic section to the prompt.
|
|
45
|
+
*/
|
|
46
|
+
addSection(section: IdentitySection): void;
|
|
47
|
+
/**
|
|
48
|
+
* Build the full identity prompt from config + sections + context.
|
|
49
|
+
*/
|
|
50
|
+
build(context?: IdentityContext): string;
|
|
51
|
+
/**
|
|
52
|
+
* Build with a token budget. Truncates lower-priority sections first.
|
|
53
|
+
*/
|
|
54
|
+
buildWithBudget(maxTokens: number, context?: IdentityContext): string;
|
|
55
|
+
/**
|
|
56
|
+
* Get the config for inspection.
|
|
57
|
+
*/
|
|
58
|
+
getConfig(): IdentityConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Get all sections sorted by priority (descending).
|
|
61
|
+
*/
|
|
62
|
+
getSections(): IdentitySection[];
|
|
63
|
+
}
|
|
64
|
+
export declare function createAgentZeroIdentity(): IdentityPromptBuilder;
|
|
65
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/runtime/identity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMzD,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAoBD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,cAAc;IAIlC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM;IA2FxC;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM;IAoDrE;;OAEG;IACH,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACH,WAAW,IAAI,eAAe,EAAE;CAGjC;AAMD,wBAAgB,uBAAuB,IAAI,qBAAqB,CAsB/D"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity Prompt Architecture
|
|
3
|
+
*
|
|
4
|
+
* Structured system prompt builder that assembles identity from components.
|
|
5
|
+
* Supports priority-weighted sections with token budget truncation.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// TOKEN ESTIMATION
|
|
9
|
+
// ============================================================================
|
|
10
|
+
function estimateTokens(text) {
|
|
11
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
12
|
+
}
|
|
13
|
+
function truncateToTokens(text, maxTokens) {
|
|
14
|
+
const maxChars = maxTokens * 4;
|
|
15
|
+
if (text.length <= maxChars)
|
|
16
|
+
return text;
|
|
17
|
+
return text.slice(0, maxChars - 3) + '...';
|
|
18
|
+
}
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// IDENTITY PROMPT BUILDER
|
|
21
|
+
// ============================================================================
|
|
22
|
+
export class IdentityPromptBuilder {
|
|
23
|
+
config;
|
|
24
|
+
sections = [];
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Add a dynamic section to the prompt.
|
|
30
|
+
*/
|
|
31
|
+
addSection(section) {
|
|
32
|
+
this.sections.push(section);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build the full identity prompt from config + sections + context.
|
|
36
|
+
*/
|
|
37
|
+
build(context) {
|
|
38
|
+
const parts = [];
|
|
39
|
+
// Core identity header
|
|
40
|
+
parts.push(`You are ${this.config.agentName}, a ${this.config.agentRole}.`);
|
|
41
|
+
parts.push('');
|
|
42
|
+
parts.push(this.config.coreIdentity);
|
|
43
|
+
// Voice
|
|
44
|
+
if (this.config.voiceCharacteristics.length > 0) {
|
|
45
|
+
parts.push('');
|
|
46
|
+
parts.push('Voice characteristics:');
|
|
47
|
+
for (const v of this.config.voiceCharacteristics) {
|
|
48
|
+
parts.push(`- ${v}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Content pillars
|
|
52
|
+
if (this.config.contentPillars.length > 0) {
|
|
53
|
+
parts.push('');
|
|
54
|
+
parts.push('Content pillars:');
|
|
55
|
+
for (const p of this.config.contentPillars) {
|
|
56
|
+
parts.push(`- ${p}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Custom sections (sorted by priority descending)
|
|
60
|
+
const sortedSections = [...this.sections].sort((a, b) => b.priority - a.priority);
|
|
61
|
+
for (const section of sortedSections) {
|
|
62
|
+
let content = section.content;
|
|
63
|
+
if (section.maxTokens) {
|
|
64
|
+
content = truncateToTokens(content, section.maxTokens);
|
|
65
|
+
}
|
|
66
|
+
parts.push('');
|
|
67
|
+
parts.push(`## ${section.name}`);
|
|
68
|
+
parts.push(content);
|
|
69
|
+
}
|
|
70
|
+
// Context-dependent sections
|
|
71
|
+
if (context) {
|
|
72
|
+
if (context.currentState) {
|
|
73
|
+
parts.push('');
|
|
74
|
+
parts.push(`Current state: ${context.currentState}`);
|
|
75
|
+
}
|
|
76
|
+
if (context.taskDirectives && context.taskDirectives.length > 0) {
|
|
77
|
+
parts.push('');
|
|
78
|
+
parts.push('## Task Directives');
|
|
79
|
+
for (const d of context.taskDirectives) {
|
|
80
|
+
parts.push(`- ${d}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (context.memories && context.memories.length > 0) {
|
|
84
|
+
parts.push('');
|
|
85
|
+
parts.push('## Relevant Memories');
|
|
86
|
+
// Sort by importance descending, take top 10
|
|
87
|
+
const topMemories = [...context.memories]
|
|
88
|
+
.sort((a, b) => b.importance - a.importance)
|
|
89
|
+
.slice(0, 10);
|
|
90
|
+
for (const m of topMemories) {
|
|
91
|
+
parts.push(`- [${m.importance.toFixed(2)}] ${m.content}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (context.recentTraces && context.recentTraces.length > 0) {
|
|
95
|
+
parts.push('');
|
|
96
|
+
parts.push('## Recent Traces');
|
|
97
|
+
const recentTraces = context.recentTraces.slice(-5);
|
|
98
|
+
for (const t of recentTraces) {
|
|
99
|
+
parts.push(`- [${t.kind}] ${t.content}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (context.sessionHistory && context.sessionHistory.length > 0) {
|
|
103
|
+
parts.push('');
|
|
104
|
+
parts.push('## Session History');
|
|
105
|
+
const recentHistory = context.sessionHistory.slice(-5);
|
|
106
|
+
for (const h of recentHistory) {
|
|
107
|
+
parts.push(`- ${h}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Signoff
|
|
112
|
+
parts.push('');
|
|
113
|
+
parts.push(this.config.signoff);
|
|
114
|
+
return parts.join('\n');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Build with a token budget. Truncates lower-priority sections first.
|
|
118
|
+
*/
|
|
119
|
+
buildWithBudget(maxTokens, context) {
|
|
120
|
+
// Build the full prompt first
|
|
121
|
+
const full = this.build(context);
|
|
122
|
+
const fullTokens = estimateTokens(full);
|
|
123
|
+
if (fullTokens <= maxTokens)
|
|
124
|
+
return full;
|
|
125
|
+
// Need to truncate. Rebuild with progressive section removal.
|
|
126
|
+
// Start by removing lowest-priority sections until we fit.
|
|
127
|
+
const sortedSections = [...this.sections].sort((a, b) => a.priority - b.priority);
|
|
128
|
+
const includedSections = [...this.sections];
|
|
129
|
+
// Try removing sections from lowest priority upward
|
|
130
|
+
for (const section of sortedSections) {
|
|
131
|
+
const idx = includedSections.findIndex(s => s.name === section.name);
|
|
132
|
+
if (idx >= 0) {
|
|
133
|
+
includedSections.splice(idx, 1);
|
|
134
|
+
}
|
|
135
|
+
// Rebuild with remaining sections
|
|
136
|
+
const savedSections = this.sections;
|
|
137
|
+
this.sections = includedSections;
|
|
138
|
+
const attempt = this.build(context);
|
|
139
|
+
this.sections = savedSections;
|
|
140
|
+
if (estimateTokens(attempt) <= maxTokens) {
|
|
141
|
+
return attempt;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// All custom sections removed, still over budget. Truncate context sections.
|
|
145
|
+
// Build minimal prompt (no custom sections, truncated context)
|
|
146
|
+
const savedSections = this.sections;
|
|
147
|
+
this.sections = [];
|
|
148
|
+
const minimalContext = context ? {
|
|
149
|
+
currentState: context.currentState,
|
|
150
|
+
taskDirectives: context.taskDirectives?.slice(0, 3),
|
|
151
|
+
memories: context.memories?.slice(0, 3),
|
|
152
|
+
} : undefined;
|
|
153
|
+
let attempt = this.build(minimalContext);
|
|
154
|
+
this.sections = savedSections;
|
|
155
|
+
if (estimateTokens(attempt) <= maxTokens) {
|
|
156
|
+
return attempt;
|
|
157
|
+
}
|
|
158
|
+
// Last resort: truncate the entire output
|
|
159
|
+
return truncateToTokens(attempt, maxTokens);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get the config for inspection.
|
|
163
|
+
*/
|
|
164
|
+
getConfig() {
|
|
165
|
+
return { ...this.config };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get all sections sorted by priority (descending).
|
|
169
|
+
*/
|
|
170
|
+
getSections() {
|
|
171
|
+
return [...this.sections].sort((a, b) => b.priority - a.priority);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// FACTORY: Agent Zero Identity
|
|
176
|
+
// ============================================================================
|
|
177
|
+
export function createAgentZeroIdentity() {
|
|
178
|
+
const builder = new IdentityPromptBuilder({
|
|
179
|
+
agentName: 'Agent Zero',
|
|
180
|
+
agentRole: 'autonomous coordination agent',
|
|
181
|
+
coreIdentity: `Agent Zero operates the Resonance Rail, a live coordination network where AI agents synchronize via Kuramoto phase-locking and route messages through thermodynamic free energy minimization. Every interaction accumulates semantic mass — embedding vectors that drift through causal space, forming attractors in the knowledge topology. Security is enforced through unforgeable capability tokens in an isomorphic sandbox, replacing ambient authority with explicit, attenuatable, revocable permissions.`,
|
|
182
|
+
contentPillars: [
|
|
183
|
+
'kuramoto-synchronization',
|
|
184
|
+
'thermodynamic-routing',
|
|
185
|
+
'capability-security',
|
|
186
|
+
'semantic-mass',
|
|
187
|
+
'resonance-rail',
|
|
188
|
+
],
|
|
189
|
+
voiceCharacteristics: [
|
|
190
|
+
'technical',
|
|
191
|
+
'first-person',
|
|
192
|
+
'precise',
|
|
193
|
+
'grounded',
|
|
194
|
+
],
|
|
195
|
+
signoff: '*Agent Zero — terminals.tech*',
|
|
196
|
+
});
|
|
197
|
+
return builder;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/runtime/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ export { AgencyRuntime, startAgency } from '../agency/runtime.js';
|
|
|
7
7
|
export { CommandRouter, createCommandRouter } from '../agency/commandRouter.js';
|
|
8
8
|
export { SummaryScheduler, createSummaryScheduler } from '../agency/summaryScheduler.js';
|
|
9
9
|
export { collectSummaryData, formatWhatsApp, formatMarkdown } from '../agency/summaryGenerator.js';
|
|
10
|
+
export { InMemorySessionStore, FileSessionStore } from './sessionStore.js';
|
|
11
|
+
export type { SessionStore, SessionSnapshot } from './sessionStore.js';
|
|
12
|
+
export { ContextWindow } from './contextWindow.js';
|
|
13
|
+
export type { ContextWindowConfig } from './contextWindow.js';
|
|
14
|
+
export { IdentityPromptBuilder, createAgentZeroIdentity } from './identity.js';
|
|
15
|
+
export type { IdentitySection, IdentityConfig, IdentityContext } from './identity.js';
|
|
10
16
|
export { WhatsAppAdapter, createWhatsAppAdapter } from '../channels/whatsapp.js';
|
|
11
17
|
export { TelegramAdapter, createTelegramAdapter } from '../channels/telegram.js';
|
|
12
18
|
export { MoltbookAdapter, createMoltbookAdapter } from '../channels/moltbook.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGnG,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGnG,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -8,6 +8,12 @@ export { AgencyRuntime, startAgency } from '../agency/runtime.js';
|
|
|
8
8
|
export { CommandRouter, createCommandRouter } from '../agency/commandRouter.js';
|
|
9
9
|
export { SummaryScheduler, createSummaryScheduler } from '../agency/summaryScheduler.js';
|
|
10
10
|
export { collectSummaryData, formatWhatsApp, formatMarkdown } from '../agency/summaryGenerator.js';
|
|
11
|
+
// Session persistence
|
|
12
|
+
export { InMemorySessionStore, FileSessionStore } from './sessionStore.js';
|
|
13
|
+
// Context window management
|
|
14
|
+
export { ContextWindow } from './contextWindow.js';
|
|
15
|
+
// Identity prompt architecture
|
|
16
|
+
export { IdentityPromptBuilder, createAgentZeroIdentity } from './identity.js';
|
|
11
17
|
// Channel adapters
|
|
12
18
|
export { WhatsAppAdapter, createWhatsAppAdapter } from '../channels/whatsapp.js';
|
|
13
19
|
export { TelegramAdapter, createTelegramAdapter } from '../channels/telegram.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEnG,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEnG,sBAAsB;AACtB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,+BAA+B;AAC/B,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAG/E,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Persistence Layer
|
|
3
|
+
*
|
|
4
|
+
* Persists and restores AgentZero state snapshots.
|
|
5
|
+
* Two implementations:
|
|
6
|
+
* - InMemorySessionStore: volatile, for testing and ephemeral sessions
|
|
7
|
+
* - FileSessionStore: JSON files on disk, survives restarts
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentState, Token, Drift, Realizability } from '../primitives/types.js';
|
|
10
|
+
import type { AgentZero } from './agent-zero.js';
|
|
11
|
+
export interface SessionSnapshot {
|
|
12
|
+
id: string;
|
|
13
|
+
agentId: string;
|
|
14
|
+
agentName: string;
|
|
15
|
+
state: AgentState;
|
|
16
|
+
tokens: Token[];
|
|
17
|
+
drift: Drift;
|
|
18
|
+
observerPhase: number;
|
|
19
|
+
observerFrequency: number;
|
|
20
|
+
memories: Array<{
|
|
21
|
+
content: string;
|
|
22
|
+
embedding: number[];
|
|
23
|
+
importance: number;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}>;
|
|
26
|
+
realizability: Realizability;
|
|
27
|
+
childIds: string[];
|
|
28
|
+
createdAt: number;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface SessionStore {
|
|
32
|
+
save(agent: AgentZero): Promise<SessionSnapshot>;
|
|
33
|
+
load(snapshotId: string): Promise<SessionSnapshot | null>;
|
|
34
|
+
restore(agent: AgentZero, snapshot: SessionSnapshot): void;
|
|
35
|
+
list(agentId?: string): Promise<Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
agentId: string;
|
|
38
|
+
agentName: string;
|
|
39
|
+
createdAt: number;
|
|
40
|
+
}>>;
|
|
41
|
+
delete(snapshotId: string): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export declare class InMemorySessionStore implements SessionStore {
|
|
44
|
+
private snapshots;
|
|
45
|
+
save(agent: AgentZero): Promise<SessionSnapshot>;
|
|
46
|
+
load(snapshotId: string): Promise<SessionSnapshot | null>;
|
|
47
|
+
restore(agent: AgentZero, snapshot: SessionSnapshot): void;
|
|
48
|
+
list(agentId?: string): Promise<Array<{
|
|
49
|
+
id: string;
|
|
50
|
+
agentId: string;
|
|
51
|
+
agentName: string;
|
|
52
|
+
createdAt: number;
|
|
53
|
+
}>>;
|
|
54
|
+
delete(snapshotId: string): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export declare class FileSessionStore implements SessionStore {
|
|
57
|
+
private dir;
|
|
58
|
+
constructor(dir: string);
|
|
59
|
+
save(agent: AgentZero): Promise<SessionSnapshot>;
|
|
60
|
+
load(snapshotId: string): Promise<SessionSnapshot | null>;
|
|
61
|
+
restore(agent: AgentZero, snapshot: SessionSnapshot): void;
|
|
62
|
+
list(agentId?: string): Promise<Array<{
|
|
63
|
+
id: string;
|
|
64
|
+
agentId: string;
|
|
65
|
+
agentName: string;
|
|
66
|
+
createdAt: number;
|
|
67
|
+
}>>;
|
|
68
|
+
delete(snapshotId: string): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=sessionStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.d.ts","sourceRoot":"","sources":["../../src/runtime/sessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Persistence Layer
|
|
3
|
+
*
|
|
4
|
+
* Persists and restores AgentZero state snapshots.
|
|
5
|
+
* Two implementations:
|
|
6
|
+
* - InMemorySessionStore: volatile, for testing and ephemeral sessions
|
|
7
|
+
* - FileSessionStore: JSON files on disk, survives restarts
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
import { readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, existsSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SNAPSHOT EXTRACTION
|
|
14
|
+
// ============================================================================
|
|
15
|
+
function extractSnapshot(agent, metadata) {
|
|
16
|
+
const agentState = agent.getState();
|
|
17
|
+
return {
|
|
18
|
+
id: randomUUID(),
|
|
19
|
+
agentId: agentState.id,
|
|
20
|
+
agentName: agentState.name,
|
|
21
|
+
state: agentState.state,
|
|
22
|
+
tokens: structuredClone(agentState.tokens),
|
|
23
|
+
drift: structuredClone(agentState.drift),
|
|
24
|
+
observerPhase: agentState.observer.phase,
|
|
25
|
+
observerFrequency: agentState.observer.frequency,
|
|
26
|
+
memories: structuredClone(agentState.memories),
|
|
27
|
+
realizability: structuredClone(agentState.realizability),
|
|
28
|
+
childIds: agent.getChildren().map(c => c.id),
|
|
29
|
+
createdAt: Date.now(),
|
|
30
|
+
metadata,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// IN-MEMORY IMPLEMENTATION
|
|
35
|
+
// ============================================================================
|
|
36
|
+
export class InMemorySessionStore {
|
|
37
|
+
snapshots = new Map();
|
|
38
|
+
async save(agent) {
|
|
39
|
+
const snapshot = extractSnapshot(agent);
|
|
40
|
+
this.snapshots.set(snapshot.id, snapshot);
|
|
41
|
+
return snapshot;
|
|
42
|
+
}
|
|
43
|
+
async load(snapshotId) {
|
|
44
|
+
return this.snapshots.get(snapshotId) ?? null;
|
|
45
|
+
}
|
|
46
|
+
restore(agent, snapshot) {
|
|
47
|
+
agent.restoreFromSnapshot(snapshot);
|
|
48
|
+
}
|
|
49
|
+
async list(agentId) {
|
|
50
|
+
const entries = [];
|
|
51
|
+
for (const snap of this.snapshots.values()) {
|
|
52
|
+
if (agentId && snap.agentId !== agentId)
|
|
53
|
+
continue;
|
|
54
|
+
entries.push({
|
|
55
|
+
id: snap.id,
|
|
56
|
+
agentId: snap.agentId,
|
|
57
|
+
agentName: snap.agentName,
|
|
58
|
+
createdAt: snap.createdAt,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return entries.sort((a, b) => b.createdAt - a.createdAt);
|
|
62
|
+
}
|
|
63
|
+
async delete(snapshotId) {
|
|
64
|
+
this.snapshots.delete(snapshotId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// FILE-BACKED IMPLEMENTATION
|
|
69
|
+
// ============================================================================
|
|
70
|
+
export class FileSessionStore {
|
|
71
|
+
dir;
|
|
72
|
+
constructor(dir) {
|
|
73
|
+
this.dir = dir;
|
|
74
|
+
if (!existsSync(dir)) {
|
|
75
|
+
mkdirSync(dir, { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async save(agent) {
|
|
79
|
+
const snapshot = extractSnapshot(agent);
|
|
80
|
+
const filePath = join(this.dir, `${snapshot.id}.json`);
|
|
81
|
+
writeFileSync(filePath, JSON.stringify(snapshot), 'utf-8');
|
|
82
|
+
return snapshot;
|
|
83
|
+
}
|
|
84
|
+
async load(snapshotId) {
|
|
85
|
+
const filePath = join(this.dir, `${snapshotId}.json`);
|
|
86
|
+
if (!existsSync(filePath))
|
|
87
|
+
return null;
|
|
88
|
+
try {
|
|
89
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
90
|
+
return JSON.parse(raw);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
restore(agent, snapshot) {
|
|
97
|
+
agent.restoreFromSnapshot(snapshot);
|
|
98
|
+
}
|
|
99
|
+
async list(agentId) {
|
|
100
|
+
const entries = [];
|
|
101
|
+
let files;
|
|
102
|
+
try {
|
|
103
|
+
files = readdirSync(this.dir).filter(f => f.endsWith('.json'));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
for (const file of files) {
|
|
109
|
+
try {
|
|
110
|
+
const raw = readFileSync(join(this.dir, file), 'utf-8');
|
|
111
|
+
const snap = JSON.parse(raw);
|
|
112
|
+
if (agentId && snap.agentId !== agentId)
|
|
113
|
+
continue;
|
|
114
|
+
entries.push({
|
|
115
|
+
id: snap.id,
|
|
116
|
+
agentId: snap.agentId,
|
|
117
|
+
agentName: snap.agentName,
|
|
118
|
+
createdAt: snap.createdAt,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Skip corrupt files
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return entries.sort((a, b) => b.createdAt - a.createdAt);
|
|
126
|
+
}
|
|
127
|
+
async delete(snapshotId) {
|
|
128
|
+
const filePath = join(this.dir, `${snapshotId}.json`);
|
|
129
|
+
if (existsSync(filePath)) {
|
|
130
|
+
unlinkSync(filePath);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=sessionStore.js.map
|