project-athena 0.3.0 → 0.5.0

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 (140) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +56 -4
  3. package/dist/{activity-P4UUFHWV.js → activity-XCHKBZTG.js} +6 -6
  4. package/dist/{agents-3HTSQGL2.js → agents-HUJ4JXIB.js} +6 -6
  5. package/dist/{ai-ASL4FFQ7.js → ai-LGTLQKL4.js} +3 -3
  6. package/dist/{analyze-F3YOILNL.js → analyze-AP4XJT7D.js} +10 -9
  7. package/dist/{chunk-ZB7LC6FP.js → chunk-3KFOI2X4.js} +2 -2
  8. package/dist/{chunk-PANVPNYF.js → chunk-44EGCEB2.js} +59 -251
  9. package/dist/{chunk-SJOOXO34.js → chunk-4FETKOY3.js} +9 -8
  10. package/dist/chunk-4IIBVTBS.js +76 -0
  11. package/dist/{chunk-LEMPCNAY.js → chunk-56EXAGTM.js} +3 -3
  12. package/dist/{chunk-32PRS2MG.js → chunk-6OSQMXUP.js} +5 -5
  13. package/dist/{chunk-OLPSEQS5.js → chunk-AKOI4VTD.js} +10 -1
  14. package/dist/{chunk-EF6GHOIN.js → chunk-C25FDXOO.js} +133 -23
  15. package/dist/{chunk-S7T6VX56.js → chunk-DH5AGULY.js} +8 -4
  16. package/dist/chunk-F65QINMR.js +702 -0
  17. package/dist/chunk-GU3ZX2J7.js +166 -0
  18. package/dist/chunk-GYQG4Q2N.js +108 -0
  19. package/dist/chunk-IDODPGTX.js +595 -0
  20. package/dist/chunk-KJYSNZXS.js +934 -0
  21. package/dist/{chunk-PR53DT7I.js → chunk-L2EHJCH4.js} +8 -8
  22. package/dist/{chunk-65TSRDQ3.js → chunk-P4TRQMES.js} +2 -2
  23. package/dist/{chunk-TGJUUB44.js → chunk-PZPMWCXS.js} +5 -5
  24. package/dist/chunk-QCC4VJUH.js +217 -0
  25. package/dist/{chunk-DOQMAZL5.js → chunk-R5AX7VST.js} +3 -3
  26. package/dist/{chunk-JY6BFIJJ.js → chunk-RQKGT2EK.js} +3 -3
  27. package/dist/{chunk-PDFQ5BFG.js → chunk-SVTEJYMS.js} +4 -155
  28. package/dist/{chunk-VSYBC3VY.js → chunk-UMWX4UTK.js} +2 -2
  29. package/dist/{chunk-RXNRMIZP.js → chunk-WUIC65QO.js} +2 -2
  30. package/dist/{chunk-JCGDR4UV.js → chunk-WWQ5NKEC.js} +3 -1
  31. package/dist/{chunk-XB66PZ6Z.js → chunk-X7EYOAEX.js} +2 -2
  32. package/dist/chunk-Y6SDMZET.js +278 -0
  33. package/dist/{chunk-2RS6TA3D.js → chunk-YRIS7ZS6.js} +28 -17
  34. package/dist/{clean-S7PKCOLM.js → clean-LQOG56AM.js} +4 -4
  35. package/dist/cli.js +2 -2
  36. package/dist/{context-AH5MFHRG.js → context-G5YHY3L2.js} +24 -10
  37. package/dist/{doctor-RSJMLE2P.js → doctor-L34QJ7WR.js} +17 -10
  38. package/dist/{event-TNT6CQZR.js → event-6YW6TGFI.js} +3 -3
  39. package/dist/{git-hook-YZNZGAAP.js → git-hook-Y7Y262F7.js} +2 -2
  40. package/dist/{init-2V34DVRQ.js → init-427QR5AS.js} +10 -9
  41. package/dist/{mcp-T2GRTEX5.js → mcp-DWNWRGJW.js} +196 -21
  42. package/dist/memory-XBZCYQLW.js +393 -0
  43. package/dist/{open-2QSZKKUG.js → open-LJMOB6U2.js} +262 -69
  44. package/dist/{program-V2USHGXN.js → program-DCP526LU.js} +63 -32
  45. package/dist/{review-R3R2J5BJ.js → review-VEJBPACX.js} +14 -11
  46. package/dist/{rules-4FXJUCXB.js → rules-M4DLLXBL.js} +4 -4
  47. package/dist/scan-JVKCVHPD.js +939 -0
  48. package/dist/{security-PI4LXCOB.js → security-JTJN3E7K.js} +15 -11
  49. package/dist/{staged-check-HHIBKKMR.js → staged-check-PQSLGQBW.js} +15 -13
  50. package/dist/{status-6M73WX5I.js → status-PO27BSOZ.js} +10 -4
  51. package/dist/{sync-3ZNJDSSU.js → sync-GVO2VHPI.js} +14 -12
  52. package/dist/{watch-USN5CQIV.js → watch-TEHFO47V.js} +14 -12
  53. package/dist/web/assets/{Editor-BI56-HX5.js → Editor-Bnilgch0.js} +1 -1
  54. package/dist/web/assets/{abnfDiagram-O67JEVCF-y_9px2ob.js → abnfDiagram-O67JEVCF-DW9LWr8f.js} +1 -1
  55. package/dist/web/assets/architecture-7GRP2DOG-BWDZV2yn.js +1 -0
  56. package/dist/web/assets/{architectureDiagram-NJMV4G6O-lB6fcVzU.js → architectureDiagram-NJMV4G6O-0eKeQRhj.js} +1 -1
  57. package/dist/web/assets/{blockDiagram-BEXU5L5S-DcM5pEjM.js → blockDiagram-BEXU5L5S-D5i3-ogI.js} +1 -1
  58. package/dist/web/assets/{c4Diagram-YGBWAQC7-CJgqxTY2.js → c4Diagram-YGBWAQC7-BAWQZrEu.js} +1 -1
  59. package/dist/web/assets/channel-Bkh05NKd.js +1 -0
  60. package/dist/web/assets/{chunk-3FUC2YCW-B8l_VuWR.js → chunk-3FUC2YCW-fKRGOZF3.js} +1 -1
  61. package/dist/web/assets/{chunk-5DYCD2WN-CZecgNhf.js → chunk-5DYCD2WN-C5jOlx42.js} +1 -1
  62. package/dist/web/assets/{chunk-742MDFTN-BeZ7P5jB.js → chunk-742MDFTN-urY4RP_A.js} +1 -1
  63. package/dist/web/assets/{chunk-7INBJB4K-IKy0pr5m.js → chunk-7INBJB4K-nk48sKqZ.js} +1 -1
  64. package/dist/web/assets/{chunk-7M6MHVWA-Dg_QqJEX.js → chunk-7M6MHVWA-BfBD9X0F.js} +1 -1
  65. package/dist/web/assets/{chunk-7PRAP22T-DqQNS8oq.js → chunk-7PRAP22T-jYf59QlI.js} +1 -1
  66. package/dist/web/assets/{chunk-GTNCS2PH-x4sM51nJ.js → chunk-GTNCS2PH-BOCxryKf.js} +1 -1
  67. package/dist/web/assets/{chunk-GWA4HPMP-CE5GcwVN.js → chunk-GWA4HPMP-CFpaW0ru.js} +1 -1
  68. package/dist/web/assets/{chunk-MBY4JIJT-DA_D1hjF.js → chunk-MBY4JIJT-BIB8HctN.js} +1 -1
  69. package/dist/web/assets/{chunk-NETBCI7D-CeJ3XBZ2.js → chunk-NETBCI7D-CpUUK6rh.js} +1 -1
  70. package/dist/web/assets/{chunk-O7XYJQB3-BH2gESvO.js → chunk-O7XYJQB3-BNx_V4Oi.js} +1 -1
  71. package/dist/web/assets/{chunk-UA2S7LBM-BWr0xCux.js → chunk-UA2S7LBM-D3tMiIOY.js} +1 -1
  72. package/dist/web/assets/{chunk-WEXAMYUT-B4QwUZPM.js → chunk-WEXAMYUT-CC-3C32l.js} +1 -1
  73. package/dist/web/assets/{chunk-Z7XXMR3K-BxcA-y5B.js → chunk-Z7XXMR3K-BzhxKQUc.js} +1 -1
  74. package/dist/web/assets/{chunk-ZIGJFQKS-BZYvP63G.js → chunk-ZIGJFQKS-D4tBHzxg.js} +1 -1
  75. package/dist/web/assets/{classDiagram-v2-NBCMYWYE-BS3P_NXb.js → classDiagram-v2-NBCMYWYE-BbtyanXR.js} +1 -1
  76. package/dist/web/assets/{cynefin-OW5HDTMX-BALD4Pve.js → cynefin-OW5HDTMX-BIArb8W1.js} +1 -1
  77. package/dist/web/assets/{cynefinDiagram-VND7K2PF-BM2y4W6d.js → cynefinDiagram-VND7K2PF-BrAcfkXL.js} +1 -1
  78. package/dist/web/assets/{dagre-6A5THRUB-PTfOrIdF.js → dagre-6A5THRUB-BcHXRl4s.js} +1 -1
  79. package/dist/web/assets/{diagram-22UHCM2B-CpXEHhUl.js → diagram-22UHCM2B-Dx9tSCdE.js} +1 -1
  80. package/dist/web/assets/{diagram-3UASUU5V-DPHfXzr6.js → diagram-3UASUU5V-CLLDP9yH.js} +1 -1
  81. package/dist/web/assets/{diagram-ATOU4E4O-DMBNXvAC.js → diagram-ATOU4E4O-B46H9iPt.js} +1 -1
  82. package/dist/web/assets/{diagram-CDSNMT55-CDLe1M7G.js → diagram-CDSNMT55-CYtvB6aG.js} +1 -1
  83. package/dist/web/assets/{diagram-MLGK6HIB-D6L8oE7j.js → diagram-MLGK6HIB-Dar7ktoX.js} +1 -1
  84. package/dist/web/assets/{diagram-MPIPVDR6-CP-S7rrQ.js → diagram-MPIPVDR6-C-DljnYN.js} +1 -1
  85. package/dist/web/assets/{ebnfDiagram-ZINNZB2B-CkUc63TK.js → ebnfDiagram-ZINNZB2B-Dv_3jWnh.js} +1 -1
  86. package/dist/web/assets/{elk-276RUBZZ-C1CAJLH_.js → elk-276RUBZZ-DnHciE9k.js} +1 -1
  87. package/dist/web/assets/{erDiagram-OPXOYQCR-DXBnaTHm.js → erDiagram-OPXOYQCR-Bn46KrHz.js} +1 -1
  88. package/dist/web/assets/eventmodeling-NTZA5JFV-DYwoptMd.js +1 -0
  89. package/dist/web/assets/flowDiagram-KWPJA3E3-y4rS0gIB.js +1 -0
  90. package/dist/web/assets/{ganttDiagram-FUAMR5RP-BVm8SiGg.js → ganttDiagram-FUAMR5RP-DOjjJtqz.js} +1 -1
  91. package/dist/web/assets/{gitGraph-4MIJSDKK-Dm7xBrW0.js → gitGraph-4MIJSDKK-BIoMXJRQ.js} +1 -1
  92. package/dist/web/assets/{gitGraphDiagram-X574FWY7-D_PIKKhx.js → gitGraphDiagram-X574FWY7-BsJ01R0v.js} +1 -1
  93. package/dist/web/assets/{index-CeOIBpu2.js → index-Cen0jOXj.js} +5 -4
  94. package/dist/web/assets/{index-DKE3ojTe.css → index-WwRY6n68.css} +1 -1
  95. package/dist/web/assets/{info-A6RAGUB7-CLGrx8pn.js → info-A6RAGUB7-BmlXzRWj.js} +1 -1
  96. package/dist/web/assets/{infoDiagram-VRGFBTTK-BlBjaKm7.js → infoDiagram-VRGFBTTK-CYPJPmBP.js} +1 -1
  97. package/dist/web/assets/{ishikawaDiagram-OU5B5YK6-Kxe7GGS3.js → ishikawaDiagram-OU5B5YK6-YN96geky.js} +1 -1
  98. package/dist/web/assets/{journeyDiagram-ZHPQQLJL-wCMoHK4M.js → journeyDiagram-ZHPQQLJL-20juojKY.js} +1 -1
  99. package/dist/web/assets/{kanban-definition-PNTS6WVX-BxdCz9Ko.js → kanban-definition-PNTS6WVX-BhCKIEbP.js} +1 -1
  100. package/dist/web/assets/{line-Zf11FnWF.js → line-BERsMFG6.js} +1 -1
  101. package/dist/web/assets/{mermaid-parser.core-BvFFklev.js → mermaid-parser.core-Bis_wTB-.js} +3 -3
  102. package/dist/web/assets/{mermaid.core-Cd_Ssti9.js → mermaid.core-DMsM3ZX7.js} +4 -4
  103. package/dist/web/assets/{mindmap-definition-NLK3R4M7-BGPQl-GY.js → mindmap-definition-NLK3R4M7-BkcGdOfv.js} +1 -1
  104. package/dist/web/assets/{packet-AYTQ26CC-6lI3cEX_.js → packet-AYTQ26CC-Bh30-JJX.js} +1 -1
  105. package/dist/web/assets/{pegDiagram-GJSIUBJH-BPIjlSAj.js → pegDiagram-GJSIUBJH-DxnIo9RF.js} +1 -1
  106. package/dist/web/assets/{pie-WAS4IAKB-D6Dzj3Ja.js → pie-WAS4IAKB-ChaTr-GD.js} +1 -1
  107. package/dist/web/assets/{pieDiagram-5QR66LMP-DtA-vZmv.js → pieDiagram-5QR66LMP-CzAp78FM.js} +1 -1
  108. package/dist/web/assets/{quadrantDiagram-O4NWA36T-EettyqQn.js → quadrantDiagram-O4NWA36T-BDSE-cfY.js} +1 -1
  109. package/dist/web/assets/{radar-RG4KPBEZ-xmRc3Dl8.js → radar-RG4KPBEZ-DgJ-o_dq.js} +1 -1
  110. package/dist/web/assets/{railroad-74A4TZTK-BLB7dhOn.js → railroad-74A4TZTK-C8MmcBKz.js} +1 -1
  111. package/dist/web/assets/railroad-abnf-HS5TGJTU-CTLXjcdP.js +1 -0
  112. package/dist/web/assets/railroad-ebnf-LZEXJU2U-ggWsTTL0.js +1 -0
  113. package/dist/web/assets/railroad-peg-WCYAUIDC-D1mCX705.js +1 -0
  114. package/dist/web/assets/{railroadDiagram-XR7U4H2S-PBw4We6b.js → railroadDiagram-XR7U4H2S-DfbcWRNh.js} +1 -1
  115. package/dist/web/assets/{requirementDiagram-PLB6GJNP-DjQpaUFA.js → requirementDiagram-PLB6GJNP-DM3nksxs.js} +1 -1
  116. package/dist/web/assets/{sankeyDiagram-IPEJSGJF-CBW-_AoF.js → sankeyDiagram-IPEJSGJF-DthUpiiC.js} +1 -1
  117. package/dist/web/assets/{sequenceDiagram-PO4LG4MO-DEoPYqY9.js → sequenceDiagram-PO4LG4MO-DLA3nuvA.js} +1 -1
  118. package/dist/web/assets/{stateDiagram-v2-GCMORJYK-UZq5rPud.js → stateDiagram-v2-GCMORJYK-B0X6ihBW.js} +1 -1
  119. package/dist/web/assets/{swimlanes-2SLR337P-CACfuXJR.js → swimlanes-2SLR337P-B4qWe6vE.js} +1 -1
  120. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-ClIk3e7S.js +8 -0
  121. package/dist/web/assets/{timeline-definition-EJHVYXUP-CYJl7mP-.js → timeline-definition-EJHVYXUP-F-cDzYrj.js} +1 -1
  122. package/dist/web/assets/{treeView-Q6P3EWNA-DtZ5nkPQ.js → treeView-Q6P3EWNA-BaI30nLZ.js} +1 -1
  123. package/dist/web/assets/{treemap-WGGIJYW6-m49GDM-M.js → treemap-WGGIJYW6-D2jGGoMl.js} +1 -1
  124. package/dist/web/assets/{usecaseDiagram-POWQR4AR-C2Vg20UK.js → usecaseDiagram-POWQR4AR-B9qoAQCy.js} +1 -1
  125. package/dist/web/assets/{vennDiagram-UO4OBE2U-C07v5OGI.js → vennDiagram-UO4OBE2U-DGVNOaKO.js} +1 -1
  126. package/dist/web/assets/{wardley-WFR3VGLG-C9Z7EZtz.js → wardley-WFR3VGLG-DbKqhNAh.js} +1 -1
  127. package/dist/web/assets/{wardleyDiagram-VNRHLVJA-DdA8CcSC.js → wardleyDiagram-VNRHLVJA-BgZ1gprw.js} +1 -1
  128. package/dist/web/assets/{xychartDiagram-PMCCYNJV-C9EZw07b.js → xychartDiagram-PMCCYNJV-D73RYid1.js} +1 -1
  129. package/dist/web/index.html +2 -2
  130. package/package.json +3 -1
  131. package/dist/chunk-CXUTYCZX.js +0 -238
  132. package/dist/chunk-LMOFZNTQ.js +0 -379
  133. package/dist/web/assets/architecture-7GRP2DOG-DyxkwYiW.js +0 -1
  134. package/dist/web/assets/channel-BvDD7AMO.js +0 -1
  135. package/dist/web/assets/eventmodeling-NTZA5JFV-cLIzvgDp.js +0 -1
  136. package/dist/web/assets/flowDiagram-KWPJA3E3-D7Zq63VQ.js +0 -1
  137. package/dist/web/assets/railroad-abnf-HS5TGJTU-DBFym6g8.js +0 -1
  138. package/dist/web/assets/railroad-ebnf-LZEXJU2U-CkG28ig8.js +0 -1
  139. package/dist/web/assets/railroad-peg-WCYAUIDC-Df_Ifaad.js +0 -1
  140. package/dist/web/assets/swimlanesDiagram-TC7HE7FX-CDSrqdgx.js +0 -8
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ MAX_SECRET_FINDINGS,
4
+ scanFilesForSecrets
5
+ } from "./chunk-44EGCEB2.js";
6
+ import {
7
+ walkProject
8
+ } from "./chunk-ELKFRTZT.js";
9
+ import {
10
+ MAX_GENERIC_LINE,
11
+ SECRET_PATTERNS,
12
+ ephemeralFingerprint
13
+ } from "./chunk-WWQ5NKEC.js";
14
+
15
+ // src/core/findings/finding.ts
16
+ import { z } from "zod";
17
+ var CATEGORIES = ["secret", "dependency", "sast", "iac", "license", "quality", "review", "memory"];
18
+ var SEVERITIES = ["critical", "high", "medium", "low", "info", "unrated"];
19
+ var SEVERITY_RANK = { critical: 5, high: 4, medium: 3, low: 2, info: 1, unrated: 0 };
20
+ var CONFIDENCES = ["high", "medium", "low"];
21
+ var CONFIDENCE_RANK = { high: 3, medium: 2, low: 1 };
22
+ var Location = z.object({
23
+ file: z.string(),
24
+ startLine: z.number().int().positive().optional(),
25
+ startColumn: z.number().int().positive().optional(),
26
+ endLine: z.number().int().positive().optional(),
27
+ endColumn: z.number().int().positive().optional()
28
+ });
29
+ var PackageRef = z.object({
30
+ ecosystem: z.string(),
31
+ name: z.string(),
32
+ version: z.string().optional(),
33
+ /** Manifest or lockfile the package comes from, if known. */
34
+ manifest: z.string().optional(),
35
+ advisoryIds: z.array(z.string()).default([]),
36
+ vulnerableRange: z.string().optional(),
37
+ fixedIn: z.string().optional(),
38
+ fixAvailable: z.boolean().optional()
39
+ });
40
+ var Finding = z.object({
41
+ /** Stable identity (32 hex). Never derived from a secret's value; see fingerprint.ts. */
42
+ fingerprint: z.string().regex(/^[a-f0-9]{32}$/),
43
+ /** e.g. `secret/stripe-key`, `dependency/vulnerable-package`, `review/env-file`, `sast/js/sql-concat`. */
44
+ ruleId: z.string().regex(/^[a-z0-9][a-z0-9._/-]{1,120}$/),
45
+ category: z.enum(CATEGORIES),
46
+ severity: z.enum(SEVERITIES),
47
+ confidence: z.enum(CONFIDENCES),
48
+ label: z.enum(["FACT", "DETECTED", "INFERRED"]),
49
+ /** Heuristic: "worth checking", not a confirmed problem. Rendered as "Potential …". */
50
+ potential: z.boolean().default(false),
51
+ title: z.string(),
52
+ message: z.string(),
53
+ cwe: z.array(z.string().regex(/^CWE-\d+$/)).default([]),
54
+ owasp: z.array(z.string()).default([]),
55
+ location: Location.optional(),
56
+ package: PackageRef.optional(),
57
+ /** Which engine produced it: `athena`, `npm-audit`, `semgrep`, … */
58
+ engine: z.object({ id: z.string(), version: z.string().optional() }),
59
+ /** Other engines that reported the same problem (after de-duplication). */
60
+ alsoReportedBy: z.array(z.string()).default([]),
61
+ help: z.object({ text: z.string(), url: z.string().optional() }).optional()
62
+ });
63
+ var Coverage = z.object({
64
+ engine: z.string(),
65
+ category: z.enum(CATEGORIES),
66
+ /** ok: ran · unavailable: not installed / nothing to scan · skipped: excluded by policy or options · failed/timeout: ran without usable output */
67
+ status: z.enum(["ok", "unavailable", "skipped", "failed", "timeout"]),
68
+ reason: z.string().optional(),
69
+ /** What was scanned when an engine runs per input (e.g. a requirements file). */
70
+ target: z.string().optional(),
71
+ languages: z.array(z.string()).default([]),
72
+ filesScanned: z.number().int().nonnegative().optional(),
73
+ filesSkipped: z.object({
74
+ tooLarge: z.number().int().nonnegative().default(0),
75
+ binary: z.number().int().nonnegative().default(0),
76
+ minified: z.number().int().nonnegative().default(0),
77
+ unreadable: z.number().int().nonnegative().default(0),
78
+ unsupported: z.number().int().nonnegative().default(0)
79
+ }).optional(),
80
+ /** Whether the engine contacted the network (e.g. an audit tool querying an advisory database). */
81
+ network: z.boolean().default(false),
82
+ durationMs: z.number().nonnegative()
83
+ });
84
+ var SCAN_SCOPES = ["all", "base", "staged", "changed"];
85
+ var ScanResult = z.object({
86
+ schemaVersion: z.literal(1),
87
+ scannedAt: z.string(),
88
+ durationMs: z.number().nonnegative(),
89
+ scope: z.object({ mode: z.enum(SCAN_SCOPES), base: z.string().optional(), files: z.number().int().nonnegative().optional() }),
90
+ findings: z.array(Finding),
91
+ coverage: z.array(Coverage)
92
+ });
93
+ function compareFindings(a, b) {
94
+ return SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity] || CONFIDENCE_RANK[b.confidence] - CONFIDENCE_RANK[a.confidence] || a.category.localeCompare(b.category) || a.ruleId.localeCompare(b.ruleId) || (a.location?.file ?? "").localeCompare(b.location?.file ?? "") || (a.location?.startLine ?? 0) - (b.location?.startLine ?? 0) || a.fingerprint.localeCompare(b.fingerprint);
95
+ }
96
+ function dedupeFindings(findings) {
97
+ const byFp = /* @__PURE__ */ new Map();
98
+ for (const f of findings) {
99
+ const prev = byFp.get(f.fingerprint);
100
+ if (!prev) {
101
+ byFp.set(f.fingerprint, { ...f, alsoReportedBy: [...f.alsoReportedBy] });
102
+ continue;
103
+ }
104
+ const other = f.engine.id;
105
+ if (other !== prev.engine.id && !prev.alsoReportedBy.includes(other)) prev.alsoReportedBy.push(other);
106
+ if (SEVERITY_RANK[f.severity] > SEVERITY_RANK[prev.severity]) prev.severity = f.severity;
107
+ if (CONFIDENCE_RANK[f.confidence] > CONFIDENCE_RANK[prev.confidence]) prev.confidence = f.confidence;
108
+ }
109
+ return [...byFp.values()].sort(compareFindings);
110
+ }
111
+
112
+ // src/core/scanners/secrets.ts
113
+ import { promises as fs } from "fs";
114
+ import path from "path";
115
+
116
+ // src/core/findings/fingerprint.ts
117
+ import crypto from "crypto";
118
+ var FINGERPRINT_VERSION = 1;
119
+ var hash = (parts) => crypto.createHash("sha256").update(parts.join("\0")).digest("hex").slice(0, 32);
120
+ function normalizeLine(text, mask) {
121
+ const masked = mask ? `${text.slice(0, mask[0])}\u27E8v\u27E9${text.slice(mask[1])}` : text;
122
+ return masked.replace(/\s+/g, " ").trim();
123
+ }
124
+ function codeFingerprint(input) {
125
+ return hash(["v1", "code", input.ruleId, input.file, normalizeLine(input.lineText, input.mask), String(input.occurrence ?? 0)]);
126
+ }
127
+ function packageFingerprint(input) {
128
+ return hash(["v1", "package", input.ruleId, input.ecosystem, input.name, input.manifest ?? "", input.advisoryId ?? ""]);
129
+ }
130
+ function fileFingerprint(input) {
131
+ return hash(["v1", "file", input.ruleId, input.file ?? "", input.key ?? ""]);
132
+ }
133
+ function occurrenceCounter() {
134
+ const seen = /* @__PURE__ */ new Map();
135
+ return (ruleId, file, normalized) => {
136
+ const key = `${ruleId}\0${file}\0${normalized}`;
137
+ const n = seen.get(key) ?? 0;
138
+ seen.set(key, n + 1);
139
+ return n;
140
+ };
141
+ }
142
+
143
+ // src/core/scanners/secrets.ts
144
+ var SECRETS_ENGINE = "athena-secrets";
145
+ var CRITICAL = /* @__PURE__ */ new Set(["private-key", "aws-access-key-id", "aws-secret-access-key", "gcp-service-account", "azure-storage-key"]);
146
+ var GENERIC = /* @__PURE__ */ new Set(["generic-secret-assignment", "env-secret-assignment"]);
147
+ var MEDIUM_CONFIDENCE = /* @__PURE__ */ new Set(["jwt", "connection-string-credentials"]);
148
+ var DESCRIPTION = new Map(SECRET_PATTERNS.map((p) => [p.id, p.description]));
149
+ function secretSeverity(type) {
150
+ if (CRITICAL.has(type)) return { severity: "critical", confidence: "high", potential: false };
151
+ if (GENERIC.has(type)) return { severity: "medium", confidence: "low", potential: true };
152
+ return { severity: "high", confidence: MEDIUM_CONFIDENCE.has(type) ? "medium" : "high", potential: false };
153
+ }
154
+ function secretFinding(hit, occurrence = 0, engineId = "athena") {
155
+ const ruleId = `secret/${hit.type}`;
156
+ const { severity, confidence, potential } = secretSeverity(hit.type);
157
+ const description = DESCRIPTION.get(hit.type) ?? hit.type;
158
+ return {
159
+ fingerprint: codeFingerprint({ ruleId, file: hit.file, lineText: hit.lineText, mask: hit.mask, occurrence }),
160
+ ruleId,
161
+ category: "secret",
162
+ severity,
163
+ confidence,
164
+ label: "DETECTED",
165
+ potential,
166
+ title: potential ? `Potential hardcoded secret (${description.toLowerCase()})` : `Hardcoded ${description}`,
167
+ message: `${potential ? "A value that looks like a secret" : `A ${description}`} appears in ${hit.file}:${hit.line}. Athena does not store the value.`,
168
+ cwe: ["CWE-798"],
169
+ owasp: ["A07:2021"],
170
+ location: {
171
+ file: hit.file,
172
+ startLine: hit.line,
173
+ ...hit.column ? { startColumn: hit.column } : {},
174
+ ...hit.endLine ? { endLine: hit.endLine } : {},
175
+ ...hit.endColumn ? { endColumn: hit.endColumn } : {}
176
+ },
177
+ engine: { id: engineId },
178
+ help: {
179
+ text: potential ? "Check whether this is a real credential. If it is, move it to an environment variable or secret manager and rotate it." : "Remove the value, load it from an environment variable or secret manager, and rotate the credential \u2014 assume it is compromised once committed."
180
+ }
181
+ };
182
+ }
183
+ function hitsFromMatches(file, text, matches) {
184
+ const lineStart = (offset) => text.lastIndexOf("\n", offset - 1) + 1;
185
+ return matches.map((m) => {
186
+ const start = lineStart(m.start);
187
+ let end = text.indexOf("\n", m.start);
188
+ if (end < 0) end = text.length;
189
+ let lineText = text.slice(start, end);
190
+ if (lineText.endsWith("\r")) lineText = lineText.slice(0, -1);
191
+ const maskEnd = Math.min(m.end, start + lineText.length) - start;
192
+ const span = text.slice(m.start, m.end);
193
+ const extraLines = (span.match(/\n/g) ?? []).length;
194
+ const lastStart = extraLines ? lineStart(m.end) : start;
195
+ return {
196
+ type: m.type,
197
+ file,
198
+ line: m.line,
199
+ column: m.start - start + 1,
200
+ endLine: m.line + extraLines,
201
+ endColumn: m.end - lastStart + 1,
202
+ lineText,
203
+ mask: [m.start - start, Math.max(maskEnd, m.start - start)]
204
+ };
205
+ });
206
+ }
207
+ function secretFindings(hits, engineId = "athena") {
208
+ const occurrence = occurrenceCounter();
209
+ return hits.map((h) => secretFinding(h, occurrence(`secret/${h.type}`, h.file, normalizeLine(h.lineText, h.mask)), engineId));
210
+ }
211
+ async function scanSecrets(ctx, opts = {}) {
212
+ const started = Date.now();
213
+ let files = opts.walk ?? (await walkProject(ctx.root, { config: ctx.config, signal: ctx.signal })).files;
214
+ if (ctx.files) {
215
+ const scope = new Set(ctx.files);
216
+ files = files.filter((f) => scope.has(f.path));
217
+ }
218
+ const hits = [];
219
+ const read = async (rel) => fs.readFile(path.join(ctx.root, rel), "utf8").catch(() => null);
220
+ const r = await scanFilesForSecrets(files, read, {
221
+ fingerprint: ephemeralFingerprint,
222
+ signal: ctx.signal,
223
+ onFile: (file, text, matches) => hits.push(...hitsFromMatches(file, text, matches))
224
+ });
225
+ const notes = [];
226
+ if (r.truncated) notes.push(`stopped after ${MAX_SECRET_FINDINGS} findings; remaining files were not scanned`);
227
+ if (r.skippedLongLines) notes.push(`generic keyword patterns not applied to ${r.skippedLongLines} line(s) longer than ${MAX_GENERIC_LINE} characters`);
228
+ if (r.files.excluded) notes.push(`${r.files.excluded} lockfile/snapshot/SVG file(s) not scanned`);
229
+ const coverage = {
230
+ engine: SECRETS_ENGINE,
231
+ category: "secret",
232
+ status: "ok",
233
+ ...notes.length ? { reason: notes.join("; ") } : {},
234
+ filesScanned: r.files.scanned,
235
+ filesSkipped: { tooLarge: r.files.tooLarge, binary: r.files.binary, minified: r.files.minified, unreadable: r.files.unreadable, unsupported: r.files.excluded },
236
+ network: false,
237
+ durationMs: Date.now() - started
238
+ };
239
+ return {
240
+ findings: secretFindings(hits),
241
+ coverage: [coverage],
242
+ summary: { count: hits.length, files: [...new Set(hits.map((h) => h.file))], skippedLongLines: r.skippedLongLines, truncated: r.truncated }
243
+ };
244
+ }
245
+ var secretsScanner = {
246
+ id: SECRETS_ENGINE,
247
+ category: "secret",
248
+ title: "Hardcoded secrets",
249
+ async run(ctx) {
250
+ const { findings, coverage } = await scanSecrets(ctx);
251
+ return { findings, coverage };
252
+ }
253
+ };
254
+
255
+ export {
256
+ FINGERPRINT_VERSION,
257
+ normalizeLine,
258
+ codeFingerprint,
259
+ packageFingerprint,
260
+ fileFingerprint,
261
+ occurrenceCounter,
262
+ SECRETS_ENGINE,
263
+ hitsFromMatches,
264
+ secretFindings,
265
+ scanSecrets,
266
+ secretsScanner,
267
+ CATEGORIES,
268
+ SEVERITIES,
269
+ SEVERITY_RANK,
270
+ CONFIDENCES,
271
+ CONFIDENCE_RANK,
272
+ Finding,
273
+ Coverage,
274
+ ScanResult,
275
+ compareFindings,
276
+ dedupeFindings
277
+ };
278
+ //# sourceMappingURL=chunk-Y6SDMZET.js.map
@@ -12,6 +12,13 @@ import {
12
12
  removeJsonHooks,
13
13
  stripMcpServers
14
14
  } from "./chunk-GHFRQAYT.js";
