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,54 @@
1
+ /**
2
+ * Sentinel AgentOS Middleware — Framework-Agnostic Wrapper
3
+ *
4
+ * Wraps any Agent's tool-call execution in Sentinel's Guard + Memory + Evaluator pipeline.
5
+ * One-line integration — no changes to your Agent logic.
6
+ *
7
+ * Usage:
8
+ * import { wrapAgent } from 'sentinel-agentos';
9
+ * const sentinel = wrapAgent({ workspaceRoot: '/project' });
10
+ * const result = await sentinel.execute('write_file', { path: 'src/main.ts', ... }, callback);
11
+ */
12
+ import { AgentOS } from '../core';
13
+ import type { AgentOSConfig, PreExecMetrics, PostExecMetrics, AuditEntry } from '../types';
14
+ import type { AgentProfile } from '../evaluator/profiler';
15
+ export interface WrappedAgent {
16
+ /** Call this before every tool execution */
17
+ preCheck: (toolName: string, params: Record<string, unknown>) => {
18
+ preExec: PreExecMetrics;
19
+ snapshot: any;
20
+ allowed: boolean;
21
+ reason?: string;
22
+ };
23
+ /** Call this after every tool execution */
24
+ postCheck: (toolName: string, params: Record<string, unknown>, result: unknown, snapshot: any, startTime: number) => {
25
+ runtime: any;
26
+ postExec: PostExecMetrics;
27
+ audit: AuditEntry;
28
+ profile: AgentProfile;
29
+ };
30
+ /** Full pipeline: pre-check → execute callback → post-check */
31
+ execute: <R>(toolName: string, params: Record<string, unknown>, fn: () => R | Promise<R>, opts?: {
32
+ sessionId?: string;
33
+ agentId?: string;
34
+ affectedFiles?: string[];
35
+ }) => Promise<{
36
+ allowed: boolean;
37
+ reason?: string;
38
+ result?: R;
39
+ runtime?: any;
40
+ postExec?: PostExecMetrics;
41
+ audit?: AuditEntry;
42
+ profile?: AgentProfile;
43
+ }>;
44
+ /** Inject memory context at session start */
45
+ injectContext: () => string;
46
+ /** End session */
47
+ endSession: (sessionId: string) => void;
48
+ /** Get status report */
49
+ statusReport: () => string;
50
+ /** Raw AgentOS instance for advanced use */
51
+ readonly aos: AgentOS;
52
+ }
53
+ export declare function wrapAgent(config?: Partial<AgentOSConfig>): WrappedAgent;
54
+ //# sourceMappingURL=wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../src/middleware/wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAC/D,OAAO,EAAE,cAAc,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,2CAA2C;IAC3C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,KAAK;QACnH,OAAO,EAAE,GAAG,CAAC;QACb,QAAQ,EAAE,eAAe,CAAC;QAC1B,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,EAAE,YAAY,CAAC;KACvB,CAAC;IAEF,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxB,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KACtE,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,QAAQ,CAAC,EAAE,eAAe,CAAC;QAC3B,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,OAAO,CAAC,EAAE,YAAY,CAAC;KACxB,CAAC,CAAC;IAEH,6CAA6C;IAC7C,aAAa,EAAE,MAAM,MAAM,CAAC;IAE5B,kBAAkB;IAClB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,wBAAwB;IACxB,YAAY,EAAE,MAAM,MAAM,CAAC;IAE3B,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,YAAY,CAmKvE"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * Sentinel AgentOS Middleware — Framework-Agnostic Wrapper
4
+ *
5
+ * Wraps any Agent's tool-call execution in Sentinel's Guard + Memory + Evaluator pipeline.
6
+ * One-line integration — no changes to your Agent logic.
7
+ *
8
+ * Usage:
9
+ * import { wrapAgent } from 'sentinel-agentos';
10
+ * const sentinel = wrapAgent({ workspaceRoot: '/project' });
11
+ * const result = await sentinel.execute('write_file', { path: 'src/main.ts', ... }, callback);
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.wrapAgent = wrapAgent;
15
+ const core_1 = require("../core");
16
+ function wrapAgent(config) {
17
+ const aos = new core_1.AgentOS(config);
18
+ let sessionCounter = 0;
19
+ const wrapped = {
20
+ aos,
21
+ preCheck(toolName, params) {
22
+ const { preExec, snapshot } = aos.executePipeline({
23
+ sessionId: `wrapped_${sessionCounter}`,
24
+ agentId: 'wrapped_agent',
25
+ toolName,
26
+ parameters: params,
27
+ });
28
+ const allowed = preExec.riskScore.action !== 'deny';
29
+ const reason = !allowed
30
+ ? `Risk score ${preExec.riskScore.score} → DENY (${preExec.riskScore.dimensions?.impact} impact)`
31
+ : undefined;
32
+ return { preExec, snapshot, allowed, reason };
33
+ },
34
+ postCheck(toolName, params, result, snapshot, startTime) {
35
+ const ret = aos.completeExecution({
36
+ sessionId: `wrapped_${sessionCounter}`,
37
+ agentId: 'wrapped_agent',
38
+ toolName,
39
+ toolParameters: params,
40
+ toolResult: result,
41
+ snapshot,
42
+ startTime,
43
+ endTime: Date.now(),
44
+ retryCount: 0,
45
+ wasSelfCorrected: false,
46
+ hadTimeout: false,
47
+ userAccepted: true,
48
+ userProvidedEdit: false,
49
+ resultWasUsed: false,
50
+ });
51
+ return {
52
+ runtime: ret.runtime,
53
+ postExec: ret.postExec,
54
+ audit: ret.auditEntry,
55
+ profile: ret.profile,
56
+ };
57
+ },
58
+ async execute(toolName, params, fn, opts) {
59
+ const sid = opts?.sessionId ?? `wrapped_${++sessionCounter}`;
60
+ const aid = opts?.agentId ?? 'wrapped_agent';
61
+ // Memory context at session start
62
+ if (sessionCounter === 1) {
63
+ aos.injectContext();
64
+ }
65
+ // Pre-check
66
+ const { preExec, snapshot } = aos.executePipeline({
67
+ sessionId: sid,
68
+ agentId: aid,
69
+ toolName,
70
+ parameters: params,
71
+ affectedFiles: opts?.affectedFiles,
72
+ });
73
+ if (preExec.riskScore.action === 'deny') {
74
+ return {
75
+ allowed: false,
76
+ reason: `Risk score ${preExec.riskScore.score} → ${preExec.riskScore.action}`,
77
+ profile: aos.getProfile(sid),
78
+ };
79
+ }
80
+ // Optionally warn for 'confirm' level — but in middleware we auto-proceed
81
+ // In production you'd hook this into your Agent's confirmation loop
82
+ const startTime = Date.now();
83
+ // Execute
84
+ let result;
85
+ try {
86
+ result = await Promise.resolve(fn());
87
+ }
88
+ catch (err) {
89
+ // Execution failed — still record in audit
90
+ const ret = aos.completeExecution({
91
+ sessionId: sid,
92
+ agentId: aid,
93
+ toolName,
94
+ toolParameters: params,
95
+ toolResult: { error: err.message },
96
+ snapshot,
97
+ startTime,
98
+ endTime: Date.now(),
99
+ retryCount: 0,
100
+ wasSelfCorrected: false,
101
+ hadTimeout: false,
102
+ userAccepted: false,
103
+ userProvidedEdit: false,
104
+ resultWasUsed: false,
105
+ });
106
+ return {
107
+ allowed: true,
108
+ result: undefined,
109
+ reason: `Execution failed: ${err.message}`,
110
+ runtime: ret.runtime,
111
+ postExec: ret.postExec,
112
+ audit: ret.auditEntry,
113
+ profile: ret.profile,
114
+ };
115
+ }
116
+ // Post-check
117
+ const ret = aos.completeExecution({
118
+ sessionId: sid,
119
+ agentId: aid,
120
+ toolName,
121
+ toolParameters: params,
122
+ toolResult: result,
123
+ snapshot,
124
+ startTime,
125
+ endTime: Date.now(),
126
+ retryCount: 0,
127
+ wasSelfCorrected: false,
128
+ hadTimeout: false,
129
+ userAccepted: true,
130
+ userProvidedEdit: false,
131
+ resultWasUsed: false,
132
+ });
133
+ return {
134
+ allowed: true,
135
+ result,
136
+ runtime: ret.runtime,
137
+ postExec: ret.postExec,
138
+ audit: ret.auditEntry,
139
+ profile: ret.profile,
140
+ };
141
+ },
142
+ injectContext() {
143
+ return aos.injectContext();
144
+ },
145
+ endSession(sid) {
146
+ // Cast needed because endSession is typed narrowly in core
147
+ aos.endSession(sid);
148
+ },
149
+ statusReport() {
150
+ return aos.statusReport();
151
+ },
152
+ };
153
+ return wrapped;
154
+ }
155
+ //# sourceMappingURL=wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/middleware/wrapper.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAoDH,8BAmKC;AArND,kCAAkC;AAkDlC,SAAgB,SAAS,CAAC,MAA+B;IACvD,MAAM,GAAG,GAAG,IAAI,cAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,OAAO,GAAiB;QAC5B,GAAG;QAEH,QAAQ,CAAC,QAAQ,EAAE,MAAM;YACvB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC;gBAChD,SAAS,EAAE,WAAW,cAAc,EAAE;gBACtC,OAAO,EAAE,eAAe;gBACxB,QAAQ;gBACR,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC;YACpD,MAAM,MAAM,GAAG,CAAC,OAAO;gBACrB,CAAC,CAAC,cAAc,OAAO,CAAC,SAAS,CAAC,KAAK,YAAY,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,UAAU;gBACjG,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAChD,CAAC;QAED,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS;YACrD,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBAChC,SAAS,EAAE,WAAW,cAAc,EAAE;gBACtC,OAAO,EAAE,eAAe;gBACxB,QAAQ;gBACR,cAAc,EAAE,MAAM;gBACtB,UAAU,EAAE,MAAM;gBAClB,QAAQ;gBACR,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,UAAU,EAAE,CAAC;gBACb,gBAAgB,EAAE,KAAK;gBACvB,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,IAAI;gBAClB,gBAAgB,EAAE,KAAK;gBACvB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,UAAU;gBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,MAA+B,EAC/B,EAAwB,EACxB,IAAyE;YAEzE,MAAM,GAAG,GAAG,IAAI,EAAE,SAAS,IAAI,WAAW,EAAE,cAAc,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,IAAI,EAAE,OAAO,IAAI,eAAe,CAAC;YAE7C,kCAAkC;YAClC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,CAAC;YAED,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC;gBAChD,SAAS,EAAE,GAAG;gBACd,OAAO,EAAE,GAAG;gBACZ,QAAQ;gBACR,UAAU,EAAE,MAAM;gBAClB,aAAa,EAAE,IAAI,EAAE,aAAa;aACnC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,cAAc,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE;oBAC7E,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;iBAC7B,CAAC;YACJ,CAAC;YAED,0EAA0E;YAC1E,oEAAoE;YAEpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,UAAU;YACV,IAAI,MAAS,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,2CAA2C;gBAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC;oBAChC,SAAS,EAAE,GAAG;oBACd,OAAO,EAAE,GAAG;oBACZ,QAAQ;oBACR,cAAc,EAAE,MAAM;oBACtB,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE;oBAClC,QAAQ;oBACR,SAAS;oBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;oBACnB,UAAU,EAAE,CAAC;oBACb,gBAAgB,EAAE,KAAK;oBACvB,UAAU,EAAE,KAAK;oBACjB,YAAY,EAAE,KAAK;oBACnB,gBAAgB,EAAE,KAAK;oBACvB,aAAa,EAAE,KAAK;iBACrB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,SAAgB;oBACxB,MAAM,EAAE,qBAAqB,GAAG,CAAC,OAAO,EAAE;oBAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,KAAK,EAAE,GAAG,CAAC,UAAU;oBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC;YACJ,CAAC;YAED,aAAa;YACb,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBAChC,SAAS,EAAE,GAAG;gBACd,OAAO,EAAE,GAAG;gBACZ,QAAQ;gBACR,cAAc,EAAE,MAAM;gBACtB,UAAU,EAAE,MAAM;gBAClB,QAAQ;gBACR,SAAS;gBACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,UAAU,EAAE,CAAC;gBACb,gBAAgB,EAAE,KAAK;gBACvB,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,IAAI;gBAClB,gBAAgB,EAAE,KAAK;gBACvB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM;gBACN,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,UAAU;gBACrB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC;QACJ,CAAC;QAED,aAAa;YACX,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,UAAU,CAAC,GAAG;YACZ,2DAA2D;YAC3D,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAED,YAAY;YACV,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Sentinel AgentOS HTTP Server
3
+ *
4
+ * Lightweight Express HTTP API that wraps the full Sentinel AgentOS
5
+ * pipeline behind RESTful JSON endpoints. Any language can call it.
6
+ *
7
+ * Quick start:
8
+ * npx sentinel-agentos server --port 3300
9
+ *
10
+ * Endpoints:
11
+ * POST /pipeline/pre Pre-exec validation + risk scoring
12
+ * POST /pipeline/post Post-exec verification + audit
13
+ * GET /pipeline/report Status report
14
+ * GET /pipeline/profile Agent quality profile
15
+ *
16
+ * POST /guard/schema Register schema rules
17
+ * GET /guard/schema List schema rules
18
+ *
19
+ * POST /memory/preference Set a preference
20
+ * POST /memory/fact Add a fact
21
+ * POST /memory/rule Learn a rule
22
+ * GET /memory/context Get injected context
23
+ *
24
+ * GET /audit Query audit log
25
+ * GET /health Health check
26
+ *
27
+ * POST /session/end End session
28
+ * POST /feedback Record implicit feedback
29
+ */
30
+ import { AgentOS } from './core';
31
+ type ServerConfig = {
32
+ port: number;
33
+ host?: string;
34
+ /** API token for authentication. If set, all requests must include `Authorization: Bearer <token>` */
35
+ apiToken?: string;
36
+ };
37
+ export declare function createServer(config?: Partial<ServerConfig>): {
38
+ app: import("express-serve-static-core").Express;
39
+ start: () => Promise<void>;
40
+ stop: () => Promise<void>;
41
+ getPort: () => number;
42
+ getInstance: () => AgentOS;
43
+ };
44
+ export {};
45
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGjC,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;;;;;;EA8N1D"}
package/dist/server.js ADDED
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * Sentinel AgentOS HTTP Server
4
+ *
5
+ * Lightweight Express HTTP API that wraps the full Sentinel AgentOS
6
+ * pipeline behind RESTful JSON endpoints. Any language can call it.
7
+ *
8
+ * Quick start:
9
+ * npx sentinel-agentos server --port 3300
10
+ *
11
+ * Endpoints:
12
+ * POST /pipeline/pre Pre-exec validation + risk scoring
13
+ * POST /pipeline/post Post-exec verification + audit
14
+ * GET /pipeline/report Status report
15
+ * GET /pipeline/profile Agent quality profile
16
+ *
17
+ * POST /guard/schema Register schema rules
18
+ * GET /guard/schema List schema rules
19
+ *
20
+ * POST /memory/preference Set a preference
21
+ * POST /memory/fact Add a fact
22
+ * POST /memory/rule Learn a rule
23
+ * GET /memory/context Get injected context
24
+ *
25
+ * GET /audit Query audit log
26
+ * GET /health Health check
27
+ *
28
+ * POST /session/end End session
29
+ * POST /feedback Record implicit feedback
30
+ */
31
+ var __importDefault = (this && this.__importDefault) || function (mod) {
32
+ return (mod && mod.__esModule) ? mod : { "default": mod };
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.createServer = createServer;
36
+ const express_1 = __importDefault(require("express"));
37
+ const cors_1 = __importDefault(require("cors"));
38
+ const core_1 = require("./core");
39
+ function createServer(config) {
40
+ const port = config?.port ?? 3300;
41
+ const host = config?.host ?? '127.0.0.1';
42
+ const apiToken = config?.apiToken;
43
+ const app = (0, express_1.default)();
44
+ app.use((0, cors_1.default)());
45
+ app.use(express_1.default.json({ limit: '1mb' }));
46
+ // ---- API Token Authentication ----
47
+ if (apiToken) {
48
+ app.use((req, res, next) => {
49
+ // Skip health check
50
+ if (req.path === '/health') {
51
+ next();
52
+ return;
53
+ }
54
+ const auth = req.headers.authorization;
55
+ const token = auth?.startsWith('Bearer ') ? auth.slice(7) : null;
56
+ if (token !== apiToken) {
57
+ res.status(401).json({ error: 'Unauthorized: invalid or missing API token' });
58
+ return;
59
+ }
60
+ next();
61
+ });
62
+ }
63
+ // Each request gets its own AgentOS tracker, but we keep one base instance
64
+ // for shared memory (semantic/episodic) and accumulated profile.
65
+ const baseAos = new core_1.AgentOS();
66
+ // ---- Health ----
67
+ app.get('/health', (_req, res) => {
68
+ res.json({ ok: true, uptime: process.uptime() });
69
+ });
70
+ // ---- Pipeline: Pre-exec ----
71
+ app.post('/pipeline/pre', (req, res) => {
72
+ try {
73
+ const { sessionId, agentId, toolName, parameters, affectedFiles } = req.body;
74
+ if (!toolName) {
75
+ res.status(400).json({ error: 'toolName is required' });
76
+ return;
77
+ }
78
+ const result = baseAos.executePipeline({
79
+ sessionId: sessionId ?? 'http_session',
80
+ agentId: agentId ?? 'http_agent',
81
+ toolName,
82
+ parameters: parameters ?? {},
83
+ affectedFiles: affectedFiles ?? [],
84
+ });
85
+ res.json(result);
86
+ }
87
+ catch (err) {
88
+ res.status(500).json({ error: err.message });
89
+ }
90
+ });
91
+ // ---- Pipeline: Post-exec ----
92
+ app.post('/pipeline/post', (req, res) => {
93
+ try {
94
+ const { sessionId, agentId, toolName, toolParameters, toolResult, snapshot, startTime, endTime, retryCount, wasSelfCorrected, hadTimeout, userAccepted, userProvidedEdit, resultWasUsed, } = req.body;
95
+ if (!toolName) {
96
+ res.status(400).json({ error: 'toolName is required' });
97
+ return;
98
+ }
99
+ const result = baseAos.completeExecution({
100
+ sessionId: sessionId ?? 'http_session',
101
+ agentId: agentId ?? 'http_agent',
102
+ toolName,
103
+ toolParameters: toolParameters ?? {},
104
+ toolResult: toolResult ?? null,
105
+ snapshot: snapshot ?? null,
106
+ startTime: startTime ?? Date.now() - 100,
107
+ endTime: endTime ?? Date.now(),
108
+ retryCount: retryCount ?? 0,
109
+ wasSelfCorrected: wasSelfCorrected ?? false,
110
+ hadTimeout: hadTimeout ?? false,
111
+ userAccepted: userAccepted ?? true,
112
+ userProvidedEdit: userProvidedEdit ?? false,
113
+ resultWasUsed: resultWasUsed ?? false,
114
+ });
115
+ res.json(result);
116
+ }
117
+ catch (err) {
118
+ res.status(500).json({ error: err.message });
119
+ }
120
+ });
121
+ // ---- Pipeline: Report ----
122
+ app.get('/pipeline/report', (_req, res) => {
123
+ res.json({ report: baseAos.statusReport() });
124
+ });
125
+ // ---- Pipeline: Profile ----
126
+ app.get('/pipeline/profile', (req, res) => {
127
+ const sessionId = req.query.sessionId;
128
+ res.json(baseAos.getProfile(sessionId));
129
+ });
130
+ // ---- Guard: Register schema rules ----
131
+ app.post('/guard/schema', (req, res) => {
132
+ try {
133
+ const rule = req.body;
134
+ if (!rule.tool) {
135
+ res.status(400).json({ error: 'rule.tool is required' });
136
+ return;
137
+ }
138
+ baseAos.guard.schema.registerRule(rule);
139
+ res.json({ ok: true, tool: rule.tool });
140
+ }
141
+ catch (err) {
142
+ res.status(500).json({ error: err.message });
143
+ }
144
+ });
145
+ // ---- Guard: List rules ----
146
+ app.get('/guard/schema', (req, res) => {
147
+ const toolName = req.query.tool;
148
+ // SchemaGate doesn't expose a public list — use a partial dump
149
+ res.json({ tool: toolName ?? '*', note: 'Schema rules are active but listing requires internal API upgrade' });
150
+ });
151
+ // ---- Memory ----
152
+ app.post('/memory/preference', (req, res) => {
153
+ const { key, value } = req.body;
154
+ baseAos.memory.semantic.setPreference(key, value);
155
+ res.json({ ok: true });
156
+ });
157
+ app.post('/memory/fact', (req, res) => {
158
+ const { fact } = req.body;
159
+ baseAos.memory.semantic.addFact(fact);
160
+ res.json({ ok: true });
161
+ });
162
+ app.post('/memory/rule', (req, res) => {
163
+ const { rule, source } = req.body;
164
+ baseAos.memory.semantic.learnRule(rule, source);
165
+ res.json({ ok: true });
166
+ });
167
+ app.get('/memory/context', (_req, res) => {
168
+ res.json({ context: baseAos.injectContext() });
169
+ });
170
+ // ---- Audit ----
171
+ app.get('/audit', (req, res) => {
172
+ const limit = parseInt(String(req.query.limit ?? '20'), 10);
173
+ const toolName = req.query.tool;
174
+ const status = req.query.status;
175
+ const entries = baseAos.guard.audit.query({
176
+ limit,
177
+ ...(toolName ? { toolName } : {}),
178
+ ...(status ? { status } : {}),
179
+ });
180
+ res.json(entries);
181
+ });
182
+ // ---- Session ----
183
+ app.post('/session/end', (req, res) => {
184
+ const { sessionId } = req.body;
185
+ baseAos.endSession(sessionId ?? 'http_session');
186
+ res.json({ ok: true });
187
+ });
188
+ // ---- Feedback ----
189
+ app.post('/feedback', (req, res) => {
190
+ const { signal, sessionId, operationId, confidence, source } = req.body;
191
+ baseAos.recordFeedback(signal, sessionId, operationId, confidence, source);
192
+ res.json({ ok: true });
193
+ });
194
+ // ---- Error handling ----
195
+ app.use((err, _req, res, _next) => {
196
+ console.error('[Sentinel HTTP]', err);
197
+ res.status(500).json({ error: 'Internal server error' });
198
+ });
199
+ let server = null;
200
+ return {
201
+ app,
202
+ start: () => {
203
+ return new Promise((resolve) => {
204
+ server = app.listen(port, host, () => {
205
+ console.log(`🛡️ Sentinel AgentOS HTTP server → http://${host}:${port}`);
206
+ console.log(` Health: http://${host}:${port}/health`);
207
+ resolve();
208
+ });
209
+ });
210
+ },
211
+ stop: () => {
212
+ return new Promise((resolve) => {
213
+ server?.close(() => resolve());
214
+ });
215
+ },
216
+ getPort: () => port,
217
+ getInstance: () => baseAos,
218
+ };
219
+ }
220
+ // Allow direct invocation via `npx ts-node src/server.ts` or compiled `node dist/server.js`
221
+ if (require.main === module) {
222
+ const args = process.argv.slice(2);
223
+ const portArg = args.indexOf('--port');
224
+ const port = portArg >= 0 ? parseInt(args[portArg + 1] ?? '3300', 10) : 3300;
225
+ const hostArg = args.indexOf('--host');
226
+ const host = hostArg >= 0 ? args[hostArg + 1] ?? '127.0.0.1' : '127.0.0.1';
227
+ createServer({ port, host }).start();
228
+ }
229
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}