sentinel-agentos 0.3.8 → 0.3.10
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/README.md +1797 -0
- package/dist/adapters/evaluation-bridge.d.ts +78 -0
- package/dist/adapters/evaluation-bridge.d.ts.map +1 -0
- package/dist/adapters/evaluation-bridge.js +273 -0
- package/dist/adapters/evaluation-bridge.js.map +1 -0
- package/dist/adapters/memory-bridge.d.ts +110 -0
- package/dist/adapters/memory-bridge.d.ts.map +1 -0
- package/dist/adapters/memory-bridge.js +316 -0
- package/dist/adapters/memory-bridge.js.map +1 -0
- package/dist/adapters/migrate.d.ts +2 -0
- package/dist/adapters/migrate.d.ts.map +1 -0
- package/dist/adapters/migrate.js +63 -0
- package/dist/adapters/migrate.js.map +1 -0
- package/dist/api.d.ts +151 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +179 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +350 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +156 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +400 -0
- package/dist/core.js.map +1 -0
- package/dist/evaluator/exec-evaluator.d.ts +102 -0
- package/dist/evaluator/exec-evaluator.d.ts.map +1 -0
- package/dist/evaluator/exec-evaluator.js +266 -0
- package/dist/evaluator/exec-evaluator.js.map +1 -0
- package/dist/evaluator/feedback.d.ts +102 -0
- package/dist/evaluator/feedback.d.ts.map +1 -0
- package/dist/evaluator/feedback.js +478 -0
- package/dist/evaluator/feedback.js.map +1 -0
- package/dist/evaluator/profiler.d.ts +56 -0
- package/dist/evaluator/profiler.d.ts.map +1 -0
- package/dist/evaluator/profiler.js +140 -0
- package/dist/evaluator/profiler.js.map +1 -0
- package/dist/guard/audit-log.d.ts +48 -0
- package/dist/guard/audit-log.d.ts.map +1 -0
- package/dist/guard/audit-log.js +213 -0
- package/dist/guard/audit-log.js.map +1 -0
- package/dist/guard/container-sandbox.d.ts +25 -0
- package/dist/guard/container-sandbox.d.ts.map +1 -0
- package/dist/guard/container-sandbox.js +145 -0
- package/dist/guard/container-sandbox.js.map +1 -0
- package/dist/guard/risk-gate.d.ts +101 -0
- package/dist/guard/risk-gate.d.ts.map +1 -0
- package/dist/guard/risk-gate.js +200 -0
- package/dist/guard/risk-gate.js.map +1 -0
- package/dist/guard/sandbox.d.ts +112 -0
- package/dist/guard/sandbox.d.ts.map +1 -0
- package/dist/guard/sandbox.js +379 -0
- package/dist/guard/sandbox.js.map +1 -0
- package/dist/guard/schema-gate.d.ts +90 -0
- package/dist/guard/schema-gate.d.ts.map +1 -0
- package/dist/guard/schema-gate.js +452 -0
- package/dist/guard/schema-gate.js.map +1 -0
- package/dist/guard/snapshot-verify.d.ts +111 -0
- package/dist/guard/snapshot-verify.d.ts.map +1 -0
- package/dist/guard/snapshot-verify.js +571 -0
- package/dist/guard/snapshot-verify.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/episodic.d.ts +80 -0
- package/dist/memory/episodic.d.ts.map +1 -0
- package/dist/memory/episodic.js +305 -0
- package/dist/memory/episodic.js.map +1 -0
- package/dist/memory/semantic.d.ts +68 -0
- package/dist/memory/semantic.d.ts.map +1 -0
- package/dist/memory/semantic.js +299 -0
- package/dist/memory/semantic.js.map +1 -0
- package/dist/memory/working.d.ts +53 -0
- package/dist/memory/working.d.ts.map +1 -0
- package/dist/memory/working.js +166 -0
- package/dist/memory/working.js.map +1 -0
- package/dist/middleware/openclaw.d.ts +45 -0
- package/dist/middleware/openclaw.d.ts.map +1 -0
- package/dist/middleware/openclaw.js +95 -0
- package/dist/middleware/openclaw.js.map +1 -0
- package/dist/middleware/wrapper.d.ts +54 -0
- package/dist/middleware/wrapper.d.ts.map +1 -0
- package/dist/middleware/wrapper.js +155 -0
- package/dist/middleware/wrapper.js.map +1 -0
- package/dist/server.d.ts +45 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +256 -0
- package/dist/server.js.map +1 -0
- package/dist/src/dashboard.html +9 -7
- package/dist/types/index.d.ts +228 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
- package/scripts/sentinel-light.js +234 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.sentinelPlugin = exports.wrapAgent = exports.createServer = exports.AgentOSAPI = exports.AgentProfiler = exports.ImplicitFeedbackEngine = exports.PostExecEvaluator = exports.RuntimeEvaluator = exports.PreExecEvaluator = exports.SemanticMemoryStore = exports.EpisodicMemory = exports.WorkingMemory = exports.SandboxViolation = exports.SandboxExecutor = exports.AuditLog = exports.VerifyGate = exports.SnapshotGate = exports.DEFAULT_RISK_THRESHOLDS = exports.RiskGate = exports.SchemaGate = exports.AgentOS = void 0;
|
|
18
|
+
var core_1 = require("./core");
|
|
19
|
+
Object.defineProperty(exports, "AgentOS", { enumerable: true, get: function () { return core_1.AgentOS; } });
|
|
20
|
+
__exportStar(require("./types"), exports);
|
|
21
|
+
var schema_gate_1 = require("./guard/schema-gate");
|
|
22
|
+
Object.defineProperty(exports, "SchemaGate", { enumerable: true, get: function () { return schema_gate_1.SchemaGate; } });
|
|
23
|
+
var risk_gate_1 = require("./guard/risk-gate");
|
|
24
|
+
Object.defineProperty(exports, "RiskGate", { enumerable: true, get: function () { return risk_gate_1.RiskGate; } });
|
|
25
|
+
var risk_gate_2 = require("./guard/risk-gate");
|
|
26
|
+
Object.defineProperty(exports, "DEFAULT_RISK_THRESHOLDS", { enumerable: true, get: function () { return risk_gate_2.DEFAULT_RISK_THRESHOLDS; } });
|
|
27
|
+
var snapshot_verify_1 = require("./guard/snapshot-verify");
|
|
28
|
+
Object.defineProperty(exports, "SnapshotGate", { enumerable: true, get: function () { return snapshot_verify_1.SnapshotGate; } });
|
|
29
|
+
Object.defineProperty(exports, "VerifyGate", { enumerable: true, get: function () { return snapshot_verify_1.VerifyGate; } });
|
|
30
|
+
var audit_log_1 = require("./guard/audit-log");
|
|
31
|
+
Object.defineProperty(exports, "AuditLog", { enumerable: true, get: function () { return audit_log_1.AuditLog; } });
|
|
32
|
+
var sandbox_1 = require("./guard/sandbox");
|
|
33
|
+
Object.defineProperty(exports, "SandboxExecutor", { enumerable: true, get: function () { return sandbox_1.SandboxExecutor; } });
|
|
34
|
+
var sandbox_2 = require("./guard/sandbox");
|
|
35
|
+
Object.defineProperty(exports, "SandboxViolation", { enumerable: true, get: function () { return sandbox_2.SandboxViolation; } });
|
|
36
|
+
var working_1 = require("./memory/working");
|
|
37
|
+
Object.defineProperty(exports, "WorkingMemory", { enumerable: true, get: function () { return working_1.WorkingMemory; } });
|
|
38
|
+
var episodic_1 = require("./memory/episodic");
|
|
39
|
+
Object.defineProperty(exports, "EpisodicMemory", { enumerable: true, get: function () { return episodic_1.EpisodicMemory; } });
|
|
40
|
+
var semantic_1 = require("./memory/semantic");
|
|
41
|
+
Object.defineProperty(exports, "SemanticMemoryStore", { enumerable: true, get: function () { return semantic_1.SemanticMemoryStore; } });
|
|
42
|
+
var exec_evaluator_1 = require("./evaluator/exec-evaluator");
|
|
43
|
+
Object.defineProperty(exports, "PreExecEvaluator", { enumerable: true, get: function () { return exec_evaluator_1.PreExecEvaluator; } });
|
|
44
|
+
Object.defineProperty(exports, "RuntimeEvaluator", { enumerable: true, get: function () { return exec_evaluator_1.RuntimeEvaluator; } });
|
|
45
|
+
Object.defineProperty(exports, "PostExecEvaluator", { enumerable: true, get: function () { return exec_evaluator_1.PostExecEvaluator; } });
|
|
46
|
+
var feedback_1 = require("./evaluator/feedback");
|
|
47
|
+
Object.defineProperty(exports, "ImplicitFeedbackEngine", { enumerable: true, get: function () { return feedback_1.ImplicitFeedbackEngine; } });
|
|
48
|
+
var profiler_1 = require("./evaluator/profiler");
|
|
49
|
+
Object.defineProperty(exports, "AgentProfiler", { enumerable: true, get: function () { return profiler_1.AgentProfiler; } });
|
|
50
|
+
var api_1 = require("./api");
|
|
51
|
+
Object.defineProperty(exports, "AgentOSAPI", { enumerable: true, get: function () { return api_1.AgentOSAPI; } });
|
|
52
|
+
// --- Integration Layer ---
|
|
53
|
+
var server_1 = require("./server");
|
|
54
|
+
Object.defineProperty(exports, "createServer", { enumerable: true, get: function () { return server_1.createServer; } });
|
|
55
|
+
var wrapper_1 = require("./middleware/wrapper");
|
|
56
|
+
Object.defineProperty(exports, "wrapAgent", { enumerable: true, get: function () { return wrapper_1.wrapAgent; } });
|
|
57
|
+
var openclaw_1 = require("./middleware/openclaw");
|
|
58
|
+
Object.defineProperty(exports, "sentinelPlugin", { enumerable: true, get: function () { return openclaw_1.sentinelPlugin; } });
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,0CAAwB;AACxB,mDAAiD;AAAxC,yGAAA,UAAU,OAAA;AAEnB,+CAA6C;AAApC,qGAAA,QAAQ,OAAA;AAEjB,+CAA4D;AAAnD,oHAAA,uBAAuB,OAAA;AAChC,2DAAmE;AAA1D,+GAAA,YAAY,OAAA;AAAE,6GAAA,UAAU,OAAA;AAEjC,+CAA6C;AAApC,qGAAA,QAAQ,OAAA;AACjB,2CAAkD;AAAzC,0GAAA,eAAe,OAAA;AAExB,2CAAmD;AAA1C,2GAAA,gBAAgB,OAAA;AACzB,4CAAiD;AAAxC,wGAAA,aAAa,OAAA;AAEtB,8CAAmD;AAA1C,0GAAA,cAAc,OAAA;AACvB,8CAAwD;AAA/C,+GAAA,mBAAmB,OAAA;AAC5B,6DAAmG;AAA1F,kHAAA,gBAAgB,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC9D,iDAA8D;AAArD,kHAAA,sBAAsB,OAAA;AAC/B,iDAAqD;AAA5C,yGAAA,aAAa,OAAA;AAEtB,6BAAmC;AAA1B,iGAAA,UAAU,OAAA;AAEnB,4BAA4B;AAC5B,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AACrB,gDAAiD;AAAxC,oGAAA,SAAS,OAAA;AAElB,kDAAuD;AAA9C,0GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { EpisodicEvent, EventType } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Episodic Memory — cross-session event timeline.
|
|
4
|
+
*
|
|
5
|
+
* Stores past events as a timeline with automatic importance scoring
|
|
6
|
+
* and progressive compression. Important events stay detailed forever;
|
|
7
|
+
* low-importance events gradually compress to one-liners and eventually
|
|
8
|
+
* get forgotten.
|
|
9
|
+
*/
|
|
10
|
+
export declare class EpisodicMemory {
|
|
11
|
+
private events;
|
|
12
|
+
private maxSizeKb;
|
|
13
|
+
private storagePath?;
|
|
14
|
+
constructor(maxSizeKb?: number);
|
|
15
|
+
/** Enable disk persistence */
|
|
16
|
+
enablePersistence(workspaceRoot: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Record a new episodic event.
|
|
19
|
+
*
|
|
20
|
+
* @param type - Event classification
|
|
21
|
+
* @param content - Event description
|
|
22
|
+
* @param tags - Auto-extracted tags
|
|
23
|
+
* @param relatedEntities - Related projects/files/people
|
|
24
|
+
* @param customImportanceBoost - Additional importance boost (0-1)
|
|
25
|
+
*/
|
|
26
|
+
record(type: EventType, content: string, tags?: string[], relatedEntities?: string[], customImportanceBoost?: number): EpisodicEvent;
|
|
27
|
+
/**
|
|
28
|
+
* Query events by filter.
|
|
29
|
+
*/
|
|
30
|
+
query(filter?: {
|
|
31
|
+
type?: EventType;
|
|
32
|
+
minImportance?: number;
|
|
33
|
+
since?: number;
|
|
34
|
+
until?: number;
|
|
35
|
+
tags?: string[];
|
|
36
|
+
limit?: number;
|
|
37
|
+
}): EpisodicEvent[];
|
|
38
|
+
/**
|
|
39
|
+
* Get all events (newest first).
|
|
40
|
+
*/
|
|
41
|
+
getAll(): EpisodicEvent[];
|
|
42
|
+
/**
|
|
43
|
+
* Get events that should be injected at session startup.
|
|
44
|
+
*
|
|
45
|
+
* Returns: high-importance events from the last 7 days,
|
|
46
|
+
* plus the latest milestone and corrections.
|
|
47
|
+
*/
|
|
48
|
+
getContextualEvents(days?: number, max?: number): EpisodicEvent[];
|
|
49
|
+
/**
|
|
50
|
+
* Generate a context summary string for injection into session prompt.
|
|
51
|
+
*/
|
|
52
|
+
generateContextSummary(maxChars?: number): string;
|
|
53
|
+
/** Count events matching a set of tags */
|
|
54
|
+
private countByTags;
|
|
55
|
+
/** Total number of events */
|
|
56
|
+
get count(): number;
|
|
57
|
+
/** Estimated size in bytes */
|
|
58
|
+
get estimatedSize(): number;
|
|
59
|
+
/** Maximum configured size in KB */
|
|
60
|
+
get maxSize(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Compress events if total size exceeds threshold.
|
|
63
|
+
* Progressive: full → summary → one-liner → forgotten (deleted).
|
|
64
|
+
*/
|
|
65
|
+
private compressIfNeeded;
|
|
66
|
+
/**
|
|
67
|
+
* Compress a single event to the next level.
|
|
68
|
+
*
|
|
69
|
+
* Strategy: low-importance events compress on a faster schedule;
|
|
70
|
+
* the most aggressive step is full→summary for tool_call (<0.4) events
|
|
71
|
+
* after just 1 day, because tool_call events are the majority by volume.
|
|
72
|
+
*/
|
|
73
|
+
private compressEvent;
|
|
74
|
+
private typeIcon;
|
|
75
|
+
/** Persist to disk */
|
|
76
|
+
private save;
|
|
77
|
+
/** Load from disk */
|
|
78
|
+
private load;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=episodic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episodic.d.ts","sourceRoot":"","sources":["../../src/memory/episodic.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACV,MAAM,UAAU,CAAC;AA2BlB;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,SAAS,SAAM;IAI3B,8BAA8B;IAC9B,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAK9C;;;;;;;;OAQG;IACH,MAAM,CACJ,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,eAAe,GAAE,MAAM,EAAO,EAC9B,qBAAqB,SAAI,GACxB,aAAa;IAiChB;;OAEG;IACH,KAAK,CAAC,MAAM,GAAE;QACZ,IAAI,CAAC,EAAE,SAAS,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,aAAa,EAAE;IA4BxB;;OAEG;IACH,MAAM,IAAI,aAAa,EAAE;IAIzB;;;;;OAKG;IACH,mBAAmB,CAAC,IAAI,SAAI,EAAE,GAAG,SAAK,GAAG,aAAa,EAAE;IASxD;;OAEG;IACH,sBAAsB,CAAC,QAAQ,SAAO,GAAG,MAAM;IAqB/C,0CAA0C;IAC1C,OAAO,CAAC,WAAW;IAMnB,6BAA6B;IAC7B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,8BAA8B;IAC9B,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,oCAAoC;IACpC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,QAAQ;IAehB,sBAAsB;IACtB,OAAO,CAAC,IAAI;IAWZ,qBAAqB;IACrB,OAAO,CAAC,IAAI;CAUb"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.EpisodicMemory = void 0;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Generate a unique event ID.
|
|
42
|
+
*/
|
|
43
|
+
function generateEventId() {
|
|
44
|
+
return `ep_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Base importance values by event type.
|
|
48
|
+
*/
|
|
49
|
+
const BASE_IMPORTANCE = {
|
|
50
|
+
tool_call: 0.2,
|
|
51
|
+
tool_failure: 0.6,
|
|
52
|
+
decision: 0.8,
|
|
53
|
+
correction: 0.9,
|
|
54
|
+
publish: 0.7,
|
|
55
|
+
error: 0.7,
|
|
56
|
+
milestone: 0.8,
|
|
57
|
+
note: 0.3,
|
|
58
|
+
user_feedback: 0.8,
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Episodic Memory — cross-session event timeline.
|
|
62
|
+
*
|
|
63
|
+
* Stores past events as a timeline with automatic importance scoring
|
|
64
|
+
* and progressive compression. Important events stay detailed forever;
|
|
65
|
+
* low-importance events gradually compress to one-liners and eventually
|
|
66
|
+
* get forgotten.
|
|
67
|
+
*/
|
|
68
|
+
class EpisodicMemory {
|
|
69
|
+
events = [];
|
|
70
|
+
maxSizeKb;
|
|
71
|
+
storagePath;
|
|
72
|
+
constructor(maxSizeKb = 500) {
|
|
73
|
+
this.maxSizeKb = maxSizeKb;
|
|
74
|
+
}
|
|
75
|
+
/** Enable disk persistence */
|
|
76
|
+
enablePersistence(workspaceRoot) {
|
|
77
|
+
this.storagePath = path.join(workspaceRoot, '.agentos', 'episodic.json');
|
|
78
|
+
this.load();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Record a new episodic event.
|
|
82
|
+
*
|
|
83
|
+
* @param type - Event classification
|
|
84
|
+
* @param content - Event description
|
|
85
|
+
* @param tags - Auto-extracted tags
|
|
86
|
+
* @param relatedEntities - Related projects/files/people
|
|
87
|
+
* @param customImportanceBoost - Additional importance boost (0-1)
|
|
88
|
+
*/
|
|
89
|
+
record(type, content, tags = [], relatedEntities = [], customImportanceBoost = 0) {
|
|
90
|
+
const baseImportance = BASE_IMPORTANCE[type] ?? 0.3;
|
|
91
|
+
// RecencyBoost: DESIGN.md §5.4 — newer = more important
|
|
92
|
+
// Boost = 1.0 + max(0, 1.0 - ageInDays / 30)
|
|
93
|
+
const recencyBoost = 1.0; // Brand new event = max recency (1.0)
|
|
94
|
+
// FrequencyBoost: same-tag events +0.1 each (max +0.5)
|
|
95
|
+
const frequencyBoost = Math.min(0.5, this.countByTags(tags) * 0.1);
|
|
96
|
+
const importance = Math.min(1.0, baseImportance * recencyBoost * (1 + frequencyBoost) + customImportanceBoost);
|
|
97
|
+
const event = {
|
|
98
|
+
id: generateEventId(),
|
|
99
|
+
timestamp: Date.now(),
|
|
100
|
+
type,
|
|
101
|
+
importance: Math.round(importance * 100) / 100,
|
|
102
|
+
compression: 'full',
|
|
103
|
+
content,
|
|
104
|
+
tags,
|
|
105
|
+
relatedEntities,
|
|
106
|
+
};
|
|
107
|
+
this.events.push(event);
|
|
108
|
+
this.compressIfNeeded();
|
|
109
|
+
this.save();
|
|
110
|
+
return event;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Query events by filter.
|
|
114
|
+
*/
|
|
115
|
+
query(filter = {}) {
|
|
116
|
+
let results = this.events;
|
|
117
|
+
if (filter.type) {
|
|
118
|
+
results = results.filter((e) => e.type === filter.type);
|
|
119
|
+
}
|
|
120
|
+
if (filter.minImportance !== undefined) {
|
|
121
|
+
results = results.filter((e) => e.importance >= filter.minImportance);
|
|
122
|
+
}
|
|
123
|
+
if (filter.since !== undefined) {
|
|
124
|
+
results = results.filter((e) => e.timestamp >= filter.since);
|
|
125
|
+
}
|
|
126
|
+
if (filter.until !== undefined) {
|
|
127
|
+
results = results.filter((e) => e.timestamp <= filter.until);
|
|
128
|
+
}
|
|
129
|
+
if (filter.tags && filter.tags.length > 0) {
|
|
130
|
+
results = results.filter((e) => filter.tags.some((t) => e.tags.includes(t)));
|
|
131
|
+
}
|
|
132
|
+
// Most recent first
|
|
133
|
+
results.sort((a, b) => b.timestamp - a.timestamp);
|
|
134
|
+
const limit = filter.limit ?? 100;
|
|
135
|
+
return results.slice(0, limit);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get all events (newest first).
|
|
139
|
+
*/
|
|
140
|
+
getAll() {
|
|
141
|
+
return [...this.events].sort((a, b) => b.timestamp - a.timestamp);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get events that should be injected at session startup.
|
|
145
|
+
*
|
|
146
|
+
* Returns: high-importance events from the last 7 days,
|
|
147
|
+
* plus the latest milestone and corrections.
|
|
148
|
+
*/
|
|
149
|
+
getContextualEvents(days = 7, max = 20) {
|
|
150
|
+
const cutoff = Date.now() - days * 24 * 60 * 60 * 1000;
|
|
151
|
+
return this.events
|
|
152
|
+
.filter((e) => e.timestamp >= cutoff || e.importance >= 0.7)
|
|
153
|
+
.sort((a, b) => b.importance - a.importance || b.timestamp - a.timestamp)
|
|
154
|
+
.slice(0, max);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Generate a context summary string for injection into session prompt.
|
|
158
|
+
*/
|
|
159
|
+
generateContextSummary(maxChars = 2000) {
|
|
160
|
+
const recent = this.getContextualEvents();
|
|
161
|
+
if (recent.length === 0)
|
|
162
|
+
return '';
|
|
163
|
+
const lines = ['[AgentOS Episodic Memory]', ''];
|
|
164
|
+
for (const event of recent) {
|
|
165
|
+
const date = new Date(event.timestamp).toISOString().split('T')[0];
|
|
166
|
+
const icon = this.typeIcon(event.type);
|
|
167
|
+
const importance = event.importance >= 0.7 ? '⚠️' : '';
|
|
168
|
+
const content = event.compression === 'one-liner'
|
|
169
|
+
? event.content
|
|
170
|
+
: event.content.slice(0, 200);
|
|
171
|
+
lines.push(`${icon} ${importance} [${date}] ${content}`);
|
|
172
|
+
if (lines.join('\n').length > maxChars)
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
return lines.join('\n');
|
|
176
|
+
}
|
|
177
|
+
/** Count events matching a set of tags */
|
|
178
|
+
countByTags(tags) {
|
|
179
|
+
return this.events.filter((e) => tags.some((t) => e.tags.includes(t))).length;
|
|
180
|
+
}
|
|
181
|
+
/** Total number of events */
|
|
182
|
+
get count() {
|
|
183
|
+
return this.events.length;
|
|
184
|
+
}
|
|
185
|
+
/** Estimated size in bytes */
|
|
186
|
+
get estimatedSize() {
|
|
187
|
+
return JSON.stringify(this.events).length;
|
|
188
|
+
}
|
|
189
|
+
/** Maximum configured size in KB */
|
|
190
|
+
get maxSize() {
|
|
191
|
+
return this.maxSizeKb;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Compress events if total size exceeds threshold.
|
|
195
|
+
* Progressive: full → summary → one-liner → forgotten (deleted).
|
|
196
|
+
*/
|
|
197
|
+
compressIfNeeded() {
|
|
198
|
+
const now = Date.now();
|
|
199
|
+
const maxBytes = this.maxSizeKb * 1024;
|
|
200
|
+
while (this.estimatedSize > maxBytes && this.events.length > 0) {
|
|
201
|
+
// Find the best candidate for compression:
|
|
202
|
+
// oldest + lowest importance + not already forgotten
|
|
203
|
+
let candidateIndex = -1;
|
|
204
|
+
let candidateScore = Infinity;
|
|
205
|
+
for (let i = 0; i < this.events.length; i++) {
|
|
206
|
+
const e = this.events[i];
|
|
207
|
+
if (e.compression === 'forgotten')
|
|
208
|
+
continue;
|
|
209
|
+
const ageDays = (now - e.timestamp) / (24 * 60 * 60 * 1000);
|
|
210
|
+
const score = e.importance * 100 - ageDays; // lower = better to compress
|
|
211
|
+
if (score < candidateScore && e.importance < 0.7) {
|
|
212
|
+
candidateScore = score;
|
|
213
|
+
candidateIndex = i;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (candidateIndex === -1)
|
|
217
|
+
break; // Nothing left to compress
|
|
218
|
+
const target = this.events[candidateIndex];
|
|
219
|
+
if (target)
|
|
220
|
+
this.compressEvent(target);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Compress a single event to the next level.
|
|
225
|
+
*
|
|
226
|
+
* Strategy: low-importance events compress on a faster schedule;
|
|
227
|
+
* the most aggressive step is full→summary for tool_call (<0.4) events
|
|
228
|
+
* after just 1 day, because tool_call events are the majority by volume.
|
|
229
|
+
*/
|
|
230
|
+
compressEvent(event) {
|
|
231
|
+
const ageDays = (Date.now() - event.timestamp) / (24 * 60 * 60 * 1000);
|
|
232
|
+
switch (event.compression) {
|
|
233
|
+
case 'full':
|
|
234
|
+
// tool_call with importance <= 0.4 → summary after 1 day
|
|
235
|
+
if (event.importance <= 0.4 && ageDays > 1) {
|
|
236
|
+
event.compression = 'summary';
|
|
237
|
+
event.content = event.content.slice(0, 250);
|
|
238
|
+
}
|
|
239
|
+
else if (event.importance < 0.5 && ageDays > 7) {
|
|
240
|
+
event.compression = 'summary';
|
|
241
|
+
event.content = event.content.slice(0, 250);
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case 'summary':
|
|
245
|
+
if (event.importance <= 0.4 && ageDays > 3) {
|
|
246
|
+
// Compress to one-liner
|
|
247
|
+
event.compression = 'one-liner';
|
|
248
|
+
const firstLine = event.content.split('\n')[0] ?? event.content;
|
|
249
|
+
event.content = firstLine.slice(0, 120);
|
|
250
|
+
}
|
|
251
|
+
else if (event.importance < 0.5 && ageDays > 14) {
|
|
252
|
+
event.compression = 'one-liner';
|
|
253
|
+
const firstLine = event.content.split('\n')[0] ?? event.content;
|
|
254
|
+
event.content = firstLine.slice(0, 120);
|
|
255
|
+
}
|
|
256
|
+
break;
|
|
257
|
+
case 'one-liner':
|
|
258
|
+
if (event.importance <= 0.4 && ageDays > 7) {
|
|
259
|
+
event.compression = 'forgotten';
|
|
260
|
+
}
|
|
261
|
+
else if (event.importance < 0.5 && ageDays > 30) {
|
|
262
|
+
event.compression = 'forgotten';
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
typeIcon(type) {
|
|
268
|
+
switch (type) {
|
|
269
|
+
case 'tool_call': return '🔧';
|
|
270
|
+
case 'tool_failure': return '❌';
|
|
271
|
+
case 'decision': return '🎯';
|
|
272
|
+
case 'correction': return '✏️';
|
|
273
|
+
case 'publish': return '📦';
|
|
274
|
+
case 'error': return '💥';
|
|
275
|
+
case 'milestone': return '🏁';
|
|
276
|
+
case 'note': return '📝';
|
|
277
|
+
case 'user_feedback': return '💬';
|
|
278
|
+
default: return '📌';
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/** Persist to disk */
|
|
282
|
+
save() {
|
|
283
|
+
if (!this.storagePath)
|
|
284
|
+
return;
|
|
285
|
+
const dir = path.dirname(this.storagePath);
|
|
286
|
+
if (!fs.existsSync(dir)) {
|
|
287
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
288
|
+
}
|
|
289
|
+
fs.writeFileSync(this.storagePath, JSON.stringify(this.events, null, 2), 'utf-8');
|
|
290
|
+
}
|
|
291
|
+
/** Load from disk */
|
|
292
|
+
load() {
|
|
293
|
+
try {
|
|
294
|
+
if (fs.existsSync(this.storagePath)) {
|
|
295
|
+
const data = fs.readFileSync(this.storagePath, 'utf-8');
|
|
296
|
+
this.events = JSON.parse(data);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
this.events = [];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
exports.EpisodicMemory = EpisodicMemory;
|
|
305
|
+
//# sourceMappingURL=episodic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"episodic.js","sourceRoot":"","sources":["../../src/memory/episodic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SemanticMemory, LearnedRule, UserFact } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Semantic Memory — durable, distilled knowledge.
|
|
4
|
+
*
|
|
5
|
+
* Stores user preferences, project context, learned rules, and glossary
|
|
6
|
+
* extracted from Episodic Memory over time. This is what persists
|
|
7
|
+
* across all sessions and gets injected at startup.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SemanticMemoryStore {
|
|
10
|
+
private memory;
|
|
11
|
+
private storagePath?;
|
|
12
|
+
private _saveTimer;
|
|
13
|
+
private _dirty;
|
|
14
|
+
constructor();
|
|
15
|
+
/** Enable disk persistence */
|
|
16
|
+
enablePersistence(workspaceRoot: string): void;
|
|
17
|
+
/** Get the full semantic memory */
|
|
18
|
+
getMemory(): Readonly<SemanticMemory>;
|
|
19
|
+
/** Set a user preference */
|
|
20
|
+
setPreference(key: string, value: unknown): void;
|
|
21
|
+
/** Get a user preference */
|
|
22
|
+
getPreference<T = unknown>(key: string): T | undefined;
|
|
23
|
+
/** Get all preferences */
|
|
24
|
+
getAllPreferences(): Record<string, unknown>;
|
|
25
|
+
/** Remove a preference */
|
|
26
|
+
removePreference(key: string): void;
|
|
27
|
+
/** Add a fact about the user */
|
|
28
|
+
addFact(fact: string): void;
|
|
29
|
+
/** Get active (non-stale) user facts — updates lastReferenced on read */
|
|
30
|
+
getFacts(maxStaleMs?: number): string[];
|
|
31
|
+
/** Get all facts including stale ones */
|
|
32
|
+
getAllFacts(): UserFact[];
|
|
33
|
+
/** Set or update project context — merges with existing, preserves extra fields */
|
|
34
|
+
setProjectContext(projectName: string, context: Record<string, unknown>): void;
|
|
35
|
+
/** Get project context */
|
|
36
|
+
getProjectContext(projectName: string): Record<string, unknown> | undefined;
|
|
37
|
+
/** Get all project contexts */
|
|
38
|
+
getAllProjects(): string[];
|
|
39
|
+
/** Learn a new rule or reinforce an existing one */
|
|
40
|
+
learnRule(rule: string, source: string): void;
|
|
41
|
+
/** Get rules above a confidence threshold — updates lastReferenced on read */
|
|
42
|
+
getRules(minConfidence?: number): LearnedRule[];
|
|
43
|
+
/** Decay confidence of rules not referenced in a given timespan */
|
|
44
|
+
decayUnusedRules(maxStaleMs?: number): number;
|
|
45
|
+
/** Get all rules regardless of confidence */
|
|
46
|
+
getAllRules(): LearnedRule[];
|
|
47
|
+
/** Add or update a glossary term */
|
|
48
|
+
defineTerm(term: string, meaning: string): void;
|
|
49
|
+
/** Look up a glossary term */
|
|
50
|
+
lookupTerm(term: string): string | undefined;
|
|
51
|
+
/** Get the entire glossary */
|
|
52
|
+
getGlossary(): Record<string, string>;
|
|
53
|
+
/**
|
|
54
|
+
* Generate a context summary for injection into the session prompt.
|
|
55
|
+
* Concise but informative — designed to fit in a system prompt prefix.
|
|
56
|
+
*/
|
|
57
|
+
generateContextSummary(maxChars?: number): string;
|
|
58
|
+
/** Persist to disk */
|
|
59
|
+
private markDirty;
|
|
60
|
+
/** Persist to disk */
|
|
61
|
+
private persist;
|
|
62
|
+
private save;
|
|
63
|
+
/** Force immediate write to disk (for testing / shutdown) */
|
|
64
|
+
flush(): void;
|
|
65
|
+
/** Load from disk */
|
|
66
|
+
private load;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/memory/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIjE;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,MAAM,CAAS;;IAYvB,8BAA8B;IAC9B,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAK9C,mCAAmC;IACnC,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC;IAMrC,4BAA4B;IAC5B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKhD,4BAA4B;IAC5B,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAItD,0BAA0B;IAC1B,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI5C,0BAA0B;IAC1B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOnC,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc3B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,SAA2B,GAAG,MAAM,EAAE;IAQzD,yCAAyC;IACzC,WAAW,IAAI,QAAQ,EAAE;IAMzB,mFAAmF;IACnF,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI;IAMP,0BAA0B;IAC1B,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAI3E,+BAA+B;IAC/B,cAAc,IAAI,MAAM,EAAE;IAM1B,oDAAoD;IACpD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB7C,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,SAAM,GAAG,WAAW,EAAE;IAQ5C,mEAAmE;IACnE,gBAAgB,CAAC,UAAU,SAA0B,GAAG,MAAM;IAa9D,6CAA6C;IAC7C,WAAW,IAAI,WAAW,EAAE;IAM5B,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/C,8BAA8B;IAC9B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5C,8BAA8B;IAC9B,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,SAAO,GAAG,MAAM;IAmD/C,sBAAsB;IACtB,OAAO,CAAC,SAAS;IAajB,sBAAsB;IACtB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,IAAI;IAIZ,6DAA6D;IAC7D,KAAK,IAAI,IAAI;IAWb,qBAAqB;IACrB,OAAO,CAAC,IAAI;CAUb"}
|