swarm-engine 1.51.0 → 1.54.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 (63) hide show
  1. package/dist/cli/commands/usage.d.ts +3 -0
  2. package/dist/cli/commands/usage.d.ts.map +1 -0
  3. package/dist/cli/commands/usage.js +85 -0
  4. package/dist/cli/commands/usage.js.map +1 -0
  5. package/dist/cli/index.js +2 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/core/types.d.ts +21 -1
  8. package/dist/core/types.d.ts.map +1 -1
  9. package/dist/core/types.js.map +1 -1
  10. package/dist/hooks/cli.js +4 -1
  11. package/dist/hooks/cli.js.map +1 -1
  12. package/dist/hooks/index.d.ts +9 -0
  13. package/dist/hooks/index.d.ts.map +1 -1
  14. package/dist/hooks/index.js +54 -0
  15. package/dist/hooks/index.js.map +1 -1
  16. package/dist/hooks/transcript-parser.d.ts +68 -0
  17. package/dist/hooks/transcript-parser.d.ts.map +1 -0
  18. package/dist/hooks/transcript-parser.js +163 -0
  19. package/dist/hooks/transcript-parser.js.map +1 -0
  20. package/dist/hooks/usage-logger.d.ts +30 -0
  21. package/dist/hooks/usage-logger.d.ts.map +1 -0
  22. package/dist/hooks/usage-logger.js +67 -0
  23. package/dist/hooks/usage-logger.js.map +1 -0
  24. package/dist/index.d.ts +13 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +8 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/runtime/agent-runner.d.ts +1 -0
  29. package/dist/runtime/agent-runner.d.ts.map +1 -1
  30. package/dist/runtime/agent-runner.js +77 -10
  31. package/dist/runtime/agent-runner.js.map +1 -1
  32. package/dist/runtime/backends/claude.d.ts +29 -0
  33. package/dist/runtime/backends/claude.d.ts.map +1 -1
  34. package/dist/runtime/backends/claude.js +63 -1
  35. package/dist/runtime/backends/claude.js.map +1 -1
  36. package/dist/runtime/engine.d.ts +1 -0
  37. package/dist/runtime/engine.d.ts.map +1 -1
  38. package/dist/runtime/engine.js +100 -1
  39. package/dist/runtime/engine.js.map +1 -1
  40. package/dist/runtime/handoff.d.ts +8 -0
  41. package/dist/runtime/handoff.d.ts.map +1 -0
  42. package/dist/runtime/handoff.js +109 -0
  43. package/dist/runtime/handoff.js.map +1 -0
  44. package/dist/runtime/heuristics.d.ts +2 -1
  45. package/dist/runtime/heuristics.d.ts.map +1 -1
  46. package/dist/runtime/heuristics.js +15 -2
  47. package/dist/runtime/heuristics.js.map +1 -1
  48. package/dist/runtime/model-router.d.ts +2 -1
  49. package/dist/runtime/model-router.d.ts.map +1 -1
  50. package/dist/runtime/model-router.js +8 -1
  51. package/dist/runtime/model-router.js.map +1 -1
  52. package/dist/runtime/savings-manifest.d.ts +66 -0
  53. package/dist/runtime/savings-manifest.d.ts.map +1 -0
  54. package/dist/runtime/savings-manifest.js +103 -0
  55. package/dist/runtime/savings-manifest.js.map +1 -0
  56. package/dist/runtime/stats.d.ts.map +1 -1
  57. package/dist/runtime/stats.js +6 -0
  58. package/dist/runtime/stats.js.map +1 -1
  59. package/dist/runtime/violation-tracker.d.ts +31 -0
  60. package/dist/runtime/violation-tracker.d.ts.map +1 -0
  61. package/dist/runtime/violation-tracker.js +125 -0
  62. package/dist/runtime/violation-tracker.js.map +1 -0
  63. package/package.json +1 -1
