alvin-bot 5.6.2 → 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 (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -130
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -443
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -0
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. 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;}