volute 0.26.0 → 0.28.0
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/README.md +18 -18
- package/dist/accept-666DIZX2.js +41 -0
- package/dist/{activity-events-ZMBAKLUF.js → activity-events-BBIEA2F4.js} +2 -3
- package/dist/api.d.ts +510 -299
- package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
- package/dist/bridge-FQHZL3MC.js +206 -0
- package/dist/chat-M4SX42JD.js +68 -0
- package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
- package/dist/{chunk-5Y3PBKW6.js → chunk-2YP2TVDT.js} +138 -56
- package/dist/{chunk-3CFRE2VC.js → chunk-AAPXKR5V.js} +435 -1090
- package/dist/{chunk-YJA7P64S.js → chunk-AW7PFDVN.js} +5 -5
- package/dist/{chunk-OZFKBXD6.js → chunk-EHYDTZTF.js} +6 -6
- package/dist/{chunk-WBHMQ5OZ.js → chunk-H7OZRFJB.js} +192 -12
- package/dist/{chunk-ON3FF5JA.js → chunk-HDN7MNGD.js} +3 -3
- package/dist/chunk-IAYBDWVG.js +477 -0
- package/dist/{chunk-TZKJLDQN.js → chunk-IKRVFPWU.js} +14 -9
- package/dist/{chunk-UTL75LP6.js → chunk-J4IBNXGJ.js} +20 -22
- package/dist/{chunk-WGOGUMPO.js → chunk-JGFVMROS.js} +13 -6
- package/dist/{chunk-NWI2425I.js → chunk-K5NAC55T.js} +1 -1
- package/dist/chunk-KTLFDYPT.js +61 -0
- package/dist/{chunk-V63B7DX3.js → chunk-LAC664WU.js} +7 -4
- package/dist/chunk-MD4C26II.js +128 -0
- package/dist/{chunk-USNBKHYG.js → chunk-NI5FFCCS.js} +12 -7
- package/dist/{chunk-3TV4GLFO.js → chunk-P72MVS4R.js} +4 -43
- package/dist/{chunk-2VO7453N.js → chunk-POSXWWTA.js} +30 -54
- package/dist/{chunk-XOXLRRR2.js → chunk-RKQEHRBB.js} +4 -3
- package/dist/{chunk-LX22GRG7.js → chunk-SGVNFZHW.js} +11 -8
- package/dist/chunk-T6HKBWXZ.js +23 -0
- package/dist/{chunk-J2CO4WEV.js → chunk-VIVMW2H2.js} +4 -4
- package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
- package/dist/cli.js +32 -49
- package/dist/{cloud-sync-NI2K3C7G.js → cloud-sync-HDL6PHZI.js} +14 -14
- package/dist/connectors/discord-bridge.js +158 -0
- package/dist/connectors/slack-bridge.js +119 -0
- package/dist/connectors/telegram-bridge.js +133 -0
- package/dist/conversations-M2K4253F.js +55 -0
- package/dist/create-D7J73A6H.js +45 -0
- package/dist/{create-4YBRTTJS.js → create-QWV73WXD.js} +1 -1
- package/dist/{daemon-client-Z7FAJ6JW.js → daemon-client-I42FK2BF.js} +2 -2
- package/dist/{daemon-restart-BJZ3O4U4.js → daemon-restart-G4B2OYAB.js} +7 -7
- package/dist/daemon.js +1889 -1216
- package/dist/db-IC4J52XQ.js +8 -0
- package/dist/{delete-27OYNK25.js → delete-4JYGD4VN.js} +1 -1
- package/dist/down-LVBXEULC.js +14 -0
- package/dist/{env-M336ONDP.js → env-YJMUMFIY.js} +2 -2
- package/dist/{export-HP4G5DQC.js → export-BOJQWBMA.js} +4 -4
- package/dist/files-M546TKVN.js +46 -0
- package/dist/{history-B64GTFTD.js → history-ALPTNB3I.js} +5 -5
- package/dist/{import-XIB7UV4S.js → import-SRTQXBGH.js} +4 -4
- package/dist/join-J4QU42DL.js +66 -0
- package/dist/list-R73GENNL.js +40 -0
- package/dist/{login-B5E7N7MY.js → login-3QZNR2DF.js} +4 -4
- package/dist/{login-6U7U6BNG.js → login-BKP3AFWN.js} +8 -18
- package/dist/logout-IQK7FNEK.js +20 -0
- package/dist/{logout-XSJRYS3U.js → logout-T53VKCPU.js} +4 -4
- package/dist/message-delivery-HV3S6HZV.js +24 -0
- package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
- package/dist/{mind-HZ3QSDDJ.js → mind-S5V6CK5W.js} +29 -34
- package/dist/{mind-activity-tracker-4G6FURY2.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
- package/dist/mind-list-UPJ75GPI.js +29 -0
- package/dist/mind-manager-S6ILZVX3.js +18 -0
- package/dist/{mind-sleep-DTV7L44D.js → mind-sleep-BTSWQNAC.js} +4 -4
- package/dist/mind-status-TK5AETEM.js +55 -0
- package/dist/{mind-wake-PFN4FN3T.js → mind-wake-SBAKIDVP.js} +4 -4
- package/dist/{notes-37FW2UR2.js → notes-XCER3I7M.js} +11 -21
- package/dist/{package-VZWLXPHV.js → package-CG4RWUGP.js} +1 -1
- package/dist/{pages-DIIT5HMQ.js → pages-KJDJX4TA.js} +5 -5
- package/dist/{publish-HQV7YREB.js → publish-ZZB33WP4.js} +9 -20
- package/dist/read-36UFXN3G.js +46 -0
- package/dist/{register-EFND67FQ.js → register-CHREOMJ3.js} +6 -25
- package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
- package/dist/reject-LXIZFJ4Q.js +39 -0
- package/dist/{restart-CCK7D6TV.js → restart-6ESL3NBO.js} +5 -5
- package/dist/{sandbox-EHGFF52K.js → sandbox-5BW5HPXM.js} +3 -3
- package/dist/{schedule-6F7ELB2M.js → schedule-QTJMFATP.js} +5 -5
- package/dist/{seed-E5OQGWX3.js → seed-SSUCYYDF.js} +2 -2
- package/dist/{send-IH6XZKPC.js → send-TAOEZ4NH.js} +87 -23
- package/dist/{setup-YGAAIKKZ.js → setup-JHL5ZEST.js} +2 -2
- package/dist/{setup-F6TWFYGQ.js → setup-RXYVGGT7.js} +9 -9
- package/dist/{skill-42LGFBQC.js → skill-AUAQTSP5.js} +5 -5
- package/dist/skills/dreaming/references/INSTALL.md +2 -2
- package/dist/skills/orientation/SKILL.md +3 -3
- package/dist/skills/shared-files/SKILL.md +44 -0
- package/dist/skills/shared-files/scripts/merge.ts +72 -0
- package/dist/skills/shared-files/scripts/pull.ts +52 -0
- package/dist/skills/volute-mind/SKILL.md +35 -34
- package/dist/sleep-manager-WMVG2VCL.js +28 -0
- package/dist/split-TKJ5OT3P.js +63 -0
- package/dist/{sprout-QL74KR2X.js → sprout-UNT7LKKE.js} +6 -7
- package/dist/{start-O5JQASRC.js → start-EUJSS5R4.js} +2 -2
- package/dist/status-NQJYR4BG.js +114 -0
- package/dist/{status-LV34BG6G.js → status-S7UUPNRW.js} +4 -14
- package/dist/{stop-2SOG5NYF.js → stop-3XAITBBF.js} +5 -5
- package/dist/systems-SMEFSHTA.js +60 -0
- package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
- package/dist/up-GM2JOH2Y.js +17 -0
- package/dist/{update-5VUDAI3D.js → update-PTSH22AZ.js} +9 -9
- package/dist/{update-check-F5Z3ALXX.js → update-check-64FWC4Y2.js} +2 -2
- package/dist/{upgrade-QCCO33BK.js → upgrade-HA47CS4C.js} +12 -5
- package/dist/variant-7TGZHOU3.js +41 -0
- package/dist/{version-notify-USFZBWMG.js → version-notify-JDUF4HQJ.js} +24 -29
- package/dist/web-assets/assets/index-BZGvToHi.css +1 -0
- package/dist/web-assets/assets/index-Cz4TrpzB.js +75 -0
- package/dist/web-assets/favicon.png +0 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0017_minds.sql +16 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +1 -1
- package/templates/_base/.init/.config/prompts.json +2 -2
- package/templates/_base/home/VOLUTE.md +5 -5
- package/templates/_base/src/lib/logger.ts +0 -4
- package/templates/_base/src/lib/startup.ts +2 -2
- package/dist/auth-4TV573WE.js +0 -37
- package/dist/channel-ZVZV42UD.js +0 -260
- package/dist/chunk-B2CPS4QU.js +0 -283
- package/dist/chunk-HFCBO2GL.js +0 -50
- package/dist/chunk-RWKVSSLY.js +0 -26
- package/dist/chunk-SIAG3QMM.js +0 -42
- package/dist/chunk-WSLPZF72.js +0 -173
- package/dist/connector-G722WXAU.js +0 -147
- package/dist/connectors/discord.js +0 -177
- package/dist/connectors/slack.js +0 -181
- package/dist/connectors/telegram.js +0 -187
- package/dist/down-7UKFMJJZ.js +0 -14
- package/dist/file-HUDKTRAS.js +0 -204
- package/dist/log-PBFNILJ4.js +0 -39
- package/dist/logout-UKD5LA37.js +0 -18
- package/dist/logs-3CART7O7.js +0 -77
- package/dist/merge-VK2HSKMA.js +0 -46
- package/dist/message-delivery-MS5JYPZX.js +0 -25
- package/dist/mind-manager-VVK67AY3.js +0 -19
- package/dist/pull-2MB4SK3C.js +0 -39
- package/dist/service-LLBV3R7M.js +0 -122
- package/dist/shared-UMO4S7CC.js +0 -39
- package/dist/sleep-manager-EE4NRN2Q.js +0 -29
- package/dist/status-FZBEBM7Q.js +0 -70
- package/dist/status-WXD4HXRL.js +0 -35
- package/dist/up-SDMCSVI3.js +0 -17
- package/dist/variant-WWLDY6D5.js +0 -207
- package/dist/web-assets/assets/index-CUQ31ieL.js +0 -69
- package/dist/web-assets/assets/index-CW8NSl1o.css +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
wrapForIsolation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RKQEHRBB.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/exec.ts
|
|
7
7
|
import { execFile as execFileCb, execFileSync, spawn } from "child_process";
|
|
8
|
-
function exec(cmd, args, options) {
|
|
9
|
-
const [wrappedCmd, wrappedArgs] = options?.mindName ? wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
8
|
+
async function exec(cmd, args, options) {
|
|
9
|
+
const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
10
10
|
return new Promise((resolve, reject) => {
|
|
11
11
|
execFileCb(
|
|
12
12
|
wrappedCmd,
|
|
@@ -35,8 +35,8 @@ function resolveVoluteBin() {
|
|
|
35
35
|
throw new Error("Could not find volute binary on PATH");
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
function execInherit(cmd, args, options) {
|
|
39
|
-
const [wrappedCmd, wrappedArgs] = options?.mindName ? wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
38
|
+
async function execInherit(cmd, args, options) {
|
|
39
|
+
const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
40
40
|
return new Promise((resolve, reject) => {
|
|
41
41
|
const child = spawn(wrappedCmd, wrappedArgs, {
|
|
42
42
|
cwd: options?.cwd,
|
|
@@ -5,19 +5,19 @@ import {
|
|
|
5
5
|
pollHealthDown,
|
|
6
6
|
readDaemonConfig,
|
|
7
7
|
stopService
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-LAC664WU.js";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
10
|
+
voluteSystemDir
|
|
11
|
+
} from "./chunk-H7OZRFJB.js";
|
|
12
12
|
|
|
13
13
|
// src/commands/down.ts
|
|
14
14
|
import { existsSync, readFileSync, unlinkSync } from "fs";
|
|
15
15
|
import { resolve } from "path";
|
|
16
16
|
async function stopDaemon() {
|
|
17
|
-
const
|
|
18
|
-
const pidPath = resolve(
|
|
17
|
+
const systemDir = voluteSystemDir();
|
|
18
|
+
const pidPath = resolve(systemDir, "daemon.pid");
|
|
19
19
|
if (!existsSync(pidPath)) {
|
|
20
|
-
const configPath = resolve(
|
|
20
|
+
const configPath = resolve(systemDir, "daemon.json");
|
|
21
21
|
let port = 1618;
|
|
22
22
|
let hostname = "localhost";
|
|
23
23
|
if (existsSync(configPath)) {
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
voluteHome
|
|
4
|
-
} from "./chunk-B2CPS4QU.js";
|
|
5
2
|
import {
|
|
6
3
|
__export
|
|
7
4
|
} from "./chunk-K3NQKI34.js";
|
|
8
5
|
|
|
6
|
+
// src/lib/db.ts
|
|
7
|
+
import { chmodSync, existsSync } from "fs";
|
|
8
|
+
import { dirname as dirname2, resolve as resolve2 } from "path";
|
|
9
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
10
|
+
import { drizzle } from "drizzle-orm/libsql";
|
|
11
|
+
import { migrate } from "drizzle-orm/libsql/migrator";
|
|
12
|
+
|
|
13
|
+
// src/lib/registry.ts
|
|
14
|
+
import { mkdirSync } from "fs";
|
|
15
|
+
import { homedir } from "os";
|
|
16
|
+
import { dirname, resolve } from "path";
|
|
17
|
+
import { fileURLToPath } from "url";
|
|
18
|
+
import { eq, isNull } from "drizzle-orm";
|
|
19
|
+
|
|
9
20
|
// src/lib/schema.ts
|
|
10
21
|
var schema_exports = {};
|
|
11
22
|
__export(schema_exports, {
|
|
@@ -16,6 +27,7 @@ __export(schema_exports, {
|
|
|
16
27
|
deliveryQueue: () => deliveryQueue,
|
|
17
28
|
messages: () => messages,
|
|
18
29
|
mindHistory: () => mindHistory,
|
|
30
|
+
minds: () => minds,
|
|
19
31
|
noteComments: () => noteComments,
|
|
20
32
|
noteReactions: () => noteReactions,
|
|
21
33
|
notes: () => notes,
|
|
@@ -26,6 +38,22 @@ __export(schema_exports, {
|
|
|
26
38
|
});
|
|
27
39
|
import { sql } from "drizzle-orm";
|
|
28
40
|
import { index, integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
|
|
41
|
+
var minds = sqliteTable(
|
|
42
|
+
"minds",
|
|
43
|
+
{
|
|
44
|
+
name: text("name").primaryKey(),
|
|
45
|
+
port: integer("port").notNull().unique(),
|
|
46
|
+
parent: text("parent").references(() => minds.name, { onDelete: "cascade" }),
|
|
47
|
+
dir: text("dir"),
|
|
48
|
+
branch: text("branch"),
|
|
49
|
+
stage: text("stage"),
|
|
50
|
+
template: text("template"),
|
|
51
|
+
template_hash: text("template_hash"),
|
|
52
|
+
running: integer("running").notNull().default(0),
|
|
53
|
+
created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
|
|
54
|
+
},
|
|
55
|
+
(table) => [index("idx_minds_parent").on(table.parent)]
|
|
56
|
+
);
|
|
29
57
|
var users = sqliteTable("users", {
|
|
30
58
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
31
59
|
username: text("username").unique().notNull(),
|
|
@@ -208,18 +236,148 @@ var messages = sqliteTable(
|
|
|
208
236
|
(table) => [index("idx_messages_conversation_id").on(table.conversation_id)]
|
|
209
237
|
);
|
|
210
238
|
|
|
239
|
+
// src/lib/registry.ts
|
|
240
|
+
function voluteHome() {
|
|
241
|
+
if (process.env.VOLUTE_HOME) return process.env.VOLUTE_HOME;
|
|
242
|
+
const dir = dirname(fileURLToPath(import.meta.url));
|
|
243
|
+
if (dir.endsWith("/src/lib")) {
|
|
244
|
+
throw new Error(
|
|
245
|
+
'VOLUTE_HOME must be set when running from source. For tests, run via "npm test" or add "--import ./test/setup.ts".'
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
return resolve(homedir(), ".volute");
|
|
249
|
+
}
|
|
250
|
+
function voluteUserHome() {
|
|
251
|
+
if (process.env.VOLUTE_USER_HOME) return process.env.VOLUTE_USER_HOME;
|
|
252
|
+
return resolve(homedir(), ".volute");
|
|
253
|
+
}
|
|
254
|
+
function voluteSystemDir() {
|
|
255
|
+
return resolve(voluteHome(), "system");
|
|
256
|
+
}
|
|
257
|
+
function ensureSystemDir() {
|
|
258
|
+
mkdirSync(voluteSystemDir(), { recursive: true });
|
|
259
|
+
}
|
|
260
|
+
function ensureVoluteHome() {
|
|
261
|
+
const mindsBase = process.env.VOLUTE_MINDS_DIR ?? resolve(voluteHome(), "minds");
|
|
262
|
+
mkdirSync(mindsBase, { recursive: true });
|
|
263
|
+
ensureSystemDir();
|
|
264
|
+
}
|
|
265
|
+
function rowToEntry(row) {
|
|
266
|
+
return {
|
|
267
|
+
name: row.name,
|
|
268
|
+
port: row.port,
|
|
269
|
+
created: row.created_at,
|
|
270
|
+
running: row.running === 1,
|
|
271
|
+
stage: row.stage ?? (row.parent ? void 0 : "sprouted"),
|
|
272
|
+
template: row.template ?? void 0,
|
|
273
|
+
templateHash: row.template_hash ?? void 0,
|
|
274
|
+
parent: row.parent ?? void 0,
|
|
275
|
+
dir: row.dir ?? void 0,
|
|
276
|
+
branch: row.branch ?? void 0
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async function readRegistry() {
|
|
280
|
+
const db2 = await getDb();
|
|
281
|
+
const rows = await db2.select().from(minds).where(isNull(minds.parent));
|
|
282
|
+
return rows.map(rowToEntry);
|
|
283
|
+
}
|
|
284
|
+
async function readAllMinds() {
|
|
285
|
+
const db2 = await getDb();
|
|
286
|
+
const rows = await db2.select().from(minds);
|
|
287
|
+
return rows.map(rowToEntry);
|
|
288
|
+
}
|
|
289
|
+
var MIND_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
|
|
290
|
+
var MIND_NAME_MAX = 64;
|
|
291
|
+
function validateMindName(name) {
|
|
292
|
+
if (!name) return "Mind name is required";
|
|
293
|
+
if (name.length > MIND_NAME_MAX) return `Mind name must be at most ${MIND_NAME_MAX} characters`;
|
|
294
|
+
if (!MIND_NAME_RE.test(name)) {
|
|
295
|
+
return "Mind name must start with alphanumeric and contain only alphanumeric, dots, dashes, or underscores";
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
async function addMind(name, port, stage, template) {
|
|
300
|
+
const err = validateMindName(name);
|
|
301
|
+
if (err) throw new Error(err);
|
|
302
|
+
const db2 = await getDb();
|
|
303
|
+
await db2.insert(minds).values({ name, port, stage: stage ?? null, template: template ?? null }).onConflictDoUpdate({
|
|
304
|
+
target: minds.name,
|
|
305
|
+
set: { port, stage: stage ?? null, template: template ?? null }
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
async function addVariant(name, parent, port, dir, branch) {
|
|
309
|
+
const err = validateMindName(name);
|
|
310
|
+
if (err) throw new Error(err);
|
|
311
|
+
const db2 = await getDb();
|
|
312
|
+
await db2.insert(minds).values({ name, port, parent, dir, branch }).onConflictDoUpdate({
|
|
313
|
+
target: minds.name,
|
|
314
|
+
set: { port, parent, dir, branch }
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
async function removeMind(name) {
|
|
318
|
+
const db2 = await getDb();
|
|
319
|
+
await db2.delete(minds).where(eq(minds.name, name));
|
|
320
|
+
}
|
|
321
|
+
async function setMindRunning(name, running) {
|
|
322
|
+
const db2 = await getDb();
|
|
323
|
+
await db2.update(minds).set({ running: running ? 1 : 0 }).where(eq(minds.name, name));
|
|
324
|
+
}
|
|
325
|
+
async function setMindStage(name, stage) {
|
|
326
|
+
const db2 = await getDb();
|
|
327
|
+
await db2.update(minds).set({ stage }).where(eq(minds.name, name));
|
|
328
|
+
}
|
|
329
|
+
async function setMindTemplateHash(name, hash) {
|
|
330
|
+
const db2 = await getDb();
|
|
331
|
+
await db2.update(minds).set({ template_hash: hash }).where(eq(minds.name, name));
|
|
332
|
+
}
|
|
333
|
+
async function findMind(name) {
|
|
334
|
+
const db2 = await getDb();
|
|
335
|
+
const rows = await db2.select().from(minds).where(eq(minds.name, name));
|
|
336
|
+
if (rows.length === 0) return void 0;
|
|
337
|
+
return rowToEntry(rows[0]);
|
|
338
|
+
}
|
|
339
|
+
async function findVariants(parent) {
|
|
340
|
+
const db2 = await getDb();
|
|
341
|
+
const rows = await db2.select().from(minds).where(eq(minds.parent, parent));
|
|
342
|
+
return rows.map(rowToEntry);
|
|
343
|
+
}
|
|
344
|
+
async function getBaseName(name) {
|
|
345
|
+
const entry = await findMind(name);
|
|
346
|
+
return entry?.parent ?? name;
|
|
347
|
+
}
|
|
348
|
+
function mindDir(name) {
|
|
349
|
+
if (process.env.VOLUTE_MINDS_DIR) {
|
|
350
|
+
return resolve(process.env.VOLUTE_MINDS_DIR, name);
|
|
351
|
+
}
|
|
352
|
+
return resolve(voluteHome(), "minds", name);
|
|
353
|
+
}
|
|
354
|
+
function stateDir(name) {
|
|
355
|
+
return resolve(voluteSystemDir(), "state", name);
|
|
356
|
+
}
|
|
357
|
+
async function nextPort() {
|
|
358
|
+
const db2 = await getDb();
|
|
359
|
+
const rows = await db2.select({ port: minds.port }).from(minds);
|
|
360
|
+
const usedPorts = new Set(rows.map((r) => r.port));
|
|
361
|
+
const basePort = parseInt(process.env.VOLUTE_BASE_PORT || "4100", 10);
|
|
362
|
+
let port = basePort;
|
|
363
|
+
while (usedPorts.has(port)) port++;
|
|
364
|
+
if (port > 65535) throw new Error("No available ports \u2014 all ports 4100-65535 are allocated");
|
|
365
|
+
return port;
|
|
366
|
+
}
|
|
367
|
+
function daemonLoopback() {
|
|
368
|
+
const host = process.env.VOLUTE_DAEMON_HOSTNAME || "127.0.0.1";
|
|
369
|
+
if (host === "0.0.0.0") return "127.0.0.1";
|
|
370
|
+
if (host === "::") return "[::1]";
|
|
371
|
+
return host;
|
|
372
|
+
}
|
|
373
|
+
|
|
211
374
|
// src/lib/db.ts
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
import { fileURLToPath } from "url";
|
|
215
|
-
import { drizzle } from "drizzle-orm/libsql";
|
|
216
|
-
import { migrate } from "drizzle-orm/libsql/migrator";
|
|
217
|
-
var __dirname = dirname(fileURLToPath(import.meta.url));
|
|
218
|
-
var migrationsFolder = existsSync(resolve(__dirname, "../drizzle")) ? resolve(__dirname, "../drizzle") : resolve(__dirname, "../../drizzle");
|
|
375
|
+
var __dirname = dirname2(fileURLToPath2(import.meta.url));
|
|
376
|
+
var migrationsFolder = existsSync(resolve2(__dirname, "../drizzle")) ? resolve2(__dirname, "../drizzle") : resolve2(__dirname, "../../drizzle");
|
|
219
377
|
var db = null;
|
|
220
378
|
async function getDb() {
|
|
221
379
|
if (db) return db;
|
|
222
|
-
const dbPath = process.env.VOLUTE_DB_PATH ||
|
|
380
|
+
const dbPath = process.env.VOLUTE_DB_PATH || resolve2(voluteSystemDir(), "volute.db");
|
|
223
381
|
db = drizzle({ connection: { url: `file:${dbPath}` }, schema: schema_exports });
|
|
224
382
|
await migrate(db, { migrationsFolder });
|
|
225
383
|
try {
|
|
@@ -234,6 +392,7 @@ async function getDb() {
|
|
|
234
392
|
}
|
|
235
393
|
|
|
236
394
|
export {
|
|
395
|
+
minds,
|
|
237
396
|
users,
|
|
238
397
|
conversations,
|
|
239
398
|
mindHistory,
|
|
@@ -248,5 +407,26 @@ export {
|
|
|
248
407
|
noteComments,
|
|
249
408
|
noteReactions,
|
|
250
409
|
messages,
|
|
251
|
-
getDb
|
|
410
|
+
getDb,
|
|
411
|
+
voluteHome,
|
|
412
|
+
voluteUserHome,
|
|
413
|
+
voluteSystemDir,
|
|
414
|
+
ensureSystemDir,
|
|
415
|
+
ensureVoluteHome,
|
|
416
|
+
readRegistry,
|
|
417
|
+
readAllMinds,
|
|
418
|
+
validateMindName,
|
|
419
|
+
addMind,
|
|
420
|
+
addVariant,
|
|
421
|
+
removeMind,
|
|
422
|
+
setMindRunning,
|
|
423
|
+
setMindStage,
|
|
424
|
+
setMindTemplateHash,
|
|
425
|
+
findMind,
|
|
426
|
+
findVariants,
|
|
427
|
+
getBaseName,
|
|
428
|
+
mindDir,
|
|
429
|
+
stateDir,
|
|
430
|
+
nextPort,
|
|
431
|
+
daemonLoopback
|
|
252
432
|
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
voluteSystemDir
|
|
4
|
+
} from "./chunk-H7OZRFJB.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/update-check.ts
|
|
7
7
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
8
8
|
import { resolve } from "path";
|
|
9
9
|
var CACHE_TTL = 60 * 60 * 1e3;
|
|
10
10
|
function cachePath() {
|
|
11
|
-
return resolve(
|
|
11
|
+
return resolve(voluteSystemDir(), "update-check.json");
|
|
12
12
|
}
|
|
13
13
|
function readCache() {
|
|
14
14
|
try {
|