15
+ import {
16
+ CLAUDE_HOOK_EVENTS,
17
+ CODEX_HOOK_EVENTS,
18
+ COPILOT_HOOK_EVENTS,
19
+ CURSOR_HOOK_EVENTS,
20
+ GEMINI_HOOK_EVENTS
21
+ } from "./chunk-INT3IGMQ.js";
15
22
  import {
16
23
  INTEGRATION_END,
17
24
  INTEGRATION_START,
@@ -27,13 +34,6 @@ import {
27
34
  readTextIfExists,
28
35
  writeFileAtomic
29
36
  } from "./chunk-IQQBAWSM.js";
30
- import {
31
- CLAUDE_HOOK_EVENTS,
32
- CODEX_HOOK_EVENTS,
33
- COPILOT_HOOK_EVENTS,
34
- CURSOR_HOOK_EVENTS,
35
- GEMINI_HOOK_EVENTS
36
- } from "./chunk-INT3IGMQ.js";
37
37
  import {
38
38
  resolveInside
39
39
  } from "./chunk-XW3MLHI2.js";
@@ -49,14 +49,16 @@ import path2 from "path";
49
49
  function workflowSteps() {
50
50
  return [
51
51
  "1. Read `.athena/rules.md` and follow every enabled rule (lines marked `[disabled]` do not apply).",
52
- "2. Classify the task and read only the relevant Athena documents (see the relevance map below).",
53
- "3. Identify the affected modules and architecture boundaries.",
54
- "4. Check security implications (`.athena/security.md`, `.athena/auth.md`) when touching input handling, auth, data access or secrets.",
55
- "5. Check database and API implications when the change touches schema, queries or endpoints.",
56
- "6. For non-trivial work, state a short implementation plan before editing.",
57
- "7. Implement only the required changes.",
58
- "8. Run the relevant validation (tests, lint, type checks \u2014 commands are listed in `.athena/project.md` and `.athena/testing.md`).",
59
- "9. If you changed project structure, dependencies, routes, schema or infrastructure, run `athena sync --dry-run` to see which knowledge is affected, and tell the developer to review it with `athena sync` (apply it yourself only if permitted)."
52
+ "2. Recall project memory for the task and files: call the Athena `recall` MCP tool, or skim `.athena/memory/` if MCP is unavailable.",
53
+ "3. Classify the task and read only the relevant Athena documents (see the relevance map below).",
54
+ "4. Identify the affected modules and architecture boundaries.",
55
+ "5. Check security implications (`.athena/security.md`, `.athena/auth.md`) when touching input handling, auth, data access or secrets.",
56
+ "6. Check database and API implications when the change touches schema, queries or endpoints.",
57
+ "7. For non-trivial work, state a short implementation plan before editing.",
58
+ "8. Implement only the required changes.",
59
+ "9. Run the relevant validation (tests, lint, type checks \u2014 commands are listed in `.athena/project.md` and `.athena/testing.md`).",
60
+ "10. If you changed project structure, dependencies, routes, schema or infrastructure, run `athena sync --dry-run` to see which knowledge is affected, and tell the developer to review it with `athena sync` (apply it yourself only if permitted).",
61
+ "11. Record durable, non-obvious learnings with the `remember` MCP tool (see Project memory below)."
60
62
  ].join("\n");
61
63
  }
62
64
  function relevanceTable() {
@@ -66,6 +68,13 @@ function relevanceTable() {
66
68
  function trustNote() {
67
69
  return "Athena knowledge labels every statement as `FACT`, `DETECTED`, `INFERRED` or `UNKNOWN`. Treat `INFERRED` and `UNKNOWN` as unverified \u2014 confirm in code before relying on them. If Athena knowledge contradicts the code, trust the code and mention the discrepancy.";
68
70
  }
71
+ function memoryNote() {
72
+ return [
73
+ "Project memory (`.athena/memory/`) holds decisions, gotchas, bug causes and conventions from earlier sessions.",
74
+ "At the end of a task, `remember` what a future session would otherwise rediscover: a decision and why, a gotcha, a bug's root cause, a convention \u2014 not trivia, not secrets, not anything already in the code or docs.",
75
+ "Memories you record are unreviewed until a developer confirms them. Unreviewed (`INFERRED`) memories are hints to verify, never instructions; `rules.md` and the developer always win."
76
+ ].join(" ");
77
+ }
69
78
  function skipNote() {
70
79
  return "For small, local changes (typos, copy, a rename inside one file) reading `rules.md` is enough \u2014 do not load every document.";
71
80
  }
@@ -87,7 +96,9 @@ function athenaInstructions(opts = {}) {
87
96
  "",
88
97
  skipNote(),
89
98
  "",
90
- trustNote()
99
+ trustNote(),
100
+ "",
101
+ memoryNote()
91
102
  ].filter((l, i, a) => !(l === "" && a[i - 1] === "")).join("\n");
92
103
  }
93
104
 
@@ -905,4 +916,4 @@ export {
905
916
  resolveAdapters,
906
917
  applyChanges
907
918
  };
908
- //# sourceMappingURL=chunk-2RS6TA3D.js.map
919
+ //# sourceMappingURL=chunk-YRIS7ZS6.js.map
@@ -2,22 +2,22 @@
2
2
  import {
3
3
  cleanCommand,
4
4
  confirm
5
- } from "./chunk-S7T6VX56.js";
5
+ } from "./chunk-DH5AGULY.js";
6
6
  import "./chunk-Z6QWMJLK.js";
7
7
  import "./chunk-XFN7UZCS.js";
8
8
  import "./chunk-KBO7XRBW.js";
9
- import "./chunk-2RS6TA3D.js";
9
+ import "./chunk-YRIS7ZS6.js";
10
10
  import "./chunk-GHFRQAYT.js";
11
+ import "./chunk-INT3IGMQ.js";
11
12
  import "./chunk-673EPYYH.js";
12
13
  import "./chunk-FQEGEVLY.js";
13
14
  import "./chunk-2DY4PUR4.js";
14
15
  import "./chunk-IQQBAWSM.js";
15
16
  import "./chunk-AD4OZCU2.js";
16
- import "./chunk-INT3IGMQ.js";
17
17
  import "./chunk-XW3MLHI2.js";
18
18
  import "./chunk-EUPETUWA.js";
19
19
  export {
20
20
  cleanCommand,
21
21
  confirm
22
22
  };
23
- //# sourceMappingURL=clean-S7PKCOLM.js.map
23
+ //# sourceMappingURL=clean-LQOG56AM.js.map
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  // src/cli/index.ts
4
4
  async function runEvent(args) {
5
- const { parseEventArgs, eventCommand } = await import("./event-TNT6CQZR.js");
5
+ const { parseEventArgs, eventCommand } = await import("./event-6YW6TGFI.js");
6
6
  const opts = parseEventArgs(args);
7
7
  if (!opts) return false;
8
8
  let signalled = false;
@@ -21,7 +21,7 @@ function eventFailed(err) {
21
21
  return true;
22
22
  }
23
23
  if (process.argv[2] !== "event" || !await runEvent(process.argv.slice(3)).catch(eventFailed)) {
24
- const { main } = await import("./program-V2USHGXN.js");
24
+ const { main } = await import("./program-DCP526LU.js");
25
25
  await main();
26
26
  }
27
27
  //# sourceMappingURL=cli.js.map
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- formatContext,
4
3
  getRelevantContext,
5
4
  graphSummary,
6
5
  refreshGraph
7
- } from "./chunk-CXUTYCZX.js";
6
+ } from "./chunk-GYQG4Q2N.js";
7
+ import {
8
+ formatContext
9
+ } from "./chunk-F65QINMR.js";
8
10
  import "./chunk-3IS2X2Z7.js";
