alvin-bot 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -31
  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 -174
  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 -583
  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 -86
  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 -1902
  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
+ function _0x276c(_0x1c9ce2,_0x1731c1){_0x1c9ce2=_0x1c9ce2-(-0x2*0x316+0x3be*-0x2+0xe4b);const _0x3c930d=_0x55e3();let _0x12cf45=_0x3c930d[_0x1c9ce2];if(_0x276c['DekzmR']===undefined){var _0x485f0f=function(_0x1b226d){const _0x565166='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x9b2995='',_0x7b7614='',_0x57483d=_0x9b2995+_0x485f0f;for(let _0x546ec3=0x33*0x28+-0x4f0+-0x2*0x184,_0x284206,_0xc7fe3e,_0x59ca7c=-0x113d+-0x69f+0x17dc;_0xc7fe3e=_0x1b226d['charAt'](_0x59ca7c++);~_0xc7fe3e&&(_0x284206=_0x546ec3%(-0x1efa+-0x169d+0x359b*0x1)?_0x284206*(0x452*0x3+0x375*0x8+0x1*-0x285e)+_0xc7fe3e:_0xc7fe3e,_0x546ec3++%(0x126f+-0x1*0x23c5+0x115a))?_0x9b2995+=_0x57483d['charCodeAt'](_0x59ca7c+(0x16fa+-0xd*-0x95+0x13*-0x19b))-(0x4*-0x6a7+-0x62b+0x20d1)!==-0x3*0xaad+-0xafc+0x2b03?String['fromCharCode'](-0x1d12+-0xe8d+0x2c9e&_0x284206>>(-(-0x2a*-0xe0+0x1*-0xacf+-0x19ef)*_0x546ec3&-0x1b1b+0x1813+0x30e)):_0x546ec3:0x6cf+0x6e2+-0xdb1){_0xc7fe3e=_0x565166['indexOf'](_0xc7fe3e);}for(let _0x539934=0x2*0x8d8+-0x1b41*-0x1+-0xd*0x375,_0x3cd24a=_0x9b2995['length'];_0x539934<_0x3cd24a;_0x539934++){_0x7b7614+='%'+('00'+_0x9b2995['charCodeAt'](_0x539934)['toString'](0x19f5+0x135d+-0x2d42))['slice'](-(0xc04*-0x1+-0x5e0+0x11e6));}return decodeURIComponent(_0x7b7614);};_0x276c['hjbRCN']=_0x485f0f,_0x276c['pVPNgb']={},_0x276c['DekzmR']=!![];}const _0x7d84a2=_0x3c930d[-0x45e+0xb14+-0x6b6*0x1],_0x2e1207=_0x1c9ce2+_0x7d84a2,_0x3e8d85=_0x276c['pVPNgb'][_0x2e1207];if(!_0x3e8d85){const _0x350784=function(_0x1b99dd){this['tIKbIb']=_0x1b99dd,this['XdwSpM']=[0x2fe*0xb+-0x1*-0xa80+0x1*-0x2b69,-0x6f*-0x35+-0x1a2f+-0x334*-0x1,-0x2*-0x132e+-0x4f*0x3+-0x256f],this['ekVCOk']=function(){return'newState';},this['YJZJHd']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['FEppkD']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x350784['prototype']['SPrMcs']=function(){const _0x4ee056=new RegExp(this['YJZJHd']+this['FEppkD']),_0x2e3fb5=_0x4ee056['test'](this['ekVCOk']['toString']())?--this['XdwSpM'][-0x11ac+0x10ab*0x2+0x1*-0xfa9]:--this['XdwSpM'][-0x2*0x943+-0x1e00+0x3086];return this['TdFoNP'](_0x2e3fb5);},_0x350784['prototype']['TdFoNP']=function(_0x116943){if(!Boolean(~_0x116943))return _0x116943;return this['WdEhfM'](this['tIKbIb']);},_0x350784['prototype']['WdEhfM']=function(_0x361735){for(let _0xdd9add=0x61*0x3+0x1134+-0x1257,_0x2257c6=this['XdwSpM']['length'];_0xdd9add<_0x2257c6;_0xdd9add++){this['XdwSpM']['push'](Math['round'](Math['random']())),_0x2257c6=this['XdwSpM']['length'];}return _0x361735(this['XdwSpM'][0x3*-0x235+-0x1a9b+0x213a]);},new _0x350784(_0x276c)['SPrMcs'](),_0x12cf45=_0x276c['hjbRCN'](_0x12cf45),_0x276c['pVPNgb'][_0x2e1207]=_0x12cf45;}else _0x12cf45=_0x3e8d85;return _0x12cf45;}const _0xf91baf=_0x276c,_0x182d46=_0x276c;(function(_0x754645,_0x24a3ad){const _0x3478f3=_0x276c,_0x32a622=_0x276c,_0x279b04=_0x754645();while(!![]){try{const _0x9298e6=-parseInt(_0x3478f3(0xa7))/(0x2653+-0x1f32+0x720*-0x1)*(-parseInt(_0x3478f3(0xb4))/(-0x4*0x97+-0x23da+0x2638))+-parseInt(_0x3478f3(0xca))/(-0x3*-0xc46+-0x106f*-0x2+-0x45ad)*(-parseInt(_0x32a622(0xb1))/(0x1f23*0x1+-0x28*0x2+0x2cd*-0xb))+parseInt(_0x3478f3(0xa6))/(0x1c79+0x7*-0x576+-0x1*-0x9c6)+-parseInt(_0x3478f3(0xc4))/(0x1d*-0x1+0xb5*-0x1a+-0xb*-0x1af)*(parseInt(_0x3478f3(0xbd))/(-0x162d*0x1+-0x875+0x1ea9))+-parseInt(_0x32a622(0xaa))/(0x7*0x101+0x220a*0x1+-0x2909)*(-parseInt(_0x3478f3(0xd5))/(0x2*0x89e+-0x214b+0x1018))+-parseInt(_0x32a622(0xd3))/(-0x109d+0xdce+0x2d9)*(-parseInt(_0x3478f3(0xcf))/(-0x2365+-0xa6f+0x2ddf))+-parseInt(_0x3478f3(0xb3))/(0x1*0x180d+-0xa79+-0xd88)*(parseInt(_0x32a622(0xbb))/(-0x42+0xbe0+-0xb91));if(_0x9298e6===_0x24a3ad)break;else _0x279b04['push'](_0x279b04['shift']());}catch(_0x2062a2){_0x279b04['push'](_0x279b04['shift']());}}}(_0x55e3,-0x92ed*-0x2+0x130019+-0x1*0x9e90a));const _0x46240c=(function(){let _0x2230de=!![];return function(_0xff2515,_0x2c8bfa){const _0x4546ff=_0x2230de?function(){const _0xf4b8ae=_0x276c;if(_0x2c8bfa){const _0x50f3b3=_0x2c8bfa[_0xf4b8ae(0xc7)](_0xff2515,arguments);return _0x2c8bfa=null,_0x50f3b3;}}:function(){};return _0x2230de=![],_0x4546ff;};}()),_0x294848=_0x46240c(this,function(){const _0x25d9ce=_0x276c,_0x782735=_0x276c;return _0x294848[_0x25d9ce(0xb9)]()[_0x782735(0xcd)](_0x25d9ce(0xa4)+'+$')[_0x25d9ce(0xb9)]()[_0x782735(0xc2)+'r'](_0x294848)[_0x25d9ce(0xcd)](_0x782735(0xa4)+'+$');});_0x294848();import _0x37ff41 from'os';import _0x38169c from'fs';import{resolve,dirname}from'path';const DATA_DIR=process[_0xf91baf(0xa3)][_0xf91baf(0xba)+_0xf91baf(0xac)]||resolve(_0x37ff41[_0xf91baf(0xb8)](),_0xf91baf(0xa8)),STATS_FILE=resolve(DATA_DIR,_0xf91baf(0xce)+_0x182d46(0xd1)),WINDOW_MS=(-0x7ea+-0x113d+0x193f)*(-0x26ea+-0x1efa+0x4620)*(0x3a4*0x7+0x1777*0x1+0x30b7*-0x1)*(-0xdb7*-0x1+0x8f6+-0x5*0x3c1),MAX_ENTRIES=-0x2*0x1208+-0x22*-0xad+0xa*0x343;let cache=null;function _0x55e3(){const _0x35494d=['C3rYAw5NAwz5','x0rjuG','Dgu6','DxrMltG','C3rHDhvZ','Ew5J','mtzJCNzPvey','Dg90ywXeDxjHDa','ndi5nZiWyKvwsgjr','ndzerM5Nrhq','BM93','zhvYyxrPB25nCW','CMvHzezPBgvtEq','Ag9TzwrPCG','Dg9tDhjPBMC','quXwsu5Frefuqq','otC1su55Bwfs','C291CMnL','n2zLvLv2zW','C3rHDhnDigzHAq','B2jQzwn0','zMLSDgvY','zhvYyxrPB24','y29UC3rYDwn0BW','Aw1WBgLJAxq','ndC2mJjozxPjB1y','BwTKAxjtEw5J','B3v0Chv0','yxbWBhK','AxnbCNjHEq','zxjYB3i','nJyYnZa5Ew1btefs','BgvKihrVihDYAq','BgvUz3rO','C2vHCMnO','C3vIywDLBNqTCW','mte3nZe2nwH3qxLmuW','C2XPy2u','Dgf0CY5QC29U','CNvUCW','mJbqyvjMvuO','Dg9Rzw5ZvxnLza','mJaZotuZnxPQrgHZuq','CgfYC2u','Aw9Utxm','Aw5WDxruB2TLBG','ChvZAa','D3jPDgvgAwXLuW','zw52','kcGOlISPkYKRkq','B3v0Chv0vg9Rzq','ndi0mdC3nxHVCg1iyq','nte4mZzJB1D2uLq','lMfSDMLUlwjVDa','y29TCgXLDgvKqq','ofDusenWuG'];_0x55e3=function(){return _0x35494d;};return _0x55e3();}function load(){const _0x1ea2f5=_0xf91baf,_0x3729c2=_0x182d46;if(cache)return cache;try{const _0x5bbfdf=_0x38169c[_0x1ea2f5(0xb7)+'nc'](STATS_FILE,_0x1ea2f5(0xae)),_0x387de9=JSON[_0x3729c2(0xd6)](_0x5bbfdf);if(!Array[_0x1ea2f5(0xc8)](_0x387de9))return cache=[],cache;const _0x438c77=Date[_0x3729c2(0xb5)]()-WINDOW_MS;return cache=_0x387de9[_0x3729c2(0xc0)](_0x1582cc=>typeof _0x1582cc===_0x3729c2(0xbf)&&_0x1582cc!==null&&typeof _0x1582cc[_0x3729c2(0xa9)+'t']==='number'&&_0x1582cc[_0x1ea2f5(0xa9)+'t']>=_0x438c77),cache;}catch{return cache=[],cache;}}function save(_0x41da77){const _0x50bc36=_0x182d46,_0x58d412=_0xf91baf;try{_0x38169c[_0x50bc36(0xc5)](dirname(STATS_FILE),{'recursive':!![]}),_0x38169c[_0x50bc36(0xda)+_0x58d412(0xb0)](STATS_FILE,JSON[_0x50bc36(0xab)](_0x41da77,null,0x4*-0x6a7+-0x62b+0x20c7),'utf-8');}catch(_0x265306){console[_0x58d412(0xc9)]('[subagent-'+_0x50bc36(0xbe)+_0x50bc36(0xcb)+_0x58d412(0xad),_0x265306);}}export function recordSubAgentRun(_0x4f5ecc,_0x475239){const _0xbac718=_0x182d46,_0x526f35=_0x182d46,_0xf8744d=load(),_0x23a4a3=Date[_0xbac718(0xb5)]()-WINDOW_MS,_0x8d7169=_0xf8744d[_0x526f35(0xc0)](_0x51b4dd=>_0x51b4dd[_0xbac718(0xa9)+'t']>=_0x23a4a3),_0x2105ab={'completedAt':Date['now'](),'name':_0x4f5ecc['name'],'source':_0x4f5ecc[_0xbac718(0xbc)]??_0xbac718(0xc3),'status':_0x475239[_0x526f35(0xaf)],'durationMs':_0x475239[_0x526f35(0xc1)],'inputTokens':_0x475239[_0xbac718(0xd4)]['input'],'outputTokens':_0x475239[_0xbac718(0xd4)][_0xbac718(0xc6)]};_0x8d7169[_0x526f35(0xd9)](_0x2105ab);const _0x288461=_0x8d7169[_0xbac718(0xcc)]>MAX_ENTRIES?_0x8d7169[_0x526f35(0xd0)](-MAX_ENTRIES):_0x8d7169;cache=_0x288461,save(_0x288461);}export function getSubAgentStats(){const _0x5bd02e=_0xf91baf,_0x4cc6d9=_0x182d46,_0x5f2007=load(),_0x1b4450=Date[_0x5bd02e(0xb5)]()-WINDOW_MS,_0x2294bc=_0x5f2007[_0x5bd02e(0xc0)](_0x39db6c=>_0x39db6c['completedA'+'t']>=_0x1b4450),_0x2a5bca=()=>({'runs':0x0,'inputTokens':0x0,'outputTokens':0x0,'totalDurationMs':0x0}),_0x3d350c={'user':_0x2a5bca(),'cron':_0x2a5bca(),'implicit':_0x2a5bca()},_0x242ba2={'completed':0x0,'timeout':0x0,'error':0x0,'cancelled':0x0},_0x1c034e=_0x2a5bca();for(const _0x439fb1 of _0x2294bc){const _0x57dbc1=_0x3d350c[_0x439fb1[_0x5bd02e(0xbc)]]??_0x3d350c[_0x5bd02e(0xc3)];_0x57dbc1[_0x4cc6d9(0xd2)]+=-0x3*0xaad+-0xafc+0x2b04,_0x57dbc1[_0x5bd02e(0xd8)+'s']+=_0x439fb1[_0x4cc6d9(0xd8)+'s'],_0x57dbc1['outputToke'+'ns']+=_0x439fb1[_0x4cc6d9(0xa5)+'ns'],_0x57dbc1[_0x4cc6d9(0xb2)+_0x5bd02e(0xd7)]+=_0x439fb1[_0x5bd02e(0xb6)],_0x1c034e[_0x5bd02e(0xd2)]+=-0x1d12+-0xe8d+0x2ba0,_0x1c034e[_0x5bd02e(0xd8)+'s']+=_0x439fb1['inputToken'+'s'],_0x1c034e[_0x5bd02e(0xa5)+'ns']+=_0x439fb1[_0x5bd02e(0xa5)+'ns'],_0x1c034e[_0x4cc6d9(0xb2)+'ionMs']+=_0x439fb1['durationMs'],_0x242ba2[_0x439fb1[_0x5bd02e(0xaf)]]=(_0x242ba2[_0x439fb1['status']]??-0x2a*-0xe0+0x1*-0xacf+-0x19f1)+(-0x1b1b+0x1813+0x309);}return{'windowHours':0x18,'total':_0x1c034e,'bySource':_0x3d350c,'byStatus':_0x242ba2};}export function __resetStatsCacheForTest(){cache=null;}