alvin-bot 5.7.0 → 5.8.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 (136) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/claude.js +1 -102
  3. package/dist/config.js +1 -96
  4. package/dist/engine.js +1 -90
  5. package/dist/find-claude-binary.js +1 -98
  6. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  7. package/dist/handlers/background-bypass.js +1 -75
  8. package/dist/handlers/commands.js +1 -2336
  9. package/dist/handlers/cron-progress.js +1 -52
  10. package/dist/handlers/document.js +1 -194
  11. package/dist/handlers/message.js +1 -959
  12. package/dist/handlers/photo.js +1 -154
  13. package/dist/handlers/platform-message.js +1 -360
  14. package/dist/handlers/stuck-timer.js +1 -54
  15. package/dist/handlers/video.js +1 -237
  16. package/dist/handlers/voice.js +1 -148
  17. package/dist/i18n.js +1 -805
  18. package/dist/index.js +1 -697
  19. package/dist/init-data-dir.js +1 -98
  20. package/dist/middleware/auth.js +1 -233
  21. package/dist/migrate.js +1 -162
  22. package/dist/paths.js +1 -146
  23. package/dist/platforms/discord.js +1 -175
  24. package/dist/platforms/index.js +1 -130
  25. package/dist/platforms/signal.js +1 -205
  26. package/dist/platforms/slack-slash-parser.js +1 -32
  27. package/dist/platforms/slack.js +1 -501
  28. package/dist/platforms/telegram.js +1 -111
  29. package/dist/platforms/types.js +1 -8
  30. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  31. package/dist/platforms/whatsapp.js +1 -707
  32. package/dist/providers/claude-sdk-provider.js +1 -565
  33. package/dist/providers/codex-cli-provider.js +1 -134
  34. package/dist/providers/index.js +1 -7
  35. package/dist/providers/ollama-provider.js +1 -32
  36. package/dist/providers/openai-compatible.js +1 -406
  37. package/dist/providers/registry.js +1 -352
  38. package/dist/providers/runtime-header.js +1 -45
  39. package/dist/providers/tool-executor.js +1 -475
  40. package/dist/providers/types.js +1 -227
  41. package/dist/services/access.js +1 -144
  42. package/dist/services/allowed-users-gate.js +1 -56
  43. package/dist/services/alvin-dispatch.js +1 -174
  44. package/dist/services/alvin-mcp-tools.js +1 -104
  45. package/dist/services/asset-index.js +1 -224
  46. package/dist/services/async-agent-parser.js +1 -418
  47. package/dist/services/async-agent-watcher.js +1 -583
  48. package/dist/services/auto-diagnostic.js +1 -228
  49. package/dist/services/broadcast.js +1 -52
  50. package/dist/services/browser-manager.js +1 -562
  51. package/dist/services/browser-webfetch.js +1 -127
  52. package/dist/services/browser.js +1 -121
  53. package/dist/services/cdp-bootstrap.js +1 -357
  54. package/dist/services/compaction.js +1 -144
  55. package/dist/services/critical-notify.js +1 -203
  56. package/dist/services/cron-resolver.js +1 -58
  57. package/dist/services/cron-scheduling.js +1 -310
  58. package/dist/services/cron.js +1 -861
  59. package/dist/services/custom-tools.js +1 -317
  60. package/dist/services/delivery-queue.js +1 -173
  61. package/dist/services/delivery-registry.js +1 -21
  62. package/dist/services/disk-cleanup.js +1 -203
  63. package/dist/services/elevenlabs.js +1 -58
  64. package/dist/services/embeddings/auto-detect.js +1 -74
  65. package/dist/services/embeddings/fts5.js +1 -108
  66. package/dist/services/embeddings/gemini.js +1 -65
  67. package/dist/services/embeddings/index.js +1 -496
  68. package/dist/services/embeddings/ollama.js +1 -78
  69. package/dist/services/embeddings/openai.js +1 -49
  70. package/dist/services/embeddings/provider.js +1 -22
  71. package/dist/services/embeddings/vector-base.js +1 -113
  72. package/dist/services/embeddings-migration.js +1 -193
  73. package/dist/services/embeddings.js +1 -9
  74. package/dist/services/env-file.js +1 -50
  75. package/dist/services/exec-guard.js +1 -71
  76. package/dist/services/fallback-order.js +1 -154
  77. package/dist/services/file-permissions.js +1 -93
  78. package/dist/services/heartbeat-file.js +1 -65
  79. package/dist/services/heartbeat.js +1 -313
  80. package/dist/services/hooks.js +1 -44
  81. package/dist/services/imagegen.js +1 -72
  82. package/dist/services/language-detect.js +1 -154
  83. package/dist/services/markdown.js +1 -63
  84. package/dist/services/mcp.js +1 -263
  85. package/dist/services/memory-extractor.js +1 -178
  86. package/dist/services/memory-inject-mode.js +1 -43
  87. package/dist/services/memory-layers.js +1 -156
  88. package/dist/services/memory.js +1 -146
  89. package/dist/services/ollama-manager.js +1 -339
  90. package/dist/services/permissions-wizard.js +1 -291
  91. package/dist/services/personality.js +1 -376
  92. package/dist/services/plugins.js +1 -171
  93. package/dist/services/preflight.js +1 -292
  94. package/dist/services/process-manager.js +1 -291
  95. package/dist/services/release-highlights.js +1 -79
  96. package/dist/services/reminders.js +1 -97
  97. package/dist/services/restart.js +1 -48
  98. package/dist/services/security-audit.js +1 -74
  99. package/dist/services/self-diagnosis.js +1 -272
  100. package/dist/services/self-search.js +1 -129
  101. package/dist/services/session-persistence.js +1 -237
  102. package/dist/services/session.js +1 -282
  103. package/dist/services/skills.js +1 -290
  104. package/dist/services/ssrf-guard.js +1 -162
  105. package/dist/services/standing-orders.js +1 -29
  106. package/dist/services/steer-channel.js +1 -46
  107. package/dist/services/stop-controller.js +1 -52
  108. package/dist/services/subagent-dedup.js +1 -86
  109. package/dist/services/subagent-delivery.js +1 -452
  110. package/dist/services/subagent-stats.js +1 -123
  111. package/dist/services/subagents.js +1 -814
  112. package/dist/services/sudo.js +1 -329
  113. package/dist/services/telegram.js +1 -158
  114. package/dist/services/timing-safe-bearer.js +1 -51
  115. package/dist/services/tool-discovery.js +1 -214
  116. package/dist/services/trends.js +1 -580
  117. package/dist/services/updater.js +1 -291
  118. package/dist/services/usage-tracker.js +1 -144
  119. package/dist/services/users.js +1 -271
  120. package/dist/services/voice.js +1 -104
  121. package/dist/services/watchdog-brake.js +1 -154
  122. package/dist/services/watchdog.js +1 -311
  123. package/dist/services/workspaces.js +1 -276
  124. package/dist/tui/index.js +1 -667
  125. package/dist/util/console-formatter.js +1 -109
  126. package/dist/util/debounce.js +1 -24
  127. package/dist/util/telegram-error-filter.js +1 -62
  128. package/dist/version.js +1 -24
  129. package/dist/web/bind-strategy.js +1 -42
  130. package/dist/web/canvas.js +1 -30
  131. package/dist/web/doctor-api.js +1 -604
  132. package/dist/web/openai-compat.js +1 -252
  133. package/dist/web/server.js +1 -1902
  134. package/dist/web/setup-api.js +1 -1101
  135. package/package.json +5 -2
  136. package/dist/.metadata_never_index +0 -0
