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.
- package/CHANGELOG.md +13 -0
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -174
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -583
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -86
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1902
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- 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;}
|