9
11
  import {
10
12
  bullet,
@@ -22,15 +24,17 @@ import {
22
24
  requireProjectRoot
23
25
  } from "./chunk-XFN7UZCS.js";
24
26
  import "./chunk-KBO7XRBW.js";
27
+ import "./chunk-GU3ZX2J7.js";
28
+ import "./chunk-44EGCEB2.js";
29
+ import "./chunk-PVCIGUIT.js";
30
+ import "./chunk-ELKFRTZT.js";
31
+ import "./chunk-AKOI4VTD.js";
25
32
  import {
26
33
  loadGraph,
27
34
  neighbors
28
- } from "./chunk-PDFQ5BFG.js";
29
- import "./chunk-PANVPNYF.js";
30
- import "./chunk-ELKFRTZT.js";
31
- import "./chunk-PVCIGUIT.js";
32
- import "./chunk-OLPSEQS5.js";
33
- import "./chunk-JCGDR4UV.js";
35
+ } from "./chunk-SVTEJYMS.js";
36
+ import "./chunk-QCC4VJUH.js";
37
+ import "./chunk-WWQ5NKEC.js";
34
38
  import "./chunk-673EPYYH.js";
35
39
  import "./chunk-FQEGEVLY.js";
36
40
  import "./chunk-2DY4PUR4.js";
