@vibecompany/247-cli 0.1.0 → 0.2.2

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 (70) hide show
  1. package/agent/dist/db/environments.d.ts +65 -0
  2. package/agent/dist/db/environments.d.ts.map +1 -0
  3. package/agent/dist/db/environments.js +243 -0
  4. package/agent/dist/db/environments.js.map +1 -0
  5. package/agent/dist/db/history.d.ts +37 -0
  6. package/agent/dist/db/history.d.ts.map +1 -0
  7. package/agent/dist/db/history.js +98 -0
  8. package/agent/dist/db/history.js.map +1 -0
  9. package/agent/dist/db/index.d.ts +37 -0
  10. package/agent/dist/db/index.d.ts.map +1 -0
  11. package/agent/dist/db/index.js +225 -0
  12. package/agent/dist/db/index.js.map +1 -0
  13. package/agent/dist/db/schema.d.ts +70 -0
  14. package/agent/dist/db/schema.d.ts.map +1 -0
  15. package/agent/dist/db/schema.js +79 -0
  16. package/agent/dist/db/schema.js.map +1 -0
  17. package/agent/dist/db/sessions.d.ts +75 -0
  18. package/agent/dist/db/sessions.d.ts.map +1 -0
  19. package/agent/dist/db/sessions.js +244 -0
  20. package/agent/dist/db/sessions.js.map +1 -0
  21. package/agent/dist/editor.d.ts +18 -0
  22. package/agent/dist/editor.d.ts.map +1 -0
  23. package/agent/dist/editor.js +220 -0
  24. package/agent/dist/editor.js.map +1 -0
  25. package/agent/dist/environments.d.ts +59 -0
  26. package/agent/dist/environments.d.ts.map +1 -0
  27. package/agent/dist/environments.js +229 -0
  28. package/agent/dist/environments.js.map +1 -0
  29. package/agent/dist/git.d.ts +39 -0
  30. package/agent/dist/git.d.ts.map +1 -0
  31. package/agent/dist/git.js +436 -0
  32. package/agent/dist/git.js.map +1 -0
  33. package/agent/dist/index.d.ts +2 -0
  34. package/agent/dist/index.d.ts.map +1 -0
  35. package/agent/dist/index.js +17 -0
  36. package/agent/dist/index.js.map +1 -0
  37. package/agent/dist/server.d.ts +2 -0
  38. package/agent/dist/server.d.ts.map +1 -0
  39. package/agent/dist/server.js +1062 -0
  40. package/agent/dist/server.js.map +1 -0
  41. package/agent/dist/terminal.d.ts +14 -0
  42. package/agent/dist/terminal.d.ts.map +1 -0
  43. package/agent/dist/terminal.js +115 -0
  44. package/agent/dist/terminal.js.map +1 -0
  45. package/dist/commands/init.d.ts.map +1 -1
  46. package/dist/commands/init.js +25 -14
  47. package/dist/commands/init.js.map +1 -1
  48. package/dist/commands/profile.d.ts +3 -0
  49. package/dist/commands/profile.d.ts.map +1 -0
  50. package/dist/commands/profile.js +156 -0
  51. package/dist/commands/profile.js.map +1 -0
  52. package/dist/commands/start.d.ts.map +1 -1
  53. package/dist/commands/start.js +21 -10
  54. package/dist/commands/start.js.map +1 -1
  55. package/dist/index.d.ts +3 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +6 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/config.d.ts +30 -5
  60. package/dist/lib/config.d.ts.map +1 -1
  61. package/dist/lib/config.js +85 -12
  62. package/dist/lib/config.js.map +1 -1
  63. package/dist/lib/process.d.ts +2 -1
  64. package/dist/lib/process.d.ts.map +1 -1
  65. package/dist/lib/process.js +10 -4
  66. package/dist/lib/process.js.map +1 -1
  67. package/hooks/.claude-plugin/plugin.json +5 -0
  68. package/hooks/hooks/hooks.json +61 -0
  69. package/hooks/scripts/notify-status.sh +89 -0
  70. package/package.json +22 -5
