@straiffi/archon 1.8.6 → 1.8.8

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 (169) hide show
  1. package/dist/client/assets/ActivityView--4X_m6mR.js +1 -0
  2. package/dist/client/assets/GitHubActionsDialog-DZ1lHM01.js +1 -0
  3. package/dist/client/assets/RepositoryGraphDialog-B--YlQcV.js +1 -0
  4. package/dist/client/assets/VerificationDialog-BIWPtBg3.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-CY5xTOZJ.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-GPEHLZMM-xOxShPwZ.js → blockDiagram-GPEHLZMM-DkMi7gMh.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-AAUBKEIU-BXMrXnKR.js → c4Diagram-AAUBKEIU-ZZxXBBU4.js} +1 -1
  10. package/dist/client/assets/channel-b2AN-U3x.js +1 -0
  11. package/dist/client/assets/{chunk-2J33WTMH-BdDEtNMz.js → chunk-2J33WTMH-C9PiKMs-.js} +1 -1
  12. package/dist/client/assets/{chunk-3OPIFGDE-PtSkTtIU.js → chunk-3OPIFGDE-B81aUmvi.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-Bk2Owm90.js} +1 -1
  18. package/dist/client/assets/{chunk-727SXJPM-gDX0xZh1.js → chunk-727SXJPM-Bx-79aJk.js} +1 -1
  19. package/dist/client/assets/{chunk-AQP2D5EJ-Bat82lQQ.js → chunk-AQP2D5EJ-GQNXYOf0.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-BV22j6vn.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-C9LlcbWv.js} +1 -1
  26. package/dist/client/assets/{chunk-L5ZTLDWV-TRTuwXsF.js → chunk-L5ZTLDWV-D8PJqJnh.js} +1 -1
  27. package/dist/client/assets/{chunk-LZXEDZCA-DdpNmv37.js → chunk-LZXEDZCA-DcbPPozR.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-NV-_2KqZ.js} +1 -1
  32. package/dist/client/assets/{chunk-NZK2D7GU-BAxuwE_2.js → chunk-NZK2D7GU-CbqA26gb.js} +1 -1
  33. package/dist/client/assets/{chunk-O5CBEL6O-Cttpc9yf.js → chunk-O5CBEL6O-B0DMN44B.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-CYpcnwf9.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-C0exS5oM.js +1 -0
  41. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DkB9dQZ1.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-B5HD9fyK.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-BCXvWFpM.js} +1 -1
  46. package/dist/client/assets/{diagram-5GNKFQAL-SixbJGPN.js → diagram-5GNKFQAL-CSpWGfAO.js} +1 -1
  47. package/dist/client/assets/{diagram-KO2AKTUF-Dk1670ag.js → diagram-KO2AKTUF-CFECGppT.js} +1 -1
  48. package/dist/client/assets/{diagram-LMA3HP47-BDNhjRaO.js → diagram-LMA3HP47-Dpb99QbZ.js} +1 -1
  49. package/dist/client/assets/{diagram-OG6HWLK6-BLowQCLY.js → diagram-OG6HWLK6-DJcTGnx0.js} +1 -1
  50. package/dist/client/assets/{erDiagram-TEJ5UH35-DAg9kUbm.js → erDiagram-TEJ5UH35-jWArJxNU.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-DDF3P1hY.js} +1 -1
  53. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DfF1TT-s.js → ganttDiagram-6RSMTGT7-Corwr_18.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-WzlpszWn.js} +1 -1
  56. package/dist/client/assets/index-Bs5SQZhz.css +2 -0
  57. package/dist/client/assets/index-Dy-7h3lN.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-C0VwTwNC.js} +1 -1
  60. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BuCkp1uL.js → ishikawaDiagram-YF4QCWOH-m9l3k2qX.js} +1 -1
  61. package/dist/client/assets/{journeyDiagram-JHISSGLW-DkUPCxT5.js → journeyDiagram-JHISSGLW-DMhT8HTW.js} +1 -1
  62. package/dist/client/assets/{kanban-definition-UN3LZRKU-CXwNZ0Fa.js → kanban-definition-UN3LZRKU-C2ZkcOi0.js} +1 -1
  63. package/dist/client/assets/{line-CRTZgJXA.js → line-gKkUdUWR.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-DdBfJWbP.js} +2 -2
  66. package/dist/client/assets/{mermaid.core-DszsB_Gl.js → mermaid.core-DXnhq-eu.js} +3 -3
  67. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DCrqCcPX.js → mindmap-definition-RKZ34NQL-B0gX4aJy.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-BHYdLmpx.js} +1 -1
  72. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Ptpkh0Dc.js → quadrantDiagram-W4KKPZXB-C-H-yQwU.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-DY_pSCFy.js} +1 -1
  75. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-B7RCxzNy.js → sankeyDiagram-5OEKKPKP-CC61HRGf.js} +1 -1
  76. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DGXfHCo0.js → sequenceDiagram-3UESZ5HK-B8fXWNxw.js} +1 -1
  77. package/dist/client/assets/{stateDiagram-AJRCARHV-Cl0_SVL3.js → stateDiagram-AJRCARHV-C_VYKsXW.js} +1 -1
  78. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Ctk1r914.js +1 -0
  79. package/dist/client/assets/{timeline-definition-PNZ67QCA-Cufq-wYg.js → timeline-definition-PNZ67QCA-0fB4PIIX.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-CfpVF7Aa.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-CgdK4FcC.js} +1 -1
  85. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DW-KpRbf.js → xychartDiagram-2RQKCTM6-BEfatQYR.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 +106 -46
  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/git.js +302 -11
  98. package/dist/server/lib/git.js.map +1 -1
  99. package/dist/server/lib/integrations/github.js +145 -66
  100. package/dist/server/lib/integrations/github.js.map +1 -1
  101. package/dist/server/lib/integrations/importedIssueImages.js +10 -15
  102. package/dist/server/lib/integrations/importedIssueImages.js.map +1 -1
  103. package/dist/server/lib/postBuildChecks.js +20 -12
  104. package/dist/server/lib/postBuildChecks.js.map +1 -1
  105. package/dist/server/lib/repositoryGraphAnalyzer.js +392 -0
  106. package/dist/server/lib/repositoryGraphAnalyzer.js.map +1 -0
  107. package/dist/server/lib/repositoryGraphGitHistory.js +371 -0
  108. package/dist/server/lib/repositoryGraphGitHistory.js.map +1 -0
  109. package/dist/server/lib/repositoryGraphIdentity.js +134 -0
  110. package/dist/server/lib/repositoryGraphIdentity.js.map +1 -0
  111. package/dist/server/lib/repositoryGraphManifest.js +386 -0
  112. package/dist/server/lib/repositoryGraphManifest.js.map +1 -0
  113. package/dist/server/lib/repositoryGraphQueries.js +370 -0
  114. package/dist/server/lib/repositoryGraphQueries.js.map +1 -0
  115. package/dist/server/lib/repositoryGraphRetention.js +104 -0
  116. package/dist/server/lib/repositoryGraphRetention.js.map +1 -0
  117. package/dist/server/lib/repositoryGraphRoutes.js +145 -0
  118. package/dist/server/lib/repositoryGraphRoutes.js.map +1 -0
  119. package/dist/server/lib/repositoryGraphScan.js +370 -0
  120. package/dist/server/lib/repositoryGraphScan.js.map +1 -0
  121. package/dist/server/lib/repositoryGraphStore.js +352 -0
  122. package/dist/server/lib/repositoryGraphStore.js.map +1 -0
  123. package/dist/server/lib/repositoryGraphTargets.js +30 -0
  124. package/dist/server/lib/repositoryGraphTargets.js.map +1 -0
  125. package/dist/server/lib/repositoryGraphTypeScript.js +288 -0
  126. package/dist/server/lib/repositoryGraphTypeScript.js.map +1 -0
  127. package/dist/server/lib/terminal.js +25 -1
  128. package/dist/server/lib/terminal.js.map +1 -1
  129. package/dist/server/lib/types.js +1 -0
  130. package/dist/server/lib/types.js.map +1 -1
  131. package/dist/server/lib/workspaceIdentity.js +433 -0
  132. package/dist/server/lib/workspaceIdentity.js.map +1 -0
  133. package/dist/server/workers/plan.js +9 -7
  134. package/dist/server/workers/plan.js.map +1 -1
  135. package/dist/server/workers/repositoryGraphAnalyzer.js +282 -0
  136. package/dist/server/workers/repositoryGraphAnalyzer.js.map +1 -0
  137. package/package.json +2 -1
  138. package/dist/client/assets/ActivityView-DDeEQgbm.js +0 -1
  139. package/dist/client/assets/GitHubActionsDialog-DH-B_LR3.js +0 -1
  140. package/dist/client/assets/VerificationDialog-x43F7tbo.js +0 -4
  141. package/dist/client/assets/architecture-7EHR7CIX-C-4Cp4ml.js +0 -1
  142. package/dist/client/assets/channel-C0dk5Jiy.js +0 -1
  143. package/dist/client/assets/chunk-QZHKN3VN-LI_RZca2.js +0 -1
  144. package/dist/client/assets/chunk-WU5MYG2G-620NtSlY.js +0 -1
  145. package/dist/client/assets/classDiagram-4FO5ZUOK-C5ptkk7I.js +0 -1
  146. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFuXUVOx.js +0 -1
  147. package/dist/client/assets/eventmodeling-FCH6USID-Dqb6QKoI.js +0 -1
  148. package/dist/client/assets/gitGraph-WXDBUCRP-DYEsqh93.js +0 -1
  149. package/dist/client/assets/index-B5TSPCJr.css +0 -2
  150. package/dist/client/assets/index-DV0vl670.js +0 -274
  151. package/dist/client/assets/info-J43DQDTF-CfjXFZai.js +0 -1
  152. package/dist/client/assets/packet-YPE3B663-Dv0HkRHU.js +0 -1
  153. package/dist/client/assets/pie-LRSECV5Y-S5zPzZFN.js +0 -1
  154. package/dist/client/assets/radar-GUYGQ44K-B7psLv22.js +0 -1
  155. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CqzC1yAT.js +0 -1
  156. package/dist/client/assets/treeView-BLDUP644-B8H0kT67.js +0 -1
  157. package/dist/client/assets/treemap-LRROVOQU-DPLhFHnh.js +0 -1
  158. package/dist/client/assets/wardley-L42UT6IY-B5-Vb08V.js +0 -1
  159. /package/dist/client/assets/{array-BNor45A1.js → array-B2f2amhX.js} +0 -0
  160. /package/dist/client/assets/{chunk-NNHCCRGN-CZB-V-Gv.js → chunk-NNHCCRGN-DgKrp8T-.js} +0 -0
  161. /package/dist/client/assets/{cytoscape.esm-B2lJcMSI.js → cytoscape.esm-BInZCgaJ.js} +0 -0
  162. /package/dist/client/assets/{defaultLocale-DPzUsThw.js → defaultLocale-sPXJ5urm.js} +0 -0
  163. /package/dist/client/assets/{dist-CERhmQhR.js → dist-DfHDMDTt.js} +0 -0
  164. /package/dist/client/assets/{graphlib-BHOW-eWz.js → graphlib-DacNv4Jd.js} +0 -0
  165. /package/dist/client/assets/{init-C0L3woqb.js → init-BVCnG1lj.js} +0 -0
  166. /package/dist/client/assets/{katex-CpjQsUQe.js → katex-BlkrXOwm.js} +0 -0
  167. /package/dist/client/assets/{path-sMK4d_s9.js → path-Bw5AvBNC.js} +0 -0
  168. /package/dist/client/assets/{rough.esm-BoTisKeL.js → rough.esm-DeLgKbOI.js} +0 -0
  169. /package/dist/client/assets/{src-BRjoYtUW.js → src-CFGsdLiG.js} +0 -0
