@straiffi/archon 1.8.6 → 1.8.7

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 (165) hide show
  1. package/dist/client/assets/ActivityView-D4Qh96zr.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-Bg03OmVv.js +1 -0
  3. package/dist/client/assets/RepositoryGraphDialog-CS_hOqPw.js +1 -0
  4. package/dist/client/assets/VerificationDialog-BYH-Ek8n.js +4 -0
  5. package/dist/client/assets/{arc-D2Nn9xIj.js → arc-C83vRtlz.js} +1 -1
  6. package/dist/client/assets/architecture-7EHR7CIX-Dm8H7N6Z.js +1 -0
  7. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BH5LLK54.js → architectureDiagram-3BPJPVTR-2lxabjSl.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-GPEHLZMM-xOxShPwZ.js → blockDiagram-GPEHLZMM-C80HvJmb.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-AAUBKEIU-BXMrXnKR.js → c4Diagram-AAUBKEIU-BM3k_lKz.js} +1 -1
  10. package/dist/client/assets/channel-HjENOCZ0.js +1 -0
  11. package/dist/client/assets/{chunk-2J33WTMH-BdDEtNMz.js → chunk-2J33WTMH-BTk3lX07.js} +1 -1
  12. package/dist/client/assets/{chunk-3OPIFGDE-PtSkTtIU.js → chunk-3OPIFGDE-DAxdBZ_4.js} +1 -1
  13. package/dist/client/assets/{chunk-4BX2VUAB-CtLS8D71.js → chunk-4BX2VUAB-C5pU9ApX.js} +1 -1
  14. package/dist/client/assets/{chunk-4EGX6M5U-Btnm0QNe.js → chunk-4EGX6M5U-CAjWPjND.js} +1 -1
  15. package/dist/client/assets/{chunk-55IACEB6-74CcJaub.js → chunk-55IACEB6-DhO4-AG4.js} +1 -1
  16. package/dist/client/assets/{chunk-5DO6E6H7-WLZ8L4ko.js → chunk-5DO6E6H7-BDKA-zHS.js} +1 -1
  17. package/dist/client/assets/{chunk-5ZQYHXKU-D5PYP24m.js → chunk-5ZQYHXKU-BYm9s62a.js} +1 -1
  18. package/dist/client/assets/{chunk-727SXJPM-gDX0xZh1.js → chunk-727SXJPM-iVUM8xuV.js} +1 -1
  19. package/dist/client/assets/{chunk-AQP2D5EJ-Bat82lQQ.js → chunk-AQP2D5EJ-DVM7riMJ.js} +1 -1
  20. package/dist/client/assets/{chunk-BR22UD5L-Cou5beGe.js → chunk-BR22UD5L-12D2GWh4.js} +1 -1
  21. package/dist/client/assets/{chunk-BSJP7CBP-DJ57XcV5.js → chunk-BSJP7CBP-DMi77e84.js} +1 -1
  22. package/dist/client/assets/{chunk-CSCIHK7Q-D3sau006.js → chunk-CSCIHK7Q-_D1FzP9B.js} +2 -2
  23. package/dist/client/assets/{chunk-FHYWG6QK-Ba10e2kj.js → chunk-FHYWG6QK-BhSajKiB.js} +1 -1
  24. package/dist/client/assets/{chunk-FMBD7UC4-CEo2wZMx.js → chunk-FMBD7UC4-Drmlc0wM.js} +1 -1
  25. package/dist/client/assets/{chunk-KSCS5N6A-CqEcB7Dr.js → chunk-KSCS5N6A-D3XouAHf.js} +1 -1
  26. package/dist/client/assets/{chunk-L5ZTLDWV-TRTuwXsF.js → chunk-L5ZTLDWV-B7NYWgT4.js} +1 -1
  27. package/dist/client/assets/{chunk-LZXEDZCA-DdpNmv37.js → chunk-LZXEDZCA-Dgkkbb6A.js} +2 -2
  28. package/dist/client/assets/{chunk-MPE355IW-MqEt-J8G.js → chunk-MPE355IW-Cw8YmjTC.js} +1 -1
  29. package/dist/client/assets/{chunk-MZUSXYTE-DdNi9lhx.js → chunk-MZUSXYTE-jvxRCZ7x.js} +1 -1
  30. package/dist/client/assets/{chunk-N66VUXT2-CjemTW4E.js → chunk-N66VUXT2-00i4y0yD.js} +1 -1
  31. package/dist/client/assets/{chunk-ND2GUHAM-BCUL9zWr.js → chunk-ND2GUHAM-CzO1oVCi.js} +1 -1
  32. package/dist/client/assets/{chunk-NZK2D7GU-BAxuwE_2.js → chunk-NZK2D7GU-re0VVZne.js} +1 -1
  33. package/dist/client/assets/{chunk-O5CBEL6O-Cttpc9yf.js → chunk-O5CBEL6O-BwsS59iy.js} +1 -1
  34. package/dist/client/assets/{chunk-PUPMXCY4-ZvwTw0To.js → chunk-PUPMXCY4-DfWourL7.js} +1 -1
  35. package/dist/client/assets/chunk-QZHKN3VN-CtbsU1Bj.js +1 -0
  36. package/dist/client/assets/{chunk-UIBZB4QT-BTY9be9s.js → chunk-UIBZB4QT-v-a5ZfN6.js} +1 -1
  37. package/dist/client/assets/{chunk-WCWK7LTN-Db1n3n3-.js → chunk-WCWK7LTN-CtYzhvvb.js} +1 -1
  38. package/dist/client/assets/chunk-WU5MYG2G-CLyh-xCA.js +1 -0
  39. package/dist/client/assets/{chunk-XPW4576I-DObFPxjB.js → chunk-XPW4576I-CvnAuXH2.js} +1 -1
  40. package/dist/client/assets/classDiagram-4FO5ZUOK-DnhdaVrK.js +1 -0
  41. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C-BjeSGJ.js +1 -0
  42. package/dist/client/assets/{cose-bilkent-S5V4N54A-MlOPiG6P.js → cose-bilkent-S5V4N54A-fchD-dH2.js} +1 -1
  43. package/dist/client/assets/{dagre-BM42HDAG-BTsZ2dQI.js → dagre-BM42HDAG-x71fYlqQ.js} +1 -1
  44. package/dist/client/assets/{dagre-BWNHuDdf.js → dagre-DSrzm-Gq.js} +1 -1
  45. package/dist/client/assets/{diagram-2AECGRRQ-afPu4kp4.js → diagram-2AECGRRQ-CMdwzuYj.js} +1 -1
  46. package/dist/client/assets/{diagram-5GNKFQAL-SixbJGPN.js → diagram-5GNKFQAL-B3l6I4qJ.js} +1 -1
  47. package/dist/client/assets/{diagram-KO2AKTUF-Dk1670ag.js → diagram-KO2AKTUF-BNhypLBW.js} +1 -1
  48. package/dist/client/assets/{diagram-LMA3HP47-BDNhjRaO.js → diagram-LMA3HP47-CmrhbiDt.js} +1 -1
  49. package/dist/client/assets/{diagram-OG6HWLK6-BLowQCLY.js → diagram-OG6HWLK6-CRobDMLl.js} +1 -1
  50. package/dist/client/assets/{erDiagram-TEJ5UH35-DAg9kUbm.js → erDiagram-TEJ5UH35-CqO7K0TS.js} +1 -1
  51. package/dist/client/assets/eventmodeling-FCH6USID-BWhw0UJ8.js +1 -0
  52. package/dist/client/assets/{flowDiagram-I6XJVG4X-BsaPmiIS.js → flowDiagram-I6XJVG4X-CuLTJZU0.js} +1 -1
  53. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DfF1TT-s.js → ganttDiagram-6RSMTGT7-Bm7v1eRG.js} +1 -1
  54. package/dist/client/assets/gitGraph-WXDBUCRP-BSnxAa1J.js +1 -0
  55. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CEvTiN6n.js → gitGraphDiagram-PVQCEYII-CNHZr-5i.js} +1 -1
  56. package/dist/client/assets/index-Bs5SQZhz.css +2 -0
  57. package/dist/client/assets/index-LGNsdNYM.js +274 -0
  58. package/dist/client/assets/info-J43DQDTF-DcFwF1-h.js +1 -0
  59. package/dist/client/assets/{infoDiagram-5YYISTIA-CBjYYrzJ.js → infoDiagram-5YYISTIA-z27pUr2X.js} +1 -1
  60. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BuCkp1uL.js → ishikawaDiagram-YF4QCWOH-CDocZ0jf.js} +1 -1
  61. package/dist/client/assets/{journeyDiagram-JHISSGLW-DkUPCxT5.js → journeyDiagram-JHISSGLW-CgP31lsU.js} +1 -1
  62. package/dist/client/assets/{kanban-definition-UN3LZRKU-CXwNZ0Fa.js → kanban-definition-UN3LZRKU-DxTm1_fc.js} +1 -1
  63. package/dist/client/assets/{line-CRTZgJXA.js → line-hrZ7m44_.js} +1 -1
  64. package/dist/client/assets/{linear-DT4rSZvy.js → linear-BOwW57yX.js} +1 -1
  65. package/dist/client/assets/{mermaid-parser.core-NTByLn30.js → mermaid-parser.core-BThJAIK-.js} +2 -2
  66. package/dist/client/assets/{mermaid.core-DszsB_Gl.js → mermaid.core-CfVyP_kK.js} +3 -3
  67. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DCrqCcPX.js → mindmap-definition-RKZ34NQL-CuISnLgW.js} +1 -1
  68. package/dist/client/assets/{ordinal-k--hYEme.js → ordinal-CZ33lFpK.js} +1 -1
  69. package/dist/client/assets/packet-YPE3B663-1VZiO_9r.js +1 -0
  70. package/dist/client/assets/pie-LRSECV5Y-BX1-tQCu.js +1 -0
  71. package/dist/client/assets/{pieDiagram-4H26LBE5-CbHeTKto.js → pieDiagram-4H26LBE5-DnWAdd44.js} +1 -1
  72. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Ptpkh0Dc.js → quadrantDiagram-W4KKPZXB-Cb-RVl5A.js} +1 -1
  73. package/dist/client/assets/radar-GUYGQ44K-B2HRrCR4.js +1 -0
  74. package/dist/client/assets/{requirementDiagram-4Y6WPE33-73PM-Ae5.js → requirementDiagram-4Y6WPE33-DrXg_gCS.js} +1 -1
  75. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-B7RCxzNy.js → sankeyDiagram-5OEKKPKP-DzZjp_ZP.js} +1 -1
  76. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DGXfHCo0.js → sequenceDiagram-3UESZ5HK-CQJ3PhQD.js} +1 -1
  77. package/dist/client/assets/{stateDiagram-AJRCARHV-Cl0_SVL3.js → stateDiagram-AJRCARHV-B16j9pg1.js} +1 -1
  78. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-vNiFfHwm.js +1 -0
  79. package/dist/client/assets/{timeline-definition-PNZ67QCA-Cufq-wYg.js → timeline-definition-PNZ67QCA-bUG3mZQt.js} +1 -1
  80. package/dist/client/assets/treeView-BLDUP644-CDfUVbUi.js +1 -0
  81. package/dist/client/assets/treemap-LRROVOQU-DUWqu8sK.js +1 -0
  82. package/dist/client/assets/{vennDiagram-CIIHVFJN-ROVZhhP-.js → vennDiagram-CIIHVFJN-DALCJcZD.js} +1 -1
  83. package/dist/client/assets/wardley-L42UT6IY-BEFuPUCy.js +1 -0
  84. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-DlHRfLPH.js → wardleyDiagram-YWT4CUSO-DPQd3l9A.js} +1 -1
  85. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DW-KpRbf.js → xychartDiagram-2RQKCTM6-BIv1FqXG.js} +1 -1
  86. package/dist/client/index.html +2 -2
  87. package/dist/server/db.js +399 -0
  88. package/dist/server/db.js.map +1 -1
  89. package/dist/server/index.js +65 -10
  90. package/dist/server/index.js.map +1 -1
  91. package/dist/server/lib/agent.js +9 -6
  92. package/dist/server/lib/agent.js.map +1 -1
  93. package/dist/server/lib/checkWorkspaceIdentity.js +2 -206
  94. package/dist/server/lib/checkWorkspaceIdentity.js.map +1 -1
  95. package/dist/server/lib/executionReconciliation.js +73 -0
  96. package/dist/server/lib/executionReconciliation.js.map +1 -1
  97. package/dist/server/lib/integrations/github.js +10 -1
  98. package/dist/server/lib/integrations/github.js.map +1 -1
  99. package/dist/server/lib/postBuildChecks.js +20 -12
  100. package/dist/server/lib/postBuildChecks.js.map +1 -1
  101. package/dist/server/lib/repositoryGraphAnalyzer.js +392 -0
  102. package/dist/server/lib/repositoryGraphAnalyzer.js.map +1 -0
  103. package/dist/server/lib/repositoryGraphGitHistory.js +371 -0
  104. package/dist/server/lib/repositoryGraphGitHistory.js.map +1 -0
  105. package/dist/server/lib/repositoryGraphIdentity.js +134 -0
  106. package/dist/server/lib/repositoryGraphIdentity.js.map +1 -0
  107. package/dist/server/lib/repositoryGraphManifest.js +386 -0
  108. package/dist/server/lib/repositoryGraphManifest.js.map +1 -0
  109. package/dist/server/lib/repositoryGraphQueries.js +370 -0
  110. package/dist/server/lib/repositoryGraphQueries.js.map +1 -0
  111. package/dist/server/lib/repositoryGraphRetention.js +104 -0
  112. package/dist/server/lib/repositoryGraphRetention.js.map +1 -0
  113. package/dist/server/lib/repositoryGraphRoutes.js +145 -0
  114. package/dist/server/lib/repositoryGraphRoutes.js.map +1 -0
  115. package/dist/server/lib/repositoryGraphScan.js +370 -0
  116. package/dist/server/lib/repositoryGraphScan.js.map +1 -0
  117. package/dist/server/lib/repositoryGraphStore.js +352 -0
  118. package/dist/server/lib/repositoryGraphStore.js.map +1 -0
  119. package/dist/server/lib/repositoryGraphTargets.js +30 -0
  120. package/dist/server/lib/repositoryGraphTargets.js.map +1 -0
  121. package/dist/server/lib/repositoryGraphTypeScript.js +288 -0
  122. package/dist/server/lib/repositoryGraphTypeScript.js.map +1 -0
  123. package/dist/server/lib/terminal.js +25 -1
  124. package/dist/server/lib/terminal.js.map +1 -1
  125. package/dist/server/lib/types.js +1 -0
  126. package/dist/server/lib/types.js.map +1 -1
  127. package/dist/server/lib/workspaceIdentity.js +433 -0
  128. package/dist/server/lib/workspaceIdentity.js.map +1 -0
  129. package/dist/server/workers/plan.js +9 -7
  130. package/dist/server/workers/plan.js.map +1 -1
  131. package/dist/server/workers/repositoryGraphAnalyzer.js +282 -0
  132. package/dist/server/workers/repositoryGraphAnalyzer.js.map +1 -0
  133. package/package.json +2 -1
  134. package/dist/client/assets/ActivityView-DDeEQgbm.js +0 -1
  135. package/dist/client/assets/GitHubActionsDialog-DH-B_LR3.js +0 -1
  136. package/dist/client/assets/VerificationDialog-x43F7tbo.js +0 -4
  137. package/dist/client/assets/architecture-7EHR7CIX-C-4Cp4ml.js +0 -1
  138. package/dist/client/assets/channel-C0dk5Jiy.js +0 -1
  139. package/dist/client/assets/chunk-QZHKN3VN-LI_RZca2.js +0 -1
  140. package/dist/client/assets/chunk-WU5MYG2G-620NtSlY.js +0 -1
  141. package/dist/client/assets/classDiagram-4FO5ZUOK-C5ptkk7I.js +0 -1
  142. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFuXUVOx.js +0 -1
  143. package/dist/client/assets/eventmodeling-FCH6USID-Dqb6QKoI.js +0 -1
  144. package/dist/client/assets/gitGraph-WXDBUCRP-DYEsqh93.js +0 -1
  145. package/dist/client/assets/index-B5TSPCJr.css +0 -2
  146. package/dist/client/assets/index-DV0vl670.js +0 -274
  147. package/dist/client/assets/info-J43DQDTF-CfjXFZai.js +0 -1
  148. package/dist/client/assets/packet-YPE3B663-Dv0HkRHU.js +0 -1
  149. package/dist/client/assets/pie-LRSECV5Y-S5zPzZFN.js +0 -1
  150. package/dist/client/assets/radar-GUYGQ44K-B7psLv22.js +0 -1
  151. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CqzC1yAT.js +0 -1
  152. package/dist/client/assets/treeView-BLDUP644-B8H0kT67.js +0 -1
  153. package/dist/client/assets/treemap-LRROVOQU-DPLhFHnh.js +0 -1
  154. package/dist/client/assets/wardley-L42UT6IY-B5-Vb08V.js +0 -1
  155. /package/dist/client/assets/{array-BNor45A1.js → array-B2f2amhX.js} +0 -0
  156. /package/dist/client/assets/{chunk-NNHCCRGN-CZB-V-Gv.js → chunk-NNHCCRGN-DgKrp8T-.js} +0 -0
  157. /package/dist/client/assets/{cytoscape.esm-B2lJcMSI.js → cytoscape.esm-BInZCgaJ.js} +0 -0
  158. /package/dist/client/assets/{defaultLocale-DPzUsThw.js → defaultLocale-sPXJ5urm.js} +0 -0
  159. /package/dist/client/assets/{dist-CERhmQhR.js → dist-DfHDMDTt.js} +0 -0
  160. /package/dist/client/assets/{graphlib-BHOW-eWz.js → graphlib-DacNv4Jd.js} +0 -0
  161. /package/dist/client/assets/{init-C0L3woqb.js → init-BVCnG1lj.js} +0 -0
  162. /package/dist/client/assets/{katex-CpjQsUQe.js → katex-BlkrXOwm.js} +0 -0
  163. /package/dist/client/assets/{path-sMK4d_s9.js → path-Bw5AvBNC.js} +0 -0
  164. /package/dist/client/assets/{rough.esm-BoTisKeL.js → rough.esm-DeLgKbOI.js} +0 -0
  165. /package/dist/client/assets/{src-BRjoYtUW.js → src-CFGsdLiG.js} +0 -0
