@agenticmail/enterprise 0.2.1
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/ARCHITECTURE.md +183 -0
- package/agenticmail-enterprise.db +0 -0
- package/dashboards/README.md +120 -0
- package/dashboards/dotnet/Program.cs +261 -0
- package/dashboards/express/app.js +146 -0
- package/dashboards/go/main.go +513 -0
- package/dashboards/html/index.html +535 -0
- package/dashboards/java/AgenticMailDashboard.java +376 -0
- package/dashboards/php/index.php +414 -0
- package/dashboards/python/app.py +273 -0
- package/dashboards/ruby/app.rb +195 -0
- package/dist/chunk-77IDQJL3.js +7 -0
- package/dist/chunk-7RGCCHIT.js +115 -0
- package/dist/chunk-DXNKR3TG.js +1355 -0
- package/dist/chunk-IQWA44WT.js +970 -0
- package/dist/chunk-LCUZGIDH.js +965 -0
- package/dist/chunk-N2JVTNNJ.js +2553 -0
- package/dist/chunk-O462UJBH.js +363 -0
- package/dist/chunk-PNKVD2UK.js +26 -0
- package/dist/cli.js +218 -0
- package/dist/dashboard/index.html +558 -0
- package/dist/db-adapter-DEWEFNIV.js +7 -0
- package/dist/dynamodb-CCGL2E77.js +426 -0
- package/dist/engine/index.js +1261 -0
- package/dist/index.js +522 -0
- package/dist/mongodb-ODTXIVPV.js +319 -0
- package/dist/mysql-RM3S2FV5.js +521 -0
- package/dist/postgres-LN7A6MGQ.js +518 -0
- package/dist/routes-2JEPIIKC.js +441 -0
- package/dist/routes-74ZLKJKP.js +399 -0
- package/dist/server.js +7 -0
- package/dist/sqlite-3K5YOZ4K.js +439 -0
- package/dist/turso-LDWODSDI.js +442 -0
- package/package.json +49 -0
- package/src/admin/routes.ts +331 -0
- package/src/auth/routes.ts +130 -0
- package/src/cli.ts +260 -0
- package/src/dashboard/index.html +558 -0
- package/src/db/adapter.ts +230 -0
- package/src/db/dynamodb.ts +456 -0
- package/src/db/factory.ts +51 -0
- package/src/db/mongodb.ts +360 -0
- package/src/db/mysql.ts +472 -0
- package/src/db/postgres.ts +479 -0
- package/src/db/sql-schema.ts +123 -0
- package/src/db/sqlite.ts +391 -0
- package/src/db/turso.ts +411 -0
- package/src/deploy/fly.ts +368 -0
- package/src/deploy/managed.ts +213 -0
- package/src/engine/activity.ts +474 -0
- package/src/engine/agent-config.ts +429 -0
- package/src/engine/agenticmail-bridge.ts +296 -0
- package/src/engine/approvals.ts +278 -0
- package/src/engine/db-adapter.ts +682 -0
- package/src/engine/db-schema.ts +335 -0
- package/src/engine/deployer.ts +595 -0
- package/src/engine/index.ts +134 -0
- package/src/engine/knowledge.ts +486 -0
- package/src/engine/lifecycle.ts +635 -0
- package/src/engine/openclaw-hook.ts +371 -0
- package/src/engine/routes.ts +528 -0
- package/src/engine/skills.ts +473 -0
- package/src/engine/tenant.ts +345 -0
- package/src/engine/tool-catalog.ts +189 -0
- package/src/index.ts +64 -0
- package/src/lib/resilience.ts +326 -0
- package/src/middleware/index.ts +286 -0
- package/src/server.ts +310 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine Database Schema
|
|
3
|
+
*
|
|
4
|
+
* SQL DDL for all engine tables. Used by SQLite, Postgres, MySQL, Turso.
|
|
5
|
+
* MongoDB/DynamoDB use their own collection/table designs.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export const ENGINE_TABLES = `
|
|
9
|
+
-- Managed agents (the deployed AI employees)
|
|
10
|
+
CREATE TABLE IF NOT EXISTS managed_agents (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
org_id TEXT NOT NULL,
|
|
13
|
+
name TEXT NOT NULL,
|
|
14
|
+
display_name TEXT NOT NULL,
|
|
15
|
+
state TEXT NOT NULL DEFAULT 'draft',
|
|
16
|
+
config JSON NOT NULL,
|
|
17
|
+
health JSON NOT NULL DEFAULT '{}',
|
|
18
|
+
usage JSON NOT NULL DEFAULT '{}',
|
|
19
|
+
permission_profile_id TEXT,
|
|
20
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
21
|
+
last_deployed_at TEXT,
|
|
22
|
+
last_health_check_at TEXT,
|
|
23
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
24
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
25
|
+
);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_managed_agents_org ON managed_agents(org_id);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_managed_agents_state ON managed_agents(state);
|
|
28
|
+
|
|
29
|
+
-- State transition history
|
|
30
|
+
CREATE TABLE IF NOT EXISTS agent_state_history (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
agent_id TEXT NOT NULL,
|
|
33
|
+
from_state TEXT NOT NULL,
|
|
34
|
+
to_state TEXT NOT NULL,
|
|
35
|
+
reason TEXT NOT NULL,
|
|
36
|
+
triggered_by TEXT NOT NULL,
|
|
37
|
+
error TEXT,
|
|
38
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
39
|
+
FOREIGN KEY (agent_id) REFERENCES managed_agents(id) ON DELETE CASCADE
|
|
40
|
+
);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_state_history_agent ON agent_state_history(agent_id);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_state_history_time ON agent_state_history(created_at);
|
|
43
|
+
|
|
44
|
+
-- Permission profiles
|
|
45
|
+
CREATE TABLE IF NOT EXISTS permission_profiles (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
org_id TEXT NOT NULL,
|
|
48
|
+
name TEXT NOT NULL,
|
|
49
|
+
description TEXT,
|
|
50
|
+
config JSON NOT NULL,
|
|
51
|
+
is_preset INTEGER NOT NULL DEFAULT 0,
|
|
52
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
53
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
54
|
+
);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_permission_profiles_org ON permission_profiles(org_id);
|
|
56
|
+
|
|
57
|
+
-- Organizations (tenants)
|
|
58
|
+
CREATE TABLE IF NOT EXISTS organizations (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
name TEXT NOT NULL,
|
|
61
|
+
slug TEXT NOT NULL UNIQUE,
|
|
62
|
+
plan TEXT NOT NULL DEFAULT 'free',
|
|
63
|
+
limits JSON NOT NULL DEFAULT '{}',
|
|
64
|
+
usage JSON NOT NULL DEFAULT '{}',
|
|
65
|
+
settings JSON NOT NULL DEFAULT '{}',
|
|
66
|
+
sso_config JSON,
|
|
67
|
+
allowed_domains JSON NOT NULL DEFAULT '[]',
|
|
68
|
+
billing JSON,
|
|
69
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
70
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
71
|
+
);
|
|
72
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_organizations_slug ON organizations(slug);
|
|
73
|
+
|
|
74
|
+
-- Knowledge bases
|
|
75
|
+
CREATE TABLE IF NOT EXISTS knowledge_bases (
|
|
76
|
+
id TEXT PRIMARY KEY,
|
|
77
|
+
org_id TEXT NOT NULL,
|
|
78
|
+
name TEXT NOT NULL,
|
|
79
|
+
description TEXT,
|
|
80
|
+
agent_ids JSON NOT NULL DEFAULT '[]',
|
|
81
|
+
config JSON NOT NULL DEFAULT '{}',
|
|
82
|
+
stats JSON NOT NULL DEFAULT '{}',
|
|
83
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
84
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
85
|
+
);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_bases_org ON knowledge_bases(org_id);
|
|
87
|
+
|
|
88
|
+
-- Knowledge base documents
|
|
89
|
+
CREATE TABLE IF NOT EXISTS kb_documents (
|
|
90
|
+
id TEXT PRIMARY KEY,
|
|
91
|
+
knowledge_base_id TEXT NOT NULL,
|
|
92
|
+
name TEXT NOT NULL,
|
|
93
|
+
source_type TEXT NOT NULL,
|
|
94
|
+
source_url TEXT,
|
|
95
|
+
mime_type TEXT NOT NULL DEFAULT 'text/plain',
|
|
96
|
+
size INTEGER NOT NULL DEFAULT 0,
|
|
97
|
+
metadata JSON NOT NULL DEFAULT '{}',
|
|
98
|
+
status TEXT NOT NULL DEFAULT 'processing',
|
|
99
|
+
error TEXT,
|
|
100
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
101
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
102
|
+
FOREIGN KEY (knowledge_base_id) REFERENCES knowledge_bases(id) ON DELETE CASCADE
|
|
103
|
+
);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_kb_documents_kb ON kb_documents(knowledge_base_id);
|
|
105
|
+
|
|
106
|
+
-- Knowledge base chunks (for RAG)
|
|
107
|
+
CREATE TABLE IF NOT EXISTS kb_chunks (
|
|
108
|
+
id TEXT PRIMARY KEY,
|
|
109
|
+
document_id TEXT NOT NULL,
|
|
110
|
+
content TEXT NOT NULL,
|
|
111
|
+
token_count INTEGER NOT NULL DEFAULT 0,
|
|
112
|
+
position INTEGER NOT NULL DEFAULT 0,
|
|
113
|
+
embedding BLOB,
|
|
114
|
+
metadata JSON NOT NULL DEFAULT '{}',
|
|
115
|
+
FOREIGN KEY (document_id) REFERENCES kb_documents(id) ON DELETE CASCADE
|
|
116
|
+
);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_kb_chunks_doc ON kb_chunks(document_id);
|
|
118
|
+
|
|
119
|
+
-- Tool call records (activity tracking)
|
|
120
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
121
|
+
id TEXT PRIMARY KEY,
|
|
122
|
+
agent_id TEXT NOT NULL,
|
|
123
|
+
org_id TEXT NOT NULL,
|
|
124
|
+
session_id TEXT,
|
|
125
|
+
tool_id TEXT NOT NULL,
|
|
126
|
+
tool_name TEXT NOT NULL,
|
|
127
|
+
parameters JSON,
|
|
128
|
+
result JSON,
|
|
129
|
+
timing JSON NOT NULL,
|
|
130
|
+
cost JSON,
|
|
131
|
+
permission JSON NOT NULL,
|
|
132
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
133
|
+
);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_agent ON tool_calls(agent_id);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_org ON tool_calls(org_id);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_time ON tool_calls(created_at);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_tool ON tool_calls(tool_id);
|
|
138
|
+
|
|
139
|
+
-- Activity events (real-time stream)
|
|
140
|
+
CREATE TABLE IF NOT EXISTS activity_events (
|
|
141
|
+
id TEXT PRIMARY KEY,
|
|
142
|
+
agent_id TEXT NOT NULL,
|
|
143
|
+
org_id TEXT NOT NULL,
|
|
144
|
+
session_id TEXT,
|
|
145
|
+
type TEXT NOT NULL,
|
|
146
|
+
data JSON NOT NULL DEFAULT '{}',
|
|
147
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
148
|
+
);
|
|
149
|
+
CREATE INDEX IF NOT EXISTS idx_activity_agent ON activity_events(agent_id);
|
|
150
|
+
CREATE INDEX IF NOT EXISTS idx_activity_org ON activity_events(org_id);
|
|
151
|
+
CREATE INDEX IF NOT EXISTS idx_activity_type ON activity_events(type);
|
|
152
|
+
CREATE INDEX IF NOT EXISTS idx_activity_time ON activity_events(created_at);
|
|
153
|
+
|
|
154
|
+
-- Conversation entries
|
|
155
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
156
|
+
id TEXT PRIMARY KEY,
|
|
157
|
+
agent_id TEXT NOT NULL,
|
|
158
|
+
session_id TEXT NOT NULL,
|
|
159
|
+
role TEXT NOT NULL,
|
|
160
|
+
content TEXT NOT NULL,
|
|
161
|
+
channel TEXT,
|
|
162
|
+
token_count INTEGER NOT NULL DEFAULT 0,
|
|
163
|
+
tool_calls JSON,
|
|
164
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
165
|
+
);
|
|
166
|
+
CREATE INDEX IF NOT EXISTS idx_conversations_agent ON conversations(agent_id);
|
|
167
|
+
CREATE INDEX IF NOT EXISTS idx_conversations_session ON conversations(session_id);
|
|
168
|
+
|
|
169
|
+
-- Approval requests
|
|
170
|
+
CREATE TABLE IF NOT EXISTS approval_requests (
|
|
171
|
+
id TEXT PRIMARY KEY,
|
|
172
|
+
agent_id TEXT NOT NULL,
|
|
173
|
+
agent_name TEXT NOT NULL,
|
|
174
|
+
org_id TEXT NOT NULL,
|
|
175
|
+
tool_id TEXT NOT NULL,
|
|
176
|
+
tool_name TEXT NOT NULL,
|
|
177
|
+
reason TEXT NOT NULL,
|
|
178
|
+
risk_level TEXT NOT NULL,
|
|
179
|
+
side_effects JSON NOT NULL DEFAULT '[]',
|
|
180
|
+
parameters JSON,
|
|
181
|
+
context TEXT,
|
|
182
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
183
|
+
decision JSON,
|
|
184
|
+
expires_at TEXT NOT NULL,
|
|
185
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
186
|
+
);
|
|
187
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_org ON approval_requests(org_id);
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_status ON approval_requests(status);
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_approvals_agent ON approval_requests(agent_id);
|
|
190
|
+
|
|
191
|
+
-- Approval policies
|
|
192
|
+
CREATE TABLE IF NOT EXISTS approval_policies (
|
|
193
|
+
id TEXT PRIMARY KEY,
|
|
194
|
+
org_id TEXT NOT NULL,
|
|
195
|
+
name TEXT NOT NULL,
|
|
196
|
+
description TEXT,
|
|
197
|
+
triggers JSON NOT NULL,
|
|
198
|
+
approvers JSON NOT NULL,
|
|
199
|
+
timeout JSON NOT NULL,
|
|
200
|
+
notify JSON NOT NULL DEFAULT '{}',
|
|
201
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
202
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
203
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
204
|
+
);
|
|
205
|
+
CREATE INDEX IF NOT EXISTS idx_approval_policies_org ON approval_policies(org_id);
|
|
206
|
+
`;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Postgres-compatible version (uses JSONB instead of JSON, SERIAL, etc.)
|
|
210
|
+
*/
|
|
211
|
+
export const ENGINE_TABLES_POSTGRES = ENGINE_TABLES
|
|
212
|
+
.replace(/JSON/g, 'JSONB')
|
|
213
|
+
.replace(/INTEGER NOT NULL DEFAULT 0/g, 'INTEGER NOT NULL DEFAULT 0')
|
|
214
|
+
.replace(/datetime\('now'\)/g, "NOW()")
|
|
215
|
+
.replace(/INTEGER NOT NULL DEFAULT 1/g, 'BOOLEAN NOT NULL DEFAULT TRUE')
|
|
216
|
+
.replace(/is_preset INTEGER NOT NULL DEFAULT 0/g, 'is_preset BOOLEAN NOT NULL DEFAULT FALSE');
|
|
217
|
+
|
|
218
|
+
// ─── Versioned Migration System ────────────────────────
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Migration tracking table — created first, tracks which migrations have run.
|
|
222
|
+
*/
|
|
223
|
+
export const MIGRATIONS_TABLE = `
|
|
224
|
+
CREATE TABLE IF NOT EXISTS engine_migrations (
|
|
225
|
+
version INTEGER PRIMARY KEY,
|
|
226
|
+
name TEXT NOT NULL,
|
|
227
|
+
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
228
|
+
);
|
|
229
|
+
`;
|
|
230
|
+
|
|
231
|
+
export const MIGRATIONS_TABLE_POSTGRES = MIGRATIONS_TABLE
|
|
232
|
+
.replace(/datetime\('now'\)/g, "NOW()");
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Each migration has a version number, name, and per-dialect SQL.
|
|
236
|
+
* The engine runs migrations in order, skipping already-applied ones.
|
|
237
|
+
*
|
|
238
|
+
* For MongoDB/DynamoDB: provide the `nosql` callback instead of SQL.
|
|
239
|
+
*/
|
|
240
|
+
export interface Migration {
|
|
241
|
+
version: number;
|
|
242
|
+
name: string;
|
|
243
|
+
/** SQL statements (SQLite/Turso compatible) */
|
|
244
|
+
sql?: string;
|
|
245
|
+
/** Postgres-specific SQL (if different from sql) */
|
|
246
|
+
postgres?: string;
|
|
247
|
+
/** MySQL-specific SQL (if different from sql) */
|
|
248
|
+
mysql?: string;
|
|
249
|
+
/** NoSQL migration callback (MongoDB, DynamoDB) — receives the raw driver handle */
|
|
250
|
+
nosql?: (db: any, dialect: string) => Promise<void>;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Core migrations — the initial schema is migration 1.
|
|
255
|
+
* Add new migrations here as the schema evolves.
|
|
256
|
+
*/
|
|
257
|
+
export const MIGRATIONS: Migration[] = [
|
|
258
|
+
{
|
|
259
|
+
version: 1,
|
|
260
|
+
name: 'initial_schema',
|
|
261
|
+
sql: ENGINE_TABLES,
|
|
262
|
+
postgres: ENGINE_TABLES_POSTGRES,
|
|
263
|
+
},
|
|
264
|
+
// ── Example future migration ──
|
|
265
|
+
// {
|
|
266
|
+
// version: 2,
|
|
267
|
+
// name: 'add_agent_tags',
|
|
268
|
+
// sql: `
|
|
269
|
+
// CREATE TABLE IF NOT EXISTS agent_tags (
|
|
270
|
+
// agent_id TEXT NOT NULL,
|
|
271
|
+
// tag TEXT NOT NULL,
|
|
272
|
+
// PRIMARY KEY (agent_id, tag),
|
|
273
|
+
// FOREIGN KEY (agent_id) REFERENCES managed_agents(id) ON DELETE CASCADE
|
|
274
|
+
// );
|
|
275
|
+
// CREATE INDEX IF NOT EXISTS idx_agent_tags_tag ON agent_tags(tag);
|
|
276
|
+
// `,
|
|
277
|
+
// nosql: async (db, dialect) => {
|
|
278
|
+
// if (dialect === 'mongodb') {
|
|
279
|
+
// // MongoDB: add tags field to managed_agents collection
|
|
280
|
+
// await db.collection('managed_agents').updateMany(
|
|
281
|
+
// { tags: { $exists: false } },
|
|
282
|
+
// { $set: { tags: [] } }
|
|
283
|
+
// );
|
|
284
|
+
// }
|
|
285
|
+
// },
|
|
286
|
+
// },
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
// ─── Dynamic Table Definitions ─────────────────────────
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Schema for a dynamically-registered table.
|
|
293
|
+
* Plugins, skills, or the engine itself can register new tables at runtime.
|
|
294
|
+
*/
|
|
295
|
+
export interface DynamicTableDef {
|
|
296
|
+
/** Table name (must be unique, will be prefixed with `ext_` to avoid collisions) */
|
|
297
|
+
name: string;
|
|
298
|
+
/** SQL CREATE TABLE statement (SQLite/Turso syntax) */
|
|
299
|
+
sql: string;
|
|
300
|
+
/** Postgres-specific DDL (optional, falls back to sql with auto-conversion) */
|
|
301
|
+
postgres?: string;
|
|
302
|
+
/** MySQL-specific DDL (optional) */
|
|
303
|
+
mysql?: string;
|
|
304
|
+
/** MongoDB collection setup callback */
|
|
305
|
+
mongoSetup?: (db: any) => Promise<void>;
|
|
306
|
+
/** DynamoDB table setup callback */
|
|
307
|
+
dynamoSetup?: (client: any) => Promise<void>;
|
|
308
|
+
/** Indexes to create (SQL only) */
|
|
309
|
+
indexes?: string[];
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Convert SQLite-style DDL to Postgres-compatible DDL (best-effort).
|
|
314
|
+
*/
|
|
315
|
+
export function sqliteToPostgres(sql: string): string {
|
|
316
|
+
return sql
|
|
317
|
+
.replace(/JSON/g, 'JSONB')
|
|
318
|
+
.replace(/datetime\('now'\)/g, "NOW()")
|
|
319
|
+
.replace(/INTEGER NOT NULL DEFAULT 1(?!\d)/g, 'BOOLEAN NOT NULL DEFAULT TRUE')
|
|
320
|
+
.replace(/INTEGER NOT NULL DEFAULT 0(?!\d)/g, 'INTEGER NOT NULL DEFAULT 0');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Convert SQLite-style DDL to MySQL-compatible DDL (best-effort).
|
|
325
|
+
*/
|
|
326
|
+
export function sqliteToMySQL(sql: string): string {
|
|
327
|
+
return sql
|
|
328
|
+
.replace(/TEXT PRIMARY KEY/g, 'VARCHAR(255) PRIMARY KEY')
|
|
329
|
+
.replace(/TEXT NOT NULL UNIQUE/g, 'VARCHAR(255) NOT NULL UNIQUE')
|
|
330
|
+
.replace(/TEXT NOT NULL DEFAULT/g, 'VARCHAR(255) NOT NULL DEFAULT')
|
|
331
|
+
.replace(/BLOB/g, 'LONGBLOB')
|
|
332
|
+
.replace(/datetime\('now'\)/g, "NOW()")
|
|
333
|
+
.replace(/INTEGER NOT NULL DEFAULT 1/g, 'TINYINT(1) NOT NULL DEFAULT 1')
|
|
334
|
+
.replace(/ON CONFLICT\(.*?\) DO UPDATE SET/g, 'ON DUPLICATE KEY UPDATE');
|
|
335
|
+
}
|