@@ -0,0 +1,65 @@
1
+ import type { Environment, EnvironmentMetadata, EnvironmentProvider, CreateEnvironmentRequest, UpdateEnvironmentRequest } from '@vibecompany/247-shared';
2
+ /**
3
+ * Get all environments (full data, agent-side only)
4
+ */
5
+ export declare function getAllEnvironments(): Environment[];
6
+ /**
7
+ * Get all environments as safe metadata (for dashboard)
8
+ */
9
+ export declare function getEnvironmentsMetadata(): EnvironmentMetadata[];
10
+ /**
11
+ * Get single environment by ID (full data)
12
+ */
13
+ export declare function getEnvironment(id: string): Environment | undefined;
14
+ /**
15
+ * Get single environment metadata
16
+ */
17
+ export declare function getEnvironmentMetadata(id: string): EnvironmentMetadata | undefined;
18
+ /**
19
+ * Get default environment
20
+ */
21
+ export declare function getDefaultEnvironment(): Environment | undefined;
22
+ /**
23
+ * Create new environment
24
+ */
25
+ export declare function createEnvironment(req: CreateEnvironmentRequest): Environment;
26
+ /**
27
+ * Update environment
28
+ */
29
+ export declare function updateEnvironment(id: string, req: UpdateEnvironmentRequest): Environment | null;
30
+ /**
31
+ * Delete environment
32
+ */
33
+ export declare function deleteEnvironment(id: string): boolean;
34
+ /**
35
+ * Get environment variables for terminal injection
36
+ * Returns the variables for the specified environment, or default if not found
37
+ */
38
+ export declare function getEnvironmentVariables(environmentId?: string): Record<string, string>;
39
+ /**
40
+ * Track which environment a session uses
41
+ */
42
+ export declare function setSessionEnvironment(sessionName: string, environmentId: string): void;
43
+ /**
44
+ * Get the environment ID for a session
45
+ */
46
+ export declare function getSessionEnvironment(sessionName: string): string | undefined;
47
+ /**
48
+ * Clear session environment tracking (when session is killed)
49
+ */
50
+ export declare function clearSessionEnvironment(sessionName: string): void;
51
+ /**
52
+ * Create environment from preset
53
+ */
54
+ export declare function createEnvironmentFromPreset(provider: EnvironmentProvider, name: string, customVariables?: Record<string, string>): Environment;
55
+ /**
56
+ * Initialize environments with default if table is empty
57
+ * Called during database initialization
58
+ */
59
+ export declare function ensureDefaultEnvironment(): void;
60
+ /**
61
+ * Deprecated: No longer needed since we use SQLite
62
+ * Kept for API compatibility during migration
63
+ */
64
+ export declare function loadEnvironments(): void;
65
+ //# sourceMappingURL=environments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/db/environments.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EAEnB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AA2CjC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,EAAE,CAIlD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,mBAAmB,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMlE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAIlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,SAAS,CAM/D;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,wBAAwB,GAAG,WAAW,CAgC5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,wBAAwB,GAAG,WAAW,GAAG,IAAI,CAwC/F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAsBrD;AAMD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAatF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAQtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGjE;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,WAAW,CAUb;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAe/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
@@ -0,0 +1,243 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { getDatabase } from './index.js';
3
+ import { ENVIRONMENT_PRESETS } from '@vibecompany/247-shared';
4
+ // ============================================================================
5
+ // Conversion Functions
6
+ // ============================================================================
7
+ /**
8
+ * Convert database row to Environment
9
+ */
10
+ function toEnvironment(row) {
11
+ return {
12
+ id: row.id,
13
+ name: row.name,
14
+ provider: row.provider,
15
+ icon: row.icon,
16
+ isDefault: row.is_default === 1,
17
+ variables: JSON.parse(row.variables),
18
+ createdAt: row.created_at,
19
+ updatedAt: row.updated_at,
20
+ };
21
+ }
22
+ /**
23
+ * Convert Environment to safe EnvironmentMetadata (no secret values)
24
+ */
25
+ function toMetadata(env) {
26
+ return {
27
+ id: env.id,
28
+ name: env.name,
29
+ provider: env.provider,
30
+ icon: env.icon,
31
+ isDefault: env.isDefault,
32
+ variableKeys: Object.keys(env.variables),
33
+ createdAt: env.createdAt,
34
+ updatedAt: env.updatedAt,
35
+ };
36
+ }
37
+ // ============================================================================
38
+ // Read Operations
39
+ // ============================================================================
40
+ /**
41
+ * Get all environments (full data, agent-side only)
42
+ */
43
+ export function getAllEnvironments() {
44
+ const db = getDatabase();
45
+ const rows = db.prepare('SELECT * FROM environments ORDER BY name').all();
46
+ return rows.map(toEnvironment);
47
+ }
48
+ /**
49
+ * Get all environments as safe metadata (for dashboard)
50
+ */
51
+ export function getEnvironmentsMetadata() {
52
+ return getAllEnvironments().map(toMetadata);
53
+ }
54
+ /**
55
+ * Get single environment by ID (full data)
56
+ */
57
+ export function getEnvironment(id) {
58
+ const db = getDatabase();
59
+ const row = db.prepare('SELECT * FROM environments WHERE id = ?').get(id);
60
+ return row ? toEnvironment(row) : undefined;
61
+ }
62
+ /**
63
+ * Get single environment metadata
64
+ */
65
+ export function getEnvironmentMetadata(id) {
66
+ const env = getEnvironment(id);
67
+ if (!env)
68
+ return undefined;
69
+ return toMetadata(env);
70
+ }
71
+ /**
72
+ * Get default environment
73
+ */
74
+ export function getDefaultEnvironment() {
75
+ const db = getDatabase();
76
+ const row = db.prepare('SELECT * FROM environments WHERE is_default = 1').get();
77
+ return row ? toEnvironment(row) : undefined;
78
+ }
79
+ // ============================================================================
80
+ // Write Operations
81
+ // ============================================================================
82
+ /**
83
+ * Create new environment
84
+ */
85
+ export function createEnvironment(req) {
86
+ const db = getDatabase();
87
+ const now = Date.now();
88
+ const id = randomUUID();
89
+ // If setting as default, unset other defaults
90
+ if (req.isDefault) {
91
+ db.prepare('UPDATE environments SET is_default = 0').run();
92
+ }
93
+ // If this is the first environment, make it default
94
+ const count = db.prepare('SELECT COUNT(*) as count FROM environments').get();
95
+ const isFirstEnv = count.count === 0;
96
+ db.prepare(`
97
+ INSERT INTO environments (id, name, provider, icon, is_default, variables, created_at, updated_at)
98
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
99
+ `).run(id, req.name, req.provider, req.icon ?? null, req.isDefault || isFirstEnv ? 1 : 0, JSON.stringify(req.variables), now, now);
100
+ console.log(`[Environments] Created environment: ${req.name} (${req.provider})`);
101
+ return getEnvironment(id);
102
+ }
103
+ /**
104
+ * Update environment
105
+ */
106
+ export function updateEnvironment(id, req) {
107
+ const db = getDatabase();
108
+ const existing = getEnvironment(id);
109
+ if (!existing)
110
+ return null;
111
+ // If setting as default, unset other defaults
112
+ if (req.isDefault) {
113
+ db.prepare('UPDATE environments SET is_default = 0').run();
114
+ }
115
+ // Merge variables if provided (don't replace entirely, allow partial updates)
116
+ const updatedVariables = req.variables
117
+ ? { ...existing.variables, ...req.variables }
118
+ : existing.variables;
119
+ const now = Date.now();
120
+ db.prepare(`
121
+ UPDATE environments SET
122
+ name = ?,
123
+ provider = ?,
124
+ icon = ?,
125
+ is_default = ?,
126
+ variables = ?,
127
+ updated_at = ?
128
+ WHERE id = ?
129
+ `).run(req.name ?? existing.name, req.provider ?? existing.provider, req.icon !== undefined ? req.icon : existing.icon, req.isDefault !== undefined ? (req.isDefault ? 1 : 0) : (existing.isDefault ? 1 : 0), JSON.stringify(updatedVariables), now, id);
130
+ console.log(`[Environments] Updated environment: ${req.name ?? existing.name}`);
131
+ return getEnvironment(id) ?? null;
132
+ }
133
+ /**
134
+ * Delete environment
135
+ */
136
+ export function deleteEnvironment(id) {
137
+ const db = getDatabase();
138
+ const existing = getEnvironment(id);
139
+ if (!existing)
140
+ return false;
141
+ const wasDefault = existing.isDefault;
142
+ const deletedName = existing.name;
143
+ db.prepare('DELETE FROM environments WHERE id = ?').run(id);
144
+ // If deleted env was default, make first remaining env default
145
+ if (wasDefault) {
146
+ const first = db.prepare('SELECT id FROM environments LIMIT 1').get();
147
+ if (first) {
148
+ db.prepare('UPDATE environments SET is_default = 1 WHERE id = ?').run(first.id);
149
+ }
150
+ }
151
+ console.log(`[Environments] Deleted environment: ${deletedName}`);
152
+ return true;
153
+ }
154
+ // ============================================================================
155
+ // Session Environment Mapping
156
+ // ============================================================================
157
+ /**
158
+ * Get environment variables for terminal injection
159
+ * Returns the variables for the specified environment, or default if not found
160
+ */
161
+ export function getEnvironmentVariables(environmentId) {
162
+ let env;
163
+ if (environmentId) {
164
+ env = getEnvironment(environmentId);
165
+ }
166
+ // Fall back to default
167
+ if (!env) {
168
+ env = getDefaultEnvironment();
169
+ }
170
+ return env?.variables ?? {};
171
+ }
172
+ /**
173
+ * Track which environment a session uses
174
+ */
175
+ export function setSessionEnvironment(sessionName, environmentId) {
176
+ const db = getDatabase();
177
+ db.prepare(`
178
+ INSERT OR REPLACE INTO session_environments (session_name, environment_id)
179
+ VALUES (?, ?)
180
+ `).run(sessionName, environmentId);
181
+ }
182
+ /**
183
+ * Get the environment ID for a session
184
+ */
185
+ export function getSessionEnvironment(sessionName) {
186
+ const db = getDatabase();
187
+ const row = db
188
+ .prepare('SELECT environment_id FROM session_environments WHERE session_name = ?')
189
+ .get(sessionName);
190
+ return row?.environment_id;
191
+ }
192
+ /**
193
+ * Clear session environment tracking (when session is killed)
194
+ */
195
+ export function clearSessionEnvironment(sessionName) {
196
+ const db = getDatabase();
197
+ db.prepare('DELETE FROM session_environments WHERE session_name = ?').run(sessionName);
198
+ }
199
+ // ============================================================================
200
+ // Preset Operations
201
+ // ============================================================================
202
+ /**
203
+ * Create environment from preset
204
+ */
205
+ export function createEnvironmentFromPreset(provider, name, customVariables) {
206
+ const preset = ENVIRONMENT_PRESETS[provider];
207
+ return createEnvironment({
208
+ name,
209
+ provider,
210
+ variables: {
211
+ ...preset.defaultVariables,
212
+ ...customVariables,
213
+ },
214
+ });
215
+ }
216
+ // ============================================================================
217
+ // Initialization
218
+ // ============================================================================
219
+ /**
220
+ * Initialize environments with default if table is empty
221
+ * Called during database initialization
222
+ */
223
+ export function ensureDefaultEnvironment() {
224
+ const db = getDatabase();
225
+ const count = db.prepare('SELECT COUNT(*) as count FROM environments').get();
226
+ if (count.count === 0) {
227
+ console.log('[Environments] No environments found, creating default Anthropic environment');
228
+ const now = Date.now();
229
+ db.prepare(`
230
+ INSERT INTO environments (id, name, provider, icon, is_default, variables, created_at, updated_at)
231
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
232
+ `).run('default-anthropic', 'Anthropic (Default)', 'anthropic', null, 1, JSON.stringify({ ANTHROPIC_API_KEY: '' }), now, now);
233
+ }
234
+ }
235
+ /**
236
+ * Deprecated: No longer needed since we use SQLite
237
+ * Kept for API compatibility during migration
238
+ */
239
+ export function loadEnvironments() {
240
+ // No-op: environments are now loaded from SQLite
241
+ console.log('[Environments] loadEnvironments() is deprecated, using SQLite');
242
+ }
243
+ //# sourceMappingURL=environments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/db/environments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { DbStatusHistory } from './schema.js';
2
+ import type { SessionStatus, AttentionReason } from '@vibecompany/247-shared';
3
+ /**
4
+ * Record a status change in history
5
+ */
6
+ export declare function recordStatusChange(sessionName: string, status: SessionStatus, attentionReason: AttentionReason | null, event: string | null): void;
7
+ /**
8
+ * Get status history for a session
9
+ */
10
+ export declare function getSessionHistory(sessionName: string, limit?: number): DbStatusHistory[];
11
+ /**
12
+ * Get recent history across all sessions
13
+ */
14
+ export declare function getRecentHistory(limit?: number): DbStatusHistory[];
15
+ /**
16
+ * Get history within a time range
17
+ */
18
+ export declare function getHistoryInRange(startTime: number, endTime: number): DbStatusHistory[];
19
+ /**
20
+ * Cleanup old history entries
21
+ * Returns number of deleted entries
22
+ */
23
+ export declare function cleanupOldHistory(maxAge: number): number;
24
+ /**
25
+ * Get statistics about status history
26
+ */
27
+ export declare function getHistoryStats(): {
28
+ totalEntries: number;
29
+ oldestEntry: number | null;
30
+ newestEntry: number | null;
31
+ entriesByStatus: Record<string, number>;
32
+ };
33
+ /**
34
+ * Delete all history for a session
35
+ */
36
+ export declare function deleteSessionHistory(sessionName: string): number;
37
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,eAAe,EAAE,CAYrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,SAAM,GAAG,eAAe,EAAE,CAW/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAWvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC,CAkCA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIhE"}
@@ -0,0 +1,98 @@
1
+ import { getDatabase } from './index.js';
2
+ /**
3
+ * Record a status change in history
4
+ */
5
+ export function recordStatusChange(sessionName, status, attentionReason, event) {
6
+ const db = getDatabase();
7
+ const now = Date.now();
8
+ db.prepare(`
9
+ INSERT INTO status_history (session_name, status, attention_reason, event, timestamp)
10
+ VALUES (?, ?, ?, ?, ?)
11
+ `).run(sessionName, status, attentionReason, event, now);
12
+ }
13
+ /**
14
+ * Get status history for a session
15
+ */
16
+ export function getSessionHistory(sessionName, limit = 100) {
17
+ const db = getDatabase();
18
+ return db
19
+ .prepare(`
20
+ SELECT * FROM status_history
21
+ WHERE session_name = ?
22
+ ORDER BY timestamp DESC
23
+ LIMIT ?
24
+ `)
25
+ .all(sessionName, limit);
26
+ }
27
+ /**
28
+ * Get recent history across all sessions
29
+ */
30
+ export function getRecentHistory(limit = 100) {
31
+ const db = getDatabase();
32
+ return db
33
+ .prepare(`
34
+ SELECT * FROM status_history
35
+ ORDER BY timestamp DESC
36
+ LIMIT ?
37
+ `)
38
+ .all(limit);
39
+ }
40
+ /**
41
+ * Get history within a time range
42
+ */
43
+ export function getHistoryInRange(startTime, endTime) {
44
+ const db = getDatabase();
45
+ return db
46
+ .prepare(`
47
+ SELECT * FROM status_history
48
+ WHERE timestamp >= ? AND timestamp <= ?
49
+ ORDER BY timestamp DESC
50
+ `)
51
+ .all(startTime, endTime);
52
+ }
53
+ /**
54
+ * Cleanup old history entries
55
+ * Returns number of deleted entries
56
+ */
57
+ export function cleanupOldHistory(maxAge) {
58
+ const db = getDatabase();
59
+ const cutoff = Date.now() - maxAge;
60
+ const result = db.prepare('DELETE FROM status_history WHERE timestamp < ?').run(cutoff);
61
+ if (result.changes > 0) {
62
+ console.log(`[DB] Cleaned up ${result.changes} old history entries`);
63
+ }
64
+ return result.changes;
65
+ }
66
+ /**
67
+ * Get statistics about status history
68
+ */
69
+ export function getHistoryStats() {
70
+ const db = getDatabase();
71
+ const total = db.prepare('SELECT COUNT(*) as count FROM status_history').get();
72
+ const oldest = db.prepare('SELECT MIN(timestamp) as ts FROM status_history').get();
73
+ const newest = db.prepare('SELECT MAX(timestamp) as ts FROM status_history').get();
74
+ const byStatus = db
75
+ .prepare(`
76
+ SELECT status, COUNT(*) as count FROM status_history GROUP BY status
77
+ `)
78
+ .all();
79
+ const entriesByStatus = {};
80
+ for (const row of byStatus) {
81
+ entriesByStatus[row.status] = row.count;
82
+ }
83
+ return {
84
+ totalEntries: total.count,
85
+ oldestEntry: oldest.ts,
86
+ newestEntry: newest.ts,
87
+ entriesByStatus,
88
+ };
89
+ }
90
+ /**
91
+ * Delete all history for a session
92
+ */
93
+ export function deleteSessionHistory(sessionName) {
94
+ const db = getDatabase();
95
+ const result = db.prepare('DELETE FROM status_history WHERE session_name = ?').run(sessionName);
96
+ return result.changes;
97
+ }
98
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import Database from 'better-sqlite3';
2
+ import { RETENTION_CONFIG } from './schema.js';
3
+ /**
4
+ * Get or create the database instance
5
+ */
6
+ export declare function getDatabase(): Database.Database;
7
+ /**
8
+ * Initialize the database
9
+ * - Creates data directory if missing
10
+ * - Opens/creates database file
11
+ * - Runs migrations
12
+ * - Sets WAL mode for better performance
13
+ */
14
+ export declare function initDatabase(dbPath?: string): Database.Database;
15
+ /**
16
+ * Create an in-memory database for testing
17
+ */
18
+ export declare function initTestDatabase(): Database.Database;
19
+ /**
20
+ * Close the database connection
21
+ */
22
+ export declare function closeDatabase(): void;
23
+ /**
24
+ * Migrate environments from JSON file to database
25
+ * Only runs if environments.json exists and environments table is empty
26
+ */
27
+ export declare function migrateEnvironmentsFromJson(database: Database.Database): boolean;
28
+ /**
29
+ * Get database statistics for debugging
30
+ */
31
+ export declare function getDatabaseStats(): {
32
+ sessions: number;
33
+ history: number;
34
+ environments: number;
35
+ };
36
+ export { RETENTION_CONFIG };
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,OAAO,EAAqC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAalF;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAK/C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAqB/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,CAIpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAyHD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CA0DhF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB,CAkBA;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}