token-goat 2.9.30 → 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 (172) hide show
  1. package/README.md +24 -7
  2. package/SECURITY.md +10 -2
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  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/{token-goat-chunk-QSBRTGM2.mjs → token-goat-chunk-25TRAWET.mjs} +17 -7
  9. package/dist/token-goat-chunk-2KXO6V2B.mjs +203 -0
  10. package/dist/{token-goat-chunk-IVKIZWAB.mjs → token-goat-chunk-2M7E4PF7.mjs} +41 -12
  11. package/dist/{token-goat-chunk-SMVRN2HU.mjs → token-goat-chunk-2UPZGKKY.mjs} +2 -2
  12. package/dist/token-goat-chunk-2WLPWKHV.mjs +135 -0
  13. package/dist/token-goat-chunk-2XBMMDBD.mjs +126 -0
  14. package/dist/token-goat-chunk-32ZOY4N5.mjs +23 -0
  15. package/dist/token-goat-chunk-3EZRNKTK.mjs +188 -0
  16. package/dist/token-goat-chunk-4ADZHI7J.mjs +63 -0
  17. package/dist/token-goat-chunk-4GBVPH3D.mjs +242 -0
  18. package/dist/{token-goat-chunk-KWPNJBDH.mjs → token-goat-chunk-4GILLLWY.mjs} +7 -4
  19. package/dist/{token-goat-chunk-67TQJ76B.mjs → token-goat-chunk-4NAPX7BA.mjs} +36 -3
  20. package/dist/{token-goat-chunk-PU7V3FD6.mjs → token-goat-chunk-4SC7UJYV.mjs} +3354 -2553
  21. package/dist/token-goat-chunk-4SMRO4TO.mjs +366 -0
  22. package/dist/{token-goat-chunk-AFLYLHDH.mjs → token-goat-chunk-4ZBFWLXF.mjs} +283 -427
  23. package/dist/{token-goat-chunk-JDWCRD6M.mjs → token-goat-chunk-57BIAXJL.mjs} +73 -40
  24. package/dist/token-goat-chunk-5AC66HNP.mjs +115 -0
  25. package/dist/token-goat-chunk-5IMLKSOP.mjs +145 -0
  26. package/dist/token-goat-chunk-646E6U44.mjs +398 -0
  27. package/dist/token-goat-chunk-65N4RHP4.mjs +33 -0
  28. package/dist/{token-goat-chunk-JN4XMLSD.mjs → token-goat-chunk-6DG6HWP3.mjs} +8 -2
  29. package/dist/token-goat-chunk-6ENQSNRZ.mjs +573 -0
  30. package/dist/token-goat-chunk-6ZY4GNF2.mjs +91 -0
  31. package/dist/{token-goat-chunk-VPBBTSJR.mjs → token-goat-chunk-76FGDLRO.mjs} +262 -255
  32. package/dist/{token-goat-chunk-7IN2MKDS.mjs → token-goat-chunk-7EZTZOMC.mjs} +121 -289
  33. package/dist/{token-goat-chunk-OJBNYTJP.mjs → token-goat-chunk-7MAOA6X4.mjs} +640 -80
  34. package/dist/token-goat-chunk-7R2ZVVAX.mjs +218 -0
  35. package/dist/{token-goat-chunk-PD5VKH46.mjs → token-goat-chunk-AUNGYYQX.mjs} +2 -2
  36. package/dist/{token-goat-chunk-HG45AF2B.mjs → token-goat-chunk-AUQYRMMH.mjs} +794 -37
  37. package/dist/token-goat-chunk-B3PEKBYG.mjs +128 -0
  38. package/dist/{token-goat-chunk-A3CK6N5Z.mjs → token-goat-chunk-BA4HI6BW.mjs} +1309 -110
  39. package/dist/{token-goat-chunk-JB6QN6VF.mjs → token-goat-chunk-BFCWY73P.mjs} +59 -23
  40. package/dist/{token-goat-chunk-B45VMIIH.mjs → token-goat-chunk-BWGFUZZE.mjs} +7 -5
  41. package/dist/{token-goat-chunk-P4QMM4WK.mjs → token-goat-chunk-C75NA7PL.mjs} +50 -23
  42. package/dist/token-goat-chunk-CBIQ7WTD.mjs +87 -0
  43. package/dist/token-goat-chunk-CETM74KC.mjs +307 -0
  44. package/dist/{token-goat-chunk-H2PHHGM5.mjs → token-goat-chunk-CIMQ2BB3.mjs} +57 -12
  45. package/dist/{token-goat-chunk-N2NMER56.mjs → token-goat-chunk-CJLS3CDL.mjs} +46 -4
  46. package/dist/{token-goat-chunk-VES7EL7O.mjs → token-goat-chunk-CO3UYX6G.mjs} +1 -1
  47. package/dist/token-goat-chunk-COPNXRJM.mjs +154 -0
  48. package/dist/token-goat-chunk-CSJ5L3NL.mjs +479 -0
  49. package/dist/{token-goat-chunk-4LCCNRTG.mjs → token-goat-chunk-CVCEVUGK.mjs} +8 -6
  50. package/dist/{token-goat-chunk-B2RZZCSS.mjs → token-goat-chunk-CXHOFN7R.mjs} +37 -20
  51. package/dist/token-goat-chunk-D735C4QM.mjs +603 -0
  52. package/dist/{token-goat-chunk-APGZXSPS.mjs → token-goat-chunk-DGS2LVNA.mjs} +47 -30
  53. package/dist/{token-goat-chunk-54K3EUV3.mjs → token-goat-chunk-DOWRSMWO.mjs} +1 -1
  54. package/dist/token-goat-chunk-E45INMY3.mjs +71 -0
  55. package/dist/token-goat-chunk-EC5F37F4.mjs +244 -0
  56. package/dist/{token-goat-chunk-XTQAOTSO.mjs → token-goat-chunk-EDBDRVH5.mjs} +4 -1
  57. package/dist/{token-goat-chunk-5BCIJXMO.mjs → token-goat-chunk-EELTBKDM.mjs} +14 -10
  58. package/dist/{token-goat-chunk-W3QCJS6G.mjs → token-goat-chunk-F4HYL64R.mjs} +8 -6
  59. package/dist/token-goat-chunk-F6PAUIEK.mjs +624 -0
  60. package/dist/token-goat-chunk-FDSREWLX.mjs +692 -0
  61. package/dist/token-goat-chunk-GGGG7RWB.mjs +236 -0
  62. package/dist/{token-goat-chunk-C63JQV5K.mjs → token-goat-chunk-GL3ETKSC.mjs} +233 -15
  63. package/dist/token-goat-chunk-GVB2MUST.mjs +1298 -0
  64. package/dist/token-goat-chunk-GWFLAUMQ.mjs +307 -0
  65. package/dist/{token-goat-chunk-ZEJVMUQH.mjs → token-goat-chunk-HLPW63A7.mjs} +2 -2
  66. package/dist/{token-goat-chunk-GOLEOXZP.mjs → token-goat-chunk-HU4TORC5.mjs} +44 -26
  67. package/dist/{token-goat-chunk-Z57YODA2.mjs → token-goat-chunk-I7VKZZAW.mjs} +2 -2
  68. package/dist/{token-goat-chunk-NYKZLXMK.mjs → token-goat-chunk-IA6XSPE3.mjs} +6 -6
  69. package/dist/{token-goat-chunk-E3OQX2XT.mjs → token-goat-chunk-IAGXMHIK.mjs} +81 -42
  70. package/dist/{token-goat-chunk-HYBFA5X3.mjs → token-goat-chunk-IK2DRMFX.mjs} +24 -68
  71. package/dist/{token-goat-chunk-COBQGL5S.mjs → token-goat-chunk-INNPTRUX.mjs} +249 -299
  72. package/dist/{token-goat-chunk-7NADEDKJ.mjs → token-goat-chunk-JJ5BX4F4.mjs} +6 -1
  73. package/dist/{token-goat-chunk-PEPTHRFF.mjs → token-goat-chunk-JVFSHVFJ.mjs} +6 -6
  74. package/dist/token-goat-chunk-KGEFFSHD.mjs +50 -0
  75. package/dist/token-goat-chunk-KQBLRPBN.mjs +433 -0
  76. package/dist/{token-goat-chunk-Q5VTGRH7.mjs → token-goat-chunk-LCNQ2CNN.mjs} +55 -319
  77. package/dist/token-goat-chunk-M3LFJDPU.mjs +58 -0
  78. package/dist/token-goat-chunk-M52KPT3C.mjs +87 -0
  79. package/dist/token-goat-chunk-MBEG42H7.mjs +150 -0
  80. package/dist/{token-goat-chunk-EVC4TOLE.mjs → token-goat-chunk-METECDOH.mjs} +3 -12
  81. package/dist/{token-goat-chunk-T4FK7VOV.mjs → token-goat-chunk-MHX7XCC3.mjs} +2 -1
  82. package/dist/token-goat-chunk-N5LSOVSU.mjs +137 -0
  83. package/dist/{token-goat-chunk-LOBGHXPB.mjs → token-goat-chunk-N5MMR2IW.mjs} +1 -1
  84. package/dist/token-goat-chunk-N7B3JQ2C.mjs +160 -0
  85. package/dist/{token-goat-chunk-RHXKCZX3.mjs → token-goat-chunk-NISNMD7T.mjs} +2182 -2959
  86. package/dist/token-goat-chunk-NMD42SFQ.mjs +434 -0
  87. package/dist/token-goat-chunk-NOSS5VWY.mjs +174 -0
  88. package/dist/{token-goat-chunk-KQNZDCBD.mjs → token-goat-chunk-NSNSPPBG.mjs} +25 -3
  89. package/dist/token-goat-chunk-OBOFIHKN.mjs +38 -0
  90. package/dist/token-goat-chunk-OBRFJ5O5.mjs +76 -0
  91. package/dist/{token-goat-chunk-JTQQGXZH.mjs → token-goat-chunk-ODBT2USM.mjs} +124 -57
  92. package/dist/token-goat-chunk-OS5EM5PP.mjs +107 -0
  93. package/dist/token-goat-chunk-OUKDTVNU.mjs +1178 -0
  94. package/dist/token-goat-chunk-OXFMP75N.mjs +566 -0
  95. package/dist/{token-goat-chunk-DZX2YDPT.mjs → token-goat-chunk-OYIYKDDT.mjs} +2 -2
  96. package/dist/{token-goat-chunk-QCLDAQTS.mjs → token-goat-chunk-P6HQSWQ3.mjs} +50 -53
  97. package/dist/token-goat-chunk-P6VGNTQT.mjs +71 -0
  98. package/dist/{token-goat-chunk-7BXSNBY5.mjs → token-goat-chunk-PFWIMH2E.mjs} +23 -15
  99. package/dist/token-goat-chunk-PJZXIS3G.mjs +39 -0
  100. package/dist/token-goat-chunk-PUO5INXP.mjs +606 -0
  101. package/dist/{token-goat-chunk-GFBSN7BD.mjs → token-goat-chunk-PX5PQWTY.mjs} +22 -250
  102. package/dist/token-goat-chunk-Q5QDBC6O.mjs +111 -0
  103. package/dist/token-goat-chunk-QFNQXSDT.mjs +40 -0
  104. package/dist/{token-goat-chunk-FBNQNSJK.mjs → token-goat-chunk-QH7YVYOY.mjs} +2198 -2782
  105. package/dist/{token-goat-chunk-64FBPDTK.mjs → token-goat-chunk-QLMUHEPB.mjs} +12 -9
  106. package/dist/{token-goat-chunk-RZRTDST7.mjs → token-goat-chunk-QQOJIHL3.mjs} +37 -11
  107. package/dist/{token-goat-chunk-XKI4SEMX.mjs → token-goat-chunk-QQTWJY2O.mjs} +19 -0
  108. package/dist/{token-goat-chunk-U4N3BN2W.mjs → token-goat-chunk-QYHO5CPH.mjs} +3 -2
  109. package/dist/token-goat-chunk-RELAVWAD.mjs +27 -0
  110. package/dist/{token-goat-chunk-ETBHVDB6.mjs → token-goat-chunk-RSLPOBKQ.mjs} +22 -11
  111. package/dist/token-goat-chunk-SAMFDIS2.mjs +712 -0
  112. package/dist/token-goat-chunk-SDELXLDM.mjs +48 -0
  113. package/dist/{token-goat-chunk-4JJS54TR.mjs → token-goat-chunk-SOAFZNNZ.mjs} +161 -38
  114. package/dist/{token-goat-chunk-664RTTUV.mjs → token-goat-chunk-SRTHT7KV.mjs} +21 -16
  115. package/dist/{token-goat-chunk-4FVIAHSI.mjs → token-goat-chunk-T5P5ACNQ.mjs} +7 -6
  116. package/dist/token-goat-chunk-T5YGG4V3.mjs +45 -0
  117. package/dist/token-goat-chunk-TAUZ4OFS.mjs +110 -0
  118. package/dist/{token-goat-chunk-COTXZHTS.mjs → token-goat-chunk-TM6MC754.mjs} +4 -3
  119. package/dist/token-goat-chunk-TWUKBOMP.mjs +72 -0
  120. package/dist/{token-goat-chunk-3CHUNJ2O.mjs → token-goat-chunk-U2KSB4SG.mjs} +8 -5
  121. package/dist/{token-goat-chunk-3Z5S4KGM.mjs → token-goat-chunk-U4WHMG6Y.mjs} +29 -49
  122. package/dist/{token-goat-chunk-PY533T7F.mjs → token-goat-chunk-UGJHGR5A.mjs} +21 -15
  123. package/dist/{token-goat-chunk-CYCEYAEO.mjs → token-goat-chunk-UOUDVA5U.mjs} +1 -1
  124. package/dist/{token-goat-chunk-JDHE26RP.mjs → token-goat-chunk-URRJ33GR.mjs} +16 -5
  125. package/dist/{token-goat-chunk-56EIMS3E.mjs → token-goat-chunk-UZOROKIS.mjs} +23 -17
  126. package/dist/{token-goat-chunk-CZ3LUXYZ.mjs → token-goat-chunk-VIHGGGEI.mjs} +427 -308
  127. package/dist/token-goat-chunk-VTJLAA7P.mjs +21 -0
  128. package/dist/token-goat-chunk-VWDXLT4F.mjs +678 -0
  129. package/dist/{token-goat-chunk-YARZFCZS.mjs → token-goat-chunk-VWZA2H4P.mjs} +62 -53
  130. package/dist/{token-goat-chunk-SQSSNQPE.mjs → token-goat-chunk-VXEXMJDL.mjs} +3979 -4745
  131. package/dist/token-goat-chunk-WBA5SKT4.mjs +547 -0
  132. package/dist/{token-goat-chunk-SJHWVNDQ.mjs → token-goat-chunk-WDH44VAU.mjs} +7 -4
  133. package/dist/token-goat-chunk-X2SUP3EI.mjs +107 -0
  134. package/dist/token-goat-chunk-X3BELZSJ.mjs +125 -0
  135. package/dist/{token-goat-chunk-FZ3NEW5O.mjs → token-goat-chunk-XLRBNZCC.mjs} +13 -8
  136. package/dist/{token-goat-chunk-Z44YO3QZ.mjs → token-goat-chunk-XRKUX6CM.mjs} +1 -1
  137. package/dist/token-goat-chunk-XX6O25RN.mjs +82 -0
  138. package/dist/token-goat-chunk-XZSUHBVS.mjs +65 -0
  139. package/dist/{token-goat-chunk-WY3L4DVT.mjs → token-goat-chunk-Y2ZTQOCL.mjs} +13 -8
  140. package/dist/{token-goat-chunk-UQ5UK2T7.mjs → token-goat-chunk-YB4VMGK2.mjs} +1 -1
  141. package/dist/token-goat-chunk-YBIIY3HR.mjs +51 -0
  142. package/dist/{token-goat-chunk-ZQSJMO2R.mjs → token-goat-chunk-YHVDKQBR.mjs} +105 -105
  143. package/dist/{token-goat-chunk-H2K3QP6H.mjs → token-goat-chunk-YJB5XLWI.mjs} +8 -6
  144. package/dist/{token-goat-chunk-ZCDTCVIS.mjs → token-goat-chunk-YKB6AQG3.mjs} +5 -2
  145. package/dist/token-goat-chunk-YMTG2YA5.mjs +35 -0
  146. package/dist/token-goat-chunk-YPBZYQRV.mjs +40 -0
  147. package/dist/{token-goat-chunk-HOJLCGDP.mjs → token-goat-chunk-YY6AVUFL.mjs} +2033 -2251
  148. package/dist/token-goat-chunk-Z7N5OMMP.mjs +98 -0
  149. package/dist/token-goat-chunk-ZNMNUPAZ.mjs +938 -0
  150. package/dist/token-goat-hook-client.cjs +1 -1
  151. package/dist/token-goat-hook-client.mjs +3 -3
  152. package/dist/token-goat-hook.mjs +67 -38
  153. package/dist/token-goat.core.mjs +4 -4
  154. package/docs/C4_RUNTIME_ARCHITECTURE.md +1 -1
  155. package/docs/cli.md +40 -21
  156. package/docs/install.md +19 -9
  157. package/docs/security.md +5 -3
  158. package/package.json +2 -1
  159. package/dist/token-goat-chunk-5KDMCMF2.mjs +0 -362
  160. package/dist/token-goat-chunk-6QMAS7AB.mjs +0 -42
  161. package/dist/token-goat-chunk-7F2UBPD3.mjs +0 -397
  162. package/dist/token-goat-chunk-ARDNEC2U.mjs +0 -248
  163. package/dist/token-goat-chunk-ATCPY7EQ.mjs +0 -134
  164. package/dist/token-goat-chunk-EFHMMIGP.mjs +0 -68
  165. package/dist/token-goat-chunk-IVALLT3S.mjs +0 -48
  166. package/dist/token-goat-chunk-JDU3EXSU.mjs +0 -65
  167. package/dist/token-goat-chunk-MKPF4CL5.mjs +0 -37
  168. package/dist/token-goat-chunk-RC35RBUL.mjs +0 -312
  169. package/dist/token-goat-chunk-USILZ3T3.mjs +0 -53
  170. package/dist/token-goat-chunk-VL3YIFHZ.mjs +0 -2975
  171. package/dist/token-goat-chunk-XU4P6Z24.mjs +0 -133
  172. package/dist/token-goat-chunk-Y776AENC.mjs +0 -1597
