@wrongstack/core 0.310.1 → 0.313.1

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 (187) hide show
  1. package/dist/chronicle/index.js +84 -6391
  2. package/dist/chronicle/project-server.js +84 -4868
  3. package/dist/chunk-2BUUIMQB.js +225 -0
  4. package/dist/chunk-2FK4WTFF.js +207 -0
  5. package/dist/chunk-2FQL4PDC.js +292 -0
  6. package/dist/chunk-2KKODIQU.js +2256 -0
  7. package/dist/chunk-2YU4WVBW.js +134 -0
  8. package/dist/chunk-3E244UDA.js +356 -0
  9. package/dist/chunk-3XPVB7BA.js +135 -0
  10. package/dist/chunk-4LJJYBAU.js +388 -0
  11. package/dist/chunk-4VWO3ZXL.js +342 -0
  12. package/dist/chunk-4XV6IR37.js +187 -0
  13. package/dist/chunk-4ZHTKJHM.js +183 -0
  14. package/dist/chunk-52RTVH4M.js +361 -0
  15. package/dist/chunk-57GEWK5X.js +26 -0
  16. package/dist/chunk-5DSMEVA4.js +931 -0
  17. package/dist/chunk-5RP3QTRL.js +1223 -0
  18. package/dist/chunk-5S437PRC.js +50 -0
  19. package/dist/chunk-5XDUGTKN.js +511 -0
  20. package/dist/chunk-62V2AFVG.js +422 -0
  21. package/dist/chunk-65RDIOR2.js +2470 -0
  22. package/dist/chunk-6AKOTGLM.js +597 -0
  23. package/dist/chunk-7ZHZE5EO.js +28 -0
  24. package/dist/chunk-A455ATZB.js +140 -0
  25. package/dist/chunk-AD7ZFZCS.js +46 -0
  26. package/dist/chunk-AI4LLQ2U.js +856 -0
  27. package/dist/chunk-ASX6AW36.js +789 -0
  28. package/dist/chunk-AT4V4XGI.js +3522 -0
  29. package/dist/chunk-AWNQ6ED6.js +311 -0
  30. package/dist/chunk-B4AMLZPB.js +9 -0
  31. package/dist/chunk-BAKVJLEV.js +417 -0
  32. package/dist/chunk-BJHVULHO.js +55 -0
  33. package/dist/chunk-CB2HFKTP.js +9 -0
  34. package/dist/chunk-CE4ZOCOI.js +1640 -0
  35. package/dist/chunk-CQQL4ZOQ.js +151 -0
  36. package/dist/chunk-DEIQMBD2.js +65 -0
  37. package/dist/chunk-E6I5RXVK.js +58 -0
  38. package/dist/chunk-EFEHDQGY.js +1589 -0
  39. package/dist/chunk-EODDVJBM.js +82 -0
  40. package/dist/chunk-EPC3GZD4.js +308 -0
  41. package/dist/chunk-FAYRX2AD.js +13 -0
  42. package/dist/chunk-FFSX2QDQ.js +362 -0
  43. package/dist/chunk-FHAMQS7Q.js +5856 -0
  44. package/dist/chunk-FIV4IJL7.js +2263 -0
  45. package/dist/chunk-FNXVT7HF.js +52 -0
  46. package/dist/chunk-FSWCWSTS.js +395 -0
  47. package/dist/chunk-FW5LDDMJ.js +16464 -0
  48. package/dist/chunk-FXQLIX3K.js +211 -0
  49. package/dist/chunk-G5AAKEEZ.js +228 -0
  50. package/dist/chunk-G5S3S5ZN.js +38 -0
  51. package/dist/chunk-GAZEWQEZ.js +231 -0
  52. package/dist/chunk-GFJOMSHG.js +125 -0
  53. package/dist/chunk-GFXZTHNI.js +158 -0
  54. package/dist/chunk-GM54GJBU.js +960 -0
  55. package/dist/chunk-GPQ3NJPR.js +900 -0
  56. package/dist/chunk-GTCU6DZ3.js +1 -0
  57. package/dist/chunk-H5E77KUJ.js +15 -0
  58. package/dist/chunk-H72H4XDU.js +1023 -0
  59. package/dist/chunk-HA4ZYA6T.js +178 -0
  60. package/dist/chunk-I45KAW2N.js +5020 -0
  61. package/dist/chunk-IQ35HMQL.js +1396 -0
  62. package/dist/chunk-IYFBFX34.js +86 -0
  63. package/dist/chunk-JJPMWPB6.js +109 -0
  64. package/dist/chunk-JTHKOYWU.js +663 -0
  65. package/dist/chunk-JVGPR3TS.js +365 -0
  66. package/dist/chunk-JVKB2TBL.js +48 -0
  67. package/dist/chunk-JX7VBZDK.js +31 -0
  68. package/dist/chunk-K3G6JBUC.js +5232 -0
  69. package/dist/chunk-K4YUNKU7.js +589 -0
  70. package/dist/chunk-KBZGE6LN.js +710 -0
  71. package/dist/chunk-KDQJCT2J.js +45 -0
  72. package/dist/chunk-KI4L2DUL.js +560 -0
  73. package/dist/chunk-KJ2ZTQSL.js +47 -0
  74. package/dist/chunk-KSJ5UTP7.js +154 -0
  75. package/dist/chunk-LHOA5DWA.js +28 -0
  76. package/dist/chunk-LX5QWLBL.js +27 -0
  77. package/dist/chunk-LZDDLNCZ.js +279 -0
  78. package/dist/chunk-M2WF6AXG.js +115 -0
  79. package/dist/chunk-M7BS2K6U.js +1 -0
  80. package/dist/chunk-NDBIPFNY.js +102 -0
  81. package/dist/chunk-NEMIWEXC.js +1199 -0
  82. package/dist/chunk-NFAYHPRH.js +323 -0
  83. package/dist/chunk-O37BQ65S.js +21 -0
  84. package/dist/chunk-O74MJHXU.js +187 -0
  85. package/dist/chunk-OJZEX73F.js +112 -0
  86. package/dist/chunk-PAAWLLZX.js +74 -0
  87. package/dist/chunk-PFXFQQRT.js +339 -0
  88. package/dist/chunk-PFZO3C6H.js +14 -0
  89. package/dist/chunk-PHH7LD45.js +113 -0
  90. package/dist/chunk-QRTG4XTI.js +188 -0
  91. package/dist/chunk-QVOVMXJR.js +1351 -0
  92. package/dist/chunk-RCQYT2I4.js +757 -0
  93. package/dist/chunk-RD6DEE36.js +1178 -0
  94. package/dist/chunk-RJIZEJ42.js +30 -0
  95. package/dist/chunk-RPOA7IAE.js +150 -0
  96. package/dist/chunk-SN2DQRL6.js +1172 -0
  97. package/dist/chunk-SQJVFEBV.js +41 -0
  98. package/dist/chunk-SQP64RCS.js +5391 -0
  99. package/dist/chunk-SVT4RNTR.js +49 -0
  100. package/dist/chunk-SWUFN7XM.js +43 -0
  101. package/dist/chunk-SXMVYC5H.js +174 -0
  102. package/dist/chunk-SZ6AYUIZ.js +23 -0
  103. package/dist/chunk-T3KGZBU5.js +3171 -0
  104. package/dist/chunk-TBRL2RCC.js +9 -0
  105. package/dist/chunk-TRT2HRWZ.js +18 -0
  106. package/dist/chunk-TYW2GI5I.js +1077 -0
  107. package/dist/chunk-UIWONWVG.js +4959 -0
  108. package/dist/chunk-VB3H5WWB.js +151 -0
  109. package/dist/chunk-W4A6QA3D.js +258 -0
  110. package/dist/chunk-WBPVKEEE.js +227 -0
  111. package/dist/chunk-WEBMSQP2.js +123 -0
  112. package/dist/chunk-WOEZV3Q4.js +333 -0
  113. package/dist/chunk-WQQON3SV.js +473 -0
  114. package/dist/chunk-WQTOVMGV.js +119 -0
  115. package/dist/chunk-WZO23AWO.js +2779 -0
  116. package/dist/chunk-XBDP4QPW.js +7 -0
  117. package/dist/chunk-XEBHSJLT.js +103 -0
  118. package/dist/chunk-XQ2ECNK3.js +1 -0
  119. package/dist/chunk-XQ2XGIBF.js +2086 -0
  120. package/dist/chunk-Y2GE5TSI.js +355 -0
  121. package/dist/chunk-YBUJCZ57.js +351 -0
  122. package/dist/chunk-YNCVSFGF.js +149 -0
  123. package/dist/chunk-YUPMXOGP.js +282 -0
  124. package/dist/chunk-YY6APYUM.js +49 -0
  125. package/dist/chunk-Z2IJUO45.js +691 -0
  126. package/dist/chunk-ZEHUCJHY.js +129 -0
  127. package/dist/chunk-ZYU2YOJ6.js +1496 -0
  128. package/dist/chunk-ZZ4V3WIZ.js +163 -0
  129. package/dist/coordination/agents/index.js +145 -6260
  130. package/dist/coordination/index.js +365 -34323
  131. package/dist/coordination/mailbox-project-server.js +48 -3220
  132. package/dist/coordination/mailbox-types.d.ts +13 -1
  133. package/dist/coordination/provider-status-tracker.d.ts +4 -0
  134. package/dist/coordination/sqlite-mailbox.d.ts +2 -1
  135. package/dist/core/agent.d.ts +14 -1
  136. package/dist/core/index.js +267 -12479
  137. package/dist/core/model-ref.js +5 -23
  138. package/dist/core/provider-runner.d.ts +36 -1
  139. package/dist/design/index.js +50 -1087
  140. package/dist/execution/index.d.ts +1 -1
  141. package/dist/execution/index.js +1599 -21887
  142. package/dist/execution/prompt-enhancer.js +16 -535
  143. package/dist/execution/retry-policy.d.ts +31 -1
  144. package/dist/extension/index.js +7 -311
  145. package/dist/goal/index.js +33 -3435
  146. package/dist/hooks/index.js +14 -1138
  147. package/dist/hq/index.js +112 -5139
  148. package/dist/hq/protocol.js +21 -668
  149. package/dist/index.js +1410 -92655
  150. package/dist/infrastructure/index.js +64 -4811
  151. package/dist/kernel/events/provider-events.d.ts +15 -0
  152. package/dist/kernel/events/wrongtrace-events.d.ts +26 -0
  153. package/dist/kernel/events.d.ts +16 -7
  154. package/dist/kernel/index.js +14 -992
  155. package/dist/models/index.js +40 -1117
  156. package/dist/notifications/index.js +3 -108
  157. package/dist/observability/index.js +17 -279
  158. package/dist/plugin/index.js +584 -14835
  159. package/dist/prompts/index.js +14 -948
  160. package/dist/registry/index.js +9 -822
  161. package/dist/registry-R23UBE7H.js +14 -0
  162. package/dist/replay/index.js +6 -84
  163. package/dist/review-finding-store-DKAV3AS6.js +21 -0
  164. package/dist/review-report-store-OWY3EC3N.js +19 -0
  165. package/dist/security/index.js +114 -2202
  166. package/dist/session-catalog/index.js +36 -2103
  167. package/dist/session-catalog/project-server.js +42 -1435
  168. package/dist/skills/index.js +35 -1578
  169. package/dist/storage/index.js +182 -15600
  170. package/dist/tasking/index.js +10 -676
  171. package/dist/tools/index.js +52 -9589
  172. package/dist/types/config/autonomy.d.ts +5 -0
  173. package/dist/types/config/tools.d.ts +2 -2
  174. package/dist/types/config/ui.d.ts +1 -1
  175. package/dist/types/errors.d.ts +18 -0
  176. package/dist/types/index.js +121 -1341
  177. package/dist/types/provider-runner.d.ts +8 -0
  178. package/dist/types/session-markers.js +8 -144
  179. package/dist/utils/error.js +3 -4
  180. package/dist/utils/expect-defined.js +3 -9
  181. package/dist/utils/heap-watchdog.js +6 -706
  182. package/dist/utils/index.js +269 -5685
  183. package/dist/utils/sage-output-block.js +5 -42
  184. package/dist/wiring/proxy-rewrite.d.ts +92 -4
  185. package/dist/wiring/proxy-rewrite.js +20 -61
  186. package/dist/worktree/index.js +6 -887
  187. package/package.json +4 -4
