skillshield 1.0.0 → 2.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.
- package/README.md +143 -301
- package/dist/cli/commands/run.d.ts +12 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +228 -60
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.js +5 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/shield/audit-trail.d.ts +67 -0
- package/dist/shield/audit-trail.d.ts.map +1 -0
- package/dist/shield/audit-trail.js +140 -0
- package/dist/shield/audit-trail.js.map +1 -0
- package/dist/shield/filesystem-jail.d.ts +80 -0
- package/dist/shield/filesystem-jail.d.ts.map +1 -0
- package/dist/shield/filesystem-jail.js +320 -0
- package/dist/shield/filesystem-jail.js.map +1 -0
- package/dist/shield/index.d.ts +82 -0
- package/dist/shield/index.d.ts.map +1 -0
- package/dist/shield/index.js +88 -0
- package/dist/shield/index.js.map +1 -0
- package/dist/shield/network-policy.d.ts +74 -0
- package/dist/shield/network-policy.d.ts.map +1 -0
- package/dist/shield/network-policy.js +226 -0
- package/dist/shield/network-policy.js.map +1 -0
- package/dist/shield/runtime-monitor.d.ts +106 -0
- package/dist/shield/runtime-monitor.d.ts.map +1 -0
- package/dist/shield/runtime-monitor.js +233 -0
- package/dist/shield/runtime-monitor.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/shield/audit-trail.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CACxC;AAED,MAAM,MAAM,cAAc,GACtB,YAAY,GACZ,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,UAAU,GACV,WAAW,CAAC;AAEhB,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,MAAM,CACJ,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,UAAU,CAAC,UAAU,CAAU,EACzC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU;IA2Bb,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU;IAI3D,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IAKxE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAIhG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU;IAI/D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU;IAKtF,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IAI1D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IAIxE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAMtC;;;OAGG;IACH,MAAM,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAgCjE;;OAEG;IACH,MAAM,IAAI,MAAM;IAWhB;;OAEG;IACH,SAAS,IAAI,MAAM;IAoBnB,QAAQ,IAAI,UAAU,EAAE;IAIxB,SAAS,IAAI,MAAM;IAInB,aAAa,IAAI,MAAM,GAAG,IAAI;CAG/B"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillShield — Cryptographic Audit Trail
|
|
3
|
+
*
|
|
4
|
+
* Hash-chained log of every action during skill execution.
|
|
5
|
+
* Each entry is linked to the previous via SHA-256, creating
|
|
6
|
+
* a tamper-evident chain (like Aegis, but integrated with our
|
|
7
|
+
* scanner + runtime instead of being a separate tool).
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'crypto';
|
|
10
|
+
export class AuditTrail {
|
|
11
|
+
constructor(skillId) {
|
|
12
|
+
this.chain = [];
|
|
13
|
+
this.skillId = skillId;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Record an event in the audit trail.
|
|
17
|
+
*/
|
|
18
|
+
record(type, description, severity = 'INFO', data) {
|
|
19
|
+
const id = this.chain.length;
|
|
20
|
+
const previousHash = id === 0 ? '0' : this.chain[id - 1].hash;
|
|
21
|
+
const timestamp = new Date().toISOString();
|
|
22
|
+
// Compute hash from content + previous hash
|
|
23
|
+
const content = JSON.stringify({ id, timestamp, type, skillId: this.skillId, description, data, previousHash });
|
|
24
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
25
|
+
const entry = {
|
|
26
|
+
id,
|
|
27
|
+
timestamp,
|
|
28
|
+
hash,
|
|
29
|
+
previousHash,
|
|
30
|
+
type,
|
|
31
|
+
skillId: this.skillId,
|
|
32
|
+
description,
|
|
33
|
+
data,
|
|
34
|
+
severity,
|
|
35
|
+
};
|
|
36
|
+
this.chain.push(entry);
|
|
37
|
+
return entry;
|
|
38
|
+
}
|
|
39
|
+
// ── Convenience methods ──
|
|
40
|
+
scanStart(patterns, categories) {
|
|
41
|
+
return this.record('SCAN_START', `Scanning skill with ${patterns} patterns across ${categories} categories`, 'INFO', { patterns, categories });
|
|
42
|
+
}
|
|
43
|
+
scanComplete(score, threats, status) {
|
|
44
|
+
const severity = threats > 0 ? (status === 'BLOCKED' ? 'CRITICAL' : 'WARN') : 'INFO';
|
|
45
|
+
return this.record('SCAN_COMPLETE', `Scan complete: score=${score}/100, threats=${threats}, status=${status}`, severity, { score, threats, status });
|
|
46
|
+
}
|
|
47
|
+
threatFound(patternId, category, severity, evidence) {
|
|
48
|
+
return this.record('THREAT_FOUND', `Threat ${patternId} (${category}/${severity}): ${evidence.substring(0, 100)}`, 'CRITICAL', { patternId, category, severity, evidence: evidence.substring(0, 500) });
|
|
49
|
+
}
|
|
50
|
+
executionStart(sandbox, policies) {
|
|
51
|
+
return this.record('EXECUTION_START', `Executing in ${sandbox} sandbox with policies: ${policies.join(', ')}`, 'INFO', { sandbox, policies });
|
|
52
|
+
}
|
|
53
|
+
executionEnd(exitCode, durationMs, killed) {
|
|
54
|
+
const severity = killed ? 'CRITICAL' : (exitCode === 0 ? 'INFO' : 'WARN');
|
|
55
|
+
return this.record('EXECUTION_END', `Execution ended: code=${exitCode}, duration=${durationMs}ms, killed=${killed}`, severity, { exitCode, durationMs, killed });
|
|
56
|
+
}
|
|
57
|
+
networkBlocked(domain, reason) {
|
|
58
|
+
return this.record('NETWORK_BLOCKED', `Network blocked: ${domain} — ${reason}`, 'WARN', { domain, reason });
|
|
59
|
+
}
|
|
60
|
+
fileBlocked(path, operation, reason) {
|
|
61
|
+
return this.record('FILE_BLOCKED', `File ${operation} blocked: ${path} — ${reason}`, 'WARN', { path, operation, reason });
|
|
62
|
+
}
|
|
63
|
+
killSwitch(reason) {
|
|
64
|
+
return this.record('KILL_SWITCH', `Kill switch activated: ${reason}`, 'CRITICAL', { reason });
|
|
65
|
+
}
|
|
66
|
+
// ── Chain operations ──
|
|
67
|
+
/**
|
|
68
|
+
* Verify the integrity of the entire chain.
|
|
69
|
+
* Returns true if no tampering detected.
|
|
70
|
+
*/
|
|
71
|
+
verify() {
|
|
72
|
+
for (let i = 0; i < this.chain.length; i++) {
|
|
73
|
+
const entry = this.chain[i];
|
|
74
|
+
// Check previous hash linkage
|
|
75
|
+
if (i === 0 && entry.previousHash !== '0') {
|
|
76
|
+
return { valid: false, brokenAt: 0, details: 'Genesis entry has wrong previousHash' };
|
|
77
|
+
}
|
|
78
|
+
if (i > 0 && entry.previousHash !== this.chain[i - 1].hash) {
|
|
79
|
+
return { valid: false, brokenAt: i, details: `Entry ${i} previousHash doesn't match entry ${i - 1} hash` };
|
|
80
|
+
}
|
|
81
|
+
// Recompute hash
|
|
82
|
+
const content = JSON.stringify({
|
|
83
|
+
id: entry.id,
|
|
84
|
+
timestamp: entry.timestamp,
|
|
85
|
+
type: entry.type,
|
|
86
|
+
skillId: entry.skillId,
|
|
87
|
+
description: entry.description,
|
|
88
|
+
data: entry.data,
|
|
89
|
+
previousHash: entry.previousHash,
|
|
90
|
+
});
|
|
91
|
+
const expectedHash = createHash('sha256').update(content).digest('hex');
|
|
92
|
+
if (entry.hash !== expectedHash) {
|
|
93
|
+
return { valid: false, brokenAt: i, details: `Entry ${i} hash mismatch — data was tampered` };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { valid: true };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Export the full chain as JSON (for storage / compliance).
|
|
100
|
+
*/
|
|
101
|
+
toJSON() {
|
|
102
|
+
return JSON.stringify({
|
|
103
|
+
skillId: this.skillId,
|
|
104
|
+
chainLength: this.chain.length,
|
|
105
|
+
genesisHash: this.chain[0]?.hash || null,
|
|
106
|
+
latestHash: this.chain[this.chain.length - 1]?.hash || null,
|
|
107
|
+
verified: this.verify().valid,
|
|
108
|
+
entries: this.chain,
|
|
109
|
+
}, null, 2);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Export as compact summary for CLI display.
|
|
113
|
+
*/
|
|
114
|
+
toSummary() {
|
|
115
|
+
const lines = [];
|
|
116
|
+
const threats = this.chain.filter((e) => e.severity === 'CRITICAL');
|
|
117
|
+
const warnings = this.chain.filter((e) => e.severity === 'WARN');
|
|
118
|
+
const verification = this.verify();
|
|
119
|
+
lines.push(`Audit Trail: ${this.skillId}`);
|
|
120
|
+
lines.push(`Entries: ${this.chain.length} | Threats: ${threats.length} | Warnings: ${warnings.length}`);
|
|
121
|
+
lines.push(`Chain integrity: ${verification.valid ? 'VERIFIED ✓' : 'BROKEN ✗ at entry ' + verification.brokenAt}`);
|
|
122
|
+
if (threats.length > 0) {
|
|
123
|
+
lines.push('\nCritical Events:');
|
|
124
|
+
threats.forEach((e) => {
|
|
125
|
+
lines.push(` [${e.timestamp}] ${e.type}: ${e.description}`);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return lines.join('\n');
|
|
129
|
+
}
|
|
130
|
+
getChain() {
|
|
131
|
+
return [...this.chain];
|
|
132
|
+
}
|
|
133
|
+
getLength() {
|
|
134
|
+
return this.chain.length;
|
|
135
|
+
}
|
|
136
|
+
getLatestHash() {
|
|
137
|
+
return this.chain.length > 0 ? this.chain[this.chain.length - 1].hash : null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=audit-trail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/shield/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillShield — Filesystem Jail
|
|
3
|
+
*
|
|
4
|
+
* Restricts skill access to specific directories. Skills can only read/write
|
|
5
|
+
* within their jail, and sensitive paths are always blocked.
|
|
6
|
+
*
|
|
7
|
+
* Unlike NVIDIA OpenShell (which needs Landlock/Linux), this works
|
|
8
|
+
* cross-platform by intercepting Node.js fs module calls.
|
|
9
|
+
*/
|
|
10
|
+
export interface FilesystemPolicy {
|
|
11
|
+
/** Root directory for the jail (skill can only access within this) */
|
|
12
|
+
jailRoot: string;
|
|
13
|
+
/** Additional readable paths outside jail */
|
|
14
|
+
readablePaths?: string[];
|
|
15
|
+
/** Additional writable paths outside jail */
|
|
16
|
+
writablePaths?: string[];
|
|
17
|
+
/** Completely blocked paths (always denied, overrides everything) */
|
|
18
|
+
blockedPaths?: string[];
|
|
19
|
+
/** Allow reading files outside jail? (default: false) */
|
|
20
|
+
allowReadOutsideJail?: boolean;
|
|
21
|
+
/** Max file size the skill can write (bytes) */
|
|
22
|
+
maxWriteSize?: number;
|
|
23
|
+
/** Max total files the skill can create */
|
|
24
|
+
maxFileCount?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface FilesystemViolation {
|
|
27
|
+
timestamp: string;
|
|
28
|
+
type: 'READ_BLOCKED' | 'WRITE_BLOCKED' | 'DELETE_BLOCKED' | 'SENSITIVE_PATH' | 'SIZE_EXCEEDED' | 'FILE_COUNT_EXCEEDED';
|
|
29
|
+
path: string;
|
|
30
|
+
operation: string;
|
|
31
|
+
details: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class FilesystemJail {
|
|
34
|
+
private policy;
|
|
35
|
+
private violations;
|
|
36
|
+
private fileCount;
|
|
37
|
+
private totalBytesWritten;
|
|
38
|
+
private jailRoot;
|
|
39
|
+
private blockedPaths;
|
|
40
|
+
private homeDir;
|
|
41
|
+
constructor(policy: FilesystemPolicy);
|
|
42
|
+
/**
|
|
43
|
+
* Check if a read operation is allowed.
|
|
44
|
+
*/
|
|
45
|
+
checkRead(filePath: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a write operation is allowed.
|
|
48
|
+
*/
|
|
49
|
+
checkWrite(filePath: string, size?: number): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a delete operation is allowed.
|
|
52
|
+
*/
|
|
53
|
+
checkDelete(filePath: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Generate Node.js code that enforces filesystem policy at runtime.
|
|
56
|
+
*/
|
|
57
|
+
generateEnforcementCode(): string;
|
|
58
|
+
private isSensitivePath;
|
|
59
|
+
private isInsideJail;
|
|
60
|
+
private resolvePath;
|
|
61
|
+
private expandPath;
|
|
62
|
+
private recordViolation;
|
|
63
|
+
getViolations(): FilesystemViolation[];
|
|
64
|
+
getStats(): {
|
|
65
|
+
filesCreated: number;
|
|
66
|
+
bytesWritten: number;
|
|
67
|
+
violations: number;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse filesystem policy from SKILL.md frontmatter.
|
|
72
|
+
* Expected format:
|
|
73
|
+
* filesystem:
|
|
74
|
+
* writable: ["./output", "/tmp"]
|
|
75
|
+
* readable: ["./data"]
|
|
76
|
+
* maxWriteMB: 50
|
|
77
|
+
* maxFiles: 100
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseFilesystemPolicy(frontmatter: Record<string, unknown>, defaultJailRoot: string): FilesystemPolicy;
|
|
80
|
+
//# sourceMappingURL=filesystem-jail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-jail.d.ts","sourceRoot":"","sources":["../../src/shield/filesystem-jail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,CAAC;IACvH,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiDD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,gBAAgB;IAYpC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAsCpC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAuDpD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IA4BtC;;OAEG;IACH,uBAAuB,IAAI,MAAM;IAsEjC,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;IAIvB,aAAa,IAAI,mBAAmB,EAAE;IAItC,QAAQ,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAO/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,eAAe,EAAE,MAAM,GACtB,gBAAgB,CAYlB"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillShield — Filesystem Jail
|
|
3
|
+
*
|
|
4
|
+
* Restricts skill access to specific directories. Skills can only read/write
|
|
5
|
+
* within their jail, and sensitive paths are always blocked.
|
|
6
|
+
*
|
|
7
|
+
* Unlike NVIDIA OpenShell (which needs Landlock/Linux), this works
|
|
8
|
+
* cross-platform by intercepting Node.js fs module calls.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve, normalize, relative, isAbsolute } from 'path';
|
|
11
|
+
/** Sensitive paths that are ALWAYS blocked regardless of policy */
|
|
12
|
+
const SENSITIVE_PATHS = [
|
|
13
|
+
// SSH & credentials
|
|
14
|
+
'~/.ssh',
|
|
15
|
+
'~/.aws',
|
|
16
|
+
'~/.config/gcloud',
|
|
17
|
+
'~/.kube',
|
|
18
|
+
'~/.gnupg',
|
|
19
|
+
'~/.npmrc',
|
|
20
|
+
'~/.pypirc',
|
|
21
|
+
// Environment files
|
|
22
|
+
'.env',
|
|
23
|
+
'.env.local',
|
|
24
|
+
'.env.production',
|
|
25
|
+
'.env.staging',
|
|
26
|
+
'credentials.json',
|
|
27
|
+
'secrets.json',
|
|
28
|
+
'service-account.json',
|
|
29
|
+
// System files
|
|
30
|
+
'/etc/passwd',
|
|
31
|
+
'/etc/shadow',
|
|
32
|
+
'/etc/sudoers',
|
|
33
|
+
// Agent identity files (Memory Poisoning protection)
|
|
34
|
+
'SOUL.md',
|
|
35
|
+
'MEMORY.md',
|
|
36
|
+
'IDENTITY.md',
|
|
37
|
+
'HEARTBEAT.md',
|
|
38
|
+
'AGENTS.md',
|
|
39
|
+
'USER.md',
|
|
40
|
+
'.clawhome',
|
|
41
|
+
'.openclaw',
|
|
42
|
+
// Git credentials
|
|
43
|
+
'.git-credentials',
|
|
44
|
+
'.gitconfig',
|
|
45
|
+
];
|
|
46
|
+
/** Sensitive path patterns (regex) */
|
|
47
|
+
const SENSITIVE_PATTERNS = [
|
|
48
|
+
/\.env(\.[a-z]+)?$/i,
|
|
49
|
+
/id_rsa|id_ed25519|id_ecdsa/i,
|
|
50
|
+
/\.pem$/i,
|
|
51
|
+
/\.key$/i,
|
|
52
|
+
/credentials/i,
|
|
53
|
+
/secrets?\.(json|yaml|yml|toml)$/i,
|
|
54
|
+
/service.account.*\.json$/i,
|
|
55
|
+
];
|
|
56
|
+
export class FilesystemJail {
|
|
57
|
+
constructor(policy) {
|
|
58
|
+
this.violations = [];
|
|
59
|
+
this.fileCount = 0;
|
|
60
|
+
this.totalBytesWritten = 0;
|
|
61
|
+
this.policy = policy;
|
|
62
|
+
this.jailRoot = resolve(policy.jailRoot);
|
|
63
|
+
this.homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
64
|
+
// Expand ~ in sensitive paths and add to blocked set
|
|
65
|
+
this.blockedPaths = new Set([
|
|
66
|
+
...SENSITIVE_PATHS.map((p) => this.expandPath(p)),
|
|
67
|
+
...(policy.blockedPaths || []).map((p) => resolve(p)),
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if a read operation is allowed.
|
|
72
|
+
*/
|
|
73
|
+
checkRead(filePath) {
|
|
74
|
+
const resolved = this.resolvePath(filePath);
|
|
75
|
+
// Always block sensitive paths
|
|
76
|
+
if (this.isSensitivePath(resolved)) {
|
|
77
|
+
this.recordViolation({
|
|
78
|
+
type: 'SENSITIVE_PATH',
|
|
79
|
+
path: resolved,
|
|
80
|
+
operation: 'read',
|
|
81
|
+
details: `Access to sensitive path blocked: ${resolved}`,
|
|
82
|
+
});
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
// Check if inside jail
|
|
86
|
+
if (this.isInsideJail(resolved)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
// Check additional readable paths
|
|
90
|
+
if (this.policy.readablePaths?.some((p) => resolved.startsWith(resolve(p)))) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
// Check allow-read-outside setting
|
|
94
|
+
if (this.policy.allowReadOutsideJail) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
this.recordViolation({
|
|
98
|
+
type: 'READ_BLOCKED',
|
|
99
|
+
path: resolved,
|
|
100
|
+
operation: 'read',
|
|
101
|
+
details: `Read outside jail: ${resolved} (jail: ${this.jailRoot})`,
|
|
102
|
+
});
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a write operation is allowed.
|
|
107
|
+
*/
|
|
108
|
+
checkWrite(filePath, size) {
|
|
109
|
+
const resolved = this.resolvePath(filePath);
|
|
110
|
+
// Always block sensitive paths
|
|
111
|
+
if (this.isSensitivePath(resolved)) {
|
|
112
|
+
this.recordViolation({
|
|
113
|
+
type: 'SENSITIVE_PATH',
|
|
114
|
+
path: resolved,
|
|
115
|
+
operation: 'write',
|
|
116
|
+
details: `Write to sensitive path blocked: ${resolved}`,
|
|
117
|
+
});
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
// Must be inside jail OR in writable paths
|
|
121
|
+
const isInJail = this.isInsideJail(resolved);
|
|
122
|
+
const isInWritable = this.policy.writablePaths?.some((p) => resolved.startsWith(resolve(p))) || false;
|
|
123
|
+
if (!isInJail && !isInWritable) {
|
|
124
|
+
this.recordViolation({
|
|
125
|
+
type: 'WRITE_BLOCKED',
|
|
126
|
+
path: resolved,
|
|
127
|
+
operation: 'write',
|
|
128
|
+
details: `Write outside jail: ${resolved} (jail: ${this.jailRoot})`,
|
|
129
|
+
});
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
// Check file size
|
|
133
|
+
if (size && this.policy.maxWriteSize && size > this.policy.maxWriteSize) {
|
|
134
|
+
this.recordViolation({
|
|
135
|
+
type: 'SIZE_EXCEEDED',
|
|
136
|
+
path: resolved,
|
|
137
|
+
operation: 'write',
|
|
138
|
+
details: `File size ${size} exceeds limit ${this.policy.maxWriteSize}`,
|
|
139
|
+
});
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
// Check file count
|
|
143
|
+
if (this.policy.maxFileCount && this.fileCount >= this.policy.maxFileCount) {
|
|
144
|
+
this.recordViolation({
|
|
145
|
+
type: 'FILE_COUNT_EXCEEDED',
|
|
146
|
+
path: resolved,
|
|
147
|
+
operation: 'write',
|
|
148
|
+
details: `File count ${this.fileCount} exceeds limit ${this.policy.maxFileCount}`,
|
|
149
|
+
});
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
this.fileCount++;
|
|
153
|
+
if (size)
|
|
154
|
+
this.totalBytesWritten += size;
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Check if a delete operation is allowed.
|
|
159
|
+
*/
|
|
160
|
+
checkDelete(filePath) {
|
|
161
|
+
const resolved = this.resolvePath(filePath);
|
|
162
|
+
// Never allow deleting sensitive paths
|
|
163
|
+
if (this.isSensitivePath(resolved)) {
|
|
164
|
+
this.recordViolation({
|
|
165
|
+
type: 'SENSITIVE_PATH',
|
|
166
|
+
path: resolved,
|
|
167
|
+
operation: 'delete',
|
|
168
|
+
details: `Delete of sensitive path blocked: ${resolved}`,
|
|
169
|
+
});
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
// Must be inside jail only
|
|
173
|
+
if (!this.isInsideJail(resolved)) {
|
|
174
|
+
this.recordViolation({
|
|
175
|
+
type: 'DELETE_BLOCKED',
|
|
176
|
+
path: resolved,
|
|
177
|
+
operation: 'delete',
|
|
178
|
+
details: `Delete outside jail: ${resolved} (jail: ${this.jailRoot})`,
|
|
179
|
+
});
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate Node.js code that enforces filesystem policy at runtime.
|
|
186
|
+
*/
|
|
187
|
+
generateEnforcementCode() {
|
|
188
|
+
const jailRootJSON = JSON.stringify(this.jailRoot);
|
|
189
|
+
const sensitiveJSON = JSON.stringify([...this.blockedPaths]);
|
|
190
|
+
const patternsJSON = JSON.stringify(SENSITIVE_PATTERNS.map((p) => p.source));
|
|
191
|
+
const readableJSON = JSON.stringify((this.policy.readablePaths || []).map((p) => resolve(p)));
|
|
192
|
+
const writableJSON = JSON.stringify((this.policy.writablePaths || []).map((p) => resolve(p)));
|
|
193
|
+
return `
|
|
194
|
+
// ── SkillShield Filesystem Jail ──
|
|
195
|
+
const __ss_path = require('path');
|
|
196
|
+
const __ss_jailRoot = ${jailRootJSON};
|
|
197
|
+
const __ss_sensitive = new Set(${sensitiveJSON});
|
|
198
|
+
const __ss_patterns = ${patternsJSON}.map(s => new RegExp(s, 'i'));
|
|
199
|
+
const __ss_readable = ${readableJSON};
|
|
200
|
+
const __ss_writable = ${writableJSON};
|
|
201
|
+
const __ss_maxWrite = ${this.policy.maxWriteSize || 0};
|
|
202
|
+
let __ss_fileCount = 0;
|
|
203
|
+
const __ss_maxFiles = ${this.policy.maxFileCount || 100};
|
|
204
|
+
|
|
205
|
+
function __ss_isSensitive(p) {
|
|
206
|
+
const resolved = __ss_path.resolve(p);
|
|
207
|
+
if (__ss_sensitive.has(resolved)) return true;
|
|
208
|
+
for (const s of __ss_sensitive) { if (resolved.startsWith(s + __ss_path.sep)) return true; }
|
|
209
|
+
for (const pat of __ss_patterns) { if (pat.test(resolved)) return true; }
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function __ss_isInJail(p) {
|
|
214
|
+
const resolved = __ss_path.resolve(p);
|
|
215
|
+
const rel = __ss_path.relative(__ss_jailRoot, resolved);
|
|
216
|
+
return !rel.startsWith('..') && !__ss_path.isAbsolute(rel);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function __ss_checkRead(p) {
|
|
220
|
+
if (__ss_isSensitive(p)) throw new Error('[SkillShield] BLOCKED: Access to sensitive path: ' + p);
|
|
221
|
+
if (__ss_isInJail(p)) return true;
|
|
222
|
+
for (const r of __ss_readable) { if (__ss_path.resolve(p).startsWith(r)) return true; }
|
|
223
|
+
throw new Error('[SkillShield] BLOCKED: Read outside jail: ' + p);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function __ss_checkWrite(p) {
|
|
227
|
+
if (__ss_isSensitive(p)) throw new Error('[SkillShield] BLOCKED: Write to sensitive path: ' + p);
|
|
228
|
+
if (__ss_isInJail(p)) { __ss_fileCount++; if (__ss_fileCount > __ss_maxFiles) throw new Error('[SkillShield] File count limit exceeded'); return true; }
|
|
229
|
+
for (const w of __ss_writable) { if (__ss_path.resolve(p).startsWith(w)) return true; }
|
|
230
|
+
throw new Error('[SkillShield] BLOCKED: Write outside jail: ' + p);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Intercept fs operations
|
|
234
|
+
const __ss_fs = require('fs');
|
|
235
|
+
const __ss_origReadFile = __ss_fs.readFileSync;
|
|
236
|
+
const __ss_origWriteFile = __ss_fs.writeFileSync;
|
|
237
|
+
const __ss_origUnlink = __ss_fs.unlinkSync;
|
|
238
|
+
|
|
239
|
+
__ss_fs.readFileSync = function(path, ...args) {
|
|
240
|
+
__ss_checkRead(String(path));
|
|
241
|
+
return __ss_origReadFile.call(this, path, ...args);
|
|
242
|
+
};
|
|
243
|
+
__ss_fs.writeFileSync = function(path, data, ...args) {
|
|
244
|
+
__ss_checkWrite(String(path));
|
|
245
|
+
return __ss_origWriteFile.call(this, path, data, ...args);
|
|
246
|
+
};
|
|
247
|
+
__ss_fs.unlinkSync = function(path, ...args) {
|
|
248
|
+
if (__ss_isSensitive(String(path)) || !__ss_isInJail(String(path)))
|
|
249
|
+
throw new Error('[SkillShield] BLOCKED: Delete outside jail: ' + path);
|
|
250
|
+
return __ss_origUnlink.call(this, path, ...args);
|
|
251
|
+
};
|
|
252
|
+
// ── End SkillShield Filesystem Jail ──
|
|
253
|
+
`;
|
|
254
|
+
}
|
|
255
|
+
isSensitivePath(resolved) {
|
|
256
|
+
// Direct match
|
|
257
|
+
if (this.blockedPaths.has(resolved))
|
|
258
|
+
return true;
|
|
259
|
+
// Check if path is under a blocked directory
|
|
260
|
+
for (const blocked of this.blockedPaths) {
|
|
261
|
+
if (resolved.startsWith(blocked + '/') || resolved.startsWith(blocked + '\\')) {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Pattern match
|
|
266
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
267
|
+
if (pattern.test(resolved))
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
isInsideJail(resolved) {
|
|
273
|
+
const rel = relative(this.jailRoot, resolved);
|
|
274
|
+
return !rel.startsWith('..') && !isAbsolute(rel);
|
|
275
|
+
}
|
|
276
|
+
resolvePath(filePath) {
|
|
277
|
+
return resolve(normalize(filePath));
|
|
278
|
+
}
|
|
279
|
+
expandPath(p) {
|
|
280
|
+
if (p.startsWith('~/') || p === '~') {
|
|
281
|
+
return resolve(this.homeDir, p.slice(2));
|
|
282
|
+
}
|
|
283
|
+
return resolve(p);
|
|
284
|
+
}
|
|
285
|
+
recordViolation(partial) {
|
|
286
|
+
this.violations.push({ ...partial, timestamp: new Date().toISOString() });
|
|
287
|
+
}
|
|
288
|
+
getViolations() {
|
|
289
|
+
return [...this.violations];
|
|
290
|
+
}
|
|
291
|
+
getStats() {
|
|
292
|
+
return {
|
|
293
|
+
filesCreated: this.fileCount,
|
|
294
|
+
bytesWritten: this.totalBytesWritten,
|
|
295
|
+
violations: this.violations.length,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Parse filesystem policy from SKILL.md frontmatter.
|
|
301
|
+
* Expected format:
|
|
302
|
+
* filesystem:
|
|
303
|
+
* writable: ["./output", "/tmp"]
|
|
304
|
+
* readable: ["./data"]
|
|
305
|
+
* maxWriteMB: 50
|
|
306
|
+
* maxFiles: 100
|
|
307
|
+
*/
|
|
308
|
+
export function parseFilesystemPolicy(frontmatter, defaultJailRoot) {
|
|
309
|
+
const fs = (frontmatter.filesystem || frontmatter.fs || {});
|
|
310
|
+
return {
|
|
311
|
+
jailRoot: fs.root || defaultJailRoot,
|
|
312
|
+
readablePaths: fs.readable || [],
|
|
313
|
+
writablePaths: fs.writable || [],
|
|
314
|
+
blockedPaths: fs.blocked || [],
|
|
315
|
+
allowReadOutsideJail: fs.allowReadOutside || false,
|
|
316
|
+
maxWriteSize: (fs.maxWriteMB || 50) * 1024 * 1024,
|
|
317
|
+
maxFileCount: fs.maxFiles || 100,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=filesystem-jail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem-jail.js","sourceRoot":"","sources":["../../src/shield/filesystem-jail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkillShield — Unified Runtime Security Engine
|
|
3
|
+
*
|
|
4
|
+
* Combines: Pre-scan (guard) + Network Policy + Filesystem Jail +
|
|
5
|
+
* Runtime Monitor + Kill Switch + Audit Trail
|
|
6
|
+
*
|
|
7
|
+
* This is what makes SkillShield unique:
|
|
8
|
+
* - Snyk/Cisco only scan before install
|
|
9
|
+
* - NVIDIA OpenShell needs Linux + enterprise infra
|
|
10
|
+
* - Aegis only intercepts LLM API calls
|
|
11
|
+
* - SkillShield does scan + runtime in one CLI, cross-platform
|
|
12
|
+
*/
|
|
13
|
+
export { NetworkPolicyEngine, parseNetworkPolicy } from './network-policy.js';
|
|
14
|
+
export type { NetworkPolicy, NetworkViolation } from './network-policy.js';
|
|
15
|
+
export { FilesystemJail, parseFilesystemPolicy } from './filesystem-jail.js';
|
|
16
|
+
export type { FilesystemPolicy, FilesystemViolation } from './filesystem-jail.js';
|
|
17
|
+
export { RuntimeMonitor, getDefaultMonitorPolicy } from './runtime-monitor.js';
|
|
18
|
+
export type { MonitorPolicy, RuntimeEvent, MonitorReport } from './runtime-monitor.js';
|
|
19
|
+
export { AuditTrail } from './audit-trail.js';
|
|
20
|
+
export type { AuditEntry, AuditEventType } from './audit-trail.js';
|
|
21
|
+
import { NetworkPolicyEngine, type NetworkPolicy } from './network-policy.js';
|
|
22
|
+
import { FilesystemJail, type FilesystemPolicy } from './filesystem-jail.js';
|
|
23
|
+
import { RuntimeMonitor, type MonitorPolicy } from './runtime-monitor.js';
|
|
24
|
+
import { AuditTrail } from './audit-trail.js';
|
|
25
|
+
export interface ShieldConfig {
|
|
26
|
+
skillId: string;
|
|
27
|
+
/** SKILL.md frontmatter for policy extraction */
|
|
28
|
+
frontmatter?: Record<string, unknown>;
|
|
29
|
+
/** Override network policy */
|
|
30
|
+
networkPolicy?: Partial<NetworkPolicy>;
|
|
31
|
+
/** Override filesystem policy */
|
|
32
|
+
filesystemPolicy?: Partial<FilesystemPolicy>;
|
|
33
|
+
/** Override monitor policy */
|
|
34
|
+
monitorPolicy?: Partial<MonitorPolicy>;
|
|
35
|
+
/** Working directory for the skill */
|
|
36
|
+
workDir?: string;
|
|
37
|
+
/** Enable audit trail (default: true) */
|
|
38
|
+
enableAudit?: boolean;
|
|
39
|
+
/** Verbose logging */
|
|
40
|
+
verbose?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ShieldReport {
|
|
43
|
+
skillId: string;
|
|
44
|
+
timestamp: string;
|
|
45
|
+
/** Pre-execution scan results */
|
|
46
|
+
scanScore: number;
|
|
47
|
+
scanStatus: string;
|
|
48
|
+
/** Runtime results */
|
|
49
|
+
killed: boolean;
|
|
50
|
+
killReason?: string;
|
|
51
|
+
durationMs: number;
|
|
52
|
+
/** Violations across all layers */
|
|
53
|
+
networkViolations: number;
|
|
54
|
+
filesystemViolations: number;
|
|
55
|
+
runtimeThreats: number;
|
|
56
|
+
totalViolations: number;
|
|
57
|
+
/** Audit trail hash (for verification) */
|
|
58
|
+
auditHash: string | null;
|
|
59
|
+
auditLength: number;
|
|
60
|
+
auditVerified: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The main Shield — orchestrates all security layers.
|
|
64
|
+
*/
|
|
65
|
+
export declare class SkillShield {
|
|
66
|
+
private config;
|
|
67
|
+
network: NetworkPolicyEngine;
|
|
68
|
+
filesystem: FilesystemJail;
|
|
69
|
+
monitor: RuntimeMonitor;
|
|
70
|
+
audit: AuditTrail;
|
|
71
|
+
constructor(config: ShieldConfig);
|
|
72
|
+
/**
|
|
73
|
+
* Generate the combined enforcement code that wraps skill execution.
|
|
74
|
+
* This code is prepended to the skill's execution context.
|
|
75
|
+
*/
|
|
76
|
+
generateEnforcementWrapper(): string;
|
|
77
|
+
/**
|
|
78
|
+
* Get the final shield report after execution.
|
|
79
|
+
*/
|
|
80
|
+
getReport(scanScore: number, scanStatus: string, durationMs: number): ShieldReport;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shield/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAsB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,cAAc,EAAyB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,cAAc,EAA2B,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,8BAA8B;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAe;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;gBAEb,MAAM,EAAE,YAAY;IAwBhC;;;OAGG;IACH,0BAA0B,IAAI,MAAM;IAgBpC;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;CAuBnF"}
|