niahere 0.2.8 → 0.2.9
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/package.json +3 -2
- package/src/cli/index.ts +7 -0
- package/src/commands/db.ts +130 -0
- package/src/commands/init.ts +7 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "niahere",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"description": "A personal AI assistant daemon — scheduled jobs, chat across Telegram and Slack, persona system, and visual identity.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"test": "tsc --noEmit && LOG_LEVEL=silent bun test --reporter=dots",
|
|
12
12
|
"test:bun": "bun test",
|
|
13
13
|
"typecheck": "tsc --noEmit",
|
|
14
|
-
"seed": "bun run src/db/seed.ts"
|
|
14
|
+
"seed": "bun run src/db/seed.ts",
|
|
15
|
+
"release": "npm version patch && npm publish && git push"
|
|
15
16
|
},
|
|
16
17
|
"keywords": [
|
|
17
18
|
"ai",
|
package/src/cli/index.ts
CHANGED
|
@@ -238,6 +238,12 @@ switch (command) {
|
|
|
238
238
|
break;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
+
case "db": {
|
|
242
|
+
const { dbCommand } = await import("../commands/db");
|
|
243
|
+
await dbCommand();
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
|
|
241
247
|
case "test": {
|
|
242
248
|
const verbose = process.argv.includes("-v") || process.argv.includes("--verbose");
|
|
243
249
|
const extraArgs = process.argv.slice(3).filter((a) => a !== "-v" && a !== "--verbose");
|
|
@@ -285,6 +291,7 @@ switch (command) {
|
|
|
285
291
|
console.log(" history [room] — recent messages");
|
|
286
292
|
console.log(" logs [-f] — daemon logs");
|
|
287
293
|
console.log(" job <sub> — manage jobs");
|
|
294
|
+
console.log(" db <sub> — database setup/status/migrate");
|
|
288
295
|
console.log(" skills — list available skills");
|
|
289
296
|
console.log(" send [-c ch] <msg> — send a message via channel");
|
|
290
297
|
console.log(" telegram <token> — configure telegram");
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { getConfig } from "../utils/config";
|
|
2
|
+
import { runMigrations } from "../db/migrate";
|
|
3
|
+
import { closeDb, getSql } from "../db/connection";
|
|
4
|
+
import { errMsg } from "../utils/errors";
|
|
5
|
+
|
|
6
|
+
export async function dbSetup(): Promise<void> {
|
|
7
|
+
console.log("Setting up PostgreSQL...\n");
|
|
8
|
+
|
|
9
|
+
const pgCheck = Bun.spawnSync(["which", "psql"]);
|
|
10
|
+
const hasPostgres = pgCheck.exitCode === 0;
|
|
11
|
+
|
|
12
|
+
if (!hasPostgres) {
|
|
13
|
+
if (process.platform === "darwin") {
|
|
14
|
+
console.log(" PostgreSQL not found. Installing via Homebrew...");
|
|
15
|
+
const brew = Bun.spawn(["brew", "install", "postgresql@17"], { stdout: "inherit", stderr: "inherit" });
|
|
16
|
+
if (await brew.exited !== 0) {
|
|
17
|
+
console.log(" \u2717 brew install failed. Install manually: brew install postgresql@17");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.log(" \u2713 PostgreSQL installed");
|
|
21
|
+
|
|
22
|
+
console.log(" Starting PostgreSQL...");
|
|
23
|
+
const start = Bun.spawn(["brew", "services", "start", "postgresql@17"], { stdout: "pipe", stderr: "pipe" });
|
|
24
|
+
if (await start.exited !== 0) {
|
|
25
|
+
console.log(" \u2717 could not start. Try: brew services start postgresql@17");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log(" \u2713 PostgreSQL started");
|
|
29
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
30
|
+
} else {
|
|
31
|
+
console.log(" PostgreSQL not found.");
|
|
32
|
+
console.log(" Install it:");
|
|
33
|
+
console.log(" Ubuntu/Debian: sudo apt install postgresql");
|
|
34
|
+
console.log(" Fedora: sudo dnf install postgresql-server");
|
|
35
|
+
console.log(" Arch: sudo pacman -S postgresql");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
const ready = Bun.spawnSync(["pg_isready"]);
|
|
40
|
+
if (ready.exitCode !== 0) {
|
|
41
|
+
console.log(" PostgreSQL installed but not running.");
|
|
42
|
+
if (process.platform === "darwin") {
|
|
43
|
+
console.log(" Starting...");
|
|
44
|
+
const start = Bun.spawn(["brew", "services", "start", "postgresql@17"], { stdout: "pipe", stderr: "pipe" });
|
|
45
|
+
await start.exited;
|
|
46
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
47
|
+
if (Bun.spawnSync(["pg_isready"]).exitCode === 0) {
|
|
48
|
+
console.log(" \u2713 PostgreSQL started");
|
|
49
|
+
} else {
|
|
50
|
+
console.log(" \u2717 could not start. Check: brew services list");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
console.log(" Start it: sudo systemctl start postgresql");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
console.log(" \u2713 PostgreSQL running");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Create database
|
|
63
|
+
const config = getConfig();
|
|
64
|
+
const dbName = config.database_url.split("/").pop() || "niahere";
|
|
65
|
+
const createDb = Bun.spawnSync(["createdb", dbName]);
|
|
66
|
+
if (createDb.exitCode === 0) {
|
|
67
|
+
console.log(` \u2713 database "${dbName}" created`);
|
|
68
|
+
} else {
|
|
69
|
+
const stderr = new TextDecoder().decode(createDb.stderr);
|
|
70
|
+
if (stderr.includes("already exists")) {
|
|
71
|
+
console.log(` \u2713 database "${dbName}" already exists`);
|
|
72
|
+
} else {
|
|
73
|
+
console.log(` \u2717 createdb failed: ${stderr.trim()}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Run migrations
|
|
79
|
+
try {
|
|
80
|
+
await runMigrations();
|
|
81
|
+
console.log(" \u2713 migrations done");
|
|
82
|
+
await closeDb();
|
|
83
|
+
} catch (err) {
|
|
84
|
+
console.log(` \u2717 migrations failed: ${errMsg(err)}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log("\nDatabase ready.");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function dbCommand(): Promise<void> {
|
|
91
|
+
const sub = process.argv[3];
|
|
92
|
+
|
|
93
|
+
switch (sub) {
|
|
94
|
+
case "setup":
|
|
95
|
+
await dbSetup();
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
case "migrate": {
|
|
99
|
+
try {
|
|
100
|
+
await runMigrations();
|
|
101
|
+
console.log("Migrations done.");
|
|
102
|
+
await closeDb();
|
|
103
|
+
} catch (err) {
|
|
104
|
+
console.log(`Failed: ${errMsg(err)}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
case "status": {
|
|
111
|
+
try {
|
|
112
|
+
const sql = getSql();
|
|
113
|
+
await sql`SELECT 1`;
|
|
114
|
+
console.log("Database: connected");
|
|
115
|
+
await closeDb();
|
|
116
|
+
} catch (err) {
|
|
117
|
+
console.log(`Database: unavailable (${errMsg(err)})`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
default:
|
|
124
|
+
console.log("Usage: nia db <command>\n");
|
|
125
|
+
console.log(" setup — install PostgreSQL + create database + migrate");
|
|
126
|
+
console.log(" migrate — run database migrations");
|
|
127
|
+
console.log(" status — check database connection");
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
package/src/commands/init.ts
CHANGED
|
@@ -114,7 +114,13 @@ export async function runInit(): Promise<void> {
|
|
|
114
114
|
} catch (err) {
|
|
115
115
|
const msg = errMsg(err);
|
|
116
116
|
console.log(` \u2717 could not connect: ${msg}`);
|
|
117
|
-
|
|
117
|
+
const setupDb = await ask(rl, " Set up PostgreSQL now? (y/n)", "y");
|
|
118
|
+
if (setupDb.toLowerCase() === "y") {
|
|
119
|
+
const { dbSetup } = await import("./db");
|
|
120
|
+
await dbSetup();
|
|
121
|
+
} else {
|
|
122
|
+
console.log(` (run 'nia db setup' later)\n`);
|
|
123
|
+
}
|
|
118
124
|
}
|
|
119
125
|
delete process.env.DATABASE_URL;
|
|
120
126
|
|