@gracker/smartperfetto 1.0.13 → 1.0.15
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/.env.example +16 -8
- package/dist/agent/core/orchestratorTypes.d.ts +10 -0
- package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
- package/dist/agent/core/orchestratorTypes.js.map +1 -1
- package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
- package/dist/agentOpenAI/openAiRuntime.js +11 -1
- package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
- package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -1
- package/dist/agentOpenAI/openAiToolAdapter.js +27 -2
- package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -1
- package/dist/agentv3/claudeMcpServer.d.ts +15 -1
- package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
- package/dist/agentv3/claudeMcpServer.js +311 -5
- package/dist/agentv3/claudeMcpServer.js.map +1 -1
- package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
- package/dist/agentv3/claudeRuntime.js +17 -0
- package/dist/agentv3/claudeRuntime.js.map +1 -1
- package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -1
- package/dist/agentv3/claudeSystemPrompt.js +9 -0
- package/dist/agentv3/claudeSystemPrompt.js.map +1 -1
- package/dist/agentv3/mcpToolRegistry.d.ts +14 -2
- package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -1
- package/dist/agentv3/mcpToolRegistry.js +25 -6
- package/dist/agentv3/mcpToolRegistry.js.map +1 -1
- package/dist/agentv3/sessionStateSnapshot.d.ts +18 -0
- package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
- package/dist/agentv3/types.d.ts +5 -0
- package/dist/agentv3/types.d.ts.map +1 -1
- package/dist/agentv3/types.js.map +1 -1
- package/dist/cli-user/bin.js +99 -1
- package/dist/cli-user/bin.js.map +1 -1
- package/dist/cli-user/commands/analyze.d.ts +3 -0
- package/dist/cli-user/commands/analyze.d.ts.map +1 -1
- package/dist/cli-user/commands/analyze.js +2 -0
- package/dist/cli-user/commands/analyze.js.map +1 -1
- package/dist/cli-user/commands/codebase.d.ts +29 -0
- package/dist/cli-user/commands/codebase.d.ts.map +1 -0
- package/dist/cli-user/commands/codebase.js +152 -0
- package/dist/cli-user/commands/codebase.js.map +1 -0
- package/dist/cli-user/commands/config.d.ts.map +1 -1
- package/dist/cli-user/commands/config.js +4 -1
- package/dist/cli-user/commands/config.js.map +1 -1
- package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
- package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
- package/dist/cli-user/services/cliAnalyzeService.js +116 -29
- package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
- package/dist/cli-user/services/turnRunner.d.ts +3 -0
- package/dist/cli-user/services/turnRunner.d.ts.map +1 -1
- package/dist/cli-user/services/turnRunner.js +6 -0
- package/dist/cli-user/services/turnRunner.js.map +1 -1
- package/dist/cli-user/types.d.ts +5 -0
- package/dist/cli-user/types.d.ts.map +1 -1
- package/dist/routes/agentRoutes.d.ts.map +1 -1
- package/dist/routes/agentRoutes.js +4 -0
- package/dist/routes/agentRoutes.js.map +1 -1
- package/dist/routes/ragAdminRoutes.d.ts +13 -24
- package/dist/routes/ragAdminRoutes.d.ts.map +1 -1
- package/dist/routes/ragAdminRoutes.js +266 -11
- package/dist/routes/ragAdminRoutes.js.map +1 -1
- package/dist/scripts/verifyAgentSseScrolling.js +119 -3
- package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
- package/dist/services/aospKnowledgeIngester.d.ts +7 -0
- package/dist/services/aospKnowledgeIngester.d.ts.map +1 -1
- package/dist/services/aospKnowledgeIngester.js +19 -7
- package/dist/services/aospKnowledgeIngester.js.map +1 -1
- package/dist/services/auth/codebaseScopes.d.ts +6 -0
- package/dist/services/auth/codebaseScopes.d.ts.map +1 -0
- package/dist/services/auth/codebaseScopes.js +23 -0
- package/dist/services/auth/codebaseScopes.js.map +1 -0
- package/dist/services/codebase/codeAwareFeature.d.ts +4 -0
- package/dist/services/codebase/codeAwareFeature.d.ts.map +1 -0
- package/dist/services/codebase/codeAwareFeature.js +18 -0
- package/dist/services/codebase/codeAwareFeature.js.map +1 -0
- package/dist/services/codebase/codeLookupLedger.d.ts +37 -0
- package/dist/services/codebase/codeLookupLedger.d.ts.map +1 -0
- package/dist/services/codebase/codeLookupLedger.js +126 -0
- package/dist/services/codebase/codeLookupLedger.js.map +1 -0
- package/dist/services/codebase/codebaseRegistry.d.ts +76 -0
- package/dist/services/codebase/codebaseRegistry.d.ts.map +1 -0
- package/dist/services/codebase/codebaseRegistry.js +164 -0
- package/dist/services/codebase/codebaseRegistry.js.map +1 -0
- package/dist/services/codebase/defaultCodebaseServices.d.ts +5 -0
- package/dist/services/codebase/defaultCodebaseServices.d.ts.map +1 -0
- package/dist/services/codebase/defaultCodebaseServices.js +21 -0
- package/dist/services/codebase/defaultCodebaseServices.js.map +1 -0
- package/dist/services/codebase/patchProposer.d.ts +44 -0
- package/dist/services/codebase/patchProposer.d.ts.map +1 -0
- package/dist/services/codebase/patchProposer.js +163 -0
- package/dist/services/codebase/patchProposer.js.map +1 -0
- package/dist/services/codebase/pathSecurityGate.d.ts +33 -0
- package/dist/services/codebase/pathSecurityGate.d.ts.map +1 -0
- package/dist/services/codebase/pathSecurityGate.js +214 -0
- package/dist/services/codebase/pathSecurityGate.js.map +1 -0
- package/dist/services/htmlReportGenerator.d.ts +2 -0
- package/dist/services/htmlReportGenerator.d.ts.map +1 -1
- package/dist/services/htmlReportGenerator.js +67 -0
- package/dist/services/htmlReportGenerator.js.map +1 -1
- package/dist/services/persistAgentSession.d.ts.map +1 -1
- package/dist/services/persistAgentSession.js +19 -0
- package/dist/services/persistAgentSession.js.map +1 -1
- package/dist/services/rag/aospSourceIngester.d.ts +26 -0
- package/dist/services/rag/aospSourceIngester.d.ts.map +1 -0
- package/dist/services/rag/aospSourceIngester.js +143 -0
- package/dist/services/rag/aospSourceIngester.js.map +1 -0
- package/dist/services/rag/appSourceIngester.d.ts +37 -0
- package/dist/services/rag/appSourceIngester.d.ts.map +1 -0
- package/dist/services/rag/appSourceIngester.js +165 -0
- package/dist/services/rag/appSourceIngester.js.map +1 -0
- package/dist/services/rag/baseIngester.d.ts +18 -0
- package/dist/services/rag/baseIngester.d.ts.map +1 -0
- package/dist/services/rag/baseIngester.js +197 -0
- package/dist/services/rag/baseIngester.js.map +1 -0
- package/dist/services/rag/kernelSourceIngester.d.ts +35 -0
- package/dist/services/rag/kernelSourceIngester.d.ts.map +1 -0
- package/dist/services/rag/kernelSourceIngester.js +170 -0
- package/dist/services/rag/kernelSourceIngester.js.map +1 -0
- package/dist/services/rag/lookupResponseFilter.d.ts +42 -0
- package/dist/services/rag/lookupResponseFilter.d.ts.map +1 -0
- package/dist/services/rag/lookupResponseFilter.js +192 -0
- package/dist/services/rag/lookupResponseFilter.js.map +1 -0
- package/dist/services/rag/sessionToolResultRegistry.d.ts +25 -0
- package/dist/services/rag/sessionToolResultRegistry.d.ts.map +1 -0
- package/dist/services/rag/sessionToolResultRegistry.js +57 -0
- package/dist/services/rag/sessionToolResultRegistry.js.map +1 -0
- package/dist/services/rag/toolResultProjectionFilter.d.ts +18 -0
- package/dist/services/rag/toolResultProjectionFilter.d.ts.map +1 -0
- package/dist/services/rag/toolResultProjectionFilter.js +33 -0
- package/dist/services/rag/toolResultProjectionFilter.js.map +1 -0
- package/dist/services/ragStore.d.ts +8 -0
- package/dist/services/ragStore.d.ts.map +1 -1
- package/dist/services/ragStore.js +77 -8
- package/dist/services/ragStore.js.map +1 -1
- package/dist/services/rbac.d.ts +1 -1
- package/dist/services/rbac.d.ts.map +1 -1
- package/dist/services/rbac.js +6 -0
- package/dist/services/rbac.js.map +1 -1
- package/dist/services/security/codeAwareOutputRegistry.d.ts +6 -0
- package/dist/services/security/codeAwareOutputRegistry.d.ts.map +1 -0
- package/dist/services/security/codeAwareOutputRegistry.js +55 -0
- package/dist/services/security/codeAwareOutputRegistry.js.map +1 -0
- package/dist/services/security/llmEchoOutputFilter.d.ts +49 -0
- package/dist/services/security/llmEchoOutputFilter.d.ts.map +1 -0
- package/dist/services/security/llmEchoOutputFilter.js +133 -0
- package/dist/services/security/llmEchoOutputFilter.js.map +1 -0
- package/dist/services/security/secretPatterns.d.ts +6 -0
- package/dist/services/security/secretPatterns.d.ts.map +1 -0
- package/dist/services/security/secretPatterns.js +23 -0
- package/dist/services/security/secretPatterns.js.map +1 -0
- package/dist/services/symbol/breakpadSymParser.d.ts +19 -0
- package/dist/services/symbol/breakpadSymParser.d.ts.map +1 -0
- package/dist/services/symbol/breakpadSymParser.js +40 -0
- package/dist/services/symbol/breakpadSymParser.js.map +1 -0
- package/dist/services/symbol/kallsymsParser.d.ts +12 -0
- package/dist/services/symbol/kallsymsParser.d.ts.map +1 -0
- package/dist/services/symbol/kallsymsParser.js +41 -0
- package/dist/services/symbol/kallsymsParser.js.map +1 -0
- package/dist/services/symbol/r8MappingParser.d.ts +40 -0
- package/dist/services/symbol/r8MappingParser.d.ts.map +1 -0
- package/dist/services/symbol/r8MappingParser.js +99 -0
- package/dist/services/symbol/r8MappingParser.js.map +1 -0
- package/dist/services/symbol/symbolResolver.d.ts +59 -0
- package/dist/services/symbol/symbolResolver.d.ts.map +1 -0
- package/dist/services/symbol/symbolResolver.js +147 -0
- package/dist/services/symbol/symbolResolver.js.map +1 -0
- package/dist/services/symbol/traceSymbolContext.d.ts +14 -0
- package/dist/services/symbol/traceSymbolContext.d.ts.map +1 -0
- package/dist/services/symbol/traceSymbolContext.js +45 -0
- package/dist/services/symbol/traceSymbolContext.js.map +1 -0
- package/dist/types/sparkContracts.d.ts +31 -3
- package/dist/types/sparkContracts.d.ts.map +1 -1
- package/dist/types/sparkContracts.js.map +1 -1
- package/package.json +12 -5
- package/skills/composite/code_pinpoint.skill.yaml +111 -0
- package/strategies/code-aware.template.md +37 -0
- package/strategies/prompt-methodology.template.md +2 -0
|
@@ -1,30 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG admin routes — operator-side surface for the Plan 55 RAG
|
|
3
|
-
* store. Lets a curator inspect index population per source kind,
|
|
4
|
-
* delete blocked / stale chunks, and search the index directly
|
|
5
|
-
* (without going through the agent).
|
|
6
|
-
*
|
|
7
|
-
* Endpoints (all under `/api/rag`):
|
|
8
|
-
* GET /stats per-kind chunk counts + last indexed
|
|
9
|
-
* GET /chunks/:chunkId fetch one chunk
|
|
10
|
-
* DELETE /chunks/:chunkId remove a chunk (license-blocked
|
|
11
|
-
* entries can be evicted permanently
|
|
12
|
-
* once the curator decides to)
|
|
13
|
-
* POST /search body `{query, kinds?, topK?}` —
|
|
14
|
-
* run a search like the agent would
|
|
15
|
-
*
|
|
16
|
-
* Ingestion endpoints (POST /ingest/blog, /ingest/aosp,
|
|
17
|
-
* /ingest/oem) are intentionally NOT exposed in M2; ingesters are
|
|
18
|
-
* called from operator scripts that supply the fetcher (with
|
|
19
|
-
* authenticated source credentials) directly. M3 may add upload
|
|
20
|
-
* endpoints once an authentication story exists.
|
|
21
|
-
*
|
|
22
|
-
* @module ragAdminRoutes
|
|
23
|
-
*/
|
|
24
1
|
import { Router, type Router as ExpressRouter } from 'express';
|
|
25
2
|
import { RagStore } from '../services/ragStore';
|
|
3
|
+
import { CodebaseRegistry } from '../services/codebase/codebaseRegistry';
|
|
4
|
+
import { PathSecurityGate } from '../services/codebase/pathSecurityGate';
|
|
5
|
+
import { AppSourceIngester } from '../services/rag/appSourceIngester';
|
|
6
|
+
import { AospSourceIngester } from '../services/rag/aospSourceIngester';
|
|
7
|
+
import { KernelSourceIngester } from '../services/rag/kernelSourceIngester';
|
|
8
|
+
export interface RagAdminRouteServices {
|
|
9
|
+
registry?: CodebaseRegistry;
|
|
10
|
+
gate?: PathSecurityGate;
|
|
11
|
+
appSourceIngester?: AppSourceIngester;
|
|
12
|
+
aospSourceIngester?: AospSourceIngester;
|
|
13
|
+
kernelSourceIngester?: KernelSourceIngester;
|
|
14
|
+
}
|
|
26
15
|
/** Test/factory hook. */
|
|
27
|
-
export declare function createRagAdminRoutes(store?: RagStore): ExpressRouter;
|
|
16
|
+
export declare function createRagAdminRoutes(store?: RagStore, services?: RagAdminRouteServices): ExpressRouter;
|
|
28
17
|
declare const ragAdminRoutes: Router;
|
|
29
18
|
export default ragAdminRoutes;
|
|
30
19
|
//# sourceMappingURL=ragAdminRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ragAdminRoutes.d.ts","sourceRoot":"","sources":["../../src/routes/ragAdminRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ragAdminRoutes.d.ts","sourceRoot":"","sources":["../../src/routes/ragAdminRoutes.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAC,MAAM,EAAE,KAAK,MAAM,IAAI,aAAa,EAAC,MAAM,SAAS,CAAC;AAG7D,OAAO,EAAC,QAAQ,EAA6B,MAAM,sBAAsB,CAAC;AAK1E,OAAO,EAAC,gBAAgB,EAAmB,MAAM,uCAAuC,CAAC;AAEzF,OAAO,EAAC,gBAAgB,EAAyB,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAC,kBAAkB,EAAC,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAC,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAY1E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AA8DD,yBAAyB;AACzB,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAE,qBAA0B,GAAG,aAAa,CA0Q1G;AAED,QAAA,MAAM,cAAc,QAAyB,CAAC;AAC9C,eAAe,cAAc,CAAC"}
|
|
@@ -27,11 +27,20 @@ exports.createRagAdminRoutes = createRagAdminRoutes;
|
|
|
27
27
|
*
|
|
28
28
|
* @module ragAdminRoutes
|
|
29
29
|
*/
|
|
30
|
+
const crypto_1 = require("crypto");
|
|
30
31
|
const express_1 = require("express");
|
|
31
32
|
const auth_1 = require("../middleware/auth");
|
|
32
33
|
const ragStore_1 = require("../services/ragStore");
|
|
33
34
|
const scopedKnowledgeStore_1 = require("../services/scopedKnowledgeStore");
|
|
34
35
|
const runtimePaths_1 = require("../runtimePaths");
|
|
36
|
+
const codebaseScopes_1 = require("../services/auth/codebaseScopes");
|
|
37
|
+
const defaultCodebaseServices_1 = require("../services/codebase/defaultCodebaseServices");
|
|
38
|
+
const pathSecurityGate_1 = require("../services/codebase/pathSecurityGate");
|
|
39
|
+
const appSourceIngester_1 = require("../services/rag/appSourceIngester");
|
|
40
|
+
const aospSourceIngester_1 = require("../services/rag/aospSourceIngester");
|
|
41
|
+
const kernelSourceIngester_1 = require("../services/rag/kernelSourceIngester");
|
|
42
|
+
const symbolResolver_1 = require("../services/symbol/symbolResolver");
|
|
43
|
+
const codeAwareFeature_1 = require("../services/codebase/codeAwareFeature");
|
|
35
44
|
const DEFAULT_STORAGE_PATH = (0, runtimePaths_1.backendLogPath)('rag_store.json');
|
|
36
45
|
let cachedStore = null;
|
|
37
46
|
function getDefaultStore() {
|
|
@@ -39,40 +48,102 @@ function getDefaultStore() {
|
|
|
39
48
|
cachedStore = new ragStore_1.RagStore(DEFAULT_STORAGE_PATH);
|
|
40
49
|
return cachedStore;
|
|
41
50
|
}
|
|
51
|
+
function snippetHash(snippet) {
|
|
52
|
+
return (0, crypto_1.createHash)('sha256').update(snippet).digest('hex').slice(0, 12);
|
|
53
|
+
}
|
|
54
|
+
function isCodeAwareChunk(chunk) {
|
|
55
|
+
return chunk.kind === 'app_source' ||
|
|
56
|
+
chunk.kind === 'kernel_source' ||
|
|
57
|
+
chunk.registryOrigin === 'codebase_registry';
|
|
58
|
+
}
|
|
59
|
+
function sanitizeChunk(chunk) {
|
|
60
|
+
if (!isCodeAwareChunk(chunk))
|
|
61
|
+
return chunk;
|
|
62
|
+
const { snippet, ...rest } = chunk;
|
|
63
|
+
return {
|
|
64
|
+
...rest,
|
|
65
|
+
snippet: undefined,
|
|
66
|
+
snippetHash: snippetHash(snippet),
|
|
67
|
+
snippetLength: snippet.length,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function sanitizeRetrieval(result) {
|
|
71
|
+
return {
|
|
72
|
+
...result,
|
|
73
|
+
results: result.results.map(hit => ({
|
|
74
|
+
...hit,
|
|
75
|
+
...(hit.chunk ? { chunk: sanitizeChunk(hit.chunk) } : {}),
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function sanitizeCodebase(ref) {
|
|
80
|
+
const { rootPath: _rootPath, rootRealpath: _rootRealpath, consent, ...rest } = ref;
|
|
81
|
+
return {
|
|
82
|
+
...rest,
|
|
83
|
+
eligibleForSendToProvider: consent.sendToProvider,
|
|
84
|
+
consent: {
|
|
85
|
+
sendToProvider: consent.sendToProvider,
|
|
86
|
+
consentedAt: consent.consentedAt,
|
|
87
|
+
consentedBy: consent.consentedBy,
|
|
88
|
+
consentHash: consent.consentHash,
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function sanitizePreview(preview) {
|
|
93
|
+
return {
|
|
94
|
+
blocked: preview.blocked,
|
|
95
|
+
...(preview.blockedReason ? { blockedReason: preview.blockedReason } : {}),
|
|
96
|
+
acceptedFileCount: preview.acceptedFiles.length,
|
|
97
|
+
skippedFileCount: preview.skippedFiles.length,
|
|
98
|
+
acceptedFiles: preview.acceptedFiles.slice(0, 200),
|
|
99
|
+
skippedFiles: preview.skippedFiles.slice(0, 200),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function routeParam(value) {
|
|
103
|
+
return Array.isArray(value) ? value[0] ?? '' : value ?? '';
|
|
104
|
+
}
|
|
42
105
|
/** Test/factory hook. */
|
|
43
|
-
function createRagAdminRoutes(store) {
|
|
106
|
+
function createRagAdminRoutes(store, services = {}) {
|
|
44
107
|
const s = store ?? getDefaultStore();
|
|
108
|
+
const registry = services.registry ?? (0, defaultCodebaseServices_1.getDefaultCodebaseRegistry)();
|
|
109
|
+
const gate = services.gate ?? new pathSecurityGate_1.PathSecurityGate();
|
|
110
|
+
const appSourceIngester = services.appSourceIngester ?? new appSourceIngester_1.AppSourceIngester(s, registry, gate);
|
|
111
|
+
const aospSourceIngester = services.aospSourceIngester ?? new aospSourceIngester_1.AospSourceIngester(s, registry, gate);
|
|
112
|
+
const kernelSourceIngester = services.kernelSourceIngester ?? new kernelSourceIngester_1.KernelSourceIngester(s, registry, gate);
|
|
113
|
+
const symbolResolver = new symbolResolver_1.SymbolResolver(s);
|
|
45
114
|
const router = (0, express_1.Router)();
|
|
46
115
|
router.use(auth_1.authenticate);
|
|
47
|
-
router.get('/stats', (req, res) => {
|
|
116
|
+
router.get('/stats', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
48
117
|
const scope = (0, scopedKnowledgeStore_1.knowledgeScopeFromRequestContext)((0, auth_1.requireRequestContext)(req));
|
|
49
118
|
res.json({ success: true, stats: s.getStats(scope) });
|
|
50
119
|
});
|
|
51
|
-
router.get('/chunks/:chunkId', (req, res) => {
|
|
120
|
+
router.get('/chunks/:chunkId', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
52
121
|
const scope = (0, scopedKnowledgeStore_1.knowledgeScopeFromRequestContext)((0, auth_1.requireRequestContext)(req));
|
|
53
|
-
const
|
|
122
|
+
const chunkId = routeParam(req.params.chunkId);
|
|
123
|
+
const chunk = s.getChunk(chunkId, scope);
|
|
54
124
|
if (!chunk) {
|
|
55
125
|
return res.status(404).json({
|
|
56
126
|
success: false,
|
|
57
|
-
error: `Chunk '${
|
|
127
|
+
error: `Chunk '${chunkId}' not found`,
|
|
58
128
|
});
|
|
59
129
|
}
|
|
60
|
-
res.json({ success: true, chunk });
|
|
130
|
+
res.json({ success: true, chunk: sanitizeChunk(chunk) });
|
|
61
131
|
});
|
|
62
|
-
router.delete('/chunks/:chunkId', (req, res) => {
|
|
132
|
+
router.delete('/chunks/:chunkId', (0, codebaseScopes_1.requireCodebaseScope)('codebase:admin'), (req, res) => {
|
|
63
133
|
const scope = (0, scopedKnowledgeStore_1.knowledgeScopeFromRequestContext)((0, auth_1.requireRequestContext)(req));
|
|
64
|
-
const
|
|
134
|
+
const chunkId = routeParam(req.params.chunkId);
|
|
135
|
+
const removed = s.removeChunk(chunkId, scope);
|
|
65
136
|
if (!removed) {
|
|
66
137
|
return res.status(404).json({
|
|
67
138
|
success: false,
|
|
68
|
-
error: `Chunk '${
|
|
139
|
+
error: `Chunk '${chunkId}' not found`,
|
|
69
140
|
});
|
|
70
141
|
}
|
|
71
142
|
res.json({ success: true });
|
|
72
143
|
});
|
|
73
|
-
router.post('/search', (req, res) => {
|
|
144
|
+
router.post('/search', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
74
145
|
const scope = (0, scopedKnowledgeStore_1.knowledgeScopeFromRequestContext)((0, auth_1.requireRequestContext)(req));
|
|
75
|
-
const { query, kinds, topK } = (req.body ?? {});
|
|
146
|
+
const { query, kinds, topK, codebaseIds, vendor, buildId, pathPrefix, symbolExact, filePathExact, languages } = (req.body ?? {});
|
|
76
147
|
if (!query || typeof query !== 'string') {
|
|
77
148
|
return res.status(400).json({
|
|
78
149
|
success: false,
|
|
@@ -82,10 +153,194 @@ function createRagAdminRoutes(store) {
|
|
|
82
153
|
const result = s.search(query, {
|
|
83
154
|
...(kinds ? { kinds } : {}),
|
|
84
155
|
...(topK ? { topK } : {}),
|
|
156
|
+
...(codebaseIds ? { codebaseIds } : {}),
|
|
157
|
+
...(vendor ? { vendor } : {}),
|
|
158
|
+
...(buildId ? { buildId } : {}),
|
|
159
|
+
...(pathPrefix ? { pathPrefix } : {}),
|
|
160
|
+
...(symbolExact ? { symbolExact } : {}),
|
|
161
|
+
...(filePathExact ? { filePathExact } : {}),
|
|
162
|
+
...(languages ? { languages } : {}),
|
|
85
163
|
scope,
|
|
86
164
|
});
|
|
165
|
+
res.json({ success: true, result: sanitizeRetrieval(result) });
|
|
166
|
+
});
|
|
167
|
+
router.get('/codebases', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (_req, res) => {
|
|
168
|
+
res.json({
|
|
169
|
+
success: true,
|
|
170
|
+
featureEnabled: (0, codeAwareFeature_1.codeAwareFeatureEnabled)(),
|
|
171
|
+
codebases: registry.list(),
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
router.post('/codebases/preview', (0, codebaseScopes_1.requireCodebaseScope)('codebase:manage'), (req, res) => {
|
|
175
|
+
const { rootPath } = (req.body ?? {});
|
|
176
|
+
if (!rootPath || typeof rootPath !== 'string') {
|
|
177
|
+
return res.status(400).json({ success: false, error: '`rootPath` is required' });
|
|
178
|
+
}
|
|
179
|
+
res.json({ success: true, preview: sanitizePreview(gate.preview(rootPath)) });
|
|
180
|
+
});
|
|
181
|
+
router.post('/codebases/register', (0, codebaseScopes_1.requireCodebaseScope)('codebase:manage'), (req, res) => {
|
|
182
|
+
const { kind = 'app_source', displayName, rootPath, commitHash, vendor, buildId, pathFilters, excludeGlobs, symbolMapPaths, licenseTag, sendToProvider, } = (req.body ?? {});
|
|
183
|
+
if (!displayName || typeof displayName !== 'string') {
|
|
184
|
+
return res.status(400).json({ success: false, error: '`displayName` is required' });
|
|
185
|
+
}
|
|
186
|
+
if (!rootPath || typeof rootPath !== 'string') {
|
|
187
|
+
return res.status(400).json({ success: false, error: '`rootPath` is required' });
|
|
188
|
+
}
|
|
189
|
+
const preview = gate.preview(rootPath);
|
|
190
|
+
if (preview.blocked) {
|
|
191
|
+
return res.status(400).json({
|
|
192
|
+
success: false,
|
|
193
|
+
error: preview.blockedReason ?? 'root blocked by path security gate',
|
|
194
|
+
preview: sanitizePreview(preview),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const context = (0, auth_1.requireRequestContext)(req);
|
|
198
|
+
try {
|
|
199
|
+
const ref = registry.register({
|
|
200
|
+
kind,
|
|
201
|
+
displayName,
|
|
202
|
+
rootPath,
|
|
203
|
+
rootRealpath: preview.rootRealpath,
|
|
204
|
+
...(commitHash ? { commitHash } : {}),
|
|
205
|
+
...(vendor ? { vendor } : {}),
|
|
206
|
+
...(buildId ? { buildId } : {}),
|
|
207
|
+
...(Array.isArray(pathFilters) ? { pathFilters } : {}),
|
|
208
|
+
...(Array.isArray(excludeGlobs) ? { excludeGlobs } : {}),
|
|
209
|
+
...(Array.isArray(symbolMapPaths) ? { symbolMapPaths } : {}),
|
|
210
|
+
...(licenseTag ? { licenseTag } : {}),
|
|
211
|
+
sendToProvider: Boolean(sendToProvider),
|
|
212
|
+
consentedBy: context.userId,
|
|
213
|
+
tenantId: context.tenantId,
|
|
214
|
+
workspaceId: context.workspaceId,
|
|
215
|
+
userId: context.userId,
|
|
216
|
+
});
|
|
217
|
+
res.json({ success: true, codebase: sanitizeCodebase(ref), preview: sanitizePreview(preview) });
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
res.status(400).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
router.get('/codebases/:id', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
224
|
+
const codebaseId = routeParam(req.params.id);
|
|
225
|
+
const ref = registry.get(codebaseId);
|
|
226
|
+
if (!ref) {
|
|
227
|
+
return res.status(404).json({ success: false, error: `Codebase '${codebaseId}' not found` });
|
|
228
|
+
}
|
|
229
|
+
res.json({ success: true, codebase: sanitizeCodebase(ref) });
|
|
230
|
+
});
|
|
231
|
+
router.get('/codebases/:id/symbols', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
232
|
+
const codebaseId = routeParam(req.params.id);
|
|
233
|
+
const ref = registry.get(codebaseId);
|
|
234
|
+
if (!ref) {
|
|
235
|
+
return res.status(404).json({ success: false, error: `Codebase '${codebaseId}' not found` });
|
|
236
|
+
}
|
|
237
|
+
const symbol = typeof req.query.symbol === 'string'
|
|
238
|
+
? req.query.symbol
|
|
239
|
+
: typeof req.query.query === 'string'
|
|
240
|
+
? req.query.query
|
|
241
|
+
: '';
|
|
242
|
+
if (!symbol) {
|
|
243
|
+
return res.status(400).json({ success: false, error: '`symbol` or `query` is required' });
|
|
244
|
+
}
|
|
245
|
+
const common = {
|
|
246
|
+
codebaseId,
|
|
247
|
+
buildId: typeof req.query.buildId === 'string' ? req.query.buildId : undefined,
|
|
248
|
+
topK: typeof req.query.topK === 'string' ? Number(req.query.topK) : undefined,
|
|
249
|
+
};
|
|
250
|
+
const result = ref.kind === 'kernel_source'
|
|
251
|
+
? symbolResolver.resolveKernel({
|
|
252
|
+
symbol,
|
|
253
|
+
vendor: ref.vendor,
|
|
254
|
+
...common,
|
|
255
|
+
})
|
|
256
|
+
: ref.kind === 'aosp'
|
|
257
|
+
? symbolResolver.resolveNative({
|
|
258
|
+
symbol,
|
|
259
|
+
...common,
|
|
260
|
+
})
|
|
261
|
+
: symbolResolver.resolveApp({
|
|
262
|
+
symbol,
|
|
263
|
+
codebaseId,
|
|
264
|
+
buildId: common.buildId,
|
|
265
|
+
filePath: typeof req.query.filePath === 'string' ? req.query.filePath : undefined,
|
|
266
|
+
});
|
|
87
267
|
res.json({ success: true, result });
|
|
88
268
|
});
|
|
269
|
+
router.get('/codebases/:id/excerpt', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
270
|
+
const codebaseId = routeParam(req.params.id);
|
|
271
|
+
const ref = registry.get(codebaseId);
|
|
272
|
+
if (!ref) {
|
|
273
|
+
return res.status(404).json({ success: false, error: `Codebase '${codebaseId}' not found` });
|
|
274
|
+
}
|
|
275
|
+
const chunkId = typeof req.query.chunkId === 'string' ? req.query.chunkId : '';
|
|
276
|
+
if (!chunkId) {
|
|
277
|
+
return res.status(400).json({ success: false, error: '`chunkId` is required' });
|
|
278
|
+
}
|
|
279
|
+
const scope = (0, scopedKnowledgeStore_1.knowledgeScopeFromRequestContext)((0, auth_1.requireRequestContext)(req));
|
|
280
|
+
const chunk = s.getChunk(chunkId, scope);
|
|
281
|
+
if (!chunk || chunk.codebaseId !== codebaseId || !isCodeAwareChunk(chunk)) {
|
|
282
|
+
return res.status(404).json({ success: false, error: `Code excerpt '${chunkId}' not found` });
|
|
283
|
+
}
|
|
284
|
+
const maxLines = typeof req.query.maxLines === 'string'
|
|
285
|
+
? Math.max(1, Math.min(80, Number(req.query.maxLines) || 20))
|
|
286
|
+
: 20;
|
|
287
|
+
const lines = chunk.snippet.split(/\r?\n/).slice(0, maxLines);
|
|
288
|
+
res.json({
|
|
289
|
+
success: true,
|
|
290
|
+
excerpt: {
|
|
291
|
+
chunkId,
|
|
292
|
+
codebaseId,
|
|
293
|
+
filePath: chunk.filePath,
|
|
294
|
+
lineRange: chunk.lineRange,
|
|
295
|
+
symbol: chunk.symbol,
|
|
296
|
+
language: chunk.language,
|
|
297
|
+
text: lines.join('\n'),
|
|
298
|
+
truncated: lines.length < chunk.snippet.split(/\r?\n/).length,
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
router.post('/codebases/:id/reindex', (0, codebaseScopes_1.requireCodebaseScope)('codebase:manage'), (req, res) => {
|
|
303
|
+
const codebaseId = routeParam(req.params.id);
|
|
304
|
+
const ref = registry.get(codebaseId);
|
|
305
|
+
if (!ref) {
|
|
306
|
+
return res.status(404).json({ success: false, error: `Codebase '${codebaseId}' not found` });
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
const result = ref.kind === 'kernel_source'
|
|
310
|
+
? kernelSourceIngester.ingest(codebaseId, req.body ?? {})
|
|
311
|
+
: ref.kind === 'aosp'
|
|
312
|
+
? aospSourceIngester.ingest(codebaseId, req.body ?? {})
|
|
313
|
+
: appSourceIngester.ingest(codebaseId, req.body ?? {});
|
|
314
|
+
res.json({ success: true, result });
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
res.status(400).json({
|
|
318
|
+
success: false,
|
|
319
|
+
error: error instanceof Error ? error.message : String(error),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
router.get('/codebases/:id/audit', (0, codebaseScopes_1.requireCodebaseScope)('codebase:read'), (req, res) => {
|
|
324
|
+
const codebaseId = routeParam(req.params.id);
|
|
325
|
+
const ref = registry.get(codebaseId);
|
|
326
|
+
if (!ref) {
|
|
327
|
+
return res.status(404).json({ success: false, error: `Codebase '${codebaseId}' not found` });
|
|
328
|
+
}
|
|
329
|
+
res.json({
|
|
330
|
+
success: true,
|
|
331
|
+
audit: {
|
|
332
|
+
codebaseId: ref.codebaseId,
|
|
333
|
+
kind: ref.kind,
|
|
334
|
+
indexGeneration: ref.indexGeneration,
|
|
335
|
+
lastIngestAt: ref.lastIngestAt,
|
|
336
|
+
lastIngestStatus: ref.lastIngestStatus,
|
|
337
|
+
lastIngestError: ref.lastIngestError,
|
|
338
|
+
chunkCount: ref.chunkCount ?? 0,
|
|
339
|
+
blockedFileCount: ref.blockedFileCount ?? 0,
|
|
340
|
+
redactionHitCount: ref.redactionHitCount ?? 0,
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
});
|
|
89
344
|
return router;
|
|
90
345
|
}
|
|
91
346
|
const ragAdminRoutes = createRagAdminRoutes();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ragAdminRoutes.js","sourceRoot":"","sources":["../../src/routes/ragAdminRoutes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ragAdminRoutes.js","sourceRoot":"","sources":["../../src/routes/ragAdminRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,14 @@ function printUsage() {
|
|
|
33
33
|
console.log(' --max-rounds <number> Analysis max rounds (default: 3)');
|
|
34
34
|
console.log(' --confidence-threshold <number> Analysis confidence threshold (default: 0.5)');
|
|
35
35
|
console.log(' --mode <fast|full|auto> Override analysisMode sent to backend (default: unset → classifier)');
|
|
36
|
+
console.log(' --code-aware <off|metadata_only|provider_send>');
|
|
37
|
+
console.log(' Forward codeAwareMode to the backend');
|
|
38
|
+
console.log(' --codebase-id <id> Registered codebase id to expose; repeatable');
|
|
39
|
+
console.log(' --require-code-ref Require source-level code refs in conclusion/analysis_completed text');
|
|
40
|
+
console.log(' --require-text <text> Require literal text in conclusion/analysis_completed; repeatable');
|
|
41
|
+
console.log(' --forbid-text <text> Forbid literal text in conclusion/analysis_completed; repeatable');
|
|
42
|
+
console.log(' --require-tool <name> Require an agent_task_dispatched tool call; repeatable');
|
|
43
|
+
console.log(' --allow-no-data-envelopes Do not require data envelopes in full mode');
|
|
36
44
|
console.log(' --output <path> JSON report output path');
|
|
37
45
|
console.log(' --require-conclusion-evidence Fail unless analysis_completed conclusion has concrete evidence refs');
|
|
38
46
|
console.log(' --keep-session Do not delete session after verification');
|
|
@@ -49,6 +57,12 @@ function parseArgs(argv) {
|
|
|
49
57
|
keepSession: false,
|
|
50
58
|
keepTrace: false,
|
|
51
59
|
requireConclusionEvidence: false,
|
|
60
|
+
codebaseIds: [],
|
|
61
|
+
requireCodeRef: false,
|
|
62
|
+
requiredText: [],
|
|
63
|
+
forbiddenText: [],
|
|
64
|
+
allowNoDataEnvelopes: false,
|
|
65
|
+
requiredTools: [],
|
|
52
66
|
};
|
|
53
67
|
for (let i = 0; i < argv.length; i += 1) {
|
|
54
68
|
const arg = argv[i];
|
|
@@ -69,6 +83,14 @@ function parseArgs(argv) {
|
|
|
69
83
|
options.requireConclusionEvidence = true;
|
|
70
84
|
continue;
|
|
71
85
|
}
|
|
86
|
+
if (arg === '--require-code-ref') {
|
|
87
|
+
options.requireCodeRef = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (arg === '--allow-no-data-envelopes') {
|
|
91
|
+
options.allowNoDataEnvelopes = true;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
72
94
|
if (arg === '--trace') {
|
|
73
95
|
if (!next) {
|
|
74
96
|
throw new Error('--trace requires a value');
|
|
@@ -132,6 +154,49 @@ function parseArgs(argv) {
|
|
|
132
154
|
i += 1;
|
|
133
155
|
continue;
|
|
134
156
|
}
|
|
157
|
+
if (arg === '--code-aware') {
|
|
158
|
+
if (!next) {
|
|
159
|
+
throw new Error('--code-aware requires a value');
|
|
160
|
+
}
|
|
161
|
+
if (next !== 'off' && next !== 'metadata_only' && next !== 'provider_send') {
|
|
162
|
+
throw new Error(`Invalid --code-aware value: ${next} (expected off|metadata_only|provider_send)`);
|
|
163
|
+
}
|
|
164
|
+
options.codeAwareMode = next;
|
|
165
|
+
i += 1;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (arg === '--codebase-id') {
|
|
169
|
+
if (!next) {
|
|
170
|
+
throw new Error('--codebase-id requires a value');
|
|
171
|
+
}
|
|
172
|
+
options.codebaseIds.push(next);
|
|
173
|
+
i += 1;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (arg === '--require-text') {
|
|
177
|
+
if (!next) {
|
|
178
|
+
throw new Error('--require-text requires a value');
|
|
179
|
+
}
|
|
180
|
+
options.requiredText.push(next);
|
|
181
|
+
i += 1;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (arg === '--forbid-text') {
|
|
185
|
+
if (!next) {
|
|
186
|
+
throw new Error('--forbid-text requires a value');
|
|
187
|
+
}
|
|
188
|
+
options.forbiddenText.push(next);
|
|
189
|
+
i += 1;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (arg === '--require-tool') {
|
|
193
|
+
if (!next) {
|
|
194
|
+
throw new Error('--require-tool requires a value');
|
|
195
|
+
}
|
|
196
|
+
options.requiredTools.push(next);
|
|
197
|
+
i += 1;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
135
200
|
if (arg === '--output') {
|
|
136
201
|
if (!next) {
|
|
137
202
|
throw new Error('--output requires a value');
|
|
@@ -175,6 +240,24 @@ function hasConcreteEvidenceReferences(text) {
|
|
|
175
240
|
function hasEvidenceIndex(text) {
|
|
176
241
|
return text.includes('证据表索引');
|
|
177
242
|
}
|
|
243
|
+
function hasConcreteCodeReferences(text) {
|
|
244
|
+
return /\b(?:chunkId|evidence_ref_id|source_ref)\b/i.test(text)
|
|
245
|
+
|| /\b(?:resolve_symbol|lookup_app_source)\s*\(/i.test(text)
|
|
246
|
+
|| (/\bfilePath\b/i.test(text) && /\blineRange\b/i.test(text))
|
|
247
|
+
|| /\b[\w.-]+(?:\/[\w.-]+)+\.(?:kt|java|kts|xml|cpp|cc|c|h|hpp|m|mm|swift|rs|go|py|ts|tsx|js|jsx|sql|md)(?::(?:L)?\d+(?:-\d+)?|\s+L\d+(?:-\d+)?)\b/i.test(text);
|
|
248
|
+
}
|
|
249
|
+
function recordTextChecks(summary, text, checks) {
|
|
250
|
+
for (const required of checks.requiredText) {
|
|
251
|
+
if (!summary.requiredTextMatches[required] && text.includes(required)) {
|
|
252
|
+
summary.requiredTextMatches[required] = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
for (const forbidden of checks.forbiddenText) {
|
|
256
|
+
if (!summary.forbiddenTextMatches[forbidden] && text.includes(forbidden)) {
|
|
257
|
+
summary.forbiddenTextMatches[forbidden] = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
178
261
|
function extractDataEnvelopes(parsed, parsedRecord) {
|
|
179
262
|
const candidates = [
|
|
180
263
|
parsedRecord?.envelope,
|
|
@@ -203,13 +286,15 @@ function recordConclusionEvidence(summary, text, target) {
|
|
|
203
286
|
summary.conclusionChars = Math.max(summary.conclusionChars, text.length);
|
|
204
287
|
summary.conclusionHasConcreteEvidenceRefs || (summary.conclusionHasConcreteEvidenceRefs = hasConcreteEvidenceReferences(text));
|
|
205
288
|
summary.conclusionHasEvidenceIndex || (summary.conclusionHasEvidenceIndex = hasEvidenceIndex(text));
|
|
289
|
+
summary.conclusionHasConcreteCodeRefs || (summary.conclusionHasConcreteCodeRefs = hasConcreteCodeReferences(text));
|
|
206
290
|
return;
|
|
207
291
|
}
|
|
208
292
|
summary.analysisCompletedConclusionChars = Math.max(summary.analysisCompletedConclusionChars, text.length);
|
|
209
293
|
summary.analysisCompletedHasConcreteEvidenceRefs || (summary.analysisCompletedHasConcreteEvidenceRefs = hasConcreteEvidenceReferences(text));
|
|
210
294
|
summary.analysisCompletedHasEvidenceIndex || (summary.analysisCompletedHasEvidenceIndex = hasEvidenceIndex(text));
|
|
295
|
+
summary.analysisCompletedHasConcreteCodeRefs || (summary.analysisCompletedHasConcreteCodeRefs = hasConcreteCodeReferences(text));
|
|
211
296
|
}
|
|
212
|
-
async function collectSseSummary(baseUrl, sessionId, timeoutMs) {
|
|
297
|
+
async function collectSseSummary(baseUrl, sessionId, timeoutMs, textChecks) {
|
|
213
298
|
const summary = {
|
|
214
299
|
totalEvents: 0,
|
|
215
300
|
progressCount: 0,
|
|
@@ -232,11 +317,16 @@ async function collectSseSummary(baseUrl, sessionId, timeoutMs) {
|
|
|
232
317
|
analysisCompletedConclusionChars: 0,
|
|
233
318
|
analysisCompletedHasConcreteEvidenceRefs: false,
|
|
234
319
|
analysisCompletedHasEvidenceIndex: false,
|
|
320
|
+
conclusionHasConcreteCodeRefs: false,
|
|
321
|
+
analysisCompletedHasConcreteCodeRefs: false,
|
|
322
|
+
requiredTextMatches: Object.fromEntries(textChecks.requiredText.map((text) => [text, false])),
|
|
323
|
+
forbiddenTextMatches: Object.fromEntries(textChecks.forbiddenText.map((text) => [text, false])),
|
|
235
324
|
stageNames: [],
|
|
236
325
|
stageTransitionCount: 0,
|
|
237
326
|
directSkillProgressCount: 0,
|
|
238
327
|
directSkillCompletedCount: 0,
|
|
239
328
|
directSkillFindingCount: 0,
|
|
329
|
+
toolCallCounts: {},
|
|
240
330
|
};
|
|
241
331
|
const stageNameSet = new Set();
|
|
242
332
|
const controller = new AbortController();
|
|
@@ -295,6 +385,9 @@ async function collectSseSummary(baseUrl, sessionId, timeoutMs) {
|
|
|
295
385
|
break;
|
|
296
386
|
case 'agent_task_dispatched':
|
|
297
387
|
summary.agentTaskDispatchedCount += 1;
|
|
388
|
+
if (typeof payload?.toolName === 'string') {
|
|
389
|
+
summary.toolCallCounts[payload.toolName] = (summary.toolCallCounts[payload.toolName] ?? 0) + 1;
|
|
390
|
+
}
|
|
298
391
|
break;
|
|
299
392
|
case 'agent_response':
|
|
300
393
|
summary.agentResponseCount += 1;
|
|
@@ -305,6 +398,7 @@ async function collectSseSummary(baseUrl, sessionId, timeoutMs) {
|
|
|
305
398
|
case 'conclusion':
|
|
306
399
|
summary.conclusionCount += 1;
|
|
307
400
|
if (typeof payload?.conclusion === 'string') {
|
|
401
|
+
recordTextChecks(summary, payload.conclusion, textChecks);
|
|
308
402
|
recordConclusionEvidence(summary, payload.conclusion, 'conclusion');
|
|
309
403
|
}
|
|
310
404
|
break;
|
|
@@ -338,6 +432,7 @@ async function collectSseSummary(baseUrl, sessionId, timeoutMs) {
|
|
|
338
432
|
}
|
|
339
433
|
if (event === 'analysis_completed') {
|
|
340
434
|
if (typeof payload?.conclusion === 'string') {
|
|
435
|
+
recordTextChecks(summary, payload.conclusion, textChecks);
|
|
341
436
|
recordConclusionEvidence(summary, payload.conclusion, 'analysis_completed');
|
|
342
437
|
}
|
|
343
438
|
if (typeof payload?.reportUrl === 'string') {
|
|
@@ -458,6 +553,8 @@ async function main() {
|
|
|
458
553
|
maxRounds: options.maxRounds,
|
|
459
554
|
confidenceThreshold: options.confidenceThreshold,
|
|
460
555
|
...(options.analysisMode ? { analysisMode: options.analysisMode } : {}),
|
|
556
|
+
...(options.codeAwareMode ? { codeAwareMode: options.codeAwareMode } : {}),
|
|
557
|
+
...(options.codebaseIds.length > 0 ? { codebaseIds: options.codebaseIds } : {}),
|
|
461
558
|
},
|
|
462
559
|
}),
|
|
463
560
|
});
|
|
@@ -466,7 +563,10 @@ async function main() {
|
|
|
466
563
|
throw new Error(`Analyze request failed: ${JSON.stringify(startJson)}`);
|
|
467
564
|
}
|
|
468
565
|
sessionId = startJson.sessionId;
|
|
469
|
-
const sse = await collectSseSummary(baseUrl, sessionId, options.timeoutMs
|
|
566
|
+
const sse = await collectSseSummary(baseUrl, sessionId, options.timeoutMs, {
|
|
567
|
+
requiredText: options.requiredText,
|
|
568
|
+
forbiddenText: options.forbiddenText,
|
|
569
|
+
});
|
|
470
570
|
// Quick-mode analyses skip plan submission. Architecture detection can still
|
|
471
571
|
// be emitted by the deterministic prepass before the lightweight agent path.
|
|
472
572
|
// Don't use `agentResponseCount <= 3` — quick max_turns is 5, so a well-behaved
|
|
@@ -480,7 +580,7 @@ async function main() {
|
|
|
480
580
|
hasNoSseErrors: sse.errorEvents.length === 0,
|
|
481
581
|
};
|
|
482
582
|
const fullModeChecks = {
|
|
483
|
-
hasDataEnvelopes: sse.dataEnvelopeCount > 0,
|
|
583
|
+
...(options.allowNoDataEnvelopes ? {} : { hasDataEnvelopes: sse.dataEnvelopeCount > 0 }),
|
|
484
584
|
hasPlanSubmitted: sse.planSubmittedCount > 0,
|
|
485
585
|
hasArchitectureDetected: sse.architectureDetectedCount > 0,
|
|
486
586
|
};
|
|
@@ -499,15 +599,31 @@ async function main() {
|
|
|
499
599
|
hasAnalysisCompletedConclusionEvidence: sse.analysisCompletedHasConcreteEvidenceRefs,
|
|
500
600
|
}
|
|
501
601
|
: {};
|
|
602
|
+
const codeReferenceChecks = options.requireCodeRef
|
|
603
|
+
? {
|
|
604
|
+
hasConcreteCodeReferences: sse.conclusionHasConcreteCodeRefs || sse.analysisCompletedHasConcreteCodeRefs,
|
|
605
|
+
}
|
|
606
|
+
: {};
|
|
607
|
+
const requiredTextChecks = Object.fromEntries(options.requiredText.map((text) => [`requiresText:${text}`, sse.requiredTextMatches[text] === true]));
|
|
608
|
+
const forbiddenTextChecks = Object.fromEntries(options.forbiddenText.map((text) => [`forbidsText:${text}`, sse.forbiddenTextMatches[text] !== true]));
|
|
609
|
+
const requiredToolChecks = Object.fromEntries(options.requiredTools.map((toolName) => [`requiresTool:${toolName}`, (sse.toolCallCounts[toolName] ?? 0) > 0]));
|
|
502
610
|
const checks = {
|
|
503
611
|
...requiredChecks,
|
|
504
612
|
...fullModeChecks,
|
|
505
613
|
...modeExpectationChecks,
|
|
506
614
|
...conclusionEvidenceChecks,
|
|
615
|
+
...codeReferenceChecks,
|
|
616
|
+
...requiredTextChecks,
|
|
617
|
+
...forbiddenTextChecks,
|
|
618
|
+
...requiredToolChecks,
|
|
507
619
|
};
|
|
508
620
|
const passed = Object.values(requiredChecks).every(Boolean)
|
|
509
621
|
&& Object.values(modeExpectationChecks).every(Boolean)
|
|
510
622
|
&& Object.values(conclusionEvidenceChecks).every(Boolean)
|
|
623
|
+
&& Object.values(codeReferenceChecks).every(Boolean)
|
|
624
|
+
&& Object.values(requiredTextChecks).every(Boolean)
|
|
625
|
+
&& Object.values(forbiddenTextChecks).every(Boolean)
|
|
626
|
+
&& Object.values(requiredToolChecks).every(Boolean)
|
|
511
627
|
&& (isQuickMode || Object.values(fullModeChecks).every(Boolean));
|
|
512
628
|
const sessionLogFile = findSessionLogFile(sessionId);
|
|
513
629
|
const output = {
|