agentic-qe 1.3.5 → 1.3.7
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/.claude/agents/qe-code-complexity.md +291 -0
- package/.claude/settings.json +2 -2
- package/CHANGELOG.md +67 -0
- package/README.md +36 -6
- package/dist/agents/BaseAgent.d.ts +6 -2
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +62 -51
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts +139 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.d.ts.map +1 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.js +403 -0
- package/dist/agents/CodeComplexityAnalyzerAgent.js.map +1 -0
- package/dist/agents/FleetCommanderAgent.js +2 -2
- package/dist/agents/FleetCommanderAgent.js.map +1 -1
- package/dist/agents/QualityGateAgent.d.ts +5 -5
- package/dist/agents/QualityGateAgent.d.ts.map +1 -1
- package/dist/agents/QualityGateAgent.js +33 -19
- package/dist/agents/QualityGateAgent.js.map +1 -1
- package/dist/agents/TestDataArchitectAgent.d.ts +9 -0
- package/dist/agents/TestDataArchitectAgent.d.ts.map +1 -1
- package/dist/agents/TestDataArchitectAgent.js +96 -2
- package/dist/agents/TestDataArchitectAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +23 -1
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +279 -54
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/coordination/AgentCoordinator.d.ts +98 -0
- package/dist/agents/coordination/AgentCoordinator.d.ts.map +1 -0
- package/dist/agents/coordination/AgentCoordinator.js +196 -0
- package/dist/agents/coordination/AgentCoordinator.js.map +1 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts +107 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.d.ts.map +1 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.js +220 -0
- package/dist/agents/lifecycle/AgentLifecycleManager.js.map +1 -0
- package/dist/agents/memory/AgentMemoryService.d.ts +173 -0
- package/dist/agents/memory/AgentMemoryService.d.ts.map +1 -0
- package/dist/agents/memory/AgentMemoryService.js +297 -0
- package/dist/agents/memory/AgentMemoryService.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +45 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/skills/index.d.ts +4 -0
- package/dist/cli/commands/skills/index.d.ts.map +1 -1
- package/dist/cli/commands/skills/index.js +8 -2
- package/dist/cli/commands/skills/index.js.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts +2 -1
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +4 -1
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/dao/AccessControlDAO.d.ts +66 -0
- package/dist/core/memory/dao/AccessControlDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/AccessControlDAO.js +140 -0
- package/dist/core/memory/dao/AccessControlDAO.js.map +1 -0
- package/dist/core/memory/dao/BaseDAO.d.ts +34 -0
- package/dist/core/memory/dao/BaseDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/BaseDAO.js +34 -0
- package/dist/core/memory/dao/BaseDAO.js.map +1 -0
- package/dist/core/memory/dao/BlackboardDAO.d.ts +90 -0
- package/dist/core/memory/dao/BlackboardDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/BlackboardDAO.js +223 -0
- package/dist/core/memory/dao/BlackboardDAO.js.map +1 -0
- package/dist/core/memory/dao/EventDAO.d.ts +83 -0
- package/dist/core/memory/dao/EventDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/EventDAO.js +177 -0
- package/dist/core/memory/dao/EventDAO.js.map +1 -0
- package/dist/core/memory/dao/MemoryEntryDAO.d.ts +57 -0
- package/dist/core/memory/dao/MemoryEntryDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/MemoryEntryDAO.js +159 -0
- package/dist/core/memory/dao/MemoryEntryDAO.js.map +1 -0
- package/dist/core/memory/dao/WorkflowDAO.d.ts +85 -0
- package/dist/core/memory/dao/WorkflowDAO.d.ts.map +1 -0
- package/dist/core/memory/dao/WorkflowDAO.js +182 -0
- package/dist/core/memory/dao/WorkflowDAO.js.map +1 -0
- package/dist/core/memory/services/AccessControlService.d.ts +123 -0
- package/dist/core/memory/services/AccessControlService.d.ts.map +1 -0
- package/dist/core/memory/services/AccessControlService.js +249 -0
- package/dist/core/memory/services/AccessControlService.js.map +1 -0
- package/dist/core/memory/services/MemoryStoreService.d.ts +69 -0
- package/dist/core/memory/services/MemoryStoreService.d.ts.map +1 -0
- package/dist/core/memory/services/MemoryStoreService.js +214 -0
- package/dist/core/memory/services/MemoryStoreService.js.map +1 -0
- package/dist/mcp/handlers/base-handler.d.ts.map +1 -1
- package/dist/mcp/handlers/base-handler.js +4 -1
- package/dist/mcp/handlers/base-handler.js.map +1 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts +11 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/regression-risk-analyze.js +63 -8
- package/dist/mcp/handlers/prediction/regression-risk-analyze.js.map +1 -1
- package/dist/mcp/handlers/quality-analyze.d.ts +7 -1
- package/dist/mcp/handlers/quality-analyze.d.ts.map +1 -1
- package/dist/mcp/handlers/quality-analyze.js +18 -1
- package/dist/mcp/handlers/quality-analyze.js.map +1 -1
- package/dist/mcp/handlers/test-generate.d.ts.map +1 -1
- package/dist/mcp/handlers/test-generate.js +24 -8
- package/dist/mcp/handlers/test-generate.js.map +1 -1
- package/dist/mcp/services/AgentRegistry.d.ts +5 -0
- package/dist/mcp/services/AgentRegistry.d.ts.map +1 -1
- package/dist/mcp/services/AgentRegistry.js +19 -0
- package/dist/mcp/services/AgentRegistry.js.map +1 -1
- package/dist/utils/__mocks__/Database.d.ts +64 -0
- package/dist/utils/__mocks__/Database.d.ts.map +1 -0
- package/dist/utils/__mocks__/Database.js +134 -0
- package/dist/utils/__mocks__/Database.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryEntryDAO = void 0;
|
|
4
|
+
const BaseDAO_1 = require("./BaseDAO");
|
|
5
|
+
const SwarmMemoryManager_1 = require("../SwarmMemoryManager");
|
|
6
|
+
/**
|
|
7
|
+
* MemoryEntryDAO - Data Access Object for core memory entries (Table 1)
|
|
8
|
+
*
|
|
9
|
+
* Handles all database operations for the memory_entries table
|
|
10
|
+
* Separates data access from business logic
|
|
11
|
+
*/
|
|
12
|
+
class MemoryEntryDAO extends BaseDAO_1.BaseDAO {
|
|
13
|
+
async createTable() {
|
|
14
|
+
await this.run(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
16
|
+
key TEXT NOT NULL,
|
|
17
|
+
partition TEXT NOT NULL DEFAULT 'default',
|
|
18
|
+
value TEXT NOT NULL,
|
|
19
|
+
metadata TEXT,
|
|
20
|
+
created_at INTEGER NOT NULL,
|
|
21
|
+
expires_at INTEGER,
|
|
22
|
+
owner TEXT,
|
|
23
|
+
access_level TEXT DEFAULT 'private',
|
|
24
|
+
team_id TEXT,
|
|
25
|
+
swarm_id TEXT,
|
|
26
|
+
PRIMARY KEY (key, partition)
|
|
27
|
+
)
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
async createIndexes() {
|
|
31
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_memory_partition ON memory_entries(partition)`);
|
|
32
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_memory_expires ON memory_entries(expires_at)`);
|
|
33
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_memory_owner ON memory_entries(owner)`);
|
|
34
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_memory_access ON memory_entries(access_level)`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Insert or replace a memory entry
|
|
38
|
+
*/
|
|
39
|
+
async insert(entry) {
|
|
40
|
+
await this.run(`INSERT OR REPLACE INTO memory_entries
|
|
41
|
+
(key, partition, value, metadata, created_at, expires_at, owner, access_level, team_id, swarm_id)
|
|
42
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
43
|
+
entry.key,
|
|
44
|
+
entry.partition || 'default',
|
|
45
|
+
JSON.stringify(entry.value),
|
|
46
|
+
null, // metadata handled separately
|
|
47
|
+
entry.createdAt,
|
|
48
|
+
entry.expiresAt || null,
|
|
49
|
+
entry.owner || 'system',
|
|
50
|
+
entry.accessLevel || SwarmMemoryManager_1.AccessLevel.PRIVATE,
|
|
51
|
+
entry.teamId || null,
|
|
52
|
+
entry.swarmId || null
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find a memory entry by key and partition
|
|
57
|
+
*/
|
|
58
|
+
async findByKey(key, partition, includeExpired = false) {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
let query = `SELECT * FROM memory_entries WHERE key = ? AND partition = ?`;
|
|
61
|
+
const params = [key, partition];
|
|
62
|
+
if (!includeExpired) {
|
|
63
|
+
query += ` AND (expires_at IS NULL OR expires_at > ?)`;
|
|
64
|
+
params.push(now);
|
|
65
|
+
}
|
|
66
|
+
const row = await this.queryOne(query, params);
|
|
67
|
+
return row ? this.mapToEntry(row) : null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Find memory entries by pattern match on key
|
|
71
|
+
*/
|
|
72
|
+
async findByPattern(pattern, partition, includeExpired = false) {
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
let query = `SELECT * FROM memory_entries WHERE partition = ? AND key LIKE ?`;
|
|
75
|
+
const params = [partition, pattern];
|
|
76
|
+
if (!includeExpired) {
|
|
77
|
+
query += ` AND (expires_at IS NULL OR expires_at > ?)`;
|
|
78
|
+
params.push(now);
|
|
79
|
+
}
|
|
80
|
+
const rows = await this.queryAll(query, params);
|
|
81
|
+
return rows.map(row => this.mapToEntry(row));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Delete a memory entry by key and partition
|
|
85
|
+
*/
|
|
86
|
+
async deleteByKey(key, partition) {
|
|
87
|
+
await this.run(`DELETE FROM memory_entries WHERE key = ? AND partition = ?`, [key, partition]);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete all entries in a partition
|
|
91
|
+
*/
|
|
92
|
+
async deleteByPartition(partition) {
|
|
93
|
+
await this.run(`DELETE FROM memory_entries WHERE partition = ?`, [partition]);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Delete all expired entries
|
|
97
|
+
*/
|
|
98
|
+
async deleteExpired() {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
await this.run(`DELETE FROM memory_entries WHERE expires_at IS NOT NULL AND expires_at <= ?`, [now]);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Count total memory entries
|
|
104
|
+
*/
|
|
105
|
+
async count() {
|
|
106
|
+
const result = await this.queryOne(`SELECT COUNT(*) as count FROM memory_entries`);
|
|
107
|
+
return result?.count || 0;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get list of distinct partitions
|
|
111
|
+
*/
|
|
112
|
+
async getPartitions() {
|
|
113
|
+
const rows = await this.queryAll(`SELECT DISTINCT partition FROM memory_entries`);
|
|
114
|
+
return rows.map(row => row.partition);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get count of entries by access level
|
|
118
|
+
*/
|
|
119
|
+
async getAccessLevelCounts() {
|
|
120
|
+
const rows = await this.queryAll(`SELECT access_level, COUNT(*) as count FROM memory_entries GROUP BY access_level`);
|
|
121
|
+
const counts = {};
|
|
122
|
+
rows.forEach(row => {
|
|
123
|
+
counts[row.access_level] = row.count;
|
|
124
|
+
});
|
|
125
|
+
return counts;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Find entries modified since a timestamp (for QUIC sync)
|
|
129
|
+
*/
|
|
130
|
+
async findModifiedSince(since, partition) {
|
|
131
|
+
let query = `SELECT * FROM memory_entries WHERE created_at > ?`;
|
|
132
|
+
const params = [since];
|
|
133
|
+
if (partition) {
|
|
134
|
+
query += ` AND partition = ?`;
|
|
135
|
+
params.push(partition);
|
|
136
|
+
}
|
|
137
|
+
query += ` ORDER BY created_at ASC`;
|
|
138
|
+
const rows = await this.queryAll(query, params);
|
|
139
|
+
return rows.map(row => this.mapToEntry(row));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Map database row to MemoryEntry object
|
|
143
|
+
*/
|
|
144
|
+
mapToEntry(row) {
|
|
145
|
+
return {
|
|
146
|
+
key: row.key,
|
|
147
|
+
value: JSON.parse(row.value),
|
|
148
|
+
partition: row.partition,
|
|
149
|
+
createdAt: row.created_at,
|
|
150
|
+
expiresAt: row.expires_at,
|
|
151
|
+
owner: row.owner,
|
|
152
|
+
accessLevel: row.access_level,
|
|
153
|
+
teamId: row.team_id,
|
|
154
|
+
swarmId: row.swarm_id
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.MemoryEntryDAO = MemoryEntryDAO;
|
|
159
|
+
//# sourceMappingURL=MemoryEntryDAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryEntryDAO.js","sourceRoot":"","sources":["../../../../src/core/memory/dao/MemoryEntryDAO.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BaseDAO } from './BaseDAO';
|
|
2
|
+
/**
|
|
3
|
+
* Workflow state interface
|
|
4
|
+
*/
|
|
5
|
+
export interface WorkflowState {
|
|
6
|
+
id: string;
|
|
7
|
+
step: string;
|
|
8
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed';
|
|
9
|
+
checkpoint: any;
|
|
10
|
+
sha: string;
|
|
11
|
+
ttl?: number;
|
|
12
|
+
createdAt?: number;
|
|
13
|
+
updatedAt?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* WorkflowDAO - Data Access Object for workflow state management (Table 4)
|
|
17
|
+
*
|
|
18
|
+
* Handles all database operations for the workflows table
|
|
19
|
+
* Manages workflow execution state and checkpoints
|
|
20
|
+
*/
|
|
21
|
+
export declare class WorkflowDAO extends BaseDAO {
|
|
22
|
+
createTable(): Promise<void>;
|
|
23
|
+
createIndexes(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Insert or update a workflow state
|
|
26
|
+
*/
|
|
27
|
+
insert(workflow: WorkflowState): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Find a workflow by ID
|
|
30
|
+
*/
|
|
31
|
+
findById(id: string): Promise<WorkflowState | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Find workflows by status
|
|
34
|
+
*/
|
|
35
|
+
findByStatus(status: WorkflowState['status']): Promise<WorkflowState[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Find workflows by step
|
|
38
|
+
*/
|
|
39
|
+
findByStep(step: string): Promise<WorkflowState[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Find workflow by SHA checkpoint
|
|
42
|
+
*/
|
|
43
|
+
findBySHA(sha: string): Promise<WorkflowState | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Update workflow status
|
|
46
|
+
*/
|
|
47
|
+
updateStatus(id: string, status: WorkflowState['status']): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Update workflow checkpoint
|
|
50
|
+
*/
|
|
51
|
+
updateCheckpoint(id: string, checkpoint: any, sha: string): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete a workflow by ID
|
|
54
|
+
*/
|
|
55
|
+
deleteById(id: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Delete workflows by status
|
|
58
|
+
*/
|
|
59
|
+
deleteByStatus(status: WorkflowState['status']): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Delete expired workflows
|
|
62
|
+
*/
|
|
63
|
+
deleteExpired(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Count total workflows
|
|
66
|
+
*/
|
|
67
|
+
count(): Promise<number>;
|
|
68
|
+
/**
|
|
69
|
+
* Count workflows by status
|
|
70
|
+
*/
|
|
71
|
+
countByStatus(status: WorkflowState['status']): Promise<number>;
|
|
72
|
+
/**
|
|
73
|
+
* Get workflow statistics by status
|
|
74
|
+
*/
|
|
75
|
+
getStatusCounts(): Promise<Record<string, number>>;
|
|
76
|
+
/**
|
|
77
|
+
* Find active workflows (pending or in_progress)
|
|
78
|
+
*/
|
|
79
|
+
findActive(): Promise<WorkflowState[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Map database row to WorkflowState object
|
|
82
|
+
*/
|
|
83
|
+
private mapToWorkflow;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=WorkflowDAO.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowDAO.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/dao/WorkflowDAO.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,UAAU,EAAE,GAAG,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,OAAO;IAChC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IASpC;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQzD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAY7E;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAYxD;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa3D;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9E;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/E;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAYxD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAY5C;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowDAO = void 0;
|
|
4
|
+
const BaseDAO_1 = require("./BaseDAO");
|
|
5
|
+
/**
|
|
6
|
+
* WorkflowDAO - Data Access Object for workflow state management (Table 4)
|
|
7
|
+
*
|
|
8
|
+
* Handles all database operations for the workflows table
|
|
9
|
+
* Manages workflow execution state and checkpoints
|
|
10
|
+
*/
|
|
11
|
+
class WorkflowDAO extends BaseDAO_1.BaseDAO {
|
|
12
|
+
async createTable() {
|
|
13
|
+
await this.run(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS workflows (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
step TEXT NOT NULL,
|
|
17
|
+
status TEXT NOT NULL CHECK(status IN ('pending', 'in_progress', 'completed', 'failed')),
|
|
18
|
+
checkpoint TEXT NOT NULL,
|
|
19
|
+
sha TEXT NOT NULL,
|
|
20
|
+
created_at INTEGER NOT NULL,
|
|
21
|
+
updated_at INTEGER NOT NULL,
|
|
22
|
+
expires_at INTEGER
|
|
23
|
+
)
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
async createIndexes() {
|
|
27
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_status ON workflows(status)`);
|
|
28
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_step ON workflows(step)`);
|
|
29
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_sha ON workflows(sha)`);
|
|
30
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_created ON workflows(created_at)`);
|
|
31
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_updated ON workflows(updated_at)`);
|
|
32
|
+
await this.run(`CREATE INDEX IF NOT EXISTS idx_workflows_expires ON workflows(expires_at)`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Insert or update a workflow state
|
|
36
|
+
*/
|
|
37
|
+
async insert(workflow) {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
const createdAt = workflow.createdAt || now;
|
|
40
|
+
const updatedAt = workflow.updatedAt || now;
|
|
41
|
+
const expiresAt = workflow.ttl ? now + (workflow.ttl * 1000) : null;
|
|
42
|
+
await this.run(`INSERT OR REPLACE INTO workflows
|
|
43
|
+
(id, step, status, checkpoint, sha, created_at, updated_at, expires_at)
|
|
44
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
45
|
+
workflow.id,
|
|
46
|
+
workflow.step,
|
|
47
|
+
workflow.status,
|
|
48
|
+
JSON.stringify(workflow.checkpoint),
|
|
49
|
+
workflow.sha,
|
|
50
|
+
createdAt,
|
|
51
|
+
updatedAt,
|
|
52
|
+
expiresAt
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find a workflow by ID
|
|
57
|
+
*/
|
|
58
|
+
async findById(id) {
|
|
59
|
+
const row = await this.queryOne(`SELECT * FROM workflows WHERE id = ?`, [id]);
|
|
60
|
+
return row ? this.mapToWorkflow(row) : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Find workflows by status
|
|
64
|
+
*/
|
|
65
|
+
async findByStatus(status) {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
const rows = await this.queryAll(`SELECT * FROM workflows
|
|
68
|
+
WHERE status = ?
|
|
69
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
70
|
+
ORDER BY updated_at DESC`, [status, now]);
|
|
71
|
+
return rows.map(row => this.mapToWorkflow(row));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find workflows by step
|
|
75
|
+
*/
|
|
76
|
+
async findByStep(step) {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const rows = await this.queryAll(`SELECT * FROM workflows
|
|
79
|
+
WHERE step = ?
|
|
80
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
81
|
+
ORDER BY updated_at DESC`, [step, now]);
|
|
82
|
+
return rows.map(row => this.mapToWorkflow(row));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find workflow by SHA checkpoint
|
|
86
|
+
*/
|
|
87
|
+
async findBySHA(sha) {
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
const row = await this.queryOne(`SELECT * FROM workflows
|
|
90
|
+
WHERE sha = ?
|
|
91
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
92
|
+
ORDER BY updated_at DESC
|
|
93
|
+
LIMIT 1`, [sha, now]);
|
|
94
|
+
return row ? this.mapToWorkflow(row) : null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Update workflow status
|
|
98
|
+
*/
|
|
99
|
+
async updateStatus(id, status) {
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
await this.run(`UPDATE workflows SET status = ?, updated_at = ? WHERE id = ?`, [status, now, id]);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Update workflow checkpoint
|
|
105
|
+
*/
|
|
106
|
+
async updateCheckpoint(id, checkpoint, sha) {
|
|
107
|
+
const now = Date.now();
|
|
108
|
+
await this.run(`UPDATE workflows SET checkpoint = ?, sha = ?, updated_at = ? WHERE id = ?`, [JSON.stringify(checkpoint), sha, now, id]);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Delete a workflow by ID
|
|
112
|
+
*/
|
|
113
|
+
async deleteById(id) {
|
|
114
|
+
await this.run(`DELETE FROM workflows WHERE id = ?`, [id]);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Delete workflows by status
|
|
118
|
+
*/
|
|
119
|
+
async deleteByStatus(status) {
|
|
120
|
+
await this.run(`DELETE FROM workflows WHERE status = ?`, [status]);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Delete expired workflows
|
|
124
|
+
*/
|
|
125
|
+
async deleteExpired() {
|
|
126
|
+
const now = Date.now();
|
|
127
|
+
await this.run(`DELETE FROM workflows WHERE expires_at IS NOT NULL AND expires_at <= ?`, [now]);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Count total workflows
|
|
131
|
+
*/
|
|
132
|
+
async count() {
|
|
133
|
+
const result = await this.queryOne(`SELECT COUNT(*) as count FROM workflows`);
|
|
134
|
+
return result?.count || 0;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Count workflows by status
|
|
138
|
+
*/
|
|
139
|
+
async countByStatus(status) {
|
|
140
|
+
const result = await this.queryOne(`SELECT COUNT(*) as count FROM workflows WHERE status = ?`, [status]);
|
|
141
|
+
return result?.count || 0;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get workflow statistics by status
|
|
145
|
+
*/
|
|
146
|
+
async getStatusCounts() {
|
|
147
|
+
const rows = await this.queryAll(`SELECT status, COUNT(*) as count FROM workflows GROUP BY status`);
|
|
148
|
+
const counts = {};
|
|
149
|
+
rows.forEach(row => {
|
|
150
|
+
counts[row.status] = row.count;
|
|
151
|
+
});
|
|
152
|
+
return counts;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Find active workflows (pending or in_progress)
|
|
156
|
+
*/
|
|
157
|
+
async findActive() {
|
|
158
|
+
const now = Date.now();
|
|
159
|
+
const rows = await this.queryAll(`SELECT * FROM workflows
|
|
160
|
+
WHERE status IN ('pending', 'in_progress')
|
|
161
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
162
|
+
ORDER BY updated_at DESC`, [now]);
|
|
163
|
+
return rows.map(row => this.mapToWorkflow(row));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Map database row to WorkflowState object
|
|
167
|
+
*/
|
|
168
|
+
mapToWorkflow(row) {
|
|
169
|
+
return {
|
|
170
|
+
id: row.id,
|
|
171
|
+
step: row.step,
|
|
172
|
+
status: row.status,
|
|
173
|
+
checkpoint: JSON.parse(row.checkpoint),
|
|
174
|
+
sha: row.sha,
|
|
175
|
+
createdAt: row.created_at,
|
|
176
|
+
updatedAt: row.updated_at,
|
|
177
|
+
ttl: row.expires_at ? (row.expires_at - row.created_at) / 1000 : undefined
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.WorkflowDAO = WorkflowDAO;
|
|
182
|
+
//# sourceMappingURL=WorkflowDAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowDAO.js","sourceRoot":"","sources":["../../../../src/core/memory/dao/WorkflowDAO.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { AccessControlDAO } from '../dao/AccessControlDAO';
|
|
2
|
+
import { AccessLevel, Permission } from '../AccessControl';
|
|
3
|
+
/**
|
|
4
|
+
* Permission check request
|
|
5
|
+
*/
|
|
6
|
+
export interface PermissionCheckRequest {
|
|
7
|
+
agentId: string;
|
|
8
|
+
resourceOwner: string;
|
|
9
|
+
accessLevel: AccessLevel;
|
|
10
|
+
permission: Permission;
|
|
11
|
+
teamId?: string;
|
|
12
|
+
resourceTeamId?: string;
|
|
13
|
+
swarmId?: string;
|
|
14
|
+
resourceSwarmId?: string;
|
|
15
|
+
isSystemAgent?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Permission check result
|
|
19
|
+
*/
|
|
20
|
+
export interface PermissionCheckResult {
|
|
21
|
+
allowed: boolean;
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* AccessControlService - Business logic for access control and permissions
|
|
26
|
+
*
|
|
27
|
+
* Handles:
|
|
28
|
+
* - Permission checking across private/team/swarm/public access levels
|
|
29
|
+
* - ACL management (grant, revoke, check)
|
|
30
|
+
* - System agent special permissions
|
|
31
|
+
* - Team and swarm membership validation
|
|
32
|
+
*
|
|
33
|
+
* Implements the access control rules from the original SwarmMemoryManager
|
|
34
|
+
*/
|
|
35
|
+
export declare class AccessControlService {
|
|
36
|
+
private accessControlDAO;
|
|
37
|
+
constructor(accessControlDAO: AccessControlDAO);
|
|
38
|
+
/**
|
|
39
|
+
* Check if an agent has permission to access a resource
|
|
40
|
+
*/
|
|
41
|
+
checkPermission(request: PermissionCheckRequest): PermissionCheckResult;
|
|
42
|
+
/**
|
|
43
|
+
* Grant a permission to an agent for a resource
|
|
44
|
+
*/
|
|
45
|
+
grant(resourceKey: string, resourcePartition: string, agentId: string, permission: Permission, grantedBy: string, ttl?: number): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Revoke a permission from an agent for a resource
|
|
48
|
+
*/
|
|
49
|
+
revoke(resourceKey: string, resourcePartition: string, agentId: string, permission: Permission): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if an agent has explicit ACL permission for a resource
|
|
52
|
+
*/
|
|
53
|
+
hasExplicitPermission(resourceKey: string, resourcePartition: string, agentId: string, permission: Permission): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Get all permissions for a resource
|
|
56
|
+
*/
|
|
57
|
+
getResourcePermissions(resourceKey: string, resourcePartition: string): Promise<import("../AccessControl").ACL[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Get all permissions for an agent
|
|
60
|
+
*/
|
|
61
|
+
getAgentPermissions(agentId: string): Promise<import("../AccessControl").ACL[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Delete all permissions for a resource
|
|
64
|
+
*/
|
|
65
|
+
deleteResourcePermissions(resourceKey: string, resourcePartition: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Delete all permissions for an agent
|
|
68
|
+
*/
|
|
69
|
+
deleteAgentPermissions(agentId: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Clean up expired ACL entries
|
|
72
|
+
*/
|
|
73
|
+
cleanupExpired(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get ACL statistics
|
|
76
|
+
*/
|
|
77
|
+
getStatistics(): Promise<{
|
|
78
|
+
total: number;
|
|
79
|
+
byPermission: Record<string, number>;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* Check PRIVATE access level
|
|
83
|
+
* Only owner can access
|
|
84
|
+
*/
|
|
85
|
+
private checkPrivateAccess;
|
|
86
|
+
/**
|
|
87
|
+
* Check TEAM access level
|
|
88
|
+
* Owner + same team members can access
|
|
89
|
+
*/
|
|
90
|
+
private checkTeamAccess;
|
|
91
|
+
/**
|
|
92
|
+
* Check SWARM access level
|
|
93
|
+
* Owner + same swarm members can access
|
|
94
|
+
*/
|
|
95
|
+
private checkSwarmAccess;
|
|
96
|
+
/**
|
|
97
|
+
* Check PUBLIC access level
|
|
98
|
+
* Everyone has read access, only owner/team can write
|
|
99
|
+
*/
|
|
100
|
+
private checkPublicAccess;
|
|
101
|
+
/**
|
|
102
|
+
* Validate permission grant request
|
|
103
|
+
* Ensures grantor has authority to grant permissions
|
|
104
|
+
*/
|
|
105
|
+
validateGrant(resourceKey: string, resourcePartition: string, grantedBy: string, resourceOwner: string): Promise<PermissionCheckResult>;
|
|
106
|
+
/**
|
|
107
|
+
* Bulk grant permissions to multiple agents
|
|
108
|
+
*/
|
|
109
|
+
grantBulk(resourceKey: string, resourcePartition: string, agentIds: string[], permission: Permission, grantedBy: string, ttl?: number): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Bulk revoke permissions from multiple agents
|
|
112
|
+
*/
|
|
113
|
+
revokeBulk(resourceKey: string, resourcePartition: string, agentIds: string[], permission: Permission): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Check if agent has any permission for a resource
|
|
116
|
+
*/
|
|
117
|
+
hasAnyPermission(resourceKey: string, resourcePartition: string, agentId: string): Promise<boolean>;
|
|
118
|
+
/**
|
|
119
|
+
* Get all agents with a specific permission for a resource
|
|
120
|
+
*/
|
|
121
|
+
getAgentsWithPermission(resourceKey: string, resourcePartition: string, permission: Permission): Promise<string[]>;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=AccessControlService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessControlService.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/services/AccessControlService.ts"],"names":[],"mappings":"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"}
|