@@ -0,0 +1,434 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ AGENT_SALT_MARKER,
5
+ readSessionStateFile,
6
+ sessionFileStem
7
+ } from "./token-goat-chunk-WBA5SKT4.mjs";
8
+ import {
9
+ readTranscriptTail
10
+ } from "./token-goat-chunk-WDH44VAU.mjs";
11
+ import {
12
+ isAutoTriggerMultiplierExplicit,
13
+ loadConfig
14
+ } from "./token-goat-chunk-7EZTZOMC.mjs";
15
+ import {
16
+ detectHarness
17
+ } from "./token-goat-chunk-QYHO5CPH.mjs";
18
+ import {
19
+ atomicWriteText,
20
+ ensureDirSync,
21
+ normalizePathForwardSlash
22
+ } from "./token-goat-chunk-HU4TORC5.mjs";
23
+ import {
24
+ dataDir,
25
+ tokenGoatHome
26
+ } from "./token-goat-chunk-CO3UYX6G.mjs";
27
+ import {
28
+ init_define_import_meta_env
29
+ } from "./token-goat-chunk-A37V4PBF.mjs";
30
+
31
+ // src/compact.ts
32
+ init_define_import_meta_env();
33
+ import * as fs from "node:fs";
34
+ import * as path from "node:path";
35
+ var CONTEXT_AUTOCOMPACT_TOKENS = 66e4;
36
+ var CATALOG_TOKENS = 10800;
37
+ var CONTEXT_TIER_WARM = 0.5;
38
+ var CONTEXT_TIER_HOT = 0.7;
39
+ var CONTEXT_TIER_CRITICAL = 0.85;
40
+ var NOISE_EXTS = /* @__PURE__ */ new Set([
41
+ ".pyc",
42
+ ".pyo",
43
+ ".pyd",
44
+ ".class",
45
+ ".o",
46
+ ".obj",
47
+ ".a",
48
+ ".lib",
49
+ ".dll",
50
+ ".so",
51
+ ".dylib",
52
+ ".log",
53
+ ".jsonl",
54
+ ".tmp",
55
+ ".temp",
56
+ ".swp",
57
+ ".swo",
58
+ ".bak",
59
+ ".pid",
60
+ ".lock",
61
+ ".map",
62
+ ".wasm",
63
+ ".gz",
64
+ ".zip",
65
+ ".tar",
66
+ ".tgz",
67
+ ".db",
68
+ ".sqlite",
69
+ ".sqlite3",
70
+ ".db3",
71
+ ".d.ts",
72
+ ".snap",
73
+ ".eot",
74
+ ".ttf",
75
+ ".woff",
76
+ ".woff2",
77
+ ".ico",
78
+ ".pdb",
79
+ ".exe",
80
+ ".bin"
81
+ ]);
82
+ var NOISE_BASENAMES = /* @__PURE__ */ new Set([
83
+ ".ds_store",
84
+ "thumbs.db",
85
+ "desktop.ini",
86
+ "package-lock.json",
87
+ "yarn.lock",
88
+ "pnpm-lock.yaml",
89
+ "poetry.lock",
90
+ "uv.lock",
91
+ "pdm.lock",
92
+ "cargo.lock",
93
+ "composer.lock",
94
+ "gemfile.lock",
95
+ "coverage.xml",
96
+ ".coverage",
97
+ "lcov.info"
98
+ ]);
99
+ var NOISE_SEGMENTS = [
100
+ "/__pycache__/",
101
+ "/.git/",
102
+ "/node_modules/",
103
+ "/.venv/",
104
+ "/venv/",
105
+ "/dist/",
106
+ "/build/",
107
+ "/.mypy_cache/",
108
+ "/.pytest_cache/",
109
+ "/.ruff_cache/",
110
+ "/appdata/local/temp/",
111
+ "/appdata/roaming/",
112
+ "/tmp/",
113
+ "/.next/",
114
+ "/.nuxt/",
115
+ "/.svelte-kit/",
116
+ "/.turbo/",
117
+ "/.parcel-cache/",
118
+ "/.cache/",
119
+ "/.tox/",
120
+ "/coverage/",
121
+ "/.nyc_output/",
122
+ "/site-packages/",
123
+ ".egg-info/",
124
+ "/target/",
125
+ "/__snapshots__/"
126
+ ];
127
+ var HARNESS_MULTIPLIER_DEFAULTS = {
128
+ claudecode: 2,
129
+ codex: 1.5,
130
+ opencode: 2.5,
131
+ gemini: 3,
132
+ openclaw: 1,
133
+ pi: 1,
134
+ hermes: 1,
135
+ generic: 1
136
+ };
137
+ function tierForFraction(fill) {
138
+ if (fill >= CONTEXT_TIER_CRITICAL) return "critical";
139
+ if (fill >= CONTEXT_TIER_HOT) return "hot";
140
+ if (fill >= CONTEXT_TIER_WARM) return "warm";
141
+ return "cool";
142
+ }
143
+ function pressureRawTotal(cache) {
144
+ const skillTokens = cache.loadedSkillTotalTokens ?? 0;
145
+ const bashCount = (cache.bashOutputs ?? []).length;
146
+ const webCount = (cache.webFetches ?? []).length;
147
+ const files = cache.files ?? [];
148
+ const readCount = files.length;
149
+ return skillTokens + CATALOG_TOKENS + bashCount * 500 + webCount * 1e3 + readCount * 200;
150
+ }
151
+ var PROMPT_MEASURE_TAIL_BYTES = 1048576;
152
+ function extractUsageTotal(record) {
153
+ if (record === null || typeof record !== "object") return null;
154
+ if (record["type"] !== "assistant") return null;
155
+ const message = record["message"];
156
+ if (message === null || typeof message !== "object") return null;
157
+ const usage = message["usage"];
158
+ if (usage === null || typeof usage !== "object") return null;
159
+ const u = usage;
160
+ const input = u["input_tokens"];
161
+ const cacheCreation = u["cache_creation_input_tokens"];
162
+ const cacheRead = u["cache_read_input_tokens"];
163
+ const output = u["output_tokens"];
164
+ if (typeof input !== "number" || typeof cacheCreation !== "number" || typeof cacheRead !== "number" || typeof output !== "number") {
165
+ return null;
166
+ }
167
+ return input + cacheCreation + cacheRead + output;
168
+ }
169
+ function measurePromptTokens(transcriptPath) {
170
+ try {
171
+ const lines = readTranscriptTail(transcriptPath, PROMPT_MEASURE_TAIL_BYTES);
172
+ for (let i = lines.length - 1; i >= 0; i--) {
173
+ const line = lines[i];
174
+ if (line === void 0) continue;
175
+ const trimmed = line.trim();
176
+ if (trimmed === "") continue;
177
+ let parsed;
178
+ try {
179
+ parsed = JSON.parse(trimmed);
180
+ } catch {
181
+ continue;
182
+ }
183
+ const total = extractUsageTotal(parsed);
184
+ if (total !== null) return total;
185
+ }
186
+ return null;
187
+ } catch {
188
+ return null;
189
+ }
190
+ }
191
+ function getEffectiveAutoTriggerWindow() {
192
+ const ca = loadConfig().compact_assist;
193
+ const isConfigDefault = !isAutoTriggerMultiplierExplicit();
194
+ const multiplier = getAutoTriggerMultiplier(
195
+ ca.harness === "auto" ? { configExplicitMultiplier: ca.auto_trigger_multiplier, isConfigDefault } : { configExplicitMultiplier: ca.auto_trigger_multiplier, harness: ca.harness, isConfigDefault }
196
+ );
197
+ return CONTEXT_AUTOCOMPACT_TOKENS * multiplier;
198
+ }
199
+ function getContextPressure(cache, transcriptPath) {
200
+ try {
201
+ const window = getEffectiveAutoTriggerWindow();
202
+ if (transcriptPath) {
203
+ const measured = measurePromptTokens(transcriptPath);
204
+ if (measured !== null) {
205
+ const fill2 = measured / window;
206
+ return { fillFraction: fill2, tier: tierForFraction(fill2) };
207
+ }
208
+ }
209
+ if (!cache) {
210
+ return { fillFraction: 0, tier: "cool" };
211
+ }
212
+ const total = pressureRawTotal(cache);
213
+ const fill = total / window;
214
+ return {
215
+ fillFraction: fill,
216
+ tier: tierForFraction(fill)
217
+ };
218
+ } catch {
219
+ return { fillFraction: 0, tier: "cool" };
220
+ }
221
+ }
222
+ function getAutoTriggerMultiplier(opts) {
223
+ const config = opts?.configExplicitMultiplier ?? 2;
224
+ let isDefault = opts?.isConfigDefault;
225
+ if (isDefault === void 0) {
226
+ isDefault = config === 2;
227
+ }
228
+ if (!isDefault && opts?.configExplicitMultiplier !== void 0) {
229
+ return Math.max(1, Math.min(10, opts.configExplicitMultiplier));
230
+ }
231
+ const harness = opts?.harness ?? detectHarness();
232
+ return Math.max(1, Math.min(10, HARNESS_MULTIPLIER_DEFAULTS[harness] ?? 1));
233
+ }
234
+ function isNoisePath(inputPath) {
235
+ if (!inputPath) {
236
+ return false;
237
+ }
238
+ const p = normalizePathForwardSlash(inputPath, true);
239
+ for (const segment of NOISE_SEGMENTS) {
240
+ if (p.includes(segment)) {
241
+ return true;
242
+ }
243
+ }
244
+ const slashIdx = p.lastIndexOf("/");
245
+ const basename = slashIdx >= 0 ? p.slice(slashIdx + 1) : p;
246
+ if (NOISE_BASENAMES.has(basename)) {
247
+ return true;
248
+ }
249
+ if (basename.startsWith(".improve-state-") || basename.startsWith("improve_commit_msg_")) {
250
+ return true;
251
+ }
252
+ const dotIdx = basename.lastIndexOf(".");
253
+ if (dotIdx >= 0) {
254
+ const ext = basename.slice(dotIdx);
255
+ if (NOISE_EXTS.has(ext)) {
256
+ return true;
257
+ }
258
+ }
259
+ for (const ext of NOISE_EXTS) {
260
+ if (ext.includes(".") && ext.split(".").length > 2) {
261
+ if (basename.endsWith(ext)) {
262
+ return true;
263
+ }
264
+ }
265
+ }
266
+ return false;
267
+ }
268
+ function findLatestSessionId() {
269
+ try {
270
+ const sessionsDir = path.join(tokenGoatHome(), "sessions");
271
+ if (!fs.existsSync(sessionsDir)) {
272
+ return null;
273
+ }
274
+ const files = fs.readdirSync(sessionsDir);
275
+ const jsonFiles = files.filter((f) => f.endsWith(".json") && !f.includes(AGENT_SALT_MARKER));
276
+ if (jsonFiles.length === 0) {
277
+ return null;
278
+ }
279
+ const firstFile = jsonFiles[0];
280
+ if (!firstFile) {
281
+ return null;
282
+ }
283
+ let latestFile = firstFile;
284
+ let latestMtime = fs.statSync(path.join(sessionsDir, firstFile)).mtimeMs;
285
+ for (const file of jsonFiles) {
286
+ const mtime = fs.statSync(path.join(sessionsDir, file)).mtimeMs;
287
+ if (mtime > latestMtime) {
288
+ latestFile = file;
289
+ latestMtime = mtime;
290
+ }
291
+ }
292
+ return latestFile.replace(/\.json$/, "");
293
+ } catch {
294
+ return null;
295
+ }
296
+ }
297
+ function eventCount(cache) {
298
+ const files = cache.files ?? [];
299
+ const editedCount = files.filter((f) => f.wasEdited).length;
300
+ const bashCount = (cache.bashOutputs ?? []).length;
301
+ const webCount = (cache.webFetches ?? []).length;
302
+ const skillHistory = cache.skillHistory ?? {};
303
+ return files.length + editedCount + bashCount + webCount + Object.keys(skillHistory).length;
304
+ }
305
+ function writeSessionManifest(projectHash, sessionId, manifestJson) {
306
+ const safeSessionId = sessionFileStem(sessionId);
307
+ if (!safeSessionId) return;
308
+ const sessionsDir = path.join(dataDir(), "projects", projectHash, "sessions");
309
+ if (!fs.existsSync(sessionsDir)) {
310
+ ensureDirSync(sessionsDir);
311
+ }
312
+ const dest = path.join(sessionsDir, `${safeSessionId}.json`);
313
+ atomicWriteText(dest, JSON.stringify(manifestJson));
314
+ }
315
+ function readAllSessionManifests(projectHash, maxAgeSecs = 3600) {
316
+ const sessionsDir = path.join(dataDir(), "projects", projectHash, "sessions");
317
+ if (!fs.existsSync(sessionsDir)) {
318
+ return [];
319
+ }
320
+ const now = Date.now() / 1e3;
321
+ const results = [];
322
+ try {
323
+ const files = fs.readdirSync(sessionsDir);
324
+ for (const file of files) {
325
+ if (!file.endsWith(".json")) {
326
+ continue;
327
+ }
328
+ try {
329
+ const fullPath = path.join(sessionsDir, file);
330
+ const stat = fs.statSync(fullPath);
331
+ if (now - stat.mtimeMs / 1e3 > maxAgeSecs) {
332
+ try {
333
+ fs.unlinkSync(fullPath);
334
+ } catch {
335
+ }
336
+ continue;
337
+ }
338
+ const text = fs.readFileSync(fullPath, "utf8");
339
+ const data = JSON.parse(text);
340
+ if (typeof data === "object" && data !== null && "files" in data) {
341
+ results.push(data);
342
+ }
343
+ } catch {
344
+ }
345
+ }
346
+ } catch {
347
+ }
348
+ return results;
349
+ }
350
+ function _editedFileCount(cache) {
351
+ return (cache.files ?? []).filter((f) => f.wasEdited).length;
352
+ }
353
+ function _computeActivityMultiplier(ageSecs, editedCount) {
354
+ const TEN_MIN_SECS = 600;
355
+ const SIXTY_MIN_SECS = 3600;
356
+ const EDITS_PER_MIN_DENSITY_THRESHOLD = 0.3;
357
+ let tier;
358
+ if (ageSecs < TEN_MIN_SECS) {
359
+ tier = "young";
360
+ } else if (ageSecs < SIXTY_MIN_SECS) {
361
+ tier = "active";
362
+ } else {
363
+ tier = "mature";
364
+ }
365
+ const baseFactor = {
366
+ young: 0.6,
367
+ active: 1,
368
+ mature: 1.4
369
+ };
370
+ let factor = baseFactor[tier];
371
+ if (ageSecs >= TEN_MIN_SECS) {
372
+ const editsPerMin = ageSecs > 0 ? editedCount / (ageSecs / 60) : 0;
373
+ if (editsPerMin < EDITS_PER_MIN_DENSITY_THRESHOLD) {
374
+ factor = Math.min(factor, 1);
375
+ }
376
+ }
377
+ return factor;
378
+ }
379
+ function loadSessionCache(sessionId) {
380
+ const disk = readSessionStateFile(sessionId);
381
+ if (!disk) {
382
+ return null;
383
+ }
384
+ return {
385
+ files: disk.files,
386
+ webFetches: disk.webFetches,
387
+ bashOutputs: disk.bashOutputs,
388
+ ...disk.created_ts !== void 0 ? { created_ts: disk.created_ts } : {}
389
+ };
390
+ }
391
+ function computeAdaptiveBudget(cache, ageSecs = 0, opts) {
392
+ const base = 200;
393
+ const maxTotal = 800;
394
+ const minTotal = 200;
395
+ const editedCount = _editedFileCount(cache);
396
+ const editedBonus = Math.min(200, editedCount * 50);
397
+ const files = cache.files ?? [];
398
+ const symbolFiles = files.filter((f) => {
399
+ const entry = f;
400
+ return (entry["symbols_read"] ?? []).length > 0;
401
+ }).length;
402
+ const symbolsBonus = Math.min(150, symbolFiles * 30);
403
+ const bashCount = (cache.bashOutputs ?? []).length;
404
+ const bashBonus = bashCount > 0 ? Math.min(100, Math.max(20, bashCount * 5)) : 0;
405
+ const webBonus = (cache.webFetches ?? []).length > 0 ? 15 : 0;
406
+ const diffBonus = opts?.hasPendingDiff ? 50 : 0;
407
+ const uncommittedBonus = opts?.hasUncommittedChanges ? 10 : 0;
408
+ const staleFrac = Math.max(0, Math.min(1, opts?.staleCompactFraction ?? 0));
409
+ const staleBonus = Math.min(60, Math.round(staleFrac * 60));
410
+ const rawTotal = base + editedBonus + symbolsBonus + bashBonus + webBonus + diffBonus + uncommittedBonus + staleBonus;
411
+ const factor = _computeActivityMultiplier(ageSecs, editedCount);
412
+ const total = Math.round(rawTotal * factor);
413
+ let capMax = maxTotal;
414
+ if (opts?.contextPressure) {
415
+ if (opts.contextPressure.tier === "critical") {
416
+ capMax = Math.min(capMax, 300);
417
+ } else if (opts.contextPressure.tier === "hot") {
418
+ capMax = Math.min(capMax, 500);
419
+ }
420
+ }
421
+ return Math.max(minTotal, Math.min(capMax, total));
422
+ }
423
+
424
+ export {
425
+ CONTEXT_AUTOCOMPACT_TOKENS,
426
+ getContextPressure,
427
+ isNoisePath,
428
+ findLatestSessionId,
429
+ eventCount,
430
+ writeSessionManifest,
431
+ readAllSessionManifests,
432
+ loadSessionCache,
433
+ computeAdaptiveBudget
434
+ };
@@ -0,0 +1,174 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ embedTexts,
5
+ isAvailable
6
+ } from "./token-goat-chunk-NISNMD7T.mjs";
7
+ import {
8
+ redactIfDotenv
9
+ } from "./token-goat-chunk-GVB2MUST.mjs";
10
+ import {
11
+ redactSecrets
12
+ } from "./token-goat-chunk-T5P5ACNQ.mjs";
13
+ import {
14
+ decodeSource,
15
+ ensureDirSync,
16
+ statSize
17
+ } from "./token-goat-chunk-HU4TORC5.mjs";
18
+ import {
19
+ displaySafePath,
20
+ hostPathOfIndexKey,
21
+ normalizePath
22
+ } from "./token-goat-chunk-FNFBKLRD.mjs";
23
+ import {
24
+ dataDir
25
+ } from "./token-goat-chunk-CO3UYX6G.mjs";
26
+ import {
27
+ init_define_import_meta_env
28
+ } from "./token-goat-chunk-A37V4PBF.mjs";
29
+
30
+ // src/evidence_cache.ts
31
+ init_define_import_meta_env();
32
+ import crypto from "node:crypto";
33
+ import fs from "node:fs";
34
+ import path from "node:path";
35
+ var MAX_ENTRIES = 500;
36
+ var MAX_TEXT_BYTES = 128 * 1024;
37
+ var MAX_FILE_BYTES = 4 * MAX_TEXT_BYTES + 7;
38
+ var CACHE_FILE = "workspace-evidence.json";
39
+ function cachePath() {
40
+ return path.join(dataDir(), CACHE_FILE);
41
+ }
42
+ function hash(text) {
43
+ return crypto.createHash("sha256").update(text).digest("hex");
44
+ }
45
+ function load() {
46
+ try {
47
+ const parsed = JSON.parse(fs.readFileSync(cachePath(), "utf8"));
48
+ if (!Array.isArray(parsed)) return [];
49
+ return parsed.filter(
50
+ (entry) => typeof entry === "object" && entry !== null && typeof entry.id === "string" && typeof entry.projectRoot === "string" && typeof entry.source === "string" && (entry.representation === "file" || entry.representation === "tool-output") && typeof entry.contentHash === "string" && typeof entry.text === "string" && typeof entry.createdAt === "number" && (entry.embedding === void 0 || typeof entry.embedding === "string")
51
+ );
52
+ } catch {
53
+ return [];
54
+ }
55
+ }
56
+ function save(entries) {
57
+ try {
58
+ ensureDirSync(dataDir());
59
+ fs.writeFileSync(cachePath(), JSON.stringify(entries.slice(0, MAX_ENTRIES)), "utf8");
60
+ } catch {
61
+ }
62
+ }
63
+ function readEvidenceFileText(filePath) {
64
+ const onDisk = hostPathOfIndexKey(filePath);
65
+ const size = statSize(onDisk);
66
+ if (size === null || size > MAX_FILE_BYTES) return null;
67
+ const text = decodeSource(fs.readFileSync(onDisk));
68
+ return Buffer.byteLength(text, "utf8") > MAX_TEXT_BYTES ? null : text;
69
+ }
70
+ function recordEvidence(input) {
71
+ if (Buffer.byteLength(input.text, "utf8") > MAX_TEXT_BYTES) return null;
72
+ const contentHash = hash(input.text);
73
+ const text = redactSecrets(redactIfDotenv(input.source, input.text)).text;
74
+ const projectRoot = normalizePath(input.projectRoot);
75
+ const source = input.representation === "file" ? normalizePath(input.source) : input.source;
76
+ const id = hash(`${projectRoot}\0${source}\0${input.representation}\0${contentHash}`).slice(0, 24);
77
+ const entry = {
78
+ id,
79
+ projectRoot,
80
+ source,
81
+ representation: input.representation,
82
+ contentHash,
83
+ text,
84
+ createdAt: Date.now()
85
+ };
86
+ const entries = load().filter(
87
+ (candidate) => candidate.projectRoot !== projectRoot || candidate.source !== source || candidate.representation !== input.representation
88
+ );
89
+ entries.unshift(entry);
90
+ save(entries);
91
+ return entry;
92
+ }
93
+ function findVerifiedFileEvidence(projectRoot, source, currentText) {
94
+ const normalizedRoot = normalizePath(projectRoot);
95
+ const normalizedSource = normalizePath(source);
96
+ const currentHash = hash(currentText);
97
+ return load().find(
98
+ (entry) => entry.projectRoot === normalizedRoot && entry.source === normalizedSource && entry.representation === "file" && entry.contentHash === currentHash
99
+ ) ?? null;
100
+ }
101
+ function decodeEmbedding(encoded) {
102
+ if (encoded === void 0) return null;
103
+ try {
104
+ const bytes = Buffer.from(encoded, "base64");
105
+ if (bytes.length === 0 || bytes.length % Float32Array.BYTES_PER_ELEMENT !== 0) return null;
106
+ return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.length / Float32Array.BYTES_PER_ELEMENT);
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
111
+ function encodeEmbedding(vector) {
112
+ const values = Float32Array.from(vector);
113
+ return Buffer.from(values.buffer, values.byteOffset, values.byteLength).toString("base64");
114
+ }
115
+ function cosineSimilarity(left, right) {
116
+ if (left.length !== right.length) return Number.NEGATIVE_INFINITY;
117
+ let dot = 0;
118
+ let leftMagnitude = 0;
119
+ let rightMagnitude = 0;
120
+ for (let index = 0; index < left.length; index += 1) {
121
+ const a = left[index] ?? 0;
122
+ const b = right[index] ?? 0;
123
+ dot += a * b;
124
+ leftMagnitude += a * a;
125
+ rightMagnitude += b * b;
126
+ }
127
+ return leftMagnitude === 0 || rightMagnitude === 0 ? Number.NEGATIVE_INFINITY : dot / Math.sqrt(leftMagnitude * rightMagnitude);
128
+ }
129
+ async function searchEvidenceSemantically(projectRoot, query, limit = 10) {
130
+ if (query.trim() === "" || !isAvailable()) return [];
131
+ const root = normalizePath(projectRoot);
132
+ const entries = load().filter((entry) => entry.projectRoot === root);
133
+ if (entries.length === 0) return [];
134
+ try {
135
+ const missing = entries.filter((entry) => decodeEmbedding(entry.embedding) === null);
136
+ const vectors = await embedTexts([query, ...missing.map((entry) => entry.text)]);
137
+ const queryVector = vectors[0];
138
+ if (queryVector === void 0) return [];
139
+ for (let index = 0; index < missing.length; index += 1) {
140
+ const vector = vectors[index + 1];
141
+ if (vector !== void 0) missing[index].embedding = encodeEmbedding(vector);
142
+ }
143
+ if (missing.length > 0) {
144
+ const updated = new Map(entries.map((entry) => [entry.id, entry]));
145
+ save(load().map((entry) => updated.get(entry.id) ?? entry));
146
+ }
147
+ const queryValues = Float32Array.from(queryVector);
148
+ return entries.map((entry) => ({ entry, score: cosineSimilarity(queryValues, decodeEmbedding(entry.embedding) ?? new Float32Array()) })).filter(({ score }) => Number.isFinite(score)).sort((left, right) => right.score - left.score || right.entry.createdAt - left.entry.createdAt).slice(0, limit).map(({ entry }) => entry);
149
+ } catch {
150
+ return [];
151
+ }
152
+ }
153
+ function buildDeltaCapsule(projectRoot, limit = 8) {
154
+ const root = normalizePath(projectRoot);
155
+ const changed = load().filter((entry) => entry.projectRoot === root && entry.representation === "file").filter((entry) => {
156
+ try {
157
+ const current = readEvidenceFileText(entry.source);
158
+ return current === null || hash(current) !== entry.contentHash;
159
+ } catch {
160
+ return true;
161
+ }
162
+ }).slice(0, limit);
163
+ if (changed.length === 0) return null;
164
+ return `Cross-session evidence changed since it was cached:
165
+ ${changed.map((entry) => `- ${displaySafePath(entry.source)} (use a fresh surgical read)`).join("\n")}`;
166
+ }
167
+
168
+ export {
169
+ readEvidenceFileText,
170
+ recordEvidence,
171
+ findVerifiedFileEvidence,
172
+ searchEvidenceSemantically,
173
+ buildDeltaCapsule
174
+ };
@@ -1,43 +1,65 @@
1
1
  import { createRequire as __cjsRequire } from 'node:module';
2
2
  const require = __cjsRequire(import.meta.url);
3
3
  import {
4
+ WORKER_STARTUP_GRACE_MS,
4
5
  WorkerAlreadyRunningError,
5
6
  WorkerDataDirUnwritableError,
6
7
  appendWorkerErrorLog,
8
+ claimCurrentWorker,
7
9
  claimWorkerPidFile,
8
10
  currentDaemonStamp,
11
+ daemonEntryScript,
9
12
  dataDirWriteRefusal,
13
+ displacedWorkerPath,
10
14
  drainHeartbeatPathFor,
11
15
  ensureWorkerAlive,
12
16
  isWorkerRunning,
13
17
  oneLogLine,
18
+ pidAlive,
19
+ readDisplacedPids,
14
20
  readPidFile,
15
21
  resolvePollIntervalMs,
22
+ retireDisplacedWorker,
16
23
  startDetachedWorker,
17
24
  stopWorker,
18
25
  workerErrorLogPath,
19
26
  workerPidPath,
20
27
  workerStampPath,
21
28
  writeDrainHeartbeat
22
- } from "./token-goat-chunk-5KDMCMF2.mjs";
23
- import "./token-goat-chunk-GOLEOXZP.mjs";
29
+ } from "./token-goat-chunk-F6PAUIEK.mjs";
30
+ import "./token-goat-chunk-65N4RHP4.mjs";
31
+ import "./token-goat-chunk-X2SUP3EI.mjs";
32
+ import "./token-goat-chunk-7EZTZOMC.mjs";
33
+ import "./token-goat-chunk-QYHO5CPH.mjs";
34
+ import "./token-goat-chunk-4GBVPH3D.mjs";
35
+ import "./token-goat-chunk-YZAAZU2S.mjs";
36
+ import "./token-goat-chunk-IVE6U7KV.mjs";
37
+ import "./token-goat-chunk-HU4TORC5.mjs";
38
+ import "./token-goat-chunk-GGGG7RWB.mjs";
24
39
  import "./token-goat-chunk-AM5V6GSX.mjs";
25
40
  import "./token-goat-chunk-FNFBKLRD.mjs";
26
- import "./token-goat-chunk-VES7EL7O.mjs";
41
+ import "./token-goat-chunk-CO3UYX6G.mjs";
27
42
  import "./token-goat-chunk-A37V4PBF.mjs";
28
43
  export {
44
+ WORKER_STARTUP_GRACE_MS,
29
45
  WorkerAlreadyRunningError,
30
46
  WorkerDataDirUnwritableError,
31
47
  appendWorkerErrorLog,
48
+ claimCurrentWorker,
32
49
  claimWorkerPidFile,
33
50
  currentDaemonStamp,
51
+ daemonEntryScript,
34
52
  dataDirWriteRefusal,
53
+ displacedWorkerPath,
35
54
  drainHeartbeatPathFor,
36
55
  ensureWorkerAlive,
37
56
  isWorkerRunning,
38
57
  oneLogLine,
58
+ pidAlive,
59
+ readDisplacedPids,
39
60
  readPidFile,
40
61
  resolvePollIntervalMs,
62
+ retireDisplacedWorker,
41
63
  startDetachedWorker,
42
64
  stopWorker,
43
65
  workerErrorLogPath,