universal-agent-memory 0.1.4 → 0.2.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 (73) hide show
  1. package/dist/analyzers/index.d.ts.map +1 -1
  2. package/dist/analyzers/index.js +75 -0
  3. package/dist/analyzers/index.js.map +1 -1
  4. package/dist/bin/cli.js +207 -0
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/cli/agent.d.ts +20 -0
  7. package/dist/cli/agent.d.ts.map +1 -0
  8. package/dist/cli/agent.js +388 -0
  9. package/dist/cli/agent.js.map +1 -0
  10. package/dist/cli/coord.d.ts +7 -0
  11. package/dist/cli/coord.d.ts.map +1 -0
  12. package/dist/cli/coord.js +145 -0
  13. package/dist/cli/coord.js.map +1 -0
  14. package/dist/cli/deploy.d.ts +19 -0
  15. package/dist/cli/deploy.d.ts.map +1 -0
  16. package/dist/cli/deploy.js +267 -0
  17. package/dist/cli/deploy.js.map +1 -0
  18. package/dist/cli/task.d.ts +33 -0
  19. package/dist/cli/task.d.ts.map +1 -0
  20. package/dist/cli/task.js +570 -0
  21. package/dist/cli/task.js.map +1 -0
  22. package/dist/coordination/database.d.ts +13 -0
  23. package/dist/coordination/database.d.ts.map +1 -0
  24. package/dist/coordination/database.js +131 -0
  25. package/dist/coordination/database.js.map +1 -0
  26. package/dist/coordination/deploy-batcher.d.ts +38 -0
  27. package/dist/coordination/deploy-batcher.d.ts.map +1 -0
  28. package/dist/coordination/deploy-batcher.js +401 -0
  29. package/dist/coordination/deploy-batcher.js.map +1 -0
  30. package/dist/coordination/index.d.ts +4 -0
  31. package/dist/coordination/index.d.ts.map +1 -0
  32. package/dist/coordination/index.js +4 -0
  33. package/dist/coordination/index.js.map +1 -0
  34. package/dist/coordination/service.d.ts +79 -0
  35. package/dist/coordination/service.d.ts.map +1 -0
  36. package/dist/coordination/service.js +591 -0
  37. package/dist/coordination/service.js.map +1 -0
  38. package/dist/generators/claude-md.js +2 -1
  39. package/dist/generators/claude-md.js.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/tasks/coordination.d.ts +74 -0
  45. package/dist/tasks/coordination.d.ts.map +1 -0
  46. package/dist/tasks/coordination.js +237 -0
  47. package/dist/tasks/coordination.js.map +1 -0
  48. package/dist/tasks/database.d.ts +14 -0
  49. package/dist/tasks/database.d.ts.map +1 -0
  50. package/dist/tasks/database.js +128 -0
  51. package/dist/tasks/database.js.map +1 -0
  52. package/dist/tasks/index.d.ts +5 -0
  53. package/dist/tasks/index.d.ts.map +1 -0
  54. package/dist/tasks/index.js +5 -0
  55. package/dist/tasks/index.js.map +1 -0
  56. package/dist/tasks/service.d.ts +39 -0
  57. package/dist/tasks/service.d.ts.map +1 -0
  58. package/dist/tasks/service.js +582 -0
  59. package/dist/tasks/service.js.map +1 -0
  60. package/dist/tasks/types.d.ts +224 -0
  61. package/dist/tasks/types.d.ts.map +1 -0
  62. package/dist/tasks/types.js +64 -0
  63. package/dist/tasks/types.js.map +1 -0
  64. package/dist/types/coordination.d.ts +240 -0
  65. package/dist/types/coordination.d.ts.map +1 -0
  66. package/dist/types/coordination.js +43 -0
  67. package/dist/types/coordination.js.map +1 -0
  68. package/dist/types/index.d.ts +1 -0
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/types/index.js +1 -0
  71. package/dist/types/index.js.map +1 -1
  72. package/package.json +1 -1
  73. package/templates/CLAUDE.template.md +335 -48
