token-goat 2.9.29 → 2.9.31

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 (197) hide show
  1. package/README.md +53 -42
  2. package/SECURITY.md +37 -11
  3. package/THIRD_PARTY_NOTICES.md +41 -4
  4. package/dist/native/linux-arm64/tg-hook +0 -0
  5. package/dist/native/linux-x64/tg-hook +0 -0
  6. package/dist/native/win32-arm64/tg-hook.exe +0 -0
  7. package/dist/native/win32-x64/tg-hook.exe +0 -0
  8. package/dist/ort-wasm-simd-threaded.mjs +59 -0
  9. package/dist/{token-goat-chunk-SE6E4BKJ.mjs → token-goat-chunk-25TRAWET.mjs} +23 -6
  10. package/dist/token-goat-chunk-2KXO6V2B.mjs +203 -0
  11. package/dist/{token-goat-chunk-UXSXQQIY.mjs → token-goat-chunk-2M7E4PF7.mjs} +43 -14
  12. package/dist/token-goat-chunk-2UPZGKKY.mjs +188 -0
  13. package/dist/token-goat-chunk-2WLPWKHV.mjs +135 -0
  14. package/dist/token-goat-chunk-2XBMMDBD.mjs +126 -0
  15. package/dist/token-goat-chunk-32ZOY4N5.mjs +23 -0
  16. package/dist/token-goat-chunk-3EZRNKTK.mjs +188 -0
  17. package/dist/token-goat-chunk-4ADZHI7J.mjs +63 -0
  18. package/dist/token-goat-chunk-4GBVPH3D.mjs +242 -0
  19. package/dist/{token-goat-chunk-2WOUYWLM.mjs → token-goat-chunk-4GILLLWY.mjs} +34 -7
  20. package/dist/token-goat-chunk-4NAPX7BA.mjs +90 -0
  21. package/dist/{token-goat-chunk-NMBWLRHW.mjs → token-goat-chunk-4SC7UJYV.mjs} +9981 -11563
  22. package/dist/token-goat-chunk-4SMRO4TO.mjs +366 -0
  23. package/dist/{token-goat-chunk-O6I2XU4P.mjs → token-goat-chunk-4ZBFWLXF.mjs} +310 -441
  24. package/dist/token-goat-chunk-57BIAXJL.mjs +286 -0
  25. package/dist/token-goat-chunk-5AC66HNP.mjs +115 -0
  26. package/dist/token-goat-chunk-5IMLKSOP.mjs +145 -0
  27. package/dist/token-goat-chunk-5RG5SBL6.mjs +221 -0
  28. package/dist/{token-goat-chunk-RRNZMM3A.mjs → token-goat-chunk-5Y6ZYL6U.mjs} +21 -2
  29. package/dist/token-goat-chunk-646E6U44.mjs +398 -0
  30. package/dist/token-goat-chunk-65N4RHP4.mjs +33 -0
  31. package/dist/{token-goat-chunk-6AK46ZT7.mjs → token-goat-chunk-6DG6HWP3.mjs} +13 -3
  32. package/dist/token-goat-chunk-6ENQSNRZ.mjs +573 -0
  33. package/dist/token-goat-chunk-6ZY4GNF2.mjs +91 -0
  34. package/dist/{token-goat-chunk-E5TK5DNO.mjs → token-goat-chunk-76FGDLRO.mjs} +574 -340
  35. package/dist/{token-goat-chunk-TGOXNAHW.mjs → token-goat-chunk-7EZTZOMC.mjs} +780 -767
  36. package/dist/token-goat-chunk-7MAOA6X4.mjs +3647 -0
  37. package/dist/token-goat-chunk-7R2ZVVAX.mjs +218 -0
  38. package/dist/{token-goat-chunk-TCQANXYC.mjs → token-goat-chunk-AM5V6GSX.mjs} +18 -2
  39. package/dist/token-goat-chunk-AUNGYYQX.mjs +184 -0
  40. package/dist/token-goat-chunk-AUQYRMMH.mjs +2985 -0
  41. package/dist/token-goat-chunk-B3PEKBYG.mjs +128 -0
  42. package/dist/{token-goat-chunk-KOPIR3KZ.mjs → token-goat-chunk-BA4HI6BW.mjs} +1910 -165
  43. package/dist/{token-goat-chunk-52NSDWYY.mjs → token-goat-chunk-BFCWY73P.mjs} +58 -20
  44. package/dist/token-goat-chunk-BPGCUMR7.mjs +30 -0
  45. package/dist/token-goat-chunk-BWGFUZZE.mjs +25 -0
  46. package/dist/token-goat-chunk-C75NA7PL.mjs +322 -0
  47. package/dist/token-goat-chunk-CBIQ7WTD.mjs +87 -0
  48. package/dist/token-goat-chunk-CETM74KC.mjs +307 -0
  49. package/dist/token-goat-chunk-CIMQ2BB3.mjs +233 -0
  50. package/dist/{token-goat-chunk-DNSPXQXQ.mjs → token-goat-chunk-CJLS3CDL.mjs} +70 -18
  51. package/dist/{token-goat-chunk-MELOKFDJ.mjs → token-goat-chunk-CO3UYX6G.mjs} +7 -1
  52. package/dist/token-goat-chunk-COPNXRJM.mjs +154 -0
  53. package/dist/token-goat-chunk-CSJ5L3NL.mjs +479 -0
  54. package/dist/token-goat-chunk-CVCEVUGK.mjs +315 -0
  55. package/dist/token-goat-chunk-CXHOFN7R.mjs +371 -0
  56. package/dist/token-goat-chunk-D735C4QM.mjs +603 -0
  57. package/dist/{token-goat-chunk-E4ZOJIZK.mjs → token-goat-chunk-DGS2LVNA.mjs} +70 -160
  58. package/dist/{token-goat-chunk-L7H3U27L.mjs → token-goat-chunk-DOWRSMWO.mjs} +1 -1
  59. package/dist/token-goat-chunk-E45INMY3.mjs +71 -0
  60. package/dist/token-goat-chunk-EC5F37F4.mjs +244 -0
  61. package/dist/{token-goat-chunk-XTQAOTSO.mjs → token-goat-chunk-EDBDRVH5.mjs} +4 -1
  62. package/dist/token-goat-chunk-EELTBKDM.mjs +613 -0
  63. package/dist/token-goat-chunk-EVMZJ27Z.mjs +147 -0
  64. package/dist/token-goat-chunk-EXKGNHEG.mjs +2096 -0
  65. package/dist/{token-goat-chunk-YOOVFPTP.mjs → token-goat-chunk-F4HYL64R.mjs} +12 -2
  66. package/dist/token-goat-chunk-F6PAUIEK.mjs +624 -0
  67. package/dist/token-goat-chunk-FDSREWLX.mjs +692 -0
  68. package/dist/{token-goat-chunk-NMTKNYGF.mjs → token-goat-chunk-FNFBKLRD.mjs} +74 -9
  69. package/dist/token-goat-chunk-G5PJ7AGM.mjs +36 -0
  70. package/dist/token-goat-chunk-GGGG7RWB.mjs +236 -0
  71. package/dist/{token-goat-chunk-TDUT2CL6.mjs → token-goat-chunk-GL3ETKSC.mjs} +276 -19
  72. package/dist/{token-goat-chunk-7CPMDFGB.mjs → token-goat-chunk-GVB2MUST.mjs} +265 -1567
  73. package/dist/token-goat-chunk-GWFLAUMQ.mjs +307 -0
  74. package/dist/token-goat-chunk-HAVAOB3S.mjs +87 -0
  75. package/dist/token-goat-chunk-HLPW63A7.mjs +48 -0
  76. package/dist/token-goat-chunk-HU4TORC5.mjs +1377 -0
  77. package/dist/token-goat-chunk-I7VKZZAW.mjs +35 -0
  78. package/dist/token-goat-chunk-IA6XSPE3.mjs +218 -0
  79. package/dist/token-goat-chunk-IAGXMHIK.mjs +863 -0
  80. package/dist/{token-goat-chunk-435UQTKD.mjs → token-goat-chunk-IK2DRMFX.mjs} +129 -74
  81. package/dist/{token-goat-chunk-ZER6EAXZ.mjs → token-goat-chunk-INNPTRUX.mjs} +2954 -2783
  82. package/dist/token-goat-chunk-JJ5BX4F4.mjs +129 -0
  83. package/dist/token-goat-chunk-JVFSHVFJ.mjs +129 -0
  84. package/dist/token-goat-chunk-KGEFFSHD.mjs +50 -0
  85. package/dist/token-goat-chunk-KKUFXAPD.mjs +25 -0
  86. package/dist/token-goat-chunk-KQBLRPBN.mjs +433 -0
  87. package/dist/token-goat-chunk-LCNQ2CNN.mjs +497 -0
  88. package/dist/token-goat-chunk-M3LFJDPU.mjs +58 -0
  89. package/dist/token-goat-chunk-M52KPT3C.mjs +87 -0
  90. package/dist/token-goat-chunk-MBEG42H7.mjs +150 -0
  91. package/dist/{token-goat-chunk-EVC4TOLE.mjs → token-goat-chunk-METECDOH.mjs} +3 -12
  92. package/dist/{token-goat-chunk-2AWQ2R5X.mjs → token-goat-chunk-MHX7XCC3.mjs} +3 -2
  93. package/dist/token-goat-chunk-MNWKPRAL.mjs +13 -0
  94. package/dist/token-goat-chunk-N5LSOVSU.mjs +137 -0
  95. package/dist/{token-goat-chunk-DPNLUJWB.mjs → token-goat-chunk-N5MMR2IW.mjs} +30 -8
  96. package/dist/token-goat-chunk-N7B3JQ2C.mjs +160 -0
  97. package/dist/{token-goat-chunk-VMFWNHGR.mjs → token-goat-chunk-NISNMD7T.mjs} +2545 -2953
  98. package/dist/token-goat-chunk-NMD42SFQ.mjs +434 -0
  99. package/dist/token-goat-chunk-NOSS5VWY.mjs +174 -0
  100. package/dist/token-goat-chunk-NSNSPPBG.mjs +69 -0
  101. package/dist/token-goat-chunk-OBOFIHKN.mjs +38 -0
  102. package/dist/token-goat-chunk-OBRFJ5O5.mjs +76 -0
  103. package/dist/token-goat-chunk-ODBT2USM.mjs +800 -0
  104. package/dist/token-goat-chunk-OS5EM5PP.mjs +107 -0
  105. package/dist/token-goat-chunk-OUKDTVNU.mjs +1178 -0
  106. package/dist/token-goat-chunk-OXFMP75N.mjs +566 -0
  107. package/dist/{token-goat-chunk-ASLWOQ3I.mjs → token-goat-chunk-OYIYKDDT.mjs} +2 -1
  108. package/dist/{token-goat-chunk-67BNIKKO.mjs → token-goat-chunk-P6HQSWQ3.mjs} +55 -47
  109. package/dist/token-goat-chunk-P6VGNTQT.mjs +71 -0
  110. package/dist/token-goat-chunk-PFWIMH2E.mjs +261 -0
  111. package/dist/token-goat-chunk-PJZXIS3G.mjs +39 -0
  112. package/dist/token-goat-chunk-PUO5INXP.mjs +606 -0
  113. package/dist/token-goat-chunk-PX5PQWTY.mjs +462 -0
  114. package/dist/token-goat-chunk-Q5QDBC6O.mjs +111 -0
  115. package/dist/token-goat-chunk-QFNQXSDT.mjs +40 -0
  116. package/dist/token-goat-chunk-QH7YVYOY.mjs +3957 -0
  117. package/dist/token-goat-chunk-QLMUHEPB.mjs +43 -0
  118. package/dist/{token-goat-chunk-PYSUADX4.mjs → token-goat-chunk-QQOJIHL3.mjs} +50 -14
  119. package/dist/token-goat-chunk-QQTWJY2O.mjs +85 -0
  120. package/dist/token-goat-chunk-QYHO5CPH.mjs +93 -0
  121. package/dist/token-goat-chunk-RELAVWAD.mjs +27 -0
  122. package/dist/token-goat-chunk-RSLPOBKQ.mjs +339 -0
  123. package/dist/token-goat-chunk-SAMFDIS2.mjs +712 -0
  124. package/dist/token-goat-chunk-SDELXLDM.mjs +48 -0
  125. package/dist/{token-goat-chunk-PGTH2U4C.mjs → token-goat-chunk-SOAFZNNZ.mjs} +164 -40
  126. package/dist/{token-goat-chunk-G23DWHV4.mjs → token-goat-chunk-SRTHT7KV.mjs} +33 -15
  127. package/dist/token-goat-chunk-T5P5ACNQ.mjs +212 -0
  128. package/dist/token-goat-chunk-T5YGG4V3.mjs +45 -0
  129. package/dist/token-goat-chunk-TAUZ4OFS.mjs +110 -0
  130. package/dist/token-goat-chunk-TM6MC754.mjs +40 -0
  131. package/dist/token-goat-chunk-TWUKBOMP.mjs +72 -0
  132. package/dist/token-goat-chunk-U2KSB4SG.mjs +56 -0
  133. package/dist/token-goat-chunk-U4WHMG6Y.mjs +898 -0
  134. package/dist/token-goat-chunk-UA5V6P3P.mjs +122 -0
  135. package/dist/token-goat-chunk-UGJHGR5A.mjs +52 -0
  136. package/dist/{token-goat-chunk-RQGGMPCR.mjs → token-goat-chunk-UOUDVA5U.mjs} +76 -16
  137. package/dist/{token-goat-chunk-HNFZZHFW.mjs → token-goat-chunk-URRJ33GR.mjs} +22 -4
  138. package/dist/token-goat-chunk-UZOROKIS.mjs +165 -0
  139. package/dist/token-goat-chunk-VIHGGGEI.mjs +4234 -0
  140. package/dist/token-goat-chunk-VTJLAA7P.mjs +21 -0
  141. package/dist/token-goat-chunk-VWDXLT4F.mjs +678 -0
  142. package/dist/token-goat-chunk-VWZA2H4P.mjs +368 -0
  143. package/dist/{token-goat-chunk-QO3LXVVR.mjs → token-goat-chunk-VXEXMJDL.mjs} +2964 -3153
  144. package/dist/token-goat-chunk-WBA5SKT4.mjs +547 -0
  145. package/dist/{token-goat-chunk-ONXH6NZ5.mjs → token-goat-chunk-WDH44VAU.mjs} +19 -22
  146. package/dist/token-goat-chunk-X2SUP3EI.mjs +107 -0
  147. package/dist/token-goat-chunk-X3BELZSJ.mjs +125 -0
  148. package/dist/{token-goat-chunk-RLP6J7WR.mjs → token-goat-chunk-XLRBNZCC.mjs} +40 -21
  149. package/dist/{token-goat-chunk-S4VSXURL.mjs → token-goat-chunk-XRKUX6CM.mjs} +4 -0
  150. package/dist/token-goat-chunk-XX6O25RN.mjs +82 -0
  151. package/dist/token-goat-chunk-XZSUHBVS.mjs +65 -0
  152. package/dist/token-goat-chunk-Y2ZTQOCL.mjs +35 -0
  153. package/dist/{token-goat-chunk-UA5BKWWQ.mjs → token-goat-chunk-YB4VMGK2.mjs} +15 -4
  154. package/dist/token-goat-chunk-YBIIY3HR.mjs +51 -0
  155. package/dist/{token-goat-chunk-PKRWMHVP.mjs → token-goat-chunk-YHVDKQBR.mjs} +389 -221
  156. package/dist/token-goat-chunk-YJB5XLWI.mjs +26 -0
  157. package/dist/{token-goat-chunk-PQ53BSCF.mjs → token-goat-chunk-YKB6AQG3.mjs} +53 -31
  158. package/dist/token-goat-chunk-YMTG2YA5.mjs +35 -0
  159. package/dist/token-goat-chunk-YPBZYQRV.mjs +40 -0
  160. package/dist/{token-goat-chunk-HUYUHODZ.mjs → token-goat-chunk-YY6AVUFL.mjs} +13246 -12247
  161. package/dist/token-goat-chunk-Z7N5OMMP.mjs +98 -0
  162. package/dist/{token-goat-chunk-BGHSSJUA.mjs → token-goat-chunk-ZFOBKUWH.mjs} +1 -1
  163. package/dist/token-goat-chunk-ZMBL6UVV.mjs +110 -0
  164. package/dist/token-goat-chunk-ZNMNUPAZ.mjs +938 -0
  165. package/dist/token-goat-hook-client.cjs +87 -23
  166. package/dist/token-goat-hook-client.mjs +3 -3
  167. package/dist/token-goat-hook.mjs +76 -31
  168. package/dist/token-goat.core.mjs +6 -6
  169. package/docs/C4_RUNTIME_ARCHITECTURE.md +2 -2
  170. package/docs/cli.md +113 -60
  171. package/docs/install.md +63 -20
  172. package/docs/security.md +10 -8
  173. package/package.json +18 -7
  174. package/scripts/verify-native-dist.mjs +386 -0
  175. package/dist/token-goat-chunk-2NNUA2LR.mjs +0 -143
  176. package/dist/token-goat-chunk-44BM7DDQ.mjs +0 -294
  177. package/dist/token-goat-chunk-BGYOZ6DO.mjs +0 -24
  178. package/dist/token-goat-chunk-C5YPNZKQ.mjs +0 -318
  179. package/dist/token-goat-chunk-CIQ2FTY3.mjs +0 -1990
  180. package/dist/token-goat-chunk-D4ETHJD6.mjs +0 -246
  181. package/dist/token-goat-chunk-DNRPXHYH.mjs +0 -1062
  182. package/dist/token-goat-chunk-EUSDXRXU.mjs +0 -1429
  183. package/dist/token-goat-chunk-FTP4U4QA.mjs +0 -64
  184. package/dist/token-goat-chunk-G7IWXCFF.mjs +0 -456
  185. package/dist/token-goat-chunk-GLXRTTLE.mjs +0 -36
  186. package/dist/token-goat-chunk-H5J3C56Q.mjs +0 -1511
  187. package/dist/token-goat-chunk-IVWI2OCK.mjs +0 -368
  188. package/dist/token-goat-chunk-JTKCQMQA.mjs +0 -418
  189. package/dist/token-goat-chunk-LZNBQTDK.mjs +0 -26
  190. package/dist/token-goat-chunk-ORNFMIER.mjs +0 -295
  191. package/dist/token-goat-chunk-RTMVLHWX.mjs +0 -7113
  192. package/dist/token-goat-chunk-VQ6F6T7X.mjs +0 -36
  193. package/dist/token-goat-chunk-VZQEWRVH.mjs +0 -312
  194. package/dist/token-goat-chunk-XYWPOSCN.mjs +0 -807
  195. package/dist/token-goat-chunk-YAGLESS3.mjs +0 -23
  196. package/dist/token-goat-chunk-YKSRAWUU.mjs +0 -33
  197. package/dist/token-goat-chunk-Z6KBMOBI.mjs +0 -53
