dexbot 1.4.18 → 1.4.19

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 (50) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -0
  3. package/analysis/ama_fitting/package.json +1 -1
  4. package/analysis/trend_detection/package.json +1 -1
  5. package/claw/package.json +1 -1
  6. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  7. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  8. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  9. package/dist/modules/account_bots.d.ts +1 -0
  10. package/dist/modules/account_bots.d.ts.map +1 -1
  11. package/dist/modules/account_bots.js +27 -5
  12. package/dist/modules/account_bots.js.map +1 -1
  13. package/dist/modules/constants.d.ts +1 -0
  14. package/dist/modules/constants.d.ts.map +1 -1
  15. package/dist/modules/constants.js +12 -3
  16. package/dist/modules/constants.js.map +1 -1
  17. package/dist/modules/dexbot_class.d.ts +22 -0
  18. package/dist/modules/dexbot_class.d.ts.map +1 -1
  19. package/dist/modules/dexbot_class.js +27 -1
  20. package/dist/modules/dexbot_class.js.map +1 -1
  21. package/dist/modules/dexbot_cow_runtime.d.ts +48 -1
  22. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  23. package/dist/modules/dexbot_cow_runtime.js +168 -4
  24. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  25. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  26. package/dist/modules/order/grid_reconcile_internal.js +6 -27
  27. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  28. package/dist/modules/order/strategy.d.ts.map +1 -1
  29. package/dist/modules/order/strategy.js +6 -15
  30. package/dist/modules/order/strategy.js.map +1 -1
  31. package/dist/modules/order/utils/math.d.ts +29 -1
  32. package/dist/modules/order/utils/math.d.ts.map +1 -1
  33. package/dist/modules/order/utils/math.js +46 -1
  34. package/dist/modules/order/utils/math.js.map +1 -1
  35. package/dist/modules/order/utils/system.d.ts +2 -0
  36. package/dist/modules/order/utils/system.d.ts.map +1 -1
  37. package/dist/modules/order/utils/system.js +30 -2
  38. package/dist/modules/order/utils/system.js.map +1 -1
  39. package/dist/modules/runtime_settings.d.ts +1 -0
  40. package/dist/modules/runtime_settings.d.ts.map +1 -1
  41. package/dist/modules/runtime_settings.js +13 -2
  42. package/dist/modules/runtime_settings.js.map +1 -1
  43. package/docs/DEXBOT_COMPARISON.md +3 -3
  44. package/docs/EVOLUTION.md +26 -96
  45. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
  46. package/docs/LIFECYCLE.md +207 -0
  47. package/docs/README.md +9 -1
  48. package/docs/developer_guide.md +4 -3
  49. package/package.json +2 -1
  50. package/scripts/repo-stats.html +0 -480
