@brela-dev/daemon 0.1.2

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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":""}
package/dist/daemon.js ADDED
@@ -0,0 +1,207 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import chokidar from 'chokidar';
4
+ import { SidecarWriter, SessionManager, AITool, DetectionMethod } from '@brela-dev/core';
5
+ // ── Constants ────────────────────────────────────────────────────────────────
6
+ const BUFFER_TTL_MS = 60_000; // drop file records older than 60s
7
+ const INTENT_WINDOW_MS = 30_000; // correlate intents within 30s
8
+ const IDLE_PRUNE_INTERVAL_MS = 30_000;
9
+ // ── Logging (to .brela/daemon.log only) ───────────────────────────────────
10
+ let logStream = null;
11
+ function initLog(projectRoot) {
12
+ const logPath = path.join(projectRoot, '.brela', 'daemon.log');
13
+ logStream = fs.createWriteStream(logPath, { flags: 'a' });
14
+ }
15
+ function log(msg) {
16
+ const line = `[${new Date().toISOString()}] ${msg}\n`;
17
+ logStream?.write(line);
18
+ }
19
+ function toolFromIntent(intentTool) {
20
+ if (intentTool === 'claude-code')
21
+ return AITool.CLAUDE_CODE;
22
+ if (intentTool === 'copilot-cli')
23
+ return AITool.COPILOT;
24
+ return AITool.UNKNOWN;
25
+ }
26
+ function readRecentIntents(projectRoot, windowMs) {
27
+ const intentFile = path.join(projectRoot, '.brela', 'shell-intents.jsonl');
28
+ if (!fs.existsSync(intentFile))
29
+ return [];
30
+ const cutoff = Date.now() - windowMs;
31
+ const lines = fs.readFileSync(intentFile, 'utf8').split('\n');
32
+ const recent = [];
33
+ for (const line of lines) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed)
36
+ continue;
37
+ try {
38
+ const intent = JSON.parse(trimmed);
39
+ if (new Date(intent.timestamp).getTime() >= cutoff) {
40
+ recent.push(intent);
41
+ }
42
+ }
43
+ catch {
44
+ // Malformed line — skip silently
45
+ }
46
+ }
47
+ return recent;
48
+ }
49
+ class FileBuffer {
50
+ records = new Map();
51
+ update(filePath, currentLineCount) {
52
+ const existing = this.records.get(filePath);
53
+ const prevLines = existing?.lastLineCount ?? currentLineCount;
54
+ const delta = currentLineCount - prevLines;
55
+ this.records.set(filePath, {
56
+ changedAt: Date.now(),
57
+ sizeDeltas: [...(existing?.sizeDeltas ?? []), delta],
58
+ lastLineCount: currentLineCount,
59
+ });
60
+ }
61
+ recentFiles(windowMs) {
62
+ const cutoff = Date.now() - windowMs;
63
+ const results = [];
64
+ for (const [filePath, record] of this.records) {
65
+ if (record.changedAt >= cutoff) {
66
+ results.push({ filePath, record });
67
+ }
68
+ }
69
+ return results;
70
+ }
71
+ prune() {
72
+ const cutoff = Date.now() - BUFFER_TTL_MS;
73
+ for (const [filePath, record] of this.records) {
74
+ if (record.changedAt < cutoff) {
75
+ this.records.delete(filePath);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ // ── Line counting ────────────────────────────────────────────────────────────
81
+ function countLines(filePath) {
82
+ try {
83
+ const content = fs.readFileSync(filePath, 'utf8');
84
+ return content.split('\n').length;
85
+ }
86
+ catch {
87
+ return 0;
88
+ }
89
+ }
90
+ // ── Git guard ─────────────────────────────────────────────────────────────────
91
+ function hasGit(projectRoot) {
92
+ return fs.existsSync(path.join(projectRoot, '.git'));
93
+ }
94
+ // ── Attribution correlation ──────────────────────────────────────────────────
95
+ function correlate(filePath, record, intents, projectRoot, writer, session) {
96
+ if (intents.length === 0)
97
+ return;
98
+ // Use the most recent intent
99
+ const intent = intents[intents.length - 1];
100
+ const tool = toolFromIntent(intent.tool);
101
+ const totalDelta = record.sizeDeltas.reduce((a, b) => a + b, 0);
102
+ const linesEnd = record.lastLineCount;
103
+ const linesStart = Math.max(0, linesEnd - Math.abs(totalDelta));
104
+ // Rough chars-inserted estimate: assume ~50 chars per added line
105
+ const charsInserted = Math.max(0, totalDelta) * 50;
106
+ const relFile = filePath.startsWith(projectRoot)
107
+ ? filePath.slice(projectRoot.length).replace(/^[\\/]/, '')
108
+ : filePath;
109
+ const entry = {
110
+ file: relFile,
111
+ tool,
112
+ confidence: 'medium',
113
+ detectionMethod: DetectionMethod.SHELL_WRAPPER,
114
+ linesStart,
115
+ linesEnd,
116
+ charsInserted,
117
+ timestamp: new Date().toISOString(),
118
+ sessionId: session.getCurrentSession(),
119
+ accepted: true,
120
+ };
121
+ try {
122
+ writer.write(entry);
123
+ log(`attributed ${relFile} to ${tool} via ${intent.tool} intent`);
124
+ }
125
+ catch (err) {
126
+ log(`write error: ${String(err)}`);
127
+ }
128
+ }
129
+ // ── Daemon main ──────────────────────────────────────────────────────────────
130
+ function main() {
131
+ const projectRoot = process.argv[2];
132
+ if (!projectRoot || !fs.existsSync(projectRoot)) {
133
+ process.stderr.write('brela-daemon: project root not provided or does not exist\n');
134
+ process.exit(1);
135
+ }
136
+ // Ensure .brela/ exists before any log/write operations
137
+ fs.mkdirSync(path.join(projectRoot, '.brela'), { recursive: true });
138
+ initLog(projectRoot);
139
+ log(`daemon started — watching ${projectRoot}`);
140
+ const buffer = new FileBuffer();
141
+ const writer = new SidecarWriter(projectRoot);
142
+ const session = new SessionManager(projectRoot);
143
+ const gitAvailable = hasGit(projectRoot);
144
+ if (!gitAvailable) {
145
+ log('no .git found — git operations disabled');
146
+ }
147
+ // ── Watcher setup ────────────────────────────────────────────────────────
148
+ const watcher = chokidar.watch(projectRoot, {
149
+ ignored: [
150
+ /(^|[/\\])\.(git|brela)([/\\]|$)/, // .git and .brela
151
+ /node_modules/,
152
+ ],
153
+ ignoreInitial: true, // don't fire for already-existing files
154
+ persistent: true,
155
+ usePolling: false, // inotify/FSEvents — low CPU
156
+ awaitWriteFinish: {
157
+ stabilityThreshold: 100, // wait 100ms after last write before firing
158
+ pollInterval: 50,
159
+ },
160
+ });
161
+ function handleChange(filePath) {
162
+ try {
163
+ const lineCount = countLines(filePath);
164
+ buffer.update(filePath, lineCount);
165
+ const intents = readRecentIntents(projectRoot, INTENT_WINDOW_MS);
166
+ if (intents.length > 0) {
167
+ const record = buffer.recentFiles(INTENT_WINDOW_MS)
168
+ .find((r) => r.filePath === filePath);
169
+ if (record !== undefined) {
170
+ correlate(filePath, record.record, intents, projectRoot, writer, session);
171
+ }
172
+ }
173
+ }
174
+ catch (err) {
175
+ log(`handleChange error for ${filePath}: ${String(err)}`);
176
+ }
177
+ }
178
+ watcher.on('add', handleChange);
179
+ watcher.on('change', handleChange);
180
+ watcher.on('error', (err) => log(`watcher error: ${String(err)}`));
181
+ // ── Periodic buffer pruning (keeps RAM bounded) ──────────────────────────
182
+ const pruneTimer = setInterval(() => {
183
+ try {
184
+ buffer.prune();
185
+ }
186
+ catch (err) {
187
+ log(`prune error: ${String(err)}`);
188
+ }
189
+ }, IDLE_PRUNE_INTERVAL_MS);
190
+ pruneTimer.unref(); // don't keep the process alive for pruning alone
191
+ // ── Graceful shutdown ────────────────────────────────────────────────────
192
+ function shutdown(signal) {
193
+ log(`daemon stopping (${signal})`);
194
+ clearInterval(pruneTimer);
195
+ watcher.close().then(() => {
196
+ logStream?.end();
197
+ process.exit(0);
198
+ }).catch(() => {
199
+ logStream?.end();
200
+ process.exit(0);
201
+ });
202
+ }
203
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
204
+ process.on('SIGINT', () => shutdown('SIGINT'));
205
+ }
206
+ main();
207
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@brela-dev/daemon",
3
+ "version": "0.1.2",
4
+ "description": "Background file-watcher daemon for Brela AI attribution",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/daemon.js",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/kaustubh03/brela",
15
+ "directory": "packages/daemon"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsx src/index.ts",
20
+ "typecheck": "tsc --noEmit",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "dependencies": {
24
+ "@brela-dev/core": "^0.1.2",
25
+ "chokidar": "^5.0.0"
26
+ },
27
+ "license": "MIT"
28
+ }