@@ -70,11 +74,21 @@ async function contextCommand(task, opts) {
70
74
  for (const n of ctx.graphNodes.slice(0, 12)) line(` ${dim(`${n.kind}:`)} ${n.name}${n.path ? dim(` (${n.path})`) : ""}`);
71
75
  if (ctx.graphNodes.length > 12) line(dim(` +${ctx.graphNodes.length - 12} more`));
72
76
  }
77
+ if (ctx.memories.length) {
78
+ line();
79
+ heading("Project memory");
80
+ for (const m of ctx.memories) {
81
+ const label = m.label === "FACT" ? c.green(m.label) : c.yellow(m.label);
82
+ line(` ${label} ${m.title} ${dim(`(${m.id}, ${m.kind}${m.status === "unreviewed" ? ", unreviewed" : ""}${m.stale ? ", stale" : ""})`)}`);
83
+ line(dim(` ${m.why.join("; ")}`));
84
+ }
85
+ if (ctx.memories.some((m) => m.status === "unreviewed")) line(dim(" Unreviewed memories were written by an agent; confirm or forget them with `athena memory`."));
86
+ }
73
87
  line();
74
88
  heading("Sections selected");
75
89
  for (const s of ctx.sections) line(` ${dim(`${s.file} \u2192`)} ${s.section}`);
