@vibecompany/247-cli 0.1.0 → 0.2.3

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 (74) hide show
  1. package/agent/dist/config.d.ts +29 -0
  2. package/agent/dist/config.d.ts.map +1 -0
  3. package/agent/dist/config.js +56 -0
  4. package/agent/dist/config.js.map +1 -0
  5. package/agent/dist/db/environments.d.ts +65 -0
  6. package/agent/dist/db/environments.d.ts.map +1 -0
  7. package/agent/dist/db/environments.js +243 -0
  8. package/agent/dist/db/environments.js.map +1 -0
  9. package/agent/dist/db/history.d.ts +37 -0
  10. package/agent/dist/db/history.d.ts.map +1 -0
  11. package/agent/dist/db/history.js +98 -0
  12. package/agent/dist/db/history.js.map +1 -0
  13. package/agent/dist/db/index.d.ts +37 -0
  14. package/agent/dist/db/index.d.ts.map +1 -0
  15. package/agent/dist/db/index.js +225 -0
  16. package/agent/dist/db/index.js.map +1 -0
  17. package/agent/dist/db/schema.d.ts +70 -0
  18. package/agent/dist/db/schema.d.ts.map +1 -0
  19. package/agent/dist/db/schema.js +79 -0
  20. package/agent/dist/db/schema.js.map +1 -0
  21. package/agent/dist/db/sessions.d.ts +75 -0
  22. package/agent/dist/db/sessions.d.ts.map +1 -0
  23. package/agent/dist/db/sessions.js +244 -0
  24. package/agent/dist/db/sessions.js.map +1 -0
  25. package/agent/dist/editor.d.ts +18 -0
  26. package/agent/dist/editor.d.ts.map +1 -0
  27. package/agent/dist/editor.js +220 -0
  28. package/agent/dist/editor.js.map +1 -0
  29. package/agent/dist/environments.d.ts +59 -0
  30. package/agent/dist/environments.d.ts.map +1 -0
  31. package/agent/dist/environments.js +229 -0
  32. package/agent/dist/environments.js.map +1 -0
  33. package/agent/dist/git.d.ts +39 -0
  34. package/agent/dist/git.d.ts.map +1 -0
  35. package/agent/dist/git.js +436 -0
  36. package/agent/dist/git.js.map +1 -0
  37. package/agent/dist/index.d.ts +2 -0
  38. package/agent/dist/index.d.ts.map +1 -0
  39. package/agent/dist/index.js +17 -0
  40. package/agent/dist/index.js.map +1 -0
  41. package/agent/dist/server.d.ts +2 -0
  42. package/agent/dist/server.d.ts.map +1 -0
  43. package/agent/dist/server.js +1062 -0
  44. package/agent/dist/server.js.map +1 -0
  45. package/agent/dist/terminal.d.ts +14 -0
  46. package/agent/dist/terminal.d.ts.map +1 -0
  47. package/agent/dist/terminal.js +115 -0
  48. package/agent/dist/terminal.js.map +1 -0
  49. package/dist/commands/init.d.ts.map +1 -1
  50. package/dist/commands/init.js +25 -14
  51. package/dist/commands/init.js.map +1 -1
  52. package/dist/commands/profile.d.ts +3 -0
  53. package/dist/commands/profile.d.ts.map +1 -0
  54. package/dist/commands/profile.js +156 -0
  55. package/dist/commands/profile.js.map +1 -0
  56. package/dist/commands/start.d.ts.map +1 -1
  57. package/dist/commands/start.js +21 -10
  58. package/dist/commands/start.js.map +1 -1
  59. package/dist/index.d.ts +3 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +6 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/config.d.ts +30 -5
  64. package/dist/lib/config.d.ts.map +1 -1
  65. package/dist/lib/config.js +85 -12
  66. package/dist/lib/config.js.map +1 -1
  67. package/dist/lib/process.d.ts +2 -1
  68. package/dist/lib/process.d.ts.map +1 -1
  69. package/dist/lib/process.js +7 -3
  70. package/dist/lib/process.js.map +1 -1
  71. package/hooks/.claude-plugin/plugin.json +5 -0
  72. package/hooks/hooks/hooks.json +61 -0
  73. package/hooks/scripts/notify-status.sh +89 -0
  74. package/package.json +22 -5
