@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,433 @@
1
+ import { spawn } from 'child_process';
2
+ import { createHash } from 'crypto';
3
+ import { createReadStream } from 'fs';
4
+ import { lstat, readlink } from 'fs/promises';
5
+ const DEFAULT_MAX_FILES = 20_000;
6
+ const DEFAULT_MAX_BYTES = 512 * 1024 * 1024;
7
+ const DEFAULT_MAX_PROCESS_OUTPUT_BYTES = 128 * 1024 * 1024;
8
+ const DEFAULT_MAX_ATTEMPTS = 3;
9
+ export const DEFAULT_WORKSPACE_IDENTITY_TIMEOUT_MS = 60_000;
10
+ export class WorkspaceIdentityError extends Error {
11
+ reason;
12
+ constructor(reason, message) {
13
+ super(message);
14
+ this.reason = reason;
15
+ }
16
+ }
17
+ export const updateIdentityComponent = (hash, name, value) => {
18
+ const nameBuffer = Buffer.from(name, 'utf8');
19
+ const lengths = Buffer.alloc(16);
20
+ lengths.writeBigUInt64BE(BigInt(nameBuffer.length), 0);
21
+ lengths.writeBigUInt64BE(BigInt(value.byteLength), 8);
22
+ hash.update(lengths.subarray(0, 8)).update(nameBuffer).update(lengths.subarray(8)).update(value);
23
+ };
24
+ export const splitNull = (value) => {
25
+ const parts = [];
26
+ let start = 0;
27
+ for (let index = 0; index < value.length; index += 1) {
28
+ if (value[index] === 0) {
29
+ parts.push(value.subarray(start, index));
30
+ start = index + 1;
31
+ }
32
+ }
33
+ if (start < value.length) {
34
+ parts.push(value.subarray(start));
35
+ }
36
+ return parts;
37
+ };
38
+ const validatePositiveInteger = (name, value, maximum) => {
39
+ if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {
40
+ throw new Error(`${name} must be between 1 and ${maximum}`);
41
+ }
42
+ };
43
+ const resolveLimits = (options) => {
44
+ const limits = {
45
+ signal: options.signal,
46
+ maxFiles: options.maxFiles ?? DEFAULT_MAX_FILES,
47
+ maxBytes: options.maxBytes ?? DEFAULT_MAX_BYTES,
48
+ maxProcessOutputBytes: options.maxProcessOutputBytes ?? DEFAULT_MAX_PROCESS_OUTPUT_BYTES,
49
+ maxAttempts: options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
50
+ timeoutMs: options.timeoutMs ?? DEFAULT_WORKSPACE_IDENTITY_TIMEOUT_MS,
51
+ };
52
+ validatePositiveInteger('Workspace identity maxFiles', limits.maxFiles, 1_000_000);
53
+ validatePositiveInteger('Workspace identity maxBytes', limits.maxBytes, Number.MAX_SAFE_INTEGER);
54
+ validatePositiveInteger('Workspace identity maxProcessOutputBytes', limits.maxProcessOutputBytes, Number.MAX_SAFE_INTEGER);
55
+ validatePositiveInteger('Workspace identity maxAttempts', limits.maxAttempts, 10);
56
+ validatePositiveInteger('Workspace identity timeoutMs', limits.timeoutMs, 3_600_000);
57
+ return limits;
58
+ };
59
+ const assertCaptureActive = (context) => {
60
+ if (context.limits.signal?.aborted) {
61
+ throw new WorkspaceIdentityError('cancelled', 'Workspace identity capture was cancelled');
62
+ }
63
+ if (Date.now() >= context.deadline) {
64
+ throw new WorkspaceIdentityError('time_limit_exceeded', 'Workspace identity capture exceeded its time limit');
65
+ }
66
+ };
67
+ const runGit = (repoPath, args, context, output = 'buffer', maxDigestOutputBytes) => new Promise((resolve, reject) => {
68
+ assertCaptureActive(context);
69
+ const child = spawn('git', args, { cwd: repoPath, stdio: ['ignore', 'pipe', 'pipe'] });
70
+ const stdout = [];
71
+ const stderr = [];
72
+ const hash = createHash('sha256');
73
+ let digestOutputBytes = 0;
74
+ let settled = false;
75
+ const finishWithError = (error) => {
76
+ if (settled) {
77
+ return;
78
+ }
79
+ settled = true;
80
+ clearTimeout(timer);
81
+ context.limits.signal?.removeEventListener('abort', onAbort);
82
+ child.kill('SIGKILL');
83
+ reject(error);
84
+ };
85
+ const accountOutput = (chunk) => {
86
+ context.processOutputBytes += chunk.length;
87
+ if (context.processOutputBytes > context.limits.maxProcessOutputBytes) {
88
+ finishWithError(new WorkspaceIdentityError('process_output_limit_exceeded', `Git output exceeded ${context.limits.maxProcessOutputBytes} bytes`));
89
+ return false;
90
+ }
91
+ return true;
92
+ };
93
+ const onAbort = () => finishWithError(new WorkspaceIdentityError('cancelled', 'Workspace identity capture was cancelled'));
94
+ const timer = setTimeout(() => finishWithError(new WorkspaceIdentityError('time_limit_exceeded', 'Workspace identity capture exceeded its time limit')), Math.max(1, context.deadline - Date.now()));
95
+ context.limits.signal?.addEventListener('abort', onAbort, { once: true });
96
+ child.stdout.on('data', rawChunk => {
97
+ const chunk = Buffer.from(rawChunk);
98
+ if (!accountOutput(chunk)) {
99
+ return;
100
+ }
101
+ if (output === 'digest') {
102
+ digestOutputBytes += chunk.length;
103
+ if (maxDigestOutputBytes !== undefined && digestOutputBytes > maxDigestOutputBytes) {
104
+ finishWithError(new WorkspaceIdentityError('byte_limit_exceeded', `Dirty workspace content exceeded ${context.limits.maxBytes} bytes`));
105
+ return;
106
+ }
107
+ hash.update(chunk);
108
+ }
109
+ else {
110
+ stdout.push(chunk);
111
+ }
112
+ });
113
+ child.stderr.on('data', rawChunk => {
114
+ const chunk = Buffer.from(rawChunk);
115
+ if (accountOutput(chunk)) {
116
+ stderr.push(chunk);
117
+ }
118
+ });
119
+ child.on('error', error => finishWithError(new WorkspaceIdentityError(error.message.includes('ENOENT') ? 'git_unavailable' : 'worktree_unavailable', error.message)));
120
+ child.on('close', code => {
121
+ if (settled) {
122
+ return;
123
+ }
124
+ settled = true;
125
+ clearTimeout(timer);
126
+ context.limits.signal?.removeEventListener('abort', onAbort);
127
+ const stderrBuffer = Buffer.concat(stderr);
128
+ if (code !== 0) {
129
+ reject(new WorkspaceIdentityError('git_unavailable', stderrBuffer.toString('utf8').trim() || `Git exited with code ${code}`));
130
+ return;
131
+ }
132
+ resolve(output === 'digest'
133
+ ? { digest: hash.digest(), outputBytes: digestOutputBytes }
134
+ : { stdout: Buffer.concat(stdout), stderr: stderrBuffer });
135
+ });
136
+ });
137
+ const runGitBuffered = async (repoPath, args, context) => await runGit(repoPath, args, context, 'buffer');
138
+ const runGitDigest = async (repoPath, args, context, maxOutputBytes) => await runGit(repoPath, args, context, 'digest', maxOutputBytes);
139
+ const parseWorkspaceSnapshotStatus = (status) => {
140
+ const records = splitNull(status);
141
+ const untracked = [];
142
+ let dirtyFileCount = 0;
143
+ for (let index = 0; index < records.length; index += 1) {
144
+ const record = records[index];
145
+ if (record.length === 0 || record[0] === 35) {
146
+ continue;
147
+ }
148
+ if (record[0] === 49 || record[0] === 50) {
149
+ dirtyFileCount += 1;
150
+ const xyStart = record.indexOf(32) + 1;
151
+ const submoduleStart = record.indexOf(32, xyStart) + 1;
152
+ const submoduleEnd = record.indexOf(32, submoduleStart);
153
+ const submoduleState = record.subarray(submoduleStart, submoduleEnd).toString('ascii');
154
+ if (submoduleState !== 'N...') {
155
+ throw new WorkspaceIdentityError('unsupported_dirty_submodule', 'Dirty submodules cannot produce workspace identity');
156
+ }
157
+ if (record[0] === 50) {
158
+ index += 1;
159
+ }
160
+ continue;
161
+ }
162
+ if (record[0] === 63 && record[1] === 32) {
163
+ dirtyFileCount += 1;
164
+ untracked.push(record.subarray(2));
165
+ continue;
166
+ }
167
+ if (record[0] === 117 && record[1] === 32) {
168
+ dirtyFileCount += 1;
169
+ }
170
+ }
171
+ return { dirtyFileCount, untracked: untracked.sort(Buffer.compare) };
172
+ };
173
+ export const parseWorkspaceStatus = (status) => parseWorkspaceSnapshotStatus(status).untracked;
174
+ const readFileDigest = (absolutePath, context) => new Promise((resolve, reject) => {
175
+ assertCaptureActive(context);
176
+ const hash = createHash('sha256');
177
+ const stream = createReadStream(absolutePath);
178
+ let settled = false;
179
+ const finishWithError = (error) => {
180
+ if (settled) {
181
+ return;
182
+ }
183
+ settled = true;
184
+ clearTimeout(timer);
185
+ context.limits.signal?.removeEventListener('abort', onAbort);
186
+ stream.destroy();
187
+ reject(error);
188
+ };
189
+ const onAbort = () => finishWithError(new WorkspaceIdentityError('cancelled', 'Workspace identity capture was cancelled'));
190
+ const timer = setTimeout(() => finishWithError(new WorkspaceIdentityError('time_limit_exceeded', 'Workspace identity capture exceeded its time limit')), Math.max(1, context.deadline - Date.now()));
191
+ context.limits.signal?.addEventListener('abort', onAbort, { once: true });
192
+ stream.on('data', chunk => hash.update(chunk));
193
+ stream.on('error', error => finishWithError(new WorkspaceIdentityError('unstable_snapshot', error.message)));
194
+ stream.on('end', () => {
195
+ if (settled) {
196
+ return;
197
+ }
198
+ settled = true;
199
+ clearTimeout(timer);
200
+ context.limits.signal?.removeEventListener('abort', onAbort);
201
+ resolve(hash.digest());
202
+ });
203
+ });
204
+ const digestUntrackedManifest = async (repoPath, paths, context, maxContentBytes) => {
205
+ const hash = createHash('sha256');
206
+ let totalBytes = 0;
207
+ for (const relativePath of paths) {
208
+ assertCaptureActive(context);
209
+ const absolutePath = Buffer.concat([Buffer.from(repoPath), Buffer.from('/'), relativePath]);
210
+ let stats;
211
+ try {
212
+ stats = await lstat(absolutePath);
213
+ }
214
+ catch (error) {
215
+ throw new WorkspaceIdentityError('unstable_snapshot', error instanceof Error ? error.message : 'Untracked entry disappeared');
216
+ }
217
+ let type;
218
+ let mode;
219
+ let digest;
220
+ if (stats.isSymbolicLink()) {
221
+ const target = await readlink(absolutePath, { encoding: 'buffer' });
222
+ totalBytes += target.length;
223
+ type = 'symlink';
224
+ mode = '120000';
225
+ digest = createHash('sha256').update(target).digest();
226
+ }
227
+ else if (stats.isFile()) {
228
+ totalBytes += stats.size;
229
+ type = 'file';
230
+ mode = stats.mode & 0o111 ? '100755' : '100644';
231
+ if (totalBytes > maxContentBytes) {
232
+ throw new WorkspaceIdentityError('byte_limit_exceeded', `Untracked content exceeded ${context.limits.maxBytes} bytes`);
233
+ }
234
+ digest = await readFileDigest(absolutePath, context);
235
+ }
236
+ else {
237
+ throw new WorkspaceIdentityError('unsupported_untracked_entry', 'Untracked workspace entries must be files or symbolic links');
238
+ }
239
+ if (totalBytes > maxContentBytes) {
240
+ throw new WorkspaceIdentityError('byte_limit_exceeded', `Untracked content exceeded ${context.limits.maxBytes} bytes`);
241
+ }
242
+ updateIdentityComponent(hash, 'path', relativePath);
243
+ updateIdentityComponent(hash, 'type', Buffer.from(type));
244
+ updateIdentityComponent(hash, 'mode', Buffer.from(mode));
245
+ updateIdentityComponent(hash, 'content-sha256', digest);
246
+ }
247
+ return { digest: hash.digest(), contentBytes: totalBytes };
248
+ };
249
+ const readHead = async (repoPath, context, allowUnborn) => {
250
+ try {
251
+ return Buffer.from((await runGitBuffered(repoPath, ['rev-parse', '--verify', 'HEAD'], context)).stdout.toString('ascii').trim(), 'ascii');
252
+ }
253
+ catch (error) {
254
+ if (error instanceof WorkspaceIdentityError && /needed a single revision|unknown revision|ambiguous argument/i.test(error.message)) {
255
+ if (allowUnborn) {
256
+ return null;
257
+ }
258
+ throw new WorkspaceIdentityError('git_unavailable', error.message);
259
+ }
260
+ throw error;
261
+ }
262
+ };
263
+ const readSnapshot = async (repoPath, context, allowUnborn) => {
264
+ const head = await readHead(repoPath, context, allowUnborn);
265
+ const status = (await runGitBuffered(repoPath, ['status', '--porcelain=v2', '--untracked-files=all', '-z'], context)).stdout;
266
+ const parsedStatus = parseWorkspaceSnapshotStatus(status);
267
+ if (parsedStatus.dirtyFileCount > context.limits.maxFiles) {
268
+ throw new WorkspaceIdentityError('file_limit_exceeded', `Workspace contains more than ${context.limits.maxFiles} dirty files`);
269
+ }
270
+ return { head, status, ...parsedStatus };
271
+ };
272
+ const snapshotMatches = (left, right) => ((left.head === null ? right.head === null : right.head !== null && left.head.equals(right.head))
273
+ && left.status.equals(right.status));
274
+ const unavailable = (error) => {
275
+ if (error instanceof WorkspaceIdentityError) {
276
+ return { state: 'unavailable', reason: error.reason, message: error.message };
277
+ }
278
+ return {
279
+ state: 'unavailable',
280
+ reason: 'worktree_unavailable',
281
+ message: error instanceof Error ? error.message : 'Workspace identity capture failed',
282
+ };
283
+ };
284
+ const assertWorkspaceDirectory = async (repoPath) => {
285
+ const workspaceStats = await lstat(repoPath);
286
+ if (!workspaceStats.isDirectory()) {
287
+ throw new Error('Workspace path is not a directory');
288
+ }
289
+ };
290
+ const captureDirtyDigests = async (repoPath, snapshot, context) => {
291
+ const tracked = snapshot.head
292
+ ? await runGitDigest(repoPath, ['diff', '--binary', '--no-ext-diff', '--full-index', 'HEAD', '--'], context, context.limits.maxBytes)
293
+ : await runGitDigest(repoPath, ['diff', '--binary', '--no-ext-diff', '--full-index', '--cached', '--'], context, context.limits.maxBytes);
294
+ const afterTrackedBytes = context.limits.maxBytes - tracked.outputBytes;
295
+ const unstaged = snapshot.head
296
+ ? null
297
+ : await runGitDigest(repoPath, ['diff', '--binary', '--no-ext-diff', '--full-index', '--'], context, afterTrackedBytes);
298
+ const remainingBytes = afterTrackedBytes - (unstaged?.outputBytes ?? 0);
299
+ const untracked = await digestUntrackedManifest(repoPath, snapshot.untracked, context, remainingBytes);
300
+ const totalBytes = tracked.outputBytes + (unstaged?.outputBytes ?? 0) + untracked.contentBytes;
301
+ if (totalBytes > context.limits.maxBytes) {
302
+ throw new WorkspaceIdentityError('byte_limit_exceeded', `Dirty workspace content exceeded ${context.limits.maxBytes} bytes`);
303
+ }
304
+ return {
305
+ tracked: tracked.digest,
306
+ unstaged: unstaged?.digest ?? null,
307
+ untracked: untracked.digest,
308
+ };
309
+ };
310
+ export const captureWorkspaceIdentity = async (repoPath, options = {}) => {
311
+ const limits = resolveLimits(options);
312
+ const context = { limits, deadline: Date.now() + limits.timeoutMs, processOutputBytes: 0 };
313
+ try {
314
+ assertCaptureActive(context);
315
+ await assertWorkspaceDirectory(repoPath);
316
+ }
317
+ catch (error) {
318
+ return unavailable(error);
319
+ }
320
+ for (let attempt = 0; attempt < limits.maxAttempts; attempt += 1) {
321
+ try {
322
+ const before = await readSnapshot(repoPath, context, true);
323
+ const beforeDigests = await captureDirtyDigests(repoPath, before, context);
324
+ const after = await readSnapshot(repoPath, context, true);
325
+ const afterDigests = await captureDirtyDigests(repoPath, after, context);
326
+ if (!snapshotMatches(before, after)
327
+ || !beforeDigests.tracked.equals(afterDigests.tracked)
328
+ || (beforeDigests.unstaged !== null
329
+ && (afterDigests.unstaged === null || !beforeDigests.unstaged.equals(afterDigests.unstaged)))
330
+ || !beforeDigests.untracked.equals(afterDigests.untracked)) {
331
+ continue;
332
+ }
333
+ const dirtyHash = createHash('sha256');
334
+ updateIdentityComponent(dirtyHash, 'format', Buffer.from('archon-workspace-dirty-v1'));
335
+ updateIdentityComponent(dirtyHash, 'status', before.status);
336
+ updateIdentityComponent(dirtyHash, before.head ? 'tracked-diff-sha256' : 'index-diff-sha256', beforeDigests.tracked);
337
+ if (beforeDigests.unstaged) {
338
+ updateIdentityComponent(dirtyHash, 'unstaged-diff-sha256', beforeDigests.unstaged);
339
+ }
340
+ updateIdentityComponent(dirtyHash, 'untracked-manifest-sha256', beforeDigests.untracked);
341
+ const dirtyFingerprint = dirtyHash.digest('hex');
342
+ const head = before.head?.toString('ascii') ?? 'unborn';
343
+ const hash = createHash('sha256');
344
+ updateIdentityComponent(hash, 'format', Buffer.from('archon-workspace-v1'));
345
+ updateIdentityComponent(hash, 'head', Buffer.from(head));
346
+ updateIdentityComponent(hash, 'dirty-fingerprint', Buffer.from(dirtyFingerprint));
347
+ return {
348
+ state: 'available',
349
+ algorithm: 'sha256',
350
+ fingerprint: hash.digest('hex'),
351
+ components: { format: 'archon-workspace-v1', head, dirtyFingerprint },
352
+ };
353
+ }
354
+ catch (error) {
355
+ if (error instanceof WorkspaceIdentityError && error.reason === 'unstable_snapshot') {
356
+ continue;
357
+ }
358
+ return unavailable(error);
359
+ }
360
+ }
361
+ return {
362
+ state: 'unavailable',
363
+ reason: 'unstable_snapshot',
364
+ message: `Workspace changed during ${limits.maxAttempts} identity capture attempts`,
365
+ };
366
+ };
367
+ export const captureCheckCompatibleWorkspaceIdentity = async (repoPath, options = {}) => {
368
+ const limits = resolveLimits({
369
+ maxFiles: 1_000_000,
370
+ maxBytes: Number.MAX_SAFE_INTEGER,
371
+ maxProcessOutputBytes: Number.MAX_SAFE_INTEGER,
372
+ timeoutMs: 3_600_000,
373
+ ...options,
374
+ });
375
+ const context = { limits, deadline: Date.now() + limits.timeoutMs, processOutputBytes: 0 };
376
+ try {
377
+ assertCaptureActive(context);
378
+ await assertWorkspaceDirectory(repoPath);
379
+ }
380
+ catch (error) {
381
+ return unavailable(error);
382
+ }
383
+ for (let attempt = 0; attempt < limits.maxAttempts; attempt += 1) {
384
+ try {
385
+ let before;
386
+ try {
387
+ before = await readSnapshot(repoPath, context, false);
388
+ }
389
+ catch (error) {
390
+ if (error instanceof WorkspaceIdentityError && error.reason === 'git_unavailable'
391
+ && /needed a single revision|unknown revision|ambiguous argument/i.test(error.message)) {
392
+ return { state: 'unavailable', reason: 'unborn_repository', message: 'Repository does not have an initial commit' };
393
+ }
394
+ throw error;
395
+ }
396
+ const beforeDigests = await captureDirtyDigests(repoPath, before, context);
397
+ const hash = createHash('sha256');
398
+ updateIdentityComponent(hash, 'format', Buffer.from('archon-check-workspace-v1'));
399
+ updateIdentityComponent(hash, 'head', before.head);
400
+ updateIdentityComponent(hash, 'status', before.status);
401
+ updateIdentityComponent(hash, 'tracked-diff-sha256', beforeDigests.tracked);
402
+ const after = await readSnapshot(repoPath, context, false);
403
+ const afterDigests = await captureDirtyDigests(repoPath, after, context);
404
+ if (!snapshotMatches(before, after)
405
+ || !beforeDigests.tracked.equals(afterDigests.tracked)
406
+ || !beforeDigests.untracked.equals(afterDigests.untracked)) {
407
+ continue;
408
+ }
409
+ updateIdentityComponent(hash, 'untracked-manifest-sha256', beforeDigests.untracked);
410
+ return {
411
+ state: 'available',
412
+ algorithm: 'sha256',
413
+ fingerprint: hash.digest('hex'),
414
+ head: before.head.toString('ascii'),
415
+ };
416
+ }
417
+ catch (error) {
418
+ if (error instanceof WorkspaceIdentityError && error.reason === 'unstable_snapshot') {
419
+ continue;
420
+ }
421
+ const result = unavailable(error);
422
+ return result.reason === 'unsupported_dirty_submodule'
423
+ ? { ...result, message: 'Dirty submodules cannot produce check workspace evidence' }
424
+ : result;
425
+ }
426
+ }
427
+ return {
428
+ state: 'unavailable',
429
+ reason: 'unstable_snapshot',
430
+ message: `Workspace changed during ${limits.maxAttempts} identity capture attempts`,
431
+ };
432
+ };
433
+ //# sourceMappingURL=workspaceIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceIdentity.js","sourceRoot":"","sources":["../../../server/lib/workspaceIdentity.ts"],"names":[],"mappings":"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"}
@@ -1095,8 +1095,8 @@ export const runPlannerPrompt = (tool, model, variant, prompt, cwd, options = {}
1095
1095
  watchdogTimer = null;
1096
1096
  }
