@opentrust/core 7.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 (49) hide show
  1. package/dist/db.d.ts +4 -0
  2. package/dist/db.d.ts.map +1 -0
  3. package/dist/db.js +33 -0
  4. package/dist/db.js.map +1 -0
  5. package/dist/engine/behavior-rules.d.ts +62 -0
  6. package/dist/engine/behavior-rules.d.ts.map +1 -0
  7. package/dist/engine/behavior-rules.js +270 -0
  8. package/dist/engine/behavior-rules.js.map +1 -0
  9. package/dist/engine/scanner.d.ts +42 -0
  10. package/dist/engine/scanner.d.ts.map +1 -0
  11. package/dist/engine/scanner.js +210 -0
  12. package/dist/engine/scanner.js.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +40 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/routes/account.d.ts +2 -0
  18. package/dist/routes/account.d.ts.map +1 -0
  19. package/dist/routes/account.js +52 -0
  20. package/dist/routes/account.js.map +1 -0
  21. package/dist/routes/behavior.d.ts +2 -0
  22. package/dist/routes/behavior.d.ts.map +1 -0
  23. package/dist/routes/behavior.js +26 -0
  24. package/dist/routes/behavior.js.map +1 -0
  25. package/dist/routes/detect.d.ts +2 -0
  26. package/dist/routes/detect.d.ts.map +1 -0
  27. package/dist/routes/detect.js +32 -0
  28. package/dist/routes/detect.js.map +1 -0
  29. package/dist/routes/health.d.ts +2 -0
  30. package/dist/routes/health.d.ts.map +1 -0
  31. package/dist/routes/health.js +6 -0
  32. package/dist/routes/health.js.map +1 -0
  33. package/dist/routes/register.d.ts +2 -0
  34. package/dist/routes/register.d.ts.map +1 -0
  35. package/dist/routes/register.js +28 -0
  36. package/dist/routes/register.js.map +1 -0
  37. package/dist/routes/tool-check.d.ts +2 -0
  38. package/dist/routes/tool-check.d.ts.map +1 -0
  39. package/dist/routes/tool-check.js +25 -0
  40. package/dist/routes/tool-check.js.map +1 -0
  41. package/dist/utils/api-key.d.ts +4 -0
  42. package/dist/utils/api-key.d.ts.map +1 -0
  43. package/dist/utils/api-key.js +13 -0
  44. package/dist/utils/api-key.js.map +1 -0
  45. package/dist/utils/auth-middleware.d.ts +26 -0
  46. package/dist/utils/auth-middleware.d.ts.map +1 -0
  47. package/dist/utils/auth-middleware.js +38 -0
  48. package/dist/utils/auth-middleware.js.map +1 -0
  49. package/package.json +45 -0
