sentinel-agentos 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +636 -0
  3. package/dist/api.d.ts +151 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +179 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +14 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +182 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/core.d.ts +139 -0
  12. package/dist/core.d.ts.map +1 -0
  13. package/dist/core.js +247 -0
  14. package/dist/core.js.map +1 -0
  15. package/dist/evaluator/exec-evaluator.d.ts +102 -0
  16. package/dist/evaluator/exec-evaluator.d.ts.map +1 -0
  17. package/dist/evaluator/exec-evaluator.js +266 -0
  18. package/dist/evaluator/exec-evaluator.js.map +1 -0
  19. package/dist/evaluator/feedback.d.ts +66 -0
  20. package/dist/evaluator/feedback.d.ts.map +1 -0
  21. package/dist/evaluator/feedback.js +195 -0
  22. package/dist/evaluator/feedback.js.map +1 -0
  23. package/dist/evaluator/profiler.d.ts +53 -0
  24. package/dist/evaluator/profiler.d.ts.map +1 -0
  25. package/dist/evaluator/profiler.js +108 -0
  26. package/dist/evaluator/profiler.js.map +1 -0
  27. package/dist/guard/audit-log.d.ts +75 -0
  28. package/dist/guard/audit-log.d.ts.map +1 -0
  29. package/dist/guard/audit-log.js +207 -0
  30. package/dist/guard/audit-log.js.map +1 -0
  31. package/dist/guard/risk-gate.d.ts +97 -0
  32. package/dist/guard/risk-gate.d.ts.map +1 -0
  33. package/dist/guard/risk-gate.js +160 -0
  34. package/dist/guard/risk-gate.js.map +1 -0
  35. package/dist/guard/sandbox.d.ts +112 -0
  36. package/dist/guard/sandbox.d.ts.map +1 -0
  37. package/dist/guard/sandbox.js +379 -0
  38. package/dist/guard/sandbox.js.map +1 -0
  39. package/dist/guard/schema-gate.d.ts +90 -0
  40. package/dist/guard/schema-gate.d.ts.map +1 -0
  41. package/dist/guard/schema-gate.js +452 -0
  42. package/dist/guard/schema-gate.js.map +1 -0
  43. package/dist/guard/snapshot-verify.d.ts +111 -0
  44. package/dist/guard/snapshot-verify.d.ts.map +1 -0
  45. package/dist/guard/snapshot-verify.js +578 -0
  46. package/dist/guard/snapshot-verify.js.map +1 -0
  47. package/dist/index.d.ts +28 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +59 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/memory/episodic.d.ts +76 -0
  52. package/dist/memory/episodic.d.ts.map +1 -0
  53. package/dist/memory/episodic.js +289 -0
  54. package/dist/memory/episodic.js.map +1 -0
  55. package/dist/memory/semantic.d.ts +69 -0
  56. package/dist/memory/semantic.d.ts.map +1 -0
  57. package/dist/memory/semantic.js +243 -0
  58. package/dist/memory/semantic.js.map +1 -0
  59. package/dist/memory/working.d.ts +53 -0
  60. package/dist/memory/working.d.ts.map +1 -0
  61. package/dist/memory/working.js +150 -0
  62. package/dist/memory/working.js.map +1 -0
  63. package/dist/middleware/openclaw.d.ts +45 -0
  64. package/dist/middleware/openclaw.d.ts.map +1 -0
  65. package/dist/middleware/openclaw.js +95 -0
  66. package/dist/middleware/openclaw.js.map +1 -0
  67. package/dist/middleware/wrapper.d.ts +54 -0
  68. package/dist/middleware/wrapper.d.ts.map +1 -0
  69. package/dist/middleware/wrapper.js +155 -0
  70. package/dist/middleware/wrapper.js.map +1 -0
  71. package/dist/server.d.ts +45 -0
  72. package/dist/server.d.ts.map +1 -0
  73. package/dist/server.js +229 -0
  74. package/dist/server.js.map +1 -0
  75. package/dist/types/index.d.ts +201 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/index.js +4 -0
  78. package/dist/types/index.js.map +1 -0
  79. package/package.json +64 -0