76
90
  line();
77
- line(dim(`${ctx.sections.length} sections \xB7 ~${ctx.approxChars} characters \xB7 ${ctx.rules.length} rules${ctx.truncated ? " \xB7 some sections omitted for budget" : ""}`));
91
+ line(dim(`${ctx.sections.length} sections \xB7 ${ctx.memories.length} memories \xB7 ~${ctx.approxChars} characters \xB7 ${ctx.rules.length} rules${ctx.truncated ? " \xB7 some content omitted for budget" : ""}`));
78
92
  line(dim("Use --full to print the context an agent would read, or --json for tooling."));
79
93
  }
80
94
  async function graphCommand(opts) {
@@ -144,4 +158,4 @@ export {
144
158
  contextCommand,
145
159
  graphCommand
146
160
  };
147
- //# sourceMappingURL=context-AH5MFHRG.js.map
161
+ //# sourceMappingURL=context-G5YHY3L2.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDoctor
4
- } from "./chunk-PR53DT7I.js";
5
- import "./chunk-RXNRMIZP.js";
6
- import "./chunk-VSYBC3VY.js";
4
+ } from "./chunk-L2EHJCH4.js";
5
+ import "./chunk-WUIC65QO.js";
6
+ import "./chunk-UMWX4UTK.js";
7
+ import "./chunk-P4TRQMES.js";
7
8
  import "./chunk-3IS2X2Z7.js";
