@poolzin/pool-bot 2026.3.9 → 2026.3.11

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 (128) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +147 -69
  3. package/dist/.buildstamp +1 -1
  4. package/dist/agents/error-classifier.js +26 -77
  5. package/dist/agents/skills/security.js +1 -7
  6. package/dist/build-info.json +3 -3
  7. package/dist/cli/cron-cli/register.cron-dashboard.js +339 -0
  8. package/dist/cli/cron-cli/register.js +2 -0
  9. package/dist/cli/errors.js +187 -0
  10. package/dist/cli/program/command-registry.js +13 -0
  11. package/dist/cli/program/register.maintenance.js +21 -0
  12. package/dist/cli/program/register.subclis.js +9 -0
  13. package/dist/cli/swarm-cli/register.js +8 -0
  14. package/dist/cli/swarm-cli/register.swarm-status.js +488 -0
  15. package/dist/cli/telemetry-cli/register.js +10 -0
  16. package/dist/cli/telemetry-cli/register.telemetry-alerts.js +176 -0
  17. package/dist/cli/telemetry-cli/register.telemetry-metrics.js +323 -0
  18. package/dist/cli/telemetry-cli/register.telemetry-status.js +179 -0
  19. package/dist/commands/doctor-checks.js +498 -0
  20. package/dist/context-engine/index.js +1 -1
  21. package/dist/context-engine/legacy.js +1 -3
  22. package/dist/context-engine/summarizing.js +5 -8
  23. package/dist/cron/service/timer.js +18 -0
  24. package/dist/gateway/protocol/index.js +5 -2
  25. package/dist/gateway/protocol/schema/error-codes.js +1 -0
  26. package/dist/gateway/protocol/schema/swarm.js +80 -0
  27. package/dist/gateway/protocol/schema.js +1 -0
  28. package/dist/gateway/server-close.js +4 -0
  29. package/dist/gateway/server-constants.js +1 -0
  30. package/dist/gateway/server-cron.js +29 -0
  31. package/dist/gateway/server-maintenance.js +35 -2
  32. package/dist/gateway/server-methods/swarm.js +58 -0
  33. package/dist/gateway/server-methods/telemetry.js +71 -0
  34. package/dist/gateway/server-methods-list.js +8 -0
  35. package/dist/gateway/server-methods.js +9 -2
  36. package/dist/gateway/server.impl.js +33 -16
  37. package/dist/infra/abort-pattern.js +4 -4
  38. package/dist/infra/retry.js +3 -1
  39. package/dist/skills/commands.js +7 -25
  40. package/dist/skills/index.js +14 -17
  41. package/dist/skills/parser.js +12 -27
  42. package/dist/skills/registry.js +3 -6
  43. package/dist/skills/security.js +2 -8
  44. package/dist/swarm/service.js +247 -0
  45. package/dist/telemetry/alert-engine.js +258 -0
  46. package/dist/telemetry/cron-instrumentation.js +49 -0
  47. package/dist/telemetry/gateway-instrumentation.js +80 -0
  48. package/dist/telemetry/instrumentation.js +66 -0
  49. package/dist/telemetry/service.js +345 -0
  50. package/dist/tui/components/assistant-message.js +6 -2
  51. package/dist/tui/components/hyperlink-markdown.js +32 -0
  52. package/dist/tui/components/searchable-select-list.js +12 -1
  53. package/dist/tui/components/user-message.js +6 -2
  54. package/dist/tui/index.js +22 -6
  55. package/dist/tui/theme/theme-detection.js +226 -0
  56. package/dist/tui/tui-command-handlers.js +20 -0
  57. package/dist/tui/tui-formatters.js +4 -3
  58. package/dist/tui/utils/ctrl-c-handler.js +67 -0
  59. package/dist/tui/utils/osc8-hyperlinks.js +208 -0
  60. package/dist/tui/utils/safe-stop.js +180 -0
  61. package/dist/tui/utils/session-key-utils.js +81 -0
  62. package/dist/tui/utils/text-sanitization.js +284 -0
  63. package/dist/utils/lru-cache.js +116 -0
  64. package/dist/utils/performance.js +199 -0
  65. package/dist/utils/retry.js +240 -0
  66. package/docs/MELHORIAS_IMPLEMENTADAS.md +228 -0
  67. package/docs/MELHORIAS_PROFISSIONAIS.md +282 -0
  68. package/docs/PLANO_ACAO_TUI.md +357 -0
  69. package/docs/PROGRESSO_TUI.md +66 -0
  70. package/docs/RELATORIO_FINAL.md +217 -0
  71. package/docs/diagnostico-shell-completion.md +265 -0
  72. package/docs/features/advanced-memory.md +585 -0
  73. package/docs/features/discord-components-v2.md +277 -0
  74. package/docs/features/swarm.md +100 -0
  75. package/docs/features/telemetry.md +284 -0
  76. package/docs/integrations/INTEGRATION_PLAN.md +665 -345
  77. package/docs/models/provider-infrastructure.md +400 -0
  78. package/docs/security/exec-approvals.md +294 -0
  79. package/extensions/bluebubbles/package.json +1 -1
  80. package/extensions/copilot-proxy/package.json +1 -1
  81. package/extensions/diagnostics-otel/package.json +1 -1
  82. package/extensions/discord/package.json +1 -1
  83. package/extensions/feishu/package.json +1 -1
  84. package/extensions/google-antigravity-auth/package.json +1 -1
  85. package/extensions/google-gemini-cli-auth/package.json +1 -1
  86. package/extensions/googlechat/package.json +1 -1
  87. package/extensions/hexstrike-bridge/README.md +119 -0
  88. package/extensions/hexstrike-bridge/index.test.ts +247 -0
  89. package/extensions/hexstrike-bridge/index.ts +487 -0
  90. package/extensions/hexstrike-bridge/package.json +17 -0
  91. package/extensions/imessage/package.json +1 -1
  92. package/extensions/irc/package.json +1 -1
  93. package/extensions/line/package.json +1 -1
  94. package/extensions/llm-task/package.json +1 -1
  95. package/extensions/lobster/package.json +1 -1
  96. package/extensions/matrix/CHANGELOG.md +10 -0
  97. package/extensions/matrix/package.json +1 -1
  98. package/extensions/mattermost/package.json +1 -1
  99. package/extensions/mavalie/README.md +97 -0
  100. package/extensions/mavalie/package.json +15 -0
  101. package/extensions/mavalie/src/index.ts +62 -0
  102. package/extensions/mcp-server/index.ts +14 -0
  103. package/extensions/mcp-server/package.json +11 -0
  104. package/extensions/mcp-server/src/service.ts +540 -0
  105. package/extensions/memory-core/package.json +1 -1
  106. package/extensions/memory-lancedb/package.json +1 -1
  107. package/extensions/minimax-portal-auth/package.json +1 -1
  108. package/extensions/msteams/CHANGELOG.md +10 -0
  109. package/extensions/msteams/package.json +1 -1
  110. package/extensions/nextcloud-talk/package.json +1 -1
  111. package/extensions/nostr/CHANGELOG.md +10 -0
  112. package/extensions/nostr/package.json +1 -1
  113. package/extensions/open-prose/package.json +1 -1
  114. package/extensions/openai-codex-auth/package.json +1 -1
  115. package/extensions/signal/package.json +1 -1
  116. package/extensions/slack/package.json +1 -1
  117. package/extensions/telegram/package.json +1 -1
  118. package/extensions/tlon/package.json +1 -1
  119. package/extensions/twitch/CHANGELOG.md +10 -0
  120. package/extensions/twitch/package.json +1 -1
  121. package/extensions/voice-call/CHANGELOG.md +10 -0
  122. package/extensions/voice-call/package.json +1 -1
  123. package/extensions/whatsapp/package.json +1 -1
  124. package/extensions/zalo/CHANGELOG.md +10 -0
  125. package/extensions/zalo/package.json +1 -1
  126. package/extensions/zalouser/CHANGELOG.md +10 -0
  127. package/extensions/zalouser/package.json +1 -1
  128. package/package.json +8 -1
