@djibrilm/lazy-review 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/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +17 -0
- package/dist/bin.js.map +1 -0
- package/dist/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/client/assets/index-4oL_AGyI.css +1 -0
- package/dist/client/assets/index-CJtKCyBg.js +848 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/favicon.svg +1 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +17 -0
- package/dist/client/resources/images/logo.png +0 -0
- package/dist/client/resources/images/openai.png +0 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/dev.d.ts +2 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.js +10 -0
- package/dist/dev.js.map +1 -0
- package/dist/modules/ai-agent/agent-context-manager.d.ts +57 -0
- package/dist/modules/ai-agent/agent-context-manager.d.ts.map +1 -0
- package/dist/modules/ai-agent/agent-context-manager.js +159 -0
- package/dist/modules/ai-agent/agent-context-manager.js.map +1 -0
- package/dist/modules/ai-agent/ai-agent.module.d.ts +17 -0
- package/dist/modules/ai-agent/ai-agent.module.d.ts.map +1 -0
- package/dist/modules/ai-agent/ai-agent.module.js +24 -0
- package/dist/modules/ai-agent/ai-agent.module.js.map +1 -0
- package/dist/modules/ai-agent/ai-agent.utils.d.ts +10 -0
- package/dist/modules/ai-agent/ai-agent.utils.d.ts.map +1 -0
- package/dist/modules/ai-agent/ai-agent.utils.js +389 -0
- package/dist/modules/ai-agent/ai-agent.utils.js.map +1 -0
- package/dist/modules/ai-agent/base.agent.d.ts +26 -0
- package/dist/modules/ai-agent/base.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/base.agent.js +101 -0
- package/dist/modules/ai-agent/base.agent.js.map +1 -0
- package/dist/modules/ai-agent/chat.agent.d.ts +35 -0
- package/dist/modules/ai-agent/chat.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/chat.agent.js +590 -0
- package/dist/modules/ai-agent/chat.agent.js.map +1 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.d.ts +13 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.js +506 -0
- package/dist/modules/ai-agent/code-base-indexer.agent.js.map +1 -0
- package/dist/modules/ai-agent/codebase-scanner.d.ts +37 -0
- package/dist/modules/ai-agent/codebase-scanner.d.ts.map +1 -0
- package/dist/modules/ai-agent/codebase-scanner.js +260 -0
- package/dist/modules/ai-agent/codebase-scanner.js.map +1 -0
- package/dist/modules/ai-agent/model-loader.d.ts +7 -0
- package/dist/modules/ai-agent/model-loader.d.ts.map +1 -0
- package/dist/modules/ai-agent/model-loader.js +129 -0
- package/dist/modules/ai-agent/model-loader.js.map +1 -0
- package/dist/modules/ai-agent/orientation-loader.d.ts +2 -0
- package/dist/modules/ai-agent/orientation-loader.d.ts.map +1 -0
- package/dist/modules/ai-agent/orientation-loader.js +70 -0
- package/dist/modules/ai-agent/orientation-loader.js.map +1 -0
- package/dist/modules/ai-agent/pr-review-session.manager.d.ts +36 -0
- package/dist/modules/ai-agent/pr-review-session.manager.d.ts.map +1 -0
- package/dist/modules/ai-agent/pr-review-session.manager.js +106 -0
- package/dist/modules/ai-agent/pr-review-session.manager.js.map +1 -0
- package/dist/modules/ai-agent/pr-review.agent.d.ts +22 -0
- package/dist/modules/ai-agent/pr-review.agent.d.ts.map +1 -0
- package/dist/modules/ai-agent/pr-review.agent.js +269 -0
- package/dist/modules/ai-agent/pr-review.agent.js.map +1 -0
- package/dist/modules/ai-agent/research-loop.d.ts +3 -0
- package/dist/modules/ai-agent/research-loop.d.ts.map +1 -0
- package/dist/modules/ai-agent/research-loop.js +691 -0
- package/dist/modules/ai-agent/research-loop.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts +36 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.js +178 -0
- package/dist/modules/ai-agent/review-pipeline/agent-loop.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts +8 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.js +93 -0
- package/dist/modules/ai-agent/review-pipeline/change-analyzer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts +47 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.js +91 -0
- package/dist/modules/ai-agent/review-pipeline/finding-ranker.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts +29 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.js +130 -0
- package/dist/modules/ai-agent/review-pipeline/finding-verifier.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts +21 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.js +247 -0
- package/dist/modules/ai-agent/review-pipeline/repository-explorer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts +22 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.js +102 -0
- package/dist/modules/ai-agent/review-pipeline/review-controller.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts +4 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.js +52 -0
- package/dist/modules/ai-agent/review-pipeline/review-writer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts +25 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.js +159 -0
- package/dist/modules/ai-agent/review-pipeline/secret-scanner.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts +9 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js +114 -0
- package/dist/modules/ai-agent/review-pipeline/specialist-reviewer.js.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/types.d.ts +53 -0
- package/dist/modules/ai-agent/review-pipeline/types.d.ts.map +1 -0
- package/dist/modules/ai-agent/review-pipeline/types.js +45 -0
- package/dist/modules/ai-agent/review-pipeline/types.js.map +1 -0
- package/dist/modules/ai-agent/tool-executor.d.ts +37 -0
- package/dist/modules/ai-agent/tool-executor.d.ts.map +1 -0
- package/dist/modules/ai-agent/tool-executor.js +199 -0
- package/dist/modules/ai-agent/tool-executor.js.map +1 -0
- package/dist/modules/ai-agent/tool-types.d.ts +72 -0
- package/dist/modules/ai-agent/tool-types.d.ts.map +1 -0
- package/dist/modules/ai-agent/tool-types.js +2 -0
- package/dist/modules/ai-agent/tool-types.js.map +1 -0
- package/dist/modules/ai-agent/tools/fs-tools.d.ts +54 -0
- package/dist/modules/ai-agent/tools/fs-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/fs-tools.js +237 -0
- package/dist/modules/ai-agent/tools/fs-tools.js.map +1 -0
- package/dist/modules/ai-agent/tools/git-tools.d.ts +322 -0
- package/dist/modules/ai-agent/tools/git-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/git-tools.js +557 -0
- package/dist/modules/ai-agent/tools/git-tools.js.map +1 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts +15 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.d.ts.map +1 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.js +232 -0
- package/dist/modules/ai-agent/tools/pr-chat-tools.js.map +1 -0
- package/dist/modules/database/database.module.d.ts +10 -0
- package/dist/modules/database/database.module.d.ts.map +1 -0
- package/dist/modules/database/database.module.js +36 -0
- package/dist/modules/database/database.module.js.map +1 -0
- package/dist/modules/database/vector-database.service.d.ts +27 -0
- package/dist/modules/database/vector-database.service.d.ts.map +1 -0
- package/dist/modules/database/vector-database.service.js +170 -0
- package/dist/modules/database/vector-database.service.js.map +1 -0
- package/dist/modules/github/github.module.d.ts +964 -0
- package/dist/modules/github/github.module.d.ts.map +1 -0
- package/dist/modules/github/github.module.js +316 -0
- package/dist/modules/github/github.module.js.map +1 -0
- package/dist/modules/main.module.d.ts +20 -0
- package/dist/modules/main.module.d.ts.map +1 -0
- package/dist/modules/main.module.js +59 -0
- package/dist/modules/main.module.js.map +1 -0
- package/dist/modules/qvac/qvac.module.d.ts +28 -0
- package/dist/modules/qvac/qvac.module.d.ts.map +1 -0
- package/dist/modules/qvac/qvac.module.js +146 -0
- package/dist/modules/qvac/qvac.module.js.map +1 -0
- package/dist/modules/server/dtos/create-project.dto.d.ts +9 -0
- package/dist/modules/server/dtos/create-project.dto.d.ts.map +1 -0
- package/dist/modules/server/dtos/create-project.dto.js +2 -0
- package/dist/modules/server/dtos/create-project.dto.js.map +1 -0
- package/dist/modules/server/entities/agent-task.entity.d.ts +16 -0
- package/dist/modules/server/entities/agent-task.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/agent-task.entity.js +72 -0
- package/dist/modules/server/entities/agent-task.entity.js.map +1 -0
- package/dist/modules/server/entities/ai-provider.entity.d.ts +11 -0
- package/dist/modules/server/entities/ai-provider.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/ai-provider.entity.js +47 -0
- package/dist/modules/server/entities/ai-provider.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts +10 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.js +42 -0
- package/dist/modules/server/entities/deployment-plan-approval.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts +10 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.js +42 -0
- package/dist/modules/server/entities/deployment-plan-artifact.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts +9 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.js +37 -0
- package/dist/modules/server/entities/deployment-plan-feedback.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts +11 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.js +47 -0
- package/dist/modules/server/entities/deployment-plan-revision.entity.js.map +1 -0
- package/dist/modules/server/entities/deployment-plan.entity.d.ts +13 -0
- package/dist/modules/server/entities/deployment-plan.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/deployment-plan.entity.js +58 -0
- package/dist/modules/server/entities/deployment-plan.entity.js.map +1 -0
- package/dist/modules/server/entities/project.entity.d.ts +26 -0
- package/dist/modules/server/entities/project.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/project.entity.js +122 -0
- package/dist/modules/server/entities/project.entity.js.map +1 -0
- package/dist/modules/server/entities/settings.entity.d.ts +12 -0
- package/dist/modules/server/entities/settings.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/settings.entity.js +62 -0
- package/dist/modules/server/entities/settings.entity.js.map +1 -0
- package/dist/modules/server/entities/terminal-log.entity.d.ts +10 -0
- package/dist/modules/server/entities/terminal-log.entity.d.ts.map +1 -0
- package/dist/modules/server/entities/terminal-log.entity.js +42 -0
- package/dist/modules/server/entities/terminal-log.entity.js.map +1 -0
- package/dist/modules/server/middleware/auth.middleware.d.ts +8 -0
- package/dist/modules/server/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/modules/server/middleware/auth.middleware.js +26 -0
- package/dist/modules/server/middleware/auth.middleware.js.map +1 -0
- package/dist/modules/server/routes/auth.routes.d.ts +13 -0
- package/dist/modules/server/routes/auth.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/auth.routes.js +59 -0
- package/dist/modules/server/routes/auth.routes.js.map +1 -0
- package/dist/modules/server/routes/github.routes.d.ts +14 -0
- package/dist/modules/server/routes/github.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/github.routes.js +124 -0
- package/dist/modules/server/routes/github.routes.js.map +1 -0
- package/dist/modules/server/routes/project.routes.d.ts +11 -0
- package/dist/modules/server/routes/project.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/project.routes.js +78 -0
- package/dist/modules/server/routes/project.routes.js.map +1 -0
- package/dist/modules/server/routes/qvac.routes.d.ts +11 -0
- package/dist/modules/server/routes/qvac.routes.d.ts.map +1 -0
- package/dist/modules/server/routes/qvac.routes.js +24 -0
- package/dist/modules/server/routes/qvac.routes.js.map +1 -0
- package/dist/modules/server/routes/routes.d.ts +20 -0
- package/dist/modules/server/routes/routes.d.ts.map +1 -0
- package/dist/modules/server/routes/routes.js +35 -0
- package/dist/modules/server/routes/routes.js.map +1 -0
- package/dist/modules/server/routes/settings.controller.d.ts +14 -0
- package/dist/modules/server/routes/settings.controller.d.ts.map +1 -0
- package/dist/modules/server/routes/settings.controller.js +65 -0
- package/dist/modules/server/routes/settings.controller.js.map +1 -0
- package/dist/modules/server/server.module.d.ts +19 -0
- package/dist/modules/server/server.module.d.ts.map +1 -0
- package/dist/modules/server/server.module.js +63 -0
- package/dist/modules/server/server.module.js.map +1 -0
- package/dist/modules/server/services/auth.services.d.ts +19 -0
- package/dist/modules/server/services/auth.services.d.ts.map +1 -0
- package/dist/modules/server/services/auth.services.js +87 -0
- package/dist/modules/server/services/auth.services.js.map +1 -0
- package/dist/modules/server/services/deployment-plan.services.d.ts +6 -0
- package/dist/modules/server/services/deployment-plan.services.d.ts.map +1 -0
- package/dist/modules/server/services/deployment-plan.services.js +8 -0
- package/dist/modules/server/services/deployment-plan.services.js.map +1 -0
- package/dist/modules/server/services/github.services.d.ts +939 -0
- package/dist/modules/server/services/github.services.d.ts.map +1 -0
- package/dist/modules/server/services/github.services.js +46 -0
- package/dist/modules/server/services/github.services.js.map +1 -0
- package/dist/modules/server/services/project.services.d.ts +41 -0
- package/dist/modules/server/services/project.services.d.ts.map +1 -0
- package/dist/modules/server/services/project.services.js +360 -0
- package/dist/modules/server/services/project.services.js.map +1 -0
- package/dist/modules/server/services/qvac.services.d.ts +10 -0
- package/dist/modules/server/services/qvac.services.d.ts.map +1 -0
- package/dist/modules/server/services/qvac.services.js +58 -0
- package/dist/modules/server/services/qvac.services.js.map +1 -0
- package/dist/modules/server/services/settings.service.d.ts +60 -0
- package/dist/modules/server/services/settings.service.d.ts.map +1 -0
- package/dist/modules/server/services/settings.service.js +125 -0
- package/dist/modules/server/services/settings.service.js.map +1 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts +14 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.d.ts.map +1 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js +2 -0
- package/dist/modules/socket-gateway/interfaces/project-creation-log.interface.js.map +1 -0
- package/dist/modules/socket-gateway/socket-gateway.module.d.ts +28 -0
- package/dist/modules/socket-gateway/socket-gateway.module.d.ts.map +1 -0
- package/dist/modules/socket-gateway/socket-gateway.module.js +92 -0
- package/dist/modules/socket-gateway/socket-gateway.module.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import ProjectEntity from '../server/entities/project.entity.js';
|
|
2
|
+
import { cancel as qvacCancel, embed } from '@qvac/sdk';
|
|
3
|
+
import { LLM_MODEL_ID, EMBEDDING_MODEL_ID } from '../../constants.js';
|
|
4
|
+
import { executeGitPull } from './tools/git-tools.js';
|
|
5
|
+
import { preLoadOrientationFiles } from './orientation-loader.js';
|
|
6
|
+
import { loadAIModels, currentDeviceConfig } from './model-loader.js';
|
|
7
|
+
import { runResearchAgentLoop } from './research-loop.js';
|
|
8
|
+
import { scanCodebase } from './codebase-scanner.js';
|
|
9
|
+
import { chunkText, createProjectManifestSummary, purgeQvacKvCache } from './ai-agent.utils.js';
|
|
10
|
+
/**
|
|
11
|
+
* GTE-Large has a 512-token embedding context window (`bert.context_length`
|
|
12
|
+
* in its GGUF metadata). The QVAC embed runtime hard-errors whenever an input
|
|
13
|
+
* tokenizes to more tokens than the model's effective context size.
|
|
14
|
+
*
|
|
15
|
+
* We bound embedding text by characters as a first, cheap approximation, but
|
|
16
|
+
* character counts do NOT guarantee token counts: ~1200 characters of dense
|
|
17
|
+
* code/JSON/minified content can tokenize to 565+ tokens, which is exactly
|
|
18
|
+
* why we previously saw:
|
|
19
|
+
*
|
|
20
|
+
* tokenizeInput: context overflow: number of tokens in prompt 0 (565)
|
|
21
|
+
* exceeds effective context size (512)
|
|
22
|
+
*
|
|
23
|
+
* `runEmbed` therefore additionally retries with a shrinking input whenever
|
|
24
|
+
* the QVAC runtime reports a context overflow, guaranteeing safe tokenization
|
|
25
|
+
* without shipping a local Gemma/GTE tokenizer just for indexing.
|
|
26
|
+
*/
|
|
27
|
+
const MAX_EMBED_INPUT_CHARS = 1000;
|
|
28
|
+
const CONTEXT_OVERFLOW_RE = /context\s?overflow|tokenizeInput|effective context size/i;
|
|
29
|
+
class IndexingCancelledError extends Error {
|
|
30
|
+
constructor() {
|
|
31
|
+
super('Indexing was cancelled by the user.');
|
|
32
|
+
this.name = 'IndexingCancelledError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function getEmbeddingVector(response) {
|
|
36
|
+
const value = response?.embedding;
|
|
37
|
+
if (!value) {
|
|
38
|
+
throw new Error('Embedding model returned no embedding.');
|
|
39
|
+
}
|
|
40
|
+
return (Array.isArray(value[0]) ? value[0] : value);
|
|
41
|
+
}
|
|
42
|
+
export class CodeBaseIndexerAgent {
|
|
43
|
+
mainModule;
|
|
44
|
+
/**
|
|
45
|
+
* Active indexing jobs keyed by project id.
|
|
46
|
+
*/
|
|
47
|
+
indexingControllers = new Map();
|
|
48
|
+
constructor(mainModule) {
|
|
49
|
+
this.mainModule = mainModule;
|
|
50
|
+
}
|
|
51
|
+
cancelIndexing(projectId) {
|
|
52
|
+
const controller = this.indexingControllers.get(projectId);
|
|
53
|
+
if (!controller) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
controller.abort();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
async analyzeAndIndexProject(projectId) {
|
|
60
|
+
if (this.indexingControllers.has(projectId)) {
|
|
61
|
+
throw new Error('Project is already being indexed.');
|
|
62
|
+
}
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
const { signal } = controller;
|
|
65
|
+
this.indexingControllers.set(projectId, controller);
|
|
66
|
+
const activeRequestIds = new Set();
|
|
67
|
+
signal.addEventListener('abort', () => {
|
|
68
|
+
for (const requestId of activeRequestIds) {
|
|
69
|
+
qvacCancel({
|
|
70
|
+
requestId,
|
|
71
|
+
}).catch(() => { });
|
|
72
|
+
}
|
|
73
|
+
activeRequestIds.clear();
|
|
74
|
+
}, {
|
|
75
|
+
once: true,
|
|
76
|
+
});
|
|
77
|
+
const checkCancelled = () => {
|
|
78
|
+
if (signal.aborted) {
|
|
79
|
+
throw new IndexingCancelledError();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const awaitCompletion = async (run, timeoutMs = 3_600_000) => {
|
|
83
|
+
activeRequestIds.add(run.requestId);
|
|
84
|
+
console.log(`[LLM] Executing completion call on device: ${currentDeviceConfig || 'unknown'}`);
|
|
85
|
+
let timeoutHandle;
|
|
86
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
87
|
+
timeoutHandle = setTimeout(() => {
|
|
88
|
+
reject(new Error(`LLM step timed out after ${timeoutMs / 1000}s`));
|
|
89
|
+
}, timeoutMs);
|
|
90
|
+
});
|
|
91
|
+
if (run.events) {
|
|
92
|
+
void (async () => {
|
|
93
|
+
try {
|
|
94
|
+
for await (const chunk of run.events) {
|
|
95
|
+
const text = chunk.text || chunk.content || chunk.delta?.content || '';
|
|
96
|
+
if (text) {
|
|
97
|
+
process.stdout.write(text);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
console.log();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Streaming output is informational.
|
|
104
|
+
// Cancellation/failure is handled by run.final.
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
return await Promise.race([run.final, timeoutPromise]);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
if (error?.name === 'InferenceCancelledError' || error?.code === 52419) {
|
|
113
|
+
throw new IndexingCancelledError();
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
if (timeoutHandle) {
|
|
119
|
+
clearTimeout(timeoutHandle);
|
|
120
|
+
}
|
|
121
|
+
activeRequestIds.delete(run.requestId);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const progress = (message) => {
|
|
125
|
+
this.mainModule.socket?.emitIndexingProgress({
|
|
126
|
+
projectId,
|
|
127
|
+
status: 'running',
|
|
128
|
+
message,
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
try {
|
|
132
|
+
const indexingStartTime = Date.now();
|
|
133
|
+
// Emit an initial progress event immediately so the frontend
|
|
134
|
+
// knows indexing has started even before models are loaded.
|
|
135
|
+
progress('Starting indexing...');
|
|
136
|
+
const project = await this.initializeProject(projectId);
|
|
137
|
+
const absoluteRoot = project.repository_path;
|
|
138
|
+
progress('Preparing repository...');
|
|
139
|
+
const [models] = await Promise.all([
|
|
140
|
+
loadAIModels(this.mainModule, activeRequestIds),
|
|
141
|
+
executeGitPull(absoluteRoot, progress),
|
|
142
|
+
]);
|
|
143
|
+
checkCancelled();
|
|
144
|
+
const llmModelId = models.llmModelId;
|
|
145
|
+
const embeddingModelId = models.embeddingModelId;
|
|
146
|
+
/**
|
|
147
|
+
* Do not promote this version to the ProjectEntity until
|
|
148
|
+
* indexing has completed successfully.
|
|
149
|
+
*/
|
|
150
|
+
const indexingVersion = (project.indexing_version || 0) + 1;
|
|
151
|
+
// ─────────────────────────────────────────
|
|
152
|
+
// EMBEDDING
|
|
153
|
+
// ─────────────────────────────────────────
|
|
154
|
+
/**
|
|
155
|
+
* The QVAC GGMLBert embedding runtime currently accepts one
|
|
156
|
+
* inference job at a time.
|
|
157
|
+
*
|
|
158
|
+
* Keeping one explicit queue here guarantees that callers cannot
|
|
159
|
+
* accidentally overlap embed() requests.
|
|
160
|
+
*/
|
|
161
|
+
let embeddingQueue = Promise.resolve();
|
|
162
|
+
const runEmbed = (text) => {
|
|
163
|
+
const task = embeddingQueue.then(async () => {
|
|
164
|
+
checkCancelled();
|
|
165
|
+
let attempt = text;
|
|
166
|
+
for (let attemptIndex = 0;; attemptIndex++) {
|
|
167
|
+
try {
|
|
168
|
+
const response = await embed({
|
|
169
|
+
modelId: embeddingModelId,
|
|
170
|
+
text: attempt,
|
|
171
|
+
});
|
|
172
|
+
checkCancelled();
|
|
173
|
+
return getEmbeddingVector(response);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
const message = String(error?.message || error || '');
|
|
177
|
+
const isContextOverflow = CONTEXT_OVERFLOW_RE.test(message);
|
|
178
|
+
if (!isContextOverflow || attemptIndex >= 5) {
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
const shrunkLength = Math.max(64, Math.floor(attempt.length * 0.6));
|
|
182
|
+
if (shrunkLength >= attempt.length) {
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
console.warn(`[Embedding] GTE context overflow detected (${message}), ` +
|
|
186
|
+
`shrinking input ${attempt.length} → ${shrunkLength} chars and retrying (attempt ${attemptIndex + 1})`);
|
|
187
|
+
attempt = attempt.substring(0, shrunkLength);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
embeddingQueue = task.then(() => undefined, () => undefined);
|
|
192
|
+
return task;
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Persist a complete logical set of facts for one file/key.
|
|
196
|
+
*
|
|
197
|
+
* This is deliberately the ONLY place where replaceFactsForFile
|
|
198
|
+
* is used during normal indexing.
|
|
199
|
+
*
|
|
200
|
+
* A source file is therefore replaced once with:
|
|
201
|
+
*
|
|
202
|
+
* file summary
|
|
203
|
+
* + symbol facts
|
|
204
|
+
*
|
|
205
|
+
* instead of repeatedly replacing itself for every symbol.
|
|
206
|
+
*/
|
|
207
|
+
const indexFactsForFile = async (filePath, facts) => {
|
|
208
|
+
checkCancelled();
|
|
209
|
+
if (facts.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const storedFacts = [];
|
|
213
|
+
for (const fact of facts) {
|
|
214
|
+
checkCancelled();
|
|
215
|
+
const rawText = fact.embeddingText || fact.content;
|
|
216
|
+
const textForEmbedding = rawText.substring(0, MAX_EMBED_INPUT_CHARS);
|
|
217
|
+
if (!textForEmbedding.trim()) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
const embedding = await runEmbed(textForEmbedding);
|
|
221
|
+
storedFacts.push({
|
|
222
|
+
content: fact.content,
|
|
223
|
+
embedding,
|
|
224
|
+
metadata: {
|
|
225
|
+
...fact.metadata,
|
|
226
|
+
version: indexingVersion,
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (storedFacts.length === 0) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
checkCancelled();
|
|
234
|
+
await this.mainModule.database.vectorDatabase.replaceFactsForFile(project.id, filePath, storedFacts);
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Generic text resources such as README files, orientation
|
|
238
|
+
* documents, dependency summaries, and the global project
|
|
239
|
+
* manifest are chunked before indexing.
|
|
240
|
+
*/
|
|
241
|
+
const indexTextResource = async (content, filePath, metadata = {}) => {
|
|
242
|
+
const chunks = chunkText(content, 600).filter((chunk) => chunk && chunk.trim().length > 0);
|
|
243
|
+
const facts = chunks.map((chunk, index) => ({
|
|
244
|
+
content: chunk,
|
|
245
|
+
metadata: {
|
|
246
|
+
...metadata,
|
|
247
|
+
factType: metadata.factType || 'text_chunk',
|
|
248
|
+
chunkIndex: index,
|
|
249
|
+
totalChunks: chunks.length,
|
|
250
|
+
sourcePath: filePath,
|
|
251
|
+
},
|
|
252
|
+
}));
|
|
253
|
+
await indexFactsForFile(filePath, facts);
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* preLoadOrientationFiles historically receives a fire-and-forget
|
|
257
|
+
* indexing callback. Track those writes explicitly so indexing
|
|
258
|
+
* cannot report success before they finish.
|
|
259
|
+
*/
|
|
260
|
+
const pendingIndexWrites = [];
|
|
261
|
+
let backgroundIndexingError;
|
|
262
|
+
const scheduleTextResource = (content, filePath, metadata = {}) => {
|
|
263
|
+
const task = indexTextResource(content, filePath, metadata).catch((error) => {
|
|
264
|
+
backgroundIndexingError ??= error;
|
|
265
|
+
});
|
|
266
|
+
pendingIndexWrites.push(task);
|
|
267
|
+
return task;
|
|
268
|
+
};
|
|
269
|
+
const flushPendingWrites = async () => {
|
|
270
|
+
if (pendingIndexWrites.length > 0) {
|
|
271
|
+
await Promise.all(pendingIndexWrites);
|
|
272
|
+
}
|
|
273
|
+
if (backgroundIndexingError) {
|
|
274
|
+
throw backgroundIndexingError;
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
// ─────────────────────────────────────────
|
|
278
|
+
// STRUCTURAL SCAN
|
|
279
|
+
// ─────────────────────────────────────────
|
|
280
|
+
progress('🔍 Scanning codebase structure...');
|
|
281
|
+
const scanResult = await scanCodebase(absoluteRoot);
|
|
282
|
+
checkCancelled();
|
|
283
|
+
progress(`📊 Found ${scanResult.totalFiles} files and ${scanResult.totalSymbols} symbols`);
|
|
284
|
+
/**
|
|
285
|
+
* The current vector database API replaces facts directly rather
|
|
286
|
+
* than supporting staged index versions.
|
|
287
|
+
*
|
|
288
|
+
* Delete only after repository scanning and model setup succeed,
|
|
289
|
+
* which reduces the period in which no complete index exists.
|
|
290
|
+
*
|
|
291
|
+
* A future vector-database update should introduce true
|
|
292
|
+
* version-scoped staging and atomic promotion.
|
|
293
|
+
*/
|
|
294
|
+
progress('Preparing new semantic index...');
|
|
295
|
+
await this.mainModule.database.vectorDatabase.deleteProjectFacts(project.id);
|
|
296
|
+
checkCancelled();
|
|
297
|
+
// ─────────────────────────────────────────
|
|
298
|
+
// SOURCE FILE FACTS
|
|
299
|
+
// ─────────────────────────────────────────
|
|
300
|
+
progress('🧠 Indexing files and symbols...');
|
|
301
|
+
for (const file of scanResult.files) {
|
|
302
|
+
checkCancelled();
|
|
303
|
+
const symbolSummary = file.symbols
|
|
304
|
+
.map((symbol) => `${symbol.kind} ${symbol.name} (lines ${symbol.startLine}-${symbol.endLine})`)
|
|
305
|
+
.join('\n');
|
|
306
|
+
const fileSummary = [
|
|
307
|
+
`## File: ${file.filePath}`,
|
|
308
|
+
`Language: ${file.language}`,
|
|
309
|
+
`Size: ${(file.sizeBytes / 1024).toFixed(1)} KB`,
|
|
310
|
+
file.isEntryPoint ? 'Role: Entry point' : '',
|
|
311
|
+
file.isConfigFile ? 'Role: Configuration' : '',
|
|
312
|
+
file.isEntity ? 'Role: Data entity/model' : '',
|
|
313
|
+
file.isRoute ? 'Role: API route/controller' : '',
|
|
314
|
+
file.imports.length > 0 ? `Imports: ${file.imports.join(', ')}` : '',
|
|
315
|
+
file.exports.length > 0 ? `Exports: ${file.exports.join(', ')}` : '',
|
|
316
|
+
symbolSummary ? `\n## Symbols\n${symbolSummary}` : '',
|
|
317
|
+
]
|
|
318
|
+
.filter(Boolean)
|
|
319
|
+
.join('\n');
|
|
320
|
+
const facts = [];
|
|
321
|
+
if (fileSummary.trim()) {
|
|
322
|
+
facts.push({
|
|
323
|
+
content: fileSummary,
|
|
324
|
+
metadata: {
|
|
325
|
+
source: 'codebase_scan',
|
|
326
|
+
factType: 'file_summary',
|
|
327
|
+
sourcePath: file.filePath,
|
|
328
|
+
fileType: file.language,
|
|
329
|
+
isEntryPoint: file.isEntryPoint,
|
|
330
|
+
isConfigFile: file.isConfigFile,
|
|
331
|
+
isEntity: file.isEntity,
|
|
332
|
+
isRoute: file.isRoute,
|
|
333
|
+
symbolCount: file.symbols.length,
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
for (const symbol of file.symbols) {
|
|
338
|
+
const symbolContent = [
|
|
339
|
+
`## ${symbol.kind}: ${symbol.name}`,
|
|
340
|
+
`File: ${file.filePath}`,
|
|
341
|
+
`Lines: ${symbol.startLine}-${symbol.endLine}`,
|
|
342
|
+
'',
|
|
343
|
+
symbol.content,
|
|
344
|
+
].join('\n');
|
|
345
|
+
/**
|
|
346
|
+
* Persist the complete symbol text, but bound the embedding
|
|
347
|
+
* input so huge functions/classes do not overwhelm the
|
|
348
|
+
* embedding model.
|
|
349
|
+
*/
|
|
350
|
+
const embeddingText = symbolContent.substring(0, MAX_EMBED_INPUT_CHARS);
|
|
351
|
+
facts.push({
|
|
352
|
+
content: symbolContent,
|
|
353
|
+
embeddingText,
|
|
354
|
+
metadata: {
|
|
355
|
+
source: 'symbol',
|
|
356
|
+
factType: 'symbol',
|
|
357
|
+
sourcePath: file.filePath,
|
|
358
|
+
kind: symbol.kind,
|
|
359
|
+
symbolName: symbol.name,
|
|
360
|
+
startLine: symbol.startLine,
|
|
361
|
+
endLine: symbol.endLine,
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Exactly one replacement per source file.
|
|
367
|
+
*/
|
|
368
|
+
await indexFactsForFile(file.filePath, facts);
|
|
369
|
+
}
|
|
370
|
+
// ─────────────────────────────────────────
|
|
371
|
+
// REPOSITORY-WIDE STRUCTURAL FACTS
|
|
372
|
+
// ─────────────────────────────────────────
|
|
373
|
+
const topImports = Array.from(scanResult.topLevelImports.entries())
|
|
374
|
+
.sort((a, b) => b[1] - a[1])
|
|
375
|
+
.slice(0, 30)
|
|
376
|
+
.map(([name, count]) => `- ${name} (${count} files)`)
|
|
377
|
+
.join('\n');
|
|
378
|
+
if (topImports) {
|
|
379
|
+
const dependencySummary = [
|
|
380
|
+
'## Top Dependencies',
|
|
381
|
+
topImports,
|
|
382
|
+
'## Entry Points',
|
|
383
|
+
scanResult.entryPoints.join('\n') || 'None detected',
|
|
384
|
+
'## Entities',
|
|
385
|
+
scanResult.entityFiles.join('\n') || 'None detected',
|
|
386
|
+
'## Routes',
|
|
387
|
+
scanResult.routeFiles.join('\n') || 'None detected',
|
|
388
|
+
].join('\n\n');
|
|
389
|
+
await indexTextResource(dependencySummary, '__repository__/dependencies', {
|
|
390
|
+
source: 'dependency_graph',
|
|
391
|
+
factType: 'repository_dependencies',
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// ─────────────────────────────────────────
|
|
395
|
+
// ORIENTATION FILES
|
|
396
|
+
// ─────────────────────────────────────────
|
|
397
|
+
progress('📚 Loading repository orientation files...');
|
|
398
|
+
const orientationFileContents = await preLoadOrientationFiles(absoluteRoot, indexingVersion, progress, scheduleTextResource);
|
|
399
|
+
await flushPendingWrites();
|
|
400
|
+
checkCancelled();
|
|
401
|
+
// ─────────────────────────────────────────
|
|
402
|
+
// ARCHITECTURAL RESEARCH
|
|
403
|
+
// ─────────────────────────────────────────
|
|
404
|
+
progress('🔬 Researching application architecture...');
|
|
405
|
+
const extractedFacts = await runResearchAgentLoop(project, absoluteRoot, llmModelId, orientationFileContents, progress, checkCancelled, awaitCompletion);
|
|
406
|
+
checkCancelled();
|
|
407
|
+
// ─────────────────────────────────────────
|
|
408
|
+
// GLOBAL PROJECT MANIFEST
|
|
409
|
+
// ─────────────────────────────────────────
|
|
410
|
+
progress('💾 Saving architectural knowledge...');
|
|
411
|
+
const richMarkdownSummary = createProjectManifestSummary(extractedFacts);
|
|
412
|
+
await indexTextResource(richMarkdownSummary, '__repository__/project-overview', {
|
|
413
|
+
source: 'project_overview',
|
|
414
|
+
factType: 'project_overview',
|
|
415
|
+
});
|
|
416
|
+
await flushPendingWrites();
|
|
417
|
+
checkCancelled();
|
|
418
|
+
/**
|
|
419
|
+
* Promote the ProjectEntity version only after all indexing and
|
|
420
|
+
* architectural research has successfully completed.
|
|
421
|
+
*
|
|
422
|
+
* NOTE:
|
|
423
|
+
* The vector DB itself still needs version-scoped staging before
|
|
424
|
+
* this becomes a truly atomic index swap.
|
|
425
|
+
*/
|
|
426
|
+
project.analysis = extractedFacts;
|
|
427
|
+
project.indexing_version = indexingVersion;
|
|
428
|
+
project.last_indexing_duration_seconds = Math.round((Date.now() - indexingStartTime) / 1000);
|
|
429
|
+
await project.save();
|
|
430
|
+
this.mainModule.socket?.emitIndexingProgress({
|
|
431
|
+
projectId,
|
|
432
|
+
status: 'success',
|
|
433
|
+
message: 'Indexing complete!',
|
|
434
|
+
facts: extractedFacts,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
if (error instanceof IndexingCancelledError) {
|
|
439
|
+
console.log(`Indexing cancelled for project ${projectId}.`);
|
|
440
|
+
this.mainModule.socket?.emitIndexingProgress({
|
|
441
|
+
projectId,
|
|
442
|
+
status: 'cancelled',
|
|
443
|
+
message: 'Indexing was cancelled.',
|
|
444
|
+
});
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
console.error('Error during indexing:', error);
|
|
448
|
+
if (error?.message?.includes('loadCache') || error?.message?.includes('nPast')) {
|
|
449
|
+
purgeQvacKvCache();
|
|
450
|
+
}
|
|
451
|
+
this.mainModule.socket?.emitIndexingProgress({
|
|
452
|
+
projectId,
|
|
453
|
+
status: 'error',
|
|
454
|
+
message: error?.message || 'Failed to index codebase',
|
|
455
|
+
});
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
finally {
|
|
459
|
+
this.indexingControllers.delete(projectId);
|
|
460
|
+
try {
|
|
461
|
+
const project = await ProjectEntity.findOne({
|
|
462
|
+
where: {
|
|
463
|
+
id: projectId,
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
if (project) {
|
|
467
|
+
project.current_task = null;
|
|
468
|
+
await project.save();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
console.error('Failed to reset project current_task', error);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
async initializeProject(projectId) {
|
|
477
|
+
const availableModels = await this.mainModule.qvac.getAvailableModels();
|
|
478
|
+
const llmModel = availableModels.find((model) => model.id === LLM_MODEL_ID);
|
|
479
|
+
const embeddingModel = availableModels.find((model) => model.id === EMBEDDING_MODEL_ID);
|
|
480
|
+
if (!llmModel?.isCached || !embeddingModel?.isCached) {
|
|
481
|
+
throw new Error('MODEL_SETUP_REQUIRED: Local AI models are not downloaded. Please complete the model setup first.');
|
|
482
|
+
}
|
|
483
|
+
const project = await ProjectEntity.findOne({
|
|
484
|
+
where: {
|
|
485
|
+
id: projectId,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
if (!project) {
|
|
489
|
+
throw new Error(`Project ${projectId} not found.`);
|
|
490
|
+
}
|
|
491
|
+
if (!project.repository_path) {
|
|
492
|
+
throw new Error('Project repository path not set.');
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Mark the operation as active, but DO NOT increment
|
|
496
|
+
* indexing_version here.
|
|
497
|
+
*
|
|
498
|
+
* indexing_version represents the most recently completed index,
|
|
499
|
+
* not the index currently being attempted.
|
|
500
|
+
*/
|
|
501
|
+
project.current_task = 'indexing';
|
|
502
|
+
await project.save();
|
|
503
|
+
return project;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=code-base-indexer.agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-base-indexer.agent.js","sourceRoot":"","sources":["../../../src/modules/ai-agent/code-base-indexer.agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface CodeSymbolFact {
|
|
2
|
+
kind: string;
|
|
3
|
+
name: string;
|
|
4
|
+
startLine: number;
|
|
5
|
+
endLine: number;
|
|
6
|
+
parent?: string;
|
|
7
|
+
dependencies: string[];
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
export interface FileFacts {
|
|
11
|
+
filePath: string;
|
|
12
|
+
language: string;
|
|
13
|
+
sizeBytes: number;
|
|
14
|
+
symbols: CodeSymbolFact[];
|
|
15
|
+
imports: string[];
|
|
16
|
+
exports: string[];
|
|
17
|
+
isConfigFile: boolean;
|
|
18
|
+
isEntryPoint: boolean;
|
|
19
|
+
isEntity: boolean;
|
|
20
|
+
isRoute: boolean;
|
|
21
|
+
contentChunks: string[];
|
|
22
|
+
dependencyNames: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface CodebaseScanResult {
|
|
25
|
+
files: FileFacts[];
|
|
26
|
+
totalFiles: number;
|
|
27
|
+
totalSymbols: number;
|
|
28
|
+
totalBytes: number;
|
|
29
|
+
entryPoints: string[];
|
|
30
|
+
entityFiles: string[];
|
|
31
|
+
routeFiles: string[];
|
|
32
|
+
configFiles: string[];
|
|
33
|
+
topLevelImports: Map<string, number>;
|
|
34
|
+
directorySummary: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function scanCodebase(absoluteRoot: string): Promise<CodebaseScanResult>;
|
|
37
|
+
//# sourceMappingURL=codebase-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebase-scanner.d.ts","sourceRoot":"","sources":["../../../src/modules/ai-agent/codebase-scanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAoFD,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8LpF"}
|