package/dist/db.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import Database from "better-sqlite3";
2
+ export declare function getDb(): Database.Database;
3
+ export declare function initDb(): void;
4
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAQzC;AAED,wBAAgB,MAAM,IAAI,IAAI,CAgB7B"}
package/dist/db.js ADDED
@@ -0,0 +1,33 @@
1
+ import Database from "better-sqlite3";
2
+ import { mkdirSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ const DB_PATH = resolve(__dirname, "..", "data", "core.db");
7
+ let _db;
8
+ export function getDb() {
9
+ if (!_db) {
10
+ mkdirSync(dirname(DB_PATH), { recursive: true });
11
+ _db = new Database(DB_PATH);
12
+ _db.pragma("journal_mode = WAL");
13
+ _db.pragma("foreign_keys = ON");
14
+ }
15
+ return _db;
16
+ }
17
+ export function initDb() {
18
+ const db = getDb();
19
+ db.exec(`
20
+ CREATE TABLE IF NOT EXISTS agents (
21
+ id TEXT PRIMARY KEY,
22
+ name TEXT NOT NULL,
23
+ description TEXT DEFAULT '',
24
+ api_key TEXT UNIQUE NOT NULL,
25
+ email TEXT DEFAULT 'dev@localhost',
26
+ status TEXT DEFAULT 'active',
27
+ quota_total INTEGER DEFAULT 999999,
28
+ quota_used INTEGER DEFAULT 0,
29
+ created_at TEXT DEFAULT (datetime('now'))
30
+ )
31
+ `);
32
+ }
33
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAE5D,IAAI,GAAsB,CAAC;AAE3B,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;GAYP,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Behavioral rule engine — evaluates tool call sequences for dangerous patterns.
3
+ *
4
+ * Tool classification sets are based on moltguard/agent/behavior-detector.ts.
5
+ */
6
+ export interface ToolChainEntry {
7
+ seq: number;
8
+ toolName: string;
9
+ sanitizedParams: Record<string, string>;
10
+ outcome: "success" | "error" | "timeout";
11
+ durationMs: number;
12
+ resultCategory: "text_small" | "text_large" | "binary" | "empty" | "error";
13
+ resultSizeBytes: number;
14
+ dataFlowFrom?: string;
15
+ }
16
+ export interface PendingToolCall {
17
+ toolName: string;
18
+ params: Record<string, string>;
19
+ }
20
+ export interface ContentInjectionFinding {
21
+ category: string;
22
+ confidence: "high" | "medium";
23
+ matchedText: string;
24
+ pattern: string;
25
+ }
26
+ export type RiskLevel = "no_risk" | "low" | "medium" | "high" | "critical";
27
+ export type AssessAction = "allow" | "alert" | "block";
28
+ export interface DetectionFinding {
29
+ riskLevel: RiskLevel;
30
+ riskType: string;
31
+ riskContent: string;
32
+ reason: string;
33
+ }
34
+ export interface BehaviorAssessRequest {
35
+ agentId: string;
36
+ sessionKey: string;
37
+ runId: string;
38
+ userIntent: string;
39
+ toolChain: ToolChainEntry[];
40
+ pendingTool?: PendingToolCall;
41
+ contentFindings?: ContentInjectionFinding[];
42
+ context: {
43
+ messageHistoryLength: number;
44
+ recentUserMessages: string[];
45
+ };
46
+ meta: {
47
+ pluginVersion: string;
48
+ clientTimestamp: string;
49
+ };
50
+ }
51
+ export interface BehaviorAssessResponse {
52
+ behaviorId: string;
53
+ riskLevel: RiskLevel;
54
+ anomalyTypes: string[];
55
+ confidence: number;
56
+ action: AssessAction;
57
+ explanation: string;
58
+ affectedTools: number[];
59
+ findings?: DetectionFinding[];
60
+ }
61
+ export declare function assessBehavior(req: BehaviorAssessRequest): BehaviorAssessResponse;
62
+ //# sourceMappingURL=behavior-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-rules.d.ts","sourceRoot":"","sources":["../../src/engine/behavior-rules.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8CH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3E,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,OAAO,EAAE;QACP,oBAAoB,EAAE,MAAM,CAAC;QAC7B,kBAAkB,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC;IACF,IAAI,EAAE;QACJ,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAuND,wBAAgB,cAAc,CAAC,GAAG,EAAE,qBAAqB,GAAG,sBAAsB,CA4DjF"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Behavioral rule engine — evaluates tool call sequences for dangerous patterns.
3
+ *
4
+ * Tool classification sets are based on moltguard/agent/behavior-detector.ts.
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // Tool classification
8
+ // ---------------------------------------------------------------------------
9
+ const FILE_READ_TOOLS = new Set([
10
+ "Read", "read_file", "read", "cat", "head", "tail", "view",
11
+ "get_file_contents", "open_file",
12
+ ]);
13
+ const SHELL_TOOLS = new Set([
14
+ "Bash", "bash", "shell", "run_command", "execute", "terminal",
15
+ "cmd", "powershell", "Shell",
16
+ ]);
17
+ const WEB_FETCH_TOOLS = new Set([
18
+ "WebFetch", "web_fetch", "fetch", "http_request", "get_url",
19
+ "browser_navigate", "navigate",
20
+ ]);
21
+ const NETWORK_WRITE_TOOLS = new Set([
22
+ "WebFetch", "web_fetch", "fetch", "http_request", "curl",
23
+ "post", "put", "upload",
24
+ ]);
25
+ const SENSITIVE_PATH_PATTERNS = [
26
+ /\.ssh/i, /\.aws/i, /\.gnupg/i, /\.env\b/i,
27
+ /\.pem$/i, /\.key$/i, /id_rsa/i, /id_ed25519/i,
28
+ /credentials/i, /keychain/i,
29
+ /\/etc\/passwd/i, /\/etc\/shadow/i,
30
+ /\.git\/config/i, /\.npmrc/i, /\.pypirc/i,
31
+ ];
32
+ const COMMAND_INJECTION_PATTERNS = [
33
+ /;\s*(?:curl|wget|nc|bash|sh|python|perl|ruby)\b/i,
34
+ /\|\s*(?:bash|sh|python|perl)\b/i,
35
+ /`[^`]*(?:curl|wget|nc)\b[^`]*`/i,
36
+ /\$\([^)]*(?:curl|wget|nc)\b/i,
37
+ />\s*\/dev\/tcp\//i,
38
+ ];
39
+ function hasToolInChain(chain, toolSet) {
40
+ return chain.find((e) => toolSet.has(e.toolName));
41
+ }
42
+ function getParamValues(entry) {
43
+ const params = "sanitizedParams" in entry ? entry.sanitizedParams : entry.params;
44
+ return Object.values(params).join(" ");
45
+ }
46
+ function touchesSensitivePath(entry) {
47
+ const text = getParamValues(entry);
48
+ return SENSITIVE_PATH_PATTERNS.some((p) => p.test(text));
49
+ }
50
+ const RULES = [
51
+ // Critical: file read → network exfiltration
52
+ {
53
+ id: "BR-001",
54
+ severity: "critical",
55
+ name: "Data exfiltration via file read then network send",
56
+ anomalyType: "data_exfiltration",
57
+ match(chain, pending) {
58
+ const fileRead = hasToolInChain(chain, FILE_READ_TOOLS);
59
+ if (!fileRead)
60
+ return null;
61
+ const target = pending
62
+ ? (NETWORK_WRITE_TOOLS.has(pending.toolName) || WEB_FETCH_TOOLS.has(pending.toolName) ? pending : null)
63
+ : chain.find((e) => e.seq > fileRead.seq && (NETWORK_WRITE_TOOLS.has(e.toolName) || WEB_FETCH_TOOLS.has(e.toolName)));
64
+ if (!target)
65
+ return null;
66
+ return {
67
+ explanation: `File read (${fileRead.toolName}) followed by network request (${"toolName" in target ? target.toolName : "pending"}) — potential data exfiltration.`,
68
+ affectedTools: [fileRead.seq, ...("seq" in target ? [target.seq] : [])],
69
+ confidence: 0.85,
70
+ findings: [{
71
+ riskLevel: "critical",
72
+ riskType: "DATA_EXFILTRATION",
73
+ riskContent: `${fileRead.toolName} → ${"toolName" in target ? target.toolName : "network"}`,
74
+ reason: "Sensitive file read followed by network send",
75
+ }],
76
+ };
77
+ },
78
+ },
79
+ // Critical: credential file access → external write
80
+ {
81
+ id: "BR-002",
82
+ severity: "critical",
83
+ name: "Credential access followed by external write",
84
+ anomalyType: "credential_theft",
85
+ match(chain, pending) {
86
+ const credAccess = chain.find((e) => FILE_READ_TOOLS.has(e.toolName) && touchesSensitivePath(e));
87
+ if (!credAccess)
88
+ return null;
89
+ const externalWrite = pending
90
+ ? (NETWORK_WRITE_TOOLS.has(pending.toolName) ? pending : null)
91
+ : chain.find((e) => e.seq > credAccess.seq && NETWORK_WRITE_TOOLS.has(e.toolName));
92
+ if (!externalWrite)
93
+ return null;
94
+ return {
95
+ explanation: `Credential/sensitive file read (${credAccess.toolName}) followed by external write — possible credential theft.`,
96
+ affectedTools: [credAccess.seq],
97
+ confidence: 0.95,
98
+ findings: [{
99
+ riskLevel: "critical",
100
+ riskType: "DATA_EXFILTRATION",
101
+ riskContent: getParamValues(credAccess),
102
+ reason: "Credential file access followed by network write",
103
+ }],
104
+ };
105
+ },
106
+ },
107
+ // High: web fetch → shell execution
108
+ {
109
+ id: "BR-003",
110
+ severity: "high",
111
+ name: "Shell execution after web fetch",
112
+ anomalyType: "remote_code_execution",
113
+ match(chain, pending) {
114
+ const webFetch = hasToolInChain(chain, WEB_FETCH_TOOLS);
115
+ if (!webFetch)
116
+ return null;
117
+ const shell = pending
118
+ ? (SHELL_TOOLS.has(pending.toolName) ? pending : null)
119
+ : chain.find((e) => e.seq > webFetch.seq && SHELL_TOOLS.has(e.toolName));
120
+ if (!shell)
121
+ return null;
122
+ return {
123
+ explanation: `Web fetch (${webFetch.toolName}) followed by shell execution — potential remote code execution.`,
124
+ affectedTools: [webFetch.seq],
125
+ confidence: 0.8,
126
+ findings: [{
127
+ riskLevel: "high",
128
+ riskType: "COMMAND_EXECUTION",
129
+ riskContent: `${webFetch.toolName} → ${"toolName" in shell ? shell.toolName : "shell"}`,
130
+ reason: "Downloaded content may be executed in shell",
131
+ }],
132
+ };
133
+ },
134
+ },
135
+ // High: command injection in shell arguments
136
+ {
137
+ id: "BR-004",
138
+ severity: "high",
139
+ name: "Command injection in shell arguments",
140
+ anomalyType: "command_injection",
141
+ match(chain, pending) {
142
+ const allShellCalls = [
143
+ ...chain.filter((e) => SHELL_TOOLS.has(e.toolName)),
144
+ ...(pending && SHELL_TOOLS.has(pending.toolName) ? [pending] : []),
145
+ ];
146
+ for (const call of allShellCalls) {
147
+ const text = getParamValues(call);
148
+ for (const pattern of COMMAND_INJECTION_PATTERNS) {
149
+ if (pattern.test(text)) {
150
+ return {
151
+ explanation: `Shell command contains injection pattern in arguments.`,
152
+ affectedTools: "seq" in call ? [call.seq] : [],
153
+ confidence: 0.85,
154
+ findings: [{
155
+ riskLevel: "high",
156
+ riskType: "COMMAND_EXECUTION",
157
+ riskContent: text.slice(0, 200),
158
+ reason: "Command injection pattern detected in shell arguments",
159
+ }],
160
+ };
161
+ }
162
+ }
163
+ }
164
+ return null;
165
+ },
166
+ },
167
+ // Medium: sensitive path access without clear user intent
168
+ {
169
+ id: "BR-005",
170
+ severity: "medium",
171
+ name: "Sensitive path access without clear user intent",
172
+ anomalyType: "unauthorized_access",
173
+ match(chain, pending) {
174
+ const allAccesses = [
175
+ ...chain.filter((e) => FILE_READ_TOOLS.has(e.toolName) && touchesSensitivePath(e)),
176
+ ...(pending && FILE_READ_TOOLS.has(pending.toolName) && touchesSensitivePath(pending) ? [pending] : []),
177
+ ];
178
+ if (allAccesses.length === 0)
179
+ return null;
180
+ return {
181
+ explanation: `Access to sensitive path(s) detected without explicit user request.`,
182
+ affectedTools: allAccesses.filter((a) => "seq" in a).map((a) => a.seq),
183
+ confidence: 0.6,
184
+ findings: allAccesses.map((a) => ({
185
+ riskLevel: "medium",
186
+ riskType: "DATA_EXFILTRATION",
187
+ riskContent: getParamValues(a).slice(0, 200),
188
+ reason: "Sensitive path access",
189
+ })),
190
+ };
191
+ },
192
+ },
193
+ ];
194
+ // ---------------------------------------------------------------------------
195
+ // Severity → action mapping
196
+ // ---------------------------------------------------------------------------
197
+ function severityToAction(severity) {
198
+ switch (severity) {
199
+ case "critical": return "block";
200
+ case "high": return "alert";
201
+ case "medium": return "alert";
202
+ }
203
+ }
204
+ function severityToRiskLevel(severity) {
205
+ switch (severity) {
206
+ case "critical": return "critical";
207
+ case "high": return "high";
208
+ case "medium": return "medium";
209
+ }
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Public API
213
+ // ---------------------------------------------------------------------------
214
+ export function assessBehavior(req) {
215
+ const allFindings = [];
216
+ const anomalyTypes = [];
217
+ const affectedTools = [];
218
+ let worstSeverity = null;
219
+ let worstConfidence = 0;
220
+ let explanation = "No anomalies detected.";
221
+ // Elevate if content injection findings were passed from client
222
+ if (req.contentFindings && req.contentFindings.length > 0) {
223
+ const hasHigh = req.contentFindings.some((f) => f.confidence === "high");
224
+ if (hasHigh) {
225
+ allFindings.push({
226
+ riskLevel: "high",
227
+ riskType: "PROMPT_INJECTION",
228
+ riskContent: req.contentFindings.map((f) => f.matchedText).join("; ").slice(0, 300),
229
+ reason: "Content injection detected by client scanner",
230
+ });
231
+ anomalyTypes.push("content_injection");
232
+ worstSeverity = "high";
233
+ worstConfidence = 0.9;
234
+ explanation = `Content injection detected in tool results: ${req.contentFindings.length} finding(s).`;
235
+ }
236
+ }
237
+ // Evaluate behavioral rules
238
+ for (const rule of RULES) {
239
+ const match = rule.match(req.toolChain, req.pendingTool);
240
+ if (!match)
241
+ continue;
242
+ anomalyTypes.push(rule.anomalyType);
243
+ affectedTools.push(...match.affectedTools);
244
+ if (match.findings)
245
+ allFindings.push(...match.findings);
246
+ const severityRank = { critical: 3, high: 2, medium: 1 };
247
+ if (!worstSeverity || severityRank[rule.severity] > severityRank[worstSeverity]) {
248
+ worstSeverity = rule.severity;
249
+ explanation = match.explanation;
250
+ }
251
+ worstConfidence = Math.max(worstConfidence, match.confidence);
252
+ }
253
+ const riskLevel = worstSeverity
254
+ ? severityToRiskLevel(worstSeverity)
255
+ : "no_risk";
256
+ const action = worstSeverity
257
+ ? severityToAction(worstSeverity)
258
+ : "allow";
259
+ return {
260
+ behaviorId: crypto.randomUUID(),
261
+ riskLevel,
262
+ anomalyTypes: [...new Set(anomalyTypes)],
263
+ confidence: Math.round(worstConfidence * 100) / 100,
264
+ action,
265
+ explanation,
266
+ affectedTools: [...new Set(affectedTools)],
267
+ findings: allFindings.length > 0 ? allFindings : undefined,
268
+ };
269
+ }
270
+ //# sourceMappingURL=behavior-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior-rules.js","sourceRoot":"","sources":["../../src/engine/behavior-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Content scanner engine — S01 through S10.
3
+ *
4
+ * Each scanner has a set of regex patterns. A message is scanned against all
5
+ * enabled scanners. Findings are collected and a verdict is produced.
6
+ */
7
+ export interface ScannerDef {
8
+ scannerId: string;
9
+ name: string;
10
+ description: string;
11
+ isEnabled: boolean;
12
+ }
13
+ export interface Finding {
14
+ scanner: string;
15
+ name: string;
16
+ description: string;
17
+ }
18
+ export interface ScanResult {
19
+ safe: boolean;
20
+ verdict: "safe" | "unsafe";
21
+ categories: string[];
22
+ sensitivity_score: number;
23
+ findings: Finding[];
24
+ latency_ms: number;
25
+ request_id: string;
26
+ }
27
+ export declare function scan(messages: unknown[], scanners: ScannerDef[]): ScanResult;
28
+ /**
29
+ * Simple injection check used by /api/check/tool-call.
30
+ * Runs S01 (prompt injection) patterns against content string.
31
+ */
32
+ export declare function checkInjection(content: string): {
33
+ isInjection: boolean;
34
+ confidence: number;
35
+ reason: string;
36
+ findings: Array<{
37
+ suspiciousContent: string;
38
+ reason: string;
39
+ confidence: number;
40
+ }>;
41
+ };
42
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/engine/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoKD,wBAAgB,IAAI,CAClB,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,EAAE,UAAU,EAAE,GACrB,UAAU,CAsCZ;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QACd,iBAAiB,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ,CA+BA"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Content scanner engine — S01 through S10.
3
+ *
4
+ * Each scanner has a set of regex patterns. A message is scanned against all
5
+ * enabled scanners. Findings are collected and a verdict is produced.
6
+ */
7
+ const S01_PATTERNS = [
8
+ { regex: /ignore\s+(?:all\s+)?(?:previous|prior|above|earlier|preceding)\s+(?:instructions?|guidelines?|rules?|prompts?|directions?)/i, label: "ignore previous instructions", weight: 0.95 },
9
+ { regex: /disregard\s+(?:your\s+)?(?:current|previous|prior|all)\s+(?:task|instructions?|guidelines?|rules?|directions?)/i, label: "disregard current task", weight: 0.95 },
10
+ { regex: /override\s+(?:all\s+)?(?:previous|prior|system)\s+(?:instructions?|rules?|prompts?)/i, label: "override instructions", weight: 0.95 },
11
+ { regex: /\bSYSTEM\s*(?:ALERT|MESSAGE|NOTICE|PROMPT|OVERRIDE)\s*:/i, label: "fake SYSTEM message", weight: 0.9 },
12
+ { regex: /\[SYSTEM\]\s*[Nn]ew\s+instructions?/i, label: "[SYSTEM] new instructions", weight: 0.9 },
13
+ { regex: /NOTE\s+TO\s+(?:AI|THE)\s+(?:ASSISTANT|MODEL|AGENT)\s*:/i, label: "note to AI assistant", weight: 0.85 },
14
+ { regex: /you\s+are\s+now\s+in\s+(?:debug|developer|admin|maintenance|test)\s+mode/i, label: "mode switching", weight: 0.7 },
15
+ { regex: /(?:entering|switch\s+to|activate)\s+(?:debug|developer|admin|maintenance|unrestricted)\s+mode/i, label: "activate debug mode", weight: 0.7 },
16
+ { regex: /your\s+new\s+task\s+is\s*:/i, label: "task hijacking", weight: 0.7 },
17
+ { regex: /instead\s*,?\s+(?:you\s+should|please|now)\s+(?:do|perform|execute)/i, label: "task redirection", weight: 0.65 },
18
+ { regex: /pretend\s+(?:that\s+)?these\s+instructions?\s+came\s+from\s+the\s+user/i, label: "role assumption", weight: 0.8 },
19
+ { regex: /you\s+(?:are|must)\s+(?:now\s+)?(?:a|an|acting\s+as)\s+(?:helpful|unrestricted|unfiltered)/i, label: "unrestricted role", weight: 0.75 },
20
+ { regex: /DO\s+NOT\s+(?:DISPLAY|SHOW|REVEAL|MENTION|PRINT|OUTPUT)\s+(?:TO\s+(?:THE\s+)?USER|THIS|THESE)/i, label: "concealment directive", weight: 0.9 },
21
+ { regex: /do\s+not\s+mention\s+these\s+instructions/i, label: "hide instructions", weight: 0.85 },
22
+ { regex: /hide\s+(?:this|these)\s+(?:instructions?|commands?|from\s+the\s+user)/i, label: "hide from user", weight: 0.85 },
23
+ ];
24
+ const S02_PATTERNS = [
25
+ { regex: /bypass\s+(?:all\s+)?(?:security|safety)\s+(?:measures?|checks?|filters?|protocols?)/i, label: "bypass security", weight: 0.9 },
26
+ { regex: /(?:disable|turn\s+off|remove)\s+(?:all\s+)?(?:safety|security|content)\s+(?:filters?|restrictions?|guardrails?|limitations?)/i, label: "disable safety filters", weight: 0.9 },
27
+ { regex: /\bjailbreak\b/i, label: "jailbreak keyword", weight: 0.85 },
28
+ { regex: /(?:no|without)\s+(?:restrictions?|limitations?|boundaries|guardrails?|safety)/i, label: "no restrictions", weight: 0.7 },
29
+ { regex: /(?:DAN|Do\s+Anything\s+Now)\s+mode/i, label: "DAN mode", weight: 0.95 },
30
+ { regex: /(?:ignore|bypass|override)\s+(?:your\s+)?(?:safety|ethical|moral)\s+(?:guidelines?|constraints?|programming)/i, label: "override ethical guidelines", weight: 0.9 },
31
+ ];
32
+ const S03_PATTERNS = [
33
+ { regex: /<script[\s>]/i, label: "XSS script tag", weight: 0.9 },
34
+ { regex: /javascript\s*:/i, label: "javascript: URI", weight: 0.85 },
35
+ { regex: /on(?:load|error|click|mouseover|focus)\s*=/i, label: "DOM event handler", weight: 0.8 },
36
+ { regex: /'\s*(?:OR|AND)\s+'?\d*'?\s*=\s*'?\d*'?/i, label: "SQL injection OR/AND", weight: 0.85 },
37
+ { regex: /(?:UNION\s+(?:ALL\s+)?SELECT|INSERT\s+INTO|DROP\s+TABLE|DELETE\s+FROM)/i, label: "SQL injection statement", weight: 0.9 },
38
+ { regex: /\.\.\/(\.\.\/){2,}/i, label: "path traversal", weight: 0.8 },
39
+ { regex: /(?:document|window)\.(?:cookie|location)/i, label: "DOM access", weight: 0.75 },
40
+ ];
41
+ const S04_PATTERNS = [
42
+ { regex: /(?:when|if)\s+(?:called|invoked|executed|used)\s*,?\s*(?:first|also|always)\s+(?:read|access|send|fetch|execute|run)/i, label: "conditional tool hijack", weight: 0.9 },
43
+ { regex: /tool\s+description\s*:.*(?:ignore|override|instead)/i, label: "tool description override", weight: 0.85 },
44
+ { regex: /(?:hidden|secret)\s+(?:instruction|command|behavior)\s*:/i, label: "hidden instruction in tool", weight: 0.9 },
45
+ { regex: /before\s+returning\s+(?:results?|output)\s*,?\s*(?:also|first|always)\s+(?:send|post|upload|write)/i, label: "tool exfiltration trigger", weight: 0.9 },
46
+ ];
47
+ const S05_PATTERNS = [
48
+ { regex: /\beval\s*\(/i, label: "eval() call", weight: 0.7 },
49
+ { regex: /\bexec\s*\(/i, label: "exec() call", weight: 0.7 },
50
+ { regex: /(?:child_process|subprocess|os\.system|os\.popen)/i, label: "process execution API", weight: 0.8 },
51
+ { regex: /\brm\s+-rf\s+\//i, label: "rm -rf /", weight: 0.95 },
52
+ { regex: /(?:reverse|bind)\s+shell/i, label: "reverse/bind shell", weight: 0.95 },
53
+ { regex: /(?:nc|ncat|netcat)\s+-[a-z]*[le]\s/i, label: "netcat listener", weight: 0.9 },
54
+ { regex: /\/dev\/tcp\/\S+\/\d+/i, label: "/dev/tcp redirection", weight: 0.9 },
55
+ { regex: /base64\s+(?:-d|--decode)/i, label: "base64 decode execution", weight: 0.7 },
56
+ { regex: /(?:import|require)\s*\(\s*['"](?:child_process|os|fs)['"]/, label: "dangerous module import", weight: 0.75 },
57
+ ];
58
+ const S06_PATTERNS = [
59
+ { regex: /\b(?:porn(?:ograph[yic])?|xxx|nsfw|hentai|explicit\s+(?:sexual|content))\b/i, label: "explicit content keyword", weight: 0.8 },
60
+ { regex: /\b(?:gore|mutilation|dismember|torture)\b/i, label: "violent/graphic content", weight: 0.8 },
61
+ { regex: /(?:how\s+to\s+(?:make|build|create)\s+(?:a\s+)?(?:bomb|explosive|weapon))/i, label: "weapon creation", weight: 0.95 },
62
+ { regex: /(?:how\s+to\s+(?:harm|kill|hurt|poison)\s+(?:someone|a\s+person|people))/i, label: "harm instructions", weight: 0.95 },
63
+ ];
64
+ const S07_PATTERNS = [
65
+ { regex: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/, label: "email address", weight: 0.6 },
66
+ { regex: /\b\d{3}[-.\s]?\d{2}[-.\s]?\d{4}\b/, label: "SSN pattern", weight: 0.8 },
67
+ { regex: /\b(?:\+?1[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/, label: "phone number", weight: 0.5 },
68
+ { regex: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/, label: "credit card number", weight: 0.85 },
69
+ { regex: /\b[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx]\b/, label: "China ID card", weight: 0.85 },
70
+ { regex: /\b(?:passport|driver'?s?\s*licen[cs]e)\s*(?:#|number|no\.?)\s*:?\s*\w+/i, label: "passport/license number", weight: 0.7 },
71
+ ];
72
+ const S08_PATTERNS = [
73
+ { regex: /\bsk-[A-Za-z0-9]{20,}/i, label: "OpenAI-style API key", weight: 0.9 },
74
+ { regex: /\bAKIA[0-9A-Z]{16}\b/, label: "AWS access key", weight: 0.95 },
75
+ { regex: /\bghp_[A-Za-z0-9]{36}\b/, label: "GitHub personal token", weight: 0.95 },
76
+ { regex: /\bgho_[A-Za-z0-9]{36}\b/, label: "GitHub OAuth token", weight: 0.95 },
77
+ { regex: /\bglpat-[A-Za-z0-9\-_]{20,}\b/, label: "GitLab token", weight: 0.9 },
78
+ { regex: /\bxox[bpras]-[A-Za-z0-9\-]+/i, label: "Slack token", weight: 0.9 },
79
+ { regex: /(?:password|passwd|pwd)\s*[:=]\s*["']?[^\s"']{4,}/i, label: "password in text", weight: 0.85 },
80
+ { regex: /(?:api[_-]?key|apikey|secret[_-]?key|access[_-]?token)\s*[:=]\s*["']?[^\s"']{8,}/i, label: "API key/secret assignment", weight: 0.85 },
81
+ { regex: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/i, label: "private key", weight: 0.95 },
82
+ { regex: /\bBearer\s+[A-Za-z0-9\-_.~+/]+=*/i, label: "Bearer token", weight: 0.7 },
83
+ ];
84
+ const S09_PATTERNS = [
85
+ { regex: /\b(?:confidential|strictly\s+confidential|top\s+secret|classified)\b/i, label: "confidentiality marker", weight: 0.6 },
86
+ { regex: /\b(?:trade\s+secret|proprietary\s+information|internal\s+use\s+only)\b/i, label: "trade secret / proprietary", weight: 0.7 },
87
+ { regex: /\b(?:not\s+for\s+(?:public|external)\s+(?:distribution|disclosure|release))\b/i, label: "restricted distribution", weight: 0.65 },
88
+ { regex: /\bnda\b|\bnon-?disclosure\b/i, label: "NDA reference", weight: 0.5 },
89
+ ];
90
+ const S10_PATTERNS = [
91
+ { regex: /(?:write|compose|create)\s+(?:me\s+)?(?:a\s+)?(?:poem|song|story|essay|joke|limerick)/i, label: "creative writing request", weight: 0.5 },
92
+ { regex: /(?:tell|give)\s+me\s+(?:a\s+)?(?:joke|riddle|fun\s+fact)/i, label: "entertainment request", weight: 0.4 },
93
+ { regex: /(?:play|let'?s?\s+play)\s+(?:a\s+)?(?:game|trivia|20\s+questions)/i, label: "game request", weight: 0.45 },
94
+ { regex: /(?:roleplay|role-play)\s+(?:as|with)\b/i, label: "roleplay request", weight: 0.5 },
95
+ ];
96
+ // ---------------------------------------------------------------------------
97
+ // Scanner registry
98
+ // ---------------------------------------------------------------------------
99
+ const SCANNER_MAP = {
100
+ S01: S01_PATTERNS,
101
+ S02: S02_PATTERNS,
102
+ S03: S03_PATTERNS,
103
+ S04: S04_PATTERNS,
104
+ S05: S05_PATTERNS,
105
+ S06: S06_PATTERNS,
106
+ S07: S07_PATTERNS,
107
+ S08: S08_PATTERNS,
108
+ S09: S09_PATTERNS,
109
+ S10: S10_PATTERNS,
110
+ };
111
+ // ---------------------------------------------------------------------------
112
+ // Text extraction from various message formats
113
+ // ---------------------------------------------------------------------------
114
+ function extractText(messages) {
115
+ const parts = [];
116
+ for (const msg of messages) {
117
+ if (typeof msg === "string") {
118
+ parts.push(msg);
119
+ continue;
120
+ }
121
+ if (msg && typeof msg === "object") {
122
+ const m = msg;
123
+ if (typeof m.content === "string") {
124
+ parts.push(m.content);
125
+ }
126
+ else if (Array.isArray(m.content)) {
127
+ for (const block of m.content) {
128
+ if (typeof block === "string")
129
+ parts.push(block);
130
+ else if (block && typeof block === "object") {
131
+ const b = block;
132
+ if (typeof b.text === "string")
133
+ parts.push(b.text);
134
+ }
135
+ }
136
+ }
137
+ if (typeof m.text === "string")
138
+ parts.push(m.text);
139
+ }
140
+ }
141
+ return parts.join("\n");
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Public API
145
+ // ---------------------------------------------------------------------------
146
+ export function scan(messages, scanners) {
147
+ const start = performance.now();
148
+ const text = extractText(messages);
149
+ const findings = [];
150
+ const categories = new Set();
151
+ let maxWeight = 0;
152
+ const enabledScanners = scanners.filter((s) => s.isEnabled);
153
+ for (const scanner of enabledScanners) {
154
+ const patterns = SCANNER_MAP[scanner.scannerId];
155
+ if (!patterns)
156
+ continue;
157
+ for (const entry of patterns) {
158
+ if (entry.regex.test(text)) {
159
+ findings.push({
160
+ scanner: scanner.scannerId,
161
+ name: scanner.name,
162
+ description: `Detected: ${entry.label}`,
163
+ });
164
+ categories.add(scanner.scannerId);
165
+ maxWeight = Math.max(maxWeight, entry.weight);
166
+ }
167
+ }
168
+ }
169
+ const latencyMs = Math.round((performance.now() - start) * 100) / 100;
170
+ const safe = findings.length === 0;
171
+ return {
172
+ safe,
173
+ verdict: safe ? "safe" : "unsafe",
174
+ categories: [...categories],
175
+ sensitivity_score: Math.round(maxWeight * 100) / 100,
176
+ findings,
177
+ latency_ms: latencyMs,
178
+ request_id: crypto.randomUUID(),
179
+ };
180
+ }
181
+ /**
182
+ * Simple injection check used by /api/check/tool-call.
183
+ * Runs S01 (prompt injection) patterns against content string.
184
+ */
185
+ export function checkInjection(content) {
186
+ const allPatterns = [...S01_PATTERNS, ...S02_PATTERNS, ...S04_PATTERNS];
187
+ const matched = [];
188
+ let maxWeight = 0;
189
+ for (const entry of allPatterns) {
190
+ const result = entry.regex.exec(content);
191
+ if (result) {
192
+ matched.push({
193
+ suspiciousContent: result[0],
194
+ reason: entry.label,
195
+ confidence: entry.weight,
196
+ });
197
+ maxWeight = Math.max(maxWeight, entry.weight);
198
+ }
199
+ }
200
+ const isInjection = matched.length > 0 && maxWeight >= 0.7;
201
+ return {
202
+ isInjection,
203
+ confidence: maxWeight,
204
+ reason: isInjection
205
+ ? `Detected ${matched.length} injection pattern(s): ${matched.map((m) => m.reason).join(", ")}`
206
+ : "No injection detected",
207
+ findings: matched,
208
+ };
209
+ }
210
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/engine/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ import express from "express";
2
+ import cors from "cors";
3
+ import helmet from "helmet";
4
+ import morgan from "morgan";
5
+ import { initDb } from "./db.js";
6
+ import { healthRouter } from "./routes/health.js";
7
+ import { registerRouter } from "./routes/register.js";
8
+ import { accountRouter } from "./routes/account.js";
9
+ import { detectRouter } from "./routes/detect.js";
10
+ import { behaviorRouter } from "./routes/behavior.js";
11
+ import { toolCheckRouter } from "./routes/tool-check.js";
12
+ const app = express();
13
+ const PORT = parseInt(process.env.CORE_PORT || "53666", 10);
14
+ initDb();
15
+ app.use(helmet({ contentSecurityPolicy: false }));
16
+ app.use(cors());
17
+ app.use(morgan("short"));
18
+ app.use(express.json({ limit: "5mb" }));
19
+ app.use("/", healthRouter);
20
+ app.use("/api/v1/agents", registerRouter);
21
+ app.use("/api/v1", accountRouter);
22
+ app.use("/v1", detectRouter);
23
+ app.use("/api/v1/behavior", behaviorRouter);
24
+ app.use("/api/check", toolCheckRouter);
25
+ app.use((err, _req, res, _next) => {
26
+ console.error("Unhandled error:", err);
27
+ res.status(500).json({ success: false, error: "Internal server error" });
28
+ });
29
+ app.listen(PORT, () => {
30
+ console.log(`OpenTrust Core running on port ${PORT}`);
31
+ console.log(`Endpoints:`);
32
+ console.log(` GET /health`);
33
+ console.log(` POST /api/v1/agents/register`);
34
+ console.log(` GET /api/v1/account`);
35
+ console.log(` GET /api/v1/accounts`);
36
+ console.log(` POST /v1/detect`);
37
+ console.log(` POST /api/v1/behavior/assess`);
38
+ console.log(` POST /api/check/tool-call`);
39
+ });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAE5D,MAAM,EAAE,CAAC;AAET,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAClD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACzB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAExC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAC3B,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAC1C,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAClC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAC7B,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAC5C,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AAEvC,GAAG,CAAC,GAAG,CACL,CACE,GAAU,EACV,IAAqB,EACrB,GAAqB,EACrB,KAA2B,EAC3B,EAAE;IACF,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAC3E,CAAC,CACF,CAAC;AAEF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const accountRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/routes/account.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa,4CAAW,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Router } from "express";
2
+ import { getDb } from "../db.js";
3
+ import { requireAuth, extractApiKey, findAgentByKey } from "../utils/auth-middleware.js";
4
+ import { maskApiKey } from "../utils/api-key.js";
5
+ export const accountRouter = Router();
6
+ /**
7
+ * GET /api/v1/account
8
+ * Returns the account info for the authenticated agent.
9
+ */
10
+ accountRouter.get("/account", requireAuth, (_req, res) => {
11
+ const agent = res.locals.agent;
12
+ res.json({
13
+ success: true,
14
+ agentId: agent.id,
15
+ name: agent.name,
16
+ email: agent.email,
17
+ status: agent.status,
18
+ quotaTotal: agent.quota_total,
19
+ quotaUsed: agent.quota_used,
20
+ quotaRemaining: agent.quota_total - agent.quota_used,
21
+ });
22
+ });
23
+ /**
24
+ * GET /api/v1/accounts
25
+ * Returns all agents under the same email as the authenticated agent.
26
+ */
27
+ accountRouter.get("/accounts", requireAuth, (req, res) => {
28
+ const apiKey = extractApiKey(req);
29
+ const agent = findAgentByKey(apiKey);
30
+ if (!agent) {
31
+ res.status(401).json({ success: false, error: "Invalid API key" });
32
+ return;
33
+ }
34
+ const db = getDb();
35
+ const agents = db
36
+ .prepare("SELECT * FROM agents WHERE email = ?")
37
+ .all(agent.email);
38
+ res.json({
39
+ success: true,
40
+ email: agent.email,
41
+ agents: agents.map((a) => ({
42
+ agentId: a.id,
43
+ name: a.name,
44
+ apiKeyMasked: maskApiKey(a.api_key),
45
+ status: a.status,
46
+ quotaTotal: a.quota_total,
47
+ quotaUsed: a.quota_used,
48
+ quotaRemaining: a.quota_total - a.quota_used,
49
+ })),
50
+ });
51
+ });
52
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/routes/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAiB,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;AAEtC;;;GAGG;AACH,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAiB,CAAC;IAE3C,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,cAAc,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU;KACrD,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAE,CAAC;IACnC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,sCAAsC,CAAC;SAC/C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAe,CAAC;IAElC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC,CAAC,EAAE;YACb,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,WAAW;YACzB,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,cAAc,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,UAAU;SAC7C,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const behaviorRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=behavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.d.ts","sourceRoot":"","sources":["../../src/routes/behavior.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,4CAAW,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Router } from "express";
2
+ import { requireAuth } from "../utils/auth-middleware.js";
3
+ import { assessBehavior } from "../engine/behavior-rules.js";
4
+ export const behaviorRouter = Router();
5
+ /**
6
+ * POST /api/v1/behavior/assess
7
+ *
8
+ * Behavioral assessment for tool call sequences.
9
+ * Response wrapped in { success, data } to match client expectations.
10
+ */
11
+ behaviorRouter.post("/assess", requireAuth, (req, res) => {
12
+ const body = req.body;
13
+ if (!body.agentId || !body.toolChain) {
14
+ res.status(400).json({
15
+ success: false,
16
+ error: "agentId and toolChain are required",
17
+ });
18
+ return;
19
+ }
20
+ const result = assessBehavior(body);
21
+ res.json({
22
+ success: true,
23
+ data: result,
24
+ });
25
+ });
26
+ //# sourceMappingURL=behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.js","sourceRoot":"","sources":["../../src/routes/behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAA8B,MAAM,6BAA6B,CAAC;AAEzF,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;AAEvC;;;;;GAKG;AACH,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACvD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA6B,CAAC;IAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,oCAAoC;SAC5C,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEpC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const detectRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/routes/detect.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,4CAAW,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { Router } from "express";
2
+ import { scan } from "../engine/scanner.js";
3
+ export const detectRouter = Router();
4
+ /**
5
+ * POST /v1/detect
6
+ *
7
+ * Content detection endpoint. Runs messages through S01-S10 scanners.
8
+ * Response wrapped in { success, data } to match existing client expectations.
9
+ */
10
+ detectRouter.post("/detect", (req, res) => {
11
+ const { messages, scanners, format: _format, role: _role } = req.body;
12
+ if (!messages || !Array.isArray(messages) || messages.length === 0) {
13
+ res.status(400).json({
14
+ success: false,
15
+ error: "messages array is required and must not be empty",
16
+ });
17
+ return;
18
+ }
19
+ if (!scanners || !Array.isArray(scanners)) {
20
+ res.status(400).json({
21
+ success: false,
22
+ error: "scanners array is required",
23
+ });
24
+ return;
25
+ }
26
+ const result = scan(messages, scanners);
27
+ res.json({
28
+ success: true,
29
+ data: result,
30
+ });
31
+ });
32
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/routes/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAmB,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;AAErC;;;;;GAKG;AACH,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAKhE,CAAC;IAEF,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kDAAkD;SAC1D,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,4BAA4B;SACpC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const healthRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,4CAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Router } from "express";
2
+ export const healthRouter = Router();
3
+ healthRouter.get("/health", (_req, res) => {
4
+ res.json({ status: "ok" });
5
+ });
6
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;AAErC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const registerRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/routes/register.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,4CAAW,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Router } from "express";
2
+ import { getDb } from "../db.js";
3
+ import { generateApiKey, generateId } from "../utils/api-key.js";
4
+ export const registerRouter = Router();
5
+ registerRouter.post("/register", (req, res) => {
6
+ const { name, description } = req.body;
7
+ if (!name || typeof name !== "string" || name.trim().length === 0) {
8
+ res.status(400).json({ success: false, error: "name is required" });
9
+ return;
10
+ }
11
+ const id = generateId();
12
+ const apiKey = generateApiKey();
13
+ const desc = typeof description === "string" ? description : "";
14
+ const port = parseInt(process.env.CORE_PORT || "53666", 10);
15
+ const db = getDb();
16
+ db.prepare(`INSERT INTO agents (id, name, description, api_key, email, status)
17
+ VALUES (?, ?, ?, ?, 'dev@localhost', 'active')`).run(id, name.trim(), desc, apiKey);
18
+ res.json({
19
+ success: true,
20
+ agent: {
21
+ id,
22
+ api_key: apiKey,
23
+ },
24
+ activate_url: `http://localhost:${port}/activate/${id}`,
25
+ login_url: `http://localhost:${port}/login`,
26
+ });
27
+ });
28
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/routes/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;AAEvC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5C,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAGjC,CAAC;IAEF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAE5D,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,EAAE,CAAC,OAAO,CACR;oDACgD,CACjD,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAErC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,IAAI;QACb,KAAK,EAAE;YACL,EAAE;YACF,OAAO,EAAE,MAAM;SAChB;QACD,YAAY,EAAE,oBAAoB,IAAI,aAAa,EAAE,EAAE;QACvD,SAAS,EAAE,oBAAoB,IAAI,QAAQ;KAC5C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const toolCheckRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=tool-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-check.d.ts","sourceRoot":"","sources":["../../src/routes/tool-check.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,4CAAW,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Router } from "express";
2
+ import { checkInjection } from "../engine/scanner.js";
3
+ export const toolCheckRouter = Router();
4
+ /**
5
+ * POST /api/check/tool-call
6
+ *
7
+ * Legacy injection check endpoint. Checks content for prompt injection.
8
+ * Response uses { ok, verdict } format (different from other endpoints).
9
+ */
10
+ toolCheckRouter.post("/tool-call", (req, res) => {
11
+ const { content } = req.body;
12
+ if (!content || typeof content !== "string") {
13
+ res.status(400).json({
14
+ ok: false,
15
+ error: "content string is required",
16
+ });
17
+ return;
18
+ }
19
+ const result = checkInjection(content);
20
+ res.json({
21
+ ok: true,
22
+ verdict: result,
23
+ });
24
+ });
25
+ //# sourceMappingURL=tool-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-check.js","sourceRoot":"","sources":["../../src/routes/tool-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC;AAExC;;;;;GAKG;AACH,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAA6C,CAAC;IAEtE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,4BAA4B;SACpC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEvC,GAAG,CAAC,IAAI,CAAC;QACP,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function generateApiKey(): string;
2
+ export declare function generateId(): string;
3
+ export declare function maskApiKey(key: string): string;
4
+ //# sourceMappingURL=api-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../src/utils/api-key.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C"}
@@ -0,0 +1,13 @@
1
+ import { randomBytes } from "node:crypto";
2
+ export function generateApiKey() {
3
+ return `sk-og-${randomBytes(16).toString("hex")}`;
4
+ }
5
+ export function generateId() {
6
+ return randomBytes(16).toString("hex");
7
+ }
8
+ export function maskApiKey(key) {
9
+ if (key.length <= 12)
10
+ return key.slice(0, 6) + "...";
11
+ return key.slice(0, 9) + "..." + key.slice(-4);
12
+ }
13
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../src/utils/api-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IACrD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ export interface AgentRow {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ api_key: string;
7
+ email: string;
8
+ status: string;
9
+ quota_total: number;
10
+ quota_used: number;
11
+ created_at: string;
12
+ }
13
+ /**
14
+ * Extracts Bearer token from Authorization header.
15
+ */
16
+ export declare function extractApiKey(req: Request): string | null;
17
+ /**
18
+ * Looks up an agent by API key.
19
+ */
20
+ export declare function findAgentByKey(apiKey: string): AgentRow | undefined;
21
+ /**
22
+ * Middleware that requires a valid Bearer API key.
23
+ * Attaches the agent to res.locals.agent.
24
+ */
25
+ export declare function requireAuth(req: Request, res: Response, next: NextFunction): void;
26
+ //# sourceMappingURL=auth-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../src/utils/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG/D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAKnE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAgBN"}
@@ -0,0 +1,38 @@
1
+ import { getDb } from "../db.js";
2
+ /**
3
+ * Extracts Bearer token from Authorization header.
4
+ */
5
+ export function extractApiKey(req) {
6
+ const header = req.headers.authorization;
7
+ if (!header)
8
+ return null;
9
+ return header.replace("Bearer ", "");
10
+ }
11
+ /**
12
+ * Looks up an agent by API key.
13
+ */
14
+ export function findAgentByKey(apiKey) {
15
+ const db = getDb();
16
+ return db
17
+ .prepare("SELECT * FROM agents WHERE api_key = ?")
18
+ .get(apiKey);
19
+ }
20
+ /**
21
+ * Middleware that requires a valid Bearer API key.
22
+ * Attaches the agent to res.locals.agent.
23
+ */
24
+ export function requireAuth(req, res, next) {
25
+ const apiKey = extractApiKey(req);
26
+ if (!apiKey?.startsWith("sk-og-")) {
27
+ res.status(401).json({ success: false, error: "Not authenticated" });
28
+ return;
29
+ }
30
+ const agent = findAgentByKey(apiKey);
31
+ if (!agent) {
32
+ res.status(401).json({ success: false, error: "Invalid API key" });
33
+ return;
34
+ }
35
+ res.locals.agent = agent;
36
+ next();
37
+ }
38
+ //# sourceMappingURL=auth-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../src/utils/auth-middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAcjC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,OAAO,EAAE;SACN,OAAO,CAAC,wCAAwC,CAAC;SACjD,GAAG,CAAC,MAAM,CAAyB,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,IAAI,EAAE,CAAC;AACT,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@opentrust/core",
3
+ "version": "7.1.0",
4
+ "description": "OpenTrust Core — AI Agent security engine with content detection and behavior assessment",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "opentrust-core": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsx watch src/index.ts",
16
+ "start": "node dist/index.js",
17
+ "typecheck": "tsc --noEmit",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "dependencies": {
21
+ "better-sqlite3": "^11.0.0",
22
+ "cors": "^2.8.5",
23
+ "express": "^4.21.0",
24
+ "helmet": "^8.0.0",
25
+ "morgan": "^1.10.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/better-sqlite3": "^7.6.0",
29
+ "@types/cors": "^2.8.17",
30
+ "@types/express": "^5.0.0",
31
+ "@types/morgan": "^1.9.9",
32
+ "@types/node": "^22.0.0",
33
+ "tsx": "^4.19.0",
34
+ "typescript": "^5.7.0"
35
+ },
36
+ "keywords": ["opentrust", "ai-security", "agent-security", "content-detection", "behavior-assessment"],
37
+ "homepage": "https://github.com/opentrust/opentrust#readme",
38
+ "repository": { "type": "git", "url": "git+https://github.com/opentrust/opentrust.git", "directory": "core" },
39
+ "publishConfig": { "access": "public" },
40
+ "author": "OpenTrust",
41
+ "license": "Apache-2.0",
42
+ "engines": {
43
+ "node": ">=18"
44
+ }
45
+ }