dexbot 1.5.3 → 1.6.0

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 (231) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +4 -3
  3. package/analysis/README.md +1 -2
  4. package/analysis/ama_fitting/fetch_lp_candles.ts +1 -9
  5. package/analysis/ama_fitting/package.json +1 -1
  6. package/analysis/analyze_derivatives.ts +1 -1
  7. package/analysis/bot_usage/discover_bot_accounts.ts +12 -6
  8. package/analysis/resolve_source.ts +9 -2
  9. package/analysis/tradingview/README.md +29 -11
  10. package/analysis/tradingview/analyze_tradingview.ts +92 -3
  11. package/analysis/tradingview/tradingview_uplot_chart_generator.ts +1120 -182
  12. package/analysis/trend_detection/package.json +1 -1
  13. package/claw/docs/DEXBOT2_TUNING_CHEAT_SHEET.md +1 -1
  14. package/claw/modules/dexbot_profiles.ts +22 -2
  15. package/claw/package.json +1 -1
  16. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  17. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  18. package/claw/skills/launcher-ops/references/launcher-workflow.md +1 -1
  19. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  20. package/claw/tests/test_dexbot_profiles.ts +65 -0
  21. package/dist/analysis/ama_fitting/fetch_lp_candles.js +1 -9
  22. package/dist/analysis/ama_fitting/fetch_lp_candles.js.map +1 -1
  23. package/dist/analysis/analyze_derivatives.js +1 -1
  24. package/dist/analysis/bot_usage/discover_bot_accounts.js +11 -6
  25. package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
  26. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +2 -0
  27. package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
  28. package/dist/analysis/resolve_source.d.ts +1 -0
  29. package/dist/analysis/resolve_source.d.ts.map +1 -1
  30. package/dist/analysis/resolve_source.js +6 -2
  31. package/dist/analysis/resolve_source.js.map +1 -1
  32. package/dist/analysis/tradingview/analyze_tradingview.d.ts +5 -0
  33. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
  34. package/dist/analysis/tradingview/analyze_tradingview.js +112 -3
  35. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  36. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts +5 -1
  37. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
  38. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +1118 -182
  39. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
  40. package/dist/bot.js +1 -1
  41. package/dist/bot.js.map +1 -1
  42. package/dist/dexbot.js +3 -3
  43. package/dist/dexbot.js.map +1 -1
  44. package/dist/market_adapter/ama_signal_runner.js +2 -2
  45. package/dist/market_adapter/candle_utils.d.ts +6 -0
  46. package/dist/market_adapter/candle_utils.d.ts.map +1 -1
  47. package/dist/market_adapter/candle_utils.js +6 -0
  48. package/dist/market_adapter/candle_utils.js.map +1 -1
  49. package/dist/market_adapter/core/kibana_candles.d.ts +17 -1
  50. package/dist/market_adapter/core/kibana_candles.d.ts.map +1 -1
  51. package/dist/market_adapter/core/kibana_candles.js +101 -19
  52. package/dist/market_adapter/core/kibana_candles.js.map +1 -1
  53. package/dist/market_adapter/core/kibana_client.d.ts +2 -0
  54. package/dist/market_adapter/core/kibana_client.d.ts.map +1 -1
  55. package/dist/market_adapter/core/kibana_client.js +31 -4
  56. package/dist/market_adapter/core/kibana_client.js.map +1 -1
  57. package/dist/market_adapter/core/market_adapter_service.d.ts.map +1 -1
  58. package/dist/market_adapter/core/market_adapter_service.js +0 -6
  59. package/dist/market_adapter/core/market_adapter_service.js.map +1 -1
  60. package/dist/market_adapter/inputs/fetch_book_data.d.ts +14 -0
  61. package/dist/market_adapter/inputs/fetch_book_data.d.ts.map +1 -0
  62. package/dist/market_adapter/inputs/fetch_book_data.js +138 -0
  63. package/dist/market_adapter/inputs/fetch_book_data.js.map +1 -0
  64. package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +1 -1
  65. package/dist/market_adapter/inputs/fetch_lp_data.d.ts +16 -2
  66. package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
  67. package/dist/market_adapter/inputs/fetch_lp_data.js +109 -281
  68. package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
  69. package/dist/market_adapter/inputs/kibana_feed_source.d.ts +87 -0
  70. package/dist/market_adapter/inputs/kibana_feed_source.d.ts.map +1 -0
  71. package/dist/market_adapter/inputs/kibana_feed_source.js +570 -0
  72. package/dist/market_adapter/inputs/kibana_feed_source.js.map +1 -0
  73. package/dist/market_adapter/inputs/kibana_source.d.ts.map +1 -1
  74. package/dist/market_adapter/inputs/kibana_source.js +10 -5
  75. package/dist/market_adapter/inputs/kibana_source.js.map +1 -1
  76. package/dist/market_adapter/inputs/window_cache.d.ts +166 -0
  77. package/dist/market_adapter/inputs/window_cache.d.ts.map +1 -0
  78. package/dist/market_adapter/inputs/window_cache.js +500 -0
  79. package/dist/market_adapter/inputs/window_cache.js.map +1 -0
  80. package/dist/market_adapter/interval_utils.d.ts +8 -1
  81. package/dist/market_adapter/interval_utils.d.ts.map +1 -1
  82. package/dist/market_adapter/interval_utils.js +14 -1
  83. package/dist/market_adapter/interval_utils.js.map +1 -1
  84. package/dist/modules/account_bots.d.ts +1 -0
  85. package/dist/modules/account_bots.d.ts.map +1 -1
  86. package/dist/modules/account_bots.js +21 -5
  87. package/dist/modules/account_bots.js.map +1 -1
  88. package/dist/modules/account_orders.d.ts +25 -4
  89. package/dist/modules/account_orders.d.ts.map +1 -1
  90. package/dist/modules/account_orders.js +67 -4
  91. package/dist/modules/account_orders.js.map +1 -1
  92. package/dist/modules/bitshares-native/chain_client.d.ts +2 -0
  93. package/dist/modules/bitshares-native/chain_client.d.ts.map +1 -1
  94. package/dist/modules/bitshares-native/chain_client.js +3 -1
  95. package/dist/modules/bitshares-native/chain_client.js.map +1 -1
  96. package/dist/modules/bitshares-native/subscriptions.d.ts.map +1 -1
  97. package/dist/modules/bitshares-native/subscriptions.js +13 -3
  98. package/dist/modules/bitshares-native/subscriptions.js.map +1 -1
  99. package/dist/modules/bitshares-native/transport.d.ts +2 -0
  100. package/dist/modules/bitshares-native/transport.d.ts.map +1 -1
  101. package/dist/modules/bitshares-native/transport.js +122 -28
  102. package/dist/modules/bitshares-native/transport.js.map +1 -1
  103. package/dist/modules/bitshares_client.d.ts.map +1 -1
  104. package/dist/modules/bitshares_client.js +59 -8
  105. package/dist/modules/bitshares_client.js.map +1 -1
  106. package/dist/modules/bot_settings.d.ts.map +1 -1
  107. package/dist/modules/bot_settings.js +11 -0
  108. package/dist/modules/bot_settings.js.map +1 -1
  109. package/dist/modules/constants.d.ts +13 -0
  110. package/dist/modules/constants.d.ts.map +1 -1
  111. package/dist/modules/constants.js +68 -4
  112. package/dist/modules/constants.js.map +1 -1
  113. package/dist/modules/dexbot_class.d.ts +8 -0
  114. package/dist/modules/dexbot_class.d.ts.map +1 -1
  115. package/dist/modules/dexbot_class.js +57 -2
  116. package/dist/modules/dexbot_class.js.map +1 -1
  117. package/dist/modules/dexbot_cow_runtime.d.ts +26 -1
  118. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  119. package/dist/modules/dexbot_cow_runtime.js +157 -28
  120. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  121. package/dist/modules/dexbot_fill_runtime.d.ts +41 -1
  122. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  123. package/dist/modules/dexbot_fill_runtime.js +135 -5
  124. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  125. package/dist/modules/dexbot_maintenance_runtime.d.ts +79 -12
  126. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  127. package/dist/modules/dexbot_maintenance_runtime.js +554 -46
  128. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  129. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  130. package/dist/modules/dexbot_startup_runtime.js +13 -0
  131. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  132. package/dist/modules/dexbot_state_recovery.d.ts +15 -1
  133. package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
  134. package/dist/modules/dexbot_state_recovery.js +36 -7
  135. package/dist/modules/dexbot_state_recovery.js.map +1 -1
  136. package/dist/modules/fund_registry.d.ts +1 -1
  137. package/dist/modules/fund_registry.js +1 -1
  138. package/dist/modules/node_connect_policy.d.ts +52 -0
  139. package/dist/modules/node_connect_policy.d.ts.map +1 -0
  140. package/dist/modules/node_connect_policy.js +35 -0
  141. package/dist/modules/node_connect_policy.js.map +1 -0
  142. package/dist/modules/node_manager.d.ts +32 -0
  143. package/dist/modules/node_manager.d.ts.map +1 -1
  144. package/dist/modules/node_manager.js +76 -9
  145. package/dist/modules/node_manager.js.map +1 -1
  146. package/dist/modules/order/accounting.d.ts +30 -0
  147. package/dist/modules/order/accounting.d.ts.map +1 -1
  148. package/dist/modules/order/accounting.js +176 -3
  149. package/dist/modules/order/accounting.js.map +1 -1
  150. package/dist/modules/order/export.d.ts.map +1 -1
  151. package/dist/modules/order/export.js +1 -0
  152. package/dist/modules/order/export.js.map +1 -1
  153. package/dist/modules/order/grid.d.ts.map +1 -1
  154. package/dist/modules/order/grid.js +143 -15
  155. package/dist/modules/order/grid.js.map +1 -1
  156. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  157. package/dist/modules/order/grid_reconcile.js +5 -3
  158. package/dist/modules/order/grid_reconcile.js.map +1 -1
  159. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  160. package/dist/modules/order/grid_reconcile_internal.js +182 -6
  161. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  162. package/dist/modules/order/manager.d.ts +64 -2
  163. package/dist/modules/order/manager.d.ts.map +1 -1
  164. package/dist/modules/order/manager.js +231 -14
  165. package/dist/modules/order/manager.js.map +1 -1
  166. package/dist/modules/order/strategy.d.ts +3 -0
  167. package/dist/modules/order/strategy.d.ts.map +1 -1
  168. package/dist/modules/order/strategy.js +79 -7
  169. package/dist/modules/order/strategy.js.map +1 -1
  170. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  171. package/dist/modules/order/sync_engine.js +16 -1
  172. package/dist/modules/order/sync_engine.js.map +1 -1
  173. package/dist/modules/order/utils/math.d.ts +11 -1
  174. package/dist/modules/order/utils/math.d.ts.map +1 -1
  175. package/dist/modules/order/utils/math.js +24 -1
  176. package/dist/modules/order/utils/math.js.map +1 -1
  177. package/dist/modules/order/utils/order.d.ts +258 -13
  178. package/dist/modules/order/utils/order.d.ts.map +1 -1
  179. package/dist/modules/order/utils/order.js +662 -12
  180. package/dist/modules/order/utils/order.js.map +1 -1
  181. package/dist/modules/order/utils/system.d.ts +36 -0
  182. package/dist/modules/order/utils/system.d.ts.map +1 -1
  183. package/dist/modules/order/utils/system.js +102 -6
  184. package/dist/modules/order/utils/system.js.map +1 -1
  185. package/dist/modules/order/utils/validate.d.ts.map +1 -1
  186. package/dist/modules/order/utils/validate.js +6 -2
  187. package/dist/modules/order/utils/validate.js.map +1 -1
  188. package/dist/modules/paths.d.ts +2 -0
  189. package/dist/modules/paths.d.ts.map +1 -1
  190. package/dist/modules/paths.js +1 -0
  191. package/dist/modules/paths.js.map +1 -1
  192. package/dist/modules/runtime_settings.d.ts +13 -0
  193. package/dist/modules/runtime_settings.d.ts.map +1 -1
  194. package/dist/modules/runtime_settings.js +20 -0
  195. package/dist/modules/runtime_settings.js.map +1 -1
  196. package/dist/modules/utils/errors.d.ts +16 -0
  197. package/dist/modules/utils/errors.d.ts.map +1 -1
  198. package/dist/modules/utils/errors.js +31 -0
  199. package/dist/modules/utils/errors.js.map +1 -1
  200. package/dist/pm2.js +7 -7
  201. package/dist/scripts/analyze-credit.d.ts.map +1 -1
  202. package/dist/scripts/analyze-credit.js +13 -3
  203. package/dist/scripts/analyze-credit.js.map +1 -1
  204. package/dist/scripts/analyze-orders.js +2 -2
  205. package/dist/scripts/analyze-orders.js.map +1 -1
  206. package/dist/scripts/diagnose-kibana-candles.d.ts.map +1 -1
  207. package/dist/scripts/diagnose-kibana-candles.js +0 -1
  208. package/dist/scripts/diagnose-kibana-candles.js.map +1 -1
  209. package/dist/scripts/test-credit-renewal.js +1 -1
  210. package/dist/scripts/test-credit-renewal.js.map +1 -1
  211. package/dist/scripts/tv.d.ts +24 -2
  212. package/dist/scripts/tv.d.ts.map +1 -1
  213. package/dist/scripts/tv.js +190 -65
  214. package/dist/scripts/tv.js.map +1 -1
  215. package/docs/BITSHARES_ONBOARDING.md +9 -2
  216. package/docs/COW_INVARIANTS.md +18 -1
  217. package/docs/DEXBOT_COMPARISON.md +3 -3
  218. package/docs/EVOLUTION.md +8 -7
  219. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +21 -9
  220. package/docs/GRID_RECALCULATION.md +5 -6
  221. package/docs/GRID_RECONCILE.md +12 -2
  222. package/docs/MPA_CREDIT_USAGE.md +2 -2
  223. package/docs/README.md +5 -6
  224. package/docs/architecture.md +0 -58
  225. package/docs/developer_guide.md +2 -1
  226. package/docs/docker.md +1 -1
  227. package/market_adapter/README.md +4 -0
  228. package/modules/README.md +1 -1
  229. package/package.json +1 -1
  230. package/scripts/README.md +5 -3
  231. package/tests/README.md +2 -2
