@gracker/smartperfetto 1.0.14 → 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.
Files changed (175) hide show
  1. package/.env.example +16 -8
  2. package/dist/agent/core/orchestratorTypes.d.ts +10 -0
  3. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
  4. package/dist/agent/core/orchestratorTypes.js.map +1 -1
  5. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
  6. package/dist/agentOpenAI/openAiRuntime.js +11 -1
  7. package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
  8. package/dist/agentOpenAI/openAiToolAdapter.d.ts.map +1 -1
  9. package/dist/agentOpenAI/openAiToolAdapter.js +27 -2
  10. package/dist/agentOpenAI/openAiToolAdapter.js.map +1 -1
  11. package/dist/agentv3/claudeMcpServer.d.ts +15 -1
  12. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
  13. package/dist/agentv3/claudeMcpServer.js +311 -5
  14. package/dist/agentv3/claudeMcpServer.js.map +1 -1
  15. package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
  16. package/dist/agentv3/claudeRuntime.js +17 -0
  17. package/dist/agentv3/claudeRuntime.js.map +1 -1
  18. package/dist/agentv3/claudeSystemPrompt.d.ts.map +1 -1
  19. package/dist/agentv3/claudeSystemPrompt.js +9 -0
  20. package/dist/agentv3/claudeSystemPrompt.js.map +1 -1
  21. package/dist/agentv3/mcpToolRegistry.d.ts +14 -2
  22. package/dist/agentv3/mcpToolRegistry.d.ts.map +1 -1
  23. package/dist/agentv3/mcpToolRegistry.js +25 -6
  24. package/dist/agentv3/mcpToolRegistry.js.map +1 -1
  25. package/dist/agentv3/sessionStateSnapshot.d.ts +18 -0
  26. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
  27. package/dist/agentv3/types.d.ts +5 -0
  28. package/dist/agentv3/types.d.ts.map +1 -1
  29. package/dist/agentv3/types.js.map +1 -1
  30. package/dist/cli-user/bin.js +99 -1
  31. package/dist/cli-user/bin.js.map +1 -1
  32. package/dist/cli-user/commands/analyze.d.ts +3 -0
  33. package/dist/cli-user/commands/analyze.d.ts.map +1 -1
  34. package/dist/cli-user/commands/analyze.js +2 -0
  35. package/dist/cli-user/commands/analyze.js.map +1 -1
  36. package/dist/cli-user/commands/codebase.d.ts +29 -0
  37. package/dist/cli-user/commands/codebase.d.ts.map +1 -0
  38. package/dist/cli-user/commands/codebase.js +152 -0
  39. package/dist/cli-user/commands/codebase.js.map +1 -0
  40. package/dist/cli-user/commands/config.d.ts.map +1 -1
  41. package/dist/cli-user/commands/config.js +4 -1
  42. package/dist/cli-user/commands/config.js.map +1 -1
  43. package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
  44. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  45. package/dist/cli-user/services/cliAnalyzeService.js +116 -29
  46. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  47. package/dist/cli-user/services/turnRunner.d.ts +3 -0
  48. package/dist/cli-user/services/turnRunner.d.ts.map +1 -1
  49. package/dist/cli-user/services/turnRunner.js +6 -0
  50. package/dist/cli-user/services/turnRunner.js.map +1 -1
  51. package/dist/cli-user/types.d.ts +5 -0
  52. package/dist/cli-user/types.d.ts.map +1 -1
  53. package/dist/routes/agentRoutes.d.ts.map +1 -1
  54. package/dist/routes/agentRoutes.js +4 -0
  55. package/dist/routes/agentRoutes.js.map +1 -1
  56. package/dist/routes/ragAdminRoutes.d.ts +13 -24
  57. package/dist/routes/ragAdminRoutes.d.ts.map +1 -1
  58. package/dist/routes/ragAdminRoutes.js +266 -11
  59. package/dist/routes/ragAdminRoutes.js.map +1 -1
  60. package/dist/scripts/verifyAgentSseScrolling.js +119 -3
  61. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
  62. package/dist/services/aospKnowledgeIngester.d.ts +7 -0
  63. package/dist/services/aospKnowledgeIngester.d.ts.map +1 -1
  64. package/dist/services/aospKnowledgeIngester.js +19 -7
  65. package/dist/services/aospKnowledgeIngester.js.map +1 -1
  66. package/dist/services/auth/codebaseScopes.d.ts +6 -0
  67. package/dist/services/auth/codebaseScopes.d.ts.map +1 -0
  68. package/dist/services/auth/codebaseScopes.js +23 -0
  69. package/dist/services/auth/codebaseScopes.js.map +1 -0
  70. package/dist/services/codebase/codeAwareFeature.d.ts +4 -0
  71. package/dist/services/codebase/codeAwareFeature.d.ts.map +1 -0
  72. package/dist/services/codebase/codeAwareFeature.js +18 -0
  73. package/dist/services/codebase/codeAwareFeature.js.map +1 -0
  74. package/dist/services/codebase/codeLookupLedger.d.ts +37 -0
  75. package/dist/services/codebase/codeLookupLedger.d.ts.map +1 -0
  76. package/dist/services/codebase/codeLookupLedger.js +126 -0
  77. package/dist/services/codebase/codeLookupLedger.js.map +1 -0
  78. package/dist/services/codebase/codebaseRegistry.d.ts +76 -0
  79. package/dist/services/codebase/codebaseRegistry.d.ts.map +1 -0
  80. package/dist/services/codebase/codebaseRegistry.js +164 -0
  81. package/dist/services/codebase/codebaseRegistry.js.map +1 -0
  82. package/dist/services/codebase/defaultCodebaseServices.d.ts +5 -0
  83. package/dist/services/codebase/defaultCodebaseServices.d.ts.map +1 -0
  84. package/dist/services/codebase/defaultCodebaseServices.js +21 -0
  85. package/dist/services/codebase/defaultCodebaseServices.js.map +1 -0
  86. package/dist/services/codebase/patchProposer.d.ts +44 -0
  87. package/dist/services/codebase/patchProposer.d.ts.map +1 -0
  88. package/dist/services/codebase/patchProposer.js +163 -0
  89. package/dist/services/codebase/patchProposer.js.map +1 -0
  90. package/dist/services/codebase/pathSecurityGate.d.ts +33 -0
  91. package/dist/services/codebase/pathSecurityGate.d.ts.map +1 -0
  92. package/dist/services/codebase/pathSecurityGate.js +214 -0
  93. package/dist/services/codebase/pathSecurityGate.js.map +1 -0
  94. package/dist/services/htmlReportGenerator.d.ts +2 -0
  95. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  96. package/dist/services/htmlReportGenerator.js +67 -0
  97. package/dist/services/htmlReportGenerator.js.map +1 -1
  98. package/dist/services/persistAgentSession.d.ts.map +1 -1
  99. package/dist/services/persistAgentSession.js +19 -0
  100. package/dist/services/persistAgentSession.js.map +1 -1
  101. package/dist/services/rag/aospSourceIngester.d.ts +26 -0
  102. package/dist/services/rag/aospSourceIngester.d.ts.map +1 -0
  103. package/dist/services/rag/aospSourceIngester.js +143 -0
  104. package/dist/services/rag/aospSourceIngester.js.map +1 -0
  105. package/dist/services/rag/appSourceIngester.d.ts +37 -0
  106. package/dist/services/rag/appSourceIngester.d.ts.map +1 -0
  107. package/dist/services/rag/appSourceIngester.js +165 -0
  108. package/dist/services/rag/appSourceIngester.js.map +1 -0
  109. package/dist/services/rag/baseIngester.d.ts +18 -0
  110. package/dist/services/rag/baseIngester.d.ts.map +1 -0
  111. package/dist/services/rag/baseIngester.js +197 -0
  112. package/dist/services/rag/baseIngester.js.map +1 -0
  113. package/dist/services/rag/kernelSourceIngester.d.ts +35 -0
  114. package/dist/services/rag/kernelSourceIngester.d.ts.map +1 -0
  115. package/dist/services/rag/kernelSourceIngester.js +170 -0
  116. package/dist/services/rag/kernelSourceIngester.js.map +1 -0
  117. package/dist/services/rag/lookupResponseFilter.d.ts +42 -0
  118. package/dist/services/rag/lookupResponseFilter.d.ts.map +1 -0
  119. package/dist/services/rag/lookupResponseFilter.js +192 -0
  120. package/dist/services/rag/lookupResponseFilter.js.map +1 -0
  121. package/dist/services/rag/sessionToolResultRegistry.d.ts +25 -0
  122. package/dist/services/rag/sessionToolResultRegistry.d.ts.map +1 -0
  123. package/dist/services/rag/sessionToolResultRegistry.js +57 -0
  124. package/dist/services/rag/sessionToolResultRegistry.js.map +1 -0
  125. package/dist/services/rag/toolResultProjectionFilter.d.ts +18 -0
  126. package/dist/services/rag/toolResultProjectionFilter.d.ts.map +1 -0
  127. package/dist/services/rag/toolResultProjectionFilter.js +33 -0
  128. package/dist/services/rag/toolResultProjectionFilter.js.map +1 -0
  129. package/dist/services/ragStore.d.ts +8 -0
  130. package/dist/services/ragStore.d.ts.map +1 -1
  131. package/dist/services/ragStore.js +77 -8
  132. package/dist/services/ragStore.js.map +1 -1
  133. package/dist/services/rbac.d.ts +1 -1
  134. package/dist/services/rbac.d.ts.map +1 -1
  135. package/dist/services/rbac.js +6 -0
  136. package/dist/services/rbac.js.map +1 -1
  137. package/dist/services/security/codeAwareOutputRegistry.d.ts +6 -0
  138. package/dist/services/security/codeAwareOutputRegistry.d.ts.map +1 -0
  139. package/dist/services/security/codeAwareOutputRegistry.js +55 -0
  140. package/dist/services/security/codeAwareOutputRegistry.js.map +1 -0
  141. package/dist/services/security/llmEchoOutputFilter.d.ts +49 -0
  142. package/dist/services/security/llmEchoOutputFilter.d.ts.map +1 -0
  143. package/dist/services/security/llmEchoOutputFilter.js +133 -0
  144. package/dist/services/security/llmEchoOutputFilter.js.map +1 -0
  145. package/dist/services/security/secretPatterns.d.ts +6 -0
  146. package/dist/services/security/secretPatterns.d.ts.map +1 -0
  147. package/dist/services/security/secretPatterns.js +23 -0
  148. package/dist/services/security/secretPatterns.js.map +1 -0
  149. package/dist/services/symbol/breakpadSymParser.d.ts +19 -0
  150. package/dist/services/symbol/breakpadSymParser.d.ts.map +1 -0
  151. package/dist/services/symbol/breakpadSymParser.js +40 -0
  152. package/dist/services/symbol/breakpadSymParser.js.map +1 -0
  153. package/dist/services/symbol/kallsymsParser.d.ts +12 -0
  154. package/dist/services/symbol/kallsymsParser.d.ts.map +1 -0
  155. package/dist/services/symbol/kallsymsParser.js +41 -0
  156. package/dist/services/symbol/kallsymsParser.js.map +1 -0
  157. package/dist/services/symbol/r8MappingParser.d.ts +40 -0
  158. package/dist/services/symbol/r8MappingParser.d.ts.map +1 -0
  159. package/dist/services/symbol/r8MappingParser.js +99 -0
  160. package/dist/services/symbol/r8MappingParser.js.map +1 -0
  161. package/dist/services/symbol/symbolResolver.d.ts +59 -0
  162. package/dist/services/symbol/symbolResolver.d.ts.map +1 -0
  163. package/dist/services/symbol/symbolResolver.js +147 -0
  164. package/dist/services/symbol/symbolResolver.js.map +1 -0
  165. package/dist/services/symbol/traceSymbolContext.d.ts +14 -0
  166. package/dist/services/symbol/traceSymbolContext.d.ts.map +1 -0
  167. package/dist/services/symbol/traceSymbolContext.js +45 -0
  168. package/dist/services/symbol/traceSymbolContext.js.map +1 -0
  169. package/dist/types/sparkContracts.d.ts +31 -3
  170. package/dist/types/sparkContracts.d.ts.map +1 -1
  171. package/dist/types/sparkContracts.js.map +1 -1
  172. package/package.json +8 -1
  173. package/skills/composite/code_pinpoint.skill.yaml +111 -0
  174. package/strategies/code-aware.template.md +37 -0
  175. 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":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAC,MAAM,EAAE,KAAK,MAAM,IAAI,aAAa,EAAC,MAAM,SAAS,CAAC;AAG7D,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAa9C,yBAAyB;AACzB,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,aAAa,CAwDpE;AAED,QAAA,MAAM,cAAc,QAAyB,CAAC;AAC9C,eAAe,cAAc,CAAC"}
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 chunk = s.getChunk(req.params.chunkId, scope);
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 '${req.params.chunkId}' not found`,
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 removed = s.removeChunk(req.params.chunkId, scope);
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 '${req.params.chunkId}' not found`,
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 = {