@@ -1,480 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>DEXBot2 Repository Statistics</title>
7
- <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
8
- <style>
9
- * {
10
- margin: 0;
11
- padding: 0;
12
- box-sizing: border-box;
13
- }
14
- body {
15
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
17
- min-height: 100vh;
18
- padding: 40px 20px;
19
- }
20
- .container {
21
- max-width: 1400px;
22
- margin: 0 auto;
23
- }
24
- .header {
25
- text-align: center;
26
- color: white;
27
- margin-bottom: 40px;
28
- }
29
- .header h1 {
30
- font-size: 3em;
31
- margin-bottom: 10px;
32
- text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
33
- }
34
- .header p {
35
- font-size: 1.3em;
36
- opacity: 0.9;
37
- }
38
- .stats-grid {
39
- display: grid;
40
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
41
- gap: 20px;
42
- margin-bottom: 40px;
43
- }
44
- .stat-card {
45
- background: white;
46
- border-radius: 12px;
47
- padding: 25px;
48
- box-shadow: 0 10px 30px rgba(0,0,0,0.2);
49
- text-align: center;
50
- }
51
- .stat-card h3 {
52
- color: #667eea;
53
- font-size: 1.1em;
54
- text-transform: uppercase;
55
- margin-bottom: 10px;
56
- letter-spacing: 1px;
57
- font-weight: 600;
58
- }
59
- .stat-card .value {
60
- font-size: 3em;
61
- font-weight: bold;
62
- color: #333;
63
- }
64
- .stat-card.added .value { color: #10b981; }
65
- .stat-card.deleted .value { color: #ef4444; }
66
- .stat-card.total .value { color: #667eea; }
67
- .chart-container {
68
- background: white;
69
- border-radius: 12px;
70
- padding: 30px;
71
- box-shadow: 0 10px 30px rgba(0,0,0,0.2);
72
- margin-bottom: 40px;
73
- }
74
- .chart-container h2 {
75
- color: #333;
76
- margin-bottom: 30px;
77
- font-size: 1.8em;
78
- text-align: center;
79
- font-weight: 600;
80
- }
81
- .chart-wrapper {
82
- position: relative;
83
- height: 600px;
84
- }
85
- .footer {
86
- text-align: center;
87
- color: white;
88
- margin-top: 40px;
89
- font-size: 1.1em;
90
- opacity: 0.8;
91
- }
92
- @media (max-width: 768px) {
93
- .header h1 {
94
- font-size: 1.8em;
95
- }
96
- .chart-wrapper {
97
- height: 400px;
98
- }
99
- }
100
- </style>
101
- </head>
102
- <body>
103
- <div class="container">
104
- <div class="header">
105
- <h1>📊 DEXBot2 Repository Statistics</h1>
106
- <p>Lines Added vs Deleted Analysis</p>
107
- </div>
108
-
109
- <div class="stats-grid">
110
- <div class="stat-card added">
111
- <h3>Lines Added</h3>
112
- <div class="value">81.780</div>
113
- </div>
114
- <div class="stat-card deleted">
115
- <h3>Lines Deleted</h3>
116
- <div class="value">53.747</div>
117
- </div>
118
- <div class="stat-card total">
119
- <h3>Total Changes</h3>
120
- <div class="value">135.527</div>
121
- </div>
122
- <div class="stat-card total">
123
- <h3>Commits Analyzed</h3>
124
- <div class="value">999</div>
125
- </div>
126
- </div>
127
-
128
- <div class="chart-container">
129
- <h2>➕➖ Added vs Deleted by File</h2>
130
- <div class="chart-wrapper">
131
- <canvas id="addDelChart"></canvas>
132
- </div>
133
- </div>
134
-
135
- <div class="chart-container">
136
- <h2>📈 Changes Over Time (Daily)</h2>
137
- <div class="chart-wrapper" style="height: 400px;">
138
- <canvas id="timeChart"></canvas>
139
- </div>
140
- </div>
141
-
142
- <div class="chart-container">
143
- <h2>📊 Cumulative Changes Over Time</h2>
144
- <div class="chart-wrapper" style="height: 400px;">
145
- <canvas id="cumulativeChart"></canvas>
146
- </div>
147
- </div>
148
-
149
- <div class="chart-container">
150
- <h2>📝 Total Net Lines Over Time</h2>
151
- <div class="chart-wrapper" style="height: 400px;">
152
- <canvas id="netLinesChart"></canvas>
153
- </div>
154
- </div>
155
-
156
- <div class="footer">
157
- <p>Generated on 3.3.2026, 23:52:19 | DEXBot2 Repository Analysis</p>
158
- </div>
159
- </div>
160
-
161
- <script>
162
- // Chart: Added vs Deleted stacked bar
163
- const ctx = document.getElementById('addDelChart').getContext('2d');
164
- const chart = new Chart(ctx, {
165
- type: 'bar',
166
- data: {
167
- labels: ["modules/order/manager.js","modules/dexbot_class.js","modules/order/utils.js","modules/order/grid.js","modules/order/strategy.js","dexbot.js","modules/order/accounting.js","modules/order/startup_reconcile.js","modules/order/sync_engine.js","modules/account_bots.js","bot.js","README.md","modules/account_orders.js","modules/chain_orders.js","modules/constants.js","scripts/analyze-orders.js","modules/order/logger.js","modules/order/utils/system.js","pm2.js","modules/order/utils/helpers.js","modules/order/utils/order.js","modules/order/utils/math.js","scripts/repo-stats.html","modules/order/fund_snapshot.js","scripts/analyze-repo-stats.js","modules/chain_keys.js","modules/order/fund_snapshot_persistence.js","scripts/update.sh","scripts/update-dev.sh","modules/bot_instance.js","modules/order/price.js","scripts/analyze_fund_snapshots.js","modules/order/format.js","modules/order/order_grid.js","modules/node_manager.js","modules/bot.js","scripts/update.js","scripts/generate-pm2-config.js","modules/account_keys.js","modules/order/runner.js","scripts/README.md","modules/order/export.js","scripts/watch-all-changes.sh","modules/order/working_grid.js","credential-daemon.js","scripts/validate_bots.js","modules/order/utils/validate.js","modules/order/legacy-testing.js","modules/legacy-testing.js","scripts/check-update.sh","scripts/sync.sh","modules/bitshares_client.js","modules/order/utils/strategy_logic.js","modules/order/async_lock.js","modules/indexdb.js","modules/order/utils/grid_indexes.js","modules/order/utils/order_comparison.js","scripts/{watch-all-changes.sh => git-viewer.sh}","modules/order/logger_state.js","modules/bots_file_lock.js","scripts/pmain.sh","scripts/clear-orders.sh","scripts/bootstrap-profiles.js","modules/graceful_shutdown.js","scripts/divergence-calc.js","modules/order/constants.js","unlock-start.js","scripts/print_grid.js","scripts/clear-all.sh","modules/order/index.js","modules/btsdex_event_patch.js","scripts/migrate_pending_proceeds.js","scripts/clear-logs.sh","scripts/cleanup-temp-files.js","scripts/dev-install.sh","jest.config.js","scripts/setup-aliases.sh","modules/general_settings.js","scripts/create-bot-symlinks.sh","scripts/pdev.sh","scripts/ptest.sh","modules/{indexdb.js => account_orders.js}","modules/{account_keys.js => chain_keys.js}","modules/{account_orders.js => chain_orders.js}","modules/{ => order}/legacy-testing.js","scripts/bots","scripts/keys","modules/order/utils/{helpers.js => validate.js}","scripts/dexbot","scripts/pm2","scripts/{analyze-repo-stats.js => analyze-git.js}","modules/{order => }/constants.js"],
168
- datasets: [
169
- {
170
- label: '➕ Added',
171
- data: [10905,10679,6676,7197,6299,2748,2673,2699,2361,1984,1391,1335,1597,1117,1132,1267,996,1173,1023,1132,1202,1143,480,468,853,571,431,414,386,315,283,271,395,231,455,220,370,192,362,248,290,336,336,273,282,222,224,0,284,265,126,196,113,211,222,108,97,165,184,170,111,141,84,153,143,124,157,117,138,106,129,67,109,63,69,35,59,56,50,38,26,7,6,3,2,3,3,1,1,1,0,0],
172
- backgroundColor: '#10b981',
173
- borderRadius: 4,
174
- borderSkipped: false
175
- },
176
- {
177
- label: '🔴 Deleted',
178
- data: [9389,7524,6760,5443,5864,1912,1736,1374,1302,789,1168,1036,495,684,456,241,509,273,403,271,94,114,480,468,24,299,431,414,386,315,283,271,76,231,0,220,53,192,0,107,58,10,0,35,19,67,63,284,0,16,126,40,113,11,0,108,97,28,4,16,66,32,84,12,20,36,0,33,0,31,7,67,24,63,24,35,0,0,0,0,0,16,8,4,2,0,0,1,0,0,0,0],
179
- backgroundColor: '#ef4444',
180
- borderRadius: 4,
181
- borderSkipped: false
182
- }
183
- ]
184
- },
185
- options: {
186
- indexAxis: 'y',
187
- responsive: true,
188
- maintainAspectRatio: false,
189
- scales: {
190
- x: {
191
- stacked: true,
192
- beginAtZero: true,
193
- ticks: {
194
- font: { size: 14 }
195
- }
196
- },
197
- y: {
198
- stacked: true,
199
- ticks: {
200
- font: { size: 14 }
201
- }
202
- }
203
- },
204
- plugins: {
205
- legend: {
206
- position: 'top',
207
- labels: {
208
- usePointStyle: true,
209
- padding: 20,
210
- font: { size: 15 }
211
- }
212
- },
213
- tooltip: {
214
- callbacks: {
215
- label: function(context) {
216
- let label = context.dataset.label || '';
217
- if (label) {
218
- label += ': ';
219
- }
220
- if (context.parsed.x !== null) {
221
- label += context.parsed.x.toLocaleString();
222
- }
223
- return label;
224
- }
225
- }
226
- }
227
- }
228
- }
229
- });
230
-
231
- // Chart: Changes over time
232
- const ctxTime = document.getElementById('timeChart').getContext('2d');
233
- const timeChart = new Chart(ctxTime, {
234
- type: 'line',
235
- data: {
236
- labels: ["2025-12-02","2025-12-03","2025-12-04","2025-12-05","2025-12-06","2025-12-07","2025-12-08","2025-12-09","2025-12-10","2025-12-11","2025-12-12","2025-12-13","2025-12-14","2025-12-15","2025-12-16","2025-12-17","2025-12-18","2025-12-19","2025-12-20","2025-12-21","2025-12-22","2025-12-23","2025-12-24","2025-12-25","2025-12-26","2025-12-27","2025-12-28","2025-12-29","2025-12-30","2025-12-31","2026-01-01","2026-01-02","2026-01-03","2026-01-04","2026-01-05","2026-01-06","2026-01-07","2026-01-08","2026-01-09","2026-01-10","2026-01-11","2026-01-12","2026-01-13","2026-01-14","2026-01-15","2026-01-16","2026-01-17","2026-01-18","2026-01-19","2026-01-20","2026-01-21","2026-01-22","2026-01-23","2026-01-24","2026-01-25","2026-01-26","2026-01-27","2026-01-28","2026-01-29","2026-01-30","2026-01-31","2026-02-01","2026-02-02","2026-02-03","2026-02-04","2026-02-05","2026-02-06","2026-02-07","2026-02-08","2026-02-09","2026-02-14","2026-02-15","2026-02-16","2026-02-17","2026-02-18","2026-02-19","2026-02-20","2026-02-21","2026-02-22","2026-02-23","2026-02-25","2026-02-26","2026-02-27","2026-02-28","2026-03-01","2026-03-02","2026-03-03"],
237
- datasets: [
238
- {
239
- label: '➕ Added',
240
- data: [3509,797,2629,1569,552,1167,287,1641,934,734,1843,349,549,311,659,813,826,710,241,20,836,1978,212,2,624,971,1058,853,1263,748,782,4258,716,2393,800,906,564,1812,636,1807,1916,1551,302,688,1608,723,4,4,68,600,664,913,2707,135,1108,425,348,783,0,193,197,1728,2681,208,311,2468,241,2207,831,1771,3520,566,2083,1757,102,99,103,296,13,825,407,0,539,331,165,202,30],
241
- borderColor: '#10b981',
242
- backgroundColor: 'rgba(16, 185, 129, 0.1)',
243
- borderWidth: 2,
244
- fill: false,
245
- tension: 0.3,
246
- pointRadius: 3,
247
- pointBackgroundColor: '#10b981'
248
- },
249
- {
250
- label: '🔴 Deleted',
251
- data: [278,182,596,1806,93,607,211,123,502,171,645,58,173,94,331,259,309,241,203,4,578,1899,194,303,166,832,593,160,413,1069,316,3883,219,4656,817,543,820,409,334,1258,1114,751,208,792,1348,1272,27,27,30,135,63,874,2743,135,573,238,268,699,0,111,71,517,841,137,156,3292,62,1396,383,384,2671,570,2025,1067,287,98,36,350,3,241,478,0,560,108,23,169,66],
252
- borderColor: '#ef4444',
253
- backgroundColor: 'rgba(239, 68, 68, 0.1)',
254
- borderWidth: 2,
255
- fill: false,
256
- tension: 0.3,
257
- pointRadius: 3,
258
- pointBackgroundColor: '#ef4444'
259
- },
260
- {
261
- label: '📊 Total Edits',
262
- data: [3787,979,3225,3375,645,1774,498,1764,1436,905,2488,407,722,405,990,1072,1135,951,444,24,1414,3877,406,305,790,1803,1651,1013,1676,1817,1098,8141,935,7049,1617,1449,1384,2221,970,3065,3030,2302,510,1480,2956,1995,31,31,98,735,727,1787,5450,270,1681,663,616,1482,0,304,268,2245,3522,345,467,5760,303,3603,1214,2155,6191,1136,4108,2824,389,197,139,646,16,1066,885,0,1099,439,188,371,96],
263
- borderColor: '#667eea',
264
- backgroundColor: 'rgba(102, 126, 234, 0.1)',
265
- borderWidth: 2,
266
- fill: false,
267
- tension: 0.3,
268
- pointRadius: 3,
269
- pointBackgroundColor: '#667eea',
270
- borderDash: [5, 5]
271
- }
272
- ]
273
- },
274
- options: {
275
- responsive: true,
276
- maintainAspectRatio: false,
277
- plugins: {
278
- legend: {
279
- position: 'top',
280
- labels: {
281
- usePointStyle: true,
282
- padding: 20,
283
- font: { size: 15 }
284
- }
285
- },
286
- tooltip: {
287
- callbacks: {
288
- label: function(context) {
289
- let label = context.dataset.label || '';
290
- if (label) {
291
- label += ': ';
292
- }
293
- if (context.parsed.y !== null) {
294
- label += context.parsed.y.toLocaleString();
295
- }
296
- return label;
297
- }
298
- }
299
- }
300
- },
301
- scales: {
302
- x: {
303
- ticks: {
304
- font: { size: 13 }
305
- }
306
- },
307
- y: {
308
- beginAtZero: true,
309
- ticks: {
310
- font: { size: 13 }
311
- }
312
- }
313
- }
314
- }
315
- });
316
-
317
- // Chart: Cumulative changes over time
318
- const ctxCumulative = document.getElementById('cumulativeChart').getContext('2d');
319
- const cumulativeChart = new Chart(ctxCumulative, {
320
- type: 'line',
321
- data: {
322
- labels: ["2025-12-02","2025-12-03","2025-12-04","2025-12-05","2025-12-06","2025-12-07","2025-12-08","2025-12-09","2025-12-10","2025-12-11","2025-12-12","2025-12-13","2025-12-14","2025-12-15","2025-12-16","2025-12-17","2025-12-18","2025-12-19","2025-12-20","2025-12-21","2025-12-22","2025-12-23","2025-12-24","2025-12-25","2025-12-26","2025-12-27","2025-12-28","2025-12-29","2025-12-30","2025-12-31","2026-01-01","2026-01-02","2026-01-03","2026-01-04","2026-01-05","2026-01-06","2026-01-07","2026-01-08","2026-01-09","2026-01-10","2026-01-11","2026-01-12","2026-01-13","2026-01-14","2026-01-15","2026-01-16","2026-01-17","2026-01-18","2026-01-19","2026-01-20","2026-01-21","2026-01-22","2026-01-23","2026-01-24","2026-01-25","2026-01-26","2026-01-27","2026-01-28","2026-01-29","2026-01-30","2026-01-31","2026-02-01","2026-02-02","2026-02-03","2026-02-04","2026-02-05","2026-02-06","2026-02-07","2026-02-08","2026-02-09","2026-02-14","2026-02-15","2026-02-16","2026-02-17","2026-02-18","2026-02-19","2026-02-20","2026-02-21","2026-02-22","2026-02-23","2026-02-25","2026-02-26","2026-02-27","2026-02-28","2026-03-01","2026-03-02","2026-03-03"],
323
- datasets: [
324
- {
325
- label: '📈 Total Added (Cumulative)',
326
- data: [3509,4306,6935,8504,9056,10223,10510,12151,13085,13819,15662,16011,16560,16871,17530,18343,19169,19879,20120,20140,20976,22954,23166,23168,23792,24763,25821,26674,27937,28685,29467,33725,34441,36834,37634,38540,39104,40916,41552,43359,45275,46826,47128,47816,49424,50147,50151,50155,50223,50823,51487,52400,55107,55242,56350,56775,57123,57906,57906,58099,58296,60024,62705,62913,63224,65692,65933,68140,68971,70742,74262,74828,76911,78668,78770,78869,78972,79268,79281,80106,80513,80513,81052,81383,81548,81750,81780],
327
- borderColor: '#10b981',
328
- backgroundColor: 'rgba(16, 185, 129, 0.15)',
329
- borderWidth: 3,
330
- fill: true,
331
- tension: 0.3,
332
- pointRadius: 3,
333
- pointBackgroundColor: '#10b981',
334
- pointBorderColor: '#fff',
335
- pointBorderWidth: 2
336
- },
337
- {
338
- label: '📉 Total Deleted (Cumulative)',
339
- data: [278,460,1056,2862,2955,3562,3773,3896,4398,4569,5214,5272,5445,5539,5870,6129,6438,6679,6882,6886,7464,9363,9557,9860,10026,10858,11451,11611,12024,13093,13409,17292,17511,22167,22984,23527,24347,24756,25090,26348,27462,28213,28421,29213,30561,31833,31860,31887,31917,32052,32115,32989,35732,35867,36440,36678,36946,37645,37645,37756,37827,38344,39185,39322,39478,42770,42832,44228,44611,44995,47666,48236,50261,51328,51615,51713,51749,52099,52102,52343,52821,52821,53381,53489,53512,53681,53747],
340
- borderColor: '#ef4444',
341
- backgroundColor: 'rgba(239, 68, 68, 0.15)',
342
- borderWidth: 3,
343
- fill: true,
344
- tension: 0.3,
345
- pointRadius: 3,
346
- pointBackgroundColor: '#ef4444',
347
- pointBorderColor: '#fff',
348
- pointBorderWidth: 2
349
- },
350
- {
351
- label: '🎯 Total Edits (Cumulative)',
352
- data: [3787,4766,7991,11366,12011,13785,14283,16047,17483,18388,20876,21283,22005,22410,23400,24472,25607,26558,27002,27026,28440,32317,32723,33028,33818,35621,37272,38285,39961,41778,42876,51017,51952,59001,60618,62067,63451,65672,66642,69707,72737,75039,75549,77029,79985,81980,82011,82042,82140,82875,83602,85389,90839,91109,92790,93453,94069,95551,95551,95855,96123,98368,101890,102235,102702,108462,108765,112368,113582,115737,121928,123064,127172,129996,130385,130582,130721,131367,131383,132449,133334,133334,134433,134872,135060,135431,135527],
353
- borderColor: '#667eea',
354
- backgroundColor: 'transparent',
355
- borderWidth: 3,
356
- fill: false,
357
- tension: 0.3,
358
- pointRadius: 4,
359
- pointBackgroundColor: '#667eea',
360
- pointBorderColor: '#fff',
361
- pointBorderWidth: 2,
362
- borderDash: [5, 5]
363
- }
364
- ]
365
- },
366
- options: {
367
- responsive: true,
368
- maintainAspectRatio: false,
369
- plugins: {
370
- legend: {
371
- position: 'top',
372
- labels: {
373
- usePointStyle: true,
374
- padding: 20,
375
- font: { size: 15 }
376
- }
377
- },
378
- tooltip: {
379
- callbacks: {
380
- label: function(context) {
381
- let label = context.dataset.label || '';
382
- if (label) {
383
- label += ': ';
384
- }
385
- if (context.parsed.y !== null) {
386
- label += context.parsed.y.toLocaleString();
387
- }
388
- return label;
389
- }
390
- }
391
- }
392
- },
393
- scales: {
394
- x: {
395
- ticks: {
396
- font: { size: 13 }
397
- }
398
- },
399
- y: {
400
- beginAtZero: true,
401
- ticks: {
402
- font: { size: 11 },
403
- callback: function(value) {
404
- return value.toLocaleString();
405
- }
406
- }
407
- }
408
- }
409
- }
410
- });
411
-
412
- // Chart: Net lines over time
413
- const ctxNetLines = document.getElementById('netLinesChart').getContext('2d');
414
- const netLinesChart = new Chart(ctxNetLines, {
415
- type: 'line',
416
- data: {
417
- labels: ["2025-12-02","2025-12-03","2025-12-04","2025-12-05","2025-12-06","2025-12-07","2025-12-08","2025-12-09","2025-12-10","2025-12-11","2025-12-12","2025-12-13","2025-12-14","2025-12-15","2025-12-16","2025-12-17","2025-12-18","2025-12-19","2025-12-20","2025-12-21","2025-12-22","2025-12-23","2025-12-24","2025-12-25","2025-12-26","2025-12-27","2025-12-28","2025-12-29","2025-12-30","2025-12-31","2026-01-01","2026-01-02","2026-01-03","2026-01-04","2026-01-05","2026-01-06","2026-01-07","2026-01-08","2026-01-09","2026-01-10","2026-01-11","2026-01-12","2026-01-13","2026-01-14","2026-01-15","2026-01-16","2026-01-17","2026-01-18","2026-01-19","2026-01-20","2026-01-21","2026-01-22","2026-01-23","2026-01-24","2026-01-25","2026-01-26","2026-01-27","2026-01-28","2026-01-29","2026-01-30","2026-01-31","2026-02-01","2026-02-02","2026-02-03","2026-02-04","2026-02-05","2026-02-06","2026-02-07","2026-02-08","2026-02-09","2026-02-14","2026-02-15","2026-02-16","2026-02-17","2026-02-18","2026-02-19","2026-02-20","2026-02-21","2026-02-22","2026-02-23","2026-02-25","2026-02-26","2026-02-27","2026-02-28","2026-03-01","2026-03-02","2026-03-03"],
418
- datasets: [
419
- {
420
- label: '📝 Net Lines (Added - Deleted)',
421
- data: [3231,3846,5879,5642,6101,6661,6737,8255,8687,9250,10448,10739,11115,11332,11660,12214,12731,13200,13238,13254,13512,13591,13609,13308,13766,13905,14370,15063,15913,15592,16058,16433,16930,14667,14650,15013,14757,16160,16462,17011,17813,18613,18707,18603,18863,18314,18291,18268,18306,18771,19372,19411,19375,19375,19910,20097,20177,20261,20261,20343,20469,21680,23520,23591,23746,22922,23101,23912,24360,25747,26596,26592,26650,27340,27155,27156,27223,27169,27179,27763,27692,27692,27671,27894,28036,28069,28033],
422
- borderColor: '#8b5cf6',
423
- backgroundColor: 'rgba(139, 92, 246, 0.15)',
424
- borderWidth: 3,
425
- fill: true,
426
- tension: 0.3,
427
- pointRadius: 4,
428
- pointBackgroundColor: '#8b5cf6',
429
- pointBorderColor: '#fff',
430
- pointBorderWidth: 2
431
- }
432
- ]
433
- },
434
- options: {
435
- responsive: true,
436
- maintainAspectRatio: false,
437
- plugins: {
438
- legend: {
439
- position: 'top',
440
- labels: {
441
- usePointStyle: true,
442
- padding: 20,
443
- font: { size: 15 }
444
- }
445
- },
446
- tooltip: {
447
- callbacks: {
448
- label: function(context) {
449
- let label = context.dataset.label || '';
450
- if (label) {
451
- label += ': ';
452
- }
453
- if (context.parsed.y !== null) {
454
- label += context.parsed.y.toLocaleString();
455
- }
456
- return label;
457
- }
458
- }
459
- }
460
- },
461
- scales: {
462
- x: {
463
- ticks: {
464
- font: { size: 13 }
465
- }
466
- },
467
- y: {
468
- ticks: {
469
- font: { size: 13 },
470
- callback: function(value) {
471
- return value.toLocaleString();
472
- }
473
- }
474
- }
475
- }
476
- }
477
- });
478
- </script>
479
- </body>
480
- </html>