@commandgarden/cli 1.1.3 → 1.1.4
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/node_modules/@commandgarden/app/dist/server/main.js +1 -1
- package/node_modules/@commandgarden/app/dist/server/store.js +70 -26
- package/node_modules/@commandgarden/app/package.json +1 -2
- package/node_modules/@commandgarden/daemon/dist/audit-store.d.ts +5 -1
- package/node_modules/@commandgarden/daemon/dist/audit-store.d.ts.map +1 -1
- package/node_modules/@commandgarden/daemon/dist/audit-store.js +69 -15
- package/node_modules/@commandgarden/daemon/dist/audit-store.js.map +1 -1
- package/node_modules/@commandgarden/daemon/dist/main.js +1 -1
- package/node_modules/@commandgarden/daemon/dist/main.js.map +1 -1
- package/node_modules/@commandgarden/daemon/package.json +1 -2
- package/package.json +2 -2
|
@@ -34,7 +34,7 @@ async function start() {
|
|
|
34
34
|
const port = readAppPort();
|
|
35
35
|
const daemonUrl = 'http://127.0.0.1:19825';
|
|
36
36
|
const daemon = new DaemonClient(daemonUrl, token);
|
|
37
|
-
const store =
|
|
37
|
+
const store = await AppStore.create(join(CG_HOME, 'app.db'));
|
|
38
38
|
const app = Fastify();
|
|
39
39
|
registerRoutes(app, daemon, store);
|
|
40
40
|
// Serve static SPA files in production
|
|
@@ -1,53 +1,97 @@
|
|
|
1
|
-
import
|
|
1
|
+
import initSqlJs from 'sql.js';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
2
4
|
import { randomUUID } from 'node:crypto';
|
|
3
5
|
export class AppStore {
|
|
4
6
|
db;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
this.db
|
|
8
|
-
this.
|
|
7
|
+
dbPath;
|
|
8
|
+
constructor(db, dbPath) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.dbPath = dbPath;
|
|
11
|
+
}
|
|
12
|
+
static async create(dbPath) {
|
|
13
|
+
const SQL = await initSqlJs();
|
|
14
|
+
let db;
|
|
15
|
+
if (dbPath !== ':memory:' && existsSync(dbPath)) {
|
|
16
|
+
const buf = readFileSync(dbPath);
|
|
17
|
+
db = new SQL.Database(buf);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
db = new SQL.Database();
|
|
21
|
+
}
|
|
22
|
+
const store = new AppStore(db, dbPath);
|
|
23
|
+
store.migrate();
|
|
24
|
+
if (dbPath !== ':memory:')
|
|
25
|
+
store.persist();
|
|
26
|
+
return store;
|
|
27
|
+
}
|
|
28
|
+
// sql.js requires full-DB export on every write; acceptable for small app databases.
|
|
29
|
+
// Write to a temp file then atomically rename to prevent corruption on crash.
|
|
30
|
+
persist() {
|
|
31
|
+
if (this.dbPath === ':memory:')
|
|
32
|
+
return;
|
|
33
|
+
const data = this.db.export();
|
|
34
|
+
const dir = dirname(this.dbPath);
|
|
35
|
+
mkdirSync(dir, { recursive: true });
|
|
36
|
+
const tmpPath = this.dbPath + '.tmp';
|
|
37
|
+
writeFileSync(tmpPath, Buffer.from(data));
|
|
38
|
+
renameSync(tmpPath, this.dbPath);
|
|
39
|
+
}
|
|
40
|
+
query(sql, params = []) {
|
|
41
|
+
const results = this.db.exec(sql, params);
|
|
42
|
+
if (results.length === 0)
|
|
43
|
+
return [];
|
|
44
|
+
const { columns, values } = results[0];
|
|
45
|
+
return values.map(row => {
|
|
46
|
+
const obj = {};
|
|
47
|
+
columns.forEach((col, i) => { obj[col] = row[i]; });
|
|
48
|
+
return obj;
|
|
49
|
+
});
|
|
9
50
|
}
|
|
10
51
|
migrate() {
|
|
11
|
-
this.db.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
);
|
|
23
|
-
`);
|
|
52
|
+
this.db.run(`CREATE TABLE IF NOT EXISTS preferences (
|
|
53
|
+
key TEXT PRIMARY KEY,
|
|
54
|
+
value TEXT NOT NULL
|
|
55
|
+
)`);
|
|
56
|
+
this.db.run(`CREATE TABLE IF NOT EXISTS saved_views (
|
|
57
|
+
id TEXT PRIMARY KEY,
|
|
58
|
+
app TEXT NOT NULL,
|
|
59
|
+
name TEXT NOT NULL,
|
|
60
|
+
config TEXT NOT NULL,
|
|
61
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
62
|
+
)`);
|
|
24
63
|
}
|
|
25
64
|
getPreference(key) {
|
|
26
|
-
const
|
|
27
|
-
return
|
|
65
|
+
const rows = this.query('SELECT value FROM preferences WHERE key = ?', [key]);
|
|
66
|
+
return rows.length > 0 ? rows[0].value : undefined;
|
|
28
67
|
}
|
|
29
68
|
setPreference(key, value) {
|
|
30
|
-
this.db.
|
|
69
|
+
this.db.run('INSERT OR REPLACE INTO preferences (key, value) VALUES (?, ?)', [key, value]);
|
|
70
|
+
this.persist();
|
|
31
71
|
}
|
|
32
72
|
getAllPreferences() {
|
|
33
|
-
const rows = this.
|
|
73
|
+
const rows = this.query('SELECT key, value FROM preferences');
|
|
34
74
|
const result = {};
|
|
35
75
|
for (const row of rows)
|
|
36
76
|
result[row.key] = row.value;
|
|
37
77
|
return result;
|
|
38
78
|
}
|
|
39
79
|
listViews(app) {
|
|
40
|
-
return this.
|
|
80
|
+
return this.query('SELECT * FROM saved_views WHERE app = ? ORDER BY created_at DESC', [app]);
|
|
41
81
|
}
|
|
42
82
|
createView(app, name, config) {
|
|
43
83
|
const id = randomUUID();
|
|
44
84
|
const created_at = new Date().toISOString();
|
|
45
|
-
this.db.
|
|
85
|
+
this.db.run('INSERT INTO saved_views (id, app, name, config, created_at) VALUES (?, ?, ?, ?, ?)', [id, app, name, config, created_at]);
|
|
86
|
+
this.persist();
|
|
46
87
|
return { id, app, name, config, created_at };
|
|
47
88
|
}
|
|
48
89
|
deleteView(id) {
|
|
49
|
-
|
|
50
|
-
|
|
90
|
+
this.db.run('DELETE FROM saved_views WHERE id = ?', [id]);
|
|
91
|
+
const changes = this.db.getRowsModified();
|
|
92
|
+
if (changes > 0)
|
|
93
|
+
this.persist();
|
|
94
|
+
return changes > 0;
|
|
51
95
|
}
|
|
52
96
|
close() {
|
|
53
97
|
this.db.close();
|
|
@@ -17,14 +17,13 @@
|
|
|
17
17
|
"@commandgarden/shared": "*",
|
|
18
18
|
"fastify": "^5.0.0",
|
|
19
19
|
"@fastify/static": "^8.0.0",
|
|
20
|
-
"
|
|
20
|
+
"sql.js": "^1.11.0",
|
|
21
21
|
"yaml": "^2.4.0",
|
|
22
22
|
"react": "^18.3.0",
|
|
23
23
|
"react-dom": "^18.3.0",
|
|
24
24
|
"react-router-dom": "^6.23.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/better-sqlite3": "^7.6.0",
|
|
28
27
|
"@types/node": "^22.0.0",
|
|
29
28
|
"@types/react": "^18.3.0",
|
|
30
29
|
"@types/react-dom": "^18.3.0",
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { AuditEvent } from '@commandgarden/shared';
|
|
2
2
|
export declare class AuditStore {
|
|
3
3
|
private db;
|
|
4
|
-
|
|
4
|
+
private dbPath;
|
|
5
|
+
private constructor();
|
|
6
|
+
static create(dbPath: string): Promise<AuditStore>;
|
|
7
|
+
private persist;
|
|
8
|
+
private query;
|
|
5
9
|
private migrate;
|
|
6
10
|
insert(event: AuditEvent): void;
|
|
7
11
|
list(opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,uBAAuB,CAAC;AAIrE,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;WAKM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BxD,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,OAAO;IAoBf,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAoB/B,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU,EAAE;IAW9F,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK3C,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAQpC,KAAK,IAAI,IAAI;IAEb,OAAO,CAAC,OAAO;CAoBhB"}
|
|
@@ -1,27 +1,67 @@
|
|
|
1
1
|
// src/audit-store.ts
|
|
2
|
-
import
|
|
3
|
-
import { chmodSync } from 'node:fs';
|
|
2
|
+
import initSqlJs from 'sql.js';
|
|
3
|
+
import { chmodSync, existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
4
5
|
export class AuditStore {
|
|
5
6
|
db;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
this.db
|
|
9
|
-
this.
|
|
7
|
+
dbPath;
|
|
8
|
+
constructor(db, dbPath) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.dbPath = dbPath;
|
|
11
|
+
}
|
|
12
|
+
static async create(dbPath) {
|
|
13
|
+
const SQL = await initSqlJs();
|
|
14
|
+
let db;
|
|
15
|
+
if (dbPath !== ':memory:' && existsSync(dbPath)) {
|
|
16
|
+
const buf = readFileSync(dbPath);
|
|
17
|
+
db = new SQL.Database(buf);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
db = new SQL.Database();
|
|
21
|
+
}
|
|
22
|
+
db.run(`CREATE TABLE IF NOT EXISTS audit_events (
|
|
10
23
|
id TEXT PRIMARY KEY, timestamp TEXT NOT NULL, type TEXT NOT NULL,
|
|
11
24
|
user TEXT NOT NULL, connector TEXT NOT NULL, args TEXT NOT NULL,
|
|
12
25
|
domains TEXT NOT NULL, capabilities TEXT NOT NULL, row_count INTEGER,
|
|
13
26
|
columns TEXT, duration_ms INTEGER NOT NULL, error TEXT, denial_reason TEXT
|
|
14
27
|
)`);
|
|
15
|
-
|
|
28
|
+
const store = new AuditStore(db, dbPath);
|
|
29
|
+
store.migrate();
|
|
16
30
|
if (dbPath !== ':memory:') {
|
|
31
|
+
store.persist();
|
|
17
32
|
try {
|
|
18
33
|
chmodSync(dbPath, 0o600);
|
|
19
34
|
}
|
|
20
35
|
catch { /* ignore for read-only fs */ }
|
|
21
36
|
}
|
|
37
|
+
return store;
|
|
38
|
+
}
|
|
39
|
+
// sql.js requires full-DB export on every write; acceptable for small audit databases.
|
|
40
|
+
// Write to a temp file then atomically rename to prevent corruption on crash.
|
|
41
|
+
persist() {
|
|
42
|
+
if (this.dbPath === ':memory:')
|
|
43
|
+
return;
|
|
44
|
+
const data = this.db.export();
|
|
45
|
+
const dir = dirname(this.dbPath);
|
|
46
|
+
mkdirSync(dir, { recursive: true });
|
|
47
|
+
const tmpPath = this.dbPath + '.tmp';
|
|
48
|
+
writeFileSync(tmpPath, Buffer.from(data));
|
|
49
|
+
renameSync(tmpPath, this.dbPath);
|
|
50
|
+
}
|
|
51
|
+
query(sql, params = []) {
|
|
52
|
+
const results = this.db.exec(sql, params);
|
|
53
|
+
if (results.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const { columns, values } = results[0];
|
|
56
|
+
return values.map(row => {
|
|
57
|
+
const obj = {};
|
|
58
|
+
columns.forEach((col, i) => { obj[col] = row[i]; });
|
|
59
|
+
return obj;
|
|
60
|
+
});
|
|
22
61
|
}
|
|
23
62
|
migrate() {
|
|
24
|
-
const
|
|
63
|
+
const colResults = this.db.exec('PRAGMA table_info(audit_events)');
|
|
64
|
+
const cols = new Set(colResults.length > 0 ? colResults[0].values.map(row => row[1]) : []);
|
|
25
65
|
const additions = [
|
|
26
66
|
['correlation_id', 'TEXT'],
|
|
27
67
|
['connector_hash', 'TEXT'],
|
|
@@ -32,15 +72,25 @@ export class AuditStore {
|
|
|
32
72
|
];
|
|
33
73
|
for (const [name, type] of additions) {
|
|
34
74
|
if (!cols.has(name)) {
|
|
35
|
-
this.db.
|
|
75
|
+
this.db.run(`ALTER TABLE audit_events ADD COLUMN ${name} ${type}`);
|
|
36
76
|
}
|
|
37
77
|
}
|
|
38
78
|
}
|
|
39
79
|
insert(event) {
|
|
40
|
-
this.db.
|
|
80
|
+
this.db.run(`INSERT INTO audit_events (id, timestamp, type, user, connector, args, domains,
|
|
41
81
|
capabilities, row_count, columns, duration_ms, error, denial_reason,
|
|
42
82
|
correlation_id, connector_hash, steps, source, previous_value, new_value)
|
|
43
|
-
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
|
83
|
+
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, [
|
|
84
|
+
event.id, event.timestamp, event.type, event.user, event.connector,
|
|
85
|
+
JSON.stringify(event.args), JSON.stringify(event.domains),
|
|
86
|
+
JSON.stringify(event.capabilities), event.rowCount ?? null,
|
|
87
|
+
event.columns ? JSON.stringify(event.columns) : null,
|
|
88
|
+
event.durationMs, event.error ?? null, event.denialReason ?? null,
|
|
89
|
+
event.correlationId ?? null, event.connectorHash ?? null,
|
|
90
|
+
event.steps ? JSON.stringify(event.steps) : null,
|
|
91
|
+
event.source ?? null, event.previousValue ?? null, event.newValue ?? null,
|
|
92
|
+
]);
|
|
93
|
+
this.persist();
|
|
44
94
|
}
|
|
45
95
|
list(opts) {
|
|
46
96
|
let sql = 'SELECT * FROM audit_events WHERE 1=1';
|
|
@@ -62,15 +112,19 @@ export class AuditStore {
|
|
|
62
112
|
sql += ' LIMIT ?';
|
|
63
113
|
params.push(opts.limit);
|
|
64
114
|
}
|
|
65
|
-
return this.
|
|
115
|
+
return this.query(sql, params).map(r => this.toEvent(r));
|
|
66
116
|
}
|
|
67
117
|
getById(id) {
|
|
68
|
-
const
|
|
69
|
-
return
|
|
118
|
+
const rows = this.query('SELECT * FROM audit_events WHERE id = ?', [id]);
|
|
119
|
+
return rows.length > 0 ? this.toEvent(rows[0]) : undefined;
|
|
70
120
|
}
|
|
71
121
|
prune(retentionDays) {
|
|
72
122
|
const cutoff = new Date(Date.now() - retentionDays * 86_400_000).toISOString();
|
|
73
|
-
|
|
123
|
+
this.db.run('DELETE FROM audit_events WHERE timestamp < ?', [cutoff]);
|
|
124
|
+
const changes = this.db.getRowsModified();
|
|
125
|
+
if (changes > 0)
|
|
126
|
+
this.persist();
|
|
127
|
+
return changes;
|
|
74
128
|
}
|
|
75
129
|
close() { this.db.close(); }
|
|
76
130
|
toEvent(r) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,
|
|
1
|
+
{"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ async function main() {
|
|
|
19
19
|
console.log(`Session token written to ${tokenPath}`);
|
|
20
20
|
// Audit store
|
|
21
21
|
const dbPath = expandHome(config.audit.dbPath);
|
|
22
|
-
const auditStore =
|
|
22
|
+
const auditStore = await AuditStore.create(dbPath);
|
|
23
23
|
const pruned = auditStore.prune(config.audit.retentionDays);
|
|
24
24
|
if (pruned > 0) {
|
|
25
25
|
console.log(`Pruned ${pruned} old audit events`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEtC,aAAa;IACb,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAChD,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IAErD,cAAc;IACd,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,12 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@commandgarden/shared": "*",
|
|
18
|
-
"
|
|
18
|
+
"sql.js": "^1.11.0",
|
|
19
19
|
"fastify": "^5.0.0",
|
|
20
20
|
"@fastify/websocket": "^11.0.0",
|
|
21
21
|
"yaml": "^2.4.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@types/better-sqlite3": "^7.6.0",
|
|
25
24
|
"@types/node": "^22.0.0",
|
|
26
25
|
"@types/ws": "^8.5.0",
|
|
27
26
|
"typescript": "^5.4.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commandgarden/cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "Enterprise browser automation CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"@commandgarden/shared": "*",
|
|
40
40
|
"@fastify/static": "^8.0.0",
|
|
41
41
|
"@fastify/websocket": "^11.0.0",
|
|
42
|
-
"
|
|
42
|
+
"sql.js": "^1.11.0",
|
|
43
43
|
"cli-table3": "^0.6.0",
|
|
44
44
|
"commander": "^12.0.0",
|
|
45
45
|
"fastify": "^5.0.0",
|