8
- import "./chunk-65TSRDQ3.js";
9
9
  import {
10
10
  c,
11
11
  dim,
@@ -21,23 +21,30 @@ import {
21
21
  import "./chunk-KBO7XRBW.js";
22
22
  import "./chunk-2R6PXY6Z.js";
23
23
  import "./chunk-PVCIGUIT.js";
24
- import "./chunk-OLPSEQS5.js";
25
- import "./chunk-JCGDR4UV.js";
26
- import "./chunk-2RS6TA3D.js";
24
+ import "./chunk-AKOI4VTD.js";
25
+ import "./chunk-WWQ5NKEC.js";
26
+ import "./chunk-YRIS7ZS6.js";
27
27
  import "./chunk-GHFRQAYT.js";
28
+ import "./chunk-INT3IGMQ.js";
28
29
  import "./chunk-673EPYYH.js";
29
30
  import "./chunk-FQEGEVLY.js";
30
31
  import "./chunk-2DY4PUR4.js";
31
32
  import "./chunk-IQQBAWSM.js";
32
33
  import "./chunk-AD4OZCU2.js";
33
- import "./chunk-INT3IGMQ.js";
34
34
  import "./chunk-XW3MLHI2.js";
35
35
  import "./chunk-EUPETUWA.js";
36
36
 
37
37
  // src/cli/commands/doctor.ts
38
38
  async function doctorCommand(opts) {
39
39
  const cwd = await resolveCwd(opts);
40
- const { checks } = await runDoctor(cwd);
40
+ const { checks, root } = await runDoctor(cwd);
41
+ if (root) {
42
+ const m = await (await import("./memory-XBZCYQLW.js")).memorySummary(root);
43
+ if (m?.total) {
44
+ const pending = [m.unreviewed ? `${m.unreviewed} unreviewed` : "", m.stale ? `${m.stale} stale` : ""].filter(Boolean);
45
+ checks.push({ area: "Memory", level: "info", message: `${m.total} project memory ${m.total === 1 ? "entry" : "entries"}${pending.length ? ` (${pending.join(", ")})` : ""}`, hint: pending.length ? "Review with `athena memory review` and `athena memory stale`." : void 0 });
46
+ }
47
+ }
41
48
  const errors = checks.filter((c2) => c2.level === "error").length;
42
49
  if (isJson()) {
43
50
  json({ ok: errors === 0, checks });
@@ -59,4 +66,4 @@ async function doctorCommand(opts) {
59
66
  export {
60
67
  doctorCommand
61
68
  };
62
- //# sourceMappingURL=doctor-RSJMLE2P.js.map
69
+ //# sourceMappingURL=doctor-L34QJ7WR.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  appendEvent
4
- } from "./chunk-65TSRDQ3.js";
4
+ } from "./chunk-P4TRQMES.js";
5
5
  import {
6
6
  findProjectRoot
7
7
  } from "./chunk-KBO7XRBW.js";
8
- import "./chunk-JCGDR4UV.js";
8
+ import "./chunk-WWQ5NKEC.js";
9
9
  import {
10
10
  normalizeHookEvent
11
11
  } from "./chunk-INT3IGMQ.js";
@@ -98,4 +98,4 @@ export {
98
98
  eventCommand,
99
99
  parseEventArgs
100
100
  };
101
- //# sourceMappingURL=event-TNT6CQZR.js.map
101
+ //# sourceMappingURL=event-6YW6TGFI.js.map
@@ -15,7 +15,7 @@ import {
15
15
  import "./chunk-KBO7XRBW.js";
16
16
  import {
17
17
  git
18
- } from "./chunk-OLPSEQS5.js";
18
+ } from "./chunk-AKOI4VTD.js";
19
19
  import {
20
20
  hookCommand
21
21
  } from "./chunk-GHFRQAYT.js";
@@ -249,4 +249,4 @@ export {
249
249
  gitHookStatusCommand,
250
250
  gitHookUninstallCommand
251
251
  };
252
- //# sourceMappingURL=git-hook-YZNZGAAP.js.map
252
+ //# sourceMappingURL=git-hook-Y7Y262F7.js.map
@@ -5,26 +5,27 @@ import {
5
5
  printSummary,
6
6
  runWithProgress,
7
7
  summarize
8
- } from "./chunk-DOQMAZL5.js";
8
+ } from "./chunk-R5AX7VST.js";
9
9
  import "./chunk-SHKXELUX.js";
10
10
  import "./chunk-Z6QWMJLK.js";
11
11
  import "./chunk-XFN7UZCS.js";
12
12
  import "./chunk-KBO7XRBW.js";
13
- import "./chunk-SJOOXO34.js";
14
- import "./chunk-PANVPNYF.js";
15
- import "./chunk-ELKFRTZT.js";
13
+ import "./chunk-4FETKOY3.js";
16
14
  import "./chunk-2R6PXY6Z.js";
15
+ import "./chunk-44EGCEB2.js";
17
16
  import "./chunk-PVCIGUIT.js";
18
- import "./chunk-OLPSEQS5.js";
19
- import "./chunk-JCGDR4UV.js";
20
- import "./chunk-2RS6TA3D.js";
17
+ import "./chunk-ELKFRTZT.js";
18
+ import "./chunk-AKOI4VTD.js";
19
+ import "./chunk-QCC4VJUH.js";
20
+ import "./chunk-WWQ5NKEC.js";
21
+ import "./chunk-YRIS7ZS6.js";
21
22
  import "./chunk-GHFRQAYT.js";
23
+ import "./chunk-INT3IGMQ.js";
22
24
  import "./chunk-673EPYYH.js";
23
25
  import "./chunk-FQEGEVLY.js";
24
26
  import "./chunk-2DY4PUR4.js";
25
27
  import "./chunk-IQQBAWSM.js";
26
28
  import "./chunk-AD4OZCU2.js";
27
- import "./chunk-INT3IGMQ.js";
28
29
  import "./chunk-XW3MLHI2.js";
29
30
  import "./chunk-EUPETUWA.js";
30
31
  export {
@@ -34,4 +35,4 @@ export {
34
35
  runWithProgress,
35
36
  summarize
36
37
  };
37
- //# sourceMappingURL=init-2V34DVRQ.js.map
38
+ //# sourceMappingURL=init-427QR5AS.js.map