@minion-stack/db 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +8 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/relations.d.ts +126 -0
  6. package/dist/relations.d.ts.map +1 -0
  7. package/dist/relations.js +178 -0
  8. package/dist/relations.js.map +1 -0
  9. package/dist/schema/activity-bins.d.ts +118 -0
  10. package/dist/schema/activity-bins.d.ts.map +1 -0
  11. package/dist/schema/activity-bins.js +19 -0
  12. package/dist/schema/activity-bins.js.map +1 -0
  13. package/dist/schema/agent-groups.d.ts +180 -0
  14. package/dist/schema/agent-groups.d.ts.map +1 -0
  15. package/dist/schema/agent-groups.js +22 -0
  16. package/dist/schema/agent-groups.js.map +1 -0
  17. package/dist/schema/agents.d.ts +196 -0
  18. package/dist/schema/agents.d.ts.map +1 -0
  19. package/dist/schema/agents.js +20 -0
  20. package/dist/schema/agents.js.map +1 -0
  21. package/dist/schema/auth/index.d.ts +1713 -0
  22. package/dist/schema/auth/index.d.ts.map +1 -0
  23. package/dist/schema/auth/index.js +152 -0
  24. package/dist/schema/auth/index.js.map +1 -0
  25. package/dist/schema/backup-configs.d.ts +207 -0
  26. package/dist/schema/backup-configs.d.ts.map +1 -0
  27. package/dist/schema/backup-configs.js +18 -0
  28. package/dist/schema/backup-configs.js.map +1 -0
  29. package/dist/schema/bugs.d.ts +232 -0
  30. package/dist/schema/bugs.d.ts.map +1 -0
  31. package/dist/schema/bugs.js +26 -0
  32. package/dist/schema/bugs.js.map +1 -0
  33. package/dist/schema/builder.d.ts +1546 -0
  34. package/dist/schema/builder.d.ts.map +1 -0
  35. package/dist/schema/builder.js +143 -0
  36. package/dist/schema/builder.js.map +1 -0
  37. package/dist/schema/channel-assignments.d.ts +120 -0
  38. package/dist/schema/channel-assignments.d.ts.map +1 -0
  39. package/dist/schema/channel-assignments.js +19 -0
  40. package/dist/schema/channel-assignments.js.map +1 -0
  41. package/dist/schema/channel-identities.d.ts +141 -0
  42. package/dist/schema/channel-identities.d.ts.map +1 -0
  43. package/dist/schema/channel-identities.js +21 -0
  44. package/dist/schema/channel-identities.js.map +1 -0
  45. package/dist/schema/channels.d.ts +213 -0
  46. package/dist/schema/channels.d.ts.map +1 -0
  47. package/dist/schema/channels.js +26 -0
  48. package/dist/schema/channels.js.map +1 -0
  49. package/dist/schema/chat-messages.d.ts +192 -0
  50. package/dist/schema/chat-messages.d.ts.map +1 -0
  51. package/dist/schema/chat-messages.js +23 -0
  52. package/dist/schema/chat-messages.js.map +1 -0
  53. package/dist/schema/config-snapshots.d.ts +120 -0
  54. package/dist/schema/config-snapshots.d.ts.map +1 -0
  55. package/dist/schema/config-snapshots.js +16 -0
  56. package/dist/schema/config-snapshots.js.map +1 -0
  57. package/dist/schema/connection-events.d.ts +173 -0
  58. package/dist/schema/connection-events.d.ts.map +1 -0
  59. package/dist/schema/connection-events.js +22 -0
  60. package/dist/schema/connection-events.js.map +1 -0
  61. package/dist/schema/credential-health.d.ts +116 -0
  62. package/dist/schema/credential-health.d.ts.map +1 -0
  63. package/dist/schema/credential-health.js +19 -0
  64. package/dist/schema/credential-health.js.map +1 -0
  65. package/dist/schema/device-identities.d.ts +120 -0
  66. package/dist/schema/device-identities.d.ts.map +1 -0
  67. package/dist/schema/device-identities.js +14 -0
  68. package/dist/schema/device-identities.js.map +1 -0
  69. package/dist/schema/files.d.ts +175 -0
  70. package/dist/schema/files.d.ts.map +1 -0
  71. package/dist/schema/files.js +16 -0
  72. package/dist/schema/files.js.map +1 -0
  73. package/dist/schema/flows.d.ts +156 -0
  74. package/dist/schema/flows.d.ts.map +1 -0
  75. package/dist/schema/flows.js +12 -0
  76. package/dist/schema/flows.js.map +1 -0
  77. package/dist/schema/gateway-heartbeats.d.ts +186 -0
  78. package/dist/schema/gateway-heartbeats.d.ts.map +1 -0
  79. package/dist/schema/gateway-heartbeats.js +23 -0
  80. package/dist/schema/gateway-heartbeats.js.map +1 -0
  81. package/dist/schema/index.d.ts +37 -0
  82. package/dist/schema/index.d.ts.map +1 -0
  83. package/dist/schema/index.js +38 -0
  84. package/dist/schema/index.js.map +1 -0
  85. package/dist/schema/marketplace-agents.d.ts +397 -0
  86. package/dist/schema/marketplace-agents.d.ts.map +1 -0
  87. package/dist/schema/marketplace-agents.js +25 -0
  88. package/dist/schema/marketplace-agents.js.map +1 -0
  89. package/dist/schema/marketplace-installs.d.ts +101 -0
  90. package/dist/schema/marketplace-installs.d.ts.map +1 -0
  91. package/dist/schema/marketplace-installs.js +21 -0
  92. package/dist/schema/marketplace-installs.js.map +1 -0
  93. package/dist/schema/missions.d.ts +194 -0
  94. package/dist/schema/missions.d.ts.map +1 -0
  95. package/dist/schema/missions.js +29 -0
  96. package/dist/schema/missions.js.map +1 -0
  97. package/dist/schema/personal-agents.d.ts +302 -0
  98. package/dist/schema/personal-agents.d.ts.map +1 -0
  99. package/dist/schema/personal-agents.js +37 -0
  100. package/dist/schema/personal-agents.js.map +1 -0
  101. package/dist/schema/reliability-events.d.ts +211 -0
  102. package/dist/schema/reliability-events.d.ts.map +1 -0
  103. package/dist/schema/reliability-events.js +28 -0
  104. package/dist/schema/reliability-events.js.map +1 -0
  105. package/dist/schema/server-backups.d.ts +154 -0
  106. package/dist/schema/server-backups.d.ts.map +1 -0
  107. package/dist/schema/server-backups.js +23 -0
  108. package/dist/schema/server-backups.js.map +1 -0
  109. package/dist/schema/server-provision-configs.d.ts +410 -0
  110. package/dist/schema/server-provision-configs.d.ts.map +1 -0
  111. package/dist/schema/server-provision-configs.js +43 -0
  112. package/dist/schema/server-provision-configs.js.map +1 -0
  113. package/dist/schema/servers.d.ts +192 -0
  114. package/dist/schema/servers.d.ts.map +1 -0
  115. package/dist/schema/servers.js +22 -0
  116. package/dist/schema/servers.js.map +1 -0
  117. package/dist/schema/session-tasks.d.ts +211 -0
  118. package/dist/schema/session-tasks.d.ts.map +1 -0
  119. package/dist/schema/session-tasks.js +26 -0
  120. package/dist/schema/session-tasks.js.map +1 -0
  121. package/dist/schema/sessions.d.ts +209 -0
  122. package/dist/schema/sessions.d.ts.map +1 -0
  123. package/dist/schema/sessions.js +27 -0
  124. package/dist/schema/sessions.js.map +1 -0
  125. package/dist/schema/settings.d.ts +118 -0
  126. package/dist/schema/settings.d.ts.map +1 -0
  127. package/dist/schema/settings.js +19 -0
  128. package/dist/schema/settings.js.map +1 -0
  129. package/dist/schema/skill-execution-stats.d.ts +209 -0
  130. package/dist/schema/skill-execution-stats.d.ts.map +1 -0
  131. package/dist/schema/skill-execution-stats.js +24 -0
  132. package/dist/schema/skill-execution-stats.js.map +1 -0
  133. package/dist/schema/skills.d.ts +209 -0
  134. package/dist/schema/skills.d.ts.map +1 -0
  135. package/dist/schema/skills.js +24 -0
  136. package/dist/schema/skills.js.map +1 -0
  137. package/dist/schema/tasks.d.ts +192 -0
  138. package/dist/schema/tasks.d.ts.map +1 -0
  139. package/dist/schema/tasks.js +22 -0
  140. package/dist/schema/tasks.js.map +1 -0
  141. package/dist/schema/unified-events.d.ts +247 -0
  142. package/dist/schema/unified-events.d.ts.map +1 -0
  143. package/dist/schema/unified-events.js +29 -0
  144. package/dist/schema/unified-events.js.map +1 -0
  145. package/dist/schema/user-agents.d.ts +82 -0
  146. package/dist/schema/user-agents.d.ts.map +1 -0
  147. package/dist/schema/user-agents.js +17 -0
  148. package/dist/schema/user-agents.js.map +1 -0
  149. package/dist/schema/user-preferences.d.ts +99 -0
  150. package/dist/schema/user-preferences.d.ts.map +1 -0
  151. package/dist/schema/user-preferences.js +15 -0
  152. package/dist/schema/user-preferences.js.map +1 -0
  153. package/dist/schema/user-servers.d.ts +63 -0
  154. package/dist/schema/user-servers.d.ts.map +1 -0
  155. package/dist/schema/user-servers.js +16 -0
  156. package/dist/schema/user-servers.js.map +1 -0
  157. package/dist/schema/workshop-saves.d.ts +156 -0
  158. package/dist/schema/workshop-saves.d.ts.map +1 -0
  159. package/dist/schema/workshop-saves.js +12 -0
  160. package/dist/schema/workshop-saves.js.map +1 -0
  161. package/dist/utils.d.ts +3 -0
  162. package/dist/utils.d.ts.map +1 -0
  163. package/dist/utils.js +9 -0
  164. package/dist/utils.js.map +1 -0
  165. package/package.json +58 -0
  166. package/src/index.ts +7 -0
  167. package/src/relations.ts +258 -0
  168. package/src/schema/activity-bins.ts +23 -0
  169. package/src/schema/agent-groups.ts +31 -0
  170. package/src/schema/agents.ts +24 -0
  171. package/src/schema/auth/index.ts +190 -0
  172. package/src/schema/backup-configs.ts +22 -0
  173. package/src/schema/bugs.ts +30 -0
  174. package/src/schema/builder.ts +151 -0
  175. package/src/schema/channel-assignments.ts +23 -0
  176. package/src/schema/channel-identities.ts +25 -0
  177. package/src/schema/channels.ts +30 -0
  178. package/src/schema/chat-messages.ts +27 -0
  179. package/src/schema/config-snapshots.ts +20 -0
  180. package/src/schema/connection-events.ts +26 -0
  181. package/src/schema/credential-health.ts +23 -0
  182. package/src/schema/device-identities.ts +14 -0
  183. package/src/schema/files.ts +20 -0
  184. package/src/schema/flows.ts +12 -0
  185. package/src/schema/gateway-heartbeats.ts +27 -0
  186. package/src/schema/index.ts +59 -0
  187. package/src/schema/marketplace-agents.ts +25 -0
  188. package/src/schema/marketplace-installs.ts +25 -0
  189. package/src/schema/missions.ts +33 -0
  190. package/src/schema/personal-agents.ts +41 -0
  191. package/src/schema/reliability-events.ts +32 -0
  192. package/src/schema/server-backups.ts +27 -0
  193. package/src/schema/server-provision-configs.ts +57 -0
  194. package/src/schema/servers.ts +26 -0
  195. package/src/schema/session-tasks.ts +30 -0
  196. package/src/schema/sessions.ts +31 -0
  197. package/src/schema/settings.ts +23 -0
  198. package/src/schema/skill-execution-stats.ts +28 -0
  199. package/src/schema/skills.ts +28 -0
  200. package/src/schema/tasks.ts +26 -0
  201. package/src/schema/unified-events.ts +33 -0
  202. package/src/schema/user-agents.ts +21 -0
  203. package/src/schema/user-preferences.ts +19 -0
  204. package/src/schema/user-servers.ts +20 -0
  205. package/src/schema/workshop-saves.ts +12 -0
  206. package/src/utils.ts +11 -0
