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.
- package/README.md +53 -42
- package/SECURITY.md +37 -11
- package/THIRD_PARTY_NOTICES.md +41 -4
- package/dist/native/linux-arm64/tg-hook +0 -0
- package/dist/native/linux-x64/tg-hook +0 -0
- package/dist/native/win32-arm64/tg-hook.exe +0 -0
- package/dist/native/win32-x64/tg-hook.exe +0 -0
- package/dist/ort-wasm-simd-threaded.mjs +59 -0
- package/dist/{token-goat-chunk-SE6E4BKJ.mjs → token-goat-chunk-25TRAWET.mjs} +23 -6
- package/dist/token-goat-chunk-2KXO6V2B.mjs +203 -0
- package/dist/{token-goat-chunk-UXSXQQIY.mjs → token-goat-chunk-2M7E4PF7.mjs} +43 -14
- package/dist/token-goat-chunk-2UPZGKKY.mjs +188 -0
- package/dist/token-goat-chunk-2WLPWKHV.mjs +135 -0
- package/dist/token-goat-chunk-2XBMMDBD.mjs +126 -0
- package/dist/token-goat-chunk-32ZOY4N5.mjs +23 -0
- package/dist/token-goat-chunk-3EZRNKTK.mjs +188 -0
- package/dist/token-goat-chunk-4ADZHI7J.mjs +63 -0
- package/dist/token-goat-chunk-4GBVPH3D.mjs +242 -0
- package/dist/{token-goat-chunk-2WOUYWLM.mjs → token-goat-chunk-4GILLLWY.mjs} +34 -7
- package/dist/token-goat-chunk-4NAPX7BA.mjs +90 -0
- package/dist/{token-goat-chunk-NMBWLRHW.mjs → token-goat-chunk-4SC7UJYV.mjs} +9981 -11563
- package/dist/token-goat-chunk-4SMRO4TO.mjs +366 -0
- package/dist/{token-goat-chunk-O6I2XU4P.mjs → token-goat-chunk-4ZBFWLXF.mjs} +310 -441
- package/dist/token-goat-chunk-57BIAXJL.mjs +286 -0
- package/dist/token-goat-chunk-5AC66HNP.mjs +115 -0
- package/dist/token-goat-chunk-5IMLKSOP.mjs +145 -0
- package/dist/token-goat-chunk-5RG5SBL6.mjs +221 -0
- package/dist/{token-goat-chunk-RRNZMM3A.mjs → token-goat-chunk-5Y6ZYL6U.mjs} +21 -2
- package/dist/token-goat-chunk-646E6U44.mjs +398 -0
- package/dist/token-goat-chunk-65N4RHP4.mjs +33 -0
- package/dist/{token-goat-chunk-6AK46ZT7.mjs → token-goat-chunk-6DG6HWP3.mjs} +13 -3
- package/dist/token-goat-chunk-6ENQSNRZ.mjs +573 -0
- package/dist/token-goat-chunk-6ZY4GNF2.mjs +91 -0
- package/dist/{token-goat-chunk-E5TK5DNO.mjs → token-goat-chunk-76FGDLRO.mjs} +574 -340
- package/dist/{token-goat-chunk-TGOXNAHW.mjs → token-goat-chunk-7EZTZOMC.mjs} +780 -767
- package/dist/token-goat-chunk-7MAOA6X4.mjs +3647 -0
- package/dist/token-goat-chunk-7R2ZVVAX.mjs +218 -0
- package/dist/{token-goat-chunk-TCQANXYC.mjs → token-goat-chunk-AM5V6GSX.mjs} +18 -2
- package/dist/token-goat-chunk-AUNGYYQX.mjs +184 -0
- package/dist/token-goat-chunk-AUQYRMMH.mjs +2985 -0
- package/dist/token-goat-chunk-B3PEKBYG.mjs +128 -0
- package/dist/{token-goat-chunk-KOPIR3KZ.mjs → token-goat-chunk-BA4HI6BW.mjs} +1910 -165
- package/dist/{token-goat-chunk-52NSDWYY.mjs → token-goat-chunk-BFCWY73P.mjs} +58 -20
- package/dist/token-goat-chunk-BPGCUMR7.mjs +30 -0
- package/dist/token-goat-chunk-BWGFUZZE.mjs +25 -0
- package/dist/token-goat-chunk-C75NA7PL.mjs +322 -0
- package/dist/token-goat-chunk-CBIQ7WTD.mjs +87 -0
- package/dist/token-goat-chunk-CETM74KC.mjs +307 -0
- package/dist/token-goat-chunk-CIMQ2BB3.mjs +233 -0
- package/dist/{token-goat-chunk-DNSPXQXQ.mjs → token-goat-chunk-CJLS3CDL.mjs} +70 -18
- package/dist/{token-goat-chunk-MELOKFDJ.mjs → token-goat-chunk-CO3UYX6G.mjs} +7 -1
- package/dist/token-goat-chunk-COPNXRJM.mjs +154 -0
- package/dist/token-goat-chunk-CSJ5L3NL.mjs +479 -0
- package/dist/token-goat-chunk-CVCEVUGK.mjs +315 -0
- package/dist/token-goat-chunk-CXHOFN7R.mjs +371 -0
- package/dist/token-goat-chunk-D735C4QM.mjs +603 -0
- package/dist/{token-goat-chunk-E4ZOJIZK.mjs → token-goat-chunk-DGS2LVNA.mjs} +70 -160
- package/dist/{token-goat-chunk-L7H3U27L.mjs → token-goat-chunk-DOWRSMWO.mjs} +1 -1
- package/dist/token-goat-chunk-E45INMY3.mjs +71 -0
- package/dist/token-goat-chunk-EC5F37F4.mjs +244 -0
- package/dist/{token-goat-chunk-XTQAOTSO.mjs → token-goat-chunk-EDBDRVH5.mjs} +4 -1
- package/dist/token-goat-chunk-EELTBKDM.mjs +613 -0
- package/dist/token-goat-chunk-EVMZJ27Z.mjs +147 -0
- package/dist/token-goat-chunk-EXKGNHEG.mjs +2096 -0
- package/dist/{token-goat-chunk-YOOVFPTP.mjs → token-goat-chunk-F4HYL64R.mjs} +12 -2
- package/dist/token-goat-chunk-F6PAUIEK.mjs +624 -0
- package/dist/token-goat-chunk-FDSREWLX.mjs +692 -0
- package/dist/{token-goat-chunk-NMTKNYGF.mjs → token-goat-chunk-FNFBKLRD.mjs} +74 -9
- package/dist/token-goat-chunk-G5PJ7AGM.mjs +36 -0
- package/dist/token-goat-chunk-GGGG7RWB.mjs +236 -0
- package/dist/{token-goat-chunk-TDUT2CL6.mjs → token-goat-chunk-GL3ETKSC.mjs} +276 -19
- package/dist/{token-goat-chunk-7CPMDFGB.mjs → token-goat-chunk-GVB2MUST.mjs} +265 -1567
- package/dist/token-goat-chunk-GWFLAUMQ.mjs +307 -0
- package/dist/token-goat-chunk-HAVAOB3S.mjs +87 -0
- package/dist/token-goat-chunk-HLPW63A7.mjs +48 -0
- package/dist/token-goat-chunk-HU4TORC5.mjs +1377 -0
- package/dist/token-goat-chunk-I7VKZZAW.mjs +35 -0
- package/dist/token-goat-chunk-IA6XSPE3.mjs +218 -0
- package/dist/token-goat-chunk-IAGXMHIK.mjs +863 -0
- package/dist/{token-goat-chunk-435UQTKD.mjs → token-goat-chunk-IK2DRMFX.mjs} +129 -74
- package/dist/{token-goat-chunk-ZER6EAXZ.mjs → token-goat-chunk-INNPTRUX.mjs} +2954 -2783
- package/dist/token-goat-chunk-JJ5BX4F4.mjs +129 -0
- package/dist/token-goat-chunk-JVFSHVFJ.mjs +129 -0
- package/dist/token-goat-chunk-KGEFFSHD.mjs +50 -0
- package/dist/token-goat-chunk-KKUFXAPD.mjs +25 -0
- package/dist/token-goat-chunk-KQBLRPBN.mjs +433 -0
- package/dist/token-goat-chunk-LCNQ2CNN.mjs +497 -0
- package/dist/token-goat-chunk-M3LFJDPU.mjs +58 -0
- package/dist/token-goat-chunk-M52KPT3C.mjs +87 -0
- package/dist/token-goat-chunk-MBEG42H7.mjs +150 -0
- package/dist/{token-goat-chunk-EVC4TOLE.mjs → token-goat-chunk-METECDOH.mjs} +3 -12
- package/dist/{token-goat-chunk-2AWQ2R5X.mjs → token-goat-chunk-MHX7XCC3.mjs} +3 -2
- package/dist/token-goat-chunk-MNWKPRAL.mjs +13 -0
- package/dist/token-goat-chunk-N5LSOVSU.mjs +137 -0
- package/dist/{token-goat-chunk-DPNLUJWB.mjs → token-goat-chunk-N5MMR2IW.mjs} +30 -8
- package/dist/token-goat-chunk-N7B3JQ2C.mjs +160 -0
- package/dist/{token-goat-chunk-VMFWNHGR.mjs → token-goat-chunk-NISNMD7T.mjs} +2545 -2953
- package/dist/token-goat-chunk-NMD42SFQ.mjs +434 -0
- package/dist/token-goat-chunk-NOSS5VWY.mjs +174 -0
- package/dist/token-goat-chunk-NSNSPPBG.mjs +69 -0
- package/dist/token-goat-chunk-OBOFIHKN.mjs +38 -0
- package/dist/token-goat-chunk-OBRFJ5O5.mjs +76 -0
- package/dist/token-goat-chunk-ODBT2USM.mjs +800 -0
- package/dist/token-goat-chunk-OS5EM5PP.mjs +107 -0
- package/dist/token-goat-chunk-OUKDTVNU.mjs +1178 -0
- package/dist/token-goat-chunk-OXFMP75N.mjs +566 -0
- package/dist/{token-goat-chunk-ASLWOQ3I.mjs → token-goat-chunk-OYIYKDDT.mjs} +2 -1
- package/dist/{token-goat-chunk-67BNIKKO.mjs → token-goat-chunk-P6HQSWQ3.mjs} +55 -47
- package/dist/token-goat-chunk-P6VGNTQT.mjs +71 -0
- package/dist/token-goat-chunk-PFWIMH2E.mjs +261 -0
- package/dist/token-goat-chunk-PJZXIS3G.mjs +39 -0
- package/dist/token-goat-chunk-PUO5INXP.mjs +606 -0
- package/dist/token-goat-chunk-PX5PQWTY.mjs +462 -0
- package/dist/token-goat-chunk-Q5QDBC6O.mjs +111 -0
- package/dist/token-goat-chunk-QFNQXSDT.mjs +40 -0
- package/dist/token-goat-chunk-QH7YVYOY.mjs +3957 -0
- package/dist/token-goat-chunk-QLMUHEPB.mjs +43 -0
- package/dist/{token-goat-chunk-PYSUADX4.mjs → token-goat-chunk-QQOJIHL3.mjs} +50 -14
- package/dist/token-goat-chunk-QQTWJY2O.mjs +85 -0
- package/dist/token-goat-chunk-QYHO5CPH.mjs +93 -0
- package/dist/token-goat-chunk-RELAVWAD.mjs +27 -0
- package/dist/token-goat-chunk-RSLPOBKQ.mjs +339 -0
- package/dist/token-goat-chunk-SAMFDIS2.mjs +712 -0
- package/dist/token-goat-chunk-SDELXLDM.mjs +48 -0
- package/dist/{token-goat-chunk-PGTH2U4C.mjs → token-goat-chunk-SOAFZNNZ.mjs} +164 -40
- package/dist/{token-goat-chunk-G23DWHV4.mjs → token-goat-chunk-SRTHT7KV.mjs} +33 -15
- package/dist/token-goat-chunk-T5P5ACNQ.mjs +212 -0
- package/dist/token-goat-chunk-T5YGG4V3.mjs +45 -0
- package/dist/token-goat-chunk-TAUZ4OFS.mjs +110 -0
- package/dist/token-goat-chunk-TM6MC754.mjs +40 -0
- package/dist/token-goat-chunk-TWUKBOMP.mjs +72 -0
- package/dist/token-goat-chunk-U2KSB4SG.mjs +56 -0
- package/dist/token-goat-chunk-U4WHMG6Y.mjs +898 -0
- package/dist/token-goat-chunk-UA5V6P3P.mjs +122 -0
- package/dist/token-goat-chunk-UGJHGR5A.mjs +52 -0
- package/dist/{token-goat-chunk-RQGGMPCR.mjs → token-goat-chunk-UOUDVA5U.mjs} +76 -16
- package/dist/{token-goat-chunk-HNFZZHFW.mjs → token-goat-chunk-URRJ33GR.mjs} +22 -4
- package/dist/token-goat-chunk-UZOROKIS.mjs +165 -0
- package/dist/token-goat-chunk-VIHGGGEI.mjs +4234 -0
- package/dist/token-goat-chunk-VTJLAA7P.mjs +21 -0
- package/dist/token-goat-chunk-VWDXLT4F.mjs +678 -0
- package/dist/token-goat-chunk-VWZA2H4P.mjs +368 -0
- package/dist/{token-goat-chunk-QO3LXVVR.mjs → token-goat-chunk-VXEXMJDL.mjs} +2964 -3153
- package/dist/token-goat-chunk-WBA5SKT4.mjs +547 -0
- package/dist/{token-goat-chunk-ONXH6NZ5.mjs → token-goat-chunk-WDH44VAU.mjs} +19 -22
- package/dist/token-goat-chunk-X2SUP3EI.mjs +107 -0
- package/dist/token-goat-chunk-X3BELZSJ.mjs +125 -0
- package/dist/{token-goat-chunk-RLP6J7WR.mjs → token-goat-chunk-XLRBNZCC.mjs} +40 -21
- package/dist/{token-goat-chunk-S4VSXURL.mjs → token-goat-chunk-XRKUX6CM.mjs} +4 -0
- package/dist/token-goat-chunk-XX6O25RN.mjs +82 -0
- package/dist/token-goat-chunk-XZSUHBVS.mjs +65 -0
- package/dist/token-goat-chunk-Y2ZTQOCL.mjs +35 -0
- package/dist/{token-goat-chunk-UA5BKWWQ.mjs → token-goat-chunk-YB4VMGK2.mjs} +15 -4
- package/dist/token-goat-chunk-YBIIY3HR.mjs +51 -0
- package/dist/{token-goat-chunk-PKRWMHVP.mjs → token-goat-chunk-YHVDKQBR.mjs} +389 -221
- package/dist/token-goat-chunk-YJB5XLWI.mjs +26 -0
- package/dist/{token-goat-chunk-PQ53BSCF.mjs → token-goat-chunk-YKB6AQG3.mjs} +53 -31
- package/dist/token-goat-chunk-YMTG2YA5.mjs +35 -0
- package/dist/token-goat-chunk-YPBZYQRV.mjs +40 -0
- package/dist/{token-goat-chunk-HUYUHODZ.mjs → token-goat-chunk-YY6AVUFL.mjs} +13246 -12247
- package/dist/token-goat-chunk-Z7N5OMMP.mjs +98 -0
- package/dist/{token-goat-chunk-BGHSSJUA.mjs → token-goat-chunk-ZFOBKUWH.mjs} +1 -1
- package/dist/token-goat-chunk-ZMBL6UVV.mjs +110 -0
- package/dist/token-goat-chunk-ZNMNUPAZ.mjs +938 -0
- package/dist/token-goat-hook-client.cjs +87 -23
- package/dist/token-goat-hook-client.mjs +3 -3
- package/dist/token-goat-hook.mjs +76 -31
- package/dist/token-goat.core.mjs +6 -6
- package/docs/C4_RUNTIME_ARCHITECTURE.md +2 -2
- package/docs/cli.md +113 -60
- package/docs/install.md +63 -20
- package/docs/security.md +10 -8
- package/package.json +18 -7
- package/scripts/verify-native-dist.mjs +386 -0
- package/dist/token-goat-chunk-2NNUA2LR.mjs +0 -143
- package/dist/token-goat-chunk-44BM7DDQ.mjs +0 -294
- package/dist/token-goat-chunk-BGYOZ6DO.mjs +0 -24
- package/dist/token-goat-chunk-C5YPNZKQ.mjs +0 -318
- package/dist/token-goat-chunk-CIQ2FTY3.mjs +0 -1990
- package/dist/token-goat-chunk-D4ETHJD6.mjs +0 -246
- package/dist/token-goat-chunk-DNRPXHYH.mjs +0 -1062
- package/dist/token-goat-chunk-EUSDXRXU.mjs +0 -1429
- package/dist/token-goat-chunk-FTP4U4QA.mjs +0 -64
- package/dist/token-goat-chunk-G7IWXCFF.mjs +0 -456
- package/dist/token-goat-chunk-GLXRTTLE.mjs +0 -36
- package/dist/token-goat-chunk-H5J3C56Q.mjs +0 -1511
- package/dist/token-goat-chunk-IVWI2OCK.mjs +0 -368
- package/dist/token-goat-chunk-JTKCQMQA.mjs +0 -418
- package/dist/token-goat-chunk-LZNBQTDK.mjs +0 -26
- package/dist/token-goat-chunk-ORNFMIER.mjs +0 -295
- package/dist/token-goat-chunk-RTMVLHWX.mjs +0 -7113
- package/dist/token-goat-chunk-VQ6F6T7X.mjs +0 -36
- package/dist/token-goat-chunk-VZQEWRVH.mjs +0 -312
- package/dist/token-goat-chunk-XYWPOSCN.mjs +0 -807
- package/dist/token-goat-chunk-YAGLESS3.mjs +0 -23
- package/dist/token-goat-chunk-YKSRAWUU.mjs +0 -33
- 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
|
+
};
|