agentic-qe 3.6.16 → 3.6.17
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/v3/qe-queen-coordinator.md +9 -3
- package/.claude/skills/skills-manifest.json +1 -1
- package/package.json +1 -1
- package/v3/CHANGELOG.md +22 -0
- package/v3/assets/agents/v3/qe-queen-coordinator.md +9 -3
- package/v3/dist/cli/bundle.js +1584 -659
- package/v3/dist/cli/commands/sync.d.ts.map +1 -1
- package/v3/dist/cli/commands/sync.js +83 -1
- package/v3/dist/cli/commands/sync.js.map +1 -1
- package/v3/dist/mcp/bundle.js +307 -21
- package/v3/dist/mcp/handlers/agent-handlers.d.ts +3 -0
- package/v3/dist/mcp/handlers/agent-handlers.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/agent-handlers.js +16 -9
- package/v3/dist/mcp/handlers/agent-handlers.js.map +1 -1
- package/v3/dist/mcp/handlers/core-handlers.d.ts +32 -0
- package/v3/dist/mcp/handlers/core-handlers.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/core-handlers.js +45 -1
- package/v3/dist/mcp/handlers/core-handlers.js.map +1 -1
- package/v3/dist/mcp/handlers/handler-factory.d.ts +9 -1
- package/v3/dist/mcp/handlers/handler-factory.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/handler-factory.js +94 -2
- package/v3/dist/mcp/handlers/handler-factory.js.map +1 -1
- package/v3/dist/mcp/handlers/memory-handlers.d.ts +2 -0
- package/v3/dist/mcp/handlers/memory-handlers.d.ts.map +1 -1
- package/v3/dist/mcp/handlers/memory-handlers.js +90 -1
- package/v3/dist/mcp/handlers/memory-handlers.js.map +1 -1
- package/v3/dist/mcp/protocol-server.d.ts +7 -0
- package/v3/dist/mcp/protocol-server.d.ts.map +1 -1
- package/v3/dist/mcp/protocol-server.js +56 -2
- package/v3/dist/mcp/protocol-server.js.map +1 -1
- package/v3/dist/mcp/transport/stdio.d.ts +18 -0
- package/v3/dist/mcp/transport/stdio.d.ts.map +1 -1
- package/v3/dist/mcp/transport/stdio.js +72 -5
- package/v3/dist/mcp/transport/stdio.js.map +1 -1
- package/v3/dist/mcp/types.d.ts +2 -0
- package/v3/dist/mcp/types.d.ts.map +1 -1
- package/v3/dist/sync/cloud/index.d.ts +1 -0
- package/v3/dist/sync/cloud/index.d.ts.map +1 -1
- package/v3/dist/sync/cloud/index.js +1 -0
- package/v3/dist/sync/cloud/index.js.map +1 -1
- package/v3/dist/sync/cloud/postgres-reader.d.ts +63 -0
- package/v3/dist/sync/cloud/postgres-reader.d.ts.map +1 -0
- package/v3/dist/sync/cloud/postgres-reader.js +225 -0
- package/v3/dist/sync/cloud/postgres-reader.js.map +1 -0
- package/v3/dist/sync/index.d.ts +5 -2
- package/v3/dist/sync/index.d.ts.map +1 -1
- package/v3/dist/sync/index.js +7 -2
- package/v3/dist/sync/index.js.map +1 -1
- package/v3/dist/sync/interfaces.d.ts +49 -0
- package/v3/dist/sync/interfaces.d.ts.map +1 -1
- package/v3/dist/sync/interfaces.js +160 -0
- package/v3/dist/sync/interfaces.js.map +1 -1
- package/v3/dist/sync/pull-agent.d.ts +102 -0
- package/v3/dist/sync/pull-agent.d.ts.map +1 -0
- package/v3/dist/sync/pull-agent.js +354 -0
- package/v3/dist/sync/pull-agent.js.map +1 -0
- package/v3/dist/sync/sync-agent.d.ts.map +1 -1
- package/v3/dist/sync/sync-agent.js +9 -0
- package/v3/dist/sync/sync-agent.js.map +1 -1
- package/v3/dist/sync/writers/index.d.ts +7 -0
- package/v3/dist/sync/writers/index.d.ts.map +1 -0
- package/v3/dist/sync/writers/index.js +7 -0
- package/v3/dist/sync/writers/index.js.map +1 -0
- package/v3/dist/sync/writers/sqlite-writer.d.ts +69 -0
- package/v3/dist/sync/writers/sqlite-writer.d.ts.map +1 -0
- package/v3/dist/sync/writers/sqlite-writer.js +249 -0
- package/v3/dist/sync/writers/sqlite-writer.js.map +1 -0
- package/v3/package.json +1 -1
|
@@ -4,6 +4,166 @@
|
|
|
4
4
|
* Defines the contracts for syncing local AQE learning data to cloud PostgreSQL.
|
|
5
5
|
* Consolidates data from 6+ local sources into unified cloud storage.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default pull configuration
|
|
9
|
+
*
|
|
10
|
+
* Maps cloud PostgreSQL tables back to local SQLite tables.
|
|
11
|
+
* Reverses the push column mappings from DEFAULT_SYNC_CONFIG.
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_PULL_CONFIG = {
|
|
14
|
+
cloud: {
|
|
15
|
+
project: process.env.GCP_PROJECT || '',
|
|
16
|
+
zone: process.env.GCP_ZONE || '',
|
|
17
|
+
instance: process.env.GCP_INSTANCE || '',
|
|
18
|
+
database: process.env.GCP_DATABASE || '',
|
|
19
|
+
user: process.env.GCP_USER || '',
|
|
20
|
+
tunnelPort: parseInt(process.env.GCP_TUNNEL_PORT || '15432', 10),
|
|
21
|
+
},
|
|
22
|
+
environment: process.env.AQE_ENV || 'all',
|
|
23
|
+
batchSize: 1000,
|
|
24
|
+
sources: [
|
|
25
|
+
// QE Patterns (cloud 0 records, but may grow)
|
|
26
|
+
{
|
|
27
|
+
name: 'qe-patterns',
|
|
28
|
+
cloudTable: 'aqe.qe_patterns',
|
|
29
|
+
localTable: 'qe_patterns',
|
|
30
|
+
enabled: true,
|
|
31
|
+
priority: 'high',
|
|
32
|
+
mode: 'incremental',
|
|
33
|
+
dropColumns: ['source_env', 'embedding', 'sync_version'],
|
|
34
|
+
transforms: { reusable: 'boolean-to-int' },
|
|
35
|
+
},
|
|
36
|
+
// SONA patterns (873 records)
|
|
37
|
+
{
|
|
38
|
+
name: 'sona-patterns',
|
|
39
|
+
cloudTable: 'aqe.sona_patterns',
|
|
40
|
+
localTable: 'sona_patterns',
|
|
41
|
+
enabled: true,
|
|
42
|
+
priority: 'high',
|
|
43
|
+
mode: 'incremental',
|
|
44
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
45
|
+
transforms: {
|
|
46
|
+
is_active: 'boolean-to-int',
|
|
47
|
+
requires_fine_tuning: 'boolean-to-int',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
// GOAP actions (2,335 records)
|
|
51
|
+
{
|
|
52
|
+
name: 'goap-actions',
|
|
53
|
+
cloudTable: 'aqe.goap_actions',
|
|
54
|
+
localTable: 'goap_actions',
|
|
55
|
+
enabled: true,
|
|
56
|
+
priority: 'high',
|
|
57
|
+
mode: 'incremental',
|
|
58
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
59
|
+
columnMap: { duration_estimate: 'estimated_duration_ms' },
|
|
60
|
+
},
|
|
61
|
+
// GOAP plans (91 records)
|
|
62
|
+
{
|
|
63
|
+
name: 'goap-plans',
|
|
64
|
+
cloudTable: 'aqe.goap_plans',
|
|
65
|
+
localTable: 'goap_plans',
|
|
66
|
+
enabled: true,
|
|
67
|
+
priority: 'medium',
|
|
68
|
+
mode: 'incremental',
|
|
69
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
70
|
+
columnMap: { estimated_duration: 'estimated_duration_ms' },
|
|
71
|
+
},
|
|
72
|
+
// Memory entries → kv_store (0 records in cloud currently)
|
|
73
|
+
{
|
|
74
|
+
name: 'memory-entries',
|
|
75
|
+
cloudTable: 'aqe.memory_entries',
|
|
76
|
+
localTable: 'kv_store',
|
|
77
|
+
enabled: true,
|
|
78
|
+
priority: 'high',
|
|
79
|
+
mode: 'incremental',
|
|
80
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
81
|
+
columnMap: { partition: 'namespace' },
|
|
82
|
+
},
|
|
83
|
+
// Learning experiences → captured_experiences (7,702 records)
|
|
84
|
+
// Drop 'id' because cloud uses SERIAL auto-increment, local uses UUID
|
|
85
|
+
// Map 'created_at' → 'started_at' since push mapped started_at → created_at
|
|
86
|
+
{
|
|
87
|
+
name: 'learning-experiences',
|
|
88
|
+
cloudTable: 'aqe.learning_experiences',
|
|
89
|
+
localTable: 'captured_experiences',
|
|
90
|
+
enabled: true,
|
|
91
|
+
priority: 'high',
|
|
92
|
+
mode: 'append',
|
|
93
|
+
dropColumns: ['id', 'source_env', 'sync_version'],
|
|
94
|
+
columnMap: {
|
|
95
|
+
agent_id: 'agent',
|
|
96
|
+
task_id: 'task',
|
|
97
|
+
task_type: 'domain',
|
|
98
|
+
state: 'result_json',
|
|
99
|
+
action: 'steps_json',
|
|
100
|
+
reward: 'quality',
|
|
101
|
+
next_state: 'routing_json',
|
|
102
|
+
episode_id: 'tags',
|
|
103
|
+
created_at: 'started_at',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
// Q-learning patterns → rl_q_values (3 records)
|
|
107
|
+
{
|
|
108
|
+
name: 'qlearning-patterns',
|
|
109
|
+
cloudTable: 'aqe.qlearning_patterns',
|
|
110
|
+
localTable: 'rl_q_values',
|
|
111
|
+
enabled: true,
|
|
112
|
+
priority: 'medium',
|
|
113
|
+
mode: 'incremental',
|
|
114
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
115
|
+
columnMap: {
|
|
116
|
+
state: 'state_key',
|
|
117
|
+
action: 'action_key',
|
|
118
|
+
last_update: 'updated_at',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
// Routing outcomes (186 records)
|
|
122
|
+
{
|
|
123
|
+
name: 'routing-outcomes',
|
|
124
|
+
cloudTable: 'aqe.routing_outcomes',
|
|
125
|
+
localTable: 'routing_outcomes',
|
|
126
|
+
enabled: true,
|
|
127
|
+
priority: 'medium',
|
|
128
|
+
mode: 'append',
|
|
129
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
130
|
+
},
|
|
131
|
+
// QE trajectories (0 records in cloud currently)
|
|
132
|
+
{
|
|
133
|
+
name: 'qe-trajectories',
|
|
134
|
+
cloudTable: 'aqe.qe_trajectories',
|
|
135
|
+
localTable: 'qe_trajectories',
|
|
136
|
+
enabled: true,
|
|
137
|
+
priority: 'medium',
|
|
138
|
+
mode: 'append',
|
|
139
|
+
dropColumns: ['source_env', 'sync_version', 'embedding'],
|
|
140
|
+
},
|
|
141
|
+
// Dream insights (680 records)
|
|
142
|
+
{
|
|
143
|
+
name: 'dream-insights',
|
|
144
|
+
cloudTable: 'aqe.dream_insights',
|
|
145
|
+
localTable: 'dream_insights',
|
|
146
|
+
enabled: true,
|
|
147
|
+
priority: 'low',
|
|
148
|
+
mode: 'append',
|
|
149
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
150
|
+
},
|
|
151
|
+
// Claude-Flow memory (2 records in cloud)
|
|
152
|
+
// Push syncs from JSON file; pull writes to kv_store since local has no dedicated table
|
|
153
|
+
{
|
|
154
|
+
name: 'claude-flow-memory',
|
|
155
|
+
cloudTable: 'aqe.claude_flow_memory',
|
|
156
|
+
localTable: 'kv_store',
|
|
157
|
+
enabled: true,
|
|
158
|
+
priority: 'low',
|
|
159
|
+
mode: 'incremental',
|
|
160
|
+
dropColumns: ['source_env', 'sync_version'],
|
|
161
|
+
columnMap: { partition: 'namespace' },
|
|
162
|
+
},
|
|
163
|
+
// NOTE: intelligence-qlearning (JSON push source) is NOT pulled back —
|
|
164
|
+
// the cloud qlearning_patterns table is already pulled via the qlearning-patterns source above.
|
|
165
|
+
],
|
|
166
|
+
};
|
|
7
167
|
/**
|
|
8
168
|
* SQLite to PostgreSQL type mapping
|
|
9
169
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/sync/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/sync/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull Sync Agent
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates pulling data from cloud PostgreSQL into local SQLite.
|
|
5
|
+
* Mirrors CloudSyncAgent but in the reverse direction (cloud → local).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Full and incremental pull modes
|
|
9
|
+
* - Column remapping (cloud schema → local schema)
|
|
10
|
+
* - Type transforms (PostgreSQL types → SQLite types)
|
|
11
|
+
* - Automatic backup before writes
|
|
12
|
+
* - Dry-run preview mode
|
|
13
|
+
* - Per-table and per-environment filtering
|
|
14
|
+
*/
|
|
15
|
+
import type { PullConfig, PullSource, SyncReport, SyncResult } from './interfaces.js';
|
|
16
|
+
/**
|
|
17
|
+
* Pull sync agent configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface PullAgentConfig extends PullConfig {
|
|
20
|
+
/** Callback for progress updates */
|
|
21
|
+
onProgress?: (message: string, progress: number) => void;
|
|
22
|
+
/** Callback for errors */
|
|
23
|
+
onError?: (error: Error, source: string) => void;
|
|
24
|
+
/** Enable verbose logging */
|
|
25
|
+
verbose?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Verification result
|
|
29
|
+
*/
|
|
30
|
+
export interface PullVerifyResult {
|
|
31
|
+
verified: boolean;
|
|
32
|
+
results: PullVerifyTableResult[];
|
|
33
|
+
}
|
|
34
|
+
export interface PullVerifyTableResult {
|
|
35
|
+
source: string;
|
|
36
|
+
cloudTable: string;
|
|
37
|
+
localTable: string;
|
|
38
|
+
cloudCount: number;
|
|
39
|
+
localCount: number;
|
|
40
|
+
match: boolean;
|
|
41
|
+
diff: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Pull Sync Agent
|
|
45
|
+
*/
|
|
46
|
+
export declare class PullSyncAgent {
|
|
47
|
+
private readonly config;
|
|
48
|
+
private reader;
|
|
49
|
+
private writer;
|
|
50
|
+
private cloudWriter;
|
|
51
|
+
private report;
|
|
52
|
+
constructor(config?: Partial<PullAgentConfig>);
|
|
53
|
+
/**
|
|
54
|
+
* Initialize connections to both cloud and local databases
|
|
55
|
+
*/
|
|
56
|
+
initialize(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Full pull: download all cloud data into local DB
|
|
59
|
+
*/
|
|
60
|
+
pullAll(): Promise<SyncReport>;
|
|
61
|
+
/**
|
|
62
|
+
* Incremental pull: only records changed since a timestamp
|
|
63
|
+
*/
|
|
64
|
+
pullIncremental(since?: Date): Promise<SyncReport>;
|
|
65
|
+
/**
|
|
66
|
+
* Pull a single table from cloud to local
|
|
67
|
+
*/
|
|
68
|
+
pullTable(source: PullSource): Promise<SyncResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Pull incremental changes for a single table
|
|
71
|
+
*/
|
|
72
|
+
private pullTableIncremental;
|
|
73
|
+
/**
|
|
74
|
+
* Verify pull by comparing cloud and local counts
|
|
75
|
+
*/
|
|
76
|
+
verify(): Promise<PullVerifyResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Close all connections
|
|
79
|
+
*/
|
|
80
|
+
close(): Promise<void>;
|
|
81
|
+
private ensureInitialized;
|
|
82
|
+
private getEnabledSources;
|
|
83
|
+
private resolveTargetDb;
|
|
84
|
+
private backupLocalDb;
|
|
85
|
+
private createReport;
|
|
86
|
+
private finalizeReport;
|
|
87
|
+
private log;
|
|
88
|
+
private progress;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a pull sync agent
|
|
92
|
+
*/
|
|
93
|
+
export declare function createPullSyncAgent(config?: Partial<PullAgentConfig>): PullSyncAgent;
|
|
94
|
+
/**
|
|
95
|
+
* Quick pull utility — full pull from cloud
|
|
96
|
+
*/
|
|
97
|
+
export declare function pullFromCloud(config?: Partial<PullAgentConfig>): Promise<SyncReport>;
|
|
98
|
+
/**
|
|
99
|
+
* Quick incremental pull utility
|
|
100
|
+
*/
|
|
101
|
+
export declare function pullIncrementalFromCloud(since?: Date, config?: Partial<PullAgentConfig>): Promise<SyncReport>;
|
|
102
|
+
//# sourceMappingURL=pull-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-agent.d.ts","sourceRoot":"","sources":["../../src/sync/pull-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAWtF;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,UAAU;IACjD,oCAAoC;IACpC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEzD,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEjD,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,WAAW,CAAsD;IACzE,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IASjD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IA4BpC;;OAEG;IACG,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BxD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA8CxD;;OAEG;YACW,oBAAoB;IAwClC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA0BzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,GAAG;IAgBX,OAAO,CAAC,QAAQ;CAIjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAEpF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ1F;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,CAAC,EAAE,IAAI,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,UAAU,CAAC,CAQrB"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull Sync Agent
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates pulling data from cloud PostgreSQL into local SQLite.
|
|
5
|
+
* Mirrors CloudSyncAgent but in the reverse direction (cloud → local).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Full and incremental pull modes
|
|
9
|
+
* - Column remapping (cloud schema → local schema)
|
|
10
|
+
* - Type transforms (PostgreSQL types → SQLite types)
|
|
11
|
+
* - Automatic backup before writes
|
|
12
|
+
* - Dry-run preview mode
|
|
13
|
+
* - Per-table and per-environment filtering
|
|
14
|
+
*/
|
|
15
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
16
|
+
import * as fs from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import { DEFAULT_PULL_CONFIG } from './interfaces.js';
|
|
19
|
+
import { createConnectionManager } from './cloud/tunnel-manager.js';
|
|
20
|
+
import { createPostgresWriter } from './cloud/postgres-writer.js';
|
|
21
|
+
import { createPostgresReader } from './cloud/postgres-reader.js';
|
|
22
|
+
import { createSQLiteWriter } from './writers/sqlite-writer.js';
|
|
23
|
+
import { toErrorMessage, toError } from '../shared/error-utils.js';
|
|
24
|
+
import { LoggerFactory } from '../logging/index.js';
|
|
25
|
+
const logger = LoggerFactory.create('pull-agent');
|
|
26
|
+
/**
|
|
27
|
+
* Pull Sync Agent
|
|
28
|
+
*/
|
|
29
|
+
export class PullSyncAgent {
|
|
30
|
+
config;
|
|
31
|
+
reader = null;
|
|
32
|
+
writer = null;
|
|
33
|
+
cloudWriter = null;
|
|
34
|
+
report = null;
|
|
35
|
+
constructor(config = {}) {
|
|
36
|
+
this.config = {
|
|
37
|
+
...DEFAULT_PULL_CONFIG,
|
|
38
|
+
...config,
|
|
39
|
+
cloud: { ...DEFAULT_PULL_CONFIG.cloud, ...config.cloud },
|
|
40
|
+
sources: config.sources || DEFAULT_PULL_CONFIG.sources,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize connections to both cloud and local databases
|
|
45
|
+
*/
|
|
46
|
+
async initialize() {
|
|
47
|
+
this.log('Initializing pull sync agent...');
|
|
48
|
+
// Connect to cloud
|
|
49
|
+
const tunnelManager = createConnectionManager(this.config.cloud);
|
|
50
|
+
this.cloudWriter = createPostgresWriter({
|
|
51
|
+
cloud: this.config.cloud,
|
|
52
|
+
tunnelManager,
|
|
53
|
+
});
|
|
54
|
+
await this.cloudWriter.connect();
|
|
55
|
+
this.log('Connected to cloud database');
|
|
56
|
+
// Create cloud reader (uses cloudWriter for queries)
|
|
57
|
+
this.reader = createPostgresReader({
|
|
58
|
+
writer: this.cloudWriter,
|
|
59
|
+
environment: this.config.environment,
|
|
60
|
+
});
|
|
61
|
+
// Connect to local SQLite
|
|
62
|
+
const dbPath = this.resolveTargetDb();
|
|
63
|
+
this.writer = createSQLiteWriter({ dbPath });
|
|
64
|
+
await this.writer.connect();
|
|
65
|
+
this.log(`Connected to local database: ${dbPath}`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Full pull: download all cloud data into local DB
|
|
69
|
+
*/
|
|
70
|
+
async pullAll() {
|
|
71
|
+
this.report = this.createReport('full');
|
|
72
|
+
try {
|
|
73
|
+
this.ensureInitialized();
|
|
74
|
+
this.backupLocalDb();
|
|
75
|
+
const sources = this.getEnabledSources();
|
|
76
|
+
let completed = 0;
|
|
77
|
+
for (const source of sources) {
|
|
78
|
+
this.progress(`Pulling ${source.name}...`, completed / sources.length);
|
|
79
|
+
const result = await this.pullTable(source);
|
|
80
|
+
this.report.results.push(result);
|
|
81
|
+
completed++;
|
|
82
|
+
}
|
|
83
|
+
this.report.status = this.report.results.every(r => r.success) ? 'completed' : 'partial';
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.report.status = 'failed';
|
|
87
|
+
this.report.errors.push(toErrorMessage(error));
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
this.finalizeReport();
|
|
91
|
+
}
|
|
92
|
+
return this.report;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Incremental pull: only records changed since a timestamp
|
|
96
|
+
*/
|
|
97
|
+
async pullIncremental(since) {
|
|
98
|
+
this.report = this.createReport('incremental');
|
|
99
|
+
const sinceDate = since || new Date(Date.now() - 24 * 60 * 60 * 1000);
|
|
100
|
+
try {
|
|
101
|
+
this.ensureInitialized();
|
|
102
|
+
this.backupLocalDb();
|
|
103
|
+
const sources = this.getEnabledSources().filter(s => s.mode !== 'full');
|
|
104
|
+
for (const source of sources) {
|
|
105
|
+
this.progress(`Incremental pull ${source.name}...`, 0);
|
|
106
|
+
const result = await this.pullTableIncremental(source, sinceDate);
|
|
107
|
+
this.report.results.push(result);
|
|
108
|
+
}
|
|
109
|
+
this.report.status = this.report.results.every(r => r.success) ? 'completed' : 'partial';
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.report.status = 'failed';
|
|
113
|
+
this.report.errors.push(toErrorMessage(error));
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
this.finalizeReport();
|
|
117
|
+
}
|
|
118
|
+
return this.report;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Pull a single table from cloud to local
|
|
122
|
+
*/
|
|
123
|
+
async pullTable(source) {
|
|
124
|
+
const startTime = Date.now();
|
|
125
|
+
const result = {
|
|
126
|
+
success: false,
|
|
127
|
+
table: source.localTable,
|
|
128
|
+
source: source.name,
|
|
129
|
+
recordsSynced: 0,
|
|
130
|
+
conflictsResolved: 0,
|
|
131
|
+
recordsSkipped: 0,
|
|
132
|
+
durationMs: 0,
|
|
133
|
+
warnings: [],
|
|
134
|
+
};
|
|
135
|
+
try {
|
|
136
|
+
this.ensureInitialized();
|
|
137
|
+
// Read from cloud
|
|
138
|
+
const records = await this.reader.readAll(source);
|
|
139
|
+
this.log(`Read ${records.length} records from cloud ${source.cloudTable}`);
|
|
140
|
+
if (records.length === 0) {
|
|
141
|
+
result.success = true;
|
|
142
|
+
result.durationMs = Date.now() - startTime;
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
// Write to local
|
|
146
|
+
if (!this.config.dryRun) {
|
|
147
|
+
const written = await this.writer.upsert(source.localTable, records);
|
|
148
|
+
result.recordsSynced = written;
|
|
149
|
+
result.recordsSkipped = records.length - written;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
result.recordsSynced = records.length;
|
|
153
|
+
this.log(`[DRY RUN] Would write ${records.length} records to local ${source.localTable}`);
|
|
154
|
+
}
|
|
155
|
+
result.success = true;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
result.error = toErrorMessage(error);
|
|
159
|
+
this.config.onError?.(toError(error), source.name);
|
|
160
|
+
}
|
|
161
|
+
result.durationMs = Date.now() - startTime;
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Pull incremental changes for a single table
|
|
166
|
+
*/
|
|
167
|
+
async pullTableIncremental(source, since) {
|
|
168
|
+
const startTime = Date.now();
|
|
169
|
+
const result = {
|
|
170
|
+
success: false,
|
|
171
|
+
table: source.localTable,
|
|
172
|
+
source: source.name,
|
|
173
|
+
recordsSynced: 0,
|
|
174
|
+
conflictsResolved: 0,
|
|
175
|
+
recordsSkipped: 0,
|
|
176
|
+
durationMs: 0,
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
this.ensureInitialized();
|
|
180
|
+
const records = await this.reader.readChanged(source, since);
|
|
181
|
+
this.log(`Read ${records.length} changed records from cloud ${source.cloudTable} (since ${since.toISOString()})`);
|
|
182
|
+
if (records.length === 0) {
|
|
183
|
+
result.success = true;
|
|
184
|
+
result.durationMs = Date.now() - startTime;
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
if (!this.config.dryRun) {
|
|
188
|
+
const written = await this.writer.upsert(source.localTable, records);
|
|
189
|
+
result.recordsSynced = written;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
result.recordsSynced = records.length;
|
|
193
|
+
}
|
|
194
|
+
result.success = true;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
result.error = toErrorMessage(error);
|
|
198
|
+
}
|
|
199
|
+
result.durationMs = Date.now() - startTime;
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Verify pull by comparing cloud and local counts
|
|
204
|
+
*/
|
|
205
|
+
async verify() {
|
|
206
|
+
this.ensureInitialized();
|
|
207
|
+
const results = [];
|
|
208
|
+
for (const source of this.getEnabledSources()) {
|
|
209
|
+
const cloudCount = await this.reader.count(source);
|
|
210
|
+
const localCount = await this.writer.count(source.localTable);
|
|
211
|
+
results.push({
|
|
212
|
+
source: source.name,
|
|
213
|
+
cloudTable: source.cloudTable,
|
|
214
|
+
localTable: source.localTable,
|
|
215
|
+
cloudCount,
|
|
216
|
+
localCount,
|
|
217
|
+
match: cloudCount === localCount || cloudCount === -1,
|
|
218
|
+
diff: localCount - cloudCount,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
verified: results.every(r => r.match),
|
|
223
|
+
results,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Close all connections
|
|
228
|
+
*/
|
|
229
|
+
async close() {
|
|
230
|
+
if (this.writer) {
|
|
231
|
+
await this.writer.close();
|
|
232
|
+
this.writer = null;
|
|
233
|
+
}
|
|
234
|
+
if (this.cloudWriter) {
|
|
235
|
+
await this.cloudWriter.close();
|
|
236
|
+
this.cloudWriter = null;
|
|
237
|
+
}
|
|
238
|
+
this.reader = null;
|
|
239
|
+
this.log('Pull sync agent closed');
|
|
240
|
+
}
|
|
241
|
+
// Private helpers
|
|
242
|
+
ensureInitialized() {
|
|
243
|
+
if (!this.reader || !this.writer) {
|
|
244
|
+
throw new Error('PullSyncAgent not initialized. Call initialize() first.');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
getEnabledSources() {
|
|
248
|
+
let sources = this.config.sources.filter(s => s.enabled);
|
|
249
|
+
// Filter by specific tables if requested
|
|
250
|
+
if (this.config.tables && this.config.tables.length > 0) {
|
|
251
|
+
const tableSet = new Set(this.config.tables);
|
|
252
|
+
sources = sources.filter(s => tableSet.has(s.localTable) || tableSet.has(s.name));
|
|
253
|
+
}
|
|
254
|
+
// Sort by priority
|
|
255
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
256
|
+
return sources.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
257
|
+
}
|
|
258
|
+
resolveTargetDb() {
|
|
259
|
+
if (this.config.targetDb) {
|
|
260
|
+
return path.resolve(this.config.targetDb);
|
|
261
|
+
}
|
|
262
|
+
return path.resolve(process.cwd(), '.agentic-qe/memory.db');
|
|
263
|
+
}
|
|
264
|
+
backupLocalDb() {
|
|
265
|
+
if (this.config.dryRun)
|
|
266
|
+
return;
|
|
267
|
+
const dbPath = this.resolveTargetDb();
|
|
268
|
+
if (!fs.existsSync(dbPath))
|
|
269
|
+
return;
|
|
270
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
271
|
+
const backupPath = `${dbPath}.bak-${timestamp}`;
|
|
272
|
+
try {
|
|
273
|
+
fs.copyFileSync(dbPath, backupPath);
|
|
274
|
+
this.log(`Backed up local DB to ${backupPath}`);
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
this.log(`Warning: Failed to backup local DB: ${toErrorMessage(error)}`, 'warn');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
createReport(mode) {
|
|
281
|
+
return {
|
|
282
|
+
syncId: uuidv4(),
|
|
283
|
+
startedAt: new Date(),
|
|
284
|
+
status: 'running',
|
|
285
|
+
environment: this.config.environment,
|
|
286
|
+
mode,
|
|
287
|
+
results: [],
|
|
288
|
+
totalRecordsSynced: 0,
|
|
289
|
+
totalConflictsResolved: 0,
|
|
290
|
+
totalDurationMs: 0,
|
|
291
|
+
errors: [],
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
finalizeReport() {
|
|
295
|
+
if (!this.report)
|
|
296
|
+
return;
|
|
297
|
+
this.report.completedAt = new Date();
|
|
298
|
+
this.report.totalDurationMs = this.report.completedAt.getTime() - this.report.startedAt.getTime();
|
|
299
|
+
this.report.totalRecordsSynced = this.report.results.reduce((sum, r) => sum + r.recordsSynced, 0);
|
|
300
|
+
this.report.totalConflictsResolved = this.report.results.reduce((sum, r) => sum + r.conflictsResolved, 0);
|
|
301
|
+
}
|
|
302
|
+
log(message, level = 'info') {
|
|
303
|
+
if (!this.config.verbose && level === 'info')
|
|
304
|
+
return;
|
|
305
|
+
const prefix = `[PullSync:${this.config.environment}]`;
|
|
306
|
+
switch (level) {
|
|
307
|
+
case 'warn':
|
|
308
|
+
console.warn(`${prefix} ${message}`);
|
|
309
|
+
break;
|
|
310
|
+
case 'error':
|
|
311
|
+
console.error(`${prefix} ${message}`);
|
|
312
|
+
break;
|
|
313
|
+
default:
|
|
314
|
+
console.log(`${prefix} ${message}`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
progress(message, progress) {
|
|
318
|
+
this.config.onProgress?.(message, progress);
|
|
319
|
+
this.log(message);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Create a pull sync agent
|
|
324
|
+
*/
|
|
325
|
+
export function createPullSyncAgent(config) {
|
|
326
|
+
return new PullSyncAgent(config);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Quick pull utility — full pull from cloud
|
|
330
|
+
*/
|
|
331
|
+
export async function pullFromCloud(config) {
|
|
332
|
+
const agent = createPullSyncAgent({ ...config, verbose: true });
|
|
333
|
+
await agent.initialize();
|
|
334
|
+
try {
|
|
335
|
+
return await agent.pullAll();
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
await agent.close();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Quick incremental pull utility
|
|
343
|
+
*/
|
|
344
|
+
export async function pullIncrementalFromCloud(since, config) {
|
|
345
|
+
const agent = createPullSyncAgent({ ...config, verbose: true });
|
|
346
|
+
await agent.initialize();
|
|
347
|
+
try {
|
|
348
|
+
return await agent.pullIncremental(since);
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await agent.close();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=pull-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-agent.js","sourceRoot":"","sources":["../../src/sync/pull-agent.ts"],"names":[],"mappings":"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"}
|