@@ -0,0 +1,52 @@
1
+ // src/utils/perf-profile.ts
2
+ var daemonDefaults = false;
3
+ function useDaemonPerfDefaults() {
4
+ daemonDefaults = true;
5
+ }
6
+ function getPerfProfile() {
7
+ const explicit = process.env.WRONGSTACK_PERF_PROFILE ?? process.env.WSTACK_PERF_PROFILE;
8
+ if (explicit === void 0 || explicit.trim() === "") {
9
+ return daemonDefaults ? "frugal" : "balanced";
10
+ }
11
+ const raw = explicit.trim().toLowerCase();
12
+ if (raw === "frugal" || raw === "cimri" || raw === "low" || raw === "eco") {
13
+ return "frugal";
14
+ }
15
+ return "balanced";
16
+ }
17
+ function isFrugalPerf() {
18
+ return getPerfProfile() === "frugal";
19
+ }
20
+ function indexParallelBatchSize(availableCores) {
21
+ const cores = Math.max(1, Math.floor(availableCores) || 1);
22
+ if (isFrugalPerf()) {
23
+ return Math.min(4, cores);
24
+ }
25
+ return Math.min(cores * 4, 40);
26
+ }
27
+ function sqliteCachePragmas() {
28
+ if (isFrugalPerf()) {
29
+ return { cacheSizeKiB: 16384, mmapBytes: 64 * 1024 * 1024 };
30
+ }
31
+ return { cacheSizeKiB: 131072, mmapBytes: 512 * 1024 * 1024 };
32
+ }
33
+ function SageCachePragmas() {
34
+ if (isFrugalPerf()) {
35
+ return { cacheSizeKiB: 8192, mmapBytes: 32 * 1024 * 1024 };
36
+ }
37
+ return { cacheSizeKiB: 65536, mmapBytes: 256 * 1024 * 1024 };
38
+ }
39
+ function tuiStreamFlushMs() {
40
+ return isFrugalPerf() ? 150 : 100;
41
+ }
42
+
43
+ export {
44
+ useDaemonPerfDefaults,
45
+ getPerfProfile,
46
+ isFrugalPerf,
47
+ indexParallelBatchSize,
48
+ sqliteCachePragmas,
49
+ SageCachePragmas,
50
+ tuiStreamFlushMs
51
+ };
52
+ //# sourceMappingURL=chunk-FNXVT7HF.js.map
@@ -0,0 +1,395 @@
1
+ // src/utils/tool-wire-compact.ts
2
+ var TOOL_DESCRIPTION_MAX_CHARS = 400;
3
+ var SCHEMA_DESCRIPTION_MAX_CHARS = 120;
4
+ var compactCache = /* @__PURE__ */ new WeakMap();
5
+ function compactToolDefinitionForWire(tool, opts = {}) {
6
+ const useDefaultOptions = opts.descriptionMaxChars === void 0 && opts.schemaDescriptionMaxChars === void 0;
7
+ if (useDefaultOptions && typeof tool === "object" && tool !== null) {
8
+ const cached = compactCache.get(tool);
9
+ if (cached) return cached;
10
+ }
11
+ const compact = {
12
+ name: tool.name,
13
+ description: compactDescription(
14
+ tool.description ?? "",
15
+ opts.descriptionMaxChars ?? TOOL_DESCRIPTION_MAX_CHARS
16
+ ),
17
+ inputSchema: normalizeTopLevelToolSchema(
18
+ compactSchemaDescriptions(
19
+ tool.inputSchema,
20
+ opts.schemaDescriptionMaxChars ?? SCHEMA_DESCRIPTION_MAX_CHARS
21
+ )
22
+ )
23
+ };
24
+ if (useDefaultOptions && typeof tool === "object" && tool !== null) {
25
+ compactCache.set(tool, compact);
26
+ }
27
+ return compact;
28
+ }
29
+ function normalizeTopLevelToolSchema(schema) {
30
+ const combinators = ["oneOf", "anyOf", "allOf"].map((keyword) => ({ keyword, branches: schema[keyword] })).filter(
31
+ (entry) => Array.isArray(entry.branches)
32
+ );
33
+ if (combinators.length === 0) return schema;
34
+ const out = { ...schema, type: "object" };
35
+ delete out["oneOf"];
36
+ delete out["anyOf"];
37
+ delete out["allOf"];
38
+ const properties = isRecord(schema["properties"]) ? { ...schema["properties"] } : {};
39
+ let required = stringSet(schema["required"]);
40
+ for (const { keyword, branches } of combinators) {
41
+ const objectBranches = branches.filter(isRecord);
42
+ for (const branch of objectBranches) {
43
+ if (isRecord(branch["properties"])) Object.assign(properties, branch["properties"]);
44
+ }
45
+ const branchRequired = objectBranches.map((branch) => stringSet(branch["required"]));
46
+ if (keyword === "allOf") {
47
+ for (const fields of branchRequired) for (const field of fields) required.add(field);
48
+ } else if (branchRequired.length > 0) {
49
+ const common = new Set(
50
+ [...branchRequired[0]].filter(
51
+ (field) => branchRequired.slice(1).every((fields) => fields.has(field))
52
+ )
53
+ );
54
+ required = /* @__PURE__ */ new Set([...required, ...common]);
55
+ }
56
+ }
57
+ out["properties"] = properties;
58
+ if (required.size > 0) out["required"] = [...required];
59
+ else delete out["required"];
60
+ return out;
61
+ }
62
+ function stringSet(value) {
63
+ return new Set(
64
+ Array.isArray(value) ? value.filter((item) => typeof item === "string") : []
65
+ );
66
+ }
67
+ function compactSchemaDescriptions(schema, maxDescriptionChars = SCHEMA_DESCRIPTION_MAX_CHARS) {
68
+ const compact = compactSchemaNode(schema, maxDescriptionChars);
69
+ return isRecord(compact) ? compact : { type: "object", properties: {} };
70
+ }
71
+ function compactSchemaNode(node, maxDescriptionChars) {
72
+ if (Array.isArray(node)) {
73
+ return node.map((item) => compactSchemaNode(item, maxDescriptionChars));
74
+ }
75
+ if (!isRecord(node)) return node;
76
+ const out = {};
77
+ for (const [key, value] of Object.entries(node)) {
78
+ if (key === "description" && typeof value === "string") {
79
+ out[key] = compactDescription(value, maxDescriptionChars);
80
+ } else {
81
+ out[key] = compactSchemaNode(value, maxDescriptionChars);
82
+ }
83
+ }
84
+ return out;
85
+ }
86
+ function compactDescription(text, maxChars) {
87
+ const normalized = text.replace(/\s+/g, " ").trim();
88
+ if (normalized.length <= maxChars) return normalized;
89
+ if (maxChars <= 20) return normalized.slice(0, maxChars);
90
+ const hardLimit = maxChars - 12;
91
+ const boundary = findSemanticBoundary(normalized, hardLimit);
92
+ const head = normalized.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd();
93
+ return `${head} ...`;
94
+ }
95
+ function findSemanticBoundary(text, limit) {
96
+ const punctuation = Math.max(
97
+ text.lastIndexOf(". ", limit),
98
+ text.lastIndexOf("; ", limit),
99
+ text.lastIndexOf(": ", limit)
100
+ );
101
+ if (punctuation >= Math.floor(limit * 0.45)) return punctuation + 1;
102
+ const comma = text.lastIndexOf(", ", limit);
103
+ if (comma >= Math.floor(limit * 0.6)) return comma + 1;
104
+ const space = text.lastIndexOf(" ", limit);
105
+ return space >= Math.floor(limit * 0.6) ? space : limit;
106
+ }
107
+ function isRecord(value) {
108
+ return !!value && typeof value === "object" && !Array.isArray(value);
109
+ }
110
+
111
+ // src/utils/token-estimate.ts
112
+ var RoughTokenEstimate = (text, charsPerToken = 3.5) => Math.max(1, Math.ceil(text.length / charsPerToken));
113
+ var CAL_ALPHA = 0.3;
114
+ var CALIBRATION_GLOBAL_KEY = "__global__";
115
+ var _cals = /* @__PURE__ */ new Map();
116
+ function calState(key) {
117
+ let state = _cals.get(key);
118
+ if (!state) {
119
+ state = { ratio: 1, count: 0, prevEst: 0 };
120
+ _cals.set(key, state);
121
+ }
122
+ return state;
123
+ }
124
+ var MIN_SAMPLES_FOR_CALIBRATION = 3;
125
+ var MODEL_FAMILY_RATIO = {
126
+ // Anthropic: ~3.8-4.0 chars/token depending on model
127
+ claude: 3.8,
128
+ // OpenAI: ~4.0 chars/token
129
+ "gpt-4": 4,
130
+ "gpt-3.5": 4,
131
+ // Google: ~3.5 chars/token
132
+ gemini: 3.5,
133
+ // DeepSeek: ~3.5 chars/token
134
+ deepseek: 3.5
135
+ };
136
+ var ESTIMATE_CACHE = /* @__PURE__ */ new Map();
137
+ var _estimateCacheOrder = [];
138
+ var ESTIMATE_CACHE_MAX_SIZE = 5e4;
139
+ function estimateCacheKey(source) {
140
+ let h = 5381;
141
+ for (let i = 0; i < source.length; i++) {
142
+ h = (h << 5) + h + source.charCodeAt(i) | 0;
143
+ }
144
+ return `${source.length}:${h >>> 0}`;
145
+ }
146
+ function getCachedEstimate(source, compute) {
147
+ const key = estimateCacheKey(source);
148
+ const existing = ESTIMATE_CACHE.get(key);
149
+ if (existing !== void 0) return existing;
150
+ if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {
151
+ while (ESTIMATE_CACHE.size > Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) {
152
+ const oldest = _estimateCacheOrder.shift();
153
+ if (oldest !== void 0) ESTIMATE_CACHE.delete(oldest);
154
+ }
155
+ }
156
+ const estimate = compute(source);
157
+ ESTIMATE_CACHE.set(key, estimate);
158
+ _estimateCacheOrder.push(key);
159
+ return estimate;
160
+ }
161
+ function estimateToolInputTokens(input) {
162
+ if (typeof input === "string") return RoughTokenEstimate(input);
163
+ if (input === null || typeof input !== "object") {
164
+ return RoughTokenEstimate(String(input));
165
+ }
166
+ return getCachedEstimate(JSON.stringify(input), (key) => RoughTokenEstimate(key));
167
+ }
168
+ function estimateToolResultTokens(content) {
169
+ if (typeof content === "string") return RoughTokenEstimate(content);
170
+ return getCachedEstimate(JSON.stringify(content), (key) => RoughTokenEstimate(key));
171
+ }
172
+ function estimateTextTokens(text) {
173
+ return RoughTokenEstimate(text);
174
+ }
175
+ function computeMessageTokens(msg) {
176
+ if (typeof msg.content === "string") return estimateTextTokens(msg.content);
177
+ let total = 0;
178
+ for (const b of msg.content) {
179
+ if (b.type === "text") total += estimateTextTokens(b.text);
180
+ else if (b.type === "tool_use") total += estimateToolInputTokens(b.input);
181
+ else if (b.type === "tool_result") total += estimateToolResultTokens(b.content);
182
+ else total += RoughTokenEstimate(JSON.stringify(b));
183
+ }
184
+ return total;
185
+ }
186
+ function estimateMessageTokens(messages) {
187
+ let total = 0;
188
+ for (const m of messages) {
189
+ if (typeof m._estTokens === "number" && m._estTokens > 0) {
190
+ total += m._estTokens;
191
+ continue;
192
+ }
193
+ total += computeMessageTokens(m);
194
+ }
195
+ return total;
196
+ }
197
+ function realAnchoredInputTokens(messages, anchorTokens, anchorMsgCount) {
198
+ if (typeof anchorTokens !== "number" || anchorTokens <= 0) return null;
199
+ if (typeof anchorMsgCount !== "number" || anchorMsgCount < 0) return null;
200
+ if (messages.length < anchorMsgCount) return null;
201
+ const delta = anchorMsgCount === messages.length ? 0 : estimateMessageTokens(messages.slice(anchorMsgCount));
202
+ return anchorTokens + delta;
203
+ }
204
+ function estimateToolDefTokens(tool) {
205
+ const cached = tool._estDefTokens;
206
+ if (typeof cached === "number" && cached > 0) return cached;
207
+ const compact = compactToolDefinitionForWire(tool);
208
+ return RoughTokenEstimate(tool.name) + RoughTokenEstimate(compact.description) + RoughTokenEstimate(JSON.stringify(compact.inputSchema));
209
+ }
210
+ function estimateRequestTokens(messages, systemPrompt, tools, calibrationKey = CALIBRATION_GLOBAL_KEY) {
211
+ let messagesTokens = 0;
212
+ if (typeof messages === "string") {
213
+ messagesTokens = RoughTokenEstimate(messages);
214
+ } else if (Array.isArray(messages)) {
215
+ for (const m of messages) {
216
+ if (typeof m === "object" && m !== null && "content" in m) {
217
+ const cached = m._estTokens;
218
+ if (typeof cached === "number" && cached > 0) {
219
+ messagesTokens += cached;
220
+ continue;
221
+ }
222
+ const content = m.content;
223
+ if (typeof content === "string") {
224
+ messagesTokens += RoughTokenEstimate(content);
225
+ } else if (Array.isArray(content)) {
226
+ for (const b of content) {
227
+ if (typeof b === "object" && b !== null) {
228
+ if (b.type === "text") {
229
+ messagesTokens += RoughTokenEstimate(b.text);
230
+ } else {
231
+ messagesTokens += RoughTokenEstimate(JSON.stringify(b));
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ let systemTokens = 0;
240
+ if (typeof systemPrompt === "string") {
241
+ systemTokens = RoughTokenEstimate(systemPrompt);
242
+ } else if (Array.isArray(systemPrompt)) {
243
+ for (const b of systemPrompt) {
244
+ if (typeof b === "object" && b !== null && b.type === "text") {
245
+ systemTokens += RoughTokenEstimate(b.text);
246
+ }
247
+ }
248
+ }
249
+ let toolsTokens = 0;
250
+ for (const t of tools) {
251
+ toolsTokens += estimateToolDefTokens(t);
252
+ }
253
+ const total = messagesTokens + systemTokens + toolsTokens;
254
+ calState(calibrationKey).prevEst = total;
255
+ return {
256
+ messages: messagesTokens,
257
+ systemPrompt: systemTokens,
258
+ tools: toolsTokens,
259
+ total
260
+ };
261
+ }
262
+ function recordActualUsage(actualInputTokens, estimatedInputTokens, calibrationKey = CALIBRATION_GLOBAL_KEY) {
263
+ if (actualInputTokens <= 0) return;
264
+ const cal = calState(calibrationKey);
265
+ const est = estimatedInputTokens ?? cal.prevEst;
266
+ if (est <= 0) return;
267
+ const sampleRatio = actualInputTokens / est;
268
+ if (cal.count === 0) {
269
+ cal.ratio = sampleRatio;
270
+ } else {
271
+ cal.ratio = CAL_ALPHA * sampleRatio + (1 - CAL_ALPHA) * cal.ratio;
272
+ }
273
+ cal.ratio = Math.min(1.5, Math.max(0.5, cal.ratio));
274
+ cal.count++;
275
+ }
276
+ function getCalibrationState(calibrationKey = CALIBRATION_GLOBAL_KEY) {
277
+ const cal = calState(calibrationKey);
278
+ return {
279
+ ratio: cal.ratio,
280
+ count: cal.count,
281
+ calibrated: cal.count >= MIN_SAMPLES_FOR_CALIBRATION
282
+ };
283
+ }
284
+ function estimateRequestTokensCalibrated(messages, systemPrompt, tools, calibrationKey = CALIBRATION_GLOBAL_KEY) {
285
+ const result = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);
286
+ const cal = calState(calibrationKey);
287
+ if (cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {
288
+ const safeRatio = Math.min(1.5, Math.max(0.5, cal.ratio));
289
+ return {
290
+ messages: Math.round(result.messages * safeRatio),
291
+ systemPrompt: Math.round(result.systemPrompt * safeRatio),
292
+ tools: Math.round(result.tools * safeRatio),
293
+ total: Math.round(result.total * safeRatio)
294
+ };
295
+ }
296
+ const fallbackRatio = getModelFamilyRatio(calibrationKey);
297
+ if (fallbackRatio !== null) {
298
+ return {
299
+ messages: Math.round(result.messages * fallbackRatio),
300
+ systemPrompt: Math.round(result.systemPrompt * fallbackRatio),
301
+ tools: Math.round(result.tools * fallbackRatio),
302
+ total: Math.round(result.total * fallbackRatio)
303
+ };
304
+ }
305
+ return result;
306
+ }
307
+ var DENSITY_SAMPLE_PER_BLOCK = 4096;
308
+ var DENSITY_SAMPLE_TOTAL_CAP = 2e6;
309
+ function textDensityMultiplier(messages) {
310
+ let sampled = 0;
311
+ let nonAscii = 0;
312
+ let maxRun = 0;
313
+ const consider = (s) => {
314
+ const n = Math.min(s.length, DENSITY_SAMPLE_PER_BLOCK);
315
+ let run = 0;
316
+ for (let i = 0; i < n; i++) {
317
+ const c = s.charCodeAt(i);
318
+ if (c > 127) nonAscii++;
319
+ if (c === 32 || c === 9 || c === 10 || c === 13) {
320
+ if (run > maxRun) maxRun = run;
321
+ run = 0;
322
+ } else {
323
+ run++;
324
+ }
325
+ }
326
+ if (run > maxRun) maxRun = run;
327
+ sampled += n;
328
+ };
329
+ for (const m of messages) {
330
+ if (typeof m.content === "string") {
331
+ consider(m.content);
332
+ } else if (Array.isArray(m.content)) {
333
+ for (const b of m.content) {
334
+ if (b.type === "text") consider(b.text);
335
+ else if (b.type === "tool_result" && typeof b.content === "string") consider(b.content);
336
+ else if (b.type === "thinking") consider(b.thinking);
337
+ }
338
+ }
339
+ if (sampled >= DENSITY_SAMPLE_TOTAL_CAP) break;
340
+ }
341
+ if (sampled === 0) return 1;
342
+ const nonAsciiRatio = nonAscii / sampled;
343
+ let charsPerToken = 3.5 - 2 * nonAsciiRatio;
344
+ if (maxRun > 2e3 && nonAsciiRatio < 0.1) charsPerToken = Math.min(charsPerToken, 3);
345
+ const multiplier = 3.5 / Math.max(1.4, charsPerToken);
346
+ return Math.min(2.5, Math.max(1, multiplier));
347
+ }
348
+ function estimateRequestTokensUpperBound(messages, systemPrompt, tools, calibrationKey = CALIBRATION_GLOBAL_KEY) {
349
+ const base = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);
350
+ const density = Array.isArray(messages) ? textDensityMultiplier(messages) : 1;
351
+ const cal = calState(calibrationKey);
352
+ const calCeiling = cal.count >= MIN_SAMPLES_FOR_CALIBRATION ? Math.min(1.5, Math.max(1, cal.ratio)) : 1;
353
+ const mult = Math.max(density, calCeiling);
354
+ if (mult <= 1) return base;
355
+ return {
356
+ messages: Math.ceil(base.messages * mult),
357
+ systemPrompt: Math.ceil(base.systemPrompt * mult),
358
+ tools: Math.ceil(base.tools * mult),
359
+ total: Math.ceil(base.total * mult)
360
+ };
361
+ }
362
+ function getModelFamilyRatio(calibrationKey) {
363
+ const lower = calibrationKey.toLowerCase();
364
+ for (const [family, ratio] of Object.entries(MODEL_FAMILY_RATIO)) {
365
+ if (lower.includes(family)) return ratio / 3.5;
366
+ }
367
+ return null;
368
+ }
369
+ function resetCalibration(calibrationKey) {
370
+ if (calibrationKey === void 0) {
371
+ _cals.clear();
372
+ return;
373
+ }
374
+ _cals.delete(calibrationKey);
375
+ }
376
+
377
+ export {
378
+ compactToolDefinitionForWire,
379
+ normalizeTopLevelToolSchema,
380
+ compactSchemaDescriptions,
381
+ estimateToolInputTokens,
382
+ estimateToolResultTokens,
383
+ estimateTextTokens,
384
+ computeMessageTokens,
385
+ estimateMessageTokens,
386
+ realAnchoredInputTokens,
387
+ estimateToolDefTokens,
388
+ estimateRequestTokens,
389
+ recordActualUsage,
390
+ getCalibrationState,
391
+ estimateRequestTokensCalibrated,
392
+ estimateRequestTokensUpperBound,
393
+ resetCalibration
394
+ };
395
+ //# sourceMappingURL=chunk-FSWCWSTS.js.map