@@ -0,0 +1,498 @@
1
+ /**
2
+ * Helper to safely get config
3
+ */
4
+ async function safeLoadConfig() {
5
+ try {
6
+ const { loadConfig } = await import("../config/config.js");
7
+ return (await loadConfig());
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ }
13
+ /**
14
+ * Registry of all doctor checks
15
+ */
16
+ export const doctorCheckRegistry = {
17
+ config: async () => {
18
+ const start = Date.now();
19
+ try {
20
+ const { readConfigFileSnapshot } = await import("../config/config.js");
21
+ const snapshot = await readConfigFileSnapshot();
22
+ if (!snapshot.exists) {
23
+ return {
24
+ name: "config",
25
+ status: "error",
26
+ message: "Configuration file not found",
27
+ durationMs: Date.now() - start,
28
+ suggestions: ["Run `poolbot setup` to create initial configuration"],
29
+ };
30
+ }
31
+ if (!snapshot.valid) {
32
+ const issues = snapshot.issues?.map((i) => i.message).join("; ") ?? "Unknown issues";
33
+ return {
34
+ name: "config",
35
+ status: "error",
36
+ message: `Configuration invalid: ${issues}`,
37
+ durationMs: Date.now() - start,
38
+ suggestions: ["Run `poolbot doctor --fix` to auto-repair configuration"],
39
+ details: { issues: snapshot.issues },
40
+ };
41
+ }
42
+ return {
43
+ name: "config",
44
+ status: "ok",
45
+ message: "Configuration is valid",
46
+ durationMs: Date.now() - start,
47
+ details: { path: snapshot.path },
48
+ };
49
+ }
50
+ catch (err) {
51
+ return {
52
+ name: "config",
53
+ status: "error",
54
+ message: `Failed to check config: ${String(err)}`,
55
+ durationMs: Date.now() - start,
56
+ };
57
+ }
58
+ },
59
+ auth: async () => {
60
+ const start = Date.now();
61
+ try {
62
+ const cfg = await safeLoadConfig();
63
+ if (!cfg) {
64
+ return {
65
+ name: "auth",
66
+ status: "skipped",
67
+ message: "Could not load configuration",
68
+ durationMs: Date.now() - start,
69
+ };
70
+ }
71
+ // Check auth profiles
72
+ const authProfiles = cfg.authProfiles;
73
+ if (!authProfiles || authProfiles.length === 0) {
74
+ return {
75
+ name: "auth",
76
+ status: "warning",
77
+ message: "No authentication profiles configured",
78
+ durationMs: Date.now() - start,
79
+ suggestions: ["Run `poolbot configure` to set up authentication"],
80
+ };
81
+ }
82
+ const validProfiles = authProfiles.filter((p) => p?.credential);
83
+ if (validProfiles.length === 0) {
84
+ return {
85
+ name: "auth",
86
+ status: "error",
87
+ message: "Auth profiles exist but none have valid credentials",
88
+ durationMs: Date.now() - start,
89
+ suggestions: ["Run `poolbot configure` to re-authenticate"],
90
+ };
91
+ }
92
+ return {
93
+ name: "auth",
94
+ status: "ok",
95
+ message: `${validProfiles.length} authentication profile(s) configured`,
96
+ durationMs: Date.now() - start,
97
+ details: { profileCount: validProfiles.length },
98
+ };
99
+ }
100
+ catch (err) {
101
+ return {
102
+ name: "auth",
103
+ status: "error",
104
+ message: `Failed to check auth: ${String(err)}`,
105
+ durationMs: Date.now() - start,
106
+ };
107
+ }
108
+ },
109
+ completion: async () => {
110
+ const start = Date.now();
111
+ try {
112
+ const { checkShellCompletionStatus } = await import("./doctor-completion.js");
113
+ const status = await checkShellCompletionStatus();
114
+ if (!status.cacheExists) {
115
+ return {
116
+ name: "completion",
117
+ status: "warning",
118
+ message: "Completion cache not found",
119
+ durationMs: Date.now() - start,
120
+ suggestions: [
121
+ "Run `poolbot completion --write-state` to generate cache",
122
+ "Run `poolbot completion --install` to install to shell profile",
123
+ ],
124
+ details: { shell: status.shell },
125
+ };
126
+ }
127
+ if (!status.profileInstalled) {
128
+ return {
129
+ name: "completion",
130
+ status: "warning",
131
+ message: `Completion cache exists but not installed in ${status.shell} profile`,
132
+ durationMs: Date.now() - start,
133
+ suggestions: ["Run `poolbot completion --install` to enable completion"],
134
+ details: { shell: status.shell, cachePath: status.cachePath },
135
+ };
136
+ }
137
+ if (status.usesSlowPattern) {
138
+ return {
139
+ name: "completion",
140
+ status: "warning",
141
+ message: "Using slow dynamic completion pattern",
142
+ durationMs: Date.now() - start,
143
+ suggestions: ["Run `poolbot doctor --fix` to upgrade to cached completion"],
144
+ details: { shell: status.shell },
145
+ };
146
+ }
147
+ return {
148
+ name: "completion",
149
+ status: "ok",
150
+ message: `Shell completion installed and cached for ${status.shell}`,
151
+ durationMs: Date.now() - start,
152
+ details: { shell: status.shell, cachePath: status.cachePath },
153
+ };
154
+ }
155
+ catch (err) {
156
+ return {
157
+ name: "completion",
158
+ status: "error",
159
+ message: `Failed to check completion: ${String(err)}`,
160
+ durationMs: Date.now() - start,
161
+ };
162
+ }
163
+ },
164
+ gateway: async ({ runtime, options }) => {
165
+ const start = Date.now();
166
+ try {
167
+ const cfg = await safeLoadConfig();
168
+ if (!cfg) {
169
+ return {
170
+ name: "gateway",
171
+ status: "skipped",
172
+ message: "Could not load configuration",
173
+ durationMs: Date.now() - start,
174
+ };
175
+ }
176
+ const { checkGatewayHealth } = await import("./doctor-gateway-health.js");
177
+ const result = await checkGatewayHealth({
178
+ runtime,
179
+ cfg: cfg,
180
+ timeoutMs: options.nonInteractive ? 3000 : 10_000,
181
+ });
182
+ if (!result.healthOk) {
183
+ return {
184
+ name: "gateway",
185
+ status: "error",
186
+ message: "Gateway health check failed",
187
+ durationMs: Date.now() - start,
188
+ suggestions: [
189
+ "Run `poolbot gateway status` for detailed status",
190
+ "Run `poolbot gateway restart` to restart the gateway",
191
+ ],
192
+ };
193
+ }
194
+ return {
195
+ name: "gateway",
196
+ status: "ok",
197
+ message: "Gateway is healthy",
198
+ durationMs: Date.now() - start,
199
+ };
200
+ }
201
+ catch (err) {
202
+ return {
203
+ name: "gateway",
204
+ status: "error",
205
+ message: `Failed to check gateway: ${String(err)}`,
206
+ durationMs: Date.now() - start,
207
+ };
208
+ }
209
+ },
210
+ security: async () => {
211
+ const start = Date.now();
212
+ try {
213
+ const cfg = await safeLoadConfig();
214
+ if (!cfg) {
215
+ return {
216
+ name: "security",
217
+ status: "skipped",
218
+ message: "Could not load configuration",
219
+ durationMs: Date.now() - start,
220
+ };
221
+ }
222
+ // Check for security warnings
223
+ const warnings = [];
224
+ const suggestions = [];
225
+ // Check gateway auth
226
+ const gateway = cfg.gateway;
227
+ const auth = gateway?.auth;
228
+ const authMode = auth?.mode;
229
+ if (authMode === "off") {
230
+ warnings.push("Gateway authentication is disabled");
231
+ suggestions.push("Enable token auth: poolbot config set gateway.auth.mode token");
232
+ }
233
+ // Check channel allowlists
234
+ const channels = cfg.channels;
235
+ if (channels) {
236
+ for (const [name, channel] of Object.entries(channels)) {
237
+ if (channel && typeof channel === "object") {
238
+ const ch = channel;
239
+ if (!ch.allowFrom || ch.allowFrom.length === 0) {
240
+ warnings.push(`Channel ${name} has no allowlist configured`);
241
+ }
242
+ }
243
+ }
244
+ }
245
+ if (warnings.length > 0) {
246
+ return {
247
+ name: "security",
248
+ status: "warning",
249
+ message: `${warnings.length} security warning(s) found`,
250
+ durationMs: Date.now() - start,
251
+ suggestions,
252
+ details: { warnings },
253
+ };
254
+ }
255
+ return {
256
+ name: "security",
257
+ status: "ok",
258
+ message: "No security warnings detected",
259
+ durationMs: Date.now() - start,
260
+ };
261
+ }
262
+ catch (err) {
263
+ return {
264
+ name: "security",
265
+ status: "error",
266
+ message: `Failed to check security: ${String(err)}`,
267
+ durationMs: Date.now() - start,
268
+ };
269
+ }
270
+ },
271
+ plugins: async () => {
272
+ const start = Date.now();
273
+ // This is a simplified check - real implementation would load plugin registry
274
+ return {
275
+ name: "plugins",
276
+ status: "ok",
277
+ message: "Plugin check not yet implemented",
278
+ durationMs: Date.now() - start,
279
+ };
280
+ },
281
+ memory: async () => {
282
+ const start = Date.now();
283
+ try {
284
+ const cfg = await safeLoadConfig();
285
+ if (!cfg) {
286
+ return {
287
+ name: "memory",
288
+ status: "skipped",
289
+ message: "Could not load configuration",
290
+ durationMs: Date.now() - start,
291
+ };
292
+ }
293
+ const agents = cfg.agents;
294
+ const defaults = agents?.defaults;
295
+ const memorySearch = defaults?.memorySearch;
296
+ const memoryEnabled = memorySearch?.enabled ?? false;
297
+ if (!memoryEnabled) {
298
+ return {
299
+ name: "memory",
300
+ status: "warning",
301
+ message: "Memory search is disabled",
302
+ durationMs: Date.now() - start,
303
+ suggestions: [
304
+ "Enable memory: poolbot config set agents.defaults.memorySearch.enabled true",
305
+ ],
306
+ };
307
+ }
308
+ return {
309
+ name: "memory",
310
+ status: "ok",
311
+ message: "Memory search is enabled",
312
+ durationMs: Date.now() - start,
313
+ };
314
+ }
315
+ catch (err) {
316
+ return {
317
+ name: "memory",
318
+ status: "error",
319
+ message: `Failed to check memory: ${String(err)}`,
320
+ durationMs: Date.now() - start,
321
+ };
322
+ }
323
+ },
324
+ workspace: async () => {
325
+ const start = Date.now();
326
+ try {
327
+ const agentScope = await import("../agents/agent-scope.js");
328
+ const cfg = await safeLoadConfig();
329
+ if (!cfg) {
330
+ return {
331
+ name: "workspace",
332
+ status: "skipped",
333
+ message: "Could not load configuration",
334
+ durationMs: Date.now() - start,
335
+ };
336
+ }
337
+ const agentId = agentScope.resolveDefaultAgentId(cfg);
338
+ const workspaceDir = agentScope.resolveAgentWorkspaceDir(cfg, agentId);
339
+ // Check if workspace exists
340
+ const fs = await import("node:fs");
341
+ if (!fs.existsSync(workspaceDir)) {
342
+ return {
343
+ name: "workspace",
344
+ status: "warning",
345
+ message: `Workspace directory does not exist`,
346
+ durationMs: Date.now() - start,
347
+ suggestions: ["The workspace will be created on first agent run"],
348
+ details: { path: workspaceDir },
349
+ };
350
+ }
351
+ return {
352
+ name: "workspace",
353
+ status: "ok",
354
+ message: `Workspace ready`,
355
+ durationMs: Date.now() - start,
356
+ details: { path: workspaceDir },
357
+ };
358
+ }
359
+ catch (err) {
360
+ return {
361
+ name: "workspace",
362
+ status: "error",
363
+ message: `Failed to check workspace: ${String(err)}`,
364
+ durationMs: Date.now() - start,
365
+ };
366
+ }
367
+ },
368
+ state: async () => {
369
+ const start = Date.now();
370
+ try {
371
+ const { resolveStateDir } = await import("../config/paths.js");
372
+ const path = await import("node:path");
373
+ const fs = await import("node:fs");
374
+ const stateDir = resolveStateDir();
375
+ const checks = {
376
+ stateDir: fs.existsSync(stateDir),
377
+ completions: fs.existsSync(path.join(stateDir, "completions")),
378
+ sessions: fs.existsSync(path.join(stateDir, "sessions")),
379
+ };
380
+ const missing = Object.entries(checks)
381
+ .filter(([, exists]) => !exists)
382
+ .map(([name]) => name);
383
+ if (missing.length > 0) {
384
+ return {
385
+ name: "state",
386
+ status: "warning",
387
+ message: `Missing state directories: ${missing.join(", ")}`,
388
+ durationMs: Date.now() - start,
389
+ suggestions: ["Run `poolbot doctor --fix` to create missing directories"],
390
+ details: { checks },
391
+ };
392
+ }
393
+ return {
394
+ name: "state",
395
+ status: "ok",
396
+ message: "All state directories present",
397
+ durationMs: Date.now() - start,
398
+ details: { checks },
399
+ };
400
+ }
401
+ catch (err) {
402
+ return {
403
+ name: "state",
404
+ status: "error",
405
+ message: `Failed to check state: ${String(err)}`,
406
+ durationMs: Date.now() - start,
407
+ };
408
+ }
409
+ },
410
+ };
411
+ /**
412
+ * Run a specific check by name
413
+ */
414
+ export async function runDoctorCheck(name, params) {
415
+ const checkFn = doctorCheckRegistry[name];
416
+ if (!checkFn) {
417
+ return {
418
+ name,
419
+ status: "error",
420
+ message: `Unknown check: ${name}`,
421
+ durationMs: 0,
422
+ };
423
+ }
424
+ return checkFn(params);
425
+ }
426
+ /**
427
+ * Run all checks and generate report
428
+ */
429
+ export async function runAllDoctorChecks(params) {
430
+ const checks = [
431
+ "config",
432
+ "auth",
433
+ "completion",
434
+ "gateway",
435
+ "security",
436
+ "memory",
437
+ "workspace",
438
+ "state",
439
+ ];
440
+ const results = [];
441
+ for (const checkName of checks) {
442
+ const result = await runDoctorCheck(checkName, params);
443
+ results.push(result);
444
+ }
445
+ // Calculate health score
446
+ const weights = { ok: 1, warning: 0.5, error: 0, skipped: 0.75 };
447
+ const totalWeight = results.reduce((sum, r) => sum + weights[r.status], 0);
448
+ const healthScore = Math.round((totalWeight / results.length) * 100);
449
+ return {
450
+ timestamp: new Date().toISOString(),
451
+ version: "2026.3.9", // Should be dynamic
452
+ checks: results,
453
+ summary: {
454
+ total: results.length,
455
+ ok: results.filter((r) => r.status === "ok").length,
456
+ warning: results.filter((r) => r.status === "warning").length,
457
+ error: results.filter((r) => r.status === "error").length,
458
+ skipped: results.filter((r) => r.status === "skipped").length,
459
+ autoFixed: results.filter((r) => r.autoFixed).length,
460
+ },
461
+ healthScore,
462
+ };
463
+ }
464
+ /**
465
+ * Format report for console output
466
+ */
467
+ export function formatDoctorReport(report) {
468
+ const lines = [];
469
+ // Header
470
+ lines.push("╔════════════════════════════════════════════════════════╗");
471
+ lines.push("║ 🏥 PoolBot Doctor Report ║");
472
+ lines.push("╚════════════════════════════════════════════════════════╝");
473
+ lines.push("");
474
+ // Health score
475
+ const scoreColor = report.healthScore >= 80 ? "🟢" : report.healthScore >= 50 ? "🟡" : "🔴";
476
+ lines.push(`Health Score: ${scoreColor} ${report.healthScore}/100`);
477
+ lines.push("");
478
+ // Summary
479
+ lines.push("Summary:");
480
+ lines.push(` ✅ OK: ${report.summary.ok}/${report.summary.total}`);
481
+ lines.push(` ⚠️ Warning: ${report.summary.warning}/${report.summary.total}`);
482
+ lines.push(` ❌ Error: ${report.summary.error}/${report.summary.total}`);
483
+ if (report.summary.autoFixed > 0) {
484
+ lines.push(` 🔧 Auto-fixed: ${report.summary.autoFixed}`);
485
+ }
486
+ lines.push("");
487
+ // Individual checks
488
+ for (const check of report.checks) {
489
+ const icon = check.status === "ok" ? "✅" : check.status === "warning" ? "⚠️" : "❌";
490
+ lines.push(`${icon} ${check.name.padEnd(12)} ${check.message}`);
491
+ if (check.suggestions && check.suggestions.length > 0) {
492
+ for (const suggestion of check.suggestions) {
493
+ lines.push(` 💡 ${suggestion}`);
494
+ }
495
+ }
496
+ }
497
+ return lines.join("\n");
498
+ }
@@ -30,4 +30,4 @@
30
30
  // Registry
31
31
  export { ContextEngineRegistry, globalContextEngineRegistry, resolveContextEngine, } from "./registry.js";
32
32
  // Legacy Engine
33
- export { LegacyContextEngine, createLegacyContextEngine, } from "./legacy.js";
33
+ export { LegacyContextEngine, createLegacyContextEngine } from "./legacy.js";
@@ -165,9 +165,7 @@ export class LegacyContextEngine {
165
165
  estimateTokenCount(messages) {
166
166
  let totalChars = 0;
167
167
  for (const msg of messages) {
168
- const content = typeof msg.content === "string"
169
- ? msg.content
170
- : JSON.stringify(msg.content);
168
+ const content = typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content);
171
169
  totalChars += content.length;
172
170
  }
173
171
  return Math.ceil(totalChars / 4);
@@ -159,8 +159,8 @@ export class SummarizingContextEngine {
159
159
  }
160
160
  // Sort by internalTimestamp for final output
161
161
  included.sort((a, b) => {
162
- const ta = session.messages.find(m => m.id === a.id)?.internalTimestamp ?? 0;
163
- const tb = session.messages.find(m => m.id === b.id)?.internalTimestamp ?? 0;
162
+ const ta = session.messages.find((m) => m.id === a.id)?.internalTimestamp ?? 0;
163
+ const tb = session.messages.find((m) => m.id === b.id)?.internalTimestamp ?? 0;
164
164
  return ta - tb;
165
165
  });
166
166
  resultMessages.push(...included);
@@ -188,9 +188,7 @@ export class SummarizingContextEngine {
188
188
  const summary = this.generateSummary(toSummarize);
189
189
  const _summaryTokens = estimateTokens(summary);
190
190
  // Update session
191
- session.summary = session.summary
192
- ? `${session.summary} ${summary}`
193
- : summary;
191
+ session.summary = session.summary ? `${session.summary} ${summary}` : summary;
194
192
  session.summaryTokens = estimateTokens(session.summary);
195
193
  session.messages = toKeep;
196
194
  const newTokens = this.getTotalTokenCount(session);
@@ -236,8 +234,7 @@ export class SummarizingContextEngine {
236
234
  priority += 20;
237
235
  }
238
236
  // Messages with tool calls/results are important
239
- if (message.metadata?.tool_calls ||
240
- message.metadata?.tool_call_id) {
237
+ if (message.metadata?.tool_calls || message.metadata?.tool_call_id) {
241
238
  priority += 15;
242
239
  }
243
240
  return Math.min(100, priority);
@@ -265,7 +262,7 @@ export class SummarizingContextEngine {
265
262
  */
266
263
  extractTopics(messages) {
267
264
  const allContent = messages
268
- .map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content))
265
+ .map((m) => (typeof m.content === "string" ? m.content : JSON.stringify(m.content)))
269
266
  .join(" ")
270
267
  .toLowerCase();
271
268
  // Simple keyword extraction
@@ -618,6 +618,24 @@ function emitJobFinished(state, job, result, runAtMs) {
618
618
  provider: result.provider,
619
619
  usage: result.usage,
620
620
  });
621
+ // Emit telemetry metrics
622
+ if (state.deps.onJobMetrics) {
623
+ const scheduleStr = job.schedule.kind === "cron"
624
+ ? job.schedule.expr
625
+ : job.schedule.kind === "every"
626
+ ? `every ${job.schedule.everyMs}ms`
627
+ : job.schedule.kind === "at"
628
+ ? job.schedule.at
629
+ : "unknown";
630
+ state.deps.onJobMetrics({
631
+ jobId: job.id,
632
+ jobName: job.name,
633
+ schedule: scheduleStr,
634
+ success: result.status === "ok",
635
+ durationMs: job.state.lastDurationMs ?? 0,
636
+ errorType: result.status === "error" ? (result.error ?? "unknown") : undefined,
637
+ });
638
+ }
621
639
  }
622
640
  export function wake(state, opts) {
623
641
  const text = opts.text.trim();
@@ -1,5 +1,5 @@
1
1
  import AjvPkg from "ajv";
2
- import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PushTestParamsSchema, PushTestResultSchema, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
2
+ import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PushTestParamsSchema, PushTestResultSchema, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, SwarmListParamsSchema, SwarmStatusParamsSchema, SwarmCreateParamsSchema, SwarmListResultSchema, SwarmStatusResultSchema, SwarmCreateResultSchema, SwarmStateSchema, SwarmMemberSchema, SwarmTaskSchema, SwarmStrategySchema, } from "./schema.js";
3
3
  const ajv = new AjvPkg({
4
4
  allErrors: true,
5
5
  strict: false,
@@ -88,6 +88,9 @@ export const validateChatEvent = ajv.compile(ChatEventSchema);
88
88
  export const validateUpdateRunParams = ajv.compile(UpdateRunParamsSchema);
89
89
  export const validateWebLoginStartParams = ajv.compile(WebLoginStartParamsSchema);
90
90
  export const validateWebLoginWaitParams = ajv.compile(WebLoginWaitParamsSchema);
91
+ export const validateSwarmListParams = ajv.compile(SwarmListParamsSchema);
92
+ export const validateSwarmStatusParams = ajv.compile(SwarmStatusParamsSchema);
93
+ export const validateSwarmCreateParams = ajv.compile(SwarmCreateParamsSchema);
91
94
  export function formatValidationErrors(errors) {
92
95
  if (!errors?.length) {
93
96
  return "unknown validation error";
@@ -117,4 +120,4 @@ export function formatValidationErrors(errors) {
117
120
  }
118
121
  return unique.join("; ");
119
122
  }
120
- export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, PushTestParamsSchema, PushTestResultSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
123
+ export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, PushTestParamsSchema, PushTestResultSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, SwarmListParamsSchema, SwarmStatusParamsSchema, SwarmCreateParamsSchema, SwarmListResultSchema, SwarmStatusResultSchema, SwarmCreateResultSchema, SwarmStateSchema, SwarmMemberSchema, SwarmTaskSchema, SwarmStrategySchema, };
@@ -4,6 +4,7 @@ export const ErrorCodes = {
4
4
  AGENT_TIMEOUT: "AGENT_TIMEOUT",
5
5
  INVALID_REQUEST: "INVALID_REQUEST",
6
6
  UNAVAILABLE: "UNAVAILABLE",
7
+ INTERNAL_ERROR: "INTERNAL_ERROR",
7
8
  };
8
9
  export function errorShape(code, message, opts) {
9
10
  return {