@@ -0,0 +1,125 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ import { dirname } from 'path';
4
+ import { getDatabase } from './database.js';
5
+ export class ViolationTracker {
6
+ db;
7
+ ownDb;
8
+ constructor(dbPath) {
9
+ if (dbPath) {
10
+ const dir = dirname(dbPath);
11
+ if (!existsSync(dir))
12
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
13
+ this.db = new Database(dbPath);
14
+ this.db.pragma('journal_mode = WAL');
15
+ this.db.pragma('busy_timeout = 5000');
16
+ this.ownDb = true;
17
+ }
18
+ else {
19
+ this.db = getDatabase();
20
+ this.ownDb = false;
21
+ }
22
+ this.initSchema();
23
+ }
24
+ initSchema() {
25
+ this.db.exec(`
26
+ CREATE TABLE IF NOT EXISTS violation_log (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ type TEXT NOT NULL,
29
+ orchestration_id TEXT NOT NULL,
30
+ phase TEXT,
31
+ agent_type TEXT,
32
+ details TEXT NOT NULL,
33
+ repo TEXT,
34
+ created_at TEXT DEFAULT (datetime('now'))
35
+ );
36
+ CREATE INDEX IF NOT EXISTS idx_violation_type ON violation_log(type);
37
+ CREATE INDEX IF NOT EXISTS idx_violation_repo ON violation_log(repo);
38
+ `);
39
+ }
40
+ /** Record a violation */
41
+ record(violation) {
42
+ this.db
43
+ .prepare(`INSERT INTO violation_log (type, orchestration_id, phase, agent_type, details, repo)
44
+ VALUES (?, ?, ?, ?, ?, ?)`)
45
+ .run(violation.type, violation.orchestrationId, violation.phase ?? null, violation.agentType ?? null, violation.details, violation.repo ?? null);
46
+ }
47
+ /** Get hot spots — violations that recurred across multiple orchestrations */
48
+ getHotSpots(repo, minCount) {
49
+ const min = minCount ?? 2;
50
+ // Use a simpler two-query approach for the "most recent details" to avoid
51
+ // correlated subquery issues with the GROUP BY + HAVING clause.
52
+ let rows;
53
+ if (repo) {
54
+ rows = this.db
55
+ .prepare(`SELECT type, COUNT(*) as count, MAX(created_at) as last_seen
56
+ FROM violation_log
57
+ WHERE repo = ?
58
+ GROUP BY type
59
+ HAVING count >= ?
60
+ ORDER BY count DESC`)
61
+ .all(repo, min);
62
+ }
63
+ else {
64
+ rows = this.db
65
+ .prepare(`SELECT type, COUNT(*) as count, MAX(created_at) as last_seen
66
+ FROM violation_log
67
+ GROUP BY type
68
+ HAVING count >= ?
69
+ ORDER BY count DESC`)
70
+ .all(min);
71
+ }
72
+ return rows.map((r) => {
73
+ // Fetch most recent details for this type in a separate query
74
+ let detailRow;
75
+ if (repo) {
76
+ detailRow = this.db
77
+ .prepare(`SELECT details FROM violation_log WHERE type = ? AND repo = ? ORDER BY created_at DESC LIMIT 1`)
78
+ .get(r.type, repo);
79
+ }
80
+ else {
81
+ detailRow = this.db
82
+ .prepare(`SELECT details FROM violation_log WHERE type = ? ORDER BY created_at DESC LIMIT 1`)
83
+ .get(r.type);
84
+ }
85
+ return {
86
+ type: r.type,
87
+ count: r.count,
88
+ lastSeen: r.last_seen,
89
+ details: detailRow?.details ?? '',
90
+ };
91
+ });
92
+ }
93
+ /** Get recent violations for a specific orchestration */
94
+ getForOrchestration(orchestrationId) {
95
+ const rows = this.db
96
+ .prepare(`SELECT type, orchestration_id, phase, agent_type, details, repo
97
+ FROM violation_log WHERE orchestration_id = ?
98
+ ORDER BY id DESC`)
99
+ .all(orchestrationId);
100
+ return rows.map((r) => ({
101
+ type: r.type,
102
+ orchestrationId: r.orchestration_id,
103
+ phase: r.phase ?? undefined,
104
+ agentType: r.agent_type ?? undefined,
105
+ details: r.details,
106
+ repo: r.repo ?? undefined,
107
+ }));
108
+ }
109
+ /** Format hot spots as a pre-flight warning string */
110
+ formatPreFlightWarnings(repo) {
111
+ const hotSpots = this.getHotSpots(repo, 2);
112
+ if (hotSpots.length === 0)
113
+ return null;
114
+ const lines = ['## Pre-flight Warnings (recurring violations)'];
115
+ for (const hs of hotSpots) {
116
+ lines.push(`- **${hs.type}** (${hs.count}× across runs, last: ${hs.lastSeen}): ${hs.details}`);
117
+ }
118
+ return lines.join('\n');
119
+ }
120
+ close() {
121
+ if (this.ownDb)
122
+ this.db.close();
123
+ }
124
+ }
125
+ //# sourceMappingURL=violation-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violation-tracker.js","sourceRoot":"","sources":["../../src/runtime/violation-tracker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swarm-engine",
3
- "version": "1.51.0",
3
+ "version": "1.54.0",
4
4
  "description": "Self-aware multi-agent orchestration engine with knowledge graph, causal inference, GNN failure prediction, and self-evolving rules — pure TypeScript",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",