@@ -0,0 +1,371 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { basename, extname } from 'node:path';
4
+ import { isRepositoryGraphGeneratedPath, isRepositoryGraphMinifiedPath } from './repositoryGraphManifest.js';
5
+ export const MAX_REPOSITORY_GRAPH_HISTORY_COMMITS = 500;
6
+ export const MAX_REPOSITORY_GRAPH_HISTORY_FILES_PER_COMMIT = 200;
7
+ export const MAX_REPOSITORY_GRAPH_HISTORY_PAIRS = 100_000;
8
+ export const MAX_REPOSITORY_GRAPH_HISTORY_SAMPLES = 20;
9
+ export const DEFAULT_REPOSITORY_GRAPH_HISTORY_SAMPLES = 5;
10
+ export const DEFAULT_REPOSITORY_GRAPH_BULK_CHANGE_FILES = 100;
11
+ const REPOSITORY_GRAPH_HISTORY_IDENTITY_COMMITS = MAX_REPOSITORY_GRAPH_HISTORY_COMMITS + 1;
12
+ const REPOSITORY_GRAPH_HISTORY_IDENTITY_MAX_OUTPUT_BYTES = 1024 * 1024;
13
+ const REPOSITORY_GRAPH_HISTORY_IDENTITY_TIMEOUT_MS = 60_000;
14
+ const LOCKFILE_NAMES = new Set([
15
+ 'bun.lock', 'bun.lockb', 'cargo.lock', 'composer.lock', 'gemfile.lock', 'package-lock.json',
16
+ 'pnpm-lock.yaml', 'poetry.lock', 'uv.lock', 'yarn.lock',
17
+ ]);
18
+ const FIELD_SEPARATOR = 0;
19
+ export class RepositoryGraphHistoryAbortError extends Error {
20
+ reason;
21
+ constructor(reason) {
22
+ super(reason === 'cancelled' ? 'Repository graph analysis cancelled' : 'Repository graph analysis timed out');
23
+ this.name = 'RepositoryGraphHistoryAbortError';
24
+ this.reason = reason;
25
+ }
26
+ }
27
+ class RepositoryGraphHistoryLimitError extends Error {
28
+ constructor() {
29
+ super('Git history output exceeded the configured limit');
30
+ this.name = 'RepositoryGraphHistoryLimitError';
31
+ }
32
+ }
33
+ const abortReason = (signal, deadline) => {
34
+ if (signal?.aborted) {
35
+ return 'cancelled';
36
+ }
37
+ if (deadline !== undefined && Date.now() >= deadline) {
38
+ return 'timeout';
39
+ }
40
+ return null;
41
+ };
42
+ const throwIfAborted = (signal, deadline) => {
43
+ const reason = abortReason(signal, deadline);
44
+ if (reason) {
45
+ throw new RepositoryGraphHistoryAbortError(reason);
46
+ }
47
+ };
48
+ const runGit = (cwd, args, maxOutputBytes, signal, deadline, onGitChild) => new Promise((resolvePromise, rejectPromise) => {
49
+ throwIfAborted(signal, deadline);
50
+ const child = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
51
+ const chunks = [];
52
+ let outputBytes = 0;
53
+ let stderr = '';
54
+ let settled = false;
55
+ let forcedError = null;
56
+ const childPid = child.pid;
57
+ if (childPid !== undefined) {
58
+ onGitChild?.({ state: 'started', pid: childPid });
59
+ }
60
+ const deadlineDelay = deadline === undefined ? null : Math.max(0, deadline - Date.now());
61
+ let deadlineTimer = null;
62
+ const finish = (error) => {
63
+ if (settled) {
64
+ return;
65
+ }
66
+ settled = true;
67
+ if (childPid !== undefined) {
68
+ onGitChild?.({ state: 'stopped', pid: childPid });
69
+ }
70
+ if (deadlineTimer) {
71
+ clearTimeout(deadlineTimer);
72
+ }
73
+ signal?.removeEventListener('abort', handleAbort);
74
+ if (error) {
75
+ rejectPromise(error);
76
+ return;
77
+ }
78
+ resolvePromise(Buffer.concat(chunks));
79
+ };
80
+ const stop = (reason) => {
81
+ if (settled || forcedError) {
82
+ return;
83
+ }
84
+ forcedError = new RepositoryGraphHistoryAbortError(reason);
85
+ child.kill('SIGKILL');
86
+ };
87
+ const handleAbort = () => stop('cancelled');
88
+ signal?.addEventListener('abort', handleAbort, { once: true });
89
+ if (deadlineDelay !== null) {
90
+ deadlineTimer = setTimeout(() => stop('timeout'), deadlineDelay);
91
+ }
92
+ child.stdout.on('data', (chunk) => {
93
+ outputBytes += chunk.length;
94
+ if (outputBytes > maxOutputBytes && !forcedError) {
95
+ forcedError = new RepositoryGraphHistoryLimitError();
96
+ child.kill('SIGKILL');
97
+ return;
98
+ }
99
+ chunks.push(chunk);
100
+ });
101
+ child.stderr.on('data', chunk => {
102
+ if (stderr.length < 8_192) {
103
+ stderr += chunk.toString();
104
+ }
105
+ });
106
+ child.on('error', error => finish(error));
107
+ child.on('close', code => {
108
+ if (forcedError) {
109
+ finish(forcedError);
110
+ return;
111
+ }
112
+ if (code !== 0) {
113
+ finish(new Error(`Git history collection failed with code ${code}: ${stderr.trim()}`));
114
+ return;
115
+ }
116
+ finish();
117
+ });
118
+ });
119
+ export const captureRepositoryGraphGitHistoryIdentity = async (cwd, options = {}) => {
120
+ const maxOutputBytes = options.maxOutputBytes ?? REPOSITORY_GRAPH_HISTORY_IDENTITY_MAX_OUTPUT_BYTES;
121
+ const deadline = options.deadline ?? Date.now() + REPOSITORY_GRAPH_HISTORY_IDENTITY_TIMEOUT_MS;
122
+ const readReachableHistory = () => runGit(cwd, [
123
+ 'rev-list', '--topo-order', '--parents', `--max-count=${REPOSITORY_GRAPH_HISTORY_IDENTITY_COMMITS}`, 'HEAD',
124
+ ], maxOutputBytes, options.signal, deadline).catch(error => {
125
+ if (error instanceof Error && /unknown revision|bad revision|ambiguous argument/i.test(error.message)) {
126
+ return Buffer.alloc(0);
127
+ }
128
+ throw error;
129
+ });
130
+ const [shallow, reachableHistory] = await Promise.all([
131
+ runGit(cwd, ['rev-parse', '--is-shallow-repository'], 1_024, options.signal, deadline),
132
+ readReachableHistory(),
133
+ ]);
134
+ const hash = createHash('sha256');
135
+ hash.update('archon-repository-graph-history-v1\0');
136
+ hash.update(shallow);
137
+ hash.update('\0');
138
+ hash.update(reachableHistory);
139
+ return hash.digest('hex');
140
+ };
141
+ export const parseRepositoryGraphGitHistory = (buffer, maxFilesPerCommit) => {
142
+ const fields = [];
143
+ let fieldStart = 0;
144
+ while (fieldStart <= buffer.length) {
145
+ const fieldEnd = buffer.indexOf(FIELD_SEPARATOR, fieldStart);
146
+ if (fieldEnd < 0) {
147
+ if (fieldStart < buffer.length) {
148
+ fields.push(buffer.toString('utf8', fieldStart));
149
+ }
150
+ break;
151
+ }
152
+ fields.push(buffer.toString('utf8', fieldStart, fieldEnd));
153
+ fieldStart = fieldEnd + 1;
154
+ }
155
+ const commits = [];
156
+ let index = 0;
157
+ while (index < fields.length) {
158
+ if (fields[index] !== '') {
159
+ index += 1;
160
+ continue;
161
+ }
162
+ const id = fields[index + 1];
163
+ const parents = fields[index + 2];
164
+ if (!id || parents === undefined || fields[index + 3] !== '') {
165
+ index += 1;
166
+ continue;
167
+ }
168
+ index += 4;
169
+ const paths = [];
170
+ let pathLimitReached = false;
171
+ while (index < fields.length && fields[index] !== '') {
172
+ const metadata = fields[index]?.replace(/^\n/, '') ?? '';
173
+ const path = fields[index + 1];
174
+ if (!metadata.startsWith(':') || path === undefined) {
175
+ break;
176
+ }
177
+ if (paths.length < maxFilesPerCommit + 1) {
178
+ paths.push(path);
179
+ }
180
+ else {
181
+ pathLimitReached = true;
182
+ }
183
+ index += 2;
184
+ }
185
+ commits.push({
186
+ id,
187
+ parentCount: parents ? parents.split(' ').length : 0,
188
+ paths,
189
+ pathLimitReached: pathLimitReached || paths.length > maxFilesPerCommit,
190
+ });
191
+ }
192
+ return commits;
193
+ };
194
+ const isExcludedPath = (path) => {
195
+ const name = basename(path).toLowerCase();
196
+ return isRepositoryGraphGeneratedPath(path)
197
+ || isRepositoryGraphMinifiedPath(path)
198
+ || LOCKFILE_NAMES.has(name)
199
+ || extname(name).toLowerCase() === '.lock';
200
+ };
201
+ const emptyResult = (diagnostic, shallow = false, truncated = false) => ({
202
+ records: [],
203
+ diagnostics: [diagnostic],
204
+ summary: {
205
+ collectedCommitCount: 0,
206
+ analyzedCommitCount: 0,
207
+ excludedMergeCommitCount: 0,
208
+ excludedLargeCommitCount: 0,
209
+ excludedBulkChangeCommitCount: 0,
210
+ excludedPathCount: 0,
211
+ shallow,
212
+ },
213
+ truncated,
214
+ });
215
+ export const emptyRepositoryGraphGitHistoryResult = () => ({
216
+ records: [],
217
+ diagnostics: [],
218
+ summary: {
219
+ collectedCommitCount: 0,
220
+ analyzedCommitCount: 0,
221
+ excludedMergeCommitCount: 0,
222
+ excludedLargeCommitCount: 0,
223
+ excludedBulkChangeCommitCount: 0,
224
+ excludedPathCount: 0,
225
+ shallow: false,
226
+ },
227
+ truncated: false,
228
+ });
229
+ export const analyzeRepositoryGraphGitHistory = async (cwd, options) => {
230
+ const { limits, signal, deadline, onGitChild } = options;
231
+ const shallowOutput = await runGit(cwd, ['rev-parse', '--is-shallow-repository'], 1_024, signal, deadline, onGitChild).catch(error => {
232
+ if (error instanceof RepositoryGraphHistoryAbortError) {
233
+ throw error;
234
+ }
235
+ return null;
236
+ });
237
+ const shallow = shallowOutput?.toString('utf8').trim() === 'true';
238
+ let historyOutput;
239
+ try {
240
+ historyOutput = await runGit(cwd, [
241
+ 'log', `--max-count=${limits.maxHistoryCommits + 1}`, '--no-renames', '--raw', '-z',
242
+ '--format=%x00%H%x00%P%x00',
243
+ ], limits.maxGitOutputBytes, signal, deadline, onGitChild);
244
+ }
245
+ catch (error) {
246
+ if (error instanceof RepositoryGraphHistoryAbortError) {
247
+ throw error;
248
+ }
249
+ const outputLimited = error instanceof RepositoryGraphHistoryLimitError;
250
+ return emptyResult({
251
+ code: outputLimited ? 'history_output_limit' : 'history_unavailable',
252
+ severity: outputLimited ? 'warning' : 'info',
253
+ message: error instanceof Error ? error.message : 'Git history is unavailable',
254
+ path: null,
255
+ }, shallow, outputLimited);
256
+ }
257
+ throwIfAborted(signal, deadline);
258
+ const parsedCommits = parseRepositoryGraphGitHistory(historyOutput, limits.maxHistoryFilesPerCommit);
259
+ const commitLimitReached = parsedCommits.length > limits.maxHistoryCommits;
260
+ const commits = parsedCommits.slice(0, limits.maxHistoryCommits);
261
+ const pairs = new Map();
262
+ let pairLimitReached = false;
263
+ let analyzedCommitCount = 0;
264
+ let excludedMergeCommitCount = 0;
265
+ let excludedLargeCommitCount = 0;
266
+ let excludedBulkChangeCommitCount = 0;
267
+ let excludedPathCount = 0;
268
+ for (const commit of commits) {
269
+ throwIfAborted(signal, deadline);
270
+ if (commit.parentCount > 1) {
271
+ excludedMergeCommitCount += 1;
272
+ continue;
273
+ }
274
+ if (commit.pathLimitReached) {
275
+ excludedLargeCommitCount += 1;
276
+ continue;
277
+ }
278
+ const eligiblePaths = [...new Set(commit.paths.filter(path => {
279
+ const excluded = isExcludedPath(path);
280
+ if (excluded) {
281
+ excludedPathCount += 1;
282
+ }
283
+ return !excluded;
284
+ }))].sort();
285
+ if (eligiblePaths.length >= limits.historyBulkChangeFileThreshold) {
286
+ excludedBulkChangeCommitCount += 1;
287
+ continue;
288
+ }
289
+ analyzedCommitCount += 1;
290
+ for (let sourceIndex = 0; sourceIndex < eligiblePaths.length; sourceIndex += 1) {
291
+ for (let targetIndex = sourceIndex + 1; targetIndex < eligiblePaths.length; targetIndex += 1) {
292
+ const sourcePath = eligiblePaths[sourceIndex];
293
+ const targetPath = eligiblePaths[targetIndex];
294
+ if (!sourcePath || !targetPath) {
295
+ continue;
296
+ }
297
+ const key = `${sourcePath}\0${targetPath}`;
298
+ const existing = pairs.get(key);
299
+ if (existing) {
300
+ existing.count += 1;
301
+ if (existing.sampledCommitIds.length < limits.maxHistorySamplesPerPair) {
302
+ existing.sampledCommitIds.push(commit.id);
303
+ }
304
+ else {
305
+ existing.samplesTruncated = true;
306
+ }
307
+ continue;
308
+ }
309
+ if (pairs.size >= limits.maxHistoryPairs) {
310
+ pairLimitReached = true;
311
+ continue;
312
+ }
313
+ pairs.set(key, {
314
+ sourcePath,
315
+ targetPath,
316
+ count: 1,
317
+ sampledCommitIds: [commit.id],
318
+ samplesTruncated: false,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ const truncated = commitLimitReached || pairLimitReached;
324
+ const diagnostics = [];
325
+ if (shallow) {
326
+ diagnostics.push({ code: 'history_shallow', severity: 'info', message: 'Co-change evidence uses the available shallow Git history only.', path: null });
327
+ }
328
+ if (excludedMergeCommitCount > 0) {
329
+ diagnostics.push({ code: 'history_merge_commits_excluded', severity: 'info', message: `Excluded ${excludedMergeCommitCount} merge commits from co-change analysis.`, path: null });
330
+ }
331
+ if (excludedLargeCommitCount > 0) {
332
+ diagnostics.push({ code: 'history_large_commits_excluded', severity: 'warning', message: `Excluded ${excludedLargeCommitCount} commits above the ${limits.maxHistoryFilesPerCommit}-file history limit.`, path: null });
333
+ }
334
+ if (excludedBulkChangeCommitCount > 0) {
335
+ diagnostics.push({ code: 'history_bulk_changes_excluded', severity: 'info', message: `Excluded ${excludedBulkChangeCommitCount} commits with at least ${limits.historyBulkChangeFileThreshold} eligible files as bulk-change candidates.`, path: null });
336
+ }
337
+ if (excludedPathCount > 0) {
338
+ diagnostics.push({ code: 'history_paths_excluded', severity: 'info', message: `Excluded ${excludedPathCount} generated or lockfile changes from co-change analysis.`, path: null });
339
+ }
340
+ if (commitLimitReached) {
341
+ diagnostics.push({ code: 'history_commit_limit', severity: 'warning', message: `Git history was truncated at ${limits.maxHistoryCommits} commits.`, path: null });
342
+ }
343
+ if (pairLimitReached) {
344
+ diagnostics.push({ code: 'history_pair_limit', severity: 'warning', message: `Co-change evidence was truncated at ${limits.maxHistoryPairs} retained pairs.`, path: null });
345
+ }
346
+ const records = [...pairs.values()]
347
+ .map(pair => ({
348
+ sourcePath: pair.sourcePath,
349
+ targetPath: pair.targetPath,
350
+ count: pair.count,
351
+ sampledCommitIds: pair.sampledCommitIds,
352
+ truncated: truncated || pair.samplesTruncated,
353
+ explanationSource: 'git_history_cochange',
354
+ }))
355
+ .sort((left, right) => left.sourcePath.localeCompare(right.sourcePath) || left.targetPath.localeCompare(right.targetPath));
356
+ return {
357
+ records,
358
+ diagnostics,
359
+ summary: {
360
+ collectedCommitCount: commits.length,
361
+ analyzedCommitCount,
362
+ excludedMergeCommitCount,
363
+ excludedLargeCommitCount,
364
+ excludedBulkChangeCommitCount,
365
+ excludedPathCount,
366
+ shallow,
367
+ },
368
+ truncated,
369
+ };
370
+ };
371
+ //# sourceMappingURL=repositoryGraphGitHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryGraphGitHistory.js","sourceRoot":"","sources":["../../../server/lib/repositoryGraphGitHistory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { createHash } from 'crypto';
2
+ import { captureRepositoryGraphGitHistoryIdentity, RepositoryGraphHistoryAbortError } from './repositoryGraphGitHistory.js';
3
+ import { captureWorkspaceIdentity, DEFAULT_WORKSPACE_IDENTITY_TIMEOUT_MS, updateIdentityComponent, } from './workspaceIdentity.js';
4
+ const normalizeConfigurationValue = (value, path, ancestors) => {
5
+ if (value === null || typeof value === 'string' || typeof value === 'boolean') {
6
+ return value;
7
+ }
8
+ if (typeof value === 'number') {
9
+ if (!Number.isFinite(value)) {
10
+ throw new Error(`Analyzer configuration ${path} must be a finite number`);
11
+ }
12
+ return Object.is(value, -0) ? 0 : value;
13
+ }
14
+ if (typeof value !== 'object') {
15
+ throw new Error(`Analyzer configuration ${path} must be JSON-compatible`);
16
+ }
17
+ if (ancestors.has(value)) {
18
+ throw new Error(`Analyzer configuration ${path} must not contain cycles`);
19
+ }
20
+ ancestors.add(value);
21
+ try {
22
+ if (Array.isArray(value)) {
23
+ return value.map((entry, index) => normalizeConfigurationValue(entry, `${path}[${index}]`, ancestors));
24
+ }
25
+ const prototype = Object.getPrototypeOf(value);
26
+ if (prototype !== Object.prototype && prototype !== null) {
27
+ throw new Error(`Analyzer configuration ${path} must contain only plain objects`);
28
+ }
29
+ return Object.fromEntries(Object.entries(value)
30
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
31
+ .map(([key, entry]) => [key, normalizeConfigurationValue(entry, `${path}.${key}`, ancestors)]));
32
+ }
33
+ finally {
34
+ ancestors.delete(value);
35
+ }
36
+ };
37
+ export const normalizeRepositoryGraphAnalyzerConfiguration = (value) => normalizeConfigurationValue(value, '$', new Set());
38
+ const assertIdentityLabel = (name, value) => {
39
+ if (!value.trim()) {
40
+ throw new Error(`${name} must not be empty`);
41
+ }
42
+ };
43
+ export const composeRepositoryGraphIdentity = ({ projectId, target, workspaceIdentity, historyFingerprint, graphSchemaVersion, analyzerVersion, analyzerConfiguration, }) => {
44
+ assertIdentityLabel('Project ID', projectId);
45
+ assertIdentityLabel('Graph schema version', graphSchemaVersion);
46
+ assertIdentityLabel('Analyzer version', analyzerVersion);
47
+ const normalizedConfiguration = normalizeRepositoryGraphAnalyzerConfiguration(analyzerConfiguration);
48
+ const normalizedTarget = target.kind === 'repo_root'
49
+ ? { kind: 'repo_root', bundle_id: null }
50
+ : { kind: 'bundle', bundle_id: target.bundle_id };
51
+ const components = {
52
+ format: 'archon-repository-graph-v1',
53
+ projectId,
54
+ target: normalizedTarget,
55
+ head: workspaceIdentity.components.head,
56
+ dirtyFingerprint: workspaceIdentity.components.dirtyFingerprint,
57
+ ...(historyFingerprint === undefined ? {} : { historyFingerprint }),
58
+ graphSchemaVersion,
59
+ analyzerVersion,
60
+ analyzerConfiguration: normalizedConfiguration,
61
+ };
62
+ const hash = createHash('sha256');
63
+ updateIdentityComponent(hash, 'format', Buffer.from(components.format));
64
+ updateIdentityComponent(hash, 'project-id', Buffer.from(components.projectId));
65
+ updateIdentityComponent(hash, 'logical-target', Buffer.from(JSON.stringify(components.target)));
66
+ updateIdentityComponent(hash, 'head', Buffer.from(components.head));
67
+ updateIdentityComponent(hash, 'dirty-fingerprint', Buffer.from(components.dirtyFingerprint));
68
+ if (components.historyFingerprint !== undefined) {
69
+ updateIdentityComponent(hash, 'history-fingerprint', Buffer.from(components.historyFingerprint));
70
+ }
71
+ updateIdentityComponent(hash, 'graph-schema-version', Buffer.from(components.graphSchemaVersion));
72
+ updateIdentityComponent(hash, 'analyzer-version', Buffer.from(components.analyzerVersion));
73
+ updateIdentityComponent(hash, 'analyzer-configuration', Buffer.from(JSON.stringify(components.analyzerConfiguration)));
74
+ return { state: 'available', algorithm: 'sha256', fingerprint: hash.digest('hex'), components };
75
+ };
76
+ export const captureRepositoryGraphIdentitySnapshot = async (cwd, options = {}) => {
77
+ const timeoutMs = options.timeoutMs ?? DEFAULT_WORKSPACE_IDENTITY_TIMEOUT_MS;
78
+ const deadline = Date.now() + timeoutMs;
79
+ try {
80
+ const historyBefore = await captureRepositoryGraphGitHistoryIdentity(cwd, {
81
+ signal: options.signal,
82
+ deadline,
83
+ maxOutputBytes: options.maxProcessOutputBytes,
84
+ });
85
+ const remainingTimeoutMs = deadline - Date.now();
86
+ if (remainingTimeoutMs <= 0) {
87
+ return {
88
+ state: 'unavailable',
89
+ reason: 'time_limit_exceeded',
90
+ message: `Repository graph identity capture exceeded ${timeoutMs} ms`,
91
+ };
92
+ }
93
+ const workspaceIdentity = await captureWorkspaceIdentity(cwd, {
94
+ ...options,
95
+ timeoutMs: remainingTimeoutMs,
96
+ });
97
+ if (workspaceIdentity.state === 'unavailable') {
98
+ return workspaceIdentity;
99
+ }
100
+ const historyAfter = await captureRepositoryGraphGitHistoryIdentity(cwd, {
101
+ signal: options.signal,
102
+ deadline,
103
+ maxOutputBytes: options.maxProcessOutputBytes,
104
+ });
105
+ if (historyBefore !== historyAfter) {
106
+ return {
107
+ state: 'unavailable',
108
+ reason: 'unstable_snapshot',
109
+ message: 'Reachable Git history changed during repository graph identity capture',
110
+ };
111
+ }
112
+ return { state: 'available', workspaceIdentity, historyFingerprint: historyBefore };
113
+ }
114
+ catch (error) {
115
+ const cancelled = error instanceof RepositoryGraphHistoryAbortError && error.reason === 'cancelled';
116
+ return {
117
+ state: 'unavailable',
118
+ reason: cancelled ? 'cancelled' : error instanceof RepositoryGraphHistoryAbortError ? 'time_limit_exceeded' : 'git_unavailable',
119
+ message: error instanceof Error ? error.message : 'Git history identity capture failed',
120
+ };
121
+ }
122
+ };
123
+ export const captureRepositoryGraphIdentity = async (input) => {
124
+ const snapshot = await captureRepositoryGraphIdentitySnapshot(input.cwd, input.workspaceIdentityOptions);
125
+ if (snapshot.state === 'unavailable') {
126
+ return snapshot;
127
+ }
128
+ return composeRepositoryGraphIdentity({
129
+ ...input,
130
+ workspaceIdentity: snapshot.workspaceIdentity,
131
+ historyFingerprint: snapshot.historyFingerprint,
132
+ });
133
+ };
134
+ //# sourceMappingURL=repositoryGraphIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositoryGraphIdentity.js","sourceRoot":"","sources":["../../../server/lib/repositoryGraphIdentity.ts"],"names":[],"mappings":"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"}