agentshield 0.0.2-beta.0 โ†’ 0.0.2-beta.3

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.
@@ -0,0 +1,55 @@
1
+ import { ShieldConfig } from "./config.js";
2
+ export interface BackupEntry {
3
+ originalPath: string;
4
+ backupPath: string;
5
+ timestamp: number;
6
+ size: number;
7
+ sessionId: string;
8
+ }
9
+ export interface BackupIndex {
10
+ entries: BackupEntry[];
11
+ sessions: {
12
+ [sessionId: string]: {
13
+ startTime: number;
14
+ endTime?: number;
15
+ };
16
+ };
17
+ }
18
+ export declare class BackupManager {
19
+ private config;
20
+ private snapshotsDir;
21
+ private indexPath;
22
+ private index;
23
+ private currentSessionId;
24
+ private protectedInSession;
25
+ constructor(config: ShieldConfig);
26
+ private ensureVaultExists;
27
+ private loadIndex;
28
+ private saveIndex;
29
+ shouldExclude(filePath: string): boolean;
30
+ backupFile(relativePath: string, forceFullCopy?: boolean): BackupEntry | null;
31
+ snapshotWorkspace(): {
32
+ total: number;
33
+ backed: number;
34
+ skipped: number;
35
+ };
36
+ resetSession(): void;
37
+ getBackupsForFile(relativePath: string): BackupEntry[];
38
+ getAllBackups(): BackupEntry[];
39
+ restoreFile(entry: BackupEntry): boolean;
40
+ restoreLatest(relativePath: string): boolean;
41
+ restoreSession(sessionId: string): {
42
+ restored: number;
43
+ failed: number;
44
+ };
45
+ cleanOldBackups(maxAgeDays: number): {
46
+ removed: number;
47
+ freedBytes: number;
48
+ };
49
+ getStats(): {
50
+ totalBackups: number;
51
+ totalSize: number;
52
+ uniqueFiles: number;
53
+ sessions: number;
54
+ };
55
+ }
package/dist/backup.js ADDED
@@ -0,0 +1,216 @@
1
+ import { existsSync, mkdirSync, linkSync, copyFileSync, statSync, readFileSync, writeFileSync, unlinkSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import { getSnapshotsDir, getIndexPath } from "./config.js";
4
+ import { matchesPattern, getAllFiles, removeEmptyDirs } from "./utils.js";
5
+ export class BackupManager {
6
+ constructor(config) {
7
+ this.protectedInSession = new Set();
8
+ this.config = config;
9
+ this.snapshotsDir = getSnapshotsDir(config);
10
+ this.indexPath = getIndexPath(config);
11
+ this.currentSessionId = `session_${Date.now()}`;
12
+ this.ensureVaultExists();
13
+ this.index = this.loadIndex();
14
+ }
15
+ ensureVaultExists() {
16
+ if (!existsSync(this.config.vaultDir)) {
17
+ mkdirSync(this.config.vaultDir, { recursive: true });
18
+ }
19
+ if (!existsSync(this.snapshotsDir)) {
20
+ mkdirSync(this.snapshotsDir, { recursive: true });
21
+ }
22
+ }
23
+ loadIndex() {
24
+ if (existsSync(this.indexPath)) {
25
+ try {
26
+ const data = readFileSync(this.indexPath, "utf-8");
27
+ return JSON.parse(data);
28
+ }
29
+ catch {
30
+ return { entries: [], sessions: {} };
31
+ }
32
+ }
33
+ return { entries: [], sessions: {} };
34
+ }
35
+ saveIndex() {
36
+ writeFileSync(this.indexPath, JSON.stringify(this.index, null, 2));
37
+ }
38
+ shouldExclude(filePath) {
39
+ return matchesPattern(filePath, this.config.excludePatterns);
40
+ }
41
+ backupFile(relativePath, forceFullCopy = false) {
42
+ const fullPath = join(this.config.workspace, relativePath);
43
+ if (this.shouldExclude(relativePath)) {
44
+ return null;
45
+ }
46
+ if (this.protectedInSession.has(fullPath)) {
47
+ return null;
48
+ }
49
+ if (!existsSync(fullPath)) {
50
+ return null;
51
+ }
52
+ try {
53
+ const stats = statSync(fullPath);
54
+ if (!stats.isFile()) {
55
+ return null;
56
+ }
57
+ const timestamp = Date.now();
58
+ const safeFilename = relativePath.replace(/[/\\]/g, "__");
59
+ const backupFilename = `${timestamp}_${safeFilename}`;
60
+ const backupPath = join(this.snapshotsDir, backupFilename);
61
+ mkdirSync(dirname(backupPath), { recursive: true });
62
+ if (forceFullCopy) {
63
+ copyFileSync(fullPath, backupPath);
64
+ }
65
+ else {
66
+ try {
67
+ linkSync(fullPath, backupPath);
68
+ }
69
+ catch (err) {
70
+ copyFileSync(fullPath, backupPath);
71
+ }
72
+ }
73
+ const entry = {
74
+ originalPath: relativePath,
75
+ backupPath: backupFilename,
76
+ timestamp,
77
+ size: stats.size,
78
+ sessionId: this.currentSessionId,
79
+ };
80
+ this.index.entries.push(entry);
81
+ this.protectedInSession.add(fullPath);
82
+ this.saveIndex();
83
+ return entry;
84
+ }
85
+ catch (err) {
86
+ console.error(`Failed to backup ${relativePath}:`, err);
87
+ return null;
88
+ }
89
+ }
90
+ snapshotWorkspace() {
91
+ const files = getAllFiles(this.config.workspace);
92
+ let backed = 0;
93
+ let skipped = 0;
94
+ for (const file of files) {
95
+ if (this.shouldExclude(file)) {
96
+ skipped++;
97
+ continue;
98
+ }
99
+ const entry = this.backupFile(file, true);
100
+ if (entry) {
101
+ backed++;
102
+ }
103
+ else {
104
+ skipped++;
105
+ }
106
+ }
107
+ return { total: files.length, backed, skipped };
108
+ }
109
+ resetSession() {
110
+ if (this.index.sessions[this.currentSessionId]) {
111
+ this.index.sessions[this.currentSessionId].endTime = Date.now();
112
+ }
113
+ this.currentSessionId = `session_${Date.now()}`;
114
+ this.index.sessions[this.currentSessionId] = { startTime: Date.now() };
115
+ this.protectedInSession.clear();
116
+ this.saveIndex();
117
+ }
118
+ getBackupsForFile(relativePath) {
119
+ return this.index.entries
120
+ .filter(e => e.originalPath === relativePath)
121
+ .sort((a, b) => b.timestamp - a.timestamp);
122
+ }
123
+ getAllBackups() {
124
+ return [...this.index.entries].sort((a, b) => b.timestamp - a.timestamp);
125
+ }
126
+ restoreFile(entry) {
127
+ const backupFullPath = join(this.snapshotsDir, entry.backupPath);
128
+ const targetPath = join(this.config.workspace, entry.originalPath);
129
+ if (!existsSync(backupFullPath)) {
130
+ console.error(`Backup file not found: ${entry.backupPath}`);
131
+ return false;
132
+ }
133
+ try {
134
+ mkdirSync(dirname(targetPath), { recursive: true });
135
+ copyFileSync(backupFullPath, targetPath);
136
+ return true;
137
+ }
138
+ catch (err) {
139
+ console.error(`Failed to restore ${entry.originalPath}:`, err);
140
+ return false;
141
+ }
142
+ }
143
+ restoreLatest(relativePath) {
144
+ const backups = this.getBackupsForFile(relativePath);
145
+ if (backups.length === 0) {
146
+ console.error(`No backups found for: ${relativePath}`);
147
+ return false;
148
+ }
149
+ return this.restoreFile(backups[0]);
150
+ }
151
+ restoreSession(sessionId) {
152
+ const sessionEntries = this.index.entries.filter(e => e.sessionId === sessionId);
153
+ let restored = 0;
154
+ let failed = 0;
155
+ const latestByFile = new Map();
156
+ for (const entry of sessionEntries) {
157
+ const existing = latestByFile.get(entry.originalPath);
158
+ if (!existing || entry.timestamp < existing.timestamp) {
159
+ latestByFile.set(entry.originalPath, entry);
160
+ }
161
+ }
162
+ for (const entry of latestByFile.values()) {
163
+ if (this.restoreFile(entry)) {
164
+ restored++;
165
+ }
166
+ else {
167
+ failed++;
168
+ }
169
+ }
170
+ return { restored, failed };
171
+ }
172
+ cleanOldBackups(maxAgeDays) {
173
+ const cutoff = Date.now() - (maxAgeDays * 24 * 60 * 60 * 1000);
174
+ let removed = 0;
175
+ let freedBytes = 0;
176
+ const toRemove = [];
177
+ const toKeep = [];
178
+ for (const entry of this.index.entries) {
179
+ if (entry.timestamp < cutoff) {
180
+ toRemove.push(entry);
181
+ }
182
+ else {
183
+ toKeep.push(entry);
184
+ }
185
+ }
186
+ for (const entry of toRemove) {
187
+ const backupPath = join(this.snapshotsDir, entry.backupPath);
188
+ try {
189
+ if (existsSync(backupPath)) {
190
+ const stats = statSync(backupPath);
191
+ unlinkSync(backupPath);
192
+ freedBytes += stats.size;
193
+ removed++;
194
+ }
195
+ }
196
+ catch (err) {
197
+ // Ignore removal errors
198
+ }
199
+ }
200
+ this.index.entries = toKeep;
201
+ this.saveIndex();
202
+ removeEmptyDirs(this.snapshotsDir);
203
+ return { removed, freedBytes };
204
+ }
205
+ getStats() {
206
+ const uniqueFiles = new Set(this.index.entries.map(e => e.originalPath));
207
+ const totalSize = this.index.entries.reduce((sum, e) => sum + e.size, 0);
208
+ return {
209
+ totalBackups: this.index.entries.length,
210
+ totalSize,
211
+ uniqueFiles: uniqueFiles.size,
212
+ sessions: Object.keys(this.index.sessions).length,
213
+ };
214
+ }
215
+ }
216
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function runCli(argv: string[]): Promise<void>;
package/dist/cli.js ADDED
@@ -0,0 +1,236 @@
1
+ import { resolve } from "path";
2
+ import { existsSync } from "fs";
3
+ import { spawn } from "child_process";
4
+ import { getDefaultConfig } from "./config.js";
5
+ import { BackupManager } from "./backup.js";
6
+ import { ShieldWatcher } from "./watcher.js";
7
+ import { formatBytes, formatTimeAgo } from "./utils.js";
8
+ function parseArgs(args) {
9
+ const result = {
10
+ command: args[0] || "help",
11
+ args: [],
12
+ flags: {},
13
+ };
14
+ for (let i = 1; i < args.length; i++) {
15
+ const arg = args[i];
16
+ if (arg.startsWith("--")) {
17
+ const [key, value] = arg.slice(2).split("=");
18
+ result.flags[key] = value ?? true;
19
+ }
20
+ else if (arg.startsWith("-")) {
21
+ result.flags[arg.slice(1)] = true;
22
+ }
23
+ else {
24
+ result.args.push(arg);
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ function printHelp() {
30
+ console.log(`
31
+ ๐Ÿ›ก๏ธ Shield - File Protection for AI Agents
32
+
33
+ Usage:
34
+ shield <command> [options]
35
+
36
+ Commands:
37
+ watch [path] Start watching a directory (default: current dir)
38
+ exec <command> Snapshot workspace, run command, then allow restore
39
+ snapshot [path] Take a one-time snapshot of all files
40
+ restore [file] Restore a file to its backed-up version
41
+ list List all backups
42
+ clean [--days=N] Remove backups older than N days (default: 7)
43
+ status Show backup statistics
44
+ help Show this help message
45
+
46
+ Options:
47
+ --path=<dir> Specify workspace directory
48
+ --days=<N> For clean command: max age in days
49
+
50
+ Examples:
51
+ shield watch ./my-project
52
+ shield exec -- npm run agent-task
53
+ shield restore src/index.ts
54
+ shield clean --days=3
55
+ shield status
56
+ `);
57
+ }
58
+ export async function runCli(argv) {
59
+ const options = parseArgs(argv.slice(2));
60
+ switch (options.command) {
61
+ case "watch":
62
+ await cmdWatch(options);
63
+ break;
64
+ case "exec":
65
+ await cmdExec(options, argv);
66
+ break;
67
+ case "snapshot":
68
+ await cmdSnapshot(options);
69
+ break;
70
+ case "restore":
71
+ await cmdRestore(options);
72
+ break;
73
+ case "list":
74
+ await cmdList(options);
75
+ break;
76
+ case "clean":
77
+ await cmdClean(options);
78
+ break;
79
+ case "status":
80
+ await cmdStatus(options);
81
+ break;
82
+ case "help":
83
+ default:
84
+ printHelp();
85
+ break;
86
+ }
87
+ }
88
+ async function getConfig(options) {
89
+ const pathArg = options.flags["path"] || options.args[0] || ".";
90
+ const workspace = resolve(pathArg);
91
+ if (!existsSync(workspace)) {
92
+ console.error(`Error: Directory not found: ${workspace}`);
93
+ process.exit(1);
94
+ }
95
+ return getDefaultConfig(workspace);
96
+ }
97
+ async function cmdWatch(options) {
98
+ const config = await getConfig(options);
99
+ const backupManager = new BackupManager(config);
100
+ const watcher = new ShieldWatcher(config, backupManager);
101
+ watcher.start();
102
+ process.on("SIGINT", () => {
103
+ console.log("\n");
104
+ watcher.stop();
105
+ const stats = backupManager.getStats();
106
+ console.log(`\n๐Ÿ“Š Session summary: ${stats.totalBackups} backups, ${stats.uniqueFiles} unique files`);
107
+ process.exit(0);
108
+ });
109
+ await new Promise(() => { });
110
+ }
111
+ async function cmdExec(options, rawArgv) {
112
+ const dashDashIndex = rawArgv.indexOf("--");
113
+ if (dashDashIndex === -1 || dashDashIndex === rawArgv.length - 1) {
114
+ console.error("Usage: shield exec -- <command>");
115
+ console.error("Example: shield exec -- npm run agent-task");
116
+ process.exit(1);
117
+ }
118
+ const commandArgs = rawArgv.slice(dashDashIndex + 1);
119
+ const pathArg = options.flags["path"] || ".";
120
+ const workspace = resolve(pathArg);
121
+ const config = getDefaultConfig(workspace);
122
+ const backupManager = new BackupManager(config);
123
+ console.log("๐Ÿ›ก๏ธ Shield Exec Mode");
124
+ console.log("โ”€".repeat(50));
125
+ console.log("๐Ÿ“ธ Taking pre-execution snapshot...");
126
+ const snapshot = backupManager.snapshotWorkspace();
127
+ console.log(`โœ“ Snapshot complete: ${snapshot.backed} files backed up, ${snapshot.skipped} skipped`);
128
+ console.log("โ”€".repeat(50));
129
+ console.log(`๐Ÿš€ Running: ${commandArgs.join(" ")}`);
130
+ console.log("โ”€".repeat(50));
131
+ const child = spawn(commandArgs[0], commandArgs.slice(1), {
132
+ stdio: "inherit",
133
+ shell: true,
134
+ cwd: workspace,
135
+ });
136
+ await new Promise((resolve, reject) => {
137
+ child.on("close", (code) => {
138
+ console.log("โ”€".repeat(50));
139
+ if (code === 0) {
140
+ console.log("โœ“ Command completed successfully");
141
+ }
142
+ else {
143
+ console.log(`โš  Command exited with code ${code}`);
144
+ }
145
+ console.log("\n๐Ÿ’ก To restore files, run: shield restore <file>");
146
+ console.log(" To list all backups: shield list");
147
+ resolve();
148
+ });
149
+ child.on("error", reject);
150
+ });
151
+ }
152
+ async function cmdSnapshot(options) {
153
+ const config = await getConfig(options);
154
+ const backupManager = new BackupManager(config);
155
+ console.log("๐Ÿ“ธ Taking snapshot...");
156
+ const result = backupManager.snapshotWorkspace();
157
+ console.log(`โœ“ Complete: ${result.backed} files backed up, ${result.skipped} skipped`);
158
+ }
159
+ async function cmdRestore(options) {
160
+ const pathArg = options.flags["path"] || ".";
161
+ const workspace = resolve(pathArg);
162
+ if (!existsSync(workspace)) {
163
+ console.error(`Error: Directory not found: ${workspace}`);
164
+ process.exit(1);
165
+ }
166
+ const config = getDefaultConfig(workspace);
167
+ const backupManager = new BackupManager(config);
168
+ const fileArg = options.args[0];
169
+ if (!fileArg) {
170
+ const backups = backupManager.getAllBackups();
171
+ if (backups.length === 0) {
172
+ console.log("No backups available");
173
+ return;
174
+ }
175
+ console.log("Available backups (use 'shield restore <file>' to restore):\n");
176
+ const uniqueFiles = new Map();
177
+ for (const backup of backups) {
178
+ if (!uniqueFiles.has(backup.originalPath)) {
179
+ uniqueFiles.set(backup.originalPath, backup);
180
+ }
181
+ }
182
+ for (const [path, backup] of uniqueFiles) {
183
+ console.log(` ${path} (${formatTimeAgo(backup.timestamp)})`);
184
+ }
185
+ return;
186
+ }
187
+ console.log(`๐Ÿ”„ Restoring: ${fileArg}`);
188
+ const success = backupManager.restoreLatest(fileArg);
189
+ if (success) {
190
+ console.log(`โœ“ Restored: ${fileArg}`);
191
+ }
192
+ else {
193
+ console.log(`โœ— Failed to restore: ${fileArg}`);
194
+ process.exit(1);
195
+ }
196
+ }
197
+ async function cmdList(options) {
198
+ const config = await getConfig(options);
199
+ const backupManager = new BackupManager(config);
200
+ const backups = backupManager.getAllBackups();
201
+ if (backups.length === 0) {
202
+ console.log("No backups found");
203
+ return;
204
+ }
205
+ console.log(`๐Ÿ“‹ All Backups (${backups.length} total)\n`);
206
+ for (const backup of backups.slice(0, 50)) {
207
+ const timeStr = formatTimeAgo(backup.timestamp);
208
+ const sizeStr = formatBytes(backup.size);
209
+ console.log(` ${backup.originalPath}`);
210
+ console.log(` โ””โ”€ ${timeStr} | ${sizeStr}`);
211
+ }
212
+ if (backups.length > 50) {
213
+ console.log(`\n ... and ${backups.length - 50} more`);
214
+ }
215
+ }
216
+ async function cmdClean(options) {
217
+ const config = await getConfig(options);
218
+ const backupManager = new BackupManager(config);
219
+ const days = parseInt(options.flags["days"]) || 7;
220
+ console.log(`๐Ÿงน Cleaning backups older than ${days} days...`);
221
+ const result = backupManager.cleanOldBackups(days);
222
+ console.log(`โœ“ Removed ${result.removed} backups, freed ${formatBytes(result.freedBytes)}`);
223
+ }
224
+ async function cmdStatus(options) {
225
+ const config = await getConfig(options);
226
+ const backupManager = new BackupManager(config);
227
+ const stats = backupManager.getStats();
228
+ console.log("๐Ÿ“Š Shield Status\n");
229
+ console.log(` Workspace: ${config.workspace}`);
230
+ console.log(` Vault: ${config.vaultDir}`);
231
+ console.log(` Total Backups: ${stats.totalBackups}`);
232
+ console.log(` Unique Files: ${stats.uniqueFiles}`);
233
+ console.log(` Total Size: ${formatBytes(stats.totalSize)}`);
234
+ console.log(` Sessions: ${stats.sessions}`);
235
+ }
236
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface ShieldConfig {
2
+ workspace: string;
3
+ vaultDir: string;
4
+ excludePatterns: string[];
5
+ maxBackupAgeDays: number;
6
+ }
7
+ export declare const DEFAULT_VAULT_NAME = ".shield";
8
+ export declare const SNAPSHOTS_DIR = "snapshots";
9
+ export declare const INDEX_FILE = "index.json";
10
+ export declare const DEFAULT_EXCLUDE_PATTERNS: string[];
11
+ export declare function getDefaultConfig(workspace: string): ShieldConfig;
12
+ export declare function getSnapshotsDir(config: ShieldConfig): string;
13
+ export declare function getIndexPath(config: ShieldConfig): string;
package/dist/config.js ADDED
@@ -0,0 +1,49 @@
1
+ import { join } from "path";
2
+ export const DEFAULT_VAULT_NAME = ".shield";
3
+ export const SNAPSHOTS_DIR = "snapshots";
4
+ export const INDEX_FILE = "index.json";
5
+ export const DEFAULT_EXCLUDE_PATTERNS = [
6
+ ".git",
7
+ ".git/**",
8
+ "node_modules",
9
+ "node_modules/**",
10
+ ".shield",
11
+ ".shield/**",
12
+ "**/*.log",
13
+ "**/*.tmp",
14
+ "**/*.swp",
15
+ "**/*.swo",
16
+ "**/~*",
17
+ "**/.DS_Store",
18
+ "**/Thumbs.db",
19
+ "**/__pycache__",
20
+ "**/__pycache__/**",
21
+ "**/*.pyc",
22
+ "**/dist",
23
+ "**/dist/**",
24
+ "**/build",
25
+ "**/build/**",
26
+ "**/.next",
27
+ "**/.next/**",
28
+ "**/.nuxt",
29
+ "**/.nuxt/**",
30
+ "**/coverage",
31
+ "**/coverage/**",
32
+ "**/.cache",
33
+ "**/.cache/**",
34
+ ];
35
+ export function getDefaultConfig(workspace) {
36
+ return {
37
+ workspace: workspace,
38
+ vaultDir: join(workspace, DEFAULT_VAULT_NAME),
39
+ excludePatterns: DEFAULT_EXCLUDE_PATTERNS,
40
+ maxBackupAgeDays: 7,
41
+ };
42
+ }
43
+ export function getSnapshotsDir(config) {
44
+ return join(config.vaultDir, SNAPSHOTS_DIR);
45
+ }
46
+ export function getIndexPath(config) {
47
+ return join(config.vaultDir, INDEX_FILE);
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,MAAM;IACN,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,OAAO;IACP,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,aAAa;IACb,UAAU;IACV,aAAa;IACb,UAAU;IACV,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,WAAW;IACX,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO;QACL,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC;QAC7C,eAAe,EAAE,wBAAwB;QACzC,gBAAgB,EAAE,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ export {};