@@ -0,0 +1,500 @@
1
+ 'use strict';
2
+ /**
3
+ * WINDOW CACHE — generic persistent bucket cache for windowed Kibana candle fetches.
4
+ *
5
+ * Problem: callers anchor their range at floored-"now", so every run shifts all
6
+ * windows and an exact time-range match would invalidate the whole cache.
7
+ * This module makes reuse range-aware instead: sibling chunk files are loaded
8
+ * once, buckets inside the new window are kept, and only missing buckets are
9
+ * queried (plus a tail refresh for late-indexed trades).
10
+ *
11
+ * Chunk files live next to `outPath`:
12
+ * `<base>.chunk_<ii>_<YYYY-MM-DD>_<YYYY-MM-DD><ext>`
13
+ * each holding `{ meta, candles }`. Callers supply:
14
+ * - `requestKey` — opaque identity object stored in each chunk's meta,
15
+ * - `isMatch(meta, requestKey)` — same-pool/feed/interval/assets check,
16
+ * - `fetchRange(gteIso, lteIso)` — query one (sub-)range, gap-filled grid,
17
+ * - `metaForWindow(window)` — meta to persist with a (re)fetched chunk.
18
+ *
19
+ * Node-only (disk I/O via storage). Browser-safe code must not import this.
20
+ */
21
+ import { path } from '../../modules/path_api.js';
22
+ import { getStorage } from '../../modules/storage/index.js';
23
+ import { writeJsonAtomic } from '../utils/atomic_write.js';
24
+ import { getErrorMessage, sleepMs } from '../../modules/utils/errors.js';
25
+ import { mergeCandles } from '../candle_utils.js';
26
+ const storage = getStorage();
27
+ const { readJSON } = storage;
28
+ // Trailing overlap always re-fetched on the newest window. Kibana indexing
29
+ // can lag minutes–hours, so buckets cached as zero-volume fills may gain
30
+ // real trades after the fact. 48h bounds the extra query to a small range.
31
+ const TAIL_REFRESH_HOURS = 48;
32
+ // Windows fully in the past are immutable: blockchain history does not change
33
+ // and Kibana indexing lag (minutes–hours) is long past. Leading buckets with
34
+ // no trades stay empty forever, so re-querying them every shifted rerun is
35
+ // pure waste. Only the recent past is re-checked (see TAIL_REFRESH_HOURS).
36
+ const IMMUTABLE_WINDOW_AGE_MS = 7 * 24 * 3600 * 1000;
37
+ function siblingChunkFiles(outPath) {
38
+ const resolved = path.resolve(outPath);
39
+ const parsed = path.parse(resolved);
40
+ if (!storage.exists(parsed.dir))
41
+ return [];
42
+ const prefix = `${parsed.name}.chunk_`;
43
+ return storage.readdir(parsed.dir)
44
+ .filter((name) => name.startsWith(prefix) && name.endsWith(parsed.ext))
45
+ .map((name) => path.join(parsed.dir, name))
46
+ .sort();
47
+ }
48
+ function chunkPathFor(outPath, index, window) {
49
+ const parsed = path.parse(outPath);
50
+ const start = String(window.gte).slice(0, 10);
51
+ const end = String(window.lte).slice(0, 10);
52
+ return path.join(parsed.dir, `${parsed.name}.chunk_${String(index).padStart(2, '0')}_${start}_${end}${parsed.ext}`);
53
+ }
54
+ function readCacheChunk(chunkFile, requestKey, isMatch) {
55
+ // Same-identity check WITHOUT the timeRange match — any chunk for this
56
+ // request can contribute buckets.
57
+ try {
58
+ const parsed = readJSON(chunkFile);
59
+ const meta = parsed?.meta || {};
60
+ if (!isMatch(meta, requestKey))
61
+ return null;
62
+ if (!Array.isArray(parsed.candles))
63
+ return null;
64
+ const rangeGte = Date.parse(String(meta.timeRange?.gte || ''));
65
+ const rangeLte = Date.parse(String(meta.timeRange?.lte || ''));
66
+ const gte = Number.isFinite(rangeGte) ? rangeGte : null;
67
+ const lte = Number.isFinite(rangeLte) ? rangeLte : null;
68
+ // Ranges actually queried to produce these candles. Pre-fix files
69
+ // predate sub-range fetches (full-window only), so their timeRange
70
+ // claim is exact and serves as the fallback.
71
+ const queried = Array.isArray(meta.queriedRanges)
72
+ ? meta.queriedRanges
73
+ .filter((q) => Number.isFinite(Number(q?.gte)) && Number.isFinite(Number(q?.lte)))
74
+ .map((q) => ({ gte: Number(q.gte), lte: Number(q.lte) }))
75
+ : (gte !== null && lte !== null ? [{ gte, lte }] : []);
76
+ return {
77
+ candles: parsed.candles,
78
+ fetchedAt: meta.fetchedAt || null,
79
+ file: chunkFile,
80
+ rangeGte: gte,
81
+ rangeLte: lte,
82
+ queried,
83
+ };
84
+ }
85
+ catch (_) {
86
+ return null;
87
+ }
88
+ }
89
+ // Previously-proven coverage surviving a same-filename overwrite, clipped
90
+ // to the window being persisted. Sound: any in-window range the old file
91
+ // vouched for was really queried, and had it held trades those candles
92
+ // would be in that same file (hence carried forward as reusable, never
93
+ // missing). Out-of-window parts are dropped by the clip, so nothing is
94
+ // vouched for beyond what the rewritten file can testify to.
95
+ function priorQueriedInWindow(chunkFile, requestKey, isMatch, gteMs, lteMs) {
96
+ const chunk = readCacheChunk(chunkFile, requestKey, isMatch);
97
+ if (!chunk)
98
+ return [];
99
+ return chunk.queried
100
+ .filter((q) => q.lte > gteMs && q.gte < lteMs)
101
+ .map((q) => ({ gte: Math.max(q.gte, gteMs), lte: Math.min(q.lte, lteMs) }));
102
+ }
103
+ function loadBucketCache(outPath, requestKey, isMatch) {
104
+ const byTs = new Map();
105
+ const fileCover = [];
106
+ let files = 0;
107
+ for (const file of siblingChunkFiles(outPath)) {
108
+ const chunk = readCacheChunk(file, requestKey, isMatch);
109
+ if (!chunk)
110
+ continue;
111
+ files += 1;
112
+ fileCover.push({ gte: chunk.rangeGte, lte: chunk.rangeLte, count: chunk.candles.length, queried: chunk.queried });
113
+ for (const c of chunk.candles) {
114
+ if (!Array.isArray(c))
115
+ continue;
116
+ const ts = Number(c[0]);
117
+ if (!Number.isFinite(ts))
118
+ continue;
119
+ const prev = byTs.get(ts);
120
+ if (!prev || Number(c[5] || 0) > Number(prev[5] || 0))
121
+ byTs.set(ts, c);
122
+ }
123
+ }
124
+ return { byTs, files, fileCover };
125
+ }
126
+ function cachedCandlesInRange(localCache, gteMs, lteMs) {
127
+ const out = [];
128
+ for (const [ts, c] of localCache.byTs) {
129
+ if (ts >= gteMs && ts <= lteMs)
130
+ out.push(c);
131
+ }
132
+ out.sort((a, b) => a[0] - b[0]);
133
+ return out;
134
+ }
135
+ function addUtcMonths(date, months) {
136
+ const result = new Date(date.getTime());
137
+ const day = result.getUTCDate();
138
+ result.setUTCDate(1);
139
+ result.setUTCMonth(result.getUTCMonth() + months);
140
+ const lastDay = new Date(Date.UTC(result.getUTCFullYear(), result.getUTCMonth() + 1, 0)).getUTCDate();
141
+ result.setUTCDate(Math.min(day, lastDay));
142
+ return result;
143
+ }
144
+ function normalizeDateInput(raw, label) {
145
+ const ms = Date.parse(String(raw || ''));
146
+ if (!Number.isFinite(ms)) {
147
+ throw new Error(`Invalid ${label} date: ${raw}`);
148
+ }
149
+ return new Date(ms);
150
+ }
151
+ function buildFetchWindowsFromRange(timeRange, chunkMonths) {
152
+ const start = normalizeDateInput(timeRange.gte, 'start');
153
+ const end = normalizeDateInput(timeRange.lte, 'end');
154
+ if (start >= end) {
155
+ throw new Error(`Invalid fetch range: ${start.toISOString()} must be earlier than ${end.toISOString()}`);
156
+ }
157
+ const windows = [];
158
+ let cursor = start;
159
+ while (cursor < end) {
160
+ const next = addUtcMonths(cursor, chunkMonths);
161
+ const windowEnd = next < end ? next : end;
162
+ windows.push({
163
+ gte: cursor.toISOString(),
164
+ lte: windowEnd.toISOString(),
165
+ });
166
+ cursor = windowEnd;
167
+ }
168
+ return windows;
169
+ }
170
+ function findMissingBucketRanges(gteMs, lteMs, bucketMs, haveTs) {
171
+ const first = Math.floor(gteMs / bucketMs) * bucketMs;
172
+ const last = Math.floor(lteMs / bucketMs) * bucketMs;
173
+ const missing = [];
174
+ let runStart = null;
175
+ for (let ts = first; ts <= last; ts += bucketMs) {
176
+ if (haveTs.has(ts)) {
177
+ if (runStart !== null) {
178
+ missing.push({ gte: runStart, lte: ts - bucketMs, hours: Math.round((ts - runStart) / bucketMs) });
179
+ runStart = null;
180
+ }
181
+ }
182
+ else if (runStart === null) {
183
+ runStart = ts;
184
+ }
185
+ }
186
+ if (runStart !== null) {
187
+ missing.push({ gte: runStart, lte: last, hours: Math.round((last - runStart) / bucketMs) + 1 });
188
+ }
189
+ return missing;
190
+ }
191
+ function pruneImmutableGaps(missing, lteMs, fileCover, nowMs = Date.now()) {
192
+ const windowOld = lteMs < nowMs - IMMUTABLE_WINDOW_AGE_MS;
193
+ return missing.filter((m) => {
194
+ // Absence of local buckets is NEVER proof of emptiness: stray
195
+ // buckets from a sibling window's file (e.g. boundary over-fetch)
196
+ // must not vouch for anything. Only queriedRanges count, and only
197
+ // for old windows — recent files may predate late-indexed trades.
198
+ // (A former "leading no-trade gap" heuristic pruned everything
199
+ // before the first local bucket; it once certified a whole month
200
+ // as empty from 5 stray boundary buckets of the next window.)
201
+ // Ranges an existing chunk file actually queried (only trusted for
202
+ // old windows — recent files may predate late-indexed trades).
203
+ // Coverage comes from meta.queriedRanges, not the file's overall
204
+ // timeRange: a chunk rewritten from reused buckets plus sub-range
205
+ // fetches only proves its fetched sub-ranges empty, never the
206
+ // ranges it merely copied forward.
207
+ if (windowOld) {
208
+ for (const f of fileCover) {
209
+ for (const q of f.queried || []) {
210
+ if (q.gte <= m.gte && q.lte >= m.lte)
211
+ return false;
212
+ }
213
+ }
214
+ }
215
+ return true;
216
+ });
217
+ }
218
+ function persistCacheChunk(chunkFile, meta, candles) {
219
+ const payload = {
220
+ meta: {
221
+ ...meta,
222
+ candleCount: candles.length,
223
+ firstTs: candles.length > 0 ? new Date(candles[0][0]).toISOString() : null,
224
+ lastTs: candles.length > 0 ? new Date(candles[candles.length - 1][0]).toISOString() : null,
225
+ },
226
+ candles,
227
+ };
228
+ writeJsonAtomic(chunkFile, payload);
229
+ }
230
+ // Stale chunk files accumulate when shifted windows change date-based file
231
+ // names (an hour shift crossing midnight orphans the old name). Only files
232
+ // whose embedded meta matches this request are eligible, and only once the
233
+ // caller has completed all windows — a failed run never deletes.
234
+ function cleanupOrphanCacheChunks(outPath, requestKey, isMatch, activeFiles) {
235
+ const removed = [];
236
+ try {
237
+ for (const file of siblingChunkFiles(outPath)) {
238
+ if (activeFiles.has(path.resolve(file)))
239
+ continue;
240
+ if (!readCacheChunk(file, requestKey, isMatch))
241
+ continue;
242
+ try {
243
+ storage.unlink(file);
244
+ removed.push(file);
245
+ }
246
+ catch (err) {
247
+ console.warn(` Could not remove orphan chunk ${path.relative(process.cwd(), file)}: ${getErrorMessage(err)}`);
248
+ }
249
+ }
250
+ }
251
+ catch (err) {
252
+ console.warn(` Orphan chunk cleanup skipped: ${getErrorMessage(err)}`);
253
+ return [];
254
+ }
255
+ return removed;
256
+ }
257
+ /**
258
+ * Reuse plan for one window: buckets already on disk + the ranges that still
259
+ * need querying. When `allowSubFetch` is false (data with cross-range state
260
+ * such as forward-filled crosses), the tail widening is skipped and the
261
+ * caller must take full-window fetches — reuse (zero queries) still applies.
262
+ */
263
+ function planWindowReuse(localCache, opts) {
264
+ const { gteMs, lteMs, bucketMs, isTail } = opts;
265
+ const allowSubFetch = opts.allowSubFetch !== false;
266
+ const nowMs = opts.nowMs != null ? opts.nowMs : Date.now();
267
+ const valid = Number.isFinite(gteMs) && Number.isFinite(lteMs) && Number.isFinite(bucketMs) && bucketMs > 0;
268
+ const reusable = valid
269
+ ? cachedCandlesInRange(localCache, gteMs, lteMs)
270
+ : [];
271
+ let missing = valid
272
+ ? findMissingBucketRanges(gteMs, lteMs, bucketMs, new Set(reusable.map((c) => Number(c[0]))))
273
+ : [];
274
+ // Immutable history (pruned again after the tail widening below, which
275
+ // reintroduces the leading gap via its refresh set).
276
+ const prune = () => {
277
+ missing = pruneImmutableGaps(missing, lteMs, localCache.fileCover, nowMs);
278
+ };
279
+ prune();
280
+ // Late-indexing guard: the newest window always re-fetches its
281
+ // trailing overlap so zero-volume fills can gain real trades.
282
+ if (allowSubFetch && isTail && reusable.length > 0) {
283
+ const refreshFromMs = lteMs - TAIL_REFRESH_HOURS * 3600 * 1000;
284
+ if (refreshFromMs > gteMs) {
285
+ const refreshSet = new Set(reusable.filter((c) => Number(c[0]) < refreshFromMs).map((c) => Number(c[0])));
286
+ const refreshed = findMissingBucketRanges(gteMs, lteMs, bucketMs, refreshSet);
287
+ // Only widen, never narrow: keep previously-missing buckets.
288
+ const seen = new Set(missing.map((m) => `${m.gte}-${m.lte}`));
289
+ for (const m of refreshed) {
290
+ if (!seen.has(`${m.gte}-${m.lte}`))
291
+ missing.push(m);
292
+ }
293
+ missing.sort((a, b) => a.gte - b.gte);
294
+ prune();
295
+ }
296
+ }
297
+ const missingHours = missing.reduce((sum, m) => sum + m.hours, 0);
298
+ const windowHours = valid ? Math.max(1, Math.round((lteMs - gteMs) / bucketMs)) : 1;
299
+ return { reusable, missing, missingHours, windowHours, inputsValid: valid };
300
+ }
301
+ // ─── Shared progress output ───────────────────────────────────────────────────
302
+ // Both fetch modes (pool chunks, feed windows) print the same per-window
303
+ // lines so the output is comparable: one line per cached/reused window and
304
+ // one line per executed range query.
305
+ function formatWindowLine(unit, index, total, gte, lte, detail = '') {
306
+ return ` ${unit} ${index}/${total}: ${gte} → ${lte}${detail ? ` ${detail}` : ''}`;
307
+ }
308
+ /**
309
+ * Per-range fetch budget shared by every cached candle fetcher (pool, book,
310
+ * feed). Retries a failing range up to `attempts` times with linear backoff
311
+ * and an optional per-attempt timeout (aborted via signal passed as the 4th
312
+ * fetchRange argument — fetchers that ignore it simply get no abort).
313
+ * Defaults (attempts 1, no timeout) preserve the old single-shot behavior.
314
+ */
315
+ async function fetchRangeWithRetry(fetchRange, opts) {
316
+ const attempts = Number.isFinite(Number(opts.attempts)) && Number(opts.attempts) >= 1 ? Math.floor(Number(opts.attempts)) : 1;
317
+ const backoffBaseMs = Number.isFinite(Number(opts.backoffBaseMs)) && Number(opts.backoffBaseMs) >= 0 ? Number(opts.backoffBaseMs) : 0;
318
+ const timeoutMs = Number.isFinite(Number(opts.timeoutMs)) && Number(opts.timeoutMs) > 0 ? Number(opts.timeoutMs) : 0;
319
+ let lastErr = null;
320
+ for (let attempt = 1; attempt <= attempts; attempt++) {
321
+ let signal;
322
+ let timer = null;
323
+ let timedOut = false;
324
+ const timeoutMessage = `${opts.label} timed out after ${Math.round(timeoutMs / 1000)}s`;
325
+ if (timeoutMs > 0) {
326
+ const controller = new AbortController();
327
+ signal = controller.signal;
328
+ timer = setTimeout(() => {
329
+ timedOut = true;
330
+ controller.abort(new Error(timeoutMessage));
331
+ }, timeoutMs);
332
+ }
333
+ try {
334
+ const candles = await fetchRange(opts.gte, opts.lte, opts.window, signal);
335
+ return { candles, attempts: attempt };
336
+ }
337
+ catch (err) {
338
+ lastErr = timedOut && (err?.name === 'AbortError' || err?.message === timeoutMessage)
339
+ ? new Error(timeoutMessage)
340
+ : err;
341
+ if (attempt < attempts) {
342
+ const backoffMs = backoffBaseMs * attempt;
343
+ try {
344
+ opts.onRetry?.({ attempt, attempts, backoffMs, error: lastErr, gte: opts.gte, lte: opts.lte });
345
+ }
346
+ catch (_) { /* logging must never fail the fetch */ }
347
+ if (backoffMs > 0)
348
+ await sleepMs(backoffMs);
349
+ }
350
+ }
351
+ finally {
352
+ if (timer)
353
+ clearTimeout(timer);
354
+ }
355
+ }
356
+ throw lastErr;
357
+ }
358
+ async function fetchRangeLogged(fetchRange, opts) {
359
+ const startMs = Date.now();
360
+ const label = `${opts.unit} ${opts.index}/${opts.total}`;
361
+ const { candles: raw, attempts } = await fetchRangeWithRetry(fetchRange, {
362
+ gte: opts.gte,
363
+ lte: opts.lte,
364
+ window: opts.window,
365
+ label,
366
+ attempts: opts.retry?.attempts,
367
+ backoffBaseMs: opts.retry?.backoffBaseMs,
368
+ timeoutMs: opts.retry?.timeoutMs,
369
+ onRetry: opts.retry?.onRetry,
370
+ });
371
+ // A fetcher may return { candles, complete: false } for a partial result
372
+ // (e.g. one swap direction failed). Partial candles are still merged
373
+ // into this run's output, but the caller must not persist them as full
374
+ // coverage — otherwise the missing side would never be re-queried.
375
+ const complete = !Array.isArray(raw) && raw?.complete === false ? false : true;
376
+ const candles = Array.isArray(raw) ? raw : (raw?.candles ?? []);
377
+ const attemptNote = attempts > 1 ? ` (attempt ${attempts})` : '';
378
+ const partialNote = complete ? '' : ' (partial — not cached)';
379
+ const note = opts.note ? `${opts.note}` : '';
380
+ console.log(formatWindowLine(opts.unit, opts.index, opts.total, opts.gte, opts.lte, `-> ${candles.length} candles (${((Date.now() - startMs) / 1000).toFixed(1)}s)${attemptNote}${partialNote}${note}`));
381
+ return { candles, complete };
382
+ }
383
+ function higherVolumeWins(existing, incoming) {
384
+ return incoming[5] > existing[5] ? incoming : existing;
385
+ }
386
+ /**
387
+ * Run windows with bucket-level reuse. `windows` entries are
388
+ * `{ index, gte, lte, file }` (1-based index). Returns merged candles.
389
+ *
390
+ * Fetch policy per window: exact reuse when nothing is missing, sub-range
391
+ * queries merged over local when gaps are small (and `allowSubFetch`), else
392
+ * one full-window fetch merged over local. Fresh data wins collisions by
393
+ * volume/count, output is clamped to the window and sorted. A window whose
394
+ * fetch reports partial (`{ candles, complete: false }`) is merged into
395
+ * this run's output but NOT persisted, so the missing side is re-queried
396
+ * on the next run instead of being baked in as gap-filled zeros.
397
+ */
398
+ async function runCachedWindows(opts) {
399
+ const { windows, outPath, requestKey, isMatch, metaForWindow, fetchRange, bucketMs } = opts;
400
+ const allowSubFetch = opts.allowSubFetch !== false;
401
+ const nowMs = opts.nowMs != null ? opts.nowMs : Date.now();
402
+ const total = windows.length;
403
+ const retry = {
404
+ attempts: opts.fetchAttempts,
405
+ backoffBaseMs: opts.fetchBackoffBaseMs,
406
+ timeoutMs: opts.fetchTimeoutMs,
407
+ onRetry: opts.onFetchRetry,
408
+ };
409
+ const localCache = loadBucketCache(outPath, requestKey, isMatch);
410
+ if (localCache.files > 0) {
411
+ console.log(` Local cache: ${localCache.files} chunk files, ${localCache.byTs.size} buckets — fetching only what is missing`);
412
+ }
413
+ let merged = [];
414
+ for (const windowEntry of windows) {
415
+ const tag = formatWindowLine('Chunk', windowEntry.index, total, windowEntry.gte, windowEntry.lte);
416
+ const gteMs = Date.parse(String(windowEntry.gte));
417
+ const lteMs = Date.parse(String(windowEntry.lte));
418
+ // Exact-match fast path: chunk file already holds this exact range.
419
+ const exact = readCacheChunk(windowEntry.file, requestKey, isMatch);
420
+ if (exact && exact.rangeGte === gteMs && exact.rangeLte === lteMs) {
421
+ console.log(`${tag} (cached ${exact.candles.length} candles)`);
422
+ merged = merged.length === 0
423
+ ? exact.candles
424
+ : mergeCandles(merged, exact.candles, { onCollision: higherVolumeWins });
425
+ continue;
426
+ }
427
+ const plan = planWindowReuse(localCache, {
428
+ gteMs, lteMs, bucketMs,
429
+ isTail: windowEntry.index === total,
430
+ allowSubFetch, nowMs,
431
+ });
432
+ const { reusable, missing, missingHours, windowHours, inputsValid } = plan;
433
+ const reusableNote = reusable.length > 0 ? `, ${reusable.length} buckets local` : '';
434
+ if (inputsValid && missing.length === 0 && (reusable.length > 0 || localCache.files > 0)) {
435
+ console.log(`${tag} (reused ${reusable.length} local buckets, nothing missing)`);
436
+ persistCacheChunk(windowEntry.file, { ...metaForWindow(windowEntry), fetchedAt: new Date().toISOString(), queriedRanges: priorQueriedInWindow(windowEntry.file, requestKey, isMatch, gteMs, lteMs) }, reusable);
437
+ merged = merged.length === 0
438
+ ? reusable
439
+ : mergeCandles(merged, reusable, { onCollision: higherVolumeWins });
440
+ continue;
441
+ }
442
+ let candles;
443
+ let queriedRanges;
444
+ // A partial sub-range makes the whole window partial: gap-filled
445
+ // buckets from the surviving side would otherwise claim coverage
446
+ // the failed side never earned, baking the skew into the cache.
447
+ let windowComplete = true;
448
+ if (allowSubFetch && reusable.length > 0 && missing.length > 0 && missingHours <= windowHours / 2 && missing.length <= 3) {
449
+ // Small gaps: query only the missing sub-ranges, merge over local.
450
+ console.log(`${tag} (local cover${reusableNote}; fetching ${missingHours}h in ${missing.length} sub-range(s))`);
451
+ let mergedLocal = reusable.slice();
452
+ for (const m of missing) {
453
+ // Extend lte past the final bucket start: the ES range is
454
+ // inclusive and m.lte is a bucket *start*, so without this
455
+ // the bucket's real trades are cut off and the gap-filler
456
+ // freezes it as a zero-volume candle. Over-fetch is safe —
457
+ // merged output is clamped to the window below.
458
+ const part = await fetchRangeLogged(fetchRange, { unit: 'Chunk', index: windowEntry.index, total, gte: new Date(m.gte).toISOString(), lte: new Date(m.lte + bucketMs).toISOString(), window: windowEntry, retry });
459
+ if (!part.complete)
460
+ windowComplete = false;
461
+ mergedLocal = mergeCandles(mergedLocal, part.candles, { onCollision: higherVolumeWins });
462
+ }
463
+ // Clamp to the window (drops the one-bucket over-fetch above).
464
+ candles = mergedLocal.filter((c) => Number(c[0]) >= gteMs && Number(c[0]) <= lteMs);
465
+ // Claimed coverage is the canonical missing ranges (a conservative
466
+ // subset of what was actually queried with the +1-bucket overlap),
467
+ // plus previously-proven in-window coverage surviving the rewrite.
468
+ queriedRanges = missing.map((m) => ({ gte: m.gte, lte: m.lte }))
469
+ .concat(priorQueriedInWindow(windowEntry.file, requestKey, isMatch, gteMs, lteMs));
470
+ }
471
+ else {
472
+ if (reusable.length > 0) {
473
+ console.log(`${tag} (local cover${reusableNote}; gap too large — full window fetch)`);
474
+ }
475
+ const fresh = await fetchRangeLogged(fetchRange, { unit: 'Chunk', index: windowEntry.index, total, gte: windowEntry.gte, lte: windowEntry.lte, window: windowEntry, retry });
476
+ if (!fresh.complete)
477
+ windowComplete = false;
478
+ candles = reusable.length > 0
479
+ ? mergeCandles(reusable, fresh.candles, { onCollision: higherVolumeWins }).filter((c) => Number(c[0]) >= gteMs && Number(c[0]) <= lteMs).sort((a, b) => a[0] - b[0])
480
+ : fresh.candles;
481
+ queriedRanges = [{ gte: gteMs, lte: lteMs }];
482
+ }
483
+ if (windowComplete) {
484
+ persistCacheChunk(windowEntry.file, { ...metaForWindow(windowEntry), fetchedAt: new Date().toISOString(), queriedRanges }, candles);
485
+ }
486
+ else {
487
+ console.log(`${tag} (partial — kept for this run, not cached; will re-query next run)`);
488
+ }
489
+ merged = merged.length === 0
490
+ ? candles
491
+ : mergeCandles(merged, candles, { onCollision: higherVolumeWins });
492
+ }
493
+ const removed = cleanupOrphanCacheChunks(outPath, requestKey, isMatch, new Set(windows.map((w) => path.resolve(w.file))));
494
+ if (removed.length > 0) {
495
+ console.log(` Cleaned ${removed.length} orphan chunk file(s): ${removed.map((f) => path.basename(f)).join(', ')}`);
496
+ }
497
+ return merged;
498
+ }
499
+ export { TAIL_REFRESH_HOURS, IMMUTABLE_WINDOW_AGE_MS, siblingChunkFiles, chunkPathFor, readCacheChunk, priorQueriedInWindow, loadBucketCache, cachedCandlesInRange, addUtcMonths, normalizeDateInput, buildFetchWindowsFromRange, findMissingBucketRanges, pruneImmutableGaps, persistCacheChunk, cleanupOrphanCacheChunks, planWindowReuse, formatWindowLine, fetchRangeLogged, fetchRangeWithRetry, runCachedWindows, };
500
+ //# sourceMappingURL=window_cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window_cache.js","sourceRoot":"","sources":["../../../market_adapter/inputs/window_cache.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  declare function toIntervalLabel(intervalSeconds: any): string;
2
- export { toIntervalLabel };
2
+ /**
3
+ * Filename-safe slug: lowercase, non-alphanumerics collapsed to a single
4
+ * underscore, no leading/trailing underscores. Single home for the helper
5
+ * previously copied into fetch_lp_data.ts, kibana_feed_source.ts,
6
+ * fetch_book_data.ts and scripts/tv.ts.
7
+ */
8
+ declare function slugPart(value: any): string;
9
+ export { toIntervalLabel, slugPart };
3
10
  //# sourceMappingURL=interval_utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interval_utils.d.ts","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAEA,iBAAS,eAAe,CAAC,eAAe,EAAE,GAAG,UAK5C;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"interval_utils.d.ts","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAEA,iBAAS,eAAe,CAAC,eAAe,EAAE,GAAG,UAK5C;AAED;;;;;GAKG;AACH,iBAAS,QAAQ,CAAC,KAAK,EAAE,GAAG,UAM3B;AAED,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
