atabey-shared 0.0.23 → 0.0.25
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/dist/audit-chain.d.ts +51 -0
- package/dist/audit-chain.js +85 -0
- package/dist/audit-chain.js.map +1 -0
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +82 -18
- package/dist/audit.js.map +1 -1
- package/dist/file-lock.d.ts +85 -0
- package/dist/file-lock.js +246 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +53 -0
- package/dist/job-queue.js +127 -0
- package/dist/job-queue.js.map +1 -0
- package/dist/policy-gate.d.ts +42 -0
- package/dist/policy-gate.js +148 -0
- package/dist/policy-gate.js.map +1 -0
- package/dist/resilience.d.ts +84 -0
- package/dist/resilience.js +217 -0
- package/dist/resilience.js.map +1 -0
- package/dist/sandbox-fs.d.ts +28 -0
- package/dist/sandbox-fs.js +148 -0
- package/dist/sandbox-fs.js.map +1 -0
- package/dist/sandbox-runtime.d.ts +85 -0
- package/dist/sandbox-runtime.js +250 -0
- package/dist/sandbox-runtime.js.map +1 -0
- package/dist/sandbox.d.ts +54 -0
- package/dist/sandbox.js +179 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/worker-pool.d.ts +52 -0
- package/dist/worker-pool.js +210 -0
- package/dist/worker-pool.js.map +1 -0
- package/dist/worker-thread.d.ts +21 -0
- package/dist/worker-thread.js +67 -0
- package/dist/worker-thread.js.map +1 -0
- package/package.json +12 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./database.js";
|
|
|
2
2
|
export * from "./pii.js";
|
|
3
3
|
export * from "./lock.js";
|
|
4
4
|
export * from "./audit.js";
|
|
5
|
+
export * from "./audit-chain.js";
|
|
5
6
|
export * from "./logger.js";
|
|
6
7
|
export * from "./retention.js";
|
|
7
8
|
export * from "./errors.js";
|
|
@@ -9,3 +10,11 @@ export * from "./constants.js";
|
|
|
9
10
|
export * from "./string.js";
|
|
10
11
|
export * from "./types.js";
|
|
11
12
|
export * from "./fs.js";
|
|
13
|
+
export * from "./job-queue.js";
|
|
14
|
+
export * from "./worker-pool.js";
|
|
15
|
+
export * from "./file-lock.js";
|
|
16
|
+
export * from "./sandbox.js";
|
|
17
|
+
export * from "./sandbox-runtime.js";
|
|
18
|
+
export * from "./sandbox-fs.js";
|
|
19
|
+
export * from "./resilience.js";
|
|
20
|
+
export * from "./policy-gate.js";
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./database.js";
|
|
|
2
2
|
export * from "./pii.js";
|
|
3
3
|
export * from "./lock.js";
|
|
4
4
|
export * from "./audit.js";
|
|
5
|
+
export * from "./audit-chain.js";
|
|
5
6
|
export * from "./logger.js";
|
|
6
7
|
export * from "./retention.js";
|
|
7
8
|
export * from "./errors.js";
|
|
@@ -9,4 +10,12 @@ export * from "./constants.js";
|
|
|
9
10
|
export * from "./string.js";
|
|
10
11
|
export * from "./types.js";
|
|
11
12
|
export * from "./fs.js";
|
|
13
|
+
export * from "./job-queue.js";
|
|
14
|
+
export * from "./worker-pool.js";
|
|
15
|
+
export * from "./file-lock.js";
|
|
16
|
+
export * from "./sandbox.js";
|
|
17
|
+
export * from "./sandbox-runtime.js";
|
|
18
|
+
export * from "./sandbox-fs.js";
|
|
19
|
+
export * from "./resilience.js";
|
|
20
|
+
export * from "./policy-gate.js";
|
|
12
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Job Queue — concurrency-limited async work dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* Prevents unbounded parallel LLM / agent work from ballooning memory
|
|
5
|
+
* or starving the main event loop. No Redis / BullMQ required.
|
|
6
|
+
*
|
|
7
|
+
* Jobs run on the calling process (async functions). Pair with WorkerPool
|
|
8
|
+
* when true thread isolation is needed for CPU-bound work.
|
|
9
|
+
*/
|
|
10
|
+
export interface JobQueueOptions {
|
|
11
|
+
/** Max concurrent running jobs. Default: os.cpus().length (min 1, max 16). */
|
|
12
|
+
maxConcurrency?: number;
|
|
13
|
+
/** Optional name for diagnostics. */
|
|
14
|
+
name?: string;
|
|
15
|
+
/** Called when a job fails (after the promise rejects to the caller). */
|
|
16
|
+
onError?: (error: unknown, jobId: number) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface JobQueueStats {
|
|
19
|
+
name: string;
|
|
20
|
+
maxConcurrency: number;
|
|
21
|
+
running: number;
|
|
22
|
+
pending: number;
|
|
23
|
+
completed: number;
|
|
24
|
+
failed: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class InMemoryJobQueue {
|
|
27
|
+
private readonly maxConcurrency;
|
|
28
|
+
private readonly name;
|
|
29
|
+
private readonly onError?;
|
|
30
|
+
private readonly pending;
|
|
31
|
+
private running;
|
|
32
|
+
private nextId;
|
|
33
|
+
private completed;
|
|
34
|
+
private failed;
|
|
35
|
+
private closed;
|
|
36
|
+
constructor(options?: JobQueueOptions);
|
|
37
|
+
/**
|
|
38
|
+
* Enqueue an async job. Resolves/rejects with the job result.
|
|
39
|
+
* Back-pressures via wait in the queue — does not spawn unbounded work.
|
|
40
|
+
*/
|
|
41
|
+
enqueue<T>(fn: () => Promise<T>): Promise<T>;
|
|
42
|
+
/** Current queue diagnostics. */
|
|
43
|
+
getStats(): JobQueueStats;
|
|
44
|
+
/** Reject pending jobs and stop accepting new ones. In-flight jobs finish. */
|
|
45
|
+
close(reason?: string): void;
|
|
46
|
+
/** Wait until running + pending reach zero (or timeout). */
|
|
47
|
+
drain(timeoutMs?: number): Promise<void>;
|
|
48
|
+
private pump;
|
|
49
|
+
private execute;
|
|
50
|
+
}
|
|
51
|
+
export declare function getAgentJobQueue(options?: JobQueueOptions): InMemoryJobQueue;
|
|
52
|
+
/** Test helper — reset singleton. */
|
|
53
|
+
export declare function resetAgentJobQueue(): void;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Job Queue — concurrency-limited async work dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* Prevents unbounded parallel LLM / agent work from ballooning memory
|
|
5
|
+
* or starving the main event loop. No Redis / BullMQ required.
|
|
6
|
+
*
|
|
7
|
+
* Jobs run on the calling process (async functions). Pair with WorkerPool
|
|
8
|
+
* when true thread isolation is needed for CPU-bound work.
|
|
9
|
+
*/
|
|
10
|
+
import os from "os";
|
|
11
|
+
export class InMemoryJobQueue {
|
|
12
|
+
maxConcurrency;
|
|
13
|
+
name;
|
|
14
|
+
onError;
|
|
15
|
+
pending = [];
|
|
16
|
+
running = 0;
|
|
17
|
+
nextId = 1;
|
|
18
|
+
completed = 0;
|
|
19
|
+
failed = 0;
|
|
20
|
+
closed = false;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
const cpus = Math.max(1, os.cpus()?.length || 1);
|
|
23
|
+
const requested = options.maxConcurrency ?? cpus;
|
|
24
|
+
this.maxConcurrency = Math.max(1, Math.min(requested, 16));
|
|
25
|
+
this.name = options.name ?? "default";
|
|
26
|
+
this.onError = options.onError;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Enqueue an async job. Resolves/rejects with the job result.
|
|
30
|
+
* Back-pressures via wait in the queue — does not spawn unbounded work.
|
|
31
|
+
*/
|
|
32
|
+
enqueue(fn) {
|
|
33
|
+
if (this.closed) {
|
|
34
|
+
return Promise.reject(new Error(`[JobQueue:${this.name}] Queue is closed; cannot accept new jobs.`));
|
|
35
|
+
}
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const item = {
|
|
38
|
+
id: this.nextId++,
|
|
39
|
+
run: fn,
|
|
40
|
+
resolve,
|
|
41
|
+
reject,
|
|
42
|
+
};
|
|
43
|
+
this.pending.push(item);
|
|
44
|
+
this.pump();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Current queue diagnostics. */
|
|
48
|
+
getStats() {
|
|
49
|
+
return {
|
|
50
|
+
name: this.name,
|
|
51
|
+
maxConcurrency: this.maxConcurrency,
|
|
52
|
+
running: this.running,
|
|
53
|
+
pending: this.pending.length,
|
|
54
|
+
completed: this.completed,
|
|
55
|
+
failed: this.failed,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Reject pending jobs and stop accepting new ones. In-flight jobs finish. */
|
|
59
|
+
close(reason = "Queue closed") {
|
|
60
|
+
this.closed = true;
|
|
61
|
+
while (this.pending.length > 0) {
|
|
62
|
+
const item = this.pending.shift();
|
|
63
|
+
item?.reject(new Error(`[JobQueue:${this.name}] ${reason}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Wait until running + pending reach zero (or timeout). */
|
|
67
|
+
async drain(timeoutMs = 30_000) {
|
|
68
|
+
const start = Date.now();
|
|
69
|
+
while (this.running > 0 || this.pending.length > 0) {
|
|
70
|
+
if (Date.now() - start > timeoutMs) {
|
|
71
|
+
throw new Error(`[JobQueue:${this.name}] drain timed out after ${timeoutMs}ms`);
|
|
72
|
+
}
|
|
73
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
pump() {
|
|
77
|
+
while (this.running < this.maxConcurrency && this.pending.length > 0) {
|
|
78
|
+
const item = this.pending.shift();
|
|
79
|
+
if (!item)
|
|
80
|
+
break;
|
|
81
|
+
this.running++;
|
|
82
|
+
void this.execute(item);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async execute(item) {
|
|
86
|
+
try {
|
|
87
|
+
const result = await item.run();
|
|
88
|
+
this.completed++;
|
|
89
|
+
item.resolve(result);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.failed++;
|
|
93
|
+
try {
|
|
94
|
+
this.onError?.(error, item.id);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// ignore listener errors
|
|
98
|
+
}
|
|
99
|
+
item.reject(error);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.running--;
|
|
103
|
+
this.pump();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Shared singleton for agent orchestration (lazy). */
|
|
108
|
+
let agentJobQueue = null;
|
|
109
|
+
export function getAgentJobQueue(options) {
|
|
110
|
+
if (!agentJobQueue) {
|
|
111
|
+
const fromEnv = process.env.ATABEY_JOB_CONCURRENCY
|
|
112
|
+
? parseInt(process.env.ATABEY_JOB_CONCURRENCY, 10)
|
|
113
|
+
: undefined;
|
|
114
|
+
agentJobQueue = new InMemoryJobQueue({
|
|
115
|
+
name: "agent",
|
|
116
|
+
maxConcurrency: options?.maxConcurrency ?? (Number.isFinite(fromEnv) ? fromEnv : undefined),
|
|
117
|
+
onError: options?.onError,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return agentJobQueue;
|
|
121
|
+
}
|
|
122
|
+
/** Test helper — reset singleton. */
|
|
123
|
+
export function resetAgentJobQueue() {
|
|
124
|
+
agentJobQueue?.close("reset");
|
|
125
|
+
agentJobQueue = null;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=job-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../src/job-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PolicyGate — single decision point for mutating / sensitive operations.
|
|
3
|
+
*
|
|
4
|
+
* Phase 0 foundation for enterprise hard-gate security.
|
|
5
|
+
* Every MCP mutating tool should call evaluateToolCall() before side effects.
|
|
6
|
+
*
|
|
7
|
+
* Decision is pure (no I/O) except optional hooks; MCP layer may enrich with
|
|
8
|
+
* project-specific RBAC before/after this gate.
|
|
9
|
+
*/
|
|
10
|
+
export type PolicyEffect = "allow" | "deny";
|
|
11
|
+
export type PolicyCode = "ALLOW" | "DENY_UNKNOWN_TOOL" | "DENY_PATH_TRAVERSAL" | "DENY_PROTECTED_PATH" | "DENY_ABSOLUTE_ESCAPE" | "DENY_RECON_MUTATION" | "DENY_SHELL_METACHAR" | "DENY_EMPTY_PATH";
|
|
12
|
+
export interface PolicyDecision {
|
|
13
|
+
effect: PolicyEffect;
|
|
14
|
+
code: PolicyCode;
|
|
15
|
+
reason: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolCallPolicyInput {
|
|
18
|
+
tool: string;
|
|
19
|
+
agent: string;
|
|
20
|
+
args: Record<string, unknown>;
|
|
21
|
+
/** Optional agent tier when known (supreme | core | recon). */
|
|
22
|
+
tier?: "supreme" | "core" | "recon";
|
|
23
|
+
}
|
|
24
|
+
/** Tools that mutate disk, process state, or external systems. */
|
|
25
|
+
export declare const MUTATING_TOOLS: Set<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Normalize agent id to @name form.
|
|
28
|
+
*/
|
|
29
|
+
export declare function normalizeAgentId(agent: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Evaluate a tool call against baseline hard rules (path safety, recon, shell meta).
|
|
32
|
+
* Does NOT replace full RBAC matrix — call permissions layer separately or wrap here later.
|
|
33
|
+
*/
|
|
34
|
+
export declare function evaluateToolCall(input: ToolCallPolicyInput): PolicyDecision;
|
|
35
|
+
/**
|
|
36
|
+
* True when decision is allow.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isAllowed(decision: PolicyDecision): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Format decision for MCP error payloads.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatPolicyDenial(decision: PolicyDecision): string;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PolicyGate — single decision point for mutating / sensitive operations.
|
|
3
|
+
*
|
|
4
|
+
* Phase 0 foundation for enterprise hard-gate security.
|
|
5
|
+
* Every MCP mutating tool should call evaluateToolCall() before side effects.
|
|
6
|
+
*
|
|
7
|
+
* Decision is pure (no I/O) except optional hooks; MCP layer may enrich with
|
|
8
|
+
* project-specific RBAC before/after this gate.
|
|
9
|
+
*/
|
|
10
|
+
/** Tools that mutate disk, process state, or external systems. */
|
|
11
|
+
export const MUTATING_TOOLS = new Set([
|
|
12
|
+
"write_file",
|
|
13
|
+
"replace_text",
|
|
14
|
+
"patch_file",
|
|
15
|
+
"batch_surgical_edit",
|
|
16
|
+
"run_shell_command",
|
|
17
|
+
"compress_files",
|
|
18
|
+
"decompress_files",
|
|
19
|
+
"delete_knowledge",
|
|
20
|
+
"update_project_memory",
|
|
21
|
+
"store_knowledge",
|
|
22
|
+
"update_contract_hash",
|
|
23
|
+
]);
|
|
24
|
+
/** Path-like arg keys commonly used by tools. */
|
|
25
|
+
const PATH_KEYS = ["path", "file", "filePath", "target", "output", "source", "archive"];
|
|
26
|
+
/** Relative path segments that must never be written by agents by default. */
|
|
27
|
+
const PROTECTED_PATH_PATTERNS = [
|
|
28
|
+
/(^|\/)\.env(\.|$)/i,
|
|
29
|
+
/(^|\/)\.env\.[^/]+$/i,
|
|
30
|
+
/(^|\/)\.ssh(\/|$)/i,
|
|
31
|
+
/(^|\/)\.gnupg(\/|$)/i,
|
|
32
|
+
/(^|\/)id_rsa$/i,
|
|
33
|
+
/(^|\/)id_ed25519$/i,
|
|
34
|
+
/(^|\/)credentials\.json$/i,
|
|
35
|
+
/(^|\/)\.aws\/credentials$/i,
|
|
36
|
+
/(^|\/)\.npmrc$/i,
|
|
37
|
+
/(^|\/)\.netrc$/i,
|
|
38
|
+
];
|
|
39
|
+
function allow(code = "ALLOW", reason = "Allowed") {
|
|
40
|
+
return { effect: "allow", code, reason };
|
|
41
|
+
}
|
|
42
|
+
function deny(code, reason) {
|
|
43
|
+
return { effect: "deny", code, reason };
|
|
44
|
+
}
|
|
45
|
+
function collectPaths(args) {
|
|
46
|
+
const paths = [];
|
|
47
|
+
for (const key of PATH_KEYS) {
|
|
48
|
+
const v = args[key];
|
|
49
|
+
if (typeof v === "string" && v.trim())
|
|
50
|
+
paths.push(v.trim());
|
|
51
|
+
}
|
|
52
|
+
// batch_surgical_edit
|
|
53
|
+
if (Array.isArray(args.edits)) {
|
|
54
|
+
for (const edit of args.edits) {
|
|
55
|
+
if (edit && typeof edit === "object" && typeof edit.path === "string") {
|
|
56
|
+
paths.push(edit.path.trim());
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return paths;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalize agent id to @name form.
|
|
64
|
+
*/
|
|
65
|
+
export function normalizeAgentId(agent) {
|
|
66
|
+
const a = (agent || "mcp-client").trim();
|
|
67
|
+
if (!a)
|
|
68
|
+
return "@mcp-client";
|
|
69
|
+
return a.startsWith("@") ? a : `@${a}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Evaluate a tool call against baseline hard rules (path safety, recon, shell meta).
|
|
73
|
+
* Does NOT replace full RBAC matrix — call permissions layer separately or wrap here later.
|
|
74
|
+
*/
|
|
75
|
+
export function evaluateToolCall(input) {
|
|
76
|
+
const tool = input.tool;
|
|
77
|
+
const agent = normalizeAgentId(input.agent);
|
|
78
|
+
const tier = input.tier;
|
|
79
|
+
const args = input.args || {};
|
|
80
|
+
if (!tool) {
|
|
81
|
+
return deny("DENY_UNKNOWN_TOOL", "Missing tool name");
|
|
82
|
+
}
|
|
83
|
+
const isMutating = MUTATING_TOOLS.has(tool);
|
|
84
|
+
// Path safety for any tool that carries paths (read or write)
|
|
85
|
+
const paths = collectPaths(args);
|
|
86
|
+
for (const p of paths) {
|
|
87
|
+
if (!p) {
|
|
88
|
+
return deny("DENY_EMPTY_PATH", "Empty path argument is not allowed");
|
|
89
|
+
}
|
|
90
|
+
// Null bytes / obvious traversal
|
|
91
|
+
if (p.includes("\0")) {
|
|
92
|
+
return deny("DENY_PATH_TRAVERSAL", "Path contains illegal null byte");
|
|
93
|
+
}
|
|
94
|
+
// Windows + POSIX traversal
|
|
95
|
+
if (p.includes("..")) {
|
|
96
|
+
// Allow only if not used as parent segment — simple hard deny for Phase 0
|
|
97
|
+
const segments = p.replace(/\\/g, "/").split("/");
|
|
98
|
+
if (segments.some((s) => s === "..")) {
|
|
99
|
+
return deny("DENY_PATH_TRAVERSAL", `Path traversal denied for "${p}". Paths must stay inside the project root.`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Absolute paths that look like host escapes (MCP should still safePath; belt-and-suspenders)
|
|
103
|
+
if (p.startsWith("/") || /^[A-Za-z]:[\\/]/.test(p)) {
|
|
104
|
+
// Absolute can be OK if still under project after safePath — flag high-risk patterns only
|
|
105
|
+
if (p.startsWith("/etc") ||
|
|
106
|
+
p.startsWith("/usr") ||
|
|
107
|
+
p.startsWith("/bin") ||
|
|
108
|
+
p.startsWith("/sbin") ||
|
|
109
|
+
p.includes("/.ssh") ||
|
|
110
|
+
p.startsWith("/System")) {
|
|
111
|
+
return deny("DENY_ABSOLUTE_ESCAPE", `Absolute system path denied: "${p}"`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (isMutating) {
|
|
115
|
+
const normalized = p.replace(/\\/g, "/");
|
|
116
|
+
for (const re of PROTECTED_PATH_PATTERNS) {
|
|
117
|
+
if (re.test(normalized)) {
|
|
118
|
+
return deny("DENY_PROTECTED_PATH", `Write/mutate denied for protected path "${p}". Secrets and credential files are blocked by PolicyGate.`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Recon agents: no mutating tools (matrix may later grant exceptions — Phase 0 hard deny)
|
|
124
|
+
if (isMutating && tier === "recon") {
|
|
125
|
+
return deny("DENY_RECON_MUTATION", `Agent ${agent} (tier: recon) cannot invoke mutating tool "${tool}".`);
|
|
126
|
+
}
|
|
127
|
+
// Shell metacharacters (defense in depth; shell tool also checks)
|
|
128
|
+
if (tool === "run_shell_command") {
|
|
129
|
+
const command = String(args.command ?? "");
|
|
130
|
+
if (/[;&|><$`\n\r]/.test(command)) {
|
|
131
|
+
return deny("DENY_SHELL_METACHAR", "Shell metacharacters are forbidden to prevent command injection.");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return allow();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* True when decision is allow.
|
|
138
|
+
*/
|
|
139
|
+
export function isAllowed(decision) {
|
|
140
|
+
return decision.effect === "allow";
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Format decision for MCP error payloads.
|
|
144
|
+
*/
|
|
145
|
+
export function formatPolicyDenial(decision) {
|
|
146
|
+
return `[POLICY_GATE] ${decision.code}: ${decision.reason}`;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=policy-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-gate.js","sourceRoot":"","sources":["../src/policy-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polly-style resilience primitives — no external deps.
|
|
3
|
+
*
|
|
4
|
+
* - withRetry: exponential backoff + jitter for transient failures
|
|
5
|
+
* - CircuitBreaker: closed → open → half-open state machine
|
|
6
|
+
* - withResilience: compose retry + circuit breaker
|
|
7
|
+
*
|
|
8
|
+
* Typical use: LLM provider rate limits, timeouts, 5xx, network blips.
|
|
9
|
+
*/
|
|
10
|
+
export type CircuitState = "closed" | "open" | "half-open";
|
|
11
|
+
export interface RetryOptions {
|
|
12
|
+
/** Max attempts including the first try. Default: 3 */
|
|
13
|
+
maxAttempts?: number;
|
|
14
|
+
/** Initial delay in ms. Default: 100 */
|
|
15
|
+
baseDelayMs?: number;
|
|
16
|
+
/** Cap on delay in ms. Default: 10_000 */
|
|
17
|
+
maxDelayMs?: number;
|
|
18
|
+
/** Exponential factor. Default: 2 */
|
|
19
|
+
factor?: number;
|
|
20
|
+
/** Add random jitter [0, delay). Default: true */
|
|
21
|
+
jitter?: boolean;
|
|
22
|
+
/** Return true to retry this error. Default: retry all */
|
|
23
|
+
retryIf?: (error: unknown, attempt: number) => boolean;
|
|
24
|
+
/** Optional hook before each sleep */
|
|
25
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
|
|
26
|
+
/** Optional abort signal */
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}
|
|
29
|
+
export interface CircuitBreakerOptions {
|
|
30
|
+
/** Failures in closed state before opening. Default: 5 */
|
|
31
|
+
failureThreshold?: number;
|
|
32
|
+
/** Successes in half-open before closing. Default: 2 */
|
|
33
|
+
successThreshold?: number;
|
|
34
|
+
/** Time to wait in open before half-open probe. Default: 30_000 */
|
|
35
|
+
openMs?: number;
|
|
36
|
+
/** Optional name for error messages */
|
|
37
|
+
name?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare class CircuitOpenError extends Error {
|
|
40
|
+
readonly circuit: string;
|
|
41
|
+
readonly retryAfterMs: number;
|
|
42
|
+
constructor(circuit: string, retryAfterMs: number);
|
|
43
|
+
}
|
|
44
|
+
export declare class CircuitBreaker {
|
|
45
|
+
private state;
|
|
46
|
+
private failures;
|
|
47
|
+
private successes;
|
|
48
|
+
private openedAt;
|
|
49
|
+
private readonly failureThreshold;
|
|
50
|
+
private readonly successThreshold;
|
|
51
|
+
private readonly openMs;
|
|
52
|
+
private readonly name;
|
|
53
|
+
constructor(options?: CircuitBreakerOptions);
|
|
54
|
+
getState(): CircuitState;
|
|
55
|
+
getStats(): {
|
|
56
|
+
state: CircuitState;
|
|
57
|
+
failures: number;
|
|
58
|
+
successes: number;
|
|
59
|
+
name: string;
|
|
60
|
+
};
|
|
61
|
+
/** Manual reset (e.g. after operator intervention). */
|
|
62
|
+
reset(): void;
|
|
63
|
+
exec<T>(fn: () => Promise<T>): Promise<T>;
|
|
64
|
+
private maybeTransitionToHalfOpen;
|
|
65
|
+
private onSuccess;
|
|
66
|
+
private onFailure;
|
|
67
|
+
private trip;
|
|
68
|
+
}
|
|
69
|
+
export declare function computeBackoffDelay(attempt: number, options?: Pick<RetryOptions, "baseDelayMs" | "maxDelayMs" | "factor" | "jitter">): number;
|
|
70
|
+
export declare function withRetry<T>(fn: (attempt: number) => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
71
|
+
export interface ResilienceOptions {
|
|
72
|
+
retry?: RetryOptions;
|
|
73
|
+
circuitBreaker?: CircuitBreaker;
|
|
74
|
+
/** If true, CircuitOpenError is not retried (default true). */
|
|
75
|
+
skipRetryOnOpenCircuit?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Execute `fn` through optional circuit breaker + retry with exponential backoff.
|
|
79
|
+
*/
|
|
80
|
+
export declare function withResilience<T>(fn: (attempt: number) => Promise<T>, options?: ResilienceOptions): Promise<T>;
|
|
81
|
+
/** Heuristic: retry rate limits, timeouts, and common transient network errors. */
|
|
82
|
+
export declare function isTransientError(error: unknown): boolean;
|
|
83
|
+
export declare function getCircuitBreaker(name: string, options?: CircuitBreakerOptions): CircuitBreaker;
|
|
84
|
+
export declare function resetAllCircuitBreakers(): void;
|