@creativeintelligence/abbie 0.1.6 → 0.1.7
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/bin/dev.js +1 -49
- package/bin/run.js +42 -49
- package/dist/cli/commands/project/add.d.ts +0 -1
- package/dist/cli/commands/project/add.js +16 -52
- package/dist/cli/commands/project/list.js +13 -93
- package/dist/cli/commands/project/remove.d.ts +0 -2
- package/dist/cli/commands/project/remove.js +11 -28
- package/dist/cli/commands/session/list.js +3 -12
- package/dist/cli/commands/session/mark-done.js +1 -7
- package/dist/cli/commands/session/start.d.ts +0 -1
- package/dist/cli/commands/session/start.js +5 -7
- package/dist/lib/active-sessions.d.ts +0 -12
- package/dist/lib/active-sessions.js +6 -175
- package/dist/lib/project-path.d.ts +6 -0
- package/dist/lib/project-path.js +21 -0
- package/dist/lib.d.ts +1 -2
- package/dist/lib.js +2 -4
- package/oclif.manifest.json +2569 -6368
- package/package.json +1 -1
- package/dist/cli/commands/backlog/add.d.ts +0 -22
- package/dist/cli/commands/backlog/add.js +0 -65
- package/dist/cli/commands/backlog/claim.d.ts +0 -19
- package/dist/cli/commands/backlog/claim.js +0 -45
- package/dist/cli/commands/backlog/complete.d.ts +0 -18
- package/dist/cli/commands/backlog/complete.js +0 -42
- package/dist/cli/commands/backlog/list.d.ts +0 -20
- package/dist/cli/commands/backlog/list.js +0 -91
- package/dist/cli/commands/backlog/pick.d.ts +0 -18
- package/dist/cli/commands/backlog/pick.js +0 -42
- package/dist/cli/commands/backlog/sync.d.ts +0 -24
- package/dist/cli/commands/backlog/sync.js +0 -109
- package/dist/cli/commands/daemon.d.ts +0 -56
- package/dist/cli/commands/daemon.js +0 -1465
- package/dist/cli/commands/docs/lint.d.ts +0 -18
- package/dist/cli/commands/docs/lint.js +0 -82
- package/dist/cli/commands/docs/sync.d.ts +0 -19
- package/dist/cli/commands/docs/sync.js +0 -76
- package/dist/cli/commands/gc.d.ts +0 -29
- package/dist/cli/commands/gc.js +0 -211
- package/dist/cli/commands/index.d.ts +0 -36
- package/dist/cli/commands/index.js +0 -228
- package/dist/cli/commands/panes/broker.d.ts +0 -17
- package/dist/cli/commands/panes/broker.js +0 -57
- package/dist/cli/commands/panes/pipe-sink.d.ts +0 -17
- package/dist/cli/commands/panes/pipe-sink.js +0 -90
- package/dist/cli/commands/panes/snapshot.d.ts +0 -20
- package/dist/cli/commands/panes/snapshot.js +0 -125
- package/dist/cli/commands/preview/init.d.ts +0 -25
- package/dist/cli/commands/preview/init.js +0 -159
- package/dist/cli/commands/preview/sync.d.ts +0 -23
- package/dist/cli/commands/preview/sync.js +0 -144
- package/dist/cli/commands/preview/watch.d.ts +0 -24
- package/dist/cli/commands/preview/watch.js +0 -153
- package/dist/cli/commands/resource/acquire.d.ts +0 -21
- package/dist/cli/commands/resource/acquire.js +0 -90
- package/dist/cli/commands/resource/list.d.ts +0 -15
- package/dist/cli/commands/resource/list.js +0 -61
- package/dist/cli/commands/resource/release.d.ts +0 -18
- package/dist/cli/commands/resource/release.js +0 -50
- package/dist/cli/commands/resource/wait.d.ts +0 -21
- package/dist/cli/commands/resource/wait.js +0 -73
- package/dist/cli/commands/session/view.d.ts +0 -24
- package/dist/cli/commands/session/view.js +0 -145
- package/dist/cli/commands/start.d.ts +0 -37
- package/dist/cli/commands/start.js +0 -234
- package/dist/cli/commands/triage/claim.d.ts +0 -23
- package/dist/cli/commands/triage/claim.js +0 -186
- package/dist/cli/commands/triage/list.d.ts +0 -22
- package/dist/cli/commands/triage/list.js +0 -112
- package/dist/cli/commands/triage/next.d.ts +0 -18
- package/dist/cli/commands/triage/next.js +0 -63
- package/dist/cli/commands/triage/pull.d.ts +0 -19
- package/dist/cli/commands/triage/pull.js +0 -82
- package/dist/cli/commands/triage/stats.d.ts +0 -16
- package/dist/cli/commands/triage/stats.js +0 -69
- package/dist/cli/commands/tunnel/list.d.ts +0 -16
- package/dist/cli/commands/tunnel/list.js +0 -98
- package/dist/cli/commands/tunnel/start.d.ts +0 -24
- package/dist/cli/commands/tunnel/start.js +0 -107
- package/dist/cli/commands/tunnel/stop.d.ts +0 -20
- package/dist/cli/commands/tunnel/stop.js +0 -90
- package/dist/cli/commands/tunnel/url.d.ts +0 -21
- package/dist/cli/commands/tunnel/url.js +0 -70
- package/dist/cli/commands/windows/context.d.ts +0 -18
- package/dist/cli/commands/windows/context.js +0 -326
- package/dist/cli/commands/windows/focus.d.ts +0 -17
- package/dist/cli/commands/windows/focus.js +0 -103
- package/dist/cli/commands/windows/list.d.ts +0 -21
- package/dist/cli/commands/windows/list.js +0 -172
- package/dist/cli/commands/windows/map.d.ts +0 -17
- package/dist/cli/commands/windows/map.js +0 -168
- package/dist/cli/commands/windows/read.d.ts +0 -21
- package/dist/cli/commands/windows/read.js +0 -241
- package/dist/cli/commands/windows/search.d.ts +0 -24
- package/dist/cli/commands/windows/search.js +0 -171
- package/dist/cli/commands/windows/show.d.ts +0 -19
- package/dist/cli/commands/windows/show.js +0 -165
- package/dist/cli/commands/windows/watch.d.ts +0 -19
- package/dist/cli/commands/windows/watch.js +0 -241
- package/dist/lib/managed-session.d.ts +0 -27
- package/dist/lib/managed-session.js +0 -105
- package/dist/lib/panes/broker.d.ts +0 -130
- package/dist/lib/panes/broker.js +0 -97
- package/dist/lib/panes/index.d.ts +0 -2
- package/dist/lib/panes/index.js +0 -1
- package/dist/lib/panes/server.d.ts +0 -17
- package/dist/lib/panes/server.js +0 -308
- package/dist/lib/preview/manager.d.ts +0 -77
- package/dist/lib/preview/manager.js +0 -369
- package/dist/lib/preview/schema.d.ts +0 -2
- package/dist/lib/preview/schema.js +0 -32
- package/dist/lib/preview/sprite.d.ts +0 -85
- package/dist/lib/preview/sprite.js +0 -321
- package/dist/lib/preview/watcher.d.ts +0 -63
- package/dist/lib/preview/watcher.js +0 -185
- package/dist/lib/project-identity.d.ts +0 -16
- package/dist/lib/project-identity.js +0 -75
- package/dist/lib/tmux/bridge.d.ts +0 -133
- package/dist/lib/tmux/bridge.js +0 -315
- package/dist/lib/tmux/context.d.ts +0 -82
- package/dist/lib/tmux/context.js +0 -239
- package/dist/lib/tmux/index.d.ts +0 -8
- package/dist/lib/tmux/index.js +0 -11
- package/dist/lib/tmux/map.d.ts +0 -57
- package/dist/lib/tmux/map.js +0 -198
- package/dist/lib/tmux/panes.d.ts +0 -27
- package/dist/lib/tmux/panes.js +0 -151
- package/dist/lib/tmux/redaction.d.ts +0 -57
- package/dist/lib/tmux/redaction.js +0 -152
- package/dist/lib/web/analytics.d.ts +0 -63
- package/dist/lib/web/analytics.js +0 -168
- package/dist/lib/web/server.d.ts +0 -26
- package/dist/lib/web/server.js +0 -697
- package/dist/lib/web/tmux-bridge.d.ts +0 -7
- package/dist/lib/web/tmux-bridge.js +0 -7
- package/dist/lib/windows/index.d.ts +0 -3
- package/dist/lib/windows/index.js +0 -2
- package/dist/lib/windows/inventory.d.ts +0 -21
- package/dist/lib/windows/inventory.js +0 -263
- package/dist/lib/windows/types.d.ts +0 -46
- package/dist/lib/windows/types.js +0 -1
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
import { Database } from "bun:sqlite";
|
|
2
|
-
import { existsSync, mkdirSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { PREVIEW_SCHEMA } from "./schema.js";
|
|
6
|
-
function resolveHomeDir() {
|
|
7
|
-
return process.env.HOME || homedir();
|
|
8
|
-
}
|
|
9
|
-
function getDataDir(homeDir = resolveHomeDir()) {
|
|
10
|
-
return join(homeDir, ".abbie", "data");
|
|
11
|
-
}
|
|
12
|
-
function ensureDir(path) {
|
|
13
|
-
if (!existsSync(path)) {
|
|
14
|
-
mkdirSync(path, { recursive: true });
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export class PreviewManager {
|
|
18
|
-
dataDir;
|
|
19
|
-
dbPath;
|
|
20
|
-
constructor(options) {
|
|
21
|
-
this.dataDir = options?.dataDir ?? getDataDir();
|
|
22
|
-
this.dbPath = join(this.dataDir, "previews.db");
|
|
23
|
-
ensureDir(this.dataDir);
|
|
24
|
-
}
|
|
25
|
-
openDb() {
|
|
26
|
-
ensureDir(this.dataDir);
|
|
27
|
-
const db = new Database(this.dbPath);
|
|
28
|
-
// Concurrency-safe settings for multi-process writes.
|
|
29
|
-
db.exec("PRAGMA journal_mode = WAL;");
|
|
30
|
-
db.exec("PRAGMA synchronous = NORMAL;");
|
|
31
|
-
db.exec("PRAGMA busy_timeout = 5000;");
|
|
32
|
-
this.ensureSchema(db);
|
|
33
|
-
return db;
|
|
34
|
-
}
|
|
35
|
-
ensureSchema(db) {
|
|
36
|
-
const shouldClose = !db;
|
|
37
|
-
const database = db ?? this.openDb();
|
|
38
|
-
try {
|
|
39
|
-
database.exec(PREVIEW_SCHEMA);
|
|
40
|
-
}
|
|
41
|
-
finally {
|
|
42
|
-
if (shouldClose) {
|
|
43
|
-
database.close();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
rowToSprite(row) {
|
|
48
|
-
return {
|
|
49
|
-
id: Number(row.id),
|
|
50
|
-
project_name: String(row.project_name),
|
|
51
|
-
project_path: String(row.project_path),
|
|
52
|
-
sprite_name: String(row.sprite_name),
|
|
53
|
-
sprite_url: row.sprite_url === null || row.sprite_url === undefined ? null : String(row.sprite_url),
|
|
54
|
-
doppler_project: row.doppler_project === null || row.doppler_project === undefined
|
|
55
|
-
? null
|
|
56
|
-
: String(row.doppler_project),
|
|
57
|
-
dev_command: String(row.dev_command ?? "bun run dev"),
|
|
58
|
-
port: Number(row.port ?? 8080),
|
|
59
|
-
created_at: String(row.created_at ?? ""),
|
|
60
|
-
updated_at: String(row.updated_at ?? ""),
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
rowToDeployment(row) {
|
|
64
|
-
return {
|
|
65
|
-
id: Number(row.id),
|
|
66
|
-
sprite_id: Number(row.sprite_id),
|
|
67
|
-
status: String(row.status ?? "pending"),
|
|
68
|
-
preview_url: row.preview_url === null || row.preview_url === undefined ? null : String(row.preview_url),
|
|
69
|
-
screenshot_path: row.screenshot_path === null || row.screenshot_path === undefined
|
|
70
|
-
? null
|
|
71
|
-
: String(row.screenshot_path),
|
|
72
|
-
started_at: String(row.started_at ?? ""),
|
|
73
|
-
stopped_at: row.stopped_at === null || row.stopped_at === undefined ? null : String(row.stopped_at),
|
|
74
|
-
error: row.error === null || row.error === undefined ? null : String(row.error),
|
|
75
|
-
sync_duration_ms: row.sync_duration_ms === null || row.sync_duration_ms === undefined
|
|
76
|
-
? null
|
|
77
|
-
: Number(row.sync_duration_ms),
|
|
78
|
-
install_duration_ms: row.install_duration_ms === null || row.install_duration_ms === undefined
|
|
79
|
-
? null
|
|
80
|
-
: Number(row.install_duration_ms),
|
|
81
|
-
start_duration_ms: row.start_duration_ms === null || row.start_duration_ms === undefined
|
|
82
|
-
? null
|
|
83
|
-
: Number(row.start_duration_ms),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
registerSprite(projectName, projectPath, spriteName, options) {
|
|
87
|
-
const db = this.openDb();
|
|
88
|
-
try {
|
|
89
|
-
db.exec("BEGIN IMMEDIATE;");
|
|
90
|
-
try {
|
|
91
|
-
// Upsert: insert or update on conflict
|
|
92
|
-
db.query(`INSERT INTO sprites (project_name, project_path, sprite_name, sprite_url, doppler_project, dev_command, port)
|
|
93
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
94
|
-
ON CONFLICT(project_name) DO UPDATE SET
|
|
95
|
-
project_path = excluded.project_path,
|
|
96
|
-
sprite_name = excluded.sprite_name,
|
|
97
|
-
sprite_url = excluded.sprite_url,
|
|
98
|
-
doppler_project = excluded.doppler_project,
|
|
99
|
-
dev_command = excluded.dev_command,
|
|
100
|
-
port = excluded.port,
|
|
101
|
-
updated_at = datetime('now')`).run(projectName, projectPath, spriteName, options?.spriteUrl ?? null, options?.dopplerProject ?? null, options?.devCommand ?? "bun run dev", options?.port ?? 8080);
|
|
102
|
-
db.exec("COMMIT;");
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
db.exec("ROLLBACK;");
|
|
106
|
-
throw err;
|
|
107
|
-
}
|
|
108
|
-
const row = db.query("SELECT * FROM sprites WHERE project_name = ?").get(projectName);
|
|
109
|
-
if (!row) {
|
|
110
|
-
throw new Error(`Failed to register sprite for ${projectName}`);
|
|
111
|
-
}
|
|
112
|
-
return this.rowToSprite(row);
|
|
113
|
-
}
|
|
114
|
-
finally {
|
|
115
|
-
db.close();
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
getSprite(projectName) {
|
|
119
|
-
const db = this.openDb();
|
|
120
|
-
try {
|
|
121
|
-
const row = db.query("SELECT * FROM sprites WHERE project_name = ?").get(projectName);
|
|
122
|
-
if (!row)
|
|
123
|
-
return null;
|
|
124
|
-
return this.rowToSprite(row);
|
|
125
|
-
}
|
|
126
|
-
finally {
|
|
127
|
-
db.close();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
getSpriteById(id) {
|
|
131
|
-
const db = this.openDb();
|
|
132
|
-
try {
|
|
133
|
-
const row = db.query("SELECT * FROM sprites WHERE id = ?").get(id);
|
|
134
|
-
if (!row)
|
|
135
|
-
return null;
|
|
136
|
-
return this.rowToSprite(row);
|
|
137
|
-
}
|
|
138
|
-
finally {
|
|
139
|
-
db.close();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
listSprites() {
|
|
143
|
-
const db = this.openDb();
|
|
144
|
-
try {
|
|
145
|
-
const rows = db.query("SELECT * FROM sprites ORDER BY project_name ASC").all();
|
|
146
|
-
return rows.map((r) => this.rowToSprite(r));
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
db.close();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
updateSprite(projectName, updates) {
|
|
153
|
-
const db = this.openDb();
|
|
154
|
-
try {
|
|
155
|
-
const setClauses = [];
|
|
156
|
-
const params = [];
|
|
157
|
-
if (updates.devCommand !== undefined) {
|
|
158
|
-
setClauses.push("dev_command = ?");
|
|
159
|
-
params.push(updates.devCommand);
|
|
160
|
-
}
|
|
161
|
-
if (updates.dopplerProject !== undefined) {
|
|
162
|
-
setClauses.push("doppler_project = ?");
|
|
163
|
-
params.push(updates.dopplerProject);
|
|
164
|
-
}
|
|
165
|
-
if (updates.port !== undefined) {
|
|
166
|
-
setClauses.push("port = ?");
|
|
167
|
-
params.push(updates.port);
|
|
168
|
-
}
|
|
169
|
-
if (setClauses.length === 0)
|
|
170
|
-
return this.getSprite(projectName);
|
|
171
|
-
setClauses.push("updated_at = datetime('now')");
|
|
172
|
-
params.push(projectName);
|
|
173
|
-
db.query(`UPDATE sprites SET ${setClauses.join(", ")} WHERE project_name = ?`).run(...params);
|
|
174
|
-
const row = db.query("SELECT * FROM sprites WHERE project_name = ?").get(projectName);
|
|
175
|
-
return row ? this.rowToSprite(row) : null;
|
|
176
|
-
}
|
|
177
|
-
finally {
|
|
178
|
-
db.close();
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
deleteSprite(projectName) {
|
|
182
|
-
const db = this.openDb();
|
|
183
|
-
try {
|
|
184
|
-
db.exec("BEGIN IMMEDIATE;");
|
|
185
|
-
try {
|
|
186
|
-
// Get sprite ID first
|
|
187
|
-
const sprite = db.query("SELECT id FROM sprites WHERE project_name = ?").get(projectName);
|
|
188
|
-
if (!sprite) {
|
|
189
|
-
db.exec("ROLLBACK;");
|
|
190
|
-
return false;
|
|
191
|
-
}
|
|
192
|
-
// Delete associated deployments first
|
|
193
|
-
db.query("DELETE FROM deployments WHERE sprite_id = ?").run(Number(sprite.id));
|
|
194
|
-
// Delete the sprite
|
|
195
|
-
db.query("DELETE FROM sprites WHERE project_name = ?").run(projectName);
|
|
196
|
-
db.exec("COMMIT;");
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
catch (err) {
|
|
200
|
-
db.exec("ROLLBACK;");
|
|
201
|
-
throw err;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
finally {
|
|
205
|
-
db.close();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
recordDeployment(spriteId, status, options) {
|
|
209
|
-
const db = this.openDb();
|
|
210
|
-
try {
|
|
211
|
-
db.exec("BEGIN IMMEDIATE;");
|
|
212
|
-
try {
|
|
213
|
-
db.query(`INSERT INTO deployments (sprite_id, status, preview_url, screenshot_path, error, sync_duration_ms, install_duration_ms, start_duration_ms)
|
|
214
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(spriteId, status, options?.previewUrl ?? null, options?.screenshotPath ?? null, options?.error ?? null, options?.syncDurationMs ?? null, options?.installDurationMs ?? null, options?.startDurationMs ?? null);
|
|
215
|
-
db.exec("COMMIT;");
|
|
216
|
-
}
|
|
217
|
-
catch (err) {
|
|
218
|
-
db.exec("ROLLBACK;");
|
|
219
|
-
throw err;
|
|
220
|
-
}
|
|
221
|
-
// Get the last inserted deployment
|
|
222
|
-
const row = db
|
|
223
|
-
.query("SELECT * FROM deployments WHERE sprite_id = ? ORDER BY id DESC LIMIT 1")
|
|
224
|
-
.get(spriteId);
|
|
225
|
-
if (!row) {
|
|
226
|
-
throw new Error(`Failed to record deployment for sprite ${spriteId}`);
|
|
227
|
-
}
|
|
228
|
-
return this.rowToDeployment(row);
|
|
229
|
-
}
|
|
230
|
-
finally {
|
|
231
|
-
db.close();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
updateDeployment(id, updates) {
|
|
235
|
-
const db = this.openDb();
|
|
236
|
-
try {
|
|
237
|
-
db.exec("BEGIN IMMEDIATE;");
|
|
238
|
-
try {
|
|
239
|
-
const existing = db.query("SELECT * FROM deployments WHERE id = ?").get(id);
|
|
240
|
-
if (!existing) {
|
|
241
|
-
db.exec("ROLLBACK;");
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
const setClauses = [];
|
|
245
|
-
const params = [];
|
|
246
|
-
if (updates.status !== undefined) {
|
|
247
|
-
setClauses.push("status = ?");
|
|
248
|
-
params.push(updates.status);
|
|
249
|
-
}
|
|
250
|
-
if (updates.previewUrl !== undefined) {
|
|
251
|
-
setClauses.push("preview_url = ?");
|
|
252
|
-
params.push(updates.previewUrl);
|
|
253
|
-
}
|
|
254
|
-
if (updates.screenshotPath !== undefined) {
|
|
255
|
-
setClauses.push("screenshot_path = ?");
|
|
256
|
-
params.push(updates.screenshotPath);
|
|
257
|
-
}
|
|
258
|
-
if (updates.stoppedAt !== undefined) {
|
|
259
|
-
setClauses.push("stopped_at = ?");
|
|
260
|
-
params.push(updates.stoppedAt);
|
|
261
|
-
}
|
|
262
|
-
if (updates.error !== undefined) {
|
|
263
|
-
setClauses.push("error = ?");
|
|
264
|
-
params.push(updates.error);
|
|
265
|
-
}
|
|
266
|
-
if (updates.syncDurationMs !== undefined) {
|
|
267
|
-
setClauses.push("sync_duration_ms = ?");
|
|
268
|
-
params.push(updates.syncDurationMs);
|
|
269
|
-
}
|
|
270
|
-
if (updates.installDurationMs !== undefined) {
|
|
271
|
-
setClauses.push("install_duration_ms = ?");
|
|
272
|
-
params.push(updates.installDurationMs);
|
|
273
|
-
}
|
|
274
|
-
if (updates.startDurationMs !== undefined) {
|
|
275
|
-
setClauses.push("start_duration_ms = ?");
|
|
276
|
-
params.push(updates.startDurationMs);
|
|
277
|
-
}
|
|
278
|
-
if (setClauses.length > 0) {
|
|
279
|
-
params.push(id);
|
|
280
|
-
db.query(`UPDATE deployments SET ${setClauses.join(", ")} WHERE id = ?`).run(...params);
|
|
281
|
-
}
|
|
282
|
-
db.exec("COMMIT;");
|
|
283
|
-
}
|
|
284
|
-
catch (err) {
|
|
285
|
-
db.exec("ROLLBACK;");
|
|
286
|
-
throw err;
|
|
287
|
-
}
|
|
288
|
-
const row = db.query("SELECT * FROM deployments WHERE id = ?").get(id);
|
|
289
|
-
return row ? this.rowToDeployment(row) : null;
|
|
290
|
-
}
|
|
291
|
-
finally {
|
|
292
|
-
db.close();
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
getDeployment(id) {
|
|
296
|
-
const db = this.openDb();
|
|
297
|
-
try {
|
|
298
|
-
const row = db.query("SELECT * FROM deployments WHERE id = ?").get(id);
|
|
299
|
-
if (!row)
|
|
300
|
-
return null;
|
|
301
|
-
return this.rowToDeployment(row);
|
|
302
|
-
}
|
|
303
|
-
finally {
|
|
304
|
-
db.close();
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
getLatestDeployment(spriteId) {
|
|
308
|
-
const db = this.openDb();
|
|
309
|
-
try {
|
|
310
|
-
const row = db
|
|
311
|
-
.query("SELECT * FROM deployments WHERE sprite_id = ? ORDER BY started_at DESC LIMIT 1")
|
|
312
|
-
.get(spriteId);
|
|
313
|
-
if (!row)
|
|
314
|
-
return null;
|
|
315
|
-
return this.rowToDeployment(row);
|
|
316
|
-
}
|
|
317
|
-
finally {
|
|
318
|
-
db.close();
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
listDeployments(spriteId, limit) {
|
|
322
|
-
const db = this.openDb();
|
|
323
|
-
try {
|
|
324
|
-
let sql = "SELECT * FROM deployments WHERE sprite_id = ? ORDER BY started_at DESC";
|
|
325
|
-
const params = [spriteId];
|
|
326
|
-
if (limit && limit > 0) {
|
|
327
|
-
sql += " LIMIT ?";
|
|
328
|
-
params.push(limit);
|
|
329
|
-
}
|
|
330
|
-
const rows = db.query(sql).all(...params);
|
|
331
|
-
return rows.map((r) => this.rowToDeployment(r));
|
|
332
|
-
}
|
|
333
|
-
finally {
|
|
334
|
-
db.close();
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
getActiveDeployments() {
|
|
338
|
-
const db = this.openDb();
|
|
339
|
-
try {
|
|
340
|
-
const rows = db
|
|
341
|
-
.query(`SELECT d.*, s.project_name, s.project_path, s.sprite_name, s.sprite_url, s.doppler_project, s.dev_command, s.port, s.created_at as sprite_created_at, s.updated_at as sprite_updated_at
|
|
342
|
-
FROM deployments d
|
|
343
|
-
JOIN sprites s ON d.sprite_id = s.id
|
|
344
|
-
WHERE d.status IN ('pending', 'syncing', 'installing', 'starting', 'running')
|
|
345
|
-
ORDER BY d.started_at DESC`)
|
|
346
|
-
.all();
|
|
347
|
-
return rows.map((r) => ({
|
|
348
|
-
...this.rowToDeployment(r),
|
|
349
|
-
sprite: {
|
|
350
|
-
id: Number(r.sprite_id),
|
|
351
|
-
project_name: String(r.project_name),
|
|
352
|
-
project_path: String(r.project_path),
|
|
353
|
-
sprite_name: String(r.sprite_name),
|
|
354
|
-
sprite_url: r.sprite_url === null || r.sprite_url === undefined ? null : String(r.sprite_url),
|
|
355
|
-
doppler_project: r.doppler_project === null || r.doppler_project === undefined
|
|
356
|
-
? null
|
|
357
|
-
: String(r.doppler_project),
|
|
358
|
-
dev_command: String(r.dev_command ?? "bun run dev"),
|
|
359
|
-
port: Number(r.port ?? 8080),
|
|
360
|
-
created_at: String(r.sprite_created_at ?? ""),
|
|
361
|
-
updated_at: String(r.sprite_updated_at ?? ""),
|
|
362
|
-
},
|
|
363
|
-
}));
|
|
364
|
-
}
|
|
365
|
-
finally {
|
|
366
|
-
db.close();
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export declare const PREVIEW_SCHEMA = "\nCREATE TABLE IF NOT EXISTS sprites (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_name TEXT UNIQUE NOT NULL,\n project_path TEXT NOT NULL,\n sprite_name TEXT NOT NULL,\n sprite_url TEXT,\n doppler_project TEXT,\n dev_command TEXT DEFAULT 'bun run dev',\n port INTEGER DEFAULT 8080,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS deployments (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n sprite_id INTEGER REFERENCES sprites(id),\n status TEXT NOT NULL,\n preview_url TEXT,\n screenshot_path TEXT,\n started_at TEXT DEFAULT (datetime('now')),\n stopped_at TEXT,\n error TEXT,\n sync_duration_ms INTEGER,\n install_duration_ms INTEGER,\n start_duration_ms INTEGER\n);\n\nCREATE INDEX IF NOT EXISTS idx_sprites_project ON sprites(project_name);\nCREATE INDEX IF NOT EXISTS idx_deployments_sprite ON deployments(sprite_id);\nCREATE INDEX IF NOT EXISTS idx_deployments_status ON deployments(status);\n";
|
|
2
|
-
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export const PREVIEW_SCHEMA = `
|
|
2
|
-
CREATE TABLE IF NOT EXISTS sprites (
|
|
3
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
4
|
-
project_name TEXT UNIQUE NOT NULL,
|
|
5
|
-
project_path TEXT NOT NULL,
|
|
6
|
-
sprite_name TEXT NOT NULL,
|
|
7
|
-
sprite_url TEXT,
|
|
8
|
-
doppler_project TEXT,
|
|
9
|
-
dev_command TEXT DEFAULT 'bun run dev',
|
|
10
|
-
port INTEGER DEFAULT 8080,
|
|
11
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
12
|
-
updated_at TEXT DEFAULT (datetime('now'))
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
CREATE TABLE IF NOT EXISTS deployments (
|
|
16
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
17
|
-
sprite_id INTEGER REFERENCES sprites(id),
|
|
18
|
-
status TEXT NOT NULL,
|
|
19
|
-
preview_url TEXT,
|
|
20
|
-
screenshot_path TEXT,
|
|
21
|
-
started_at TEXT DEFAULT (datetime('now')),
|
|
22
|
-
stopped_at TEXT,
|
|
23
|
-
error TEXT,
|
|
24
|
-
sync_duration_ms INTEGER,
|
|
25
|
-
install_duration_ms INTEGER,
|
|
26
|
-
start_duration_ms INTEGER
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
CREATE INDEX IF NOT EXISTS idx_sprites_project ON sprites(project_name);
|
|
30
|
-
CREATE INDEX IF NOT EXISTS idx_deployments_sprite ON deployments(sprite_id);
|
|
31
|
-
CREATE INDEX IF NOT EXISTS idx_deployments_status ON deployments(status);
|
|
32
|
-
`;
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export interface SpriteResult {
|
|
2
|
-
success: boolean;
|
|
3
|
-
stdout: string;
|
|
4
|
-
stderr: string;
|
|
5
|
-
error?: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Run a sprite CLI command and return the result
|
|
9
|
-
*/
|
|
10
|
-
export declare function runSprite(args: string[]): Promise<SpriteResult>;
|
|
11
|
-
/**
|
|
12
|
-
* Create a new sprite
|
|
13
|
-
*/
|
|
14
|
-
export declare function createSprite(name: string): Promise<SpriteResult>;
|
|
15
|
-
/**
|
|
16
|
-
* Destroy a sprite
|
|
17
|
-
*/
|
|
18
|
-
export declare function destroySprite(name: string): Promise<SpriteResult>;
|
|
19
|
-
/**
|
|
20
|
-
* Set sprite URL to public access
|
|
21
|
-
*/
|
|
22
|
-
export declare function makeUrlPublic(spriteName: string): Promise<SpriteResult>;
|
|
23
|
-
/**
|
|
24
|
-
* Get sprite URL
|
|
25
|
-
*/
|
|
26
|
-
export declare function getSpriteUrl(spriteName: string): Promise<string | null>;
|
|
27
|
-
/**
|
|
28
|
-
* Check if a sprite exists by listing all sprites
|
|
29
|
-
*/
|
|
30
|
-
export declare function spriteExists(name: string): Promise<boolean>;
|
|
31
|
-
/**
|
|
32
|
-
* Execute a command on a sprite
|
|
33
|
-
*/
|
|
34
|
-
export declare function execOnSprite(spriteName: string, command: string, options?: {
|
|
35
|
-
dir?: string;
|
|
36
|
-
env?: Record<string, string>;
|
|
37
|
-
files?: Array<{
|
|
38
|
-
local: string;
|
|
39
|
-
remote: string;
|
|
40
|
-
}>;
|
|
41
|
-
}): Promise<SpriteResult>;
|
|
42
|
-
/**
|
|
43
|
-
* Create a tarball of a project excluding common build artifacts
|
|
44
|
-
*/
|
|
45
|
-
/** Directories/files to exclude from tarball and watch (checked against full path and basename) */
|
|
46
|
-
export declare const EXCLUDE_PATTERNS: string[];
|
|
47
|
-
/** File extensions to exclude from tarball and watch (reduce size for large assets) */
|
|
48
|
-
export declare const EXCLUDE_EXTENSIONS: string[];
|
|
49
|
-
export declare function createProjectTarball(projectPath: string): Promise<string>;
|
|
50
|
-
/**
|
|
51
|
-
* Sync project files to sprite:
|
|
52
|
-
* 1. Create tarball locally
|
|
53
|
-
* 2. Upload via sprite exec -file
|
|
54
|
-
* 3. Extract on remote
|
|
55
|
-
*/
|
|
56
|
-
export declare function syncToSprite(spriteName: string, projectPath: string, remotePath?: string): Promise<{
|
|
57
|
-
success: boolean;
|
|
58
|
-
tarPath?: string;
|
|
59
|
-
error?: string;
|
|
60
|
-
syncDurationMs?: number;
|
|
61
|
-
}>;
|
|
62
|
-
/**
|
|
63
|
-
* Check if a process is running on the sprite
|
|
64
|
-
*/
|
|
65
|
-
export declare function isProcessRunning(spriteName: string, processPattern: string): Promise<boolean>;
|
|
66
|
-
/**
|
|
67
|
-
* Kill processes matching a pattern on the sprite
|
|
68
|
-
* Note: Uses lsof to find PIDs since pkill is not allowed
|
|
69
|
-
*/
|
|
70
|
-
export declare function killProcess(spriteName: string, processPattern: string): Promise<SpriteResult>;
|
|
71
|
-
/**
|
|
72
|
-
* Start a dev server on the sprite with health checking.
|
|
73
|
-
*
|
|
74
|
-
* Uses TTY session for proper PATH/environment on the sprite.
|
|
75
|
-
* Pipes output to a local log file so the detached process persists
|
|
76
|
-
* after the CLI exits. Polls the sprite URL until healthy (up to 90s).
|
|
77
|
-
*/
|
|
78
|
-
export declare function startDevServer(spriteName: string, devCommand: string, options?: {
|
|
79
|
-
dir?: string;
|
|
80
|
-
env?: Record<string, string>;
|
|
81
|
-
port?: number;
|
|
82
|
-
healthCheckUrl?: string;
|
|
83
|
-
healthCheckTimeoutMs?: number;
|
|
84
|
-
}): Promise<SpriteResult>;
|
|
85
|
-
//# sourceMappingURL=sprite.d.ts.map
|