@@ -0,0 +1,59 @@
1
+ // Better Auth tables (replaces tenants, users, userTenants, authSessions)
2
+ export {
3
+ user,
4
+ session,
5
+ account,
6
+ verification,
7
+ jwks,
8
+ organization,
9
+ member,
10
+ invitation,
11
+ oauthApplication,
12
+ oauthAccessToken,
13
+ oauthConsent,
14
+ } from './auth/index.js';
15
+ export { servers } from './servers.js';
16
+ export { agents } from './agents.js';
17
+ export { skills } from './skills.js';
18
+ export { sessions } from './sessions.js';
19
+ export { chatMessages } from './chat-messages.js';
20
+ export { bugs } from './bugs.js';
21
+ export { connectionEvents } from './connection-events.js';
22
+ export { settings } from './settings.js';
23
+ export { files } from './files.js';
24
+ export { missions } from './missions.js';
25
+ export { tasks } from './tasks.js';
26
+ export { credentialHealthSnapshots } from './credential-health.js';
27
+ export { skillExecutionStats } from './skill-execution-stats.js';
28
+ export { gatewayHeartbeats } from './gateway-heartbeats.js';
29
+ export { activityBins } from './activity-bins.js';
30
+ export { configSnapshots } from './config-snapshots.js';
31
+ export { sessionTasks } from './session-tasks.js';
32
+ export { marketplaceAgents } from './marketplace-agents.js';
33
+ export { marketplaceInstalls } from './marketplace-installs.js';
34
+ export { workshopSaves } from './workshop-saves.js';
35
+ export { deviceIdentities } from './device-identities.js';
36
+ export { flows } from './flows.js';
37
+ export { userServers } from './user-servers.js';
38
+ export { userAgents } from './user-agents.js';
39
+ export { channels } from './channels.js';
40
+ export { channelAssignments } from './channel-assignments.js';
41
+ export { serverProvisionConfigs } from './server-provision-configs.js';
42
+ export { backupConfigs } from './backup-configs.js';
43
+ export { serverBackups } from './server-backups.js';
44
+ export { agentGroups, agentGroupMembers } from './agent-groups.js';
45
+ export { unifiedEvents } from './unified-events.js';
46
+ export { channelIdentities } from './channel-identities.js';
47
+ export { personalAgents } from './personal-agents.js';
48
+ export {
49
+ builtSkills,
50
+ builtSkillTools,
51
+ builtChapters,
52
+ builtChapterEdges,
53
+ builtChapterTools,
54
+ builtAgents,
55
+ builtAgentSkills,
56
+ builtTools,
57
+ agentBuiltSkills,
58
+ } from './builder.js';
59
+ export { userPreferences } from './user-preferences.js';
@@ -0,0 +1,25 @@
1
+ import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
2
+
3
+ export const marketplaceAgents = sqliteTable('marketplace_agents', {
4
+ id: text('id').primaryKey(), // slug e.g. "luna-chen"
5
+ name: text('name').notNull(),
6
+ role: text('role').notNull(),
7
+ category: text('category').notNull(), // engineering | product | data | creative | security
8
+ tags: text('tags').notNull(), // JSON array string
9
+ description: text('description').notNull(),
10
+ catchphrase: text('catchphrase'),
11
+ version: text('version').notNull(),
12
+ model: text('model'),
13
+ avatarSeed: text('avatar_seed').notNull(),
14
+ githubPath: text('github_path').notNull(),
15
+ soulMd: text('soul_md'),
16
+ identityMd: text('identity_md'),
17
+ userMd: text('user_md'),
18
+ contextMd: text('context_md'),
19
+ skillsMd: text('skills_md'),
20
+ installCount: integer('install_count').default(0),
21
+ syncedAt: integer('synced_at').notNull(),
22
+ filesLoadedAt: integer('files_loaded_at'),
23
+ createdAt: integer('created_at').notNull(),
24
+ updatedAt: integer('updated_at').notNull(),
25
+ });
@@ -0,0 +1,25 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+ import { marketplaceAgents } from './marketplace-agents.js';
5
+
6
+ export const marketplaceInstalls = sqliteTable(
7
+ 'marketplace_installs',
8
+ {
9
+ id: text('id').primaryKey(),
10
+ tenantId: text('tenant_id')
11
+ .notNull()
12
+ .references(() => organization.id, { onDelete: 'cascade' }),
13
+ agentId: text('agent_id')
14
+ .notNull()
15
+ .references(() => marketplaceAgents.id, { onDelete: 'cascade' }),
16
+ serverId: text('server_id')
17
+ .notNull()
18
+ .references(() => servers.id, { onDelete: 'cascade' }),
19
+ installedAt: integer('installed_at').notNull(),
20
+ },
21
+ (t) => [
22
+ index('idx_marketplace_installs_tenant').on(t.tenantId),
23
+ index('idx_marketplace_installs_agent').on(t.agentId),
24
+ ],
25
+ );
@@ -0,0 +1,33 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+ import { sessions } from './sessions.js';
5
+
6
+ export const missions = sqliteTable(
7
+ 'missions',
8
+ {
9
+ id: text('id').primaryKey(),
10
+ tenantId: text('tenant_id')
11
+ .notNull()
12
+ .references(() => organization.id, { onDelete: 'cascade' }),
13
+ serverId: text('server_id')
14
+ .notNull()
15
+ .references(() => servers.id, { onDelete: 'cascade' }),
16
+ sessionId: text('session_id')
17
+ .notNull()
18
+ .references(() => sessions.id, { onDelete: 'cascade' }),
19
+ title: text('title').notNull(),
20
+ description: text('description'),
21
+ status: text('status', { enum: ['active', 'completed', 'cancelled'] })
22
+ .notNull()
23
+ .default('active'),
24
+ metadata: text('metadata'),
25
+ createdAt: integer('created_at').notNull(),
26
+ updatedAt: integer('updated_at').notNull(),
27
+ },
28
+ (t) => [
29
+ index('idx_missions_tenant').on(t.tenantId),
30
+ index('idx_missions_session').on(t.sessionId),
31
+ index('idx_missions_server').on(t.serverId),
32
+ ],
33
+ );
@@ -0,0 +1,41 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { user } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const personalAgents = sqliteTable(
6
+ 'personal_agents',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ userId: text('user_id')
10
+ .notNull()
11
+ .unique()
12
+ .references(() => user.id, { onDelete: 'cascade' }),
13
+ agentId: text('agent_id').notNull(),
14
+ serverId: text('server_id').references(() => servers.id, { onDelete: 'set null' }),
15
+ displayName: text('display_name').notNull(),
16
+ conversationName: text('conversation_name'),
17
+ avatarUrl: text('avatar_url'),
18
+ personalityPreset: text('personality_preset', {
19
+ enum: ['professional', 'casual', 'creative', 'technical'],
20
+ }),
21
+ personalityText: text('personality_text'),
22
+ personalityConfigured: integer('personality_configured', { mode: 'boolean' })
23
+ .notNull()
24
+ .default(false),
25
+ provisioningStatus: text('provisioning_status', {
26
+ enum: ['pending', 'provisioning', 'active', 'error'],
27
+ })
28
+ .notNull()
29
+ .default('pending'),
30
+ provisioningError: text('provisioning_error'),
31
+ lastRetryAt: integer('last_retry_at'),
32
+ retryCount: integer('retry_count').notNull().default(0),
33
+ createdAt: integer('created_at').notNull(),
34
+ updatedAt: integer('updated_at').notNull(),
35
+ },
36
+ (t) => [
37
+ index('idx_personal_agents_user').on(t.userId),
38
+ index('idx_personal_agents_agent').on(t.agentId),
39
+ index('idx_personal_agents_status').on(t.provisioningStatus),
40
+ ],
41
+ );
@@ -0,0 +1,32 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const reliabilityEvents = sqliteTable(
6
+ 'reliability_events',
7
+ {
8
+ id: integer('id').primaryKey({ autoIncrement: true }),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ agentId: text('agent_id'),
16
+ category: text('category', {
17
+ enum: ['cron', 'browser', 'timezone', 'general', 'auth', 'skill', 'agent', 'gateway'],
18
+ }).notNull(),
19
+ severity: text('severity', { enum: ['critical', 'high', 'medium', 'low', 'ok'] }).notNull(),
20
+ event: text('event').notNull(),
21
+ message: text('message').notNull(),
22
+ metadata: text('metadata'),
23
+ occurredAt: integer('occurred_at').notNull(),
24
+ createdAt: integer('created_at').notNull(),
25
+ },
26
+ (t) => [
27
+ index('idx_rel_events_server_cat_time').on(t.serverId, t.category, t.occurredAt),
28
+ index('idx_rel_events_server_time').on(t.serverId, t.occurredAt),
29
+ index('idx_rel_events_server_sev_time').on(t.serverId, t.severity, t.occurredAt),
30
+ index('idx_rel_events_tenant').on(t.tenantId),
31
+ ],
32
+ );
@@ -0,0 +1,27 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const serverBackups = sqliteTable(
6
+ 'server_backups',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ serverId: text('server_id')
10
+ .notNull()
11
+ .references(() => servers.id, { onDelete: 'cascade' }),
12
+ tenantId: text('tenant_id')
13
+ .notNull()
14
+ .references(() => organization.id, { onDelete: 'cascade' }),
15
+ snapshotPath: text('snapshot_path').notNull(),
16
+ timestamp: integer('timestamp').notNull(),
17
+ sizeBytes: integer('size_bytes'),
18
+ status: text('status', { enum: ['running', 'complete', 'failed'] })
19
+ .notNull()
20
+ .default('running'),
21
+ createdAt: integer('created_at').notNull(),
22
+ },
23
+ (t) => [
24
+ index('idx_server_backups_server').on(t.serverId),
25
+ index('idx_server_backups_tenant').on(t.tenantId),
26
+ ],
27
+ );
@@ -0,0 +1,57 @@
1
+ import { sqliteTable, text, integer, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const serverProvisionConfigs = sqliteTable(
6
+ 'server_provision_configs',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ serverId: text('server_id')
10
+ .notNull()
11
+ .references(() => servers.id, { onDelete: 'cascade' }),
12
+ tenantId: text('tenant_id')
13
+ .notNull()
14
+ .references(() => organization.id, { onDelete: 'cascade' }),
15
+
16
+ // SSH connection
17
+ sshHost: text('ssh_host'),
18
+ sshUser: text('ssh_user').default('root'),
19
+ sshPort: integer('ssh_port').default(22),
20
+
21
+ // Credentials (encrypted)
22
+ apiKey: text('api_key'),
23
+ apiKeyIv: text('api_key_iv'),
24
+
25
+ // Agent config
26
+ agentName: text('agent_name'),
27
+ sandboxMode: text('sandbox_mode', { enum: ['non-main', 'always', 'never'] }).default(
28
+ 'non-main',
29
+ ),
30
+ dmPolicy: text('dm_policy', { enum: ['pairing', 'solo', 'disabled'] }).default('pairing'),
31
+
32
+ // Install config
33
+ installMethod: text('install_method', { enum: ['package', 'source'] }).default('package'),
34
+ pkgManager: text('pkg_manager', { enum: ['npm', 'bun'] }).default('npm'),
35
+
36
+ // Gateway config
37
+ gatewayPort: integer('gateway_port').default(18789),
38
+ gatewayBind: text('gateway_bind', { enum: ['loopback', 'all'] }).default('loopback'),
39
+
40
+ // Channel toggles
41
+ enableWhatsapp: integer('enable_whatsapp').default(0),
42
+ enableTelegram: integer('enable_telegram').default(0),
43
+ enableDiscord: integer('enable_discord').default(0),
44
+
45
+ // Provision state
46
+ phaseStatuses: text('phase_statuses').default('{}'),
47
+ lastProvisionAt: integer('last_provision_at'),
48
+
49
+ // Timestamps
50
+ createdAt: integer('created_at').notNull(),
51
+ updatedAt: integer('updated_at').notNull(),
52
+ },
53
+ (t) => [
54
+ uniqueIndex('provision_configs_uniq_server').on(t.serverId),
55
+ index('idx_provision_configs_tenant').on(t.tenantId),
56
+ ],
57
+ );
@@ -0,0 +1,26 @@
1
+ import { sqliteTable, text, integer, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+
4
+ export const servers = sqliteTable(
5
+ 'servers',
6
+ {
7
+ id: text('id').primaryKey(),
8
+ tenantId: text('tenant_id')
9
+ .notNull()
10
+ .references(() => organization.id, { onDelete: 'cascade' }),
11
+ name: text('name').notNull(),
12
+ url: text('url').notNull(),
13
+ token: text('token').notNull().default(''),
14
+ tokenIv: text('token_iv').notNull().default(''),
15
+ authMode: text('auth_mode', { enum: ['token', 'none'] })
16
+ .notNull()
17
+ .default('token'),
18
+ lastConnectedAt: integer('last_connected_at'),
19
+ createdAt: integer('created_at').notNull(),
20
+ updatedAt: integer('updated_at').notNull(),
21
+ },
22
+ (t) => [
23
+ index('idx_servers_tenant').on(t.tenantId),
24
+ uniqueIndex('servers_uniq_url').on(t.tenantId, t.url),
25
+ ],
26
+ );
@@ -0,0 +1,30 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const sessionTasks = sqliteTable(
6
+ 'session_tasks',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ sessionKey: text('session_key').notNull(),
16
+ title: text('title').notNull(),
17
+ description: text('description'),
18
+ status: text('status', { enum: ['backlog', 'todo', 'in_progress', 'done'] })
19
+ .notNull()
20
+ .default('backlog'),
21
+ sortOrder: integer('sort_order').notNull().default(0),
22
+ metadata: text('metadata'),
23
+ createdAt: integer('created_at').notNull(),
24
+ updatedAt: integer('updated_at').notNull(),
25
+ },
26
+ (t) => [
27
+ index('idx_session_tasks_tenant').on(t.tenantId),
28
+ index('idx_session_tasks_server_session').on(t.serverId, t.sessionKey),
29
+ ],
30
+ );
@@ -0,0 +1,31 @@
1
+ import { sqliteTable, text, integer, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const sessions = sqliteTable(
6
+ 'sessions',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ agentId: text('agent_id').notNull(),
16
+ sessionKey: text('session_key').notNull(),
17
+ status: text('status', { enum: ['running', 'thinking', 'idle', 'aborted', 'completed'] })
18
+ .notNull()
19
+ .default('idle'),
20
+ metadata: text('metadata'),
21
+ startedAt: integer('started_at'),
22
+ endedAt: integer('ended_at'),
23
+ createdAt: integer('created_at').notNull(),
24
+ updatedAt: integer('updated_at').notNull(),
25
+ },
26
+ (t) => [
27
+ index('idx_sessions_tenant').on(t.tenantId),
28
+ index('idx_sessions_server').on(t.serverId),
29
+ uniqueIndex('sessions_uniq_key').on(t.tenantId, t.serverId, t.sessionKey),
30
+ ],
31
+ );
@@ -0,0 +1,23 @@
1
+ import { sqliteTable, text, integer, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const settings = sqliteTable(
6
+ 'settings',
7
+ {
8
+ id: integer('id').primaryKey({ autoIncrement: true }),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ section: text('section').notNull(),
16
+ value: text('value').notNull(),
17
+ updatedAt: integer('updated_at').notNull(),
18
+ },
19
+ (t) => [
20
+ uniqueIndex('uq_settings_server_section').on(t.serverId, t.section),
21
+ index('idx_settings_tenant').on(t.tenantId),
22
+ ],
23
+ );
@@ -0,0 +1,28 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const skillExecutionStats = sqliteTable(
6
+ 'skill_execution_stats',
7
+ {
8
+ id: integer('id').primaryKey({ autoIncrement: true }),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ agentId: text('agent_id'),
16
+ skillName: text('skill_name').notNull(),
17
+ sessionKey: text('session_key'),
18
+ status: text('status', { enum: ['ok', 'auth_error', 'timeout', 'error'] }).notNull(),
19
+ durationMs: integer('duration_ms'),
20
+ errorMessage: text('error_message'),
21
+ occurredAt: integer('occurred_at').notNull(),
22
+ createdAt: integer('created_at').notNull(),
23
+ },
24
+ (t) => [
25
+ index('idx_skill_stats_server_skill_time').on(t.serverId, t.skillName, t.occurredAt),
26
+ index('idx_skill_stats_tenant').on(t.tenantId),
27
+ ],
28
+ );
@@ -0,0 +1,28 @@
1
+ import { sqliteTable, text, integer, index, primaryKey } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const skills = sqliteTable(
6
+ 'skills',
7
+ {
8
+ skillKey: text('skill_key').notNull(),
9
+ serverId: text('server_id')
10
+ .notNull()
11
+ .references(() => servers.id, { onDelete: 'cascade' }),
12
+ tenantId: text('tenant_id')
13
+ .notNull()
14
+ .references(() => organization.id, { onDelete: 'cascade' }),
15
+ name: text('name').notNull(),
16
+ description: text('description'),
17
+ emoji: text('emoji'),
18
+ bundled: integer('bundled', { mode: 'boolean' }).notNull().default(false),
19
+ disabled: integer('disabled', { mode: 'boolean' }).notNull().default(false),
20
+ eligible: integer('eligible', { mode: 'boolean' }).notNull().default(false),
21
+ rawJson: text('raw_json').notNull(),
22
+ lastSeenAt: integer('last_seen_at').notNull(),
23
+ },
24
+ (t) => [
25
+ primaryKey({ columns: [t.skillKey, t.serverId] }),
26
+ index('idx_skills_tenant').on(t.tenantId),
27
+ ],
28
+ );
@@ -0,0 +1,26 @@
1
+ import { sqliteTable, text, integer, index } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { missions } from './missions.js';
4
+
5
+ export const tasks = sqliteTable(
6
+ 'tasks',
7
+ {
8
+ id: text('id').primaryKey(),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ missionId: text('mission_id')
13
+ .notNull()
14
+ .references(() => missions.id, { onDelete: 'cascade' }),
15
+ title: text('title').notNull(),
16
+ description: text('description'),
17
+ status: text('status', { enum: ['backlog', 'todo', 'in_progress', 'done'] })
18
+ .notNull()
19
+ .default('backlog'),
20
+ sortOrder: integer('sort_order').notNull().default(0),
21
+ metadata: text('metadata'),
22
+ createdAt: integer('created_at').notNull(),
23
+ updatedAt: integer('updated_at').notNull(),
24
+ },
25
+ (t) => [index('idx_tasks_tenant').on(t.tenantId), index('idx_tasks_mission').on(t.missionId)],
26
+ );
@@ -0,0 +1,33 @@
1
+ import { sqliteTable, text, integer, index, uniqueIndex } from 'drizzle-orm/sqlite-core';
2
+ import { organization } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const unifiedEvents = sqliteTable(
6
+ 'unified_events',
7
+ {
8
+ id: integer('id').primaryKey({ autoIncrement: true }),
9
+ tenantId: text('tenant_id')
10
+ .notNull()
11
+ .references(() => organization.id, { onDelete: 'cascade' }),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ localEventId: integer('local_event_id').notNull(),
16
+ category: text('category').notNull(),
17
+ severity: text('severity', { enum: ['critical', 'high', 'medium', 'low', 'info'] }).notNull(),
18
+ event: text('event').notNull(),
19
+ message: text('message').notNull(),
20
+ agentId: text('agent_id'),
21
+ correlationId: text('correlation_id'),
22
+ metadata: text('metadata'),
23
+ occurredAt: integer('occurred_at').notNull(),
24
+ createdAt: integer('created_at').notNull(),
25
+ },
26
+ (t) => [
27
+ index('idx_unified_events_tenant').on(t.tenantId),
28
+ index('idx_unified_events_server_cat_time').on(t.serverId, t.category, t.occurredAt),
29
+ index('idx_unified_events_server_time').on(t.serverId, t.occurredAt),
30
+ index('idx_unified_events_correlation').on(t.correlationId),
31
+ uniqueIndex('idx_unified_events_dedup').on(t.tenantId, t.serverId, t.localEventId),
32
+ ],
33
+ );
@@ -0,0 +1,21 @@
1
+ import { sqliteTable, text, integer, primaryKey, index } from 'drizzle-orm/sqlite-core';
2
+ import { user } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const userAgents = sqliteTable(
6
+ 'user_agents',
7
+ {
8
+ userId: text('user_id')
9
+ .notNull()
10
+ .references(() => user.id, { onDelete: 'cascade' }),
11
+ agentId: text('agent_id').notNull(),
12
+ serverId: text('server_id')
13
+ .notNull()
14
+ .references(() => servers.id, { onDelete: 'cascade' }),
15
+ createdAt: integer('created_at').notNull(),
16
+ },
17
+ (t) => [
18
+ primaryKey({ columns: [t.userId, t.agentId, t.serverId] }),
19
+ index('idx_user_agents_server').on(t.serverId),
20
+ ],
21
+ );
@@ -0,0 +1,19 @@
1
+ import { sqliteTable, text, integer, uniqueIndex, index } from 'drizzle-orm/sqlite-core';
2
+ import { user } from './auth/index.js';
3
+
4
+ export const userPreferences = sqliteTable(
5
+ 'user_preferences',
6
+ {
7
+ id: integer('id').primaryKey({ autoIncrement: true }),
8
+ userId: text('user_id')
9
+ .notNull()
10
+ .references(() => user.id, { onDelete: 'cascade' }),
11
+ section: text('section').notNull(),
12
+ value: text('value').notNull(),
13
+ updatedAt: integer('updated_at').notNull(),
14
+ },
15
+ (t) => [
16
+ uniqueIndex('uq_user_prefs_user_section').on(t.userId, t.section),
17
+ index('idx_user_prefs_user').on(t.userId),
18
+ ],
19
+ );
@@ -0,0 +1,20 @@
1
+ import { sqliteTable, text, integer, primaryKey, index } from 'drizzle-orm/sqlite-core';
2
+ import { user } from './auth/index.js';
3
+ import { servers } from './servers.js';
4
+
5
+ export const userServers = sqliteTable(
6
+ 'user_servers',
7
+ {
8
+ userId: text('user_id')
9
+ .notNull()
10
+ .references(() => user.id, { onDelete: 'cascade' }),
11
+ serverId: text('server_id')
12
+ .notNull()
13
+ .references(() => servers.id, { onDelete: 'cascade' }),
14
+ createdAt: integer('created_at').notNull(),
15
+ },
16
+ (t) => [
17
+ primaryKey({ columns: [t.userId, t.serverId] }),
18
+ index('idx_user_servers_server').on(t.serverId),
19
+ ],
20
+ );
@@ -0,0 +1,12 @@
1
+ import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
2
+
3
+ export const workshopSaves = sqliteTable('workshop_saves', {
4
+ id: text('id').primaryKey(),
5
+ name: text('name').notNull(),
6
+ state: text('state').notNull(), // JSON string of WorkshopState
7
+ thumbnail: text('thumbnail'), // base64 PNG data-URI, nullable
8
+ userId: text('user_id'), // owner — null for pre-migration rows (treated as shared)
9
+ tenantId: text('tenant_id'), // tenant scope — null for pre-migration rows
10
+ createdAt: integer('created_at').notNull(),
11
+ updatedAt: integer('updated_at').notNull(),
12
+ });
package/src/utils.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { init } from '@paralleldrive/cuid2';
2
+
3
+ const createId = init({ length: 24 });
4
+
5
+ export function newId(): string {
6
+ return createId();
7
+ }
8
+
9
+ export function nowMs(): number {
10
+ return Date.now();
11
+ }