atabey-shared 0.0.37 → 0.1.0-beta.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/README.md +2 -2
- package/dist/agent-identity.d.ts +34 -0
- package/dist/agent-identity.js +77 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/api-catalog.d.ts +57 -0
- package/dist/api-catalog.js +254 -0
- package/dist/api-catalog.js.map +1 -0
- package/dist/audit-chain.d.ts +32 -3
- package/dist/audit-chain.js +187 -10
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +44 -7
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +4 -3
- package/dist/constants.js +11 -12
- package/dist/constants.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.js +20 -31
- package/dist/file-lock.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +33 -7
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +18 -0
- package/dist/memory-prune.js +48 -0
- package/dist/memory-prune.js.map +1 -0
- package/dist/migrations.d.ts +69 -0
- package/dist/migrations.js +375 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +39 -0
- package/dist/otel.js +93 -0
- package/dist/otel.js.map +1 -0
- package/dist/outbound-http.d.ts +32 -0
- package/dist/outbound-http.js +88 -0
- package/dist/outbound-http.js.map +1 -0
- package/dist/pii.d.ts +1 -0
- package/dist/pii.js +82 -26
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.js +27 -3
- package/dist/policy-gate.js.map +1 -1
- package/dist/retention.d.ts +6 -1
- package/dist/retention.js +56 -9
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -1
- package/dist/sandbox-fs.js +31 -38
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +21 -28
- package/dist/sandbox-runtime.js +124 -92
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/secrets.d.ts +99 -0
- package/dist/secrets.js +371 -0
- package/dist/secrets.js.map +1 -0
- package/dist/storage.d.ts +67 -0
- package/dist/storage.js +291 -11
- package/dist/storage.js.map +1 -1
- package/dist/time.js +6 -2
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +87 -0
- package/dist/tls.js +154 -0
- package/dist/tls.js.map +1 -0
- package/dist/tokenizer.d.ts +54 -0
- package/dist/tokenizer.js +272 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/worker-pool.js +19 -0
- package/dist/worker-pool.js.map +1 -1
- package/package.json +18 -6
package/dist/pii.js
CHANGED
|
@@ -17,15 +17,36 @@
|
|
|
17
17
|
* - Date of birth / full address patterns
|
|
18
18
|
* - Custom names (configurable)
|
|
19
19
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
/** Turkish TC Kimlik No checksum (reduces over-masking of arbitrary 11-digit numbers). */
|
|
21
|
+
function isValidTckn(value) {
|
|
22
|
+
if (!/^[1-9]\d{10}$/.test(value))
|
|
23
|
+
return false;
|
|
24
|
+
const d = value.split("").map(Number);
|
|
25
|
+
const odd = d[0] + d[2] + d[4] + d[6] + d[8];
|
|
26
|
+
const even = d[1] + d[3] + d[5] + d[7];
|
|
27
|
+
const tenth = (((odd * 7) - even) % 10 + 10) % 10;
|
|
28
|
+
if (tenth !== d[9])
|
|
29
|
+
return false;
|
|
30
|
+
const sumFirst10 = d.slice(0, 10).reduce((a, b) => a + b, 0);
|
|
31
|
+
return sumFirst10 % 10 === d[10];
|
|
32
|
+
}
|
|
33
|
+
function isValidIpv4(value) {
|
|
34
|
+
return value.split(".").every((o) => {
|
|
35
|
+
const n = Number(o);
|
|
36
|
+
return Number.isInteger(n) && n >= 0 && n <= 255;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** Only treat a colon-group as IPv6 when it has a hex letter or a `::` (not a time). */
|
|
40
|
+
function looksLikeIpv6(value) {
|
|
41
|
+
return value.includes("::") || /[a-fA-F]/.test(value);
|
|
42
|
+
}
|
|
22
43
|
const SENSITIVE_PATTERNS = [
|
|
23
44
|
// JWT tokens (complete JWT format) - must be before Bearer
|
|
24
45
|
{ pattern: /eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g, replacement: "***-JWT-REDACTED-***" },
|
|
25
|
-
// Bearer tokens in Authorization headers
|
|
26
|
-
{ pattern: /Bearer\s+[
|
|
46
|
+
// Bearer tokens in Authorization headers (case-insensitive; includes base64url chars)
|
|
47
|
+
{ pattern: /Bearer\s+[A-Za-z0-9._~+/=-]+/gi, replacement: "Bearer ***-REDACTED-***" },
|
|
27
48
|
// Basic auth in Authorization headers
|
|
28
|
-
{ pattern: /Basic\s+[a-zA-Z0-9=+/]+/
|
|
49
|
+
{ pattern: /Basic\s+[a-zA-Z0-9=+/]+/gi, replacement: "Basic ***-REDACTED-***" },
|
|
29
50
|
// API keys (common formats) - must be before generic patterns
|
|
30
51
|
// Note: ghp_ tokens can contain digits that look like phone numbers, so we mask the entire prefix + suffix
|
|
31
52
|
{ pattern: /\b(sk-[a-zA-Z0-9]{20,}|pk-[a-zA-Z0-9]{20,}|xai-[a-zA-Z0-9]{20,}|AIza[0-9A-Za-z_-]{35}|ghp_[a-zA-Z0-9]{36,}|gho_[a-zA-Z0-9]{36,}|ghu_[a-zA-Z0-9]{36,}|ghb_[a-zA-Z0-9]{36,}|github_pat_[a-zA-Z0-9]{36,}|sk-[a-zA-Z0-9_-]{32,}|sk-[a-zA-Z0-9]{48,}|whsec_[a-zA-Z0-9]{16,})\b/g, replacement: "***-REDACTED-***" },
|
|
@@ -35,8 +56,8 @@ const SENSITIVE_PATTERNS = [
|
|
|
35
56
|
{ pattern: /\b(0[1-9]|[12][0-9]|3[01])[/.-](0[1-9]|1[0-2])[/.-](19[0-9]{2}|20[0-9]{2})\b/g, replacement: "**/**/****" },
|
|
36
57
|
// IBAN (international bank account) - strictly matches ISO country codes and length >= 15
|
|
37
58
|
{ pattern: /\b(?:TR|DE|FR|GB|IT|ES|NL|CH|AT|BE|PL|SE|NO|DK|FI|PT|GR|IE|CZ|RO|HU|BG|HR|LT|SI|LV|EE|CY|LU|MT|SK|US|CA)\d{2}[A-Z0-9]{11,30}\b/g, replacement: "****-IBAN-REDACTED-****" },
|
|
38
|
-
// TC Kimlik (11 digits
|
|
39
|
-
{ pattern: /\b[1-9]
|
|
59
|
+
// TC Kimlik (11 digits) — validated with the official checksum to avoid masking arbitrary IDs
|
|
60
|
+
{ pattern: /\b[1-9]\d{10}\b/g, replacement: "***********", validate: isValidTckn },
|
|
40
61
|
// Email
|
|
41
62
|
{ pattern: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, replacement: "***@***" },
|
|
42
63
|
// Phone (Turkish: +90 5xx xxx xx xx, 05xx xxx xx xx, or formatted 5xx xxx xx xx)
|
|
@@ -45,22 +66,24 @@ const SENSITIVE_PATTERNS = [
|
|
|
45
66
|
// Phone (international with leading + or delimited format e.g. +1 (555) 123-4567, +44 20 7946 0950)
|
|
46
67
|
// Delimiters or leading '+' are strictly required so that raw Unix timestamps / IDs are not falsely masked.
|
|
47
68
|
{ pattern: /\b(?:\+\d{1,3}[\s.-]?)?(?:\(\d{2,4}\)[\s.-]?|\d{2,4}[\s.-])\d{3,4}[\s.-]\d{2,4}(?:[\s.-]\d{2,4})?\b/g, replacement: "***-***-****" },
|
|
48
|
-
// IP addresses (IPv4)
|
|
49
|
-
{ pattern: /\b(
|
|
50
|
-
// IP addresses (IPv6 -
|
|
69
|
+
// IP addresses (IPv4) — validated octets only
|
|
70
|
+
{ pattern: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g, replacement: "***.***.***.***", validate: isValidIpv4 },
|
|
71
|
+
// IP addresses (IPv6 - full form)
|
|
51
72
|
{ pattern: /\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g, replacement: "****:****:****:****" },
|
|
52
|
-
// IPv6 compressed
|
|
53
|
-
{ pattern: /\b(?:[0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\b/g, replacement: "****:****:****" },
|
|
73
|
+
// IPv6 compressed — requires `::` or a hex letter so clock times (10:30:45) are not masked
|
|
74
|
+
{ pattern: /\b(?:[0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\b/g, replacement: "****:****:****", validate: looksLikeIpv6 },
|
|
54
75
|
// Credit card (Delimited 16 digits or major card issuer BIN prefixes: Visa 4, MC 51-55/22-27, Discover 6011/65)
|
|
55
76
|
// Prevents false-positive masking of 13-digit Unix timestamps (e.g. 1713000000000)
|
|
56
77
|
{ pattern: /\b\d{4}[ -]\d{4}[ -]\d{4}[ -]\d{4}\b/g, replacement: "****-****-****-****" },
|
|
57
78
|
{ pattern: /\b4\d{3}[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}\b/g, replacement: "****-****-****-****" },
|
|
58
79
|
{ pattern: /\b(?:5[1-5]\d{2}|222[1-9]|22[3-9]\d|2[3-6]\d{2}|27[01]\d|2720)[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}\b/g, replacement: "****-****-****-****" },
|
|
59
80
|
{ pattern: /\b(?:6011|65\d{2})[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}\b/g, replacement: "****-****-****-****" },
|
|
60
|
-
// AMEX (15 digits, starts with 34/37)
|
|
61
|
-
{ pattern: /\b3[47][
|
|
62
|
-
// Password fields in JSON
|
|
81
|
+
// AMEX (15 digits, starts with 34/37) — no whitespace/newlines, exact length
|
|
82
|
+
{ pattern: /\b3[47]\d{2}[ -]?\d{6}[ -]?\d{5}\b/g, replacement: "****-****-***" },
|
|
83
|
+
// Password fields in JSON (double-quoted)
|
|
63
84
|
{ pattern: /"(password|passwd|secret|api_key|apiKey|apikey|auth_token|refresh_token|access_token)"\s*:\s*"[^"]+"/gi, replacement: "\"$1\": \"***-REDACTED-***\"" },
|
|
85
|
+
// Password fields in JSON (single-quoted)
|
|
86
|
+
{ pattern: /'(password|passwd|secret|api_key|apiKey|apikey|auth_token|refresh_token|access_token)'\s*:\s*'[^']*'/gi, replacement: "'$1': '***-REDACTED-***'" },
|
|
64
87
|
// Turkish address patterns (contextual: only when accompanied by street/neighborhood identifiers)
|
|
65
88
|
{ pattern: /(?:(?:sokak|cadde|mahalle|bulvar|apt|daire|blok)[^,\n]*\b(?:no|kapı no|daire no|numara)[:\s]*\d+)/gi, replacement: "no: ****" },
|
|
66
89
|
];
|
|
@@ -87,8 +110,13 @@ export function maskText(text) {
|
|
|
87
110
|
if (!text || typeof text !== "string")
|
|
88
111
|
return text;
|
|
89
112
|
let masked = text;
|
|
90
|
-
for (const { pattern, replacement } of SENSITIVE_PATTERNS) {
|
|
91
|
-
|
|
113
|
+
for (const { pattern, replacement, validate } of SENSITIVE_PATTERNS) {
|
|
114
|
+
if (validate) {
|
|
115
|
+
masked = masked.replace(pattern, (match) => (validate(match) ? replacement : match));
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
masked = masked.replace(pattern, replacement);
|
|
119
|
+
}
|
|
92
120
|
}
|
|
93
121
|
return masked;
|
|
94
122
|
}
|
|
@@ -100,9 +128,11 @@ export function maskText(text) {
|
|
|
100
128
|
*/
|
|
101
129
|
export function maskObject(obj, depth = 0, strictMode = false) {
|
|
102
130
|
if (depth > 10)
|
|
103
|
-
return obj; // Prevent infinite recursion
|
|
131
|
+
return strictMode ? "***-REDACTED-***" : obj; // Prevent infinite recursion
|
|
104
132
|
if (obj === null || obj === undefined)
|
|
105
133
|
return obj;
|
|
134
|
+
if (typeof Buffer !== "undefined" && Buffer.isBuffer(obj))
|
|
135
|
+
return `<Buffer ${obj.length} bytes>`;
|
|
106
136
|
if (typeof obj === "string")
|
|
107
137
|
return maskText(obj);
|
|
108
138
|
if (typeof obj !== "object")
|
|
@@ -112,8 +142,10 @@ export function maskObject(obj, depth = 0, strictMode = false) {
|
|
|
112
142
|
}
|
|
113
143
|
const result = {};
|
|
114
144
|
for (const [key, value] of Object.entries(obj)) {
|
|
115
|
-
//
|
|
116
|
-
|
|
145
|
+
// Sensitive by exact name, or (strict mode) by name heuristic.
|
|
146
|
+
const isSensitive = SENSITIVE_FIELDS.includes(key) ||
|
|
147
|
+
(strictMode && /(pass|secret|token|key|credential|auth)/i.test(key));
|
|
148
|
+
if (isSensitive) {
|
|
117
149
|
result[key] = typeof value === "string" ? "***-REDACTED-***" : maskObject(value, depth + 1, strictMode);
|
|
118
150
|
}
|
|
119
151
|
else if (typeof value === "string") {
|
|
@@ -133,12 +165,15 @@ export function maskObject(obj, depth = 0, strictMode = false) {
|
|
|
133
165
|
* Useful for warning before sending data to external APIs.
|
|
134
166
|
*/
|
|
135
167
|
export function containsPII(text) {
|
|
136
|
-
for (const { pattern } of SENSITIVE_PATTERNS) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
168
|
+
for (const { pattern, validate } of SENSITIVE_PATTERNS) {
|
|
169
|
+
const re = new RegExp(pattern.source, pattern.flags);
|
|
170
|
+
let m;
|
|
171
|
+
while ((m = re.exec(text)) !== null) {
|
|
172
|
+
if (!validate || validate(m[0]))
|
|
173
|
+
return true;
|
|
174
|
+
if (m.index === re.lastIndex)
|
|
175
|
+
re.lastIndex++; // avoid zero-length loops
|
|
176
|
+
}
|
|
142
177
|
}
|
|
143
178
|
return false;
|
|
144
179
|
}
|
|
@@ -217,4 +252,25 @@ export function maskToolArgs(args) {
|
|
|
217
252
|
const masked = maskObject(args, 0, true);
|
|
218
253
|
return masked;
|
|
219
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* Paths where PII masking of tool *results* is intentionally skipped to avoid
|
|
257
|
+
* corrupting technical content (tests, docs, examples, fixtures). Real
|
|
258
|
+
* production secrets are still caught by the secret-leak guard.
|
|
259
|
+
*/
|
|
260
|
+
const PII_BYPASS_PATH_PATTERNS = [
|
|
261
|
+
/(^|\/)tests?\//i,
|
|
262
|
+
/(^|\/)__tests__\//i,
|
|
263
|
+
/\.(test|spec)\.[cm]?[jt]sx?$/i,
|
|
264
|
+
/\.mdx?$/i,
|
|
265
|
+
/(^|\/)docs?\//i,
|
|
266
|
+
/\.env\.example$/i,
|
|
267
|
+
/\.example$/i,
|
|
268
|
+
/(^|\/)fixtures?\//i,
|
|
269
|
+
];
|
|
270
|
+
export function shouldBypassPiiMaskingForPath(filePath) {
|
|
271
|
+
if (!filePath)
|
|
272
|
+
return false;
|
|
273
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
274
|
+
return PII_BYPASS_PATH_PATTERNS.some((re) => re.test(normalized));
|
|
275
|
+
}
|
|
220
276
|
//# sourceMappingURL=pii.js.map
|
package/dist/pii.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../src/pii.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../src/pii.ts"],"names":[],"mappings":"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"}
|
package/dist/policy-gate.js
CHANGED
|
@@ -14,15 +14,25 @@ export const MUTATING_TOOLS = new Set([
|
|
|
14
14
|
"patch_file",
|
|
15
15
|
"batch_surgical_edit",
|
|
16
16
|
"run_shell_command",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"run_tests",
|
|
18
|
+
"check_lint",
|
|
19
|
+
"analyze_code_quality",
|
|
20
|
+
"check_architecture_compliance",
|
|
19
21
|
"delete_knowledge",
|
|
20
22
|
"update_project_memory",
|
|
21
23
|
"store_knowledge",
|
|
22
24
|
"update_contract_hash",
|
|
25
|
+
// Control-plane / security-relevant operations
|
|
26
|
+
"http_proxy_request",
|
|
27
|
+
"orchestrate_loop",
|
|
28
|
+
"submit_plan",
|
|
29
|
+
"approve_operation",
|
|
30
|
+
"register_agent",
|
|
31
|
+
"acquire_lock",
|
|
32
|
+
"release_lock",
|
|
23
33
|
]);
|
|
24
34
|
/** Path-like arg keys commonly used by tools. */
|
|
25
|
-
const PATH_KEYS = ["path", "file", "filePath", "target", "output", "source", "archive"];
|
|
35
|
+
const PATH_KEYS = ["path", "file", "filePath", "target", "output", "source", "archive", "filename"];
|
|
26
36
|
/** Relative path segments that must never be written by agents by default. */
|
|
27
37
|
const PROTECTED_PATH_PATTERNS = [
|
|
28
38
|
/(^|\/)\.env(\.|$)/i,
|
|
@@ -35,6 +45,20 @@ const PROTECTED_PATH_PATTERNS = [
|
|
|
35
45
|
/(^|\/)\.aws\/credentials$/i,
|
|
36
46
|
/(^|\/)\.npmrc$/i,
|
|
37
47
|
/(^|\/)\.netrc$/i,
|
|
48
|
+
// Git/container/kube config and hooks — rewriting these yields code execution.
|
|
49
|
+
/(^|\/)\.git\/config$/i,
|
|
50
|
+
/(^|\/)\.git\/hooks(\/|$)/i,
|
|
51
|
+
/(^|\/)\.docker\/config\.json$/i,
|
|
52
|
+
/(^|\/)\.kube\/config$/i,
|
|
53
|
+
/(^|\/)\.gitconfig$/i,
|
|
54
|
+
// Private keys / certs
|
|
55
|
+
/\.pem$/i,
|
|
56
|
+
/\.key$/i,
|
|
57
|
+
/\.crt$/i,
|
|
58
|
+
/(^|\/)\.bashrc$/i,
|
|
59
|
+
/(^|\/)\.zshrc$/i,
|
|
60
|
+
/(^|\/)\.profile$/i,
|
|
61
|
+
/(^|\/)\.bash_profile$/i,
|
|
38
62
|
];
|
|
39
63
|
function allow(code = "ALLOW", reason = "Allowed") {
|
|
40
64
|
return { effect: "allow", code, reason };
|
package/dist/policy-gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-gate.js","sourceRoot":"","sources":["../src/policy-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA4BH,kEAAkE;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,qBAAqB;IACrB,mBAAmB;IACnB,
|
|
1
|
+
{"version":3,"file":"policy-gate.js","sourceRoot":"","sources":["../src/policy-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/retention.d.ts
CHANGED
|
@@ -32,10 +32,15 @@ export declare class DataRetention {
|
|
|
32
32
|
*/
|
|
33
33
|
static eraseTraceData(traceId: string): number;
|
|
34
34
|
/**
|
|
35
|
-
* [KVKK Art. 11] Erases all data.
|
|
35
|
+
* [KVKK Art. 11] Erases all data across every store (full right-to-erasure).
|
|
36
36
|
* Only works with the confirmation code.
|
|
37
37
|
*/
|
|
38
38
|
static eraseAllData(confirmationCode: string): number;
|
|
39
|
+
/**
|
|
40
|
+
* Recompute the agent-log chain anchor after a legitimate deletion so that
|
|
41
|
+
* verification does not mistake retention/erasure for tampering.
|
|
42
|
+
*/
|
|
43
|
+
private static refreshLogAnchor;
|
|
39
44
|
/**
|
|
40
45
|
* Get retention statistics.
|
|
41
46
|
*/
|
package/dist/retention.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { Audit } from "./audit.js";
|
|
14
14
|
import { logger } from "./logger.js";
|
|
15
15
|
import { databaseHolder } from "./database.js";
|
|
16
|
+
import { clearChainAnchor, writeChainAnchor } from "./audit-chain.js";
|
|
16
17
|
/**
|
|
17
18
|
* Data retention categories and default durations (days)
|
|
18
19
|
*/
|
|
@@ -78,10 +79,10 @@ export class DataRetention {
|
|
|
78
79
|
*/
|
|
79
80
|
static eraseTraceData(traceId) {
|
|
80
81
|
let total = 0;
|
|
82
|
+
const db = databaseHolder.getDB();
|
|
81
83
|
// Audit logs
|
|
82
84
|
total += Audit.deleteByFilter({ traceId });
|
|
83
85
|
// Messages
|
|
84
|
-
const db = databaseHolder.getDB();
|
|
85
86
|
const msgResult = db.prepare("DELETE FROM messages WHERE trace_id = ?").run(traceId);
|
|
86
87
|
total += msgResult.changes;
|
|
87
88
|
// Tasks
|
|
@@ -90,11 +91,17 @@ export class DataRetention {
|
|
|
90
91
|
// Logs
|
|
91
92
|
const logResult = db.prepare("DELETE FROM logs WHERE trace_id = ?").run(traceId);
|
|
92
93
|
total += logResult.changes;
|
|
94
|
+
if (logResult.changes > 0)
|
|
95
|
+
this.refreshLogAnchor();
|
|
96
|
+
// Costs (may carry trace_id / usage data)
|
|
97
|
+
total += db.prepare("DELETE FROM costs WHERE trace_id = ?").run(traceId).changes;
|
|
98
|
+
// Approvals (args + passcode)
|
|
99
|
+
total += db.prepare("DELETE FROM approvals WHERE trace_id = ?").run(traceId).changes;
|
|
93
100
|
logger.info(`[RETENTION] Trace ${traceId} erased: ${total} records deleted (KVKK Article 7)`);
|
|
94
101
|
return total;
|
|
95
102
|
}
|
|
96
103
|
/**
|
|
97
|
-
* [KVKK Art. 11] Erases all data.
|
|
104
|
+
* [KVKK Art. 11] Erases all data across every store (full right-to-erasure).
|
|
98
105
|
* Only works with the confirmation code.
|
|
99
106
|
*/
|
|
100
107
|
static eraseAllData(confirmationCode) {
|
|
@@ -104,14 +111,52 @@ export class DataRetention {
|
|
|
104
111
|
let total = 0;
|
|
105
112
|
const db = databaseHolder.getDB();
|
|
106
113
|
total += Audit.clearAll(confirmationCode);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
// Every table that can hold user/agent/personal data.
|
|
115
|
+
for (const table of [
|
|
116
|
+
"messages",
|
|
117
|
+
"tasks",
|
|
118
|
+
"logs",
|
|
119
|
+
"agents",
|
|
120
|
+
"metadata",
|
|
121
|
+
"costs",
|
|
122
|
+
"knowledge",
|
|
123
|
+
"users",
|
|
124
|
+
"loop_cooldowns",
|
|
125
|
+
"approvals",
|
|
126
|
+
"discipline",
|
|
127
|
+
"distributed_locks",
|
|
128
|
+
]) {
|
|
129
|
+
try {
|
|
130
|
+
total += db.prepare(`DELETE FROM ${table}`).run().changes;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Table may not exist in this schema version — skip.
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Both hash-chain anchors are now empty.
|
|
137
|
+
clearChainAnchor("agent-log");
|
|
138
|
+
clearChainAnchor("structured");
|
|
112
139
|
logger.warn(`[RETENTION] ALL DATA ERASED: ${total} records (KVKK Article 7 - Right to Erasure)`);
|
|
113
140
|
return total;
|
|
114
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Recompute the agent-log chain anchor after a legitimate deletion so that
|
|
144
|
+
* verification does not mistake retention/erasure for tampering.
|
|
145
|
+
*/
|
|
146
|
+
static refreshLogAnchor() {
|
|
147
|
+
try {
|
|
148
|
+
const db = databaseHolder.getDB();
|
|
149
|
+
const row = db.prepare("SELECT hash FROM logs WHERE hash IS NOT NULL ORDER BY id DESC LIMIT 1").get();
|
|
150
|
+
const count = db.prepare("SELECT COUNT(*) AS c FROM logs WHERE hash IS NOT NULL").get().c;
|
|
151
|
+
if (row?.hash && count > 0)
|
|
152
|
+
writeChainAnchor("agent-log", row.hash, count);
|
|
153
|
+
else
|
|
154
|
+
clearChainAnchor("agent-log");
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
/* ignore */
|
|
158
|
+
}
|
|
159
|
+
}
|
|
115
160
|
/**
|
|
116
161
|
* Get retention statistics.
|
|
117
162
|
*/
|
|
@@ -151,7 +196,7 @@ export class DataRetention {
|
|
|
151
196
|
const db = databaseHolder.getDB();
|
|
152
197
|
const result = db.prepare(`
|
|
153
198
|
DELETE FROM messages
|
|
154
|
-
WHERE timestamp < datetime('now', '-30 days')
|
|
199
|
+
WHERE strftime('%Y-%m-%d %H:%M:%S', timestamp) < datetime('now', '-30 days')
|
|
155
200
|
`).run();
|
|
156
201
|
return result.changes;
|
|
157
202
|
}
|
|
@@ -163,8 +208,10 @@ export class DataRetention {
|
|
|
163
208
|
const db = databaseHolder.getDB();
|
|
164
209
|
const result = db.prepare(`
|
|
165
210
|
DELETE FROM logs
|
|
166
|
-
WHERE timestamp < datetime('now', '-30 days')
|
|
211
|
+
WHERE strftime('%Y-%m-%d %H:%M:%S', timestamp) < datetime('now', '-30 days')
|
|
167
212
|
`).run();
|
|
213
|
+
if (result.changes > 0)
|
|
214
|
+
this.refreshLogAnchor();
|
|
168
215
|
return result.changes;
|
|
169
216
|
}
|
|
170
217
|
}
|
package/dist/retention.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../src/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtE;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACtD,WAAW,EAAE,EAAE,EAAK,4BAA4B;IAChD,SAAS,EAAE,EAAE,EAAO,mCAAmC;IACvD,QAAQ,EAAE,GAAG,EAAO,6BAA6B;IACjD,QAAQ,EAAE,GAAG,EAAO,wBAAwB;IAC5C,UAAU,EAAE,GAAG,EAAK,8BAA8B;CACrD,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,aAAa;IACd,MAAM,CAAC,eAAe,GAA0C,IAAI,CAAC;IAE7E;;;;;KAKC;IACD,MAAM,CAAC,UAAU,CAAC,UAAU,GAAG,OAAO;QACtC,sBAAsB;QAClB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,4BAA4B;QAC5B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,CAAC;QAExE,MAAM,CAAC,IAAI,CACP,0CAA0C;YAChD,qBAAqB,UAAU,GAAG,KAAK,OAAO;YAC9C,aAAa,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;IACN,CAAC;IAED;;;KAGC;IACD,MAAM,CAAC,UAAU;QACb,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAElD,IAAI,CAAC;YACD,sBAAsB;YACtB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;YAEpC,+CAA+C;YAC/C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE1C,oBAAoB;YACpB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7D,MAAM,CAAC,IAAI,CACP,gCAAgC;oBAC1C,GAAG,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,IAAI,OAAO,CAClE,CAAC;YACN,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,+BAAgC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;KAMC;IACD,MAAM,CAAC,cAAc,CAAC,OAAe;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAElC,aAAa;QACb,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3C,WAAW;QACX,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrF,KAAK,IAAI,SAAS,CAAC,OAAO,CAAC;QAE3B,QAAQ;QACR,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnF,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC;QAE5B,OAAO;QACP,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjF,KAAK,IAAI,SAAS,CAAC,OAAO,CAAC;QAC3B,IAAI,SAAS,CAAC,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD,0CAA0C;QAC1C,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QAEjF,8BAA8B;QAC9B,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QAErF,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,YAAY,KAAK,mCAAmC,CAAC,CAAC;QAC9F,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;KAGC;IACD,MAAM,CAAC,YAAY,CAAC,gBAAwB;QACxC,IAAI,gBAAgB,KAAK,uBAAuB,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAElC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC1C,sDAAsD;QACtD,KAAK,MAAM,KAAK,IAAI;YAChB,UAAU;YACV,OAAO;YACP,MAAM;YACN,QAAQ;YACR,UAAU;YACV,OAAO;YACP,WAAW;YACX,OAAO;YACP,gBAAgB;YAChB,WAAW;YACX,YAAY;YACZ,mBAAmB;SACtB,EAAE,CAAC;YACA,IAAI,CAAC;gBACD,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACL,qDAAqD;YACzD,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC9B,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAE/B,MAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,8CAA8C,CAAC,CAAC;QACjG,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,gBAAgB;QAC3B,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAC,GAAG,EAAkC,CAAC;YACtI,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;YAC7G,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC;gBAAE,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;;gBACtE,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,YAAY;QAChB,CAAC;IACL,CAAC;IAED;;KAEC;IACD,MAAM,CAAC,QAAQ;QAOX,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAElC,MAAM,YAAY,GACpB,EAAE,CAAC,OAAO,CAAC;;;;OAIV,CAAC,CAAC,GAAG,EACH,CAAC,KAAK,CAAC;QAER,MAAM,YAAY,GAAI,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;QAC7G,MAAM,QAAQ,GAAI,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;QACrG,MAAM,SAAS,GAAI,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;QAEvG,OAAO;YACH,YAAY;YACZ,YAAY;YACZ,QAAQ;YACR,SAAS;YACT,QAAQ,EAAE,EAAE,GAAG,kBAAkB,EAAE;SACtC,CAAC;IACN,CAAC;IAED;;KAEC;IACD,MAAM,CAAC,QAAQ;QACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED;;;KAGC;IACO,MAAM,CAAC,gBAAgB;QAC3B,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC,GAAG,EAAE,CAAC;QACL,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED;;;KAGC;IACO,MAAM,CAAC,YAAY;QACvB,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC,GAAG,EAAE,CAAC;QACL,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,OAAO,CAAC;IAC1B,CAAC"}
|
package/dist/sandbox-fs.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface SandboxFsWriteResult {
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function assertSafeRelativePath(userPath: string, projectRoot?: string): string;
|
|
22
22
|
/**
|
|
23
|
-
* Write file content under project root using the active sandbox runtime.
|
|
23
|
+
* Write file content under project root using the active local sandbox runtime.
|
|
24
24
|
*/
|
|
25
25
|
export declare function writeFileInSandbox(projectRoot: string, userPath: string, content: string, options?: {
|
|
26
26
|
ownerId?: string;
|
package/dist/sandbox-fs.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import fs from "fs";
|
|
10
10
|
import path from "path";
|
|
11
|
+
import crypto from "crypto";
|
|
11
12
|
import { AtomicFileLock } from "./file-lock.js";
|
|
12
|
-
import { resolveSandboxRuntimeConfig,
|
|
13
|
+
import { resolveSandboxRuntimeConfig, SandboxRequiredError, } from "./sandbox-runtime.js";
|
|
13
14
|
/**
|
|
14
15
|
* Normalize user path to a project-relative POSIX path.
|
|
15
16
|
* Absolute paths are accepted only if they resolve inside projectRoot.
|
|
@@ -59,10 +60,6 @@ export function assertSafeRelativePath(userPath, projectRoot) {
|
|
|
59
60
|
}
|
|
60
61
|
return parts.join("/");
|
|
61
62
|
}
|
|
62
|
-
function shellSingleQuote(s) {
|
|
63
|
-
// Safe for sh single-quoted strings
|
|
64
|
-
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
65
|
-
}
|
|
66
63
|
function createLock(projectRoot) {
|
|
67
64
|
return new AtomicFileLock({
|
|
68
65
|
projectRoot,
|
|
@@ -77,7 +74,7 @@ function hostWriteAtomic(absolutePath, content) {
|
|
|
77
74
|
fs.mkdirSync(dir, { recursive: true });
|
|
78
75
|
}
|
|
79
76
|
// Write exact bytes (callers decide trailing newline — patch/replace need fidelity)
|
|
80
|
-
const tempPath = `${absolutePath}.${
|
|
77
|
+
const tempPath = `${absolutePath}.${crypto.randomBytes(6).toString("hex")}.tmp`;
|
|
81
78
|
try {
|
|
82
79
|
fs.writeFileSync(tempPath, content, "utf8");
|
|
83
80
|
fs.renameSync(tempPath, absolutePath);
|
|
@@ -92,57 +89,53 @@ function hostWriteAtomic(absolutePath, content) {
|
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
91
|
/**
|
|
95
|
-
*
|
|
92
|
+
* Reject writes whose real (symlink-resolved) path escapes the project root.
|
|
93
|
+
* Lexical checks alone are defeated by a symlink inside the project that
|
|
94
|
+
* points at e.g. ~/.ssh/authorized_keys.
|
|
95
|
+
*/
|
|
96
|
+
function assertRealPathInsideRoot(absolutePath, root) {
|
|
97
|
+
const realRoot = fs.existsSync(root) ? fs.realpathSync(root) : root;
|
|
98
|
+
let probe = absolutePath;
|
|
99
|
+
while (probe !== path.dirname(probe)) {
|
|
100
|
+
if (fs.existsSync(probe)) {
|
|
101
|
+
const real = fs.realpathSync(probe) + absolutePath.slice(probe.length);
|
|
102
|
+
if (real !== realRoot && !real.startsWith(realRoot + path.sep)) {
|
|
103
|
+
throw new Error(`[SANDBOX_FS] Symlink escape denied: "${absolutePath}"`);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
probe = path.dirname(probe);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Write file content under project root using the active local sandbox runtime.
|
|
96
112
|
*/
|
|
97
113
|
export async function writeFileInSandbox(projectRoot, userPath, content, options) {
|
|
98
114
|
const root = path.resolve(projectRoot);
|
|
99
115
|
const relativePath = assertSafeRelativePath(userPath, root);
|
|
100
116
|
const absolutePath = path.resolve(root, relativePath);
|
|
101
|
-
// Belt-and-suspenders: stay inside root
|
|
102
117
|
if (!absolutePath.startsWith(root + path.sep) && absolutePath !== root) {
|
|
103
118
|
throw new Error(`[SANDBOX_FS] Resolved path escapes project root: "${userPath}"`);
|
|
104
119
|
}
|
|
120
|
+
assertRealPathInsideRoot(absolutePath, root);
|
|
105
121
|
const cfg = resolveSandboxRuntimeConfig(root, options?.timeoutMs);
|
|
106
122
|
if (cfg.required && cfg.effectiveMode === "none") {
|
|
107
|
-
throw new SandboxRequiredError("[SANDBOX_REQUIRED] File write blocked: no sandbox isolation available. " +
|
|
108
|
-
"Set ATABEY_SANDBOX_RUNTIME=
|
|
123
|
+
throw new SandboxRequiredError("[SANDBOX_REQUIRED] File write blocked: no OS sandbox isolation available. " +
|
|
124
|
+
"Set ATABEY_SANDBOX_RUNTIME=seatbelt or uid, or disable ATABEY_SANDBOX_REQUIRED.");
|
|
109
125
|
}
|
|
110
126
|
const owner = options?.ownerId || process.env.ATABEY_ACTIVE_AGENT || "mcp-writer";
|
|
111
127
|
const lock = createLock(root);
|
|
112
|
-
const posixRel = relativePath.split(path.sep).join("/");
|
|
113
128
|
return lock.withLock(relativePath, owner, async () => {
|
|
114
|
-
if (cfg.effectiveMode === "container" && cfg.engine !== "none") {
|
|
115
|
-
const dir = path.posix.dirname(posixRel);
|
|
116
|
-
const script = dir === "."
|
|
117
|
-
? `cat > ${shellSingleQuote(posixRel)}`
|
|
118
|
-
: `mkdir -p ${shellSingleQuote(dir)} && cat > ${shellSingleQuote(posixRel)}`;
|
|
119
|
-
const result = await runInSandbox({
|
|
120
|
-
command: "sh",
|
|
121
|
-
args: ["-c", script],
|
|
122
|
-
projectRoot: root,
|
|
123
|
-
timeoutMs: options?.timeoutMs ?? cfg.timeoutMs,
|
|
124
|
-
stdin: content,
|
|
125
|
-
});
|
|
126
|
-
if (result.code !== 0) {
|
|
127
|
-
throw new Error(`[SANDBOX_FS] Container write failed (code ${result.code}): ${result.stderr || result.stdout}`.trim());
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
absolutePath,
|
|
131
|
-
relativePath,
|
|
132
|
-
runtime: "container",
|
|
133
|
-
isolationLabel: result.isolationLabel,
|
|
134
|
-
bytes: Buffer.byteLength(content, "utf8"),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
// uid | none — host write confined to project root
|
|
138
129
|
hostWriteAtomic(absolutePath, content);
|
|
139
130
|
return {
|
|
140
131
|
absolutePath,
|
|
141
132
|
relativePath,
|
|
142
133
|
runtime: cfg.effectiveMode,
|
|
143
|
-
isolationLabel: cfg.effectiveMode === "
|
|
144
|
-
? "
|
|
145
|
-
:
|
|
134
|
+
isolationLabel: cfg.effectiveMode === "seatbelt"
|
|
135
|
+
? "seatbelt host write (project-bound)"
|
|
136
|
+
: cfg.effectiveMode === "uid"
|
|
137
|
+
? "uid host write (project-bound)"
|
|
138
|
+
: "host write (project-bound)",
|
|
146
139
|
bytes: Buffer.byteLength(content, "utf8"),
|
|
147
140
|
};
|
|
148
141
|
});
|
package/dist/sandbox-fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../src/sandbox-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACH,2BAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../src/sandbox-fs.ts"],"names":[],"mappings":"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"}
|