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,307 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ formatAge
5
+ } from "./token-goat-chunk-SAMFDIS2.mjs";
6
+ import {
7
+ findProject
8
+ } from "./token-goat-chunk-4GBVPH3D.mjs";
9
+ import {
10
+ LOCK_WAIT_MS_HARDENED,
11
+ atomicWriteText,
12
+ countNoun,
13
+ ensureDirSync,
14
+ withFileLock,
15
+ withRetryOnLock
16
+ } from "./token-goat-chunk-HU4TORC5.mjs";
17
+ import {
18
+ sleepSync
19
+ } from "./token-goat-chunk-AM5V6GSX.mjs";
20
+ import {
21
+ fenceUntrustedFileContent
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/project_memory.ts
31
+ init_define_import_meta_env();
32
+ import * as fs from "node:fs";
33
+ import * as path from "node:path";
34
+ var MAX_ENTRIES = 30;
35
+ var MAX_VALUE_LEN = 300;
36
+ var MAX_TOTAL_CHARS = 4e3;
37
+ var KEY_RE = /^[A-Za-z0-9_-]{1,80}$/;
38
+ var SET_AT_RE = /^#\s*set\s+(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z)$/;
39
+ var ANCHOR_RE = /^#\s*anchor:\s*(\S.*)::([^:@\s]+)@([0-9a-f]{64})$/;
40
+ function anchorLabel(status) {
41
+ if (status === "changed") return " (changed since note)";
42
+ if (status === "gone") return " (anchored symbol gone)";
43
+ return "";
44
+ }
45
+ function anchorLine(anchor) {
46
+ const line = `# anchor: ${anchor.file}::${anchor.symbol}@${anchor.sha}`;
47
+ const back = ANCHOR_RE.exec(line);
48
+ return back !== null && back[1] === anchor.file && back[2] === anchor.symbol ? line : null;
49
+ }
50
+ function noteMap() {
51
+ return /* @__PURE__ */ Object.create(null);
52
+ }
53
+ function ordinal(a, b) {
54
+ return a < b ? -1 : a > b ? 1 : 0;
55
+ }
56
+ function memoryPath(projectHash) {
57
+ return path.join(dataDir(), "projects", `${projectHash}_memory.toml`);
58
+ }
59
+ function validateKey(key) {
60
+ if (!KEY_RE.test(key)) {
61
+ throw new Error(
62
+ `Invalid memory key ${JSON.stringify(key)}: use only letters, digits, hyphens, underscores (max 80 chars)`
63
+ );
64
+ }
65
+ }
66
+ function parseTOML(content, unparsed = [], setAt = /* @__PURE__ */ new Map(), anchors = /* @__PURE__ */ new Map()) {
67
+ const result = noteMap();
68
+ let pendingSetAt;
69
+ let pendingAnchor;
70
+ for (const [i, line] of content.split("\n").entries()) {
71
+ const trimmed = line.trim();
72
+ if (!trimmed) {
73
+ continue;
74
+ }
75
+ if (trimmed.startsWith("#")) {
76
+ const time = SET_AT_RE.exec(trimmed)?.[1];
77
+ if (time !== void 0 && !Number.isNaN(Date.parse(time))) pendingSetAt = time;
78
+ const anchor = ANCHOR_RE.exec(trimmed);
79
+ if (anchor !== null) pendingAnchor = { file: anchor[1], symbol: anchor[2], sha: anchor[3] };
80
+ continue;
81
+ }
82
+ const entrySetAt = pendingSetAt;
83
+ const entryAnchor = pendingAnchor;
84
+ pendingSetAt = void 0;
85
+ pendingAnchor = void 0;
86
+ const match = trimmed.match(/^([A-Za-z0-9_-]+)\s*=\s*"(.*)"\s*$/s);
87
+ if (match) {
88
+ const [, key, value] = match;
89
+ if (key && value !== void 0) {
90
+ const unescaped = value.replace(/\\(u202[89]|[\\nrt"])/g, (_, c) => {
91
+ switch (c) {
92
+ case "u2028":
93
+ return "\u2028";
94
+ case "u2029":
95
+ return "\u2029";
96
+ case "\\":
97
+ return "\\";
98
+ case "n":
99
+ return "\n";
100
+ case "r":
101
+ return "\r";
102
+ case '"':
103
+ return '"';
104
+ default:
105
+ return _;
106
+ }
107
+ });
108
+ result[key] = unescaped;
109
+ if (entrySetAt === void 0) setAt.delete(key);
110
+ else setAt.set(key, entrySetAt);
111
+ if (entryAnchor === void 0) anchors.delete(key);
112
+ else anchors.set(key, entryAnchor);
113
+ }
114
+ } else {
115
+ unparsed.push(i + 1);
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ function loadRaw(filePath, forUpdate = false, setAt, anchors) {
121
+ let content = "";
122
+ try {
123
+ withRetryOnLock(() => {
124
+ content = fs.readFileSync(filePath, "utf-8");
125
+ });
126
+ } catch (err) {
127
+ if (err.code === "ENOENT") return noteMap();
128
+ throw err;
129
+ }
130
+ const unparsed = [];
131
+ const entries = parseTOML(content, unparsed, setAt, anchors);
132
+ if (forUpdate && unparsed.length > 0) {
133
+ const one = unparsed.length === 1;
134
+ throw new Error(`Not updating ${filePath}: ${one ? "line" : "lines"} ${unparsed.join(", ")} ${one ? "is" : "are"} not in the key = "value" form, and saving would drop ${one ? "it" : "them"}. Fix or remove ${one ? "it" : "them"}, then try again.`);
135
+ }
136
+ return entries;
137
+ }
138
+ function save(filePath, entries, setAt = /* @__PURE__ */ new Map(), anchors = /* @__PURE__ */ new Map()) {
139
+ const lines = [];
140
+ const sorted = Object.entries(entries).sort(([a], [b]) => ordinal(a, b));
141
+ for (const [k, v] of sorted) {
142
+ const escaped = v.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\r/g, "\\r").replace(/\n/g, "\\n").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
143
+ const time = setAt.get(k);
144
+ if (time !== void 0) lines.push(`# set ${time}`);
145
+ const anchor = anchors.get(k);
146
+ const anchored = anchor === void 0 ? null : anchorLine(anchor);
147
+ if (anchored !== null) lines.push(anchored);
148
+ lines.push(`${k} = "${escaped}"`);
149
+ }
150
+ const content = lines.length > 0 ? lines.join("\n") + "\n" : "";
151
+ const dir = path.dirname(filePath);
152
+ ensureDirSync(dir);
153
+ atomicWriteText(filePath, content);
154
+ }
155
+ function loadEntries(projectHash) {
156
+ return loadRaw(memoryPath(projectHash));
157
+ }
158
+ function loadDatedEntries(projectHash) {
159
+ const setAt = /* @__PURE__ */ new Map();
160
+ const anchors = /* @__PURE__ */ new Map();
161
+ const entries = loadRaw(memoryPath(projectHash), false, setAt, anchors);
162
+ const result = noteMap();
163
+ for (const [key, value] of Object.entries(entries)) {
164
+ const note = { value };
165
+ const time = setAt.get(key);
166
+ if (time !== void 0) note.setAt = time;
167
+ const anchor = anchors.get(key);
168
+ if (anchor !== void 0) note.anchor = anchor;
169
+ result[key] = note;
170
+ }
171
+ return result;
172
+ }
173
+ function noteAgeLabel(note, now = Date.now()) {
174
+ if (note.setAt === void 0) return "";
175
+ return ` (set ${formatAge(Math.max(0, now - Date.parse(note.setAt)))} ago)`;
176
+ }
177
+ function oneLineNoteValue(value) {
178
+ return value.replace(/\r\n|[\r\n\u0085\u2028\u2029]/g, "\\n");
179
+ }
180
+ function byRecency(a, aSetAt, b, bSetAt) {
181
+ const ta = aSetAt === void 0 ? Number.NEGATIVE_INFINITY : Date.parse(aSetAt);
182
+ const tb = bSetAt === void 0 ? Number.NEGATIVE_INFINITY : Date.parse(bSetAt);
183
+ return ta !== tb ? ta > tb ? -1 : 1 : ordinal(a, b);
184
+ }
185
+ function setEntry(projectHash, key, value, anchor) {
186
+ validateKey(key);
187
+ const p = memoryPath(projectHash);
188
+ const dir = path.dirname(p);
189
+ ensureDirSync(dir);
190
+ const result = { evicted: [] };
191
+ const doSet = () => {
192
+ const setAt = /* @__PURE__ */ new Map();
193
+ const anchors = /* @__PURE__ */ new Map();
194
+ const entries = loadRaw(p, true, setAt, anchors);
195
+ const old = Object.hasOwn(entries, key) ? entries[key] : void 0;
196
+ if (old !== void 0) result.previous = old;
197
+ const isNewKey = !Object.hasOwn(entries, key);
198
+ if (isNewKey && Object.keys(entries).length >= MAX_ENTRIES) {
199
+ const keysToKeep = MAX_ENTRIES - 1;
200
+ const allKeys = Object.keys(entries).sort((a, b) => byRecency(a, setAt.get(a), b, setAt.get(b)));
201
+ for (const k of allKeys.slice(keysToKeep)) {
202
+ result.evicted.push(k);
203
+ delete entries[k];
204
+ setAt.delete(k);
205
+ anchors.delete(k);
206
+ }
207
+ }
208
+ entries[key] = value;
209
+ setAt.set(key, (/* @__PURE__ */ new Date()).toISOString());
210
+ if (anchor === void 0) anchors.delete(key);
211
+ else anchors.set(key, anchor);
212
+ save(p, entries, setAt, anchors);
213
+ return true;
214
+ };
215
+ underNotesLock(p, doSet);
216
+ return result;
217
+ }
218
+ function underNotesLock(p, update) {
219
+ const lockPath = `${p}.lock`;
220
+ ensureDirSync(path.dirname(p));
221
+ for (let attempt = 1; attempt <= 3; attempt++) {
222
+ if (withFileLock(lockPath, update, { waitMs: LOCK_WAIT_MS_HARDENED }) !== void 0) return;
223
+ if (fs.existsSync(lockPath)) break;
224
+ if (attempt < 3) sleepSync(50 * attempt);
225
+ }
226
+ throw new Error(`Could not lock ${p} for writing; no note was changed. Another token-goat process may be writing notes: try again.`);
227
+ }
228
+ function unsetEntry(projectHash, key) {
229
+ validateKey(key);
230
+ const p = memoryPath(projectHash);
231
+ let removed = false;
232
+ const doUnset = () => {
233
+ const setAt = /* @__PURE__ */ new Map();
234
+ const anchors = /* @__PURE__ */ new Map();
235
+ const entries = loadRaw(p, true, setAt, anchors);
236
+ if (Object.hasOwn(entries, key)) {
237
+ delete entries[key];
238
+ save(p, entries, setAt, anchors);
239
+ removed = true;
240
+ }
241
+ return true;
242
+ };
243
+ underNotesLock(p, doUnset);
244
+ return removed;
245
+ }
246
+ function clearAll(projectHash) {
247
+ const p = memoryPath(projectHash);
248
+ const doClear = () => {
249
+ if (fs.existsSync(p)) {
250
+ save(p, {});
251
+ }
252
+ return true;
253
+ };
254
+ underNotesLock(p, doClear);
255
+ }
256
+ function buildInjection(projectHash, root, statusOf) {
257
+ try {
258
+ const entries = loadDatedEntries(projectHash);
259
+ if (Object.keys(entries).length === 0) {
260
+ return null;
261
+ }
262
+ const now = Date.now();
263
+ const header = '### Project notes (`token-goat note set <key> "<finding>"`)';
264
+ const render = (shown2, skipped) => {
265
+ const parts = [header];
266
+ if (shown2.length > 0) parts.push(fenceUntrustedFileContent(shown2.join("\n")));
267
+ if (skipped > 0) parts.push(`- (+${countNoun(skipped, "more memory entry", "more memory entries")} omitted)`);
268
+ return parts.join("\n");
269
+ };
270
+ const entries_list = Object.entries(entries).sort(([a, na], [b, nb]) => byRecency(a, na.setAt, b, nb.setAt));
271
+ const shown = [];
272
+ for (const [key, note] of entries_list.slice(0, MAX_ENTRIES)) {
273
+ const val = note.value;
274
+ const display = val.length <= MAX_VALUE_LEN ? val : val.slice(0, MAX_VALUE_LEN) + "\u2026";
275
+ const flag = root === void 0 || statusOf === void 0 || note.anchor === void 0 ? "" : anchorLabel(statusOf(root, note.anchor));
276
+ const line = `- **${key}**${noteAgeLabel(note, now)}${flag}: ${oneLineNoteValue(display)}`;
277
+ if (render([...shown, line], entries_list.length - shown.length - 1).length > MAX_TOTAL_CHARS) break;
278
+ shown.push(line);
279
+ }
280
+ return render(shown, entries_list.length - shown.length);
281
+ } catch {
282
+ return null;
283
+ }
284
+ }
285
+ function projectNotesFor(cwd, statusOf) {
286
+ if (cwd === void 0) return null;
287
+ try {
288
+ const project = findProject(cwd);
289
+ return project === null ? null : buildInjection(project.hash, project.root, statusOf);
290
+ } catch {
291
+ return null;
292
+ }
293
+ }
294
+
295
+ export {
296
+ MAX_ENTRIES,
297
+ anchorLabel,
298
+ anchorLine,
299
+ loadEntries,
300
+ loadDatedEntries,
301
+ noteAgeLabel,
302
+ oneLineNoteValue,
303
+ setEntry,
304
+ unsetEntry,
305
+ clearAll,
306
+ projectNotesFor
307
+ };
@@ -0,0 +1,87 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ init_define_import_meta_env
5
+ } from "./token-goat-chunk-A37V4PBF.mjs";
6
+
7
+ // src/render/ansi.ts
8
+ init_define_import_meta_env();
9
+ function _colorStream(isatty) {
10
+ if (process.env["NO_COLOR"]) return false;
11
+ return isatty;
12
+ }
13
+ function colorStdout() {
14
+ return _colorStream(process.stdout.isTTY === true);
15
+ }
16
+ var _E = "\x1B";
17
+ var RESET = `${_E}[0m`;
18
+ var _ANSI_ESCAPE_RE = /\x1B\[[0-?]*[ -/]*[@-~]|\x1B\].*?(?:\x07|\x1B\\|$)|\x1B[PX^_].*?\x1B\\|\x1B[@-_]/gs;
19
+ var _PUA_RE = /[\u{E000}-\u{F8FF}\u{F0000}-\u{FFFFD}]/gu;
20
+ function stripAnsiEscapes(s) {
21
+ if (!s.includes("\x1B")) {
22
+ return s;
23
+ }
24
+ return s.replace(_ANSI_ESCAPE_RE, "");
25
+ }
26
+ function fmtBytes(n) {
27
+ let value = n;
28
+ const units = ["B", "KB", "MB", "GB", "TB"];
29
+ for (const unit of units) {
30
+ if (Math.abs(value) < 1024) {
31
+ return unit === "B" ? `${Math.trunc(value)}${unit}` : `${value.toFixed(1)}${unit}`;
32
+ }
33
+ value = value / 1024;
34
+ }
35
+ return `${value.toFixed(1)}PB`;
36
+ }
37
+ function fg(r, g, b) {
38
+ return `${_E}[38;2;${r};${g};${b}m`;
39
+ }
40
+ function vlen(s) {
41
+ return stripAnsiEscapes(s).replace(_PUA_RE, "").length;
42
+ }
43
+ function padR(s, w) {
44
+ return s + " ".repeat(Math.max(0, w - vlen(s)));
45
+ }
46
+ function padL(s, w) {
47
+ return " ".repeat(Math.max(0, w - vlen(s))) + s;
48
+ }
49
+ function lerpRgb(a, b, t) {
50
+ return [
51
+ Math.round(a[0] + (b[0] - a[0]) * t),
52
+ Math.round(a[1] + (b[1] - a[1]) * t),
53
+ Math.round(a[2] + (b[2] - a[2]) * t)
54
+ ];
55
+ }
56
+ var C = {
57
+ TEXT_PRIMARY: [201, 209, 217],
58
+ TEXT_BRIGHT: [240, 246, 252],
59
+ TEXT_MUTED: [125, 133, 144],
60
+ TEXT_DIM: [72, 79, 88],
61
+ BG_TILE: [22, 27, 34],
62
+ TRACK: [28, 35, 41],
63
+ GREEN1: [31, 77, 44],
64
+ GREEN2: [46, 160, 67],
65
+ GREEN3: [63, 185, 80],
66
+ GREEN4: [86, 211, 100],
67
+ GREEN5: [126, 231, 135],
68
+ BLUE: [88, 166, 255],
69
+ PURPLE: [188, 140, 255],
70
+ TEAL: [138, 212, 255],
71
+ ORANGE: [235, 165, 80],
72
+ YELLOW: [240, 215, 80],
73
+ RED: [200, 60, 60]
74
+ };
75
+
76
+ export {
77
+ colorStdout,
78
+ RESET,
79
+ stripAnsiEscapes,
80
+ fmtBytes,
81
+ fg,
82
+ vlen,
83
+ padR,
84
+ padL,
85
+ lerpRgb,
86
+ C
87
+ };
@@ -0,0 +1,48 @@
1
+ import { createRequire as __cjsRequire } from 'node:module';
2
+ const require = __cjsRequire(import.meta.url);
3
+ import {
4
+ ensureDirSync
5
+ } from "./token-goat-chunk-HU4TORC5.mjs";
6
+ import {
7
+ dataDir
8
+ } from "./token-goat-chunk-CO3UYX6G.mjs";
9
+ import {
10
+ init_define_import_meta_env
11
+ } from "./token-goat-chunk-A37V4PBF.mjs";
12
+
13
+ // src/probe_marker.ts
14
+ init_define_import_meta_env();
15
+ import { writeFileSync } from "node:fs";
16
+ import path from "node:path";
17
+ var PROBE_NONCE_ENV = "TOKEN_GOAT_PROBE_NONCE";
18
+ var NONCE_RE = /^[a-f0-9]{16,32}$/;
19
+ var PROBE_EVENT_TAGS = { session_start: "S", user_prompt_submit: "P" };
20
+ function probeDir() {
21
+ return path.join(dataDir(), "probe");
22
+ }
23
+ function probeMarkerLine(nonce, tag) {
24
+ return `token-goat probe marker: ${nonce}-${tag}`;
25
+ }
26
+ function applyProbeMarker(eventName, output, env = process.env) {
27
+ const nonce = env[PROBE_NONCE_ENV];
28
+ const tag = PROBE_EVENT_TAGS[eventName];
29
+ if (nonce === void 0 || tag === void 0 || !NONCE_RE.test(nonce)) return output;
30
+ try {
31
+ ensureDirSync(probeDir());
32
+ writeFileSync(path.join(probeDir(), `${nonce}.${tag}`), "");
33
+ } catch {
34
+ }
35
+ const line = probeMarkerLine(nonce, tag);
36
+ if (output.hookType === "context") return { ...output, context: `${output.context}
37
+
38
+ ${line}` };
39
+ if (output.hookType === "pass") return output.notice === void 0 ? { hookType: "context", context: line } : { hookType: "context", context: line, notice: output.notice };
40
+ return output;
41
+ }
42
+
43
+ export {
44
+ PROBE_NONCE_ENV,
45
+ PROBE_EVENT_TAGS,
46
+ probeDir,
47
+ applyProbeMarker
48
+ };