chronicle-ai 0.0.1
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 +132 -0
- package/package.json +86 -0
- package/packages/README.md +139 -0
- package/packages/cli/README.md +92 -0
- package/packages/cli/bin/chronicle.js +2 -0
- package/packages/cli/dist/commands/add.d.ts +2 -0
- package/packages/cli/dist/commands/add.d.ts.map +1 -0
- package/packages/cli/dist/commands/add.js +82 -0
- package/packages/cli/dist/commands/add.js.map +1 -0
- package/packages/cli/dist/commands/diff.d.ts +11 -0
- package/packages/cli/dist/commands/diff.d.ts.map +1 -0
- package/packages/cli/dist/commands/diff.js +164 -0
- package/packages/cli/dist/commands/diff.js.map +1 -0
- package/packages/cli/dist/commands/init.d.ts +2 -0
- package/packages/cli/dist/commands/init.d.ts.map +1 -0
- package/packages/cli/dist/commands/init.js +54 -0
- package/packages/cli/dist/commands/init.js.map +1 -0
- package/packages/cli/dist/commands/list.d.ts +2 -0
- package/packages/cli/dist/commands/list.d.ts.map +1 -0
- package/packages/cli/dist/commands/list.js +62 -0
- package/packages/cli/dist/commands/list.js.map +1 -0
- package/packages/cli/dist/commands/log.d.ts +4 -0
- package/packages/cli/dist/commands/log.d.ts.map +1 -0
- package/packages/cli/dist/commands/log.js +223 -0
- package/packages/cli/dist/commands/log.js.map +1 -0
- package/packages/cli/dist/commands/pause.d.ts +3 -0
- package/packages/cli/dist/commands/pause.d.ts.map +1 -0
- package/packages/cli/dist/commands/pause.js +49 -0
- package/packages/cli/dist/commands/pause.js.map +1 -0
- package/packages/cli/dist/commands/queue.d.ts +2 -0
- package/packages/cli/dist/commands/queue.d.ts.map +1 -0
- package/packages/cli/dist/commands/queue.js +96 -0
- package/packages/cli/dist/commands/queue.js.map +1 -0
- package/packages/cli/dist/commands/remove.d.ts +2 -0
- package/packages/cli/dist/commands/remove.d.ts.map +1 -0
- package/packages/cli/dist/commands/remove.js +80 -0
- package/packages/cli/dist/commands/remove.js.map +1 -0
- package/packages/cli/dist/commands/reset.d.ts +5 -0
- package/packages/cli/dist/commands/reset.d.ts.map +1 -0
- package/packages/cli/dist/commands/reset.js +90 -0
- package/packages/cli/dist/commands/reset.js.map +1 -0
- package/packages/cli/dist/commands/restart.d.ts +2 -0
- package/packages/cli/dist/commands/restart.d.ts.map +1 -0
- package/packages/cli/dist/commands/restart.js +72 -0
- package/packages/cli/dist/commands/restart.js.map +1 -0
- package/packages/cli/dist/commands/start.d.ts +2 -0
- package/packages/cli/dist/commands/start.d.ts.map +1 -0
- package/packages/cli/dist/commands/start.js +127 -0
- package/packages/cli/dist/commands/start.js.map +1 -0
- package/packages/cli/dist/commands/status.d.ts +2 -0
- package/packages/cli/dist/commands/status.d.ts.map +1 -0
- package/packages/cli/dist/commands/status.js +181 -0
- package/packages/cli/dist/commands/status.js.map +1 -0
- package/packages/cli/dist/commands/stop.d.ts +2 -0
- package/packages/cli/dist/commands/stop.d.ts.map +1 -0
- package/packages/cli/dist/commands/stop.js +64 -0
- package/packages/cli/dist/commands/stop.js.map +1 -0
- package/packages/cli/dist/index.d.ts +2 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +85 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/utils/paths.d.ts +26 -0
- package/packages/cli/dist/utils/paths.d.ts.map +1 -0
- package/packages/cli/dist/utils/paths.js +183 -0
- package/packages/cli/dist/utils/paths.js.map +1 -0
- package/packages/cli/package.json +25 -0
- package/packages/daemon/README.md +83 -0
- package/packages/daemon/dist/ai_test.d.ts +2 -0
- package/packages/daemon/dist/ai_test.d.ts.map +1 -0
- package/packages/daemon/dist/ai_test.js +4 -0
- package/packages/daemon/dist/ai_test.js.map +1 -0
- package/packages/daemon/dist/index.d.ts +2 -0
- package/packages/daemon/dist/index.d.ts.map +1 -0
- package/packages/daemon/dist/index.js +147 -0
- package/packages/daemon/dist/index.js.map +1 -0
- package/packages/daemon/dist/jobs/AIProcessor.d.ts +6 -0
- package/packages/daemon/dist/jobs/AIProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/AIProcessor.js +58 -0
- package/packages/daemon/dist/jobs/AIProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/DocProcessor.d.ts +8 -0
- package/packages/daemon/dist/jobs/DocProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/DocProcessor.js +336 -0
- package/packages/daemon/dist/jobs/DocProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/FileProcessor.d.ts +7 -0
- package/packages/daemon/dist/jobs/FileProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/FileProcessor.js +29 -0
- package/packages/daemon/dist/jobs/FileProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/SystemProcessor.d.ts +13 -0
- package/packages/daemon/dist/jobs/SystemProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/SystemProcessor.js +38 -0
- package/packages/daemon/dist/jobs/SystemProcessor.js.map +1 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.d.ts +21 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.d.ts.map +1 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.js +222 -0
- package/packages/daemon/dist/jobs/UpdateProcessor.js.map +1 -0
- package/packages/daemon/dist/services/AIService.d.ts +90 -0
- package/packages/daemon/dist/services/AIService.d.ts.map +1 -0
- package/packages/daemon/dist/services/AIService.js +451 -0
- package/packages/daemon/dist/services/AIService.js.map +1 -0
- package/packages/daemon/dist/services/ConfigService.d.ts +30 -0
- package/packages/daemon/dist/services/ConfigService.d.ts.map +1 -0
- package/packages/daemon/dist/services/ConfigService.js +69 -0
- package/packages/daemon/dist/services/ConfigService.js.map +1 -0
- package/packages/daemon/dist/services/DatabaseService.d.ts +204 -0
- package/packages/daemon/dist/services/DatabaseService.d.ts.map +1 -0
- package/packages/daemon/dist/services/DatabaseService.js +692 -0
- package/packages/daemon/dist/services/DatabaseService.js.map +1 -0
- package/packages/daemon/dist/services/GitService.d.ts +12 -0
- package/packages/daemon/dist/services/GitService.d.ts.map +1 -0
- package/packages/daemon/dist/services/GitService.js +68 -0
- package/packages/daemon/dist/services/GitService.js.map +1 -0
- package/packages/daemon/dist/services/QueueService.d.ts +16 -0
- package/packages/daemon/dist/services/QueueService.d.ts.map +1 -0
- package/packages/daemon/dist/services/QueueService.js +87 -0
- package/packages/daemon/dist/services/QueueService.js.map +1 -0
- package/packages/daemon/dist/services/TriggerService.d.ts +37 -0
- package/packages/daemon/dist/services/TriggerService.d.ts.map +1 -0
- package/packages/daemon/dist/services/TriggerService.js +150 -0
- package/packages/daemon/dist/services/TriggerService.js.map +1 -0
- package/packages/daemon/dist/services/WatcherService.d.ts +12 -0
- package/packages/daemon/dist/services/WatcherService.d.ts.map +1 -0
- package/packages/daemon/dist/services/WatcherService.js +77 -0
- package/packages/daemon/dist/services/WatcherService.js.map +1 -0
- package/packages/daemon/dist/services/index.d.ts +2 -0
- package/packages/daemon/dist/services/index.d.ts.map +1 -0
- package/packages/daemon/dist/services/index.js +18 -0
- package/packages/daemon/dist/services/index.js.map +1 -0
- package/packages/daemon/dist/test-ignore.js +0 -0
- package/packages/daemon/package.json +28 -0
- package/packages/ui/app/actions.ts +73 -0
- package/packages/ui/app/api/ai-activity/route.ts +14 -0
- package/packages/ui/app/globals.css +98 -0
- package/packages/ui/app/layout.tsx +29 -0
- package/packages/ui/app/page.tsx +109 -0
- package/packages/ui/components/AutoRefresh.tsx +18 -0
- package/packages/ui/components/DocumentationViewer.tsx +276 -0
- package/packages/ui/components/FileList.tsx +69 -0
- package/packages/ui/components/HeaderWithThinking.tsx +102 -0
- package/packages/ui/components/JobQueue.tsx +194 -0
- package/packages/ui/components/JobQueueWrapper.tsx +31 -0
- package/packages/ui/components/MermaidInit.tsx +24 -0
- package/packages/ui/components/ProjectContentArea.tsx +186 -0
- package/packages/ui/components/ProjectList.tsx +136 -0
- package/packages/ui/components/ThinkingDrawer.tsx +377 -0
- package/packages/ui/components/ThinkingPanel.tsx +63 -0
- package/packages/ui/components/TriggerSettings.tsx +185 -0
- package/packages/ui/components/VersionSelector.tsx +132 -0
- package/packages/ui/lib/db.ts +521 -0
- package/packages/ui/next-env.d.ts +5 -0
- package/packages/ui/next.config.js +4 -0
- package/packages/ui/package.json +32 -0
- package/packages/ui/postcss.config.js +6 -0
- package/packages/ui/public/logo.png +0 -0
- package/packages/ui/tailwind.config.ts +32 -0
- package/packages/ui/tsconfig.json +40 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# ai-git-processor
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
An event-driven backend service designed to orchestrate complex workflows involving file systems and Git repositories. This system leverages a robust job queue to handle asynchronous tasks such as file analysis, document parsing, and AI-driven content generation.
|
|
9
|
+
|
|
10
|
+
## 🚀 Tech Stack
|
|
11
|
+
|
|
12
|
+
* **Language:** TypeScript / Node.js
|
|
13
|
+
* **Version Control:** Git Integration
|
|
14
|
+
* **Architecture:** Event-Driven, Job Queue
|
|
15
|
+
* **AI Integration:** LLM-based processing (AI Service)
|
|
16
|
+
|
|
17
|
+
## 📂 Project Structure
|
|
18
|
+
|
|
19
|
+
The project is modularized into specialized services and job processors to ensure separation of concerns and scalability.
|
|
20
|
+
|
|
21
|
+
### Core Services (`src/services/`)
|
|
22
|
+
* **WatcherService**: Monitors file systems or repositories for changes.
|
|
23
|
+
* **TriggerService**: Initiates workflows based on detected events.
|
|
24
|
+
* **QueueService**: Manages the asynchronous job queue.
|
|
25
|
+
* **GitService**: Handles Git operations (clone, pull, commit).
|
|
26
|
+
* **AIService**: Interface for Large Language Model (LLM) interactions.
|
|
27
|
+
* **DatabaseService**: Persists application state and results.
|
|
28
|
+
* **ConfigService**: Manages environment configuration and settings.
|
|
29
|
+
|
|
30
|
+
### Job Processors (`src/jobs/`)
|
|
31
|
+
* **FileProcessor**: Handles general file manipulation and analysis.
|
|
32
|
+
* **DocProcessor**: Specialized parsing for documentation files.
|
|
33
|
+
* **AIProcessor**: Executes AI-driven tasks on content.
|
|
34
|
+
* **SystemProcessor**: Handles system-level maintenance tasks.
|
|
35
|
+
|
|
36
|
+
## 🛠 Getting Started
|
|
37
|
+
|
|
38
|
+
### Prerequisites
|
|
39
|
+
* Node.js (v18+ recommended)
|
|
40
|
+
* npm or yarn
|
|
41
|
+
|
|
42
|
+
### Installation
|
|
43
|
+
|
|
44
|
+
1. Clone the repository:
|
|
45
|
+
```bash
|
|
46
|
+
git clone https://github.com/yourusername/ai-git-processor.git
|
|
47
|
+
cd ai-git-processor
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
2. Install dependencies:
|
|
51
|
+
```bash
|
|
52
|
+
npm install
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
3. Configure environment variables:
|
|
56
|
+
* Create a `.env` file based on your configuration requirements (API keys for AI services, database credentials, etc.).
|
|
57
|
+
|
|
58
|
+
### Running the Application
|
|
59
|
+
|
|
60
|
+
**Development Mode:**
|
|
61
|
+
```bash
|
|
62
|
+
npm run dev
|
|
63
|
+
# or usually
|
|
64
|
+
ts-node src/index.ts
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Build & Run:**
|
|
68
|
+
```bash
|
|
69
|
+
npm run build
|
|
70
|
+
npm start
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Testing
|
|
74
|
+
|
|
75
|
+
You can run specific test scripts included in the root directory:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Test AI Key configuration
|
|
79
|
+
ts-node test_ai_key.ts
|
|
80
|
+
|
|
81
|
+
# Test Job Queue functionality
|
|
82
|
+
node check-plainjob.js
|
|
83
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai_test.d.ts","sourceRoot":"","sources":["../src/ai_test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai_test.js","sourceRoot":"","sources":["../src/ai_test.ts"],"names":[],"mappings":";;AAAA,eAAe"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
7
|
+
dotenv_1.default.config();
|
|
8
|
+
const WatcherService_1 = require("./services/WatcherService");
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const DatabaseService_1 = require("./services/DatabaseService");
|
|
12
|
+
const GitService_1 = require("./services/GitService");
|
|
13
|
+
const QueueService_1 = require("./services/QueueService");
|
|
14
|
+
const FileProcessor_1 = require("./jobs/FileProcessor");
|
|
15
|
+
const SystemProcessor_1 = require("./jobs/SystemProcessor");
|
|
16
|
+
const AIProcessor_1 = require("./jobs/AIProcessor");
|
|
17
|
+
const DocProcessor_1 = require("./jobs/DocProcessor");
|
|
18
|
+
const UpdateProcessor_1 = require("./jobs/UpdateProcessor");
|
|
19
|
+
const AIService_1 = require("./services/AIService");
|
|
20
|
+
const ConfigService_1 = require("./services/ConfigService");
|
|
21
|
+
const TriggerService_1 = require("./services/TriggerService");
|
|
22
|
+
console.log('🦁 Chronicle Daemon Starting...');
|
|
23
|
+
async function main() {
|
|
24
|
+
const apiKey = loadGeminiApiKey();
|
|
25
|
+
if (!apiKey) {
|
|
26
|
+
console.error('❌ Gemini API key not found.');
|
|
27
|
+
console.error(` Add your key to: ${path_1.default.join(process.cwd(), '.chronicle', '.gemini-key')}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const watcher = new WatcherService_1.WatcherService(process.cwd());
|
|
31
|
+
const db = new DatabaseService_1.DatabaseService();
|
|
32
|
+
// Use CWD for git service default, feature per-project git service pending
|
|
33
|
+
const git = new GitService_1.GitService(process.cwd());
|
|
34
|
+
const queue = new QueueService_1.QueueService(db);
|
|
35
|
+
const configService = new ConfigService_1.ConfigService();
|
|
36
|
+
const triggerService = new TriggerService_1.TriggerService(queue);
|
|
37
|
+
const ai = new AIService_1.AIService(apiKey);
|
|
38
|
+
// Register Jobs
|
|
39
|
+
queue.register('file:change', (0, FileProcessor_1.createFileProcessor)(git, db));
|
|
40
|
+
queue.register('ai:embed', (0, AIProcessor_1.createAIProcessor)(db, ai));
|
|
41
|
+
queue.register('doc:initialize', (0, DocProcessor_1.createDocProcessor)(db, ai, configService, git));
|
|
42
|
+
queue.register('doc:update', (0, UpdateProcessor_1.createUpdateProcessor)(db, ai, configService, git));
|
|
43
|
+
console.log('🧠 AI Service registered');
|
|
44
|
+
// Register System Jobs
|
|
45
|
+
const systemProcessor = (0, SystemProcessor_1.createSystemProcessor)(db, watcher, configService, queue, triggerService);
|
|
46
|
+
queue.register('system:project_add', systemProcessor);
|
|
47
|
+
queue.register('system:project_remove', systemProcessor);
|
|
48
|
+
// Wire Watcher -> Queue (for file indexing)
|
|
49
|
+
watcher.on('file:change', (filePath) => {
|
|
50
|
+
const projects = db.getProjects();
|
|
51
|
+
for (const project of projects) {
|
|
52
|
+
if (filePath.startsWith(project.path)) {
|
|
53
|
+
if (project.is_paused)
|
|
54
|
+
return;
|
|
55
|
+
queue.add('file:change', { filePath, event: 'change' });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// If not matched to any project, ignore? Or index anyway?
|
|
60
|
+
// Current logic might have indexed everything. Let's strictly index only monitored projects.
|
|
61
|
+
});
|
|
62
|
+
watcher.on('file:add', (filePath) => {
|
|
63
|
+
const projects = db.getProjects();
|
|
64
|
+
for (const project of projects) {
|
|
65
|
+
if (filePath.startsWith(project.path)) {
|
|
66
|
+
if (project.is_paused)
|
|
67
|
+
return;
|
|
68
|
+
queue.add('file:change', { filePath, event: 'add' });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Wire Watcher -> TriggerService (for doc regeneration)
|
|
74
|
+
watcher.on('file:change', (filePath) => {
|
|
75
|
+
// Determine which project this file belongs to
|
|
76
|
+
const projects = db.getProjects();
|
|
77
|
+
for (const project of projects) {
|
|
78
|
+
if (filePath.startsWith(project.path)) {
|
|
79
|
+
if (project.is_paused) {
|
|
80
|
+
// console.log(`⏸️ Project paused, ignoring change: ${filePath}`);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
triggerService.onFileChange(project.path, filePath);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
watcher.on('file:add', (filePath) => {
|
|
89
|
+
const projects = db.getProjects();
|
|
90
|
+
for (const project of projects) {
|
|
91
|
+
if (filePath.startsWith(project.path)) {
|
|
92
|
+
if (project.is_paused) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
triggerService.onFileChange(project.path, filePath);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
console.log('✅ Daemon Initialized');
|
|
101
|
+
// Load projects from DB
|
|
102
|
+
const projects = db.getProjects();
|
|
103
|
+
if (projects.length > 0) {
|
|
104
|
+
const projectPaths = projects.map(p => p.path);
|
|
105
|
+
// Load config for each project and register with TriggerService
|
|
106
|
+
for (const project of projects) {
|
|
107
|
+
const config = configService.loadConfig(project.path);
|
|
108
|
+
triggerService.registerProject(project.path, config);
|
|
109
|
+
}
|
|
110
|
+
// Use first project's config for watcher ignore patterns (or aggregate)
|
|
111
|
+
const rootConfig = configService.loadConfig(process.cwd());
|
|
112
|
+
await watcher.start(projectPaths, rootConfig.ignore);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log('⚠️ No projects monitored. Add one with "chronicle add"');
|
|
116
|
+
await watcher.start([]); // Start watcher but with no paths
|
|
117
|
+
}
|
|
118
|
+
// Keep process alive and handle shutdown
|
|
119
|
+
const shutdown = async () => {
|
|
120
|
+
console.log('Stopping daemon...');
|
|
121
|
+
queue.stop();
|
|
122
|
+
triggerService.stop();
|
|
123
|
+
await watcher.stop();
|
|
124
|
+
process.exit(0);
|
|
125
|
+
};
|
|
126
|
+
process.on('SIGINT', shutdown);
|
|
127
|
+
process.on('SIGTERM', shutdown);
|
|
128
|
+
// Keep process alive
|
|
129
|
+
setInterval(() => {
|
|
130
|
+
// Heartbeat
|
|
131
|
+
}, 1000 * 60);
|
|
132
|
+
}
|
|
133
|
+
main().catch(console.error);
|
|
134
|
+
function loadGeminiApiKey() {
|
|
135
|
+
const keyFromEnv = (process.env.GOOGLE_API_KEY || '').trim();
|
|
136
|
+
if (keyFromEnv)
|
|
137
|
+
return keyFromEnv;
|
|
138
|
+
const keyFilePath = path_1.default.join(process.cwd(), '.chronicle', '.gemini-key');
|
|
139
|
+
if (!fs_1.default.existsSync(keyFilePath))
|
|
140
|
+
return '';
|
|
141
|
+
const lines = fs_1.default.readFileSync(keyFilePath, 'utf-8')
|
|
142
|
+
.split(/\r?\n/)
|
|
143
|
+
.map(line => line.trim())
|
|
144
|
+
.filter(line => line.length > 0 && !line.startsWith('#'));
|
|
145
|
+
return lines[0] || '';
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DatabaseService } from '../services/DatabaseService';
|
|
2
|
+
import { AIService } from '../services/AIService';
|
|
3
|
+
export declare const createAIProcessor: (db: DatabaseService, ai: AIService) => (data: {
|
|
4
|
+
filePath: string;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=AIProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIProcessor.d.ts","sourceRoot":"","sources":["../../src/jobs/AIProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,eAAO,MAAM,iBAAiB,GAAI,IAAI,eAAe,EAAE,IAAI,SAAS,MAClD,MAAM;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,kBAwD3C,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createAIProcessor = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const createAIProcessor = (db, ai) => {
|
|
10
|
+
return async (data) => {
|
|
11
|
+
const { filePath } = data;
|
|
12
|
+
// 1. Read file content
|
|
13
|
+
const absolutePath = path_1.default.resolve(process.cwd(), filePath);
|
|
14
|
+
if (!fs_1.default.existsSync(absolutePath)) {
|
|
15
|
+
console.warn(`⚠️ File not found for embedding: ${filePath}`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const content = fs_1.default.readFileSync(absolutePath, 'utf-8');
|
|
19
|
+
if (!content.trim())
|
|
20
|
+
return;
|
|
21
|
+
console.log(`🧠 Generating embedding for: ${filePath} (${content.length} bytes)`);
|
|
22
|
+
try {
|
|
23
|
+
// 2. Generate Embedding
|
|
24
|
+
// TODO: Chunk large files. For now, we truncate to first ~8000 tokens (Gemini limit is huge but let's be safe)
|
|
25
|
+
// Ideally we split by functions or paragraphs.
|
|
26
|
+
const vector = await ai.generateEmbedding(content.slice(0, 30000));
|
|
27
|
+
// 3. Store in Vector DB
|
|
28
|
+
// First get the file_id
|
|
29
|
+
let fileRecord = db.getFile(filePath);
|
|
30
|
+
if (!fileRecord) {
|
|
31
|
+
// Should exist if FileProcessor ran, but just in case
|
|
32
|
+
db.upsertFile(filePath, '', Date.now());
|
|
33
|
+
fileRecord = db.getFile(filePath);
|
|
34
|
+
}
|
|
35
|
+
const fileId = fileRecord?.id;
|
|
36
|
+
if (fileId) {
|
|
37
|
+
// Delete old embeddings for this file
|
|
38
|
+
db.raw().exec(`DELETE FROM embeddings WHERE file_id = ${fileId}`);
|
|
39
|
+
// Insert new embedding
|
|
40
|
+
// vec0 expects a float array. better-sqlite3 handles arrays automatically for some extensions,
|
|
41
|
+
// but sqlite-vec usually needs a specific serialization or parameter binding.
|
|
42
|
+
// Use a Float32Array for the embedding
|
|
43
|
+
const floatArray = new Float32Array(vector);
|
|
44
|
+
const stmt = db.raw().prepare('INSERT INTO embeddings(file_id, chunk_index, embedding) VALUES (?, ?, ?)');
|
|
45
|
+
// sqlite-vec requires strict integer types for metadata columns, JS numbers are passed as doubles/floats by default.
|
|
46
|
+
// Using BigInt enforces integer binding in better-sqlite3.
|
|
47
|
+
stmt.run(BigInt(fileId), BigInt(0), floatArray);
|
|
48
|
+
console.log(`✅ Embedding stored for: ${filePath}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error(`❌ AI Processing failed for ${filePath}:`, error);
|
|
53
|
+
// Don't throw, just log. We don't want to retry infinitely if it's a model error.
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
exports.createAIProcessor = createAIProcessor;
|
|
58
|
+
//# sourceMappingURL=AIProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIProcessor.js","sourceRoot":"","sources":["../../src/jobs/AIProcessor.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAIjB,MAAM,iBAAiB,GAAG,CAAC,EAAmB,EAAE,EAAa,EAAE,EAAE;IACpE,OAAO,KAAK,EAAE,IAA0B,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAE1B,uBAAuB;QACvB,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC7D,OAAO;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO;QAE5B,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,KAAK,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;QAElF,IAAI,CAAC;YACD,wBAAwB;YACxB,+GAA+G;YAC/G,+CAA+C;YAC/C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAEnE,wBAAwB;YACxB,wBAAwB;YACxB,IAAI,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAQ,CAAC;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,sDAAsD;gBACtD,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxC,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAQ,CAAC;YAC7C,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,EAAE,EAAE,CAAC;YAE9B,IAAI,MAAM,EAAE,CAAC;gBACT,sCAAsC;gBACtC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC;gBAElE,uBAAuB;gBACvB,gGAAgG;gBAChG,8EAA8E;gBAE9E,uCAAuC;gBACvC,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;gBAE5C,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;gBAC1G,qHAAqH;gBACrH,2DAA2D;gBAC3D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAEhD,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACvD,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAChE,kFAAkF;QACtF,CAAC;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAzDW,QAAA,iBAAiB,qBAyD5B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DatabaseService } from '../services/DatabaseService';
|
|
2
|
+
import { AIService } from '../services/AIService';
|
|
3
|
+
import { ConfigService } from '../services/ConfigService';
|
|
4
|
+
import { GitService } from '../services/GitService';
|
|
5
|
+
export declare const createDocProcessor: (db: DatabaseService, ai: AIService, configService: ConfigService, git: GitService) => (data: {
|
|
6
|
+
projectPath: string;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
//# sourceMappingURL=DocProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocProcessor.d.ts","sourceRoot":"","sources":["../../src/jobs/DocProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUpD,eAAO,MAAM,kBAAkB,GAAI,IAAI,eAAe,EAAE,IAAI,SAAS,EAAE,eAAe,aAAa,EAAE,KAAK,UAAU,MAClG,MAAM;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,kBAoW9C,CAAC"}
|