@@ -0,0 +1,131 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ import { dirname } from 'path';
4
+ export class CoordinationDatabase {
5
+ db;
6
+ static instance = null;
7
+ constructor(dbPath) {
8
+ const dir = dirname(dbPath);
9
+ if (!existsSync(dir)) {
10
+ mkdirSync(dir, { recursive: true });
11
+ }
12
+ this.db = new Database(dbPath);
13
+ this.initSchema();
14
+ }
15
+ static getInstance(dbPath) {
16
+ if (!CoordinationDatabase.instance) {
17
+ CoordinationDatabase.instance = new CoordinationDatabase(dbPath);
18
+ }
19
+ return CoordinationDatabase.instance;
20
+ }
21
+ static resetInstance() {
22
+ if (CoordinationDatabase.instance) {
23
+ CoordinationDatabase.instance.close();
24
+ CoordinationDatabase.instance = null;
25
+ }
26
+ }
27
+ getDatabase() {
28
+ return this.db;
29
+ }
30
+ initSchema() {
31
+ this.db.exec(`
32
+ -- Agent registry for tracking active agents
33
+ CREATE TABLE IF NOT EXISTS agent_registry (
34
+ id TEXT PRIMARY KEY,
35
+ name TEXT NOT NULL,
36
+ session_id TEXT NOT NULL,
37
+ status TEXT NOT NULL CHECK(status IN ('active', 'idle', 'completed', 'failed')),
38
+ current_task TEXT,
39
+ worktree_branch TEXT,
40
+ started_at TEXT NOT NULL,
41
+ last_heartbeat TEXT NOT NULL,
42
+ capabilities TEXT
43
+ );
44
+ CREATE INDEX IF NOT EXISTS idx_agent_registry_session ON agent_registry(session_id);
45
+ CREATE INDEX IF NOT EXISTS idx_agent_registry_status ON agent_registry(status);
46
+
47
+ -- Message bus for inter-agent communication
48
+ CREATE TABLE IF NOT EXISTS agent_messages (
49
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
50
+ channel TEXT NOT NULL,
51
+ from_agent TEXT,
52
+ to_agent TEXT,
53
+ type TEXT NOT NULL CHECK(type IN ('request', 'response', 'notification', 'claim', 'release')),
54
+ payload TEXT NOT NULL,
55
+ priority INTEGER DEFAULT 5,
56
+ created_at TEXT NOT NULL,
57
+ read_at TEXT,
58
+ expires_at TEXT
59
+ );
60
+ CREATE INDEX IF NOT EXISTS idx_messages_channel ON agent_messages(channel);
61
+ CREATE INDEX IF NOT EXISTS idx_messages_to_agent ON agent_messages(to_agent);
62
+ CREATE INDEX IF NOT EXISTS idx_messages_created ON agent_messages(created_at);
63
+
64
+ -- Work announcements (informational - for coordination, NOT locking)
65
+ -- Agents announce what they're working on so others can optimize velocity
66
+ CREATE TABLE IF NOT EXISTS work_announcements (
67
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
68
+ agent_id TEXT NOT NULL,
69
+ agent_name TEXT,
70
+ worktree_branch TEXT,
71
+ intent_type TEXT NOT NULL CHECK(intent_type IN ('editing', 'reviewing', 'refactoring', 'testing', 'documenting')),
72
+ resource TEXT NOT NULL,
73
+ description TEXT,
74
+ files_affected TEXT,
75
+ estimated_completion TEXT,
76
+ announced_at TEXT NOT NULL,
77
+ completed_at TEXT,
78
+ FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
79
+ );
80
+ CREATE INDEX IF NOT EXISTS idx_announcements_agent ON work_announcements(agent_id);
81
+ CREATE INDEX IF NOT EXISTS idx_announcements_resource ON work_announcements(resource);
82
+ CREATE INDEX IF NOT EXISTS idx_announcements_active ON work_announcements(completed_at) WHERE completed_at IS NULL;
83
+
84
+ -- Legacy work_claims table (for backward compatibility, maps to announcements)
85
+ CREATE TABLE IF NOT EXISTS work_claims (
86
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
87
+ resource TEXT NOT NULL,
88
+ agent_id TEXT NOT NULL,
89
+ claim_type TEXT NOT NULL CHECK(claim_type IN ('exclusive', 'shared')),
90
+ claimed_at TEXT NOT NULL,
91
+ expires_at TEXT,
92
+ FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
93
+ );
94
+ CREATE INDEX IF NOT EXISTS idx_claims_agent ON work_claims(agent_id);
95
+
96
+ -- Deployment batching queue
97
+ CREATE TABLE IF NOT EXISTS deploy_queue (
98
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
99
+ agent_id TEXT NOT NULL,
100
+ action_type TEXT NOT NULL CHECK(action_type IN ('commit', 'push', 'merge', 'deploy', 'workflow')),
101
+ target TEXT NOT NULL,
102
+ payload TEXT,
103
+ status TEXT NOT NULL CHECK(status IN ('pending', 'batched', 'executing', 'completed', 'failed')),
104
+ batch_id TEXT,
105
+ queued_at TEXT NOT NULL,
106
+ execute_after TEXT,
107
+ priority INTEGER DEFAULT 5,
108
+ dependencies TEXT
109
+ );
110
+ CREATE INDEX IF NOT EXISTS idx_deploy_status ON deploy_queue(status);
111
+ CREATE INDEX IF NOT EXISTS idx_deploy_batch ON deploy_queue(batch_id);
112
+ CREATE INDEX IF NOT EXISTS idx_deploy_target ON deploy_queue(target);
113
+
114
+ -- Batch tracking
115
+ CREATE TABLE IF NOT EXISTS deploy_batches (
116
+ id TEXT PRIMARY KEY,
117
+ created_at TEXT NOT NULL,
118
+ executed_at TEXT,
119
+ status TEXT NOT NULL CHECK(status IN ('pending', 'executing', 'completed', 'failed')),
120
+ result TEXT
121
+ );
122
+ `);
123
+ }
124
+ close() {
125
+ this.db.close();
126
+ }
127
+ }
128
+ export function getDefaultCoordinationDbPath() {
129
+ return './agents/data/coordination/coordination.db';
130
+ }
131
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/coordination/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,OAAO,oBAAoB;IACvB,EAAE,CAAoB;IACtB,MAAM,CAAC,QAAQ,GAAgC,IAAI,CAAC;IAE5D,YAAoB,MAAc;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAc;QAC/B,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YACnC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,IAAI,oBAAoB,CAAC,QAAQ,EAAE,CAAC;YAClC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtC,oBAAoB,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2FZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;;AAGH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,4CAA4C,CAAC;AACtD,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { DeployBatch, BatchResult, DeployActionType } from '../types/coordination.js';
2
+ export interface DeployBatcherConfig {
3
+ dbPath?: string;
4
+ batchWindowMs?: number;
5
+ maxBatchSize?: number;
6
+ dryRun?: boolean;
7
+ }
8
+ export declare class DeployBatcher {
9
+ private db;
10
+ private batchWindowMs;
11
+ private maxBatchSize;
12
+ private dryRun;
13
+ constructor(config?: DeployBatcherConfig);
14
+ queue(agentId: string, actionType: DeployActionType, target: string, payload?: Record<string, unknown>, options?: {
15
+ priority?: number;
16
+ dependencies?: string[];
17
+ }): Promise<number>;
18
+ private findSimilarAction;
19
+ private canMerge;
20
+ private mergeActions;
21
+ private mergePayloads;
22
+ createBatch(): Promise<DeployBatch | null>;
23
+ private groupByTarget;
24
+ private squashActions;
25
+ private squashCommits;
26
+ executeBatch(batchId: string): Promise<BatchResult>;
27
+ private executeAction;
28
+ private executeCommit;
29
+ private executePush;
30
+ private executeMerge;
31
+ private executeWorkflow;
32
+ private executeDeploy;
33
+ private updateActionStatus;
34
+ getBatch(batchId: string): DeployBatch | null;
35
+ getPendingBatches(): DeployBatch[];
36
+ flushAll(): Promise<BatchResult[]>;
37
+ }
38
+ //# sourceMappingURL=deploy-batcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-batcher.d.ts","sourceRoot":"","sources":["../../src/coordination/deploy-batcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAgB,MAAM,0BAA0B,CAAC;AAGvH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,GAAE,mBAAwB;IAStC,KAAK,CACT,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GAC3D,OAAO,CAAC,MAAM,CAAC;IA8BlB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,QAAQ;YA2BF,YAAY;IAoB1B,OAAO,CAAC,aAAa;IAqBf,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA2DhD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,aAAa;IAuCrB,OAAO,CAAC,aAAa;IA8Bf,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YA0D3C,aAAa;YA6Bb,aAAa;YAab,WAAW;YAQX,YAAY;YAWZ,eAAe;YAef,aAAa;IAO3B,OAAO,CAAC,kBAAkB;IAQ1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAiC7C,iBAAiB,IAAI,WAAW,EAAE;IAY5B,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAazC"}
@@ -0,0 +1,401 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { CoordinationDatabase, getDefaultCoordinationDbPath } from './database.js';
3
+ import { execSync } from 'child_process';
4
+ export class DeployBatcher {
5
+ db;
6
+ batchWindowMs;
7
+ maxBatchSize;
8
+ dryRun;
9
+ constructor(config = {}) {
10
+ const dbPath = config.dbPath || getDefaultCoordinationDbPath();
11
+ this.db = CoordinationDatabase.getInstance(dbPath).getDatabase();
12
+ this.batchWindowMs = config.batchWindowMs || 30000; // 30 seconds
13
+ this.maxBatchSize = config.maxBatchSize || 20;
14
+ this.dryRun = config.dryRun || false;
15
+ }
16
+ // Queue a deploy action with batching delay
17
+ async queue(agentId, actionType, target, payload, options = {}) {
18
+ const now = new Date().toISOString();
19
+ const executeAfter = new Date(Date.now() + this.batchWindowMs).toISOString();
20
+ // Check for similar pending action to merge
21
+ const existing = this.findSimilarAction(actionType, target);
22
+ if (existing && this.canMerge(existing, { actionType, target, payload })) {
23
+ await this.mergeActions(existing.id, payload);
24
+ return existing.id;
25
+ }
26
+ const stmt = this.db.prepare(`
27
+ INSERT INTO deploy_queue (agent_id, action_type, target, payload, status, queued_at, execute_after, priority, dependencies)
28
+ VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?)
29
+ `);
30
+ const result = stmt.run(agentId, actionType, target, payload ? JSON.stringify(payload) : null, now, executeAfter, options.priority || 5, options.dependencies ? JSON.stringify(options.dependencies) : null);
31
+ return result.lastInsertRowid;
32
+ }
33
+ findSimilarAction(actionType, target) {
34
+ const stmt = this.db.prepare(`
35
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
36
+ status, batch_id as batchId, queued_at as queuedAt,
37
+ execute_after as executeAfter, priority, dependencies
38
+ FROM deploy_queue
39
+ WHERE action_type = ? AND target = ? AND status = 'pending'
40
+ ORDER BY queued_at DESC
41
+ LIMIT 1
42
+ `);
43
+ const row = stmt.get(actionType, target);
44
+ if (!row)
45
+ return null;
46
+ return {
47
+ ...row,
48
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
49
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
50
+ };
51
+ }
52
+ canMerge(existing, incoming) {
53
+ // Only merge same action types on same target
54
+ if (existing.actionType !== incoming.actionType || existing.target !== incoming.target) {
55
+ return false;
56
+ }
57
+ // Commits can be squashed
58
+ if (existing.actionType === 'commit') {
59
+ return true;
60
+ }
61
+ // Pushes to same branch can be merged
62
+ if (existing.actionType === 'push') {
63
+ return true;
64
+ }
65
+ // Workflow triggers can be deduplicated
66
+ if (existing.actionType === 'workflow') {
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ async mergeActions(existingId, newPayload) {
72
+ if (!newPayload)
73
+ return;
74
+ const stmt = this.db.prepare(`
75
+ SELECT payload FROM deploy_queue WHERE id = ?
76
+ `);
77
+ const row = stmt.get(existingId);
78
+ if (!row)
79
+ return;
80
+ const existingPayload = row.payload ? JSON.parse(row.payload) : {};
81
+ // Merge payloads (new values override, arrays are concatenated)
82
+ const merged = this.mergePayloads(existingPayload, newPayload);
83
+ const updateStmt = this.db.prepare(`
84
+ UPDATE deploy_queue SET payload = ? WHERE id = ?
85
+ `);
86
+ updateStmt.run(JSON.stringify(merged), existingId);
87
+ }
88
+ mergePayloads(existing, incoming) {
89
+ const result = { ...existing };
90
+ for (const [key, value] of Object.entries(incoming)) {
91
+ if (Array.isArray(value) && Array.isArray(result[key])) {
92
+ result[key] = [...result[key], ...value];
93
+ }
94
+ else if (key === 'messages' && Array.isArray(value)) {
95
+ // Special case: concatenate commit messages
96
+ result[key] = [...(result[key] || []), ...value];
97
+ }
98
+ else {
99
+ result[key] = value;
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ // Create a batch from ready actions
105
+ async createBatch() {
106
+ const now = new Date().toISOString();
107
+ // Get actions ready for execution (past their delay)
108
+ const stmt = this.db.prepare(`
109
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
110
+ status, batch_id as batchId, queued_at as queuedAt,
111
+ execute_after as executeAfter, priority, dependencies
112
+ FROM deploy_queue
113
+ WHERE status = 'pending' AND execute_after <= ?
114
+ ORDER BY priority DESC, queued_at ASC
115
+ LIMIT ?
116
+ `);
117
+ const rows = stmt.all(now, this.maxBatchSize);
118
+ if (rows.length === 0)
119
+ return null;
120
+ const actions = rows.map((row) => ({
121
+ ...row,
122
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
123
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
124
+ }));
125
+ // Group by target
126
+ const grouped = this.groupByTarget(actions);
127
+ // Squash compatible actions within each group
128
+ const squashed = this.squashActions(grouped);
129
+ // Create batch
130
+ const batchId = randomUUID();
131
+ // Mark actions as batched
132
+ const updateStmt = this.db.prepare(`
133
+ UPDATE deploy_queue SET status = 'batched', batch_id = ? WHERE id = ?
134
+ `);
135
+ const transaction = this.db.transaction(() => {
136
+ for (const action of actions) {
137
+ updateStmt.run(batchId, action.id);
138
+ }
139
+ // Record batch
140
+ this.db.prepare(`
141
+ INSERT INTO deploy_batches (id, created_at, status)
142
+ VALUES (?, ?, 'pending')
143
+ `).run(batchId, now);
144
+ });
145
+ transaction();
146
+ return {
147
+ id: batchId,
148
+ actions: squashed,
149
+ createdAt: now,
150
+ status: 'pending',
151
+ };
152
+ }
153
+ groupByTarget(actions) {
154
+ const groups = new Map();
155
+ for (const action of actions) {
156
+ const key = `${action.actionType}:${action.target}`;
157
+ const existing = groups.get(key) || [];
158
+ existing.push(action);
159
+ groups.set(key, existing);
160
+ }
161
+ return groups;
162
+ }
163
+ squashActions(grouped) {
164
+ const result = [];
165
+ for (const [, actions] of grouped) {
166
+ if (actions.length === 0)
167
+ continue;
168
+ if (actions.length === 1) {
169
+ result.push(actions[0]);
170
+ continue;
171
+ }
172
+ const first = actions[0];
173
+ // Squash commits
174
+ if (first.actionType === 'commit') {
175
+ const squashed = this.squashCommits(actions);
176
+ result.push(squashed);
177
+ continue;
178
+ }
179
+ // Deduplicate pushes (just keep one)
180
+ if (first.actionType === 'push') {
181
+ result.push(first);
182
+ continue;
183
+ }
184
+ // Deduplicate workflow triggers
185
+ if (first.actionType === 'workflow') {
186
+ result.push(first);
187
+ continue;
188
+ }
189
+ // For other types, keep all
190
+ result.push(...actions);
191
+ }
192
+ return result;
193
+ }
194
+ squashCommits(commits) {
195
+ const messages = [];
196
+ const allFiles = [];
197
+ for (const commit of commits) {
198
+ const payload = commit.payload;
199
+ if (payload?.message) {
200
+ messages.push(payload.message);
201
+ }
202
+ if (payload?.files) {
203
+ allFiles.push(...payload.files);
204
+ }
205
+ }
206
+ // Create squashed commit message
207
+ const squashedMessage = messages.length === 1
208
+ ? messages[0]
209
+ : `Squashed ${messages.length} commits:\n\n${messages.map((m, i) => `${i + 1}. ${m}`).join('\n')}`;
210
+ return {
211
+ ...commits[0],
212
+ payload: {
213
+ message: squashedMessage,
214
+ files: [...new Set(allFiles)], // Deduplicate files
215
+ squashedFrom: commits.map((c) => c.id),
216
+ },
217
+ };
218
+ }
219
+ // Execute a batch
220
+ async executeBatch(batchId) {
221
+ const startTime = Date.now();
222
+ const errors = [];
223
+ let executed = 0;
224
+ let failed = 0;
225
+ // Get batch actions
226
+ const stmt = this.db.prepare(`
227
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
228
+ status, batch_id as batchId, queued_at as queuedAt,
229
+ execute_after as executeAfter, priority, dependencies
230
+ FROM deploy_queue
231
+ WHERE batch_id = ? AND status = 'batched'
232
+ ORDER BY priority DESC, queued_at ASC
233
+ `);
234
+ const rows = stmt.all(batchId);
235
+ const actions = rows.map((row) => ({
236
+ ...row,
237
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
238
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
239
+ }));
240
+ // Mark batch as executing
241
+ this.db.prepare(`
242
+ UPDATE deploy_batches SET status = 'executing', executed_at = ? WHERE id = ?
243
+ `).run(new Date().toISOString(), batchId);
244
+ // Execute each action
245
+ for (const action of actions) {
246
+ try {
247
+ await this.executeAction(action);
248
+ this.updateActionStatus(action.id, 'completed');
249
+ executed++;
250
+ }
251
+ catch (error) {
252
+ const errorMsg = error instanceof Error ? error.message : String(error);
253
+ errors.push(`Action ${action.id} (${action.actionType}): ${errorMsg}`);
254
+ this.updateActionStatus(action.id, 'failed');
255
+ failed++;
256
+ }
257
+ }
258
+ // Update batch status
259
+ const batchStatus = failed === 0 ? 'completed' : (executed > 0 ? 'completed' : 'failed');
260
+ this.db.prepare(`
261
+ UPDATE deploy_batches SET status = ?, result = ? WHERE id = ?
262
+ `).run(batchStatus, JSON.stringify({ executed, failed, errors }), batchId);
263
+ return {
264
+ batchId,
265
+ success: failed === 0,
266
+ executedActions: executed,
267
+ failedActions: failed,
268
+ errors: errors.length > 0 ? errors : undefined,
269
+ duration: Date.now() - startTime,
270
+ };
271
+ }
272
+ async executeAction(action) {
273
+ if (this.dryRun) {
274
+ console.log(`[DRY RUN] Would execute: ${action.actionType} on ${action.target}`);
275
+ return;
276
+ }
277
+ const payload = action.payload || {};
278
+ switch (action.actionType) {
279
+ case 'commit':
280
+ await this.executeCommit(action.target, payload);
281
+ break;
282
+ case 'push':
283
+ await this.executePush(action.target, payload);
284
+ break;
285
+ case 'merge':
286
+ await this.executeMerge(action.target, payload);
287
+ break;
288
+ case 'workflow':
289
+ await this.executeWorkflow(action.target, payload);
290
+ break;
291
+ case 'deploy':
292
+ await this.executeDeploy(action.target, payload);
293
+ break;
294
+ default:
295
+ throw new Error(`Unknown action type: ${action.actionType}`);
296
+ }
297
+ }
298
+ async executeCommit(_target, payload) {
299
+ const message = payload.message || 'Automated commit';
300
+ const files = payload.files || [];
301
+ if (files.length > 0) {
302
+ execSync(`git add ${files.join(' ')}`, { stdio: 'pipe' });
303
+ }
304
+ else {
305
+ execSync('git add -A', { stdio: 'pipe' });
306
+ }
307
+ execSync(`git commit -m "${message.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
308
+ }
309
+ async executePush(target, payload) {
310
+ const remote = payload.remote || 'origin';
311
+ const force = payload.force || false;
312
+ const forceFlag = force ? '--force-with-lease' : '';
313
+ execSync(`git push ${forceFlag} ${remote} ${target}`, { stdio: 'pipe' });
314
+ }
315
+ async executeMerge(_target, payload) {
316
+ const source = payload.source || 'HEAD';
317
+ const squash = payload.squash || false;
318
+ if (squash) {
319
+ execSync(`git merge --squash ${source}`, { stdio: 'pipe' });
320
+ }
321
+ else {
322
+ execSync(`git merge ${source}`, { stdio: 'pipe' });
323
+ }
324
+ }
325
+ async executeWorkflow(target, payload) {
326
+ const workflow = target;
327
+ const ref = payload.ref || 'main';
328
+ const inputs = payload.inputs;
329
+ let inputsArg = '';
330
+ if (inputs) {
331
+ inputsArg = Object.entries(inputs)
332
+ .map(([key, value]) => `-f ${key}=${value}`)
333
+ .join(' ');
334
+ }
335
+ execSync(`gh workflow run ${workflow} --ref ${ref} ${inputsArg}`, { stdio: 'pipe' });
336
+ }
337
+ async executeDeploy(target, payload) {
338
+ const environment = target;
339
+ const command = payload.command || `deploy-${environment}`;
340
+ execSync(command, { stdio: 'pipe' });
341
+ }
342
+ updateActionStatus(actionId, status) {
343
+ const stmt = this.db.prepare(`
344
+ UPDATE deploy_queue SET status = ? WHERE id = ?
345
+ `);
346
+ stmt.run(status, actionId);
347
+ }
348
+ // Get batch status
349
+ getBatch(batchId) {
350
+ const batchStmt = this.db.prepare(`
351
+ SELECT id, created_at as createdAt, executed_at as executedAt, status, result
352
+ FROM deploy_batches
353
+ WHERE id = ?
354
+ `);
355
+ const batchRow = batchStmt.get(batchId);
356
+ if (!batchRow)
357
+ return null;
358
+ const actionsStmt = this.db.prepare(`
359
+ SELECT id, agent_id as agentId, action_type as actionType, target, payload,
360
+ status, batch_id as batchId, queued_at as queuedAt,
361
+ execute_after as executeAfter, priority, dependencies
362
+ FROM deploy_queue
363
+ WHERE batch_id = ?
364
+ `);
365
+ const actionRows = actionsStmt.all(batchId);
366
+ const actions = actionRows.map((row) => ({
367
+ ...row,
368
+ payload: row.payload ? JSON.parse(row.payload) : undefined,
369
+ dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,
370
+ }));
371
+ return {
372
+ id: batchId,
373
+ actions,
374
+ createdAt: batchRow.createdAt,
375
+ status: batchRow.status,
376
+ };
377
+ }
378
+ // Get all pending batches
379
+ getPendingBatches() {
380
+ const stmt = this.db.prepare(`
381
+ SELECT id FROM deploy_batches WHERE status = 'pending'
382
+ `);
383
+ const rows = stmt.all();
384
+ return rows
385
+ .map((row) => this.getBatch(row.id))
386
+ .filter((b) => b !== null);
387
+ }
388
+ // Force flush all pending deploys
389
+ async flushAll() {
390
+ const results = [];
391
+ // First, create batches from all pending
392
+ let batch = await this.createBatch();
393
+ while (batch) {
394
+ const result = await this.executeBatch(batch.id);
395
+ results.push(result);
396
+ batch = await this.createBatch();
397
+ }
398
+ return results;
399
+ }
400
+ }
401
+ //# sourceMappingURL=deploy-batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-batcher.js","sourceRoot":"","sources":["../../src/coordination/deploy-batcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './database.js';
2
+ export * from './service.js';
3
+ export * from './deploy-batcher.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './database.js';
2
+ export * from './service.js';
3
+ export * from './deploy-batcher.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordination/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}