@@ -8,5 +8,18 @@ function toIntervalLabel(intervalSeconds) {
8
8
  return `${intervalSeconds / 60}m`;
9
9
  return `${intervalSeconds}s`;
10
10
  }
11
- export { toIntervalLabel };
11
+ /**
12
+ * Filename-safe slug: lowercase, non-alphanumerics collapsed to a single
13
+ * underscore, no leading/trailing underscores. Single home for the helper
14
+ * previously copied into fetch_lp_data.ts, kibana_feed_source.ts,
15
+ * fetch_book_data.ts and scripts/tv.ts.
16
+ */
17
+ function slugPart(value) {
18
+ return String(value || '')
19
+ .trim()
20
+ .toLowerCase()
21
+ .replace(/[^a-z0-9]+/g, '_')
22
+ .replace(/^_+|_+$/g, '') || 'unknown';
23
+ }
24
+ export { toIntervalLabel, slugPart };
12
25
  //# sourceMappingURL=interval_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interval_utils.js","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,SAAS,eAAe,CAAC,eAAoB;IACzC,IAAI,eAAe,GAAG,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,CAAC;IACxE,IAAI,eAAe,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,IAAI,GAAG,CAAC;IACtE,IAAI,eAAe,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,EAAE,GAAG,CAAC;IAClE,OAAO,GAAG,eAAe,GAAG,CAAC;AACjC,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"interval_utils.js","sourceRoot":"","sources":["../../market_adapter/interval_utils.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,SAAS,eAAe,CAAC,eAAoB;IACzC,IAAI,eAAe,GAAG,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,CAAC;IACxE,IAAI,eAAe,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,IAAI,GAAG,CAAC;IACtE,IAAI,eAAe,GAAG,EAAE,KAAK,CAAC;QAAE,OAAO,GAAG,eAAe,GAAG,EAAE,GAAG,CAAC;IAClE,OAAO,GAAG,eAAe,GAAG,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,KAAU;IACxB,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACrB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AAC9C,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}