@@ -0,0 +1,433 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ indexRecallEntry,
5
+ isBlobStale,
6
+ isBuildCommand,
7
+ isDevServerCommand,
8
+ isTestRunnerCommand,
9
+ loadBlob,
10
+ parsePorcelainZ,
11
+ storeBlob
12
+ } from "./token-goat-chunk-4ZBFWLXF.mjs";
13
+ import {
14
+ redactSecrets
15
+ } from "./token-goat-chunk-T5P5ACNQ.mjs";
16
+ import {
17
+ shortFingerprint
18
+ } from "./token-goat-chunk-4GBVPH3D.mjs";
19
+ import {
20
+ registerReset
21
+ } from "./token-goat-chunk-YZAAZU2S.mjs";
22
+ import {
23
+ runGit
24
+ } from "./token-goat-chunk-HU4TORC5.mjs";
25
+ import {
26
+ normalizePath
27
+ } from "./token-goat-chunk-FNFBKLRD.mjs";
28
+ import {
29
+ init_define_import_meta_env
30
+ } from "./token-goat-chunk-A37V4PBF.mjs";
31
+
32
+ // src/bash_output_cache.ts
33
+ init_define_import_meta_env();
34
+ import { readdirSync, readFileSync, statSync } from "fs";
35
+ import { resolve } from "path";
36
+ var BASH_OUTPUT_SUBDIR = "bash_outputs";
37
+ var _byId = /* @__PURE__ */ new Map();
38
+ var COMMAND_PATTERNS = {
39
+ gitMutable: /^\s*git\s+(diff|status)\b/i,
40
+ gitImmutable: /^\s*git\s+show\s+[0-9a-f]{40}\b/i,
41
+ gitDiffScoped: /\s--\s+\S/,
42
+ dirListing: /^\s*(?:ls|eza|exa|dir|Get-ChildItem|gci)\b/i,
43
+ depList: /^\s*(?:npm\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:ls|list)\b|pip\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:list|freeze)\b|uv\s+pip\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:list|freeze)\b|pnpm\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:list|ls)\b|yarn\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:list)\b|cargo\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*tree\b|bundle\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:list|show)\b|composer\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*show\b)/i,
44
+ npmInstall: /^\s*npm\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*(?:install|ci)\b/i,
45
+ npmAudit: /^\s*npm\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*audit\b(?!.*(?:--fix|fix)\b)/i,
46
+ npmOutdated: /^\s*npm\s+(?:--?[a-zA-Z0-9_-]+(?:\s+|=))*outdated\b/i,
47
+ envProbe: /^\s*(?:node\s+(?:-v|--version)|npm\s+(?:-v|--version)|python3?\s+(?:(?:-V)\b|--?version)|git\s+--version|uv\s+--version|go\s+version|rustc\s+--version|cargo\s+--version|java\s+--version|ruby\s+--version|gem\s+--version|php\s+--version|which\b|where\b)/i,
48
+ npx: /^(?!.*\b(?:install|add|remove|uninstall|i|rm|update|upgrade|set|get|publish|link|ci|audit|shrinkwrap|dedupe|prune|rebuild)\b)\s*npx\s+(?:--?yes\s+)?/i,
49
+ gitPush: /^\s*git\s+push\b/i,
50
+ lintCommand: /^\s*(?:(?:npx\s+)?eslint|(?:uv\s+run\s+)?ruff)\b/i,
51
+ npmRunScript: /^\s*npm\s+run(?:-script)?\b/i,
52
+ catCommand: /^\s*cat\b/i
53
+ };
54
+ var DEP_LOCKFILES = {
55
+ npm: ["package-lock.json", "yarn.lock"],
56
+ pip: ["requirements.txt"],
57
+ uv: ["uv.lock", "requirements.txt"],
58
+ pnpm: ["pnpm-lock.yaml"],
59
+ yarn: ["yarn.lock"],
60
+ cargo: ["Cargo.lock"],
61
+ bundle: ["Gemfile.lock"],
62
+ composer: ["composer.lock"]
63
+ };
64
+ function isCommandOfType(cmd, type) {
65
+ const pattern = COMMAND_PATTERNS[type];
66
+ return pattern?.test(cmd) ?? false;
67
+ }
68
+ var isGitMutableCommand = (cmd) => isCommandOfType(cmd, "gitMutable");
69
+ var isDirListingCommand = (cmd) => isCommandOfType(cmd, "dirListing");
70
+ var isDepListCommand = (cmd) => isCommandOfType(cmd, "depList");
71
+ var isNpmInstallCommand = (cmd) => isCommandOfType(cmd, "npmInstall");
72
+ var isNpmAuditCommand = (cmd) => isCommandOfType(cmd, "npmAudit");
73
+ var isNpmOutdatedCommand = (cmd) => isCommandOfType(cmd, "npmOutdated");
74
+ var isGitPushCommand = (cmd) => isCommandOfType(cmd, "gitPush");
75
+ var isLintCommand = (cmd) => isCommandOfType(cmd, "lintCommand");
76
+ var isNpmRunScriptCommand = (cmd) => isCommandOfType(cmd, "npmRunScript");
77
+ var isCatCommand = (cmd) => isCommandOfType(cmd, "catCommand");
78
+ function isScopedGitStatusOrDiffStatCommand(cmd) {
79
+ if (!isCommandOfType(cmd, "gitMutable")) return false;
80
+ if (!isCommandOfType(cmd, "gitDiffScoped")) return false;
81
+ if (/^\s*git\s+diff\b/i.test(cmd) && !/--stat\b/.test(cmd)) return false;
82
+ return true;
83
+ }
84
+ var STATUS_STAT_CAP = 2e3;
85
+ function statusPathStats(root, porcelainZ) {
86
+ const out = [];
87
+ for (const { path: rel } of parsePorcelainZ(porcelainZ).slice(0, STATUS_STAT_CAP)) {
88
+ const st = statSync(resolve(root, rel), { throwIfNoEntry: false });
89
+ out.push(st ? `${rel}:${st.mtimeMs}:${st.size}` : `${rel}:-`);
90
+ }
91
+ return out.join("\0");
92
+ }
93
+ function gitStateFingerprintSync(cwd) {
94
+ try {
95
+ const headResult = runGit(["rev-parse", "--show-toplevel", "HEAD"], { cwd });
96
+ if (headResult.exitCode !== 0) return null;
97
+ const [root = "", headSha = ""] = headResult.stdout.trim().split(/\r?\n/);
98
+ let statusHash = "";
99
+ const statusResult = runGit(["status", "--porcelain", "-z", "--untracked-files=all"], { cwd });
100
+ if (statusResult.exitCode === 0) {
101
+ statusHash = shortFingerprint(`${statusResult.stdout}\0${statusPathStats(root, statusResult.stdout)}`);
102
+ }
103
+ const key = `${headSha}\0${statusHash}`;
104
+ return shortFingerprint(key);
105
+ } catch {
106
+ return null;
107
+ }
108
+ }
109
+ var DIR_FINGERPRINT_LISTING_CAP_ENTRIES = 1e4;
110
+ function dirStateFingerprintSync(path) {
111
+ try {
112
+ const stat = statSync(path);
113
+ if (!stat.isDirectory()) return null;
114
+ const entries = readdirSync(path);
115
+ if (entries.length <= DIR_FINGERPRINT_LISTING_CAP_ENTRIES) {
116
+ return shortFingerprint(entries.slice().sort().join("\0"));
117
+ }
118
+ return shortFingerprint(stat.mtimeMs.toString());
119
+ } catch {
120
+ return null;
121
+ }
122
+ }
123
+ var FILE_FINGERPRINT_CONTENT_CAP_BYTES = 2 * 1024 * 1024;
124
+ function fileStateFingerprintSync(path) {
125
+ try {
126
+ const stat = statSync(path);
127
+ if (!stat.isFile()) return null;
128
+ if (stat.size <= FILE_FINGERPRINT_CONTENT_CAP_BYTES) {
129
+ return shortFingerprint(readFileSync(path));
130
+ }
131
+ return shortFingerprint(`${stat.mtimeMs}\0${stat.size}`);
132
+ } catch {
133
+ return null;
134
+ }
135
+ }
136
+ function depLockfileFingerprintSync(cmd, cwd) {
137
+ if (!cwd) return null;
138
+ const stripped = cmd.trim();
139
+ const firstToken = stripped.split(/\s+/)[0]?.toLowerCase() || "";
140
+ if (!firstToken) return null;
141
+ const candidates = firstToken === "uv" ? DEP_LOCKFILES["uv"] : DEP_LOCKFILES[firstToken];
142
+ if (!candidates) return null;
143
+ for (const lockfile of candidates) {
144
+ try {
145
+ const content = readFileSync(resolve(cwd, lockfile));
146
+ return shortFingerprint(content);
147
+ } catch {
148
+ continue;
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ function normalizeCommandForCacheKey(cmd) {
154
+ const trimmed = cmd.trim();
155
+ const tokens = [];
156
+ let current = "";
157
+ let quoteChar = null;
158
+ const flush = () => {
159
+ if (current.length > 0) {
160
+ tokens.push(current);
161
+ current = "";
162
+ }
163
+ };
164
+ for (let i = 0; i < trimmed.length; i++) {
165
+ const ch = trimmed[i];
166
+ if (quoteChar !== null) {
167
+ current += ch;
168
+ if (ch === quoteChar) quoteChar = null;
169
+ continue;
170
+ }
171
+ if (ch === '"' || ch === "'") {
172
+ quoteChar = ch;
173
+ current += ch;
174
+ continue;
175
+ }
176
+ if (/\s/.test(ch)) {
177
+ flush();
178
+ continue;
179
+ }
180
+ current += ch === "\\" ? "/" : ch;
181
+ }
182
+ flush();
183
+ const normalized_tokens = tokens.map((token) => {
184
+ if (token.startsWith("-") || ["&&", "||", "|", ">", ">>", ";", "&"].includes(token)) {
185
+ return token;
186
+ }
187
+ if (token.startsWith("./") && !token.startsWith("../")) {
188
+ token = token.slice(2);
189
+ }
190
+ if (token.endsWith("/") && token !== "/") {
191
+ token = token.slice(0, -1);
192
+ }
193
+ return token || ".";
194
+ });
195
+ return normalized_tokens.join(" ");
196
+ }
197
+ function commandHashSync(command, cwd = null, gitState = () => cwd ? gitStateFingerprintSync(cwd) : null) {
198
+ const normalized = normalizeCommandForCacheKey(command);
199
+ let key = cwd ? `${normalizePath(cwd)}\0${normalized}` : normalized;
200
+ if (cwd && isGitMutableCommand(command)) {
201
+ const fp = gitState();
202
+ if (fp) key = `${key}\0git:${fp}`;
203
+ }
204
+ if (cwd && isDirListingCommand(command)) {
205
+ const target = extractFirstPathArg(command, cwd, cwd);
206
+ if (target) {
207
+ const fp = dirStateFingerprintSync(target);
208
+ if (fp) key = `${key}\0dir:${fp}`;
209
+ }
210
+ }
211
+ if (isDepListCommand(command)) {
212
+ const fp = depLockfileFingerprintSync(command, cwd);
213
+ if (fp) key = `${key}\0lockfile:${fp}`;
214
+ }
215
+ if (cwd && (isNpmInstallCommand(command) || isNpmAuditCommand(command) || isNpmOutdatedCommand(command))) {
216
+ const fp = depLockfileFingerprintSync(command, cwd);
217
+ if (fp) key = `${key}\0npm-install:${fp}`;
218
+ }
219
+ return shortFingerprint(key);
220
+ }
221
+ function commandHash(command, cwd = null) {
222
+ return Promise.resolve(commandHashSync(command, cwd));
223
+ }
224
+ function bashOutputIdSync(command, output, cwd = null) {
225
+ return outputIdFromCommandHash(commandHashSync(command, cwd), output);
226
+ }
227
+ function outputIdFromCommandHash(commandKey, output) {
228
+ return shortFingerprint(`${commandKey}\0${output}`);
229
+ }
230
+ function computeBashFingerprints(command, cwd, gitState = () => cwd ? gitStateFingerprintSync(cwd) : null) {
231
+ const fingerprints = {};
232
+ if (cwd && (isGitMutableCommand(command) || isGitPushCommand(command) || isTestRunnerCommand(command) || isLintCommand(command) || isBuildCommand(command) || isDevServerCommand(command) || isNpmRunScriptCommand(command))) {
233
+ const fp = gitState();
234
+ if (fp) fingerprints.git = fp;
235
+ }
236
+ if (cwd && isDirListingCommand(command)) {
237
+ const target = extractFirstPathArg(command, cwd, cwd);
238
+ if (target) {
239
+ const fp = dirStateFingerprintSync(target);
240
+ if (fp) fingerprints.dir = fp;
241
+ }
242
+ }
243
+ if (isDepListCommand(command) || cwd && (isNpmInstallCommand(command) || isNpmAuditCommand(command) || isNpmOutdatedCommand(command))) {
244
+ const fp = depLockfileFingerprintSync(command, cwd);
245
+ if (fp) fingerprints.lockfile = fp;
246
+ }
247
+ if (cwd && isCatCommand(command)) {
248
+ const target = extractFirstPathArg(command, cwd, null);
249
+ if (target) {
250
+ const fp = fileStateFingerprintSync(target);
251
+ if (fp) fingerprints.file = fp;
252
+ }
253
+ }
254
+ return Object.keys(fingerprints).length > 0 ? fingerprints : void 0;
255
+ }
256
+ function isBashEntryStale(entry, command, cwd) {
257
+ const stored = entry.fingerprints;
258
+ if (!stored) return false;
259
+ const current = computeBashFingerprints(command, cwd);
260
+ if (stored.git !== void 0 && stored.git !== current?.git) return true;
261
+ if (stored.dir !== void 0 && stored.dir !== current?.dir) return true;
262
+ if (stored.lockfile !== void 0 && stored.lockfile !== current?.lockfile) return true;
263
+ if (stored.file !== void 0 && stored.file !== current?.file) return true;
264
+ return false;
265
+ }
266
+ function tokenizeShellArgs(cmd) {
267
+ const trimmed = cmd.trim();
268
+ const tokens = [];
269
+ let current = "";
270
+ let quoteChar = null;
271
+ let hasToken = false;
272
+ for (let i = 0; i < trimmed.length; i++) {
273
+ const ch = trimmed[i];
274
+ if (quoteChar !== null) {
275
+ if (ch === quoteChar) {
276
+ quoteChar = null;
277
+ } else {
278
+ current += ch;
279
+ }
280
+ continue;
281
+ }
282
+ if (ch === '"' || ch === "'") {
283
+ quoteChar = ch;
284
+ hasToken = true;
285
+ continue;
286
+ }
287
+ if (/\s/.test(ch)) {
288
+ if (hasToken) {
289
+ tokens.push(current);
290
+ current = "";
291
+ hasToken = false;
292
+ }
293
+ continue;
294
+ }
295
+ current += ch;
296
+ hasToken = true;
297
+ }
298
+ if (hasToken) tokens.push(current);
299
+ return tokens;
300
+ }
301
+ function extractFirstPathArg(cmd, cwd, fallback) {
302
+ const tokens = tokenizeShellArgs(cmd);
303
+ for (let i = 1; i < tokens.length; i++) {
304
+ const token = tokens[i];
305
+ if (!token.startsWith("-")) {
306
+ if (!token.startsWith("/")) {
307
+ return resolve(cwd, token);
308
+ }
309
+ return token;
310
+ }
311
+ }
312
+ return fallback;
313
+ }
314
+ var ISSUE_LINE_PATTERN = /\b(?:error|fail(?:ed|ure)?|warning)\b/i;
315
+ function summarizeOutputDelta(oldOutput, newOutput) {
316
+ if (oldOutput === newOutput) return null;
317
+ const oldLines = oldOutput.split("\n");
318
+ const newLines = newOutput.split("\n");
319
+ const oldIssueLines = oldLines.filter((l) => ISSUE_LINE_PATTERN.test(l));
320
+ if (oldIssueLines.length > 0) {
321
+ const newIssueLines = newLines.filter((l) => ISSUE_LINE_PATTERN.test(l));
322
+ const priorTotal = oldIssueLines.length;
323
+ const availableCounts = /* @__PURE__ */ new Map();
324
+ for (const l of newIssueLines) availableCounts.set(l, (availableCounts.get(l) ?? 0) + 1);
325
+ let resolved = 0;
326
+ for (const l of oldIssueLines) {
327
+ const avail = availableCounts.get(l) ?? 0;
328
+ if (avail > 0) {
329
+ availableCounts.set(l, avail - 1);
330
+ } else {
331
+ resolved++;
332
+ }
333
+ }
334
+ const remaining = newIssueLines.length;
335
+ return `[token-goat: delta] ${resolved} of ${priorTotal} prior issues resolved; remaining: ${remaining}`;
336
+ }
337
+ return `[token-goat: delta] output changed: ${oldLines.length} -> ${newLines.length} lines`;
338
+ }
339
+ function storeBashOutputSync(command, output, exitCode, cwd = null) {
340
+ let gitState = null;
341
+ const gitStateOnce = () => (gitState ??= { value: cwd ? gitStateFingerprintSync(cwd) : null }).value;
342
+ const commandKey = commandHashSync(command, cwd, gitStateOnce);
343
+ const id = outputIdFromCommandHash(commandKey, output);
344
+ const fingerprints = computeBashFingerprints(command, cwd, gitStateOnce);
345
+ const redactedOutput = redactSecrets(output).text;
346
+ const redactedCommand = redactSecrets(command).text;
347
+ const entry = {
348
+ id,
349
+ command: redactedCommand,
350
+ output: redactedOutput,
351
+ exitCode,
352
+ storedAt: Date.now(),
353
+ sizeBytes: Buffer.byteLength(redactedOutput, "utf-8"),
354
+ ...fingerprints ? { fingerprints } : {}
355
+ };
356
+ _byId.set(id, entry);
357
+ _byId.set(commandKey, entry);
358
+ storeBlob(BASH_OUTPUT_SUBDIR, id, entry);
359
+ if (commandKey !== id) storeBlob(BASH_OUTPUT_SUBDIR, commandKey, { latestId: id });
360
+ indexRecallEntry("bash", id, redactedCommand, `${redactedCommand}
361
+ ${redactedOutput}`, entry.storedAt);
362
+ return id;
363
+ }
364
+ function coerceBashRedirect(raw) {
365
+ if (raw === null || typeof raw !== "object") return null;
366
+ const latest = raw["latestId"];
367
+ return typeof latest === "string" && latest.length > 0 ? latest : null;
368
+ }
369
+ function storeBashOutput(command, output, exitCode, cwd = null) {
370
+ return Promise.resolve(storeBashOutputSync(command, output, exitCode, cwd));
371
+ }
372
+ function coerceBashEntry(raw) {
373
+ if (raw === null || typeof raw !== "object") return null;
374
+ const o = raw;
375
+ if (typeof o["id"] !== "string" || typeof o["command"] !== "string" || typeof o["output"] !== "string" || typeof o["exitCode"] !== "number" || typeof o["storedAt"] !== "number" || typeof o["sizeBytes"] !== "number") {
376
+ return null;
377
+ }
378
+ const entry = {
379
+ id: o["id"],
380
+ command: o["command"],
381
+ output: o["output"],
382
+ exitCode: o["exitCode"],
383
+ storedAt: o["storedAt"],
384
+ sizeBytes: o["sizeBytes"]
385
+ };
386
+ const rawFingerprints = o["fingerprints"];
387
+ if (rawFingerprints !== null && typeof rawFingerprints === "object") {
388
+ const f = rawFingerprints;
389
+ const fingerprints = {};
390
+ if (typeof f["git"] === "string") fingerprints.git = f["git"];
391
+ if (typeof f["dir"] === "string") fingerprints.dir = f["dir"];
392
+ if (typeof f["lockfile"] === "string") fingerprints.lockfile = f["lockfile"];
393
+ if (typeof f["file"] === "string") fingerprints.file = f["file"];
394
+ if (Object.keys(fingerprints).length > 0) return { ...entry, fingerprints };
395
+ }
396
+ return entry;
397
+ }
398
+ function getBashOutput(id) {
399
+ const hit = _byId.get(id);
400
+ if (hit !== void 0) return hit;
401
+ if (isBlobStale(BASH_OUTPUT_SUBDIR, id)) return null;
402
+ const raw = loadBlob(BASH_OUTPUT_SUBDIR, id);
403
+ const target = coerceBashRedirect(raw);
404
+ if (target !== null) {
405
+ if (isBlobStale(BASH_OUTPUT_SUBDIR, target)) return null;
406
+ const latest = coerceBashEntry(loadBlob(BASH_OUTPUT_SUBDIR, target));
407
+ if (latest === null) return null;
408
+ _byId.set(target, latest);
409
+ _byId.set(id, latest);
410
+ return latest;
411
+ }
412
+ const entry = coerceBashEntry(raw);
413
+ if (entry === null) return null;
414
+ _byId.set(id, entry);
415
+ return entry;
416
+ }
417
+ registerReset(() => {
418
+ _byId = /* @__PURE__ */ new Map();
419
+ }, { perRequest: true });
420
+
421
+ export {
422
+ BASH_OUTPUT_SUBDIR,
423
+ isLintCommand,
424
+ isScopedGitStatusOrDiffStatCommand,
425
+ normalizeCommandForCacheKey,
426
+ commandHash,
427
+ bashOutputIdSync,
428
+ isBashEntryStale,
429
+ summarizeOutputDelta,
430
+ storeBashOutputSync,
431
+ storeBashOutput,
432
+ getBashOutput
433
+ };