@agentlensai/server 0.9.0 → 0.11.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.
- package/dist/cloud/auth/api-key-middleware.d.ts +66 -0
- package/dist/cloud/auth/api-key-middleware.d.ts.map +1 -0
- package/dist/cloud/auth/api-key-middleware.js +147 -0
- package/dist/cloud/auth/api-key-middleware.js.map +1 -0
- package/dist/cloud/auth/api-keys.d.ts +90 -0
- package/dist/cloud/auth/api-keys.d.ts.map +1 -0
- package/dist/cloud/auth/api-keys.js +162 -0
- package/dist/cloud/auth/api-keys.js.map +1 -0
- package/dist/cloud/auth/audit-log.d.ts +66 -0
- package/dist/cloud/auth/audit-log.d.ts.map +1 -0
- package/dist/cloud/auth/audit-log.js +92 -0
- package/dist/cloud/auth/audit-log.js.map +1 -0
- package/dist/cloud/auth/auth-service.d.ts +77 -0
- package/dist/cloud/auth/auth-service.d.ts.map +1 -0
- package/dist/cloud/auth/auth-service.js +229 -0
- package/dist/cloud/auth/auth-service.js.map +1 -0
- package/dist/cloud/auth/brute-force.d.ts +36 -0
- package/dist/cloud/auth/brute-force.d.ts.map +1 -0
- package/dist/cloud/auth/brute-force.js +67 -0
- package/dist/cloud/auth/brute-force.js.map +1 -0
- package/dist/cloud/auth/index.d.ts +11 -0
- package/dist/cloud/auth/index.d.ts.map +1 -0
- package/dist/cloud/auth/index.js +11 -0
- package/dist/cloud/auth/index.js.map +1 -0
- package/dist/cloud/auth/jwt.d.ts +34 -0
- package/dist/cloud/auth/jwt.d.ts.map +1 -0
- package/dist/cloud/auth/jwt.js +68 -0
- package/dist/cloud/auth/jwt.js.map +1 -0
- package/dist/cloud/auth/oauth.d.ts +37 -0
- package/dist/cloud/auth/oauth.d.ts.map +1 -0
- package/dist/cloud/auth/oauth.js +120 -0
- package/dist/cloud/auth/oauth.js.map +1 -0
- package/dist/cloud/auth/passwords.d.ts +25 -0
- package/dist/cloud/auth/passwords.d.ts.map +1 -0
- package/dist/cloud/auth/passwords.js +50 -0
- package/dist/cloud/auth/passwords.js.map +1 -0
- package/dist/cloud/auth/rbac.d.ts +51 -0
- package/dist/cloud/auth/rbac.d.ts.map +1 -0
- package/dist/cloud/auth/rbac.js +89 -0
- package/dist/cloud/auth/rbac.js.map +1 -0
- package/dist/cloud/auth/tokens.d.ts +18 -0
- package/dist/cloud/auth/tokens.d.ts.map +1 -0
- package/dist/cloud/auth/tokens.js +29 -0
- package/dist/cloud/auth/tokens.js.map +1 -0
- package/dist/cloud/billing/billing-service.d.ts +44 -0
- package/dist/cloud/billing/billing-service.d.ts.map +1 -0
- package/dist/cloud/billing/billing-service.js +153 -0
- package/dist/cloud/billing/billing-service.js.map +1 -0
- package/dist/cloud/billing/index.d.ts +11 -0
- package/dist/cloud/billing/index.d.ts.map +1 -0
- package/dist/cloud/billing/index.js +11 -0
- package/dist/cloud/billing/index.js.map +1 -0
- package/dist/cloud/billing/invoice-service.d.ts +57 -0
- package/dist/cloud/billing/invoice-service.d.ts.map +1 -0
- package/dist/cloud/billing/invoice-service.js +123 -0
- package/dist/cloud/billing/invoice-service.js.map +1 -0
- package/dist/cloud/billing/plan-management.d.ts +46 -0
- package/dist/cloud/billing/plan-management.d.ts.map +1 -0
- package/dist/cloud/billing/plan-management.js +157 -0
- package/dist/cloud/billing/plan-management.js.map +1 -0
- package/dist/cloud/billing/quota-enforcement.d.ts +53 -0
- package/dist/cloud/billing/quota-enforcement.d.ts.map +1 -0
- package/dist/cloud/billing/quota-enforcement.js +143 -0
- package/dist/cloud/billing/quota-enforcement.js.map +1 -0
- package/dist/cloud/billing/stripe-client.d.ts +142 -0
- package/dist/cloud/billing/stripe-client.d.ts.map +1 -0
- package/dist/cloud/billing/stripe-client.js +169 -0
- package/dist/cloud/billing/stripe-client.js.map +1 -0
- package/dist/cloud/billing/trial-service.d.ts +47 -0
- package/dist/cloud/billing/trial-service.d.ts.map +1 -0
- package/dist/cloud/billing/trial-service.js +104 -0
- package/dist/cloud/billing/trial-service.js.map +1 -0
- package/dist/cloud/billing/usage-metering.d.ts +83 -0
- package/dist/cloud/billing/usage-metering.d.ts.map +1 -0
- package/dist/cloud/billing/usage-metering.js +174 -0
- package/dist/cloud/billing/usage-metering.js.map +1 -0
- package/dist/cloud/ingestion/backpressure.d.ts +107 -0
- package/dist/cloud/ingestion/backpressure.d.ts.map +1 -0
- package/dist/cloud/ingestion/backpressure.js +134 -0
- package/dist/cloud/ingestion/backpressure.js.map +1 -0
- package/dist/cloud/ingestion/batch-writer.d.ts +115 -0
- package/dist/cloud/ingestion/batch-writer.d.ts.map +1 -0
- package/dist/cloud/ingestion/batch-writer.js +319 -0
- package/dist/cloud/ingestion/batch-writer.js.map +1 -0
- package/dist/cloud/ingestion/dlq-manager.d.ts +116 -0
- package/dist/cloud/ingestion/dlq-manager.d.ts.map +1 -0
- package/dist/cloud/ingestion/dlq-manager.js +244 -0
- package/dist/cloud/ingestion/dlq-manager.js.map +1 -0
- package/dist/cloud/ingestion/event-queue.d.ts +105 -0
- package/dist/cloud/ingestion/event-queue.d.ts.map +1 -0
- package/dist/cloud/ingestion/event-queue.js +185 -0
- package/dist/cloud/ingestion/event-queue.js.map +1 -0
- package/dist/cloud/ingestion/gateway.d.ts +68 -0
- package/dist/cloud/ingestion/gateway.d.ts.map +1 -0
- package/dist/cloud/ingestion/gateway.js +198 -0
- package/dist/cloud/ingestion/gateway.js.map +1 -0
- package/dist/cloud/ingestion/index.d.ts +7 -0
- package/dist/cloud/ingestion/index.d.ts.map +1 -0
- package/dist/cloud/ingestion/index.js +7 -0
- package/dist/cloud/ingestion/index.js.map +1 -0
- package/dist/cloud/ingestion/rate-limiter.d.ts +73 -0
- package/dist/cloud/ingestion/rate-limiter.d.ts.map +1 -0
- package/dist/cloud/ingestion/rate-limiter.js +153 -0
- package/dist/cloud/ingestion/rate-limiter.js.map +1 -0
- package/dist/cloud/migrate.d.ts +45 -0
- package/dist/cloud/migrate.d.ts.map +1 -0
- package/dist/cloud/migrate.js +147 -0
- package/dist/cloud/migrate.js.map +1 -0
- package/dist/cloud/migration/export-import.d.ts +56 -0
- package/dist/cloud/migration/export-import.d.ts.map +1 -0
- package/dist/cloud/migration/export-import.js +289 -0
- package/dist/cloud/migration/export-import.js.map +1 -0
- package/dist/cloud/migration/index.d.ts +5 -0
- package/dist/cloud/migration/index.d.ts.map +1 -0
- package/dist/cloud/migration/index.js +5 -0
- package/dist/cloud/migration/index.js.map +1 -0
- package/dist/cloud/org-service.d.ts +68 -0
- package/dist/cloud/org-service.d.ts.map +1 -0
- package/dist/cloud/org-service.js +169 -0
- package/dist/cloud/org-service.js.map +1 -0
- package/dist/cloud/partition-maintenance.d.ts +29 -0
- package/dist/cloud/partition-maintenance.d.ts.map +1 -0
- package/dist/cloud/partition-maintenance.js +96 -0
- package/dist/cloud/partition-maintenance.js.map +1 -0
- package/dist/cloud/retention/index.d.ts +7 -0
- package/dist/cloud/retention/index.d.ts.map +1 -0
- package/dist/cloud/retention/index.js +7 -0
- package/dist/cloud/retention/index.js.map +1 -0
- package/dist/cloud/retention/partition-management.d.ts +61 -0
- package/dist/cloud/retention/partition-management.d.ts.map +1 -0
- package/dist/cloud/retention/partition-management.js +167 -0
- package/dist/cloud/retention/partition-management.js.map +1 -0
- package/dist/cloud/retention/retention-job.d.ts +70 -0
- package/dist/cloud/retention/retention-job.d.ts.map +1 -0
- package/dist/cloud/retention/retention-job.js +160 -0
- package/dist/cloud/retention/retention-job.js.map +1 -0
- package/dist/cloud/retention/retention-policy.d.ts +27 -0
- package/dist/cloud/retention/retention-policy.d.ts.map +1 -0
- package/dist/cloud/retention/retention-policy.js +36 -0
- package/dist/cloud/retention/retention-policy.js.map +1 -0
- package/dist/cloud/routes/api-key-routes.d.ts +38 -0
- package/dist/cloud/routes/api-key-routes.d.ts.map +1 -0
- package/dist/cloud/routes/api-key-routes.js +84 -0
- package/dist/cloud/routes/api-key-routes.js.map +1 -0
- package/dist/cloud/routes/audit-routes.d.ts +36 -0
- package/dist/cloud/routes/audit-routes.d.ts.map +1 -0
- package/dist/cloud/routes/audit-routes.js +47 -0
- package/dist/cloud/routes/audit-routes.js.map +1 -0
- package/dist/cloud/routes/billing-routes.d.ts +51 -0
- package/dist/cloud/routes/billing-routes.d.ts.map +1 -0
- package/dist/cloud/routes/billing-routes.js +114 -0
- package/dist/cloud/routes/billing-routes.js.map +1 -0
- package/dist/cloud/routes/onboarding-routes.d.ts +34 -0
- package/dist/cloud/routes/onboarding-routes.d.ts.map +1 -0
- package/dist/cloud/routes/onboarding-routes.js +58 -0
- package/dist/cloud/routes/onboarding-routes.js.map +1 -0
- package/dist/cloud/routes/org-routes.d.ts +80 -0
- package/dist/cloud/routes/org-routes.d.ts.map +1 -0
- package/dist/cloud/routes/org-routes.js +153 -0
- package/dist/cloud/routes/org-routes.js.map +1 -0
- package/dist/cloud/routes/usage-routes.d.ts +18 -0
- package/dist/cloud/routes/usage-routes.d.ts.map +1 -0
- package/dist/cloud/routes/usage-routes.js +66 -0
- package/dist/cloud/routes/usage-routes.js.map +1 -0
- package/dist/cloud/storage/adapter.d.ts +102 -0
- package/dist/cloud/storage/adapter.d.ts.map +1 -0
- package/dist/cloud/storage/adapter.js +21 -0
- package/dist/cloud/storage/adapter.js.map +1 -0
- package/dist/cloud/storage/index.d.ts +8 -0
- package/dist/cloud/storage/index.d.ts.map +1 -0
- package/dist/cloud/storage/index.js +7 -0
- package/dist/cloud/storage/index.js.map +1 -0
- package/dist/cloud/storage/postgres-adapter.d.ts +34 -0
- package/dist/cloud/storage/postgres-adapter.d.ts.map +1 -0
- package/dist/cloud/storage/postgres-adapter.js +544 -0
- package/dist/cloud/storage/postgres-adapter.js.map +1 -0
- package/dist/cloud/storage/sqlite-adapter.d.ts +29 -0
- package/dist/cloud/storage/sqlite-adapter.d.ts.map +1 -0
- package/dist/cloud/storage/sqlite-adapter.js +176 -0
- package/dist/cloud/storage/sqlite-adapter.js.map +1 -0
- package/dist/cloud/tenant-pool.d.ts +49 -0
- package/dist/cloud/tenant-pool.d.ts.map +1 -0
- package/dist/cloud/tenant-pool.js +61 -0
- package/dist/cloud/tenant-pool.js.map +1 -0
- package/dist/db/capability-store.d.ts +4 -0
- package/dist/db/capability-store.d.ts.map +1 -1
- package/dist/db/capability-store.js +20 -0
- package/dist/db/capability-store.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/routes/audit.js +3 -3
- package/dist/routes/audit.js.map +1 -1
- package/dist/routes/capabilities-top.d.ts +15 -0
- package/dist/routes/capabilities-top.d.ts.map +1 -0
- package/dist/routes/capabilities-top.js +77 -0
- package/dist/routes/capabilities-top.js.map +1 -0
- package/dist/routes/community.d.ts.map +1 -1
- package/dist/routes/community.js +85 -3
- package/dist/routes/community.js.map +1 -1
- package/dist/routes/delegations-top.d.ts +12 -0
- package/dist/routes/delegations-top.d.ts.map +1 -0
- package/dist/routes/delegations-top.js +43 -0
- package/dist/routes/delegations-top.js.map +1 -0
- package/dist/services/community-service.d.ts +6 -0
- package/dist/services/community-service.d.ts.map +1 -1
- package/dist/services/community-service.js +31 -0
- package/dist/services/community-service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Migration Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes numbered SQL migration files against PostgreSQL.
|
|
5
|
+
* Tracks applied migrations in a `_cloud_migrations` table.
|
|
6
|
+
* Idempotent: skips already-applied migrations.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync, readdirSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
const MIGRATIONS_DIR = join(import.meta.dirname ?? __dirname, 'migrations');
|
|
11
|
+
/**
|
|
12
|
+
* Get ordered migration files from the migrations directory.
|
|
13
|
+
*/
|
|
14
|
+
export function getMigrationFiles(dir = MIGRATIONS_DIR) {
|
|
15
|
+
return readdirSync(dir)
|
|
16
|
+
.filter((f) => f.endsWith('.sql'))
|
|
17
|
+
.sort();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Read the SQL content of a migration file.
|
|
21
|
+
*/
|
|
22
|
+
export function readMigration(filename, dir = MIGRATIONS_DIR) {
|
|
23
|
+
return readFileSync(join(dir, filename), 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ensure the migrations tracking table exists.
|
|
27
|
+
*/
|
|
28
|
+
async function ensureTrackingTable(client) {
|
|
29
|
+
await client.query(`
|
|
30
|
+
CREATE TABLE IF NOT EXISTS _cloud_migrations (
|
|
31
|
+
name TEXT PRIMARY KEY,
|
|
32
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
33
|
+
)
|
|
34
|
+
`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get list of already-applied migrations.
|
|
38
|
+
*/
|
|
39
|
+
async function getAppliedMigrations(client) {
|
|
40
|
+
const result = await client.query('SELECT name FROM _cloud_migrations ORDER BY name');
|
|
41
|
+
return new Set(result.rows.map((r) => r.name));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run all pending migrations in order.
|
|
45
|
+
*/
|
|
46
|
+
export async function runMigrations(client, dir = MIGRATIONS_DIR) {
|
|
47
|
+
await ensureTrackingTable(client);
|
|
48
|
+
const applied = await getAppliedMigrations(client);
|
|
49
|
+
const files = getMigrationFiles(dir);
|
|
50
|
+
const result = { applied: [], skipped: [] };
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
if (applied.has(file)) {
|
|
53
|
+
result.skipped.push(file);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const sql = readMigration(file, dir);
|
|
57
|
+
await client.query(sql);
|
|
58
|
+
await client.query('INSERT INTO _cloud_migrations (name) VALUES ($1)', [file]);
|
|
59
|
+
result.applied.push(file);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate migration SQL files without executing them.
|
|
65
|
+
* Returns parsing issues (basic checks).
|
|
66
|
+
*/
|
|
67
|
+
export function validateMigrations(dir = MIGRATIONS_DIR) {
|
|
68
|
+
const files = getMigrationFiles(dir);
|
|
69
|
+
const errors = [];
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
try {
|
|
72
|
+
const sql = readMigration(file, dir);
|
|
73
|
+
if (!sql.trim()) {
|
|
74
|
+
errors.push({ file, error: 'Empty migration file' });
|
|
75
|
+
}
|
|
76
|
+
// Check numbering
|
|
77
|
+
const num = file.match(/^(\d+)/);
|
|
78
|
+
if (!num) {
|
|
79
|
+
errors.push({ file, error: 'Migration file must start with a number' });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
errors.push({ file, error: String(err) });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { valid: errors.length === 0, files, errors };
|
|
87
|
+
}
|
|
88
|
+
// Partitioned tables (S-1.4)
|
|
89
|
+
export const PARTITIONED_TABLES = ['events', 'audit_log', 'usage_records'];
|
|
90
|
+
// All tenant-scoped tables that should have RLS
|
|
91
|
+
export const TENANT_SCOPED_TABLES = [
|
|
92
|
+
'events',
|
|
93
|
+
'sessions',
|
|
94
|
+
'agents',
|
|
95
|
+
'alert_rules',
|
|
96
|
+
'alert_history',
|
|
97
|
+
'lessons',
|
|
98
|
+
'embeddings',
|
|
99
|
+
'session_summaries',
|
|
100
|
+
'sharing_config',
|
|
101
|
+
'agent_sharing_config',
|
|
102
|
+
'deny_list_rules',
|
|
103
|
+
'sharing_audit_log',
|
|
104
|
+
'sharing_review_queue',
|
|
105
|
+
'anonymous_id_map',
|
|
106
|
+
'capability_registry',
|
|
107
|
+
'discovery_config',
|
|
108
|
+
'delegation_log',
|
|
109
|
+
'api_keys',
|
|
110
|
+
'usage_records',
|
|
111
|
+
'invoices',
|
|
112
|
+
'audit_log',
|
|
113
|
+
'org_members',
|
|
114
|
+
'org_invitations',
|
|
115
|
+
];
|
|
116
|
+
// Cloud-specific tables (S-1.1)
|
|
117
|
+
export const CLOUD_TABLES = [
|
|
118
|
+
'orgs',
|
|
119
|
+
'users',
|
|
120
|
+
'org_members',
|
|
121
|
+
'org_invitations',
|
|
122
|
+
'api_keys',
|
|
123
|
+
'usage_records',
|
|
124
|
+
'invoices',
|
|
125
|
+
'audit_log',
|
|
126
|
+
];
|
|
127
|
+
// Existing tables ported to Postgres (S-1.2)
|
|
128
|
+
export const EXISTING_TABLES = [
|
|
129
|
+
'events',
|
|
130
|
+
'sessions',
|
|
131
|
+
'agents',
|
|
132
|
+
'alert_rules',
|
|
133
|
+
'alert_history',
|
|
134
|
+
'lessons',
|
|
135
|
+
'embeddings',
|
|
136
|
+
'session_summaries',
|
|
137
|
+
'sharing_config',
|
|
138
|
+
'agent_sharing_config',
|
|
139
|
+
'deny_list_rules',
|
|
140
|
+
'sharing_audit_log',
|
|
141
|
+
'sharing_review_queue',
|
|
142
|
+
'anonymous_id_map',
|
|
143
|
+
'capability_registry',
|
|
144
|
+
'discovery_config',
|
|
145
|
+
'delegation_log',
|
|
146
|
+
];
|
|
147
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/cloud/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,YAAY,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,cAAc;IAC5D,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAAc,cAAc;IAC1E,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,MAAuB;IACxD,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;GAKlB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,MAAuB;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtF,OAAO,IAAI,GAAG,CAAE,MAAM,CAAC,IAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAuB,EACvB,MAAc,cAAc;IAE5B,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,MAAM,GAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,cAAc;IAK7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,kBAAkB;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAU,CAAC;AAEpF,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,aAAa;IACb,eAAe;IACf,SAAS;IACT,YAAY;IACZ,mBAAmB;IACnB,gBAAgB;IAChB,sBAAsB;IACtB,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,UAAU;IACV,eAAe;IACf,UAAU;IACV,WAAW;IACX,aAAa;IACb,iBAAiB;CACT,CAAC;AAEX,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM;IACN,OAAO;IACP,aAAa;IACb,iBAAiB;IACjB,UAAU;IACV,eAAe;IACf,UAAU;IACV,WAAW;CACH,CAAC;AAEX,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,aAAa;IACb,eAAe;IACf,SAAS;IACT,YAAY;IACZ,mBAAmB;IACnB,gBAAgB;IAChB,sBAAsB;IACtB,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;CACR,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export/Import Format & Logic (S-8.3)
|
|
3
|
+
*
|
|
4
|
+
* Portable NDJSON format for org data export/import.
|
|
5
|
+
* Each line is a self-contained JSON object with a `_type` discriminator.
|
|
6
|
+
* Sessions come before their events (dependency order).
|
|
7
|
+
* Checksum line at the end for integrity verification.
|
|
8
|
+
*/
|
|
9
|
+
import type { Pool } from '../tenant-pool.js';
|
|
10
|
+
export type RecordType = 'agent' | 'session' | 'event' | 'health_score' | 'config';
|
|
11
|
+
export interface ExportRecord {
|
|
12
|
+
_type: RecordType;
|
|
13
|
+
_version: 1;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface ExportChecksum {
|
|
17
|
+
_type: 'checksum';
|
|
18
|
+
sha256: string;
|
|
19
|
+
counts: Record<RecordType, number>;
|
|
20
|
+
exported_at: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ExportOptions {
|
|
23
|
+
orgId: string;
|
|
24
|
+
from?: string;
|
|
25
|
+
to?: string;
|
|
26
|
+
agentId?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ImportResult {
|
|
29
|
+
imported: Record<string, number>;
|
|
30
|
+
skipped: number;
|
|
31
|
+
errors: Array<{
|
|
32
|
+
line: number;
|
|
33
|
+
error: string;
|
|
34
|
+
}>;
|
|
35
|
+
checksumValid: boolean | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Export org data as an array of NDJSON lines (strings).
|
|
39
|
+
* Streams agents → sessions → events → health_scores → config.
|
|
40
|
+
* Appends a checksum record at the end.
|
|
41
|
+
*/
|
|
42
|
+
export declare function exportOrgData(pool: Pool, options: ExportOptions): Promise<string[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Import NDJSON lines into an org. Idempotent: existing IDs are skipped.
|
|
45
|
+
* Validates checksum if present.
|
|
46
|
+
*/
|
|
47
|
+
export declare function importOrgData(pool: Pool, orgId: string, lines: string[]): Promise<ImportResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Compute SHA-256 checksum for an array of NDJSON lines.
|
|
50
|
+
*/
|
|
51
|
+
export declare function computeChecksum(lines: string[]): string;
|
|
52
|
+
/**
|
|
53
|
+
* Validate that an NDJSON checksum line matches the data.
|
|
54
|
+
*/
|
|
55
|
+
export declare function validateChecksum(dataLines: string[], expectedSha256: string): boolean;
|
|
56
|
+
//# sourceMappingURL=export-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-import.d.ts","sourceRoot":"","sources":["../../../src/cloud/migration/export-import.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAK9C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEnF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B;AAcD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiHnB;AAID;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,YAAY,CAAC,CA0DvB;AAiID;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAErF"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export/Import Format & Logic (S-8.3)
|
|
3
|
+
*
|
|
4
|
+
* Portable NDJSON format for org data export/import.
|
|
5
|
+
* Each line is a self-contained JSON object with a `_type` discriminator.
|
|
6
|
+
* Sessions come before their events (dependency order).
|
|
7
|
+
* Checksum line at the end for integrity verification.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
import { withTenantTransaction, tenantQuery } from '../tenant-pool.js';
|
|
11
|
+
// ─── Record Tables ───────────────────────────────────────────
|
|
12
|
+
const TABLE_MAP = {
|
|
13
|
+
agent: 'agents',
|
|
14
|
+
session: 'sessions',
|
|
15
|
+
event: 'events',
|
|
16
|
+
health_score: 'health_scores',
|
|
17
|
+
config: 'org_settings',
|
|
18
|
+
};
|
|
19
|
+
// ─── Export ──────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Export org data as an array of NDJSON lines (strings).
|
|
22
|
+
* Streams agents → sessions → events → health_scores → config.
|
|
23
|
+
* Appends a checksum record at the end.
|
|
24
|
+
*/
|
|
25
|
+
export async function exportOrgData(pool, options) {
|
|
26
|
+
const { orgId, from, to, agentId } = options;
|
|
27
|
+
const lines = [];
|
|
28
|
+
const counts = {};
|
|
29
|
+
const hash = createHash('sha256');
|
|
30
|
+
function addLine(record) {
|
|
31
|
+
const json = JSON.stringify(record);
|
|
32
|
+
lines.push(json);
|
|
33
|
+
hash.update(json + '\n');
|
|
34
|
+
counts[record._type] = (counts[record._type] ?? 0) + 1;
|
|
35
|
+
}
|
|
36
|
+
await withTenantTransaction(pool, orgId, async (client) => {
|
|
37
|
+
// 1. Agents
|
|
38
|
+
const agentWhere = agentId ? ' AND id = $1' : '';
|
|
39
|
+
const agentParams = agentId ? [agentId] : [];
|
|
40
|
+
const agents = await client.query(`SELECT * FROM agents WHERE 1=1${agentWhere} ORDER BY id`, agentParams);
|
|
41
|
+
for (const row of agents.rows) {
|
|
42
|
+
addLine({ _type: 'agent', _version: 1, ...stripOrgId(row) });
|
|
43
|
+
}
|
|
44
|
+
// 2. Sessions
|
|
45
|
+
const sessionFilters = [];
|
|
46
|
+
const sessionParams = [];
|
|
47
|
+
let paramIdx = 1;
|
|
48
|
+
if (agentId) {
|
|
49
|
+
sessionFilters.push(`agent_id = $${paramIdx++}`);
|
|
50
|
+
sessionParams.push(agentId);
|
|
51
|
+
}
|
|
52
|
+
if (from) {
|
|
53
|
+
sessionFilters.push(`created_at >= $${paramIdx++}`);
|
|
54
|
+
sessionParams.push(from);
|
|
55
|
+
}
|
|
56
|
+
if (to) {
|
|
57
|
+
sessionFilters.push(`created_at <= $${paramIdx++}`);
|
|
58
|
+
sessionParams.push(to);
|
|
59
|
+
}
|
|
60
|
+
const sessionWhere = sessionFilters.length
|
|
61
|
+
? ' AND ' + sessionFilters.join(' AND ')
|
|
62
|
+
: '';
|
|
63
|
+
const sessions = await client.query(`SELECT * FROM sessions WHERE 1=1${sessionWhere} ORDER BY created_at`, sessionParams);
|
|
64
|
+
for (const row of sessions.rows) {
|
|
65
|
+
addLine({ _type: 'session', _version: 1, ...stripOrgId(row) });
|
|
66
|
+
}
|
|
67
|
+
// Collect session IDs for event filtering
|
|
68
|
+
const sessionIds = sessions.rows.map((r) => r.id);
|
|
69
|
+
// 3. Events (only for exported sessions)
|
|
70
|
+
if (sessionIds.length > 0) {
|
|
71
|
+
const eventFilters = [`session_id = ANY($1)`];
|
|
72
|
+
const eventParams = [sessionIds];
|
|
73
|
+
let eidx = 2;
|
|
74
|
+
if (from) {
|
|
75
|
+
eventFilters.push(`timestamp >= $${eidx++}`);
|
|
76
|
+
eventParams.push(from);
|
|
77
|
+
}
|
|
78
|
+
if (to) {
|
|
79
|
+
eventFilters.push(`timestamp <= $${eidx++}`);
|
|
80
|
+
eventParams.push(to);
|
|
81
|
+
}
|
|
82
|
+
const events = await client.query(`SELECT * FROM events WHERE ${eventFilters.join(' AND ')} ORDER BY timestamp`, eventParams);
|
|
83
|
+
for (const row of events.rows) {
|
|
84
|
+
addLine({ _type: 'event', _version: 1, ...stripOrgId(row) });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// 4. Health scores
|
|
88
|
+
const hsFilters = [];
|
|
89
|
+
const hsParams = [];
|
|
90
|
+
let hsIdx = 1;
|
|
91
|
+
if (agentId) {
|
|
92
|
+
hsFilters.push(`agent_id = $${hsIdx++}`);
|
|
93
|
+
hsParams.push(agentId);
|
|
94
|
+
}
|
|
95
|
+
if (from) {
|
|
96
|
+
hsFilters.push(`timestamp >= $${hsIdx++}`);
|
|
97
|
+
hsParams.push(from);
|
|
98
|
+
}
|
|
99
|
+
if (to) {
|
|
100
|
+
hsFilters.push(`timestamp <= $${hsIdx++}`);
|
|
101
|
+
hsParams.push(to);
|
|
102
|
+
}
|
|
103
|
+
const hsWhere = hsFilters.length ? ' AND ' + hsFilters.join(' AND ') : '';
|
|
104
|
+
const healthScores = await client.query(`SELECT * FROM health_scores WHERE 1=1${hsWhere} ORDER BY timestamp`, hsParams);
|
|
105
|
+
for (const row of healthScores.rows) {
|
|
106
|
+
addLine({ _type: 'health_score', _version: 1, ...stripOrgId(row) });
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// Checksum line
|
|
110
|
+
const checksum = {
|
|
111
|
+
_type: 'checksum',
|
|
112
|
+
sha256: hash.digest('hex'),
|
|
113
|
+
counts: counts,
|
|
114
|
+
exported_at: new Date().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
lines.push(JSON.stringify(checksum));
|
|
117
|
+
return lines;
|
|
118
|
+
}
|
|
119
|
+
// ─── Import ──────────────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Import NDJSON lines into an org. Idempotent: existing IDs are skipped.
|
|
122
|
+
* Validates checksum if present.
|
|
123
|
+
*/
|
|
124
|
+
export async function importOrgData(pool, orgId, lines) {
|
|
125
|
+
const result = {
|
|
126
|
+
imported: {},
|
|
127
|
+
skipped: 0,
|
|
128
|
+
errors: [],
|
|
129
|
+
checksumValid: null,
|
|
130
|
+
};
|
|
131
|
+
// Separate data lines from checksum
|
|
132
|
+
const dataLines = [];
|
|
133
|
+
let checksumLine = null;
|
|
134
|
+
for (let i = 0; i < lines.length; i++) {
|
|
135
|
+
const line = lines[i].trim();
|
|
136
|
+
if (!line)
|
|
137
|
+
continue;
|
|
138
|
+
try {
|
|
139
|
+
const parsed = JSON.parse(line);
|
|
140
|
+
if (parsed._type === 'checksum') {
|
|
141
|
+
checksumLine = parsed;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
dataLines.push(line);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
result.errors.push({ line: i + 1, error: 'Invalid JSON' });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Validate checksum
|
|
152
|
+
if (checksumLine) {
|
|
153
|
+
const hash = createHash('sha256');
|
|
154
|
+
for (const dl of dataLines) {
|
|
155
|
+
hash.update(dl + '\n');
|
|
156
|
+
}
|
|
157
|
+
result.checksumValid = hash.digest('hex') === checksumLine.sha256;
|
|
158
|
+
}
|
|
159
|
+
// Import records in dependency order: agents → sessions → events → health_scores
|
|
160
|
+
const ordered = orderByDependency(dataLines, result);
|
|
161
|
+
await withTenantTransaction(pool, orgId, async (client) => {
|
|
162
|
+
for (const { lineNum, record } of ordered) {
|
|
163
|
+
try {
|
|
164
|
+
const imported = await importRecord(client, orgId, record);
|
|
165
|
+
if (imported) {
|
|
166
|
+
result.imported[record._type] = (result.imported[record._type] ?? 0) + 1;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
result.skipped++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
result.errors.push({
|
|
174
|
+
line: lineNum,
|
|
175
|
+
error: err instanceof Error ? err.message : String(err),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
// ─── Helpers ─────────────────────────────────────────────────
|
|
183
|
+
function stripOrgId(row) {
|
|
184
|
+
const { org_id, ...rest } = row;
|
|
185
|
+
return rest;
|
|
186
|
+
}
|
|
187
|
+
const TYPE_ORDER = {
|
|
188
|
+
config: 0,
|
|
189
|
+
agent: 1,
|
|
190
|
+
session: 2,
|
|
191
|
+
event: 3,
|
|
192
|
+
health_score: 4,
|
|
193
|
+
};
|
|
194
|
+
function orderByDependency(dataLines, result) {
|
|
195
|
+
const records = [];
|
|
196
|
+
for (let i = 0; i < dataLines.length; i++) {
|
|
197
|
+
try {
|
|
198
|
+
const parsed = JSON.parse(dataLines[i]);
|
|
199
|
+
if (!parsed._type || !(parsed._type in TYPE_ORDER)) {
|
|
200
|
+
result.errors.push({ line: i + 1, error: `Unknown record type: ${parsed._type}` });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
records.push({ lineNum: i + 1, record: parsed });
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
result.errors.push({ line: i + 1, error: 'Invalid JSON' });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
records.sort((a, b) => (TYPE_ORDER[a.record._type] ?? 99) - (TYPE_ORDER[b.record._type] ?? 99));
|
|
210
|
+
return records;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Import a single record. Returns true if inserted, false if skipped (duplicate).
|
|
214
|
+
*/
|
|
215
|
+
async function importRecord(client, orgId, record) {
|
|
216
|
+
const { _type, _version, ...data } = record;
|
|
217
|
+
switch (_type) {
|
|
218
|
+
case 'agent': {
|
|
219
|
+
const { id, name, description, created_at, updated_at } = data;
|
|
220
|
+
const res = await client.query(`INSERT INTO agents (id, org_id, name, description, created_at, updated_at)
|
|
221
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
222
|
+
ON CONFLICT (id) DO NOTHING`, [id, orgId, name ?? null, description ?? null, created_at, updated_at ?? created_at]);
|
|
223
|
+
return (res.rowCount ?? 0) > 0;
|
|
224
|
+
}
|
|
225
|
+
case 'session': {
|
|
226
|
+
const { id, agent_id, status, metadata, created_at, updated_at, ended_at } = data;
|
|
227
|
+
const res = await client.query(`INSERT INTO sessions (id, org_id, agent_id, status, metadata, created_at, updated_at, ended_at)
|
|
228
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
229
|
+
ON CONFLICT (id) DO NOTHING`, [
|
|
230
|
+
id, orgId, agent_id, status ?? 'completed',
|
|
231
|
+
typeof metadata === 'object' ? JSON.stringify(metadata) : metadata ?? '{}',
|
|
232
|
+
created_at, updated_at ?? created_at, ended_at ?? null,
|
|
233
|
+
]);
|
|
234
|
+
return (res.rowCount ?? 0) > 0;
|
|
235
|
+
}
|
|
236
|
+
case 'event': {
|
|
237
|
+
const { id, session_id, event_type, type, timestamp, payload, data: eventData, ...extra } = data;
|
|
238
|
+
const resolvedType = event_type ?? type;
|
|
239
|
+
const resolvedPayload = payload ?? eventData;
|
|
240
|
+
const res = await client.query(`INSERT INTO events (id, org_id, session_id, event_type, timestamp, payload)
|
|
241
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
242
|
+
ON CONFLICT (id) DO NOTHING`, [
|
|
243
|
+
id, orgId, session_id, resolvedType, timestamp,
|
|
244
|
+
typeof resolvedPayload === 'object' ? JSON.stringify(resolvedPayload) : resolvedPayload ?? '{}',
|
|
245
|
+
]);
|
|
246
|
+
return (res.rowCount ?? 0) > 0;
|
|
247
|
+
}
|
|
248
|
+
case 'health_score': {
|
|
249
|
+
const { id, agent_id, timestamp, score, dimensions, metadata: hsMeta } = data;
|
|
250
|
+
const res = await client.query(`INSERT INTO health_scores (id, org_id, agent_id, timestamp, score, dimensions, metadata)
|
|
251
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
252
|
+
ON CONFLICT (id) DO NOTHING`, [
|
|
253
|
+
id, orgId, agent_id, timestamp, score,
|
|
254
|
+
typeof dimensions === 'object' ? JSON.stringify(dimensions) : dimensions ?? '{}',
|
|
255
|
+
typeof hsMeta === 'object' ? JSON.stringify(hsMeta) : hsMeta ?? '{}',
|
|
256
|
+
]);
|
|
257
|
+
return (res.rowCount ?? 0) > 0;
|
|
258
|
+
}
|
|
259
|
+
case 'config': {
|
|
260
|
+
// Config records are org-level settings — upsert
|
|
261
|
+
const { key, value } = data;
|
|
262
|
+
if (!key)
|
|
263
|
+
return false;
|
|
264
|
+
await client.query(`INSERT INTO org_settings (org_id, key, value)
|
|
265
|
+
VALUES ($1, $2, $3)
|
|
266
|
+
ON CONFLICT (org_id, key) DO UPDATE SET value = EXCLUDED.value`, [orgId, key, typeof value === 'object' ? JSON.stringify(value) : value]);
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
default:
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Compute SHA-256 checksum for an array of NDJSON lines.
|
|
275
|
+
*/
|
|
276
|
+
export function computeChecksum(lines) {
|
|
277
|
+
const hash = createHash('sha256');
|
|
278
|
+
for (const line of lines) {
|
|
279
|
+
hash.update(line + '\n');
|
|
280
|
+
}
|
|
281
|
+
return hash.digest('hex');
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Validate that an NDJSON checksum line matches the data.
|
|
285
|
+
*/
|
|
286
|
+
export function validateChecksum(dataLines, expectedSha256) {
|
|
287
|
+
return computeChecksum(dataLines) === expectedSha256;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=export-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../../src/cloud/migration/export-import.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiCvE,gEAAgE;AAEhE,MAAM,SAAS,GAA+B;IAC5C,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF,gEAAgE;AAEhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,OAAsB;IAEtB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,SAAS,OAAO,CAAC,MAAoB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxD,YAAY;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,iCAAiC,UAAU,cAAc,EACzD,WAAW,CACZ,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAiC,EAAE,CAAC;YAC3D,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,cAAc;QACd,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,aAAa,GAAc,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,cAAc,CAAC,IAAI,CAAC,eAAe,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjD,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,cAAc,CAAC,IAAI,CAAC,kBAAkB,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,EAAE,CAAC;YACP,cAAc,CAAC,IAAI,CAAC,kBAAkB,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpD,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM;YACxC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CACjC,mCAAmC,YAAY,sBAAsB,EACrE,aAAa,CACd,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAiC,EAAE,CAAC;YAC7D,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,0CAA0C;QAC1C,MAAM,UAAU,GAAI,QAAQ,CAAC,IAAkC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAY,CAAC,CAAC;QAE3F,yCAAyC;QACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAa,CAAC,sBAAsB,CAAC,CAAC;YACxD,MAAM,WAAW,GAAc,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,IAAI,EAAE,CAAC;gBACT,YAAY,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,EAAE,EAAE,CAAC;gBACP,YAAY,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,8BAA8B,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAC7E,WAAW,CACZ,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAiC,EAAE,CAAC;gBAC3D,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,iBAAiB,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,EAAE,EAAE,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,iBAAiB,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CACrC,wCAAwC,OAAO,qBAAqB,EACpE,QAAQ,CACT,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAiC,EAAE,CAAC;YACjE,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,QAAQ,GAAmB;QAC/B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1B,MAAM,EAAE,MAAoC;QAC5C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAErC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAEhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAU,EACV,KAAa,EACb,KAAe;IAEf,MAAM,MAAM,GAAiB;QAC3B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,oCAAoC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,YAAY,GAA0B,IAAI,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,YAAY,GAAG,MAAwB,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,MAAM,CAAC;IACpE,CAAC;IAED,iFAAiF;IACjF,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxD,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC3D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC3E,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAEhE,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,YAAY,EAAE,CAAC;CAChB,CAAC;AAOF,SAAS,iBAAiB,CACxB,SAAmB,EACnB,MAAoB;IAEpB,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAiB,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,wBAAwB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAClF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,MAAkG,EAClG,KAAa,EACb,MAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAE5C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAA+B,CAAC;YAC1F,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B;;qCAE6B,EAC7B,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI,EAAE,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,CACrF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,GACxE,IAA+B,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B;;qCAE6B,EAC7B;gBACE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,WAAW;gBAC1C,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI;gBAC1E,UAAU,EAAE,UAAU,IAAI,UAAU,EAAE,QAAQ,IAAI,IAAI;aACvD,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GACvF,IAA+B,CAAC;YAClC,MAAM,YAAY,GAAG,UAAU,IAAI,IAAI,CAAC;YACxC,MAAM,eAAe,GAAG,OAAO,IAAI,SAAS,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B;;qCAE6B,EAC7B;gBACE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS;gBAC9C,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,IAAI;aAChG,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GACpE,IAA+B,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAC5B;;qCAE6B,EAC7B;gBACE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK;gBACrC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI;gBAChF,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI;aACrE,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,iDAAiD;YACjD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAA+B,CAAC;YACvD,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YACvB,MAAM,MAAM,CAAC,KAAK,CAChB;;wEAEgE,EAChE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CACxE,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAmB,EAAE,cAAsB;IAC1E,OAAO,eAAe,CAAC,SAAS,CAAC,KAAK,cAAc,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cloud/migration/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cloud/migration/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAA4D,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org Service (S-7.1, S-7.2)
|
|
3
|
+
*
|
|
4
|
+
* Manages organizations, memberships, and invitations.
|
|
5
|
+
* Used by dashboard routes for org switching and team management.
|
|
6
|
+
*/
|
|
7
|
+
import type { MigrationClient } from './migrate.js';
|
|
8
|
+
export interface Org {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
slug: string;
|
|
12
|
+
plan: string;
|
|
13
|
+
created_at: string;
|
|
14
|
+
}
|
|
15
|
+
export interface OrgMember {
|
|
16
|
+
user_id: string;
|
|
17
|
+
email: string;
|
|
18
|
+
display_name: string | null;
|
|
19
|
+
avatar_url: string | null;
|
|
20
|
+
role: string;
|
|
21
|
+
joined_at: string;
|
|
22
|
+
}
|
|
23
|
+
export interface OrgInvitation {
|
|
24
|
+
id: string;
|
|
25
|
+
org_id: string;
|
|
26
|
+
email: string;
|
|
27
|
+
role: string;
|
|
28
|
+
invited_by: string;
|
|
29
|
+
invited_by_name: string | null;
|
|
30
|
+
expires_at: string;
|
|
31
|
+
created_at: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class OrgServiceError extends Error {
|
|
34
|
+
code: string;
|
|
35
|
+
statusCode: number;
|
|
36
|
+
constructor(code: string, message: string, statusCode?: number);
|
|
37
|
+
}
|
|
38
|
+
export declare class OrgService {
|
|
39
|
+
private db;
|
|
40
|
+
constructor(db: MigrationClient);
|
|
41
|
+
/** List orgs the user belongs to */
|
|
42
|
+
listUserOrgs(userId: string): Promise<Org[]>;
|
|
43
|
+
/** Create a new org and make the user the owner */
|
|
44
|
+
createOrg(userId: string, name: string): Promise<Org>;
|
|
45
|
+
/** List members of an org */
|
|
46
|
+
listMembers(orgId: string): Promise<OrgMember[]>;
|
|
47
|
+
/** Invite a user by email */
|
|
48
|
+
inviteMember(orgId: string, invitedByUserId: string, email: string, role: 'admin' | 'member' | 'viewer'): Promise<{
|
|
49
|
+
invitation: OrgInvitation;
|
|
50
|
+
token: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** Accept an invitation by token */
|
|
53
|
+
acceptInvitation(token: string, userId: string): Promise<{
|
|
54
|
+
orgId: string;
|
|
55
|
+
role: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** List pending invitations for an org */
|
|
58
|
+
listInvitations(orgId: string): Promise<OrgInvitation[]>;
|
|
59
|
+
/** Cancel a pending invitation */
|
|
60
|
+
cancelInvitation(orgId: string, invitationId: string): Promise<boolean>;
|
|
61
|
+
/** Change a member's role */
|
|
62
|
+
changeMemberRole(orgId: string, targetUserId: string, newRole: string, actorRole: string): Promise<void>;
|
|
63
|
+
/** Remove a member from org */
|
|
64
|
+
removeMember(orgId: string, targetUserId: string): Promise<void>;
|
|
65
|
+
/** Transfer ownership to another member */
|
|
66
|
+
transferOwnership(orgId: string, fromUserId: string, toUserId: string): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=org-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-service.d.ts","sourceRoot":"","sources":["../../src/cloud/org-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,IAAI,EAAE,MAAM;IAEZ,UAAU;gBAFV,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,UAAU,SAAM;CAK1B;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,eAAe;IAMvC,oCAAoC;IAC9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAYlD,mDAAmD;IAC7C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B3D,6BAA6B;IACvB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAYtD,6BAA6B;IACvB,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAClC,OAAO,CAAC;QAAE,UAAU,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA0CxD,oCAAoC;IAC9B,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IA8B/F,0CAA0C;IACpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAa9D,kCAAkC;IAC5B,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7E,6BAA6B;IACvB,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IA8BhB,+BAA+B;IACzB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtE,2CAA2C;IACrC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA6B5F"}
|