@@ -62,6 +62,7 @@
62
62
  * "weightDistribution": { "sell": 1, "buy": 1 },
63
63
  * "botFunds": { "sell": "100%", "buy": "100%" },
64
64
  * "activeOrders": { "sell": 20, "buy": 20 },
65
+ * "reserveOrders": { "buy": 0, "sell": 0 }, // Edge reserves: extra live orders (buy: floor, sell: ceiling)
65
66
  * "debtPolicy": "ignore", // Debt policy: "ignore", "warn", or "block"
66
67
  * "min_BTS_value": 0, // Minimum BTS value threshold for operations
67
68
  * }
@@ -1 +1 @@
1
- {"version":3,"file":"account_bots.d.ts","sourceRoot":"","sources":["../../modules/account_bots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFG;AAUH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA0gBhE;;;;;GAKG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAetE;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD;AAmWD;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,IAAI,KAAK,OAkBnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,iBAAe,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,SAAQ,EAAE,KAAK,UAAQ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D5I;AAgUD;;;GAGG;AACH,iBAAe,IAAI,kBAsGlB;AAED,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"account_bots.d.ts","sourceRoot":"","sources":["../../modules/account_bots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAUH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA4gBhE;;;;;GAKG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAetE;AAED;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvD;AAmWD;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,IAAI,KAAK,OAoBnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,iBAAe,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,SAAQ,EAAE,KAAK,UAAQ,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D5I;AAqUD;;;GAGG;AACH,iBAAe,IAAI,kBAwGlB;AAED,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA"}