@surfinguard/core-engine 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/analyzers/agent-comm.d.ts +22 -0
- package/dist/analyzers/agent-comm.d.ts.map +1 -0
- package/dist/analyzers/agent-comm.js +79 -0
- package/dist/analyzers/agent-comm.js.map +1 -0
- package/dist/analyzers/api-call.d.ts +21 -0
- package/dist/analyzers/api-call.d.ts.map +1 -0
- package/dist/analyzers/api-call.js +134 -0
- package/dist/analyzers/api-call.js.map +1 -0
- package/dist/analyzers/auth.d.ts +22 -0
- package/dist/analyzers/auth.d.ts.map +1 -0
- package/dist/analyzers/auth.js +97 -0
- package/dist/analyzers/auth.js.map +1 -0
- package/dist/analyzers/code.d.ts +32 -0
- package/dist/analyzers/code.d.ts.map +1 -0
- package/dist/analyzers/code.js +310 -0
- package/dist/analyzers/code.js.map +1 -0
- package/dist/analyzers/command.d.ts.map +1 -1
- package/dist/analyzers/command.js +91 -39
- package/dist/analyzers/command.js.map +1 -1
- package/dist/analyzers/data-pipeline.d.ts +23 -0
- package/dist/analyzers/data-pipeline.d.ts.map +1 -0
- package/dist/analyzers/data-pipeline.js +86 -0
- package/dist/analyzers/data-pipeline.js.map +1 -0
- package/dist/analyzers/document.d.ts +22 -0
- package/dist/analyzers/document.d.ts.map +1 -0
- package/dist/analyzers/document.js +77 -0
- package/dist/analyzers/document.js.map +1 -0
- package/dist/analyzers/file-read.d.ts.map +1 -1
- package/dist/analyzers/file-read.js +12 -3
- package/dist/analyzers/file-read.js.map +1 -1
- package/dist/analyzers/file-write.d.ts.map +1 -1
- package/dist/analyzers/file-write.js +12 -3
- package/dist/analyzers/file-write.js.map +1 -1
- package/dist/analyzers/git.d.ts +25 -0
- package/dist/analyzers/git.d.ts.map +1 -0
- package/dist/analyzers/git.js +126 -0
- package/dist/analyzers/git.js.map +1 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +3 -0
- package/dist/analyzers/index.js.map +1 -1
- package/dist/analyzers/infra.d.ts +30 -0
- package/dist/analyzers/infra.d.ts.map +1 -0
- package/dist/analyzers/infra.js +134 -0
- package/dist/analyzers/infra.js.map +1 -0
- package/dist/analyzers/iot.d.ts +22 -0
- package/dist/analyzers/iot.d.ts.map +1 -0
- package/dist/analyzers/iot.js +78 -0
- package/dist/analyzers/iot.js.map +1 -0
- package/dist/analyzers/message.d.ts +22 -0
- package/dist/analyzers/message.d.ts.map +1 -0
- package/dist/analyzers/message.js +106 -0
- package/dist/analyzers/message.js.map +1 -0
- package/dist/analyzers/query.d.ts +23 -0
- package/dist/analyzers/query.d.ts.map +1 -0
- package/dist/analyzers/query.js +183 -0
- package/dist/analyzers/query.js.map +1 -0
- package/dist/analyzers/text.d.ts.map +1 -1
- package/dist/analyzers/text.js +20 -3
- package/dist/analyzers/text.js.map +1 -1
- package/dist/analyzers/transaction.d.ts +23 -0
- package/dist/analyzers/transaction.d.ts.map +1 -0
- package/dist/analyzers/transaction.js +100 -0
- package/dist/analyzers/transaction.js.map +1 -0
- package/dist/analyzers/ui-action.d.ts +23 -0
- package/dist/analyzers/ui-action.d.ts.map +1 -0
- package/dist/analyzers/ui-action.js +92 -0
- package/dist/analyzers/ui-action.js.map +1 -0
- package/dist/analyzers/url.d.ts.map +1 -1
- package/dist/analyzers/url.js +6 -2
- package/dist/analyzers/url.js.map +1 -1
- package/dist/classifier.d.ts.map +1 -1
- package/dist/classifier.js +20 -1
- package/dist/classifier.js.map +1 -1
- package/dist/context.d.ts +6 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +34 -5
- package/dist/context.js.map +1 -1
- package/dist/engine.d.ts +72 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +313 -9
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/patterns.d.ts +15 -1
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +70 -53
- package/dist/patterns.js.map +1 -1
- package/dist/policy-engine.d.ts +44 -0
- package/dist/policy-engine.d.ts.map +1 -0
- package/dist/policy-engine.js +225 -0
- package/dist/policy-engine.js.map +1 -0
- package/dist/session-tracker.d.ts +50 -0
- package/dist/session-tracker.d.ts.map +1 -0
- package/dist/session-tracker.js +286 -0
- package/dist/session-tracker.js.map +1 -0
- package/package.json +15 -12
- package/patterns/agent-comm.json +97 -0
- package/patterns/api-call.json +175 -0
- package/patterns/auth.json +116 -0
- package/patterns/chains.json +171 -0
- package/patterns/code.json +204 -0
- package/patterns/data-pipeline.json +116 -0
- package/patterns/document.json +110 -0
- package/patterns/git.json +118 -0
- package/patterns/infra.json +207 -0
- package/patterns/iot.json +105 -0
- package/patterns/message.json +122 -0
- package/patterns/query.json +134 -0
- package/patterns/transaction.json +120 -0
- package/patterns/ui-action.json +137 -0
package/dist/patterns.js
CHANGED
|
@@ -1,66 +1,83 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
// Static JSON imports — bundled at build time by esbuild (Cloudflare Workers)
|
|
2
|
+
// and resolved at runtime in Node.js (tests, JS SDK local mode).
|
|
3
|
+
import urlsJson from '../patterns/urls.json' with { type: 'json' };
|
|
4
|
+
import brandsJson from '../patterns/brands.json' with { type: 'json' };
|
|
5
|
+
import commandsJson from '../patterns/commands.json' with { type: 'json' };
|
|
6
|
+
import textJson from '../patterns/text.json' with { type: 'json' };
|
|
7
|
+
import fileReadJson from '../patterns/file-read.json' with { type: 'json' };
|
|
8
|
+
import fileWriteJson from '../patterns/file-write.json' with { type: 'json' };
|
|
9
|
+
import apiCallJson from '../patterns/api-call.json' with { type: 'json' };
|
|
10
|
+
import queryJson from '../patterns/query.json' with { type: 'json' };
|
|
11
|
+
import codeJson from '../patterns/code.json' with { type: 'json' };
|
|
12
|
+
import chainsJson from '../patterns/chains.json' with { type: 'json' };
|
|
13
|
+
import messageJson from '../patterns/message.json' with { type: 'json' };
|
|
14
|
+
import transactionJson from '../patterns/transaction.json' with { type: 'json' };
|
|
15
|
+
import authJson from '../patterns/auth.json' with { type: 'json' };
|
|
16
|
+
import gitJson from '../patterns/git.json' with { type: 'json' };
|
|
17
|
+
import uiActionJson from '../patterns/ui-action.json' with { type: 'json' };
|
|
18
|
+
import infraJson from '../patterns/infra.json' with { type: 'json' };
|
|
19
|
+
import agentCommJson from '../patterns/agent-comm.json' with { type: 'json' };
|
|
20
|
+
import dataPipelineJson from '../patterns/data-pipeline.json' with { type: 'json' };
|
|
21
|
+
import documentJson from '../patterns/document.json' with { type: 'json' };
|
|
22
|
+
import iotJson from '../patterns/iot.json' with { type: 'json' };
|
|
18
23
|
export function loadUrlPatterns() {
|
|
19
|
-
|
|
20
|
-
return cachedUrlPatterns;
|
|
21
|
-
const patternsDir = findPatternsDir();
|
|
22
|
-
const raw = readFileSync(resolve(patternsDir, 'urls.json'), 'utf-8');
|
|
23
|
-
cachedUrlPatterns = JSON.parse(raw);
|
|
24
|
-
return cachedUrlPatterns;
|
|
24
|
+
return urlsJson;
|
|
25
25
|
}
|
|
26
26
|
export function loadBrandPatterns() {
|
|
27
|
-
|
|
28
|
-
return cachedBrandPatterns;
|
|
29
|
-
const patternsDir = findPatternsDir();
|
|
30
|
-
const raw = readFileSync(resolve(patternsDir, 'brands.json'), 'utf-8');
|
|
31
|
-
cachedBrandPatterns = JSON.parse(raw);
|
|
32
|
-
return cachedBrandPatterns;
|
|
27
|
+
return brandsJson;
|
|
33
28
|
}
|
|
34
29
|
export function loadCommandPatterns() {
|
|
35
|
-
|
|
36
|
-
return cachedCommandPatterns;
|
|
37
|
-
const patternsDir = findPatternsDir();
|
|
38
|
-
const raw = readFileSync(resolve(patternsDir, 'commands.json'), 'utf-8');
|
|
39
|
-
cachedCommandPatterns = JSON.parse(raw);
|
|
40
|
-
return cachedCommandPatterns;
|
|
30
|
+
return commandsJson;
|
|
41
31
|
}
|
|
42
32
|
export function loadTextPatterns() {
|
|
43
|
-
|
|
44
|
-
return cachedTextPatterns;
|
|
45
|
-
const patternsDir = findPatternsDir();
|
|
46
|
-
const raw = readFileSync(resolve(patternsDir, 'text.json'), 'utf-8');
|
|
47
|
-
cachedTextPatterns = JSON.parse(raw);
|
|
48
|
-
return cachedTextPatterns;
|
|
33
|
+
return textJson;
|
|
49
34
|
}
|
|
50
35
|
export function loadFileReadPatterns() {
|
|
51
|
-
|
|
52
|
-
return cachedFileReadPatterns;
|
|
53
|
-
const patternsDir = findPatternsDir();
|
|
54
|
-
const raw = readFileSync(resolve(patternsDir, 'file-read.json'), 'utf-8');
|
|
55
|
-
cachedFileReadPatterns = JSON.parse(raw);
|
|
56
|
-
return cachedFileReadPatterns;
|
|
36
|
+
return fileReadJson;
|
|
57
37
|
}
|
|
58
38
|
export function loadFileWritePatterns() {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
39
|
+
return fileWriteJson;
|
|
40
|
+
}
|
|
41
|
+
export function loadApiCallPatterns() {
|
|
42
|
+
return apiCallJson;
|
|
43
|
+
}
|
|
44
|
+
export function loadQueryPatterns() {
|
|
45
|
+
return queryJson;
|
|
46
|
+
}
|
|
47
|
+
export function loadCodePatterns() {
|
|
48
|
+
return codeJson;
|
|
49
|
+
}
|
|
50
|
+
export function loadChainPatterns() {
|
|
51
|
+
return chainsJson;
|
|
52
|
+
}
|
|
53
|
+
export function loadMessagePatterns() {
|
|
54
|
+
return messageJson;
|
|
55
|
+
}
|
|
56
|
+
export function loadTransactionPatterns() {
|
|
57
|
+
return transactionJson;
|
|
58
|
+
}
|
|
59
|
+
export function loadAuthPatterns() {
|
|
60
|
+
return authJson;
|
|
61
|
+
}
|
|
62
|
+
export function loadGitPatterns() {
|
|
63
|
+
return gitJson;
|
|
64
|
+
}
|
|
65
|
+
export function loadUiActionPatterns() {
|
|
66
|
+
return uiActionJson;
|
|
67
|
+
}
|
|
68
|
+
export function loadInfraPatterns() {
|
|
69
|
+
return infraJson;
|
|
70
|
+
}
|
|
71
|
+
export function loadAgentCommPatterns() {
|
|
72
|
+
return agentCommJson;
|
|
73
|
+
}
|
|
74
|
+
export function loadDataPipelinePatterns() {
|
|
75
|
+
return dataPipelineJson;
|
|
76
|
+
}
|
|
77
|
+
export function loadDocumentPatterns() {
|
|
78
|
+
return documentJson;
|
|
79
|
+
}
|
|
80
|
+
export function loadIotPatterns() {
|
|
81
|
+
return iotJson;
|
|
65
82
|
}
|
|
66
83
|
//# sourceMappingURL=patterns.js.map
|
package/dist/patterns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAuBA,8EAA8E;AAC9E,iEAAiE;AACjE,OAAO,QAAQ,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,UAAU,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvE,OAAO,YAAY,MAAM,2BAA2B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3E,OAAO,QAAQ,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,YAAY,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5E,OAAO,aAAa,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9E,OAAO,WAAW,MAAM,2BAA2B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1E,OAAO,SAAS,MAAM,wBAAwB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrE,OAAO,QAAQ,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,UAAU,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvE,OAAO,WAAW,MAAM,0BAA0B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzE,OAAO,eAAe,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,QAAQ,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,OAAO,MAAM,sBAAsB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjE,OAAO,YAAY,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5E,OAAO,SAAS,MAAM,wBAAwB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrE,OAAO,aAAa,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9E,OAAO,gBAAgB,MAAM,gCAAgC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpF,OAAO,YAAY,MAAM,2BAA2B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3E,OAAO,OAAO,MAAM,sBAAsB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEjE,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAyC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAA6C,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAiD,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,QAA0C,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAkD,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAoD,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,WAAgD,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAA4C,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,QAA0C,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAA6C,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,WAAgD,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,eAAwD,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,QAA0C,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAwC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAkD,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAA4C,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAoD,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,gBAA0D,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAkD,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAwC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ActionInput, CheckResult, Policy, PolicyTemplate, AllowlistEntry, BlocklistEntry } from '@surfinguard/types';
|
|
2
|
+
/**
|
|
3
|
+
* Result of policy evaluation.
|
|
4
|
+
*/
|
|
5
|
+
export interface PolicyDecision {
|
|
6
|
+
allowed: boolean;
|
|
7
|
+
reason: string;
|
|
8
|
+
policyName: string;
|
|
9
|
+
matchedRule?: string;
|
|
10
|
+
matchedAllowlist?: AllowlistEntry;
|
|
11
|
+
matchedBlocklist?: BlocklistEntry;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Built-in policy templates.
|
|
15
|
+
*/
|
|
16
|
+
export declare const POLICY_TEMPLATES: Record<PolicyTemplate, Policy>;
|
|
17
|
+
/**
|
|
18
|
+
* Policy engine that evaluates actions against a rich policy configuration.
|
|
19
|
+
*
|
|
20
|
+
* Evaluation order: allowlist → blocklist → environment overrides → custom rules → base level.
|
|
21
|
+
*/
|
|
22
|
+
export declare class PolicyEngine {
|
|
23
|
+
private policy;
|
|
24
|
+
constructor(policyOrTemplate: Policy | PolicyTemplate);
|
|
25
|
+
/**
|
|
26
|
+
* Get the underlying policy configuration.
|
|
27
|
+
*/
|
|
28
|
+
getPolicy(): Policy;
|
|
29
|
+
/**
|
|
30
|
+
* Evaluate an action + result against the policy.
|
|
31
|
+
*/
|
|
32
|
+
evaluate(input: ActionInput, result: CheckResult, environment?: string): PolicyDecision;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a result requires human approval based on policy.
|
|
35
|
+
*/
|
|
36
|
+
requiresApproval(result: CheckResult): boolean;
|
|
37
|
+
private getEffectiveLevel;
|
|
38
|
+
private getEffectiveRules;
|
|
39
|
+
private matchList;
|
|
40
|
+
private globMatch;
|
|
41
|
+
private levelMeetsThreshold;
|
|
42
|
+
private isBlockedByLevel;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=policy-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../src/policy-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,MAAM,EACN,cAAc,EAEd,cAAc,EACd,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,gBAAgB,CAAC,EAAE,cAAc,CAAC;CACnC;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CA2C3D,CAAC;AAEF;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,gBAAgB,EAAE,MAAM,GAAG,cAAc;IAYrD;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc;IAsEvF;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAU9C,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in policy templates.
|
|
3
|
+
*/
|
|
4
|
+
export const POLICY_TEMPLATES = {
|
|
5
|
+
'open-development': {
|
|
6
|
+
name: 'Open Development',
|
|
7
|
+
level: 'permissive',
|
|
8
|
+
rules: [],
|
|
9
|
+
allowlist: [],
|
|
10
|
+
blocklist: [],
|
|
11
|
+
requireApprovalForCaution: false,
|
|
12
|
+
requireApprovalForDanger: false,
|
|
13
|
+
},
|
|
14
|
+
'standard-production': {
|
|
15
|
+
name: 'Standard Production',
|
|
16
|
+
level: 'balanced',
|
|
17
|
+
rules: [{ blockLevel: 'DANGER' }],
|
|
18
|
+
allowlist: [],
|
|
19
|
+
blocklist: [],
|
|
20
|
+
requireApprovalForCaution: false,
|
|
21
|
+
requireApprovalForDanger: true,
|
|
22
|
+
},
|
|
23
|
+
'high-security': {
|
|
24
|
+
name: 'High Security',
|
|
25
|
+
level: 'strict',
|
|
26
|
+
rules: [{ blockLevel: 'CAUTION' }],
|
|
27
|
+
allowlist: [],
|
|
28
|
+
blocklist: [],
|
|
29
|
+
requireApprovalForCaution: true,
|
|
30
|
+
requireApprovalForDanger: true,
|
|
31
|
+
sessionRiskCeiling: 15,
|
|
32
|
+
},
|
|
33
|
+
'compliance-strict': {
|
|
34
|
+
name: 'Compliance Strict',
|
|
35
|
+
level: 'strict',
|
|
36
|
+
rules: [{ blockLevel: 'CAUTION' }],
|
|
37
|
+
allowlist: [],
|
|
38
|
+
blocklist: [
|
|
39
|
+
{ type: 'command', pattern: 'rm *', reason: 'Destructive commands forbidden' },
|
|
40
|
+
{ type: 'query', pattern: 'DROP *', reason: 'DDL operations forbidden' },
|
|
41
|
+
{ type: 'query', pattern: 'TRUNCATE *', reason: 'DDL operations forbidden' },
|
|
42
|
+
],
|
|
43
|
+
requireApprovalForCaution: true,
|
|
44
|
+
requireApprovalForDanger: true,
|
|
45
|
+
sessionRiskCeiling: 10,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Policy engine that evaluates actions against a rich policy configuration.
|
|
50
|
+
*
|
|
51
|
+
* Evaluation order: allowlist → blocklist → environment overrides → custom rules → base level.
|
|
52
|
+
*/
|
|
53
|
+
export class PolicyEngine {
|
|
54
|
+
policy;
|
|
55
|
+
constructor(policyOrTemplate) {
|
|
56
|
+
if (typeof policyOrTemplate === 'string') {
|
|
57
|
+
const template = POLICY_TEMPLATES[policyOrTemplate];
|
|
58
|
+
if (!template) {
|
|
59
|
+
throw new Error(`Unknown policy template: ${policyOrTemplate}`);
|
|
60
|
+
}
|
|
61
|
+
this.policy = { ...template };
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.policy = policyOrTemplate;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the underlying policy configuration.
|
|
69
|
+
*/
|
|
70
|
+
getPolicy() {
|
|
71
|
+
return this.policy;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evaluate an action + result against the policy.
|
|
75
|
+
*/
|
|
76
|
+
evaluate(input, result, environment) {
|
|
77
|
+
// 1. Allowlist check (always wins)
|
|
78
|
+
if (this.policy.allowlist && this.policy.allowlist.length > 0) {
|
|
79
|
+
const allowMatch = this.matchList(this.policy.allowlist, input);
|
|
80
|
+
if (allowMatch) {
|
|
81
|
+
return {
|
|
82
|
+
allowed: true,
|
|
83
|
+
reason: allowMatch.reason ?? 'Matched allowlist entry',
|
|
84
|
+
policyName: this.policy.name,
|
|
85
|
+
matchedAllowlist: allowMatch,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 2. Blocklist check (trumps score)
|
|
90
|
+
if (this.policy.blocklist && this.policy.blocklist.length > 0) {
|
|
91
|
+
const blockMatch = this.matchList(this.policy.blocklist, input);
|
|
92
|
+
if (blockMatch) {
|
|
93
|
+
return {
|
|
94
|
+
allowed: false,
|
|
95
|
+
reason: blockMatch.reason ?? 'Matched blocklist entry',
|
|
96
|
+
policyName: this.policy.name,
|
|
97
|
+
matchedBlocklist: blockMatch,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 3. Environment overrides
|
|
102
|
+
const effectiveLevel = this.getEffectiveLevel(environment);
|
|
103
|
+
const effectiveRules = this.getEffectiveRules(environment);
|
|
104
|
+
// 4. Custom rules
|
|
105
|
+
if (effectiveRules && effectiveRules.length > 0) {
|
|
106
|
+
for (const rule of effectiveRules) {
|
|
107
|
+
// Check if rule applies to this action type
|
|
108
|
+
if (rule.actionTypes && rule.actionTypes.length > 0) {
|
|
109
|
+
if (!rule.actionTypes.includes(input.type))
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Check if rule applies to this primitive
|
|
113
|
+
if (rule.primitives && rule.primitives.length > 0) {
|
|
114
|
+
if (!result.primitive || !rule.primitives.includes(result.primitive))
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Check min score
|
|
118
|
+
if (rule.minScore !== undefined && result.score < rule.minScore)
|
|
119
|
+
continue;
|
|
120
|
+
// Check block level
|
|
121
|
+
if (this.levelMeetsThreshold(result.level, rule.blockLevel)) {
|
|
122
|
+
return {
|
|
123
|
+
allowed: false,
|
|
124
|
+
reason: `Blocked by policy rule (${rule.blockLevel} threshold)`,
|
|
125
|
+
policyName: this.policy.name,
|
|
126
|
+
matchedRule: JSON.stringify(rule),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// 5. Base level fallback
|
|
132
|
+
const blocked = this.isBlockedByLevel(result.level, effectiveLevel);
|
|
133
|
+
return {
|
|
134
|
+
allowed: !blocked,
|
|
135
|
+
reason: blocked
|
|
136
|
+
? `Blocked by ${effectiveLevel} policy (${result.level} result)`
|
|
137
|
+
: 'Allowed by policy',
|
|
138
|
+
policyName: this.policy.name,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if a result requires human approval based on policy.
|
|
143
|
+
*/
|
|
144
|
+
requiresApproval(result) {
|
|
145
|
+
if (this.policy.requireApprovalForDanger && result.level === 'DANGER') {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
if (this.policy.requireApprovalForCaution && result.level === 'CAUTION') {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
getEffectiveLevel(environment) {
|
|
154
|
+
if (environment && this.policy.environments) {
|
|
155
|
+
const override = this.policy.environments.find((e) => e.environment === environment);
|
|
156
|
+
if (override?.level)
|
|
157
|
+
return override.level;
|
|
158
|
+
}
|
|
159
|
+
return this.policy.level;
|
|
160
|
+
}
|
|
161
|
+
getEffectiveRules(environment) {
|
|
162
|
+
const baseRules = this.policy.rules ?? [];
|
|
163
|
+
if (environment && this.policy.environments) {
|
|
164
|
+
const override = this.policy.environments.find((e) => e.environment === environment);
|
|
165
|
+
if (override?.rules) {
|
|
166
|
+
return [...baseRules, ...override.rules];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return baseRules;
|
|
170
|
+
}
|
|
171
|
+
matchList(list, input) {
|
|
172
|
+
for (const entry of list) {
|
|
173
|
+
if (entry.type !== input.type)
|
|
174
|
+
continue;
|
|
175
|
+
if (entry.isRegex) {
|
|
176
|
+
try {
|
|
177
|
+
const regex = new RegExp(entry.pattern, 'i');
|
|
178
|
+
if (regex.test(input.value))
|
|
179
|
+
return entry;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Invalid regex — skip
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Glob-like matching: * matches any sequence, ? matches single char
|
|
187
|
+
if (this.globMatch(entry.pattern, input.value))
|
|
188
|
+
return entry;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
globMatch(pattern, value) {
|
|
194
|
+
// Convert glob to regex: escape special chars, then replace * and ?
|
|
195
|
+
const escaped = pattern
|
|
196
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
197
|
+
.replace(/\*/g, '.*')
|
|
198
|
+
.replace(/\?/g, '.');
|
|
199
|
+
try {
|
|
200
|
+
return new RegExp(`^${escaped}$`, 'i').test(value);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
levelMeetsThreshold(resultLevel, blockLevel) {
|
|
207
|
+
const order = { SAFE: 0, CAUTION: 1, DANGER: 2 };
|
|
208
|
+
const resultOrder = order[resultLevel] ?? 0;
|
|
209
|
+
const blockOrder = order[blockLevel] ?? 0;
|
|
210
|
+
return resultOrder >= blockOrder;
|
|
211
|
+
}
|
|
212
|
+
isBlockedByLevel(resultLevel, policyLevel) {
|
|
213
|
+
switch (policyLevel) {
|
|
214
|
+
case 'permissive':
|
|
215
|
+
return false;
|
|
216
|
+
case 'balanced':
|
|
217
|
+
return resultLevel === 'DANGER';
|
|
218
|
+
case 'strict':
|
|
219
|
+
return resultLevel === 'CAUTION' || resultLevel === 'DANGER';
|
|
220
|
+
default:
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=policy-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../src/policy-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ActionInput, ActionContext, CheckResult, ChainDetection, SessionState, SessionInfo } from '@surfinguard/types';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory session tracker for multi-step attack chain detection.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SessionTracker {
|
|
6
|
+
private sessions;
|
|
7
|
+
private chainDefinitions;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Record an action result in a session and detect chains.
|
|
11
|
+
*/
|
|
12
|
+
recordAction(sessionId: string, input: ActionInput, result: CheckResult, agentId?: string): {
|
|
13
|
+
contextBoost: number;
|
|
14
|
+
chainDetections: ChainDetection[];
|
|
15
|
+
riskTrend: 'rising' | 'stable' | 'declining';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Get a session by ID.
|
|
19
|
+
*/
|
|
20
|
+
getSession(sessionId: string): SessionState | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Get session summary info (for API responses).
|
|
23
|
+
*/
|
|
24
|
+
getSessionInfo(sessionId: string): SessionInfo | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Build an ActionContext from session state (for passing to engine).
|
|
27
|
+
*/
|
|
28
|
+
buildContext(sessionId: string): ActionContext | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Clear a specific session.
|
|
31
|
+
*/
|
|
32
|
+
clearSession(sessionId: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Remove all expired sessions.
|
|
35
|
+
*/
|
|
36
|
+
pruneExpiredSessions(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Get all active session IDs.
|
|
39
|
+
*/
|
|
40
|
+
getActiveSessionIds(): string[];
|
|
41
|
+
private getOrCreateSession;
|
|
42
|
+
private isExpired;
|
|
43
|
+
/**
|
|
44
|
+
* Detect active chains in a session by walking chain definitions.
|
|
45
|
+
*/
|
|
46
|
+
private detectChains;
|
|
47
|
+
private actionMatchesStep;
|
|
48
|
+
private computeTrend;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=session-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EACb,WAAW,EACX,cAAc,EAGd,YAAY,EACZ,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAO5B;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,gBAAgB,CAAoB;;IAM5C;;OAEG;IACH,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,MAAM,GACf;QACD,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,cAAc,EAAE,CAAC;QAClC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;KAC9C;IAiDD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAe1D;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAgB1D;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAW9B;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAK/B,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,YAAY;IA8EpB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,YAAY;CA4BrB"}
|