@@ -1,123 +1 @@
1
- /**
2
- * Sub-Agent Stats (H3) — rolling 24h aggregation of per-agent run data.
3
- *
4
- * Append-only JSON ring buffer persisted to ~/.alvin-bot/subagent-stats.json.
5
- * On load, entries older than 24h are pruned. On each append, entries older
6
- * than 24h are pruned.
7
- *
8
- * Used by /subagents stats to show run totals per source (user, cron, implicit)
9
- * over the last 24 hours. No SQLite dependency — when a real SQLite migration
10
- * lands we can swap the backend without touching the consumer API.
11
- */
12
- import os from "os";
13
- import fs from "fs";
14
- import { resolve, dirname } from "path";
15
- const DATA_DIR = process.env.ALVIN_DATA_DIR || resolve(os.homedir(), ".alvin-bot");
16
- const STATS_FILE = resolve(DATA_DIR, "subagent-stats.json");
17
- const WINDOW_MS = 24 * 60 * 60 * 1000; // 24 hours
18
- const MAX_ENTRIES = 5000; // hard cap to prevent unbounded growth on high-frequency bots
19
- let cache = null;
20
- function load() {
21
- if (cache)
22
- return cache;
23
- try {
24
- const raw = fs.readFileSync(STATS_FILE, "utf-8");
25
- const parsed = JSON.parse(raw);
26
- if (!Array.isArray(parsed)) {
27
- cache = [];
28
- return cache;
29
- }
30
- // Prune stale entries (> 24h old) on load
31
- const cutoff = Date.now() - WINDOW_MS;
32
- cache = parsed.filter((e) => typeof e === "object" &&
33
- e !== null &&
34
- typeof e.completedAt === "number" &&
35
- e.completedAt >= cutoff);
36
- return cache;
37
- }
38
- catch {
39
- cache = [];
40
- return cache;
41
- }
42
- }
43
- function save(entries) {
44
- try {
45
- fs.mkdirSync(dirname(STATS_FILE), { recursive: true });
46
- fs.writeFileSync(STATS_FILE, JSON.stringify(entries, null, 0), "utf-8");
47
- }
48
- catch (err) {
49
- console.error("[subagent-stats] failed to write:", err);
50
- }
51
- }
52
- /**
53
- * Record a completed sub-agent run. Called from runSubAgent.finally() via
54
- * a side-effect hook. Automatically prunes entries older than 24h and
55
- * keeps the file bounded at MAX_ENTRIES.
56
- */
57
- export function recordSubAgentRun(info, result) {
58
- const entries = load();
59
- const cutoff = Date.now() - WINDOW_MS;
60
- // Prune in-place
61
- const pruned = entries.filter((e) => e.completedAt >= cutoff);
62
- const newEntry = {
63
- completedAt: Date.now(),
64
- name: info.name,
65
- source: (info.source ?? "implicit"),
66
- status: result.status,
67
- durationMs: result.duration,
68
- inputTokens: result.tokensUsed.input,
69
- outputTokens: result.tokensUsed.output,
70
- };
71
- pruned.push(newEntry);
72
- // Enforce hard cap — oldest entries drop first
73
- const final = pruned.length > MAX_ENTRIES ? pruned.slice(-MAX_ENTRIES) : pruned;
74
- cache = final;
75
- save(final);
76
- }
77
- /**
78
- * Compute a summary of the last 24h of sub-agent runs. Safe to call
79
- * concurrently with recordSubAgentRun — both read from the same cache.
80
- */
81
- export function getSubAgentStats() {
82
- const entries = load();
83
- const cutoff = Date.now() - WINDOW_MS;
84
- const recent = entries.filter((e) => e.completedAt >= cutoff);
85
- const empty = () => ({
86
- runs: 0,
87
- inputTokens: 0,
88
- outputTokens: 0,
89
- totalDurationMs: 0,
90
- });
91
- const bySource = {
92
- user: empty(),
93
- cron: empty(),
94
- implicit: empty(),
95
- };
96
- const byStatus = {
97
- completed: 0,
98
- timeout: 0,
99
- error: 0,
100
- cancelled: 0,
101
- };
102
- const total = empty();
103
- for (const e of recent) {
104
- const bucket = bySource[e.source] ?? bySource.implicit;
105
- bucket.runs += 1;
106
- bucket.inputTokens += e.inputTokens;
107
- bucket.outputTokens += e.outputTokens;
108
- bucket.totalDurationMs += e.durationMs;
109
- total.runs += 1;
110
- total.inputTokens += e.inputTokens;
111
- total.outputTokens += e.outputTokens;
112
- total.totalDurationMs += e.durationMs;
113
- byStatus[e.status] = (byStatus[e.status] ?? 0) + 1;
114
- }
115
- return { windowHours: 24, total, bySource, byStatus };
116
- }
117
- /**
118
- * Reset the in-memory cache — for test isolation. Does NOT delete the
119
- * file; use ALVIN_DATA_DIR in tests to point at a fresh temp dir.
120
- */
121
- export function __resetStatsCacheForTest() {
122
- cache = null;
123
- }
1
+ const _0x4ef779=_0x29a3,_0x322ea1=_0x29a3;(function(_0x40a0f2,_0x3f4dac){const _0x4a7c2a=_0x29a3,_0x3295b4=_0x29a3,_0x10dba5=_0x40a0f2();while(!![]){try{const _0x447540=parseInt(_0x4a7c2a(0x85))/(-0x8b*0x17+-0x8d2+-0x16*-0xf8)+-parseInt(_0x3295b4(0xa1))/(0x6*-0x66a+-0x5ac+0x2c2a*0x1)*(parseInt(_0x4a7c2a(0xae))/(-0x663*-0x3+-0xf*0x1e3+-0x927*-0x1))+-parseInt(_0x3295b4(0xa0))/(0x2130+-0x1*0x26f2+0x5c6*0x1)*(-parseInt(_0x3295b4(0x95))/(0x4d*0xb+0x7*-0x471+0x287*0xb))+-parseInt(_0x3295b4(0x97))/(-0x2b*-0x2+-0x20f4+0x20a4)*(-parseInt(_0x3295b4(0x86))/(-0x19ca+-0x30*-0xe+-0x1731*-0x1))+parseInt(_0x3295b4(0x83))/(0xb2*-0xb+-0x195a+0x97*0x38)*(parseInt(_0x3295b4(0xaf))/(-0x306*-0xc+0x26aa+-0x4ae9))+parseInt(_0x3295b4(0x9d))/(0x1*-0x1c37+-0x1*0xe2f+0x2a70)*(parseInt(_0x4a7c2a(0x98))/(0x26d2+0x20c2+-0x4789*0x1))+-parseInt(_0x4a7c2a(0x8f))/(0xd5d+-0x65*-0x1+0x492*-0x3);if(_0x447540===_0x3f4dac)break;else _0x10dba5['push'](_0x10dba5['shift']());}catch(_0x1cda0e){_0x10dba5['push'](_0x10dba5['shift']());}}}(_0x5194,0x3acc7+-0x3b8f+-0xa1c6));const _0x5f2d5c=(function(){let _0x1ef4fc=!![];return function(_0xf206fd,_0x286a9c){const _0x50d54f=_0x1ef4fc?function(){if(_0x286a9c){const _0x34c0ed=_0x286a9c['apply'](_0xf206fd,arguments);return _0x286a9c=null,_0x34c0ed;}}:function(){};return _0x1ef4fc=![],_0x50d54f;};}()),_0x141a8e=_0x5f2d5c(this,function(){const _0x24c19b=_0x29a3,_0x1c99ee=_0x29a3;return _0x141a8e[_0x24c19b(0xad)]()[_0x1c99ee(0x90)](_0x1c99ee(0xa7)+'+$')[_0x1c99ee(0xad)]()['constructo'+'r'](_0x141a8e)[_0x24c19b(0x90)](_0x1c99ee(0xa7)+'+$');});_0x141a8e();function _0x29a3(_0x4b8824,_0x51f109){_0x4b8824=_0x4b8824-(-0x57d+-0x2554+0xe71*0x3);const _0x1b0f51=_0x5194();let _0x22c390=_0x1b0f51[_0x4b8824];if(_0x29a3['XzBWRM']===undefined){var _0x2fbd24=function(_0x1d9a7d){const _0x5f5002='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x370be4='',_0x5c17ba='',_0x1a0979=_0x370be4+_0x2fbd24;for(let _0x3a7b35=-0x4f5+0x12df*0x1+0x6f5*-0x2,_0x41d3b6,_0x9c040e,_0x3c54de=0x621*-0x1+-0x388+0x9a9;_0x9c040e=_0x1d9a7d['charAt'](_0x3c54de++);~_0x9c040e&&(_0x41d3b6=_0x3a7b35%(0x808+0x1f*-0x79+-0x1*-0x6a3)?_0x41d3b6*(0x30*0x1e+-0x7da+-0x1*-0x27a)+_0x9c040e:_0x9c040e,_0x3a7b35++%(0x2539+0x2*-0xfad+-0x5db*0x1))?_0x370be4+=_0x1a0979['charCodeAt'](_0x3c54de+(-0xc4+0x1*-0x1697+0x1765))-(-0x11*-0x24a+0x1*0x5ba+0x207*-0x16)!==0xd25*0x1+-0x1abf+-0x6cd*-0x2?String['fromCharCode'](-0xef7+-0x2*0x559+-0x355*-0x8&_0x41d3b6>>(-(0x122b+0x1524+0x274d*-0x1)*_0x3a7b35&0x970+-0x1cc7*0x1+-0x135d*-0x1)):_0x3a7b35:0x984+0x24dd+-0x2e61){_0x9c040e=_0x5f5002['indexOf'](_0x9c040e);}for(let _0x10a0fa=0x1b28+0xb1*0x6+-0x1*0x1f4e,_0x1e0bee=_0x370be4['length'];_0x10a0fa<_0x1e0bee;_0x10a0fa++){_0x5c17ba+='%'+('00'+_0x370be4['charCodeAt'](_0x10a0fa)['toString'](-0xf44+-0x2*0x9fb+0x234a))['slice'](-(0x1*0x6c+0x1c7c+-0x1ce6));}return decodeURIComponent(_0x5c17ba);};_0x29a3['xXanKc']=_0x2fbd24,_0x29a3['mJfhnV']={},_0x29a3['XzBWRM']=!![];}const _0x1dea49=_0x1b0f51[0x6b*-0x6+-0x1b3e+0x1c*0x110],_0x27770c=_0x4b8824+_0x1dea49,_0x420a3f=_0x29a3['mJfhnV'][_0x27770c];if(!_0x420a3f){const _0x1d2890=function(_0x583b35){this['GblxEH']=_0x583b35,this['hIJOhQ']=[-0x1fc2+0x62*0x31+0xd01*0x1,-0x25c+-0x23*-0x7+-0x167*-0x1,0xf4*0x13+0x1a0b+0x2c27*-0x1],this['VFCuZx']=function(){return'newState';},this['VoPCRo']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['iivgdL']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1d2890['prototype']['MvKPZb']=function(){const _0x35e832=new RegExp(this['VoPCRo']+this['iivgdL']),_0x360ce8=_0x35e832['test'](this['VFCuZx']['toString']())?--this['hIJOhQ'][0x22c1+0x12b+0x3*-0xbf9]:--this['hIJOhQ'][0xfda+-0x20ee+-0x1114*-0x1];return this['OreOnI'](_0x360ce8);},_0x1d2890['prototype']['OreOnI']=function(_0x2124df){if(!Boolean(~_0x2124df))return _0x2124df;return this['wqHSTf'](this['GblxEH']);},_0x1d2890['prototype']['wqHSTf']=function(_0x32a907){for(let _0x32d082=0x413+-0x1*-0x1e41+-0x2254,_0x4ae22d=this['hIJOhQ']['length'];_0x32d082<_0x4ae22d;_0x32d082++){this['hIJOhQ']['push'](Math['round'](Math['random']())),_0x4ae22d=this['hIJOhQ']['length'];}return _0x32a907(this['hIJOhQ'][-0xb9b*-0x1+0xba+0x29*-0x4d]);},new _0x1d2890(_0x29a3)['MvKPZb'](),_0x22c390=_0x29a3['xXanKc'](_0x22c390),_0x29a3['mJfhnV'][_0x27770c]=_0x22c390;}else _0x22c390=_0x420a3f;return _0x22c390;}import _0x3b4d3f from'os';import _0x5cae4e from'fs';import{resolve,dirname}from'path';function _0x5194(){const _0x25920b=['AxnbCNjHEq','ndG3mZCYEwriqu5N','mLfes2vMDq','Dg90ywXeDxjHDa','BwTKAxjtEw5J','CgfYC2u','BM93','C3rYAw5NAwz5','kcGOlISPkYKRkq','zMLSDgvY','B2jQzwn0','CMvHzezPBgvtEq','C3rHDhvZ','zhvYyxrPB25nCW','Dg9tDhjPBMC','nduYmdC5vgfdvwHu','mJC5rerZqKjp','y29TCgXLDgvKqq','B3v0Chv0vg9Rzq','Ag9TzwrPCG','x0rjuG','otiZnJbMr2PXyvC','Dgf0CY5QC29U','mtC2odKYtLryqwjZ','n1Pfww9gsG','C3rHDhnDigzHAq','D3jPDgvgAwXLuW','ChvZAa','zxjYB3i','zhvYyxrPB24','C3vIywDLBNqTCW','Dgu6','CNvUCW','oduWmZm4mffcr0Losa','C2vHCMnO','C291CMnL','lMfSDMLUlwjVDa','DxrMltG','zw52','nwnbtvbtBW','Aw9Utxm','mteZntqZnhnbCxzlCq','ntm5zuXWC0H2','B3v0Chv0','quXwsu5Frefuqq','Aw1WBgLJAxq','Dg9Rzw5ZvxnLza','ndaZmZbwvg5fCMO','Aw5WDxruB2TLBG'];_0x5194=function(){return _0x25920b;};return _0x5194();}const DATA_DIR=process[_0x4ef779(0x94)][_0x4ef779(0x9a)+_0x322ea1(0x82)]||resolve(_0x3b4d3f[_0x4ef779(0xb2)](),_0x4ef779(0x92)),STATS_FILE=resolve(DATA_DIR,_0x322ea1(0x8c)+_0x4ef779(0x84)),WINDOW_MS=(0x621*-0x1+-0x388+0x9c1)*(0x808+0x1f*-0x79+-0x3*-0x249)*(0x30*0x1e+-0x7da+-0x5*-0x7e)*(0x2539+0x2*-0xfad+-0x1f7*0x1),MAX_ENTRIES=-0xc4+0x1*-0x1697+0x2ae3;let cache=null;function load(){const _0x18d53c=_0x4ef779,_0x32a937=_0x4ef779;if(cache)return cache;try{const _0x1d5cb5=_0x5cae4e[_0x18d53c(0xaa)+'nc'](STATS_FILE,_0x32a937(0x93)),_0x3a2ac1=JSON[_0x18d53c(0xa4)](_0x1d5cb5);if(!Array[_0x32a937(0x9f)](_0x3a2ac1))return cache=[],cache;const _0x51a081=Date[_0x32a937(0xa5)]()-WINDOW_MS;return cache=_0x3a2ac1[_0x18d53c(0xa8)](_0x5603b6=>typeof _0x5603b6===_0x32a937(0xa9)&&_0x5603b6!==null&&typeof _0x5603b6[_0x32a937(0xb0)+'t']==='number'&&_0x5603b6[_0x18d53c(0xb0)+'t']>=_0x51a081),cache;}catch{return cache=[],cache;}}function save(_0x299ecd){const _0x2cb685=_0x4ef779,_0x644bc1=_0x4ef779;try{_0x5cae4e[_0x2cb685(0xa3)](dirname(STATS_FILE),{'recursive':!![]}),_0x5cae4e[_0x644bc1(0x88)+'ync'](STATS_FILE,JSON[_0x644bc1(0xa6)](_0x299ecd,null,-0x11*-0x24a+0x1*0x5ba+0xb29*-0x4),_0x644bc1(0x93));}catch(_0x1d0e6e){console[_0x2cb685(0x8a)]('[subagent-'+_0x2cb685(0x87)+'led\x20to\x20wri'+_0x644bc1(0x8d),_0x1d0e6e);}}export function recordSubAgentRun(_0x1753a3,_0x2d97e3){const _0x2c2d24=_0x322ea1,_0x5e18dd=_0x4ef779,_0x46e6c1=load(),_0x2b1dfd=Date['now']()-WINDOW_MS,_0xbf0a2=_0x46e6c1[_0x2c2d24(0xa8)](_0x521016=>_0x521016['completedA'+'t']>=_0x2b1dfd),_0x303414={'completedAt':Date[_0x5e18dd(0xa5)](),'name':_0x1753a3['name'],'source':_0x1753a3['source']??_0x2c2d24(0x9b),'status':_0x2d97e3[_0x2c2d24(0xab)],'durationMs':_0x2d97e3[_0x2c2d24(0x8b)],'inputTokens':_0x2d97e3[_0x2c2d24(0x9c)]['input'],'outputTokens':_0x2d97e3['tokensUsed'][_0x5e18dd(0x99)]};_0xbf0a2[_0x5e18dd(0x89)](_0x303414);const _0x5273c2=_0xbf0a2['length']>MAX_ENTRIES?_0xbf0a2['slice'](-MAX_ENTRIES):_0xbf0a2;cache=_0x5273c2,save(_0x5273c2);}export function getSubAgentStats(){const _0xced853=_0x322ea1,_0x3becc2=_0x322ea1,_0x3297c6=load(),_0x24c0e4=Date[_0xced853(0xa5)]()-WINDOW_MS,_0xfeda13=_0x3297c6['filter'](_0xe095f4=>_0xe095f4[_0x3becc2(0xb0)+'t']>=_0x24c0e4),_0x2ca05d=()=>({'runs':0x0,'inputTokens':0x0,'outputTokens':0x0,'totalDurationMs':0x0}),_0xe6fd2a={'user':_0x2ca05d(),'cron':_0x2ca05d(),'implicit':_0x2ca05d()},_0x582469={'completed':0x0,'timeout':0x0,'error':0x0,'cancelled':0x0},_0x47e641=_0x2ca05d();for(const _0x404150 of _0xfeda13){const _0x3ecb3e=_0xe6fd2a[_0x404150[_0x3becc2(0x91)]]??_0xe6fd2a['implicit'];_0x3ecb3e[_0xced853(0x8e)]+=0xd25*0x1+-0x1abf+-0x81*-0x1b,_0x3ecb3e[_0x3becc2(0x9e)+'s']+=_0x404150[_0x3becc2(0x9e)+'s'],_0x3ecb3e[_0x3becc2(0xb1)+'ns']+=_0x404150[_0xced853(0xb1)+'ns'],_0x3ecb3e[_0x3becc2(0xa2)+_0xced853(0x96)]+=_0x404150[_0xced853(0xac)],_0x47e641['runs']+=-0xef7+-0x2*0x559+-0x92*-0x2d,_0x47e641[_0xced853(0x9e)+'s']+=_0x404150['inputToken'+'s'],_0x47e641['outputToke'+'ns']+=_0x404150[_0x3becc2(0xb1)+'ns'],_0x47e641[_0x3becc2(0xa2)+_0xced853(0x96)]+=_0x404150['durationMs'],_0x582469[_0x404150['status']]=(_0x582469[_0x404150[_0x3becc2(0xab)]]??0x122b+0x1524+0x274f*-0x1)+(0x970+-0x1cc7*0x1+-0x4d6*-0x4);}return{'windowHours':0x18,'total':_0x47e641,'bySource':_0xe6fd2a,'byStatus':_0x582469};}export function __resetStatsCacheForTest(){cache=null;}