@@ -0,0 +1,243 @@
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.SemanticMemoryStore = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Semantic Memory — durable, distilled knowledge.
41
+ *
42
+ * Stores user preferences, project context, learned rules, and glossary
43
+ * extracted from Episodic Memory over time. This is what persists
44
+ * across all sessions and gets injected at startup.
45
+ */
46
+ class SemanticMemoryStore {
47
+ memory;
48
+ storagePath;
49
+ constructor() {
50
+ this.memory = {
51
+ userPreferences: {},
52
+ userFacts: [],
53
+ projectContext: {},
54
+ learnedRules: [],
55
+ glossary: {},
56
+ };
57
+ }
58
+ /** Enable disk persistence */
59
+ enablePersistence(workspaceRoot) {
60
+ this.storagePath = path.join(workspaceRoot, '.agentos', 'semantic.json');
61
+ this.load();
62
+ }
63
+ /** Get the full semantic memory */
64
+ getMemory() {
65
+ return this.memory;
66
+ }
67
+ // === User Preferences ===
68
+ /** Set a user preference */
69
+ setPreference(key, value) {
70
+ this.memory.userPreferences[key] = value;
71
+ this.save();
72
+ }
73
+ /** Get a user preference */
74
+ getPreference(key) {
75
+ return this.memory.userPreferences[key];
76
+ }
77
+ /** Get all preferences */
78
+ getAllPreferences() {
79
+ return { ...this.memory.userPreferences };
80
+ }
81
+ /** Remove a preference */
82
+ removePreference(key) {
83
+ delete this.memory.userPreferences[key];
84
+ this.save();
85
+ }
86
+ // === User Facts ===
87
+ /** Add a fact about the user */
88
+ addFact(fact) {
89
+ if (!this.memory.userFacts.includes(fact)) {
90
+ this.memory.userFacts.push(fact);
91
+ this.save();
92
+ }
93
+ }
94
+ /** Get all user facts */
95
+ getFacts() {
96
+ return [...this.memory.userFacts];
97
+ }
98
+ // === Project Context ===
99
+ /** Set or update project context */
100
+ setProjectContext(projectName, context) {
101
+ const existing = this.memory.projectContext[projectName] ?? {
102
+ description: '',
103
+ techStack: [],
104
+ conventions: [],
105
+ architecture: '',
106
+ knownIssues: [],
107
+ };
108
+ this.memory.projectContext[projectName] = {
109
+ description: context.description ?? existing.description,
110
+ techStack: context.techStack ?? existing.techStack,
111
+ conventions: context.conventions ?? existing.conventions,
112
+ architecture: context.architecture ?? existing.architecture,
113
+ knownIssues: context.knownIssues ?? existing.knownIssues,
114
+ };
115
+ this.save();
116
+ }
117
+ /** Get project context */
118
+ getProjectContext(projectName) {
119
+ return this.memory.projectContext[projectName];
120
+ }
121
+ /** Get all project contexts */
122
+ getAllProjects() {
123
+ return Object.keys(this.memory.projectContext);
124
+ }
125
+ // === Learned Rules ===
126
+ /** Learn a new rule or reinforce an existing one */
127
+ learnRule(rule, source) {
128
+ const existing = this.memory.learnedRules.find((r) => r.rule === rule);
129
+ if (existing) {
130
+ // Reinforce: increase confidence and add source
131
+ existing.confidence = Math.min(1.0, existing.confidence + 0.1);
132
+ if (!existing.source.includes(source)) {
133
+ existing.source.push(source);
134
+ }
135
+ }
136
+ else {
137
+ this.memory.learnedRules.push({
138
+ rule,
139
+ confidence: 0.5, // Start at 50% — needs repetition to solidify
140
+ source: [source],
141
+ });
142
+ }
143
+ this.save();
144
+ }
145
+ /** Get rules above a confidence threshold */
146
+ getRules(minConfidence = 0.5) {
147
+ return this.memory.learnedRules
148
+ .filter((r) => r.confidence >= minConfidence)
149
+ .sort((a, b) => b.confidence - a.confidence);
150
+ }
151
+ /** Get all rules regardless of confidence */
152
+ getAllRules() {
153
+ return [...this.memory.learnedRules];
154
+ }
155
+ // === Glossary ===
156
+ /** Add or update a glossary term */
157
+ defineTerm(term, meaning) {
158
+ this.memory.glossary[term] = meaning;
159
+ this.save();
160
+ }
161
+ /** Look up a glossary term */
162
+ lookupTerm(term) {
163
+ return this.memory.glossary[term];
164
+ }
165
+ /** Get the entire glossary */
166
+ getGlossary() {
167
+ return { ...this.memory.glossary };
168
+ }
169
+ /**
170
+ * Generate a context summary for injection into the session prompt.
171
+ * Concise but informative — designed to fit in a system prompt prefix.
172
+ */
173
+ generateContextSummary(maxChars = 3000) {
174
+ const parts = ['[AgentOS Semantic Memory]', ''];
175
+ // User facts
176
+ if (this.memory.userFacts.length > 0) {
177
+ parts.push('## About the User');
178
+ for (const fact of this.memory.userFacts.slice(0, 5)) {
179
+ parts.push(`- ${fact}`);
180
+ }
181
+ parts.push('');
182
+ }
183
+ // Preferences
184
+ const prefs = Object.entries(this.memory.userPreferences);
185
+ if (prefs.length > 0) {
186
+ parts.push('## Preferences');
187
+ for (const [key, value] of prefs.slice(0, 10)) {
188
+ parts.push(`- ${key}: ${JSON.stringify(value)}`);
189
+ }
190
+ parts.push('');
191
+ }
192
+ // Project context
193
+ const projects = Object.keys(this.memory.projectContext);
194
+ if (projects.length > 0) {
195
+ parts.push('## Project Context');
196
+ for (const proj of projects.slice(0, 3)) {
197
+ const ctx = this.memory.projectContext[proj];
198
+ parts.push(`### ${proj}`);
199
+ parts.push(`- Description: ${ctx.description}`);
200
+ parts.push(`- Tech: ${ctx.techStack.join(', ')}`);
201
+ if (ctx.conventions.length > 0) {
202
+ parts.push(`- Conventions: ${ctx.conventions.slice(0, 5).join(', ')}`);
203
+ }
204
+ parts.push('');
205
+ }
206
+ }
207
+ // Learned rules (high confidence only)
208
+ const rules = this.getRules(0.7);
209
+ if (rules.length > 0) {
210
+ parts.push('## Learned Rules');
211
+ for (const r of rules.slice(0, 5)) {
212
+ parts.push(`- [${Math.round(r.confidence * 100)}%] ${r.rule}`);
213
+ }
214
+ parts.push('');
215
+ }
216
+ const summary = parts.join('\n');
217
+ return summary.length > maxChars ? summary.slice(0, maxChars) + '\n...' : summary;
218
+ }
219
+ /** Persist to disk */
220
+ save() {
221
+ if (!this.storagePath)
222
+ return;
223
+ const dir = path.dirname(this.storagePath);
224
+ if (!fs.existsSync(dir)) {
225
+ fs.mkdirSync(dir, { recursive: true });
226
+ }
227
+ fs.writeFileSync(this.storagePath, JSON.stringify(this.memory, null, 2), 'utf-8');
228
+ }
229
+ /** Load from disk */
230
+ load() {
231
+ try {
232
+ if (fs.existsSync(this.storagePath)) {
233
+ const data = fs.readFileSync(this.storagePath, 'utf-8');
234
+ this.memory = JSON.parse(data);
235
+ }
236
+ }
237
+ catch {
238
+ // Keep defaults
239
+ }
240
+ }
241
+ }
242
+ exports.SemanticMemoryStore = SemanticMemoryStore;
243
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/memory/semantic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { Message, Task, ToolResult, TokenBudget } from '../types';
2
+ /**
3
+ * WorkingMemory state interface (matches types/index.ts WorkingMemory).
4
+ */
5
+ export interface WorkingMemoryState {
6
+ sessionId: string;
7
+ recentMessages: Message[];
8
+ currentTask?: Task;
9
+ recentToolResults: Map<string, ToolResult>;
10
+ openFiles: string[];
11
+ budget: TokenBudget;
12
+ }
13
+ /**
14
+ * Working Memory — current session's live context.
15
+ *
16
+ * Holds recent messages, current task, tool results cache,
17
+ * open files, and token budget for the active session.
18
+ * On session end, important items are promoted to Episodic Memory.
19
+ * When token budget is exceeded, old messages are compressed.
20
+ */
21
+ export declare class WorkingMemory {
22
+ readonly sessionId: string;
23
+ private _maxTokens;
24
+ recentMessages: Message[];
25
+ currentTask?: Task;
26
+ recentToolResults: Map<string, ToolResult>;
27
+ openFiles: string[];
28
+ budget: TokenBudget;
29
+ constructor(maxTokens?: number);
30
+ /** Maximum configured tokens */
31
+ get maxTokens(): number;
32
+ /** Get the current state as a snapshot */
33
+ getState(): WorkingMemoryState;
34
+ /** Add a message to the working memory */
35
+ addMessage(role: 'user' | 'agent' | 'tool', content: string): void;
36
+ /** Set or update the current task */
37
+ setTask(task: Task): void;
38
+ /** Update a step's status */
39
+ updateStepStatus(stepIndex: number, status: Task['steps'][number]['status']): void;
40
+ /** Track an open file */
41
+ addOpenFile(filePath: string): void;
42
+ /** Remove a file from tracking */
43
+ removeOpenFile(filePath: string): void;
44
+ /** Cache a tool call result */
45
+ cacheToolResult(toolName: string, result: unknown): void;
46
+ /** Check if a tool result is cached and fresh */
47
+ getCachedResult(toolName: string, maxAgeMs?: number): ToolResult | undefined;
48
+ /** Clear working memory (called on session end) */
49
+ clear(): void;
50
+ /** Estimate token count (rough: 1 token ≈ 4 chars for English/Chinese) */
51
+ private estimateTokens;
52
+ }
53
+ //# sourceMappingURL=working.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working.d.ts","sourceRoot":"","sources":["../../src/memory/working.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,IAAI,EACJ,UAAU,EACV,WAAW,EACZ,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB;AASD;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;gBAER,SAAS,SAAQ;IAS7B,gCAAgC;IAChC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,0CAA0C;IAC1C,QAAQ,IAAI,kBAAkB;IAW9B,0CAA0C;IAC1C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAmBlE,qCAAqC;IACrC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,6BAA6B;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI;IAMlF,yBAAyB;IACzB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC,kCAAkC;IAClC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,+BAA+B;IAC/B,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAQxD,iDAAiD;IACjD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,UAAU,GAAG,SAAS;IAQ3E,mDAAmD;IACnD,KAAK,IAAI,IAAI;IAQb,0EAA0E;IAC1E,OAAO,CAAC,cAAc;CAGvB"}
@@ -0,0 +1,150 @@
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.WorkingMemory = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ /**
39
+ * Generate a unique session ID.
40
+ */
41
+ function generateSessionId() {
42
+ return `wm_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
43
+ }
44
+ /**
45
+ * Working Memory — current session's live context.
46
+ *
47
+ * Holds recent messages, current task, tool results cache,
48
+ * open files, and token budget for the active session.
49
+ * On session end, important items are promoted to Episodic Memory.
50
+ * When token budget is exceeded, old messages are compressed.
51
+ */
52
+ class WorkingMemory {
53
+ sessionId;
54
+ _maxTokens;
55
+ recentMessages;
56
+ currentTask;
57
+ recentToolResults;
58
+ openFiles;
59
+ budget;
60
+ constructor(maxTokens = 50000) {
61
+ this.sessionId = generateSessionId();
62
+ this._maxTokens = maxTokens;
63
+ this.recentMessages = [];
64
+ this.recentToolResults = new Map();
65
+ this.openFiles = [];
66
+ this.budget = { used: 0, limit: maxTokens };
67
+ }
68
+ /** Maximum configured tokens */
69
+ get maxTokens() {
70
+ return this._maxTokens;
71
+ }
72
+ /** Get the current state as a snapshot */
73
+ getState() {
74
+ return {
75
+ sessionId: this.sessionId,
76
+ recentMessages: [...this.recentMessages],
77
+ currentTask: this.currentTask ? { ...this.currentTask } : undefined,
78
+ recentToolResults: new Map(this.recentToolResults),
79
+ openFiles: [...this.openFiles],
80
+ budget: { ...this.budget },
81
+ };
82
+ }
83
+ /** Add a message to the working memory */
84
+ addMessage(role, content) {
85
+ const msg = {
86
+ role,
87
+ content,
88
+ timestamp: Date.now(),
89
+ };
90
+ this.recentMessages.push(msg);
91
+ this.budget.used += this.estimateTokens(content);
92
+ // Trim old messages if over budget
93
+ while (this.budget.used > this.budget.limit && this.recentMessages.length > 2) {
94
+ const toRemove = this.recentMessages.shift();
95
+ if (toRemove) {
96
+ this.budget.used -= this.estimateTokens(toRemove.content);
97
+ }
98
+ }
99
+ }
100
+ /** Set or update the current task */
101
+ setTask(task) {
102
+ this.currentTask = task;
103
+ }
104
+ /** Update a step's status */
105
+ updateStepStatus(stepIndex, status) {
106
+ if (this.currentTask && stepIndex < this.currentTask.steps.length) {
107
+ this.currentTask.steps[stepIndex].status = status;
108
+ }
109
+ }
110
+ /** Track an open file */
111
+ addOpenFile(filePath) {
112
+ if (!this.openFiles.includes(filePath)) {
113
+ this.openFiles.push(filePath);
114
+ }
115
+ }
116
+ /** Remove a file from tracking */
117
+ removeOpenFile(filePath) {
118
+ this.openFiles = this.openFiles.filter((f) => f !== filePath);
119
+ }
120
+ /** Cache a tool call result */
121
+ cacheToolResult(toolName, result) {
122
+ this.recentToolResults.set(toolName, {
123
+ toolName,
124
+ result,
125
+ timestamp: Date.now(),
126
+ });
127
+ }
128
+ /** Check if a tool result is cached and fresh */
129
+ getCachedResult(toolName, maxAgeMs = 30000) {
130
+ const cached = this.recentToolResults.get(toolName);
131
+ if (cached && Date.now() - cached.timestamp < maxAgeMs) {
132
+ return cached;
133
+ }
134
+ return undefined;
135
+ }
136
+ /** Clear working memory (called on session end) */
137
+ clear() {
138
+ this.recentMessages = [];
139
+ this.currentTask = undefined;
140
+ this.recentToolResults.clear();
141
+ this.openFiles = [];
142
+ this.budget.used = 0;
143
+ }
144
+ /** Estimate token count (rough: 1 token ≈ 4 chars for English/Chinese) */
145
+ estimateTokens(text) {
146
+ return Math.ceil(text.length / 2); // Chinese chars ≈ 1 token each
147
+ }
148
+ }
149
+ exports.WorkingMemory = WorkingMemory;
150
+ //# sourceMappingURL=working.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working.js","sourceRoot":"","sources":["../../src/memory/working.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Sentinel AgentOS Middleware — OpenClaw Plugin
3
+ *
4
+ * Seamless integration with OpenClaw agent runtime.
5
+ * Hooks into OpenClaw's tool-call lifecycle to add Guard + Memory + Evaluator.
6
+ *
7
+ * Usage:
8
+ * In your OpenClaw skill or agent config:
9
+ *
10
+ * import { sentinelPlugin } from 'sentinel-agentos';
11
+ *
12
+ * const plugin = sentinelPlugin({ workspaceRoot: '/workspace' });
13
+ * plugin.onBeforeTool((toolName, params) => { ... }); // returns risk + schema
14
+ * plugin.onAfterTool((toolName, params, result) => { ... }); // returns verify + audit
15
+ */
16
+ import { WrappedAgent } from './wrapper';
17
+ import type { AgentOSConfig } from '../types';
18
+ export interface OpenClawPlugin {
19
+ readonly wrapped: WrappedAgent;
20
+ /** Called before an OpenClaw tool call */
21
+ onBeforeTool: (toolName: string, params: Record<string, unknown>) => {
22
+ allowed: boolean;
23
+ riskScore: number;
24
+ riskAction: string;
25
+ schemaErrors?: string[];
26
+ };
27
+ /** Called after an OpenClaw tool call */
28
+ onAfterTool: (toolName: string, params: Record<string, unknown>, result: unknown, startTime: number) => {
29
+ verifyPassed: boolean;
30
+ verifyDetail: string;
31
+ auditId: string;
32
+ };
33
+ /** Session management */
34
+ sessionStart: (sessionId: string) => string;
35
+ sessionEnd: (sessionId: string) => void;
36
+ /** Feedback hooks — call these when user signals are detected */
37
+ recordApproval: (sessionId: string) => void;
38
+ recordCorrection: (sessionId: string) => void;
39
+ recordDeletion: (sessionId: string) => void;
40
+ }
41
+ /**
42
+ * Create an OpenClaw plugin that wraps Sentinel AgentOS.
43
+ */
44
+ export declare function sentinelPlugin(config?: Partial<AgentOSConfig>): OpenClawPlugin;
45
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/middleware/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAa,YAAY,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAE/B,0CAA0C;IAC1C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QACnE,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAEF,yCAAyC;IACzC,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,KACd;QACH,YAAY,EAAE,OAAO,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,yBAAyB;IACzB,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,iEAAiE;IACjE,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,cAAc,CAmF9E"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Sentinel AgentOS Middleware — OpenClaw Plugin
4
+ *
5
+ * Seamless integration with OpenClaw agent runtime.
6
+ * Hooks into OpenClaw's tool-call lifecycle to add Guard + Memory + Evaluator.
7
+ *
8
+ * Usage:
9
+ * In your OpenClaw skill or agent config:
10
+ *
11
+ * import { sentinelPlugin } from 'sentinel-agentos';
12
+ *
13
+ * const plugin = sentinelPlugin({ workspaceRoot: '/workspace' });
14
+ * plugin.onBeforeTool((toolName, params) => { ... }); // returns risk + schema
15
+ * plugin.onAfterTool((toolName, params, result) => { ... }); // returns verify + audit
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.sentinelPlugin = sentinelPlugin;
19
+ const wrapper_1 = require("./wrapper");
20
+ /**
21
+ * Create an OpenClaw plugin that wraps Sentinel AgentOS.
22
+ */
23
+ function sentinelPlugin(config) {
24
+ const wrapped = (0, wrapper_1.wrapAgent)(config);
25
+ const sessionStates = new Map();
26
+ // Register safe default rules for common OpenClaw tools
27
+ wrapped.aos.guard.schema.registerRules([
28
+ {
29
+ tool: 'write',
30
+ required: ['path', 'content'],
31
+ pathDeny: { path: ['.env', '*.key', '*.pem', '.git/**', '**/SECRETS/**', '**/credentials/**'] },
32
+ },
33
+ {
34
+ tool: 'read',
35
+ required: ['path'],
36
+ pathDeny: { path: ['.env', '*.key', '*.pem'] },
37
+ },
38
+ {
39
+ tool: 'exec',
40
+ required: ['command'],
41
+ },
42
+ {
43
+ tool: 'edit',
44
+ required: ['path'],
45
+ pathDeny: { path: ['.env', '*.key', '*.pem', '.git/**'] },
46
+ },
47
+ {
48
+ tool: 'delete',
49
+ required: ['path'],
50
+ pathDeny: { path: ['.env', '*.key', '*.pem', '.git/**', 'node_modules/**'] },
51
+ },
52
+ ]);
53
+ let lastSnapshot = null;
54
+ return {
55
+ wrapped,
56
+ onBeforeTool(toolName, params) {
57
+ const check = wrapped.preCheck(toolName, params);
58
+ lastSnapshot = check.snapshot;
59
+ const schemaErrors = check.preExec.schemaCheck?.errors?.map((e) => e.message) ?? [];
60
+ return {
61
+ allowed: check.allowed,
62
+ riskScore: check.preExec.riskScore.score,
63
+ riskAction: check.preExec.riskScore.action,
64
+ schemaErrors: schemaErrors.length > 0 ? schemaErrors : undefined,
65
+ };
66
+ },
67
+ onAfterTool(toolName, params, result, startTime) {
68
+ const check = wrapped.postCheck(toolName, params, result, lastSnapshot, startTime);
69
+ return {
70
+ verifyPassed: check.postExec.verifyPassed,
71
+ verifyDetail: check.runtime.adaptiveScore >= 0.7 ? 'OK' : 'WARN',
72
+ auditId: check.audit.id,
73
+ };
74
+ },
75
+ sessionStart(sessionId) {
76
+ const startTime = Date.now();
77
+ sessionStates.set(sessionId, { startTime });
78
+ return wrapped.injectContext();
79
+ },
80
+ sessionEnd(sessionId) {
81
+ wrapped.endSession(sessionId);
82
+ sessionStates.delete(sessionId);
83
+ },
84
+ recordApproval(sessionId) {
85
+ wrapped.aos.recordFeedback('user_explicit_approval', sessionId);
86
+ },
87
+ recordCorrection(sessionId) {
88
+ wrapped.aos.recordFeedback('user_modified_output', sessionId);
89
+ },
90
+ recordDeletion(sessionId) {
91
+ wrapped.aos.recordFeedback('user_deleted_code', sessionId);
92
+ },
93
+ };
94
+ }
95
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/middleware/openclaw.ts"],"names":[],"mappings":"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"}