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,98 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ BASH_OUTPUT_SUBDIR,
5
+ getBashOutput
6
+ } from "./token-goat-chunk-KQBLRPBN.mjs";
7
+ import {
8
+ indexRecallEntry,
9
+ storeBlob
10
+ } from "./token-goat-chunk-4ZBFWLXF.mjs";
11
+ import {
12
+ redactSecrets,
13
+ redactSerializedJson
14
+ } from "./token-goat-chunk-T5P5ACNQ.mjs";
15
+ import {
16
+ shortFingerprint
17
+ } from "./token-goat-chunk-4GBVPH3D.mjs";
18
+ import {
19
+ init_define_import_meta_env
20
+ } from "./token-goat-chunk-A37V4PBF.mjs";
21
+
22
+ // src/mcp_cache.ts
23
+ init_define_import_meta_env();
24
+ var MCP_MAX_CACHE_BYTES = 2 * 1024 * 1024;
25
+ var READ_VERBS_RE = /(?:^|_)(?:get|list|search|read|view|fetch|describe|export|download|find|show|query|resolve|context)(?=_|$)/i;
26
+ var MUTATING_VERBS_RE = /^(?:request|run)(?=_|$)|(?:^|_)(?:create|update|delete|send|write|push|post|remove|label|unlabel|merge|modify|draft|fork|reply|move|rename|set|add|execute|close|copy|upload|insert|revoke|reset|archive|restore|annotate|register|unregister|star|unstar|like|unlike|vote|block|unblock|invite|kick|ban|click|fill|press|type|navigate|evaluate|drag|hover|handle|snapshot|wait|emulate|new|select|resize|audit|apply|commit|grant|deploy|toggle|pin|trigger|finalize|approve|cancel|sync)(?=_|$)/i;
27
+ var STATE_CHANGING_INPUT_KEYS = ["createIfEmpty", "clear", "save_to_disk"];
28
+ function isMcpReadOnly(toolName, toolInput) {
29
+ if (!toolName.startsWith("mcp__")) {
30
+ return false;
31
+ }
32
+ const method = toolName.split("__").pop() || "";
33
+ if (/screenshot/i.test(method)) return false;
34
+ if (READ_VERBS_RE.test(method) && !MUTATING_VERBS_RE.test(method)) {
35
+ return !STATE_CHANGING_INPUT_KEYS.some((key) => toolInput[key]);
36
+ }
37
+ return false;
38
+ }
39
+ function mcpHash(toolName, toolInput) {
40
+ const sortedInput = {};
41
+ for (const key of Object.keys(toolInput).sort()) {
42
+ sortedInput[key] = toolInput[key];
43
+ }
44
+ const canonical = JSON.stringify({ tool: toolName, input: sortedInput });
45
+ return shortFingerprint(canonical);
46
+ }
47
+ function mcpOutputId(sessionId, hash) {
48
+ return `mcp_${shortFingerprint(`${sessionId}\0${hash}`)}`;
49
+ }
50
+ function mcpInputPreview(toolInput) {
51
+ try {
52
+ return redactSerializedJson(JSON.stringify(toolInput)).text.slice(0, 120);
53
+ } catch {
54
+ return "";
55
+ }
56
+ }
57
+ function storeMcpOutput(sessionId, toolName, toolInput, resultText) {
58
+ if (!sessionId || !resultText) return null;
59
+ const rawSizeBytes = Buffer.byteLength(resultText, "utf-8");
60
+ if (rawSizeBytes > MCP_MAX_CACHE_BYTES) return null;
61
+ const id = mcpOutputId(sessionId, mcpHash(toolName, toolInput));
62
+ const rawLabel = `mcp:${toolName} ${mcpInputPreview(toolInput)}`.trim();
63
+ const redactedOutput = redactSecrets(resultText).text;
64
+ const label = redactSecrets(rawLabel).text;
65
+ const entry = {
66
+ id,
67
+ command: label,
68
+ output: redactedOutput,
69
+ exitCode: 0,
70
+ storedAt: Date.now(),
71
+ // Sized off the redacted output, not the raw pre-redaction resultText (rawSizeBytes is only the cache-eligibility gate above) -- mirrors bash_output_cache.ts's storeBashOutput, whose sizeBytes is likewise computed from redactedOutput. Sizing off the raw text here left mcp-audit's per-call token estimate and `mcp-history`'s byte column reporting a stale byte count for any entry a secret was actually stripped from, out of sync with the stored/served (redacted, shorter) output.
72
+ sizeBytes: Buffer.byteLength(redactedOutput, "utf-8")
73
+ };
74
+ if (!storeBlob(BASH_OUTPUT_SUBDIR, id, entry)) return null;
75
+ indexRecallEntry("mcp", id, label, `${label}
76
+ ${redactedOutput}`, entry.storedAt);
77
+ return id;
78
+ }
79
+ function mcpOutputBytes(id) {
80
+ return getBashOutput(id)?.sizeBytes ?? 0;
81
+ }
82
+ function getMcpOutput(sessionId, toolName, toolInput, ttlMs = Number.POSITIVE_INFINITY) {
83
+ if (!sessionId) return null;
84
+ const id = mcpOutputId(sessionId, mcpHash(toolName, toolInput));
85
+ const entry = getBashOutput(id);
86
+ if (!entry) return null;
87
+ if (Date.now() - entry.storedAt > ttlMs) return null;
88
+ return id;
89
+ }
90
+
91
+ export {
92
+ isMcpReadOnly,
93
+ mcpHash,
94
+ mcpOutputId,
95
+ storeMcpOutput,
96
+ mcpOutputBytes,
97
+ getMcpOutput
98
+ };
@@ -6,7 +6,7 @@ import {
6
6
  quantizeRgbaToIndexed,
7
7
  require_omggif,
8
8
  resizeRgba
9
- } from "./token-goat-chunk-RRNZMM3A.mjs";
9
+ } from "./token-goat-chunk-5Y6ZYL6U.mjs";
10
10
  import {
11
11
  __toESM,
12
12
  init_define_import_meta_env
@@ -0,0 +1,110 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ displaySafeText
5
+ } from "./token-goat-chunk-FNFBKLRD.mjs";
6
+ import {
7
+ init_define_import_meta_env
8
+ } from "./token-goat-chunk-A37V4PBF.mjs";
9
+
10
+ // src/listing_size.ts
11
+ init_define_import_meta_env();
12
+ import * as fs from "node:fs";
13
+ import * as readline from "node:readline";
14
+ function splitListingContent(content) {
15
+ const entries = [];
16
+ let current = null;
17
+ for (const line of content.split("\n")) {
18
+ const m = /^- (.+?): /.exec(line);
19
+ if (m !== null) {
20
+ if (current !== null) entries.push({ name: current.name, bytes: Buffer.byteLength(current.text, "utf8") });
21
+ current = { name: m[1], text: line };
22
+ } else if (current !== null) {
23
+ current.text += "\n" + line;
24
+ }
25
+ }
26
+ if (current !== null) entries.push({ name: current.name, bytes: Buffer.byteLength(current.text, "utf8") });
27
+ return entries;
28
+ }
29
+ function newState() {
30
+ return { current: /* @__PURE__ */ new Map(), injections: 0, injectedBytes: 0 };
31
+ }
32
+ function applyListingAttachment(attachment, skills, agents) {
33
+ const type = attachment["type"];
34
+ const initial = attachment["isInitial"] === true;
35
+ if (type === "skill_listing") {
36
+ const content = typeof attachment["content"] === "string" ? attachment["content"] : "";
37
+ if (initial) skills.current.clear();
38
+ for (const e of splitListingContent(content)) skills.current.set(e.name, e.bytes);
39
+ skills.injections++;
40
+ skills.injectedBytes += Buffer.byteLength(content, "utf8");
41
+ } else if (type === "agent_listing_delta") {
42
+ const lines = Array.isArray(attachment["addedLines"]) ? attachment["addedLines"].filter((l) => typeof l === "string") : [];
43
+ const types = Array.isArray(attachment["addedTypes"]) ? attachment["addedTypes"] : [];
44
+ const removed = Array.isArray(attachment["removedTypes"]) ? attachment["removedTypes"] : [];
45
+ if (initial) agents.current.clear();
46
+ for (const r of removed) if (typeof r === "string") agents.current.delete(r);
47
+ let added = 0;
48
+ lines.forEach((line, i) => {
49
+ const named = types[i];
50
+ const name = typeof named === "string" ? named : /^- (.+?): /.exec(line)?.[1] ?? line.slice(0, 40);
51
+ const bytes = Buffer.byteLength(line, "utf8");
52
+ agents.current.set(name, bytes);
53
+ added += bytes;
54
+ });
55
+ if (lines.length > 0) {
56
+ agents.injections++;
57
+ agents.injectedBytes += added;
58
+ }
59
+ }
60
+ }
61
+ function summarize(state) {
62
+ const entries = [...state.current].map(([name, bytes]) => ({ name, bytes })).sort((a, b) => b.bytes - a.bytes || a.name.localeCompare(b.name));
63
+ return { entries, bytes: entries.reduce((n, e) => n + e.bytes, 0), injections: state.injections, injectedBytes: state.injectedBytes };
64
+ }
65
+ async function measureListings(transcriptPath) {
66
+ const skills = newState();
67
+ const agents = newState();
68
+ const rl = readline.createInterface({ input: fs.createReadStream(transcriptPath, { encoding: "utf8" }), crlfDelay: Infinity });
69
+ for await (const line of rl) {
70
+ if (!line.includes("_listing")) continue;
71
+ let parsed;
72
+ try {
73
+ parsed = JSON.parse(line);
74
+ } catch {
75
+ continue;
76
+ }
77
+ const attachment = parsed?.attachment;
78
+ if (attachment !== null && typeof attachment === "object") applyListingAttachment(attachment, skills, agents);
79
+ }
80
+ return { transcript: transcriptPath, skills: summarize(skills), agents: summarize(agents) };
81
+ }
82
+ function kb(bytes) {
83
+ return `${(bytes / 1024).toFixed(1)} KB`;
84
+ }
85
+ function summaryLine(label, s) {
86
+ if (s.injections === 0) return `${label}: no listing in this transcript`;
87
+ const times = s.injections === 1 ? "once" : `${s.injections} times`;
88
+ return `${label}: ${s.entries.length} listed, ${kb(s.bytes)} (~${Math.floor(s.bytes / 4)} tokens) per listing; sent ${times} in this session, ${kb(s.injectedBytes)} in all`;
89
+ }
90
+ function renderListingReport(report, top) {
91
+ const lines = [`# listing size: ${displaySafeText(report.transcript)}`, summaryLine("Skills", report.skills), summaryLine("Agents", report.agents)];
92
+ for (const [label, s] of [["skill", report.skills], ["agent", report.agents]]) {
93
+ if (s.entries.length === 0 || top === 0) continue;
94
+ lines.push("", `## Largest ${label} descriptions`);
95
+ for (const e of s.entries.slice(0, top)) {
96
+ const share = s.bytes > 0 ? (e.bytes / s.bytes * 100).toFixed(1) : "0.0";
97
+ lines.push(` ${String(e.bytes).padStart(6)} B ${share.padStart(5)}% ${displaySafeText(e.name)}`);
98
+ }
99
+ }
100
+ if (report.skills.injections + report.agents.injections > 0) {
101
+ lines.push("", "Every byte above is paid again each time Claude Code re-sends the listing. Shorten the largest descriptions first, and keep the words that decide when the skill or agent is picked.");
102
+ }
103
+ return lines.join("\n");
104
+ }
105
+ export {
106
+ applyListingAttachment,
107
+ measureListings,
108
+ renderListingReport,
109
+ splitListingContent
110
+ };