1097
1097
  };
1098
- const bindResolvedOpencodeSession = (sessionId) => {
1099
- const normalized = sessionId?.trim();
1098
+ const bindResolvedOpencodeSession = (resolvedId) => {
1099
+ const normalized = resolvedId?.trim();
1100
1100
  if (!normalized) {
1101
1101
  return;
1102
1102
  }
@@ -1188,11 +1188,12 @@ export const runPlannerPrompt = (tool, model, variant, prompt, cwd, options = {}
1188
1188
  const startTime = Date.now();
1189
1189
  let firstFinalAnswerTime = null;
1190
1190
  const emitProgress = () => {
1191
- options.onProgress?.({
1191
+ const progress = {
1192
1192
  log: logLines.length > 0 ? logLines.join('\n\n') : null,
1193
1193
  response: responseLines.length > 0 ? responseLines.join('\n\n') : null,
1194
- });
1195
- subagentTracker?.updateMain(logLines.length > 0 ? logLines.join('\n\n') : null, responseLines.length > 0 ? responseLines.join('\n\n') : null);
1194
+ };
1195
+ subagentTracker?.updateMain(progress.log, progress.response);
1196
+ options.onProgress?.(progress);
1196
1197
  };
1197
1198
  const isHiddenOpenTag = /^\s*<archon-[a-z0-9-]+>\s*$/i;
1198
1199
  const isHiddenCloseTag = /^\s*<\/archon-[a-z0-9-]+>\s*$/i;
@@ -1219,7 +1220,7 @@ export const runPlannerPrompt = (tool, model, variant, prompt, cwd, options = {}
1219
1220
  }
1220
1221
  subagentTracker?.handle(subagentEvents);
1221
1222
  if (providerSessionId) {
1222
- opencodeSubagentMonitor?.setParentSessionId(providerSessionId);
1223
+ bindResolvedOpencodeSession(providerSessionId);
1223
1224
  }
1224
1225
  if (isHiddenOpenTag.test(line)) {
1225
1226
  insideHiddenBlock = true;
@@ -1267,7 +1268,7 @@ export const runPlannerPrompt = (tool, model, variant, prompt, cwd, options = {}
1267
1268
  }
1268
1269
  subagentTracker?.handle(subagentEvents);
1269
1270
  if (providerSessionId) {
1270
- opencodeSubagentMonitor?.setParentSessionId(providerSessionId);
1271
+ bindResolvedOpencodeSession(providerSessionId);
1271
1272
  }
1272
1273
  if (logFragment !== null) {
1273
1274
  logLines.push(logFragment);
@@ -1277,6 +1278,7 @@ export const runPlannerPrompt = (tool, model, variant, prompt, cwd, options = {}
1277
1278
  responseLines.push(responseFragment);
1278
1279
  }
1279
1280
  }
1281
+ opencodeSubagentMonitor?.refresh();
1280
1282
  const rawOutput = Buffer.concat(stdoutChunks).toString().trim();
1281
1283
  const errorOutput = Buffer.concat(stderrChunks).toString().trim();
1282
1284
  const recoveredResponse = recoveryTracker.getRecoveredResponse();