@@ -0,0 +1,352 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import db from '../db.js';
3
+ import { REPOSITORY_GRAPH_ANALYZER_VERSION, REPOSITORY_GRAPH_SCHEMA_VERSION, } from './repositoryGraphAnalyzer.js';
4
+ export const MAX_REPOSITORY_GRAPH_NODES = 30_000;
5
+ export const MAX_REPOSITORY_GRAPH_EDGES = 150_000;
6
+ export const MAX_REPOSITORY_GRAPH_DIAGNOSTICS = 2_000;
7
+ export const hasActiveBundleRepositoryGraphScan = (projectId, bundleId) => Boolean(db.prepare(`
8
+ SELECT 1
9
+ FROM repository_graph_scans
10
+ WHERE project_id = ? AND target_key = ? AND status IN ('pending', 'running')
11
+ LIMIT 1
12
+ `).get(projectId, `bundle:${bundleId}`));
13
+ const serializeScan = (row) => ({
14
+ ...row,
15
+ manifest_truncated: Boolean(row.manifest_truncated),
16
+ typescript_truncated: Boolean(row.typescript_truncated),
17
+ history_truncated: Boolean(row.history_truncated),
18
+ nodes_truncated: Boolean(row.nodes_truncated),
19
+ edges_truncated: Boolean(row.edges_truncated),
20
+ diagnostics_truncated: Boolean(row.diagnostics_truncated),
21
+ });
22
+ const serializeNode = (row) => ({
23
+ id: row.id,
24
+ kind: row.kind,
25
+ path: row.path,
26
+ name: row.name,
27
+ fileKind: row.file_kind,
28
+ language: row.language,
29
+ isTest: Boolean(row.is_test),
30
+ testClassification: row.test_classification,
31
+ });
32
+ const serializeEdge = (row) => ({
33
+ id: row.id,
34
+ source: row.source_node_id,
35
+ target: row.target_node_id,
36
+ kind: row.kind,
37
+ evidence: row.evidence_class,
38
+ detail: row.detail,
39
+ });
40
+ const targetKey = (identity) => identity.components.target.kind === 'repo_root'
41
+ ? 'repo_root'
42
+ : `bundle:${identity.components.target.bundle_id}`;
43
+ const getScanRow = (projectId, scanId) => db.prepare(`
44
+ SELECT * FROM repository_graph_scans WHERE id = ? AND project_id = ?
45
+ `).get(scanId, projectId);
46
+ export const getRepositoryGraphScan = (projectId, scanId) => {
47
+ const row = getScanRow(projectId, scanId);
48
+ return row ? serializeScan(row) : null;
49
+ };
50
+ export const getRepositoryGraphScanByExecutionRun = (projectId, executionRunId) => {
51
+ const row = db.prepare(`
52
+ SELECT * FROM repository_graph_scans WHERE project_id = ? AND execution_run_id = ?
53
+ `).get(projectId, executionRunId);
54
+ return row ? serializeScan(row) : null;
55
+ };
56
+ export const hasActiveProjectRepositoryGraphScan = (projectId) => Boolean(db.prepare(`
57
+ SELECT 1 FROM repository_graph_scans
58
+ WHERE project_id = ? AND status IN ('pending', 'running')
59
+ LIMIT 1
60
+ `).get(projectId));
61
+ export const getLatestRepositoryGraphScanForTarget = (projectId, target) => {
62
+ const key = target.kind === 'repo_root' ? 'repo_root' : `bundle:${target.bundle_id}`;
63
+ const row = db.prepare(`
64
+ SELECT * FROM repository_graph_scans
65
+ WHERE project_id = ? AND target_key = ?
66
+ ORDER BY scan_sequence DESC
67
+ LIMIT 1
68
+ `).get(projectId, key);
69
+ return row ? serializeScan(row) : null;
70
+ };
71
+ export const getRepositoryGraphNodesByPath = (projectId, scanId, path) => {
72
+ const rows = db.prepare(`
73
+ SELECT id, kind, path, name, file_kind, language, is_test, test_classification
74
+ FROM repository_graph_nodes
75
+ WHERE project_id = ? AND scan_id = ? AND path = ?
76
+ ORDER BY id
77
+ `).all(projectId, scanId, path);
78
+ return rows.map(serializeNode);
79
+ };
80
+ export const getRepositoryGraphNodesByIds = (projectId, scanId, nodeIds) => {
81
+ if (nodeIds.length === 0) {
82
+ return [];
83
+ }
84
+ const placeholders = nodeIds.map(() => '?').join(', ');
85
+ const rows = db.prepare(`
86
+ SELECT id, kind, path, name, file_kind, language, is_test, test_classification
87
+ FROM repository_graph_nodes
88
+ WHERE project_id = ? AND scan_id = ? AND id IN (${placeholders})
89
+ `).all(projectId, scanId, ...nodeIds);
90
+ return rows.map(serializeNode);
91
+ };
92
+ export const getRepositoryGraphEdgesForNodes = (projectId, scanId, nodeIds, direction, limit) => {
93
+ if (nodeIds.length === 0) {
94
+ return [];
95
+ }
96
+ const column = direction === 'incoming' ? 'target_node_id' : 'source_node_id';
97
+ const oppositeColumn = direction === 'incoming' ? 'source_node_id' : 'target_node_id';
98
+ const placeholders = nodeIds.map(() => '?').join(', ');
99
+ const rows = db.prepare(`
100
+ SELECT id, source_node_id, target_node_id, kind, evidence_class, detail
101
+ FROM repository_graph_edges
102
+ WHERE project_id = ? AND scan_id = ?
103
+ AND (${column} IN (${placeholders})
104
+ OR (kind = 'co_changes' AND ${oppositeColumn} IN (${placeholders})))
105
+ ORDER BY id
106
+ LIMIT ?
107
+ `).all(projectId, scanId, ...nodeIds, ...nodeIds, limit);
108
+ return rows.map(serializeEdge);
109
+ };
110
+ export const getRepositoryGraphEdge = (projectId, scanId, edgeId) => {
111
+ const row = db.prepare(`
112
+ SELECT id, source_node_id, target_node_id, kind, evidence_class, detail
113
+ FROM repository_graph_edges
114
+ WHERE project_id = ? AND scan_id = ? AND id = ?
115
+ `).get(projectId, scanId, edgeId);
116
+ return row ? serializeEdge(row) : null;
117
+ };
118
+ export const listRepositoryGraphDiagnostics = (projectId, scanId, limit) => {
119
+ const rows = db.prepare(`
120
+ SELECT sequence, code, severity, message, path
121
+ FROM repository_graph_diagnostics
122
+ WHERE project_id = ? AND scan_id = ?
123
+ ORDER BY sequence
124
+ LIMIT ?
125
+ `).all(projectId, scanId, limit);
126
+ return rows.map(({ sequence: _sequence, ...diagnostic }) => diagnostic);
127
+ };
128
+ export const listRepositoryGraphEvidenceClasses = (projectId, scanId) => {
129
+ const rows = db.prepare(`
130
+ SELECT DISTINCT evidence_class
131
+ FROM repository_graph_edges
132
+ WHERE project_id = ? AND scan_id = ?
133
+ ORDER BY evidence_class
134
+ `).all(projectId, scanId);
135
+ return rows.map(row => row.evidence_class);
136
+ };
137
+ export const bindRepositoryGraphScanExecutionRun = (projectId, scanId, executionRunId) => {
138
+ const changes = db.prepare(`
139
+ UPDATE repository_graph_scans
140
+ SET execution_run_id = ?, updated_at = CURRENT_TIMESTAMP
141
+ WHERE id = ? AND project_id = ? AND status = 'pending' AND execution_run_id IS NULL
142
+ AND EXISTS (
143
+ SELECT 1 FROM execution_runs
144
+ WHERE execution_runs.id = ?
145
+ AND execution_runs.project_id = repository_graph_scans.project_id
146
+ AND execution_runs.kind = 'repository_graph_scan'
147
+ )
148
+ `).run(executionRunId, scanId, projectId, executionRunId).changes;
149
+ return changes > 0 ? getRepositoryGraphScan(projectId, scanId) : null;
150
+ };
151
+ const findReusableRow = (identity) => {
152
+ const identityJson = JSON.stringify(identity.components);
153
+ return db.prepare(`
154
+ SELECT *
155
+ FROM repository_graph_scans
156
+ WHERE project_id = ? AND target_key = ? AND identity_fingerprint = ?
157
+ AND identity_json = ? AND status = 'completed'
158
+ AND graph_schema_version = ? AND analyzer_version = ?
159
+ ORDER BY scan_sequence DESC
160
+ LIMIT 1
161
+ `).get(identity.components.projectId, targetKey(identity), identity.fingerprint, identityJson, REPOSITORY_GRAPH_SCHEMA_VERSION, REPOSITORY_GRAPH_ANALYZER_VERSION);
162
+ };
163
+ export const findReusableRepositoryGraphScan = (identity) => {
164
+ const row = findReusableRow(identity);
165
+ return row ? serializeScan(row) : null;
166
+ };
167
+ const admitTransaction = db.transaction((identity) => {
168
+ const components = identity.components;
169
+ if (!db.prepare('SELECT 1 FROM projects WHERE id = ? AND deletion_started_at IS NULL').get(components.projectId)) {
170
+ throw new Error('Repository graph project is unavailable');
171
+ }
172
+ const reusable = findReusableRow(identity);
173
+ if (reusable) {
174
+ return { state: 'reused', scan: serializeScan(reusable) };
175
+ }
176
+ const id = randomUUID();
177
+ const identityJson = JSON.stringify(components);
178
+ const sequence = db.prepare(`
179
+ UPDATE repository_graph_scan_sequence
180
+ SET next_value = next_value + 1
181
+ WHERE singleton = 1
182
+ RETURNING next_value - 1 AS scan_sequence
183
+ `).get();
184
+ if (!sequence) {
185
+ throw new Error('Repository graph scan sequence could not be allocated');
186
+ }
187
+ try {
188
+ db.prepare(`
189
+ INSERT INTO repository_graph_scans (
190
+ id, scan_sequence, project_id, target_kind, target_bundle_id, target_key,
191
+ identity_fingerprint, identity_json, graph_schema_version,
192
+ analyzer_version, analyzer_configuration_json
193
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
194
+ `).run(id, sequence.scan_sequence, components.projectId, components.target.kind, components.target.bundle_id, targetKey(identity), identity.fingerprint, identityJson, components.graphSchemaVersion, components.analyzerVersion, JSON.stringify(components.analyzerConfiguration));
195
+ }
196
+ catch (error) {
197
+ const code = error.code;
198
+ if (code !== 'SQLITE_CONSTRAINT_UNIQUE') {
199
+ throw error;
200
+ }
201
+ const active = db.prepare(`
202
+ SELECT * FROM repository_graph_scans
203
+ WHERE project_id = ? AND target_key = ? AND status IN ('pending', 'running')
204
+ LIMIT 1
205
+ `).get(components.projectId, targetKey(identity));
206
+ if (!active) {
207
+ throw error;
208
+ }
209
+ return { state: 'active', scan: serializeScan(active) };
210
+ }
211
+ const admitted = getScanRow(components.projectId, id);
212
+ if (!admitted) {
213
+ throw new Error('Admitted repository graph scan could not be loaded');
214
+ }
215
+ return { state: 'admitted', scan: serializeScan(admitted) };
216
+ });
217
+ export const admitRepositoryGraphScan = (identity) => admitTransaction(identity);
218
+ export const startRepositoryGraphScan = (projectId, scanId) => {
219
+ const changes = db.prepare(`
220
+ UPDATE repository_graph_scans
221
+ SET status = 'running', started_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
222
+ WHERE id = ? AND project_id = ? AND status = 'pending'
223
+ `).run(scanId, projectId).changes;
224
+ return changes > 0 ? getRepositoryGraphScan(projectId, scanId) : null;
225
+ };
226
+ const boundedDiagnostics = (diagnostics) => {
227
+ const truncated = diagnostics.length > MAX_REPOSITORY_GRAPH_DIAGNOSTICS;
228
+ const values = diagnostics.slice(0, MAX_REPOSITORY_GRAPH_DIAGNOSTICS);
229
+ if (truncated) {
230
+ values[values.length - 1] = {
231
+ code: 'diagnostic_limit',
232
+ severity: 'warning',
233
+ message: 'Additional repository graph diagnostics were omitted during persistence.',
234
+ path: null,
235
+ };
236
+ }
237
+ return { values, truncated };
238
+ };
239
+ const insertDiagnostic = db.prepare(`
240
+ INSERT INTO repository_graph_diagnostics (scan_id, project_id, sequence, code, severity, message, path)
241
+ VALUES (?, ?, ?, ?, ?, ?, ?)
242
+ `);
243
+ const completeTransaction = db.transaction((projectId, scanId, result) => {
244
+ const scan = getScanRow(projectId, scanId);
245
+ if (!scan || (scan.status !== 'pending' && scan.status !== 'running')) {
246
+ return null;
247
+ }
248
+ if (result.schemaVersion !== scan.graph_schema_version || result.analyzerVersion !== scan.analyzer_version) {
249
+ throw new Error('Repository graph result identity does not match the admitted scan');
250
+ }
251
+ const nodes = result.nodes.slice(0, MAX_REPOSITORY_GRAPH_NODES);
252
+ const nodeIds = new Set(nodes.map(node => node.id));
253
+ if (nodeIds.size !== nodes.length) {
254
+ throw new Error('Repository graph node IDs must be unique within a scan');
255
+ }
256
+ const eligibleEdges = result.edges.filter(edge => nodeIds.has(edge.source) && nodeIds.has(edge.target));
257
+ const edges = eligibleEdges.slice(0, MAX_REPOSITORY_GRAPH_EDGES);
258
+ const edgeIds = new Set(edges.map(edge => edge.id));
259
+ if (edgeIds.size !== edges.length) {
260
+ throw new Error('Repository graph edge IDs must be unique within a scan');
261
+ }
262
+ const diagnostics = boundedDiagnostics(result.diagnostics);
263
+ const insertNode = db.prepare(`
264
+ INSERT INTO repository_graph_nodes (
265
+ scan_id, project_id, id, kind, path, name, file_kind, language, is_test, test_classification
266
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
267
+ `);
268
+ for (const node of nodes) {
269
+ insertNode.run(scanId, projectId, node.id, node.kind, node.path, node.name, node.fileKind, node.language, Number(node.isTest), node.testClassification);
270
+ }
271
+ const insertEdge = db.prepare(`
272
+ INSERT INTO repository_graph_edges (
273
+ scan_id, project_id, id, source_node_id, target_node_id, kind, evidence_class, detail
274
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
275
+ `);
276
+ for (const edge of edges) {
277
+ insertEdge.run(scanId, projectId, edge.id, edge.source, edge.target, edge.kind, edge.evidence, edge.detail);
278
+ }
279
+ diagnostics.values.forEach((diagnostic, sequence) => {
280
+ insertDiagnostic.run(scanId, projectId, sequence, diagnostic.code, diagnostic.severity, diagnostic.message, diagnostic.path);
281
+ });
282
+ const nodesTruncated = result.nodes.length > nodes.length || result.completeness.nodeLimitReached;
283
+ const edgesTruncated = result.edges.length > edges.length
284
+ || eligibleEdges.length > edges.length
285
+ || eligibleEdges.length !== result.edges.length
286
+ || result.completeness.edgeLimitReached;
287
+ db.prepare(`
288
+ UPDATE repository_graph_scans
289
+ SET status = 'completed',
290
+ discovered_file_count = ?, admitted_file_count = ?, skipped_file_count = ?, inspected_byte_count = ?,
291
+ node_count = ?, edge_count = ?, diagnostic_count = ?,
292
+ manifest_truncated = ?, typescript_truncated = ?, history_truncated = ?, nodes_truncated = ?, edges_truncated = ?, diagnostics_truncated = ?,
293
+ completed_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
294
+ WHERE id = ? AND project_id = ? AND status IN ('pending', 'running')
295
+ `).run(result.manifest.discoveredCount, result.manifest.admittedCount, result.manifest.skippedCount, result.manifest.inspectedBytes, nodes.length, edges.length, diagnostics.values.length, Number(result.completeness.manifestTruncated), Number(result.completeness.typescriptTruncated), Number(result.completeness.historyTruncated), Number(nodesTruncated), Number(edgesTruncated), Number(diagnostics.truncated || result.completeness.diagnosticLimitReached), scanId, projectId);
296
+ return getRepositoryGraphScan(projectId, scanId);
297
+ });
298
+ export const completeRepositoryGraphScan = (projectId, scanId, identity, result) => {
299
+ const scan = getScanRow(projectId, scanId);
300
+ if (!scan
301
+ || identity.components.projectId !== projectId
302
+ || scan.identity_fingerprint !== identity.fingerprint
303
+ || scan.identity_json !== JSON.stringify(identity.components)) {
304
+ throw new Error('Repository graph completion identity does not match the admitted scan');
305
+ }
306
+ return completeTransaction(projectId, scanId, result);
307
+ };
308
+ const terminalizeTransaction = db.transaction((projectId, scanId, status, input) => {
309
+ const scan = getScanRow(projectId, scanId);
310
+ if (!scan || (scan.status !== 'pending' && scan.status !== 'running')) {
311
+ return null;
312
+ }
313
+ const diagnostics = boundedDiagnostics(input.diagnostics ?? []);
314
+ diagnostics.values.forEach((diagnostic, sequence) => {
315
+ insertDiagnostic.run(scanId, projectId, sequence, diagnostic.code, diagnostic.severity, diagnostic.message, diagnostic.path);
316
+ });
317
+ const counters = [
318
+ input.discovered_file_count ?? 0,
319
+ input.admitted_file_count ?? 0,
320
+ input.skipped_file_count ?? 0,
321
+ input.inspected_byte_count ?? 0,
322
+ input.node_count ?? 0,
323
+ input.edge_count ?? 0,
324
+ ];
325
+ if (counters.some(value => !Number.isSafeInteger(value) || value < 0)) {
326
+ throw new Error('Repository graph terminal counters must be non-negative safe integers');
327
+ }
328
+ db.prepare(`
329
+ UPDATE repository_graph_scans
330
+ SET status = ?, discovered_file_count = ?, admitted_file_count = ?, skipped_file_count = ?,
331
+ inspected_byte_count = ?, node_count = ?, edge_count = ?, diagnostic_count = ?,
332
+ diagnostics_truncated = ?, completed_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
333
+ WHERE id = ? AND project_id = ? AND status IN ('pending', 'running')
334
+ `).run(status, ...counters, diagnostics.values.length, Number(diagnostics.truncated), scanId, projectId);
335
+ return getRepositoryGraphScan(projectId, scanId);
336
+ });
337
+ export const terminalizeRepositoryGraphScan = (projectId, scanId, status, input = {}) => terminalizeTransaction(projectId, scanId, status, input);
338
+ export const addRepositoryGraphScanReference = (projectId, scanId, referenceType, referenceId) => {
339
+ if (!referenceType.trim() || !referenceId.trim()) {
340
+ throw new Error('Repository graph reference type and ID must not be empty');
341
+ }
342
+ db.prepare(`
343
+ INSERT INTO repository_graph_scan_references (project_id, reference_type, reference_id, scan_id)
344
+ VALUES (?, ?, ?, ?)
345
+ ON CONFLICT(project_id, reference_type, reference_id) DO UPDATE SET scan_id = excluded.scan_id
346
+ `).run(projectId, referenceType, referenceId, scanId);
347
+ };
348
+ export const removeRepositoryGraphScanReference = (projectId, referenceType, referenceId) => db.prepare(`
349
+ DELETE FROM repository_graph_scan_references
350
+ WHERE project_id = ? AND reference_type = ? AND reference_id = ?
351
+ `).run(projectId, referenceType, referenceId).changes > 0;
352
+ //# sourceMappingURL=repositoryGraphStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryGraphStore.js","sourceRoot":"","sources":["../../../server/lib/repositoryGraphStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { resolveSessionTarget } from './sessionTargets.js';
2
+ const unavailable = (target, reason, message) => ({ state: 'unavailable', target, reason, message });
3
+ export const resolveRepositoryGraphTarget = (project, target) => {
4
+ if (!project) {
5
+ return unavailable(target, 'project_unavailable', 'Project no longer exists.');
6
+ }
7
+ if (target.kind === 'repo_root' && target.bundle_id !== null) {
8
+ return unavailable(target, 'invalid_target', 'Repo-root target cannot include a bundle ID.');
9
+ }
10
+ if (target.kind === 'bundle' && !target.bundle_id.trim()) {
11
+ return unavailable(target, 'invalid_target', 'Bundle target requires a bundle ID.');
12
+ }
13
+ const resolution = resolveSessionTarget({
14
+ project_id: project.id,
15
+ target_kind: target.kind,
16
+ target_bundle_id: target.bundle_id,
17
+ target_branch_snapshot: null,
18
+ }, project);
19
+ if (resolution.target_available && resolution.cwd) {
20
+ return { state: 'available', target, cwd: resolution.cwd };
21
+ }
22
+ if (target.kind === 'repo_root') {
23
+ return unavailable(target, 'repository_unavailable', resolution.target_unavailable_reason ?? 'Project repository is unavailable.');
24
+ }
25
+ const reason = resolution.target_unavailable_reason?.includes('worktree')
26
+ ? 'worktree_unavailable'
27
+ : 'bundle_unavailable';
28
+ return unavailable(target, reason, resolution.target_unavailable_reason ?? 'Target bundle is unavailable.');
29
+ };
30
+ //# sourceMappingURL=repositoryGraphTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryGraphTargets.js","sourceRoot":"","sources":["../../../server/lib/repositoryGraphTargets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AA2B1D,MAAM,WAAW,GAAG,CAClB,MAAuC,EACvC,MAA8C,EAC9C,OAAe,EACkB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAAuB,EACvB,MAAuC,EACN,EAAE;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,MAAM,EAAE,qBAAqB,EAAE,2BAA2B,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7D,OAAO,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,8CAA8C,CAAC,CAAA;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACzD,OAAO,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,qCAAqC,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC;QACtC,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,gBAAgB,EAAE,MAAM,CAAC,SAAS;QAClC,sBAAsB,EAAE,IAAI;KAC7B,EAAE,OAAO,CAAC,CAAA;IACX,IAAI,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAA;IAC5D,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,WAAW,CAChB,MAAM,EACN,wBAAwB,EACxB,UAAU,CAAC,yBAAyB,IAAI,oCAAoC,CAC7E,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,yBAAyB,EAAE,QAAQ,CAAC,UAAU,CAAC;QACvE,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,oBAAoB,CAAA;IACxB,OAAO,WAAW,CAChB,MAAM,EACN,MAAM,EACN,UAAU,CAAC,yBAAyB,IAAI,+BAA+B,CACxE,CAAA;AACH,CAAC,CAAA"}