@@ -0,0 +1,225 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync, readFileSync } from 'fs';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { CREATE_TABLES_SQL, SCHEMA_VERSION, RETENTION_CONFIG } from './schema.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ // Database file location: apps/agent/data/agent.db
9
+ const DATA_DIR = join(__dirname, '..', '..', 'data');
10
+ const DB_PATH = join(DATA_DIR, 'agent.db');
11
+ // Singleton database instance
12
+ let db = null;
13
+ /**
14
+ * Get or create the database instance
15
+ */
16
+ export function getDatabase() {
17
+ if (!db) {
18
+ throw new Error('Database not initialized. Call initDatabase() first.');
19
+ }
20
+ return db;
21
+ }
22
+ /**
23
+ * Initialize the database
24
+ * - Creates data directory if missing
25
+ * - Opens/creates database file
26
+ * - Runs migrations
27
+ * - Sets WAL mode for better performance
28
+ */
29
+ export function initDatabase(dbPath) {
30
+ const path = dbPath ?? DB_PATH;
31
+ // Create data directory if it doesn't exist
32
+ const dataDir = dirname(path);
33
+ if (!existsSync(dataDir)) {
34
+ console.log(`[DB] Creating data directory: ${dataDir}`);
35
+ mkdirSync(dataDir, { recursive: true });
36
+ }
37
+ // Open database (creates if doesn't exist)
38
+ console.log(`[DB] Opening database: ${path}`);
39
+ db = new Database(path);
40
+ // Enable WAL mode for better concurrent performance
41
+ db.pragma('journal_mode = WAL');
42
+ // Run migrations
43
+ runMigrations(db);
44
+ return db;
45
+ }
46
+ /**
47
+ * Create an in-memory database for testing
48
+ */
49
+ export function initTestDatabase() {
50
+ db = new Database(':memory:');
51
+ runMigrations(db);
52
+ return db;
53
+ }
54
+ /**
55
+ * Close the database connection
56
+ */
57
+ export function closeDatabase() {
58
+ if (db) {
59
+ console.log('[DB] Closing database connection');
60
+ db.close();
61
+ db = null;
62
+ }
63
+ }
64
+ /**
65
+ * Run database migrations
66
+ */
67
+ function runMigrations(database) {
68
+ const currentVersion = getCurrentSchemaVersion(database);
69
+ if (currentVersion < SCHEMA_VERSION) {
70
+ console.log(`[DB] Running migrations from v${currentVersion} to v${SCHEMA_VERSION}`);
71
+ // Run all schema creation (idempotent with IF NOT EXISTS)
72
+ database.exec(CREATE_TABLES_SQL);
73
+ // Run incremental migrations for existing tables
74
+ if (currentVersion < 2) {
75
+ migrateToV2(database);
76
+ }
77
+ if (currentVersion < 3) {
78
+ migrateToV3(database);
79
+ }
80
+ // Record the new version
81
+ database
82
+ .prepare(`
83
+ INSERT OR REPLACE INTO schema_version (version, applied_at)
84
+ VALUES (?, ?)
85
+ `)
86
+ .run(SCHEMA_VERSION, Date.now());
87
+ console.log(`[DB] Migrations complete. Now at v${SCHEMA_VERSION}`);
88
+ }
89
+ else {
90
+ console.log(`[DB] Database schema is up to date (v${currentVersion})`);
91
+ }
92
+ // Always ensure required columns exist (handles incomplete migrations)
93
+ ensureRequiredColumns(database);
94
+ }
95
+ /**
96
+ * Ensure all required columns exist (handles incomplete migrations)
97
+ */
98
+ function ensureRequiredColumns(database) {
99
+ // Check environments.icon column
100
+ const envColumns = database.pragma('table_info(environments)');
101
+ if (!envColumns.some((c) => c.name === 'icon')) {
102
+ console.log('[DB] Adding missing icon column to environments');
103
+ database.exec('ALTER TABLE environments ADD COLUMN icon TEXT');
104
+ }
105
+ // Check sessions.archived_at column
106
+ const sessionColumns = database.pragma('table_info(sessions)');
107
+ if (!sessionColumns.some((c) => c.name === 'archived_at')) {
108
+ console.log('[DB] Adding missing archived_at column to sessions');
109
+ database.exec('ALTER TABLE sessions ADD COLUMN archived_at INTEGER');
110
+ }
111
+ }
112
+ /**
113
+ * Migration to v2: Add icon column to environments table
114
+ */
115
+ function migrateToV2(database) {
116
+ // Check if icon column already exists
117
+ const columns = database.pragma('table_info(environments)');
118
+ const hasIcon = columns.some((c) => c.name === 'icon');
119
+ if (!hasIcon) {
120
+ console.log('[DB] v2 migration: Adding icon column to environments');
121
+ database.exec('ALTER TABLE environments ADD COLUMN icon TEXT');
122
+ }
123
+ }
124
+ /**
125
+ * Migration to v3: Add archived_at column to sessions table
126
+ */
127
+ function migrateToV3(database) {
128
+ // Check if archived_at column already exists
129
+ const columns = database.pragma('table_info(sessions)');
130
+ const hasArchivedAt = columns.some((c) => c.name === 'archived_at');
131
+ if (!hasArchivedAt) {
132
+ console.log('[DB] v3 migration: Adding archived_at column to sessions');
133
+ database.exec('ALTER TABLE sessions ADD COLUMN archived_at INTEGER');
134
+ }
135
+ }
136
+ /**
137
+ * Get current schema version
138
+ */
139
+ function getCurrentSchemaVersion(database) {
140
+ try {
141
+ // Check if schema_version table exists
142
+ const tableExists = database
143
+ .prepare(`
144
+ SELECT name FROM sqlite_master
145
+ WHERE type='table' AND name='schema_version'
146
+ `)
147
+ .get();
148
+ if (!tableExists) {
149
+ return 0;
150
+ }
151
+ const row = database
152
+ .prepare(`
153
+ SELECT version FROM schema_version ORDER BY version DESC LIMIT 1
154
+ `)
155
+ .get();
156
+ return row?.version ?? 0;
157
+ }
158
+ catch {
159
+ return 0;
160
+ }
161
+ }
162
+ /**
163
+ * Migrate environments from JSON file to database
164
+ * Only runs if environments.json exists and environments table is empty
165
+ */
166
+ export function migrateEnvironmentsFromJson(database) {
167
+ const ENVIRONMENTS_FILE = join(__dirname, '..', '..', 'environments.json');
168
+ // Check if JSON file exists
169
+ if (!existsSync(ENVIRONMENTS_FILE)) {
170
+ console.log('[DB] No environments.json found, skipping migration');
171
+ return false;
172
+ }
173
+ // Check if environments table is empty
174
+ const count = database.prepare('SELECT COUNT(*) as count FROM environments').get();
175
+ if (count.count > 0) {
176
+ console.log('[DB] Environments table already has data, skipping migration');
177
+ return false;
178
+ }
179
+ try {
180
+ console.log('[DB] Migrating environments from JSON...');
181
+ const data = readFileSync(ENVIRONMENTS_FILE, 'utf-8');
182
+ const environments = JSON.parse(data);
183
+ const insert = database.prepare(`
184
+ INSERT INTO environments (id, name, provider, is_default, variables, created_at, updated_at)
185
+ VALUES (@id, @name, @provider, @isDefault, @variables, @createdAt, @updatedAt)
186
+ `);
187
+ const insertMany = database.transaction((envs) => {
188
+ for (const env of envs) {
189
+ insert.run({
190
+ id: env.id,
191
+ name: env.name,
192
+ provider: env.provider,
193
+ isDefault: env.isDefault ? 1 : 0,
194
+ variables: JSON.stringify(env.variables),
195
+ createdAt: env.createdAt,
196
+ updatedAt: env.updatedAt,
197
+ });
198
+ }
199
+ });
200
+ insertMany(environments);
201
+ console.log(`[DB] Migrated ${environments.length} environments from JSON`);
202
+ return true;
203
+ }
204
+ catch (err) {
205
+ console.error('[DB] Failed to migrate environments from JSON:', err);
206
+ return false;
207
+ }
208
+ }
209
+ /**
210
+ * Get database statistics for debugging
211
+ */
212
+ export function getDatabaseStats() {
213
+ const database = getDatabase();
214
+ const sessions = database.prepare('SELECT COUNT(*) as count FROM sessions').get();
215
+ const history = database.prepare('SELECT COUNT(*) as count FROM status_history').get();
216
+ const environments = database.prepare('SELECT COUNT(*) as count FROM environments').get();
217
+ return {
218
+ sessions: sessions.count,
219
+ history: history.count,
220
+ environments: environments.count,
221
+ };
222
+ }
223
+ // Export retention config for use in cleanup
224
+ export { RETENTION_CONFIG };
225
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { SessionStatus, AttentionReason, EnvironmentProvider } from '@vibecompany/247-shared';
2
+ export interface DbSession {
3
+ id: number;
4
+ name: string;
5
+ project: string;
6
+ status: SessionStatus;
7
+ attention_reason: AttentionReason | null;
8
+ last_event: string | null;
9
+ last_activity: number;
10
+ last_status_change: number;
11
+ environment_id: string | null;
12
+ archived_at: number | null;
13
+ created_at: number;
14
+ updated_at: number;
15
+ }
16
+ export interface DbStatusHistory {
17
+ id: number;
18
+ session_name: string;
19
+ status: SessionStatus;
20
+ attention_reason: AttentionReason | null;
21
+ event: string | null;
22
+ timestamp: number;
23
+ }
24
+ export interface DbEnvironment {
25
+ id: string;
26
+ name: string;
27
+ provider: EnvironmentProvider;
28
+ icon: string | null;
29
+ is_default: number;
30
+ variables: string;
31
+ created_at: number;
32
+ updated_at: number;
33
+ }
34
+ export interface DbSessionEnvironment {
35
+ session_name: string;
36
+ environment_id: string;
37
+ }
38
+ export interface DbSchemaVersion {
39
+ version: number;
40
+ applied_at: number;
41
+ }
42
+ export interface UpsertSessionInput {
43
+ project: string;
44
+ status: SessionStatus;
45
+ attentionReason?: AttentionReason | null;
46
+ lastEvent?: string | null;
47
+ lastActivity: number;
48
+ lastStatusChange: number;
49
+ environmentId?: string | null;
50
+ }
51
+ export interface UpsertEnvironmentInput {
52
+ id: string;
53
+ name: string;
54
+ provider: EnvironmentProvider;
55
+ isDefault: boolean;
56
+ variables: Record<string, string>;
57
+ }
58
+ export declare const SCHEMA_VERSION = 3;
59
+ export declare const CREATE_TABLES_SQL = "\n-- Sessions: current state of terminal sessions\nCREATE TABLE IF NOT EXISTS sessions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n project TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'init',\n attention_reason TEXT,\n last_event TEXT,\n last_activity INTEGER NOT NULL,\n last_status_change INTEGER NOT NULL,\n environment_id TEXT,\n archived_at INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_sessions_name ON sessions(name);\nCREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project);\nCREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);\nCREATE INDEX IF NOT EXISTS idx_sessions_last_activity ON sessions(last_activity);\n\n-- Status history: audit trail of status changes\nCREATE TABLE IF NOT EXISTS status_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_name TEXT NOT NULL,\n status TEXT NOT NULL,\n attention_reason TEXT,\n event TEXT,\n timestamp INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_history_session ON status_history(session_name);\nCREATE INDEX IF NOT EXISTS idx_history_timestamp ON status_history(timestamp);\n\n-- Environments: API provider configurations\nCREATE TABLE IF NOT EXISTS environments (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n provider TEXT NOT NULL,\n icon TEXT,\n is_default INTEGER NOT NULL DEFAULT 0,\n variables TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_environments_default ON environments(is_default);\n\n-- Session-environment mapping\nCREATE TABLE IF NOT EXISTS session_environments (\n session_name TEXT PRIMARY KEY,\n environment_id TEXT NOT NULL\n);\n\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n);\n";
60
+ export declare const RETENTION_CONFIG: {
61
+ /** Max age for sessions before cleanup (24 hours) */
62
+ sessionMaxAge: number;
63
+ /** Max age for archived sessions before cleanup (30 days) */
64
+ archivedMaxAge: number;
65
+ /** Max age for status history (7 days) */
66
+ historyMaxAge: number;
67
+ /** Cleanup interval (1 hour) */
68
+ cleanupInterval: number;
69
+ };
70
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAMnG,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAMD,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,iBAAiB,+1DA4D7B,CAAC;AAMF,eAAO,MAAM,gBAAgB;IAC3B,qDAAqD;;IAErD,6DAA6D;;IAE7D,0CAA0C;;IAE1C,gCAAgC;;CAEjC,CAAC"}
@@ -0,0 +1,79 @@
1
+ // ============================================================================
2
+ // SQL Schema Definitions
3
+ // ============================================================================
4
+ export const SCHEMA_VERSION = 3;
5
+ export const CREATE_TABLES_SQL = `
6
+ -- Sessions: current state of terminal sessions
7
+ CREATE TABLE IF NOT EXISTS sessions (
8
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
9
+ name TEXT NOT NULL UNIQUE,
10
+ project TEXT NOT NULL,
11
+ status TEXT NOT NULL DEFAULT 'init',
12
+ attention_reason TEXT,
13
+ last_event TEXT,
14
+ last_activity INTEGER NOT NULL,
15
+ last_status_change INTEGER NOT NULL,
16
+ environment_id TEXT,
17
+ archived_at INTEGER,
18
+ created_at INTEGER NOT NULL,
19
+ updated_at INTEGER NOT NULL
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_sessions_name ON sessions(name);
23
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project);
24
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
25
+ CREATE INDEX IF NOT EXISTS idx_sessions_last_activity ON sessions(last_activity);
26
+
27
+ -- Status history: audit trail of status changes
28
+ CREATE TABLE IF NOT EXISTS status_history (
29
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
30
+ session_name TEXT NOT NULL,
31
+ status TEXT NOT NULL,
32
+ attention_reason TEXT,
33
+ event TEXT,
34
+ timestamp INTEGER NOT NULL
35
+ );
36
+
37
+ CREATE INDEX IF NOT EXISTS idx_history_session ON status_history(session_name);
38
+ CREATE INDEX IF NOT EXISTS idx_history_timestamp ON status_history(timestamp);
39
+
40
+ -- Environments: API provider configurations
41
+ CREATE TABLE IF NOT EXISTS environments (
42
+ id TEXT PRIMARY KEY,
43
+ name TEXT NOT NULL,
44
+ provider TEXT NOT NULL,
45
+ icon TEXT,
46
+ is_default INTEGER NOT NULL DEFAULT 0,
47
+ variables TEXT NOT NULL,
48
+ created_at INTEGER NOT NULL,
49
+ updated_at INTEGER NOT NULL
50
+ );
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_environments_default ON environments(is_default);
53
+
54
+ -- Session-environment mapping
55
+ CREATE TABLE IF NOT EXISTS session_environments (
56
+ session_name TEXT PRIMARY KEY,
57
+ environment_id TEXT NOT NULL
58
+ );
59
+
60
+ -- Schema version tracking
61
+ CREATE TABLE IF NOT EXISTS schema_version (
62
+ version INTEGER PRIMARY KEY,
63
+ applied_at INTEGER NOT NULL
64
+ );
65
+ `;
66
+ // ============================================================================
67
+ // Retention Configuration
68
+ // ============================================================================
69
+ export const RETENTION_CONFIG = {
70
+ /** Max age for sessions before cleanup (24 hours) */
71
+ sessionMaxAge: 24 * 60 * 60 * 1000,
72
+ /** Max age for archived sessions before cleanup (30 days) */
73
+ archivedMaxAge: 30 * 24 * 60 * 60 * 1000,
74
+ /** Max age for status history (7 days) */
75
+ historyMaxAge: 7 * 24 * 60 * 60 * 1000,
76
+ /** Cleanup interval (1 hour) */
77
+ cleanupInterval: 60 * 60 * 1000,
78
+ };
79
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAyEA,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DhC,CAAC;AAEF,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,qDAAqD;IACrD,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IAClC,6DAA6D;IAC7D,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACxC,0CAA0C;IAC1C,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACtC,gCAAgC;IAChC,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CAChC,CAAC"}
@@ -0,0 +1,75 @@
1
+ import type { DbSession, UpsertSessionInput } from './schema.js';
2
+ import type { SessionStatus, AttentionReason } from '@vibecompany/247-shared';
3
+ /**
4
+ * Get a session by name
5
+ */
6
+ export declare function getSession(name: string): DbSession | null;
7
+ /**
8
+ * Get all active (non-archived) sessions
9
+ */
10
+ export declare function getAllSessions(): DbSession[];
11
+ /**
12
+ * Get all archived sessions
13
+ */
14
+ export declare function getArchivedSessions(): DbSession[];
15
+ /**
16
+ * Get sessions by project
17
+ */
18
+ export declare function getSessionsByProject(project: string): DbSession[];
19
+ /**
20
+ * Upsert a session (insert or update)
21
+ * Records status history if status changed
22
+ */
23
+ export declare function upsertSession(name: string, input: UpsertSessionInput): DbSession;
24
+ /**
25
+ * Update session status only
26
+ */
27
+ export declare function updateSessionStatus(name: string, status: SessionStatus, attentionReason?: AttentionReason | null, lastEvent?: string | null): boolean;
28
+ /**
29
+ * Delete a session
30
+ */
31
+ export declare function deleteSession(name: string): boolean;
32
+ /**
33
+ * Archive a session (mark as done and keep in history)
34
+ * Returns the archived session or null if not found
35
+ */
36
+ export declare function archiveSession(name: string): DbSession | null;
37
+ /**
38
+ * Cleanup stale sessions (older than maxAge)
39
+ * - Non-archived sessions: delete if last_activity older than maxAge
40
+ * - Archived sessions: delete if archived_at older than archivedMaxAge
41
+ * Returns number of deleted sessions
42
+ */
43
+ export declare function cleanupStaleSessions(maxAge: number, archivedMaxAge?: number): number;
44
+ /**
45
+ * Reconcile sessions with active tmux sessions
46
+ * - Sessions in DB but not in tmux: mark as idle or delete if old
47
+ * - Sessions in tmux but not in DB: create with idle status
48
+ * - Archived sessions are skipped (they don't have tmux sessions)
49
+ */
50
+ export declare function reconcileWithTmux(activeTmuxSessions: Set<string>): void;
51
+ /**
52
+ * Get session environment mapping
53
+ */
54
+ export declare function getSessionEnvironmentId(sessionName: string): string | null;
55
+ /**
56
+ * Set session environment mapping
57
+ */
58
+ export declare function setSessionEnvironmentId(sessionName: string, environmentId: string): void;
59
+ /**
60
+ * Clear session environment mapping
61
+ */
62
+ export declare function clearSessionEnvironmentId(sessionName: string): void;
63
+ /**
64
+ * Convert DbSession to HookStatus format (for compatibility with existing code)
65
+ */
66
+ export declare function toHookStatus(session: DbSession): {
67
+ status: SessionStatus;
68
+ attentionReason?: AttentionReason;
69
+ lastEvent: string;
70
+ lastActivity: number;
71
+ lastStatusChange: number;
72
+ project?: string;
73
+ archivedAt?: number;
74
+ };
75
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/db/sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAK5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,EAAE,CAKjD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAKjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,SAAS,CA8ChF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,EACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAsCT;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAyB7D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CA4BpF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CA6BvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAQxF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG;IAChD,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAUA"}