volute 0.29.0 → 0.30.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 +112 -13
- package/dist/{accept-666DIZX2.js → accept-E3PAH3QJ.js} +2 -2
- package/dist/{activity-events-BBIEA2F4.js → activity-events-BKBPPUBP.js} +2 -2
- package/dist/ai-service-VAJT5UBS.js +29 -0
- package/dist/api.d.ts +351 -477
- package/dist/{archive-UA4BDFXQ.js → archive-WWDBWYN2.js} +2 -2
- package/dist/{bridge-FQHZL3MC.js → bridge-RO37CUFM.js} +2 -2
- package/dist/{chat-KTPOR2JT.js → chat-TCUNPFGO.js} +8 -8
- package/dist/{chunk-FLZGS4QH.js → chunk-2C2VXEBB.js} +2 -2
- package/dist/chunk-2NDZC3S7.js +1330 -0
- package/dist/{chunk-IKRVFPWU.js → chunk-7D47T4RB.js} +3 -2
- package/dist/{chunk-AW7PFDVN.js → chunk-CVH6Y2YG.js} +1 -1
- package/dist/{chunk-XBLSAVJF.js → chunk-DTC6EH5I.js} +1 -1
- package/dist/{chunk-THUUIU3E.js → chunk-EFP3PE6C.js} +5 -5
- package/dist/{chunk-JGFVMROS.js → chunk-EFVHR7KH.js} +1 -1
- package/dist/{chunk-CQ7SNKNI.js → chunk-FSM45XD5.js} +1 -1
- package/dist/{chunk-LAC664WU.js → chunk-FXHXHI2A.js} +42 -24
- package/dist/{chunk-RKQEHRBB.js → chunk-G3GBKZGG.js} +1 -1
- package/dist/{chunk-H7OZRFJB.js → chunk-HHTXM4JT.js} +0 -49
- package/dist/{chunk-J4IBNXGJ.js → chunk-IKHDUZRH.js} +4 -3
- package/dist/{chunk-MD4C26II.js → chunk-JGFRDMR6.js} +1 -1
- package/dist/{chunk-EHZKEMMV.js → chunk-LIRWLNAK.js} +24 -10
- package/dist/{chunk-NI5FFCCS.js → chunk-MDPCSXZ4.js} +35 -11
- package/dist/chunk-NSBFETWP.js +188 -0
- package/dist/{chunk-VIVMW2H2.js → chunk-P27RV5WM.js} +1 -1
- package/dist/{chunk-EHYDTZTF.js → chunk-P7VFDSSG.js} +2 -2
- package/dist/{chunk-CMILSHZD.js → chunk-QVAQ5454.js} +84 -300
- package/dist/{chunk-HDN7MNGD.js → chunk-S5LR3XYJ.js} +1 -1
- package/dist/{chunk-2YP2TVDT.js → chunk-UPA6COHU.js} +5 -5
- package/dist/{chunk-AKPFNL7L.js → chunk-VGWJSNHS.js} +1 -1
- package/dist/{chunk-DUAUMCEE.js → chunk-W5OOPLNP.js} +3 -3
- package/dist/{chunk-2WPW7OT6.js → chunk-ZWKTUQEL.js} +1 -1
- package/dist/cli.js +22 -26
- package/dist/{clock-DGCBVGYA.js → clock-G3ALCMLJ.js} +10 -6
- package/dist/{cloud-sync-KILFGV5Q.js → cloud-sync-JV4LJOK3.js} +13 -12
- package/dist/{conversations-P5BL7RMX.js → conversations-7KVQV7EZ.js} +3 -3
- package/dist/{create-DFCAGEE5.js → create-JTLS7GX3.js} +2 -2
- package/dist/{create-QWV73WXD.js → create-VQSQHJQW.js} +1 -1
- package/dist/{daemon-client-I42FK2BF.js → daemon-client-BCTFGVCZ.js} +2 -2
- package/dist/{daemon-restart-UHOMICXT.js → daemon-restart-4JGBHEJ4.js} +7 -7
- package/dist/daemon.js +1257 -1022
- package/dist/{db-IC4J52XQ.js → db-HMFPIRO2.js} +1 -1
- package/dist/{delete-4JYGD4VN.js → delete-JESHKE7F.js} +1 -1
- package/dist/down-NGBMGORS.js +14 -0
- package/dist/{env-YJMUMFIY.js → env-CLXXT7M2.js} +2 -2
- package/dist/{export-BOJQWBMA.js → export-EGA5M5PB.js} +3 -3
- package/dist/extension-WZ4SUPJB.js +174 -0
- package/dist/extensions-ECO4RPFQ.js +27 -0
- package/dist/{files-M546TKVN.js → files-4VEJDASH.js} +3 -3
- package/dist/{history-ALPTNB3I.js → history-EJMMLXDO.js} +17 -2
- package/dist/{import-SRTQXBGH.js → import-YCGPMBSI.js} +3 -3
- package/dist/{join-J4QU42DL.js → join-2GBJKZEN.js} +1 -1
- package/dist/{list-R73GENNL.js → list-Q6O7FGAN.js} +2 -2
- package/dist/{login-3QZNR2DF.js → login-RET5WESK.js} +2 -2
- package/dist/{login-BKP3AFWN.js → login-RL6AU2SM.js} +3 -3
- package/dist/{logout-T53VKCPU.js → logout-CGAGJN3L.js} +2 -2
- package/dist/{logout-IQK7FNEK.js → logout-JRPBEMMR.js} +3 -3
- package/dist/message-delivery-6YMVNOEC.js +28 -0
- package/dist/{migrate-registry-to-db-XC7T5B7P.js → migrate-registry-to-db-FK35IPEH.js} +1 -1
- package/dist/{mind-S5V6CK5W.js → mind-LUWRQUQ5.js} +17 -17
- package/dist/{mind-activity-tracker-WRHFI3YW.js → mind-activity-tracker-VYN2ZZ2M.js} +3 -3
- package/dist/{mind-list-UPJ75GPI.js → mind-list-V5WW5DUA.js} +2 -2
- package/dist/{mind-manager-P66HQDNE.js → mind-manager-YFCOIAAX.js} +6 -6
- package/dist/{mind-sleep-BTSWQNAC.js → mind-sleep-R6PTNNW4.js} +2 -2
- package/dist/{mind-status-TK5AETEM.js → mind-status-I4ISFJ6I.js} +2 -2
- package/dist/{mind-wake-SBAKIDVP.js → mind-wake-67ZQEWAV.js} +2 -2
- package/dist/{package-OFKXNKJF.js → package-S2OAA5ZA.js} +11 -5
- package/dist/{pages-watcher-P7QECRE2.js → pages-watcher-Z3PKNROC.js} +3 -3
- package/dist/{read-36UFXN3G.js → read-WQMPTSN2.js} +2 -2
- package/dist/{register-CHREOMJ3.js → register-NZDSTLP3.js} +3 -3
- package/dist/{registry-NDNOOYG4.js → registry-ODSALQQL.js} +1 -1
- package/dist/{reject-LXIZFJ4Q.js → reject-2HZOJEIJ.js} +2 -2
- package/dist/{restart-6ESL3NBO.js → restart-QHS3NT64.js} +2 -2
- package/dist/{sandbox-5BW5HPXM.js → sandbox-O5FUSF43.js} +3 -3
- package/dist/{seed-SSUCYYDF.js → seed-WUQMPLDM.js} +1 -1
- package/dist/{send-TAOEZ4NH.js → send-OAN3RYYY.js} +20 -6
- package/dist/{setup-JHL5ZEST.js → setup-QMDK5RZX.js} +2 -2
- package/dist/{setup-RXYVGGT7.js → setup-XJH3E7YM.js} +45 -14
- package/dist/{skill-AUAQTSP5.js → skill-FZIN4W4Q.js} +65 -3
- package/dist/skills/volute-mind/SKILL.md +10 -19
- package/dist/sleep-manager-O7YQFCV5.js +30 -0
- package/dist/{split-TKJ5OT3P.js → split-EXYGGGQN.js} +1 -1
- package/dist/{sprout-UNT7LKKE.js → sprout-AXQ6H5DB.js} +8 -7
- package/dist/{start-EUJSS5R4.js → start-MTOVL6SY.js} +2 -2
- package/dist/{status-NQJYR4BG.js → status-ZRO37MWR.js} +5 -5
- package/dist/{stop-3XAITBBF.js → stop-OK5WEPVC.js} +2 -2
- package/dist/{systems-SMEFSHTA.js → systems-W3BBMSOZ.js} +5 -5
- package/dist/{tailscale-NY5MUMY3.js → tailscale-BM72RXCJ.js} +1 -1
- package/dist/{template-hash-BIMA4ILT.js → template-hash-3HOR4UAJ.js} +1 -1
- package/dist/up-BXUAIDXB.js +17 -0
- package/dist/{update-PTSH22AZ.js → update-PLPHMMZ2.js} +5 -5
- package/dist/{update-check-64FWC4Y2.js → update-check-CVCN7MF6.js} +2 -2
- package/dist/{upgrade-HA47CS4C.js → upgrade-I6NPCYUU.js} +1 -1
- package/dist/{version-notify-WDHRO3XD.js → version-notify-2NTWVEHL.js} +15 -14
- package/dist/web-assets/assets/index--kREqKl9.js +72 -0
- package/dist/web-assets/assets/index-BXYTG0nJ.css +1 -0
- package/dist/web-assets/ext-theme.css +111 -0
- package/dist/web-assets/index.html +2 -2
- package/package.json +11 -5
- package/packages/extensions/notes/dist/ui/assets/index-DgawVO5g.css +1 -0
- package/packages/extensions/notes/dist/ui/assets/index-qUWoeC4c.js +2 -0
- package/packages/extensions/notes/dist/ui/index.html +14 -0
- package/packages/extensions/notes/skills/notes/SKILL.md +62 -0
- package/packages/extensions/notes/skills/notes/scripts/notes.mjs +185 -0
- package/packages/extensions/pages/dist/ui/assets/index-D0HyS-xQ.css +1 -0
- package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +2 -0
- package/packages/extensions/pages/dist/ui/index.html +14 -0
- package/packages/extensions/pages/skills/pages/SKILL.md +58 -0
- package/templates/_base/home/VOLUTE.md +1 -1
- package/dist/chunk-P72MVS4R.js +0 -188
- package/dist/chunk-ZYGKG6VC.js +0 -22
- package/dist/down-LVBXEULC.js +0 -14
- package/dist/message-delivery-Q7VUMIEI.js +0 -27
- package/dist/notes-XCER3I7M.js +0 -220
- package/dist/pages-EUJR52AH.js +0 -36
- package/dist/publish-ZZB33WP4.js +0 -86
- package/dist/skills/notes/SKILL.md +0 -34
- package/dist/sleep-manager-G4B5GW5P.js +0 -29
- package/dist/status-S7UUPNRW.js +0 -38
- package/dist/up-W6VAK2XE.js +0 -17
- package/dist/web-assets/assets/index-BmKDnWDB.css +0 -1
- package/dist/web-assets/assets/index-CLJMx-GA.js +0 -71
|
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
|
|
|
4
4
|
// package.json
|
|
5
5
|
var package_default = {
|
|
6
6
|
name: "volute",
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.30.0",
|
|
8
8
|
description: "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
|
|
9
9
|
type: "module",
|
|
10
10
|
license: "MIT",
|
|
@@ -20,7 +20,8 @@ var package_default = {
|
|
|
20
20
|
"anthropic"
|
|
21
21
|
],
|
|
22
22
|
workspaces: [
|
|
23
|
-
"packages/*"
|
|
23
|
+
"packages/*",
|
|
24
|
+
"packages/extensions/*"
|
|
24
25
|
],
|
|
25
26
|
engines: {
|
|
26
27
|
node: ">=24"
|
|
@@ -37,11 +38,16 @@ var package_default = {
|
|
|
37
38
|
files: [
|
|
38
39
|
"dist/",
|
|
39
40
|
"drizzle/",
|
|
40
|
-
"templates/"
|
|
41
|
+
"templates/",
|
|
42
|
+
"packages/extensions/notes/dist/ui/",
|
|
43
|
+
"packages/extensions/notes/skills/",
|
|
44
|
+
"packages/extensions/pages/dist/ui/",
|
|
45
|
+
"packages/extensions/pages/skills/"
|
|
41
46
|
],
|
|
42
47
|
scripts: {
|
|
43
48
|
dev: "tsx src/cli.ts",
|
|
44
|
-
build: "tsup && cp -r skills dist/skills && npm run build:web",
|
|
49
|
+
build: "npm run build:ext && tsup && cp -r skills dist/skills && npm run build:web",
|
|
50
|
+
"build:ext": "npm run build:ui --workspace=packages/extensions/notes && npm run build:ui --workspace=packages/extensions/pages",
|
|
45
51
|
"build:web": "vite build --config src/web/ui/vite.config.ts",
|
|
46
52
|
"dev:web": "vite --config src/web/ui/vite.config.ts",
|
|
47
53
|
test: "node --import tsx --import ./test/setup.ts --test --test-force-exit --test-concurrency=4 $(find test -name '*.test.ts' ! -name 'daemon-e2e.test.ts' | sort)",
|
|
@@ -71,6 +77,7 @@ var package_default = {
|
|
|
71
77
|
"discord.js": "^14.25.1",
|
|
72
78
|
"drizzle-orm": "^0.45.1",
|
|
73
79
|
hono: "^4.11.7",
|
|
80
|
+
libsql: "^0.5.22",
|
|
74
81
|
telegraf: "^4.16.3",
|
|
75
82
|
zod: "^4.3.6"
|
|
76
83
|
},
|
|
@@ -87,7 +94,6 @@ var package_default = {
|
|
|
87
94
|
dompurify: "^3.3.1",
|
|
88
95
|
"drizzle-kit": "^0.31.8",
|
|
89
96
|
lefthook: "^2.1.0",
|
|
90
|
-
libsql: "^0.5.22",
|
|
91
97
|
marked: "^17.0.1",
|
|
92
98
|
svelte: "^5.53.0",
|
|
93
99
|
tsup: "^8.0.0",
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
startWatcher,
|
|
7
7
|
stopAllWatchers,
|
|
8
8
|
stopWatcher
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-EFP3PE6C.js";
|
|
10
|
+
import "./chunk-P27RV5WM.js";
|
|
11
11
|
import "./chunk-YUIHSKR6.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-HHTXM4JT.js";
|
|
13
13
|
import "./chunk-K3NQKI34.js";
|
|
14
14
|
export {
|
|
15
15
|
getCachedRecentPages,
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
parseArgs
|
|
10
10
|
} from "./chunk-D424ZQGI.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-HHTXM4JT.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/chat/read.ts
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
} from "./chunk-SSI47XP2.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
parseArgs
|
|
10
10
|
} from "./chunk-D424ZQGI.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-HHTXM4JT.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
|
|
14
|
-
// src/commands/
|
|
14
|
+
// src/commands/systems/register.ts
|
|
15
15
|
async function run(args) {
|
|
16
16
|
const { flags } = parseArgs(args, {
|
|
17
17
|
name: { type: "string" }
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
parseArgs
|
|
10
10
|
} from "./chunk-D424ZQGI.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-HHTXM4JT.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/chat/reject.ts
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient,
|
|
10
10
|
urlOf
|
|
11
11
|
} from "./chunk-4RQBJWQX.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-HHTXM4JT.js";
|
|
13
13
|
import "./chunk-K3NQKI34.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/restart.ts
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
isSandboxEnabled,
|
|
6
6
|
shellEscape,
|
|
7
7
|
wrapForSandbox
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IKHDUZRH.js";
|
|
9
9
|
import "./chunk-YUIHSKR6.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-7D47T4RB.js";
|
|
11
|
+
import "./chunk-HHTXM4JT.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
export {
|
|
14
14
|
buildDenyRead,
|
|
@@ -21,7 +21,7 @@ async function run(args) {
|
|
|
21
21
|
}
|
|
22
22
|
const template = flags.template ?? "claude";
|
|
23
23
|
const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
|
|
24
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
24
|
+
const { daemonFetch } = await import("./daemon-client-BCTFGVCZ.js");
|
|
25
25
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
26
26
|
const client = getClient();
|
|
27
27
|
const createRes = await daemonFetch(urlOf(client.api.minds.$url()), {
|
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
readStdin
|
|
4
|
-
} from "./chunk-ZYGKG6VC.js";
|
|
5
2
|
import {
|
|
6
3
|
resolveMindName
|
|
7
4
|
} from "./chunk-NAOW2CLO.js";
|
|
8
5
|
import {
|
|
9
6
|
daemonFetch
|
|
10
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
11
8
|
import {
|
|
12
9
|
getClient,
|
|
13
10
|
urlOf
|
|
14
11
|
} from "./chunk-4RQBJWQX.js";
|
|
15
12
|
import {
|
|
16
13
|
formatFileSize
|
|
17
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-JGFRDMR6.js";
|
|
18
15
|
import {
|
|
19
16
|
parseArgs
|
|
20
17
|
} from "./chunk-D424ZQGI.js";
|
|
21
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-HHTXM4JT.js";
|
|
22
19
|
import "./chunk-K3NQKI34.js";
|
|
23
20
|
|
|
24
21
|
// src/commands/send.ts
|
|
@@ -55,6 +52,23 @@ function parseTarget(target) {
|
|
|
55
52
|
};
|
|
56
53
|
}
|
|
57
54
|
|
|
55
|
+
// src/lib/read-stdin.ts
|
|
56
|
+
import { isatty } from "tty";
|
|
57
|
+
async function readStdin() {
|
|
58
|
+
if (isatty(0)) return void 0;
|
|
59
|
+
const chunks = [];
|
|
60
|
+
try {
|
|
61
|
+
for await (const chunk of process.stdin) {
|
|
62
|
+
chunks.push(chunk);
|
|
63
|
+
}
|
|
64
|
+
} catch (err) {
|
|
65
|
+
console.error(`Failed to read from stdin: ${err instanceof Error ? err.message : String(err)}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const text = Buffer.concat(chunks).toString().replace(/\r?\n$/, "");
|
|
69
|
+
return text || void 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
58
72
|
// src/commands/send.ts
|
|
59
73
|
async function isMind(name) {
|
|
60
74
|
try {
|
|
@@ -5,24 +5,24 @@ import {
|
|
|
5
5
|
SYSTEM_LAUNCHD_PLIST_PATH,
|
|
6
6
|
SYSTEM_SERVICE_PATH,
|
|
7
7
|
USER_SYSTEMD_UNIT
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FXHXHI2A.js";
|
|
9
9
|
import {
|
|
10
10
|
promptLine
|
|
11
11
|
} from "./chunk-SSI47XP2.js";
|
|
12
12
|
import {
|
|
13
13
|
resolveVoluteBin
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-CVH6Y2YG.js";
|
|
15
15
|
import {
|
|
16
16
|
ensureVoluteGroup
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-G3GBKZGG.js";
|
|
18
18
|
import {
|
|
19
19
|
readGlobalConfig,
|
|
20
20
|
writeGlobalConfig
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-7D47T4RB.js";
|
|
22
22
|
import {
|
|
23
23
|
parseArgs
|
|
24
24
|
} from "./chunk-D424ZQGI.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-HHTXM4JT.js";
|
|
26
26
|
import "./chunk-K3NQKI34.js";
|
|
27
27
|
|
|
28
28
|
// src/commands/setup.ts
|
|
@@ -46,20 +46,23 @@ function generatePlist(voluteBin, opts) {
|
|
|
46
46
|
if (opts.port != null) args.push("--port", String(opts.port));
|
|
47
47
|
if (opts.host) args.push("--host", opts.host);
|
|
48
48
|
const logPath = opts.system ? "/var/lib/volute/system/daemon.log" : resolve(homedir(), ".volute", "system", "daemon.log");
|
|
49
|
-
const envEntries = [
|
|
49
|
+
const envEntries = [
|
|
50
|
+
" <key>EnvironmentVariables</key>",
|
|
51
|
+
" <dict>",
|
|
52
|
+
` <key>PATH</key>`,
|
|
53
|
+
` <string>${escapeXml(buildServicePath(voluteBin))}</string>`
|
|
54
|
+
];
|
|
50
55
|
if (opts.system) {
|
|
51
56
|
envEntries.push(
|
|
52
|
-
" <key>EnvironmentVariables</key>",
|
|
53
|
-
" <dict>",
|
|
54
57
|
" <key>VOLUTE_HOME</key>",
|
|
55
58
|
" <string>/var/lib/volute</string>",
|
|
56
59
|
" <key>VOLUTE_MINDS_DIR</key>",
|
|
57
60
|
" <string>/minds</string>",
|
|
58
61
|
" <key>VOLUTE_ISOLATION</key>",
|
|
59
|
-
" <string>user</string>"
|
|
60
|
-
" </dict>"
|
|
62
|
+
" <string>user</string>"
|
|
61
63
|
);
|
|
62
64
|
}
|
|
65
|
+
envEntries.push(" </dict>");
|
|
63
66
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
64
67
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
65
68
|
<plist version="1.0">
|
|
@@ -70,7 +73,8 @@ function generatePlist(voluteBin, opts) {
|
|
|
70
73
|
<array>
|
|
71
74
|
${[voluteBin, ...args].map((a) => `<string>${escapeXml(a)}</string>`).join("\n ")}
|
|
72
75
|
</array>
|
|
73
|
-
${envEntries.
|
|
76
|
+
${envEntries.join("\n")}
|
|
77
|
+
<key>RunAtLoad</key>
|
|
74
78
|
<true/>
|
|
75
79
|
<key>KeepAlive</key>
|
|
76
80
|
<true/>
|
|
@@ -153,7 +157,12 @@ async function installUserService(voluteBin, port, host) {
|
|
|
153
157
|
mkdirSync(resolve(homedir(), "Library", "LaunchAgents"), { recursive: true });
|
|
154
158
|
writeFileSync(LAUNCHD_PLIST_PATH, generatePlist(voluteBin, { port, host }));
|
|
155
159
|
console.log(` Wrote ${LAUNCHD_PLIST_PATH}`);
|
|
156
|
-
|
|
160
|
+
const uid = `gui/${process.getuid()}`;
|
|
161
|
+
try {
|
|
162
|
+
await execFileAsync("launchctl", ["bootout", `${uid}/${LAUNCHD_PLIST_LABEL}`]);
|
|
163
|
+
} catch {
|
|
164
|
+
}
|
|
165
|
+
await execFileAsync("launchctl", ["bootstrap", uid, LAUNCHD_PLIST_PATH]);
|
|
157
166
|
console.log(" Service installed (launchd)");
|
|
158
167
|
return true;
|
|
159
168
|
} else if (platform === "linux") {
|
|
@@ -180,14 +189,20 @@ function installSystemService(voluteBin, port, host) {
|
|
|
180
189
|
);
|
|
181
190
|
console.log(` Wrote ${SYSTEM_LAUNCHD_PLIST_PATH}`);
|
|
182
191
|
try {
|
|
183
|
-
|
|
192
|
+
try {
|
|
193
|
+
execFileSync("launchctl", ["bootout", `system/${LAUNCHD_PLIST_LABEL}`]);
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
execFileSync("launchctl", ["bootstrap", "system", SYSTEM_LAUNCHD_PLIST_PATH]);
|
|
184
197
|
console.log(" Service installed (LaunchDaemon)");
|
|
185
198
|
return true;
|
|
186
199
|
} catch (err) {
|
|
187
200
|
console.warn(
|
|
188
201
|
` Warning: failed to load LaunchDaemon: ${err instanceof Error ? err.message : err}`
|
|
189
202
|
);
|
|
190
|
-
console.warn(
|
|
203
|
+
console.warn(
|
|
204
|
+
" Try: sudo launchctl bootstrap system /Library/LaunchDaemons/com.volute.daemon.plist"
|
|
205
|
+
);
|
|
191
206
|
return false;
|
|
192
207
|
}
|
|
193
208
|
} else if (platform === "linux") {
|
|
@@ -363,6 +378,22 @@ Install as a service (auto-start on boot)? [${serviceDefault}]: `;
|
|
|
363
378
|
if (port != null) config.port = port;
|
|
364
379
|
if (host) config.hostname = host;
|
|
365
380
|
writeGlobalConfig(config);
|
|
381
|
+
if (isInteractive) {
|
|
382
|
+
const wantAi = (await promptLine("\nConfigure an AI provider? (optional) [y/N]: ")).trim().toLowerCase();
|
|
383
|
+
if (wantAi === "y" || wantAi === "yes") {
|
|
384
|
+
const aiProvider = (await promptLine("Provider (anthropic, openai, google, etc.): ")).trim();
|
|
385
|
+
if (aiProvider) {
|
|
386
|
+
const aiApiKey = (await promptLine("API key (leave empty to use env var): ")).trim();
|
|
387
|
+
if (aiApiKey) {
|
|
388
|
+
const { saveProviderConfig } = await import("./ai-service-VAJT5UBS.js");
|
|
389
|
+
saveProviderConfig(aiProvider, { apiKey: aiApiKey });
|
|
390
|
+
console.log(` AI provider configured: ${aiProvider}`);
|
|
391
|
+
} else {
|
|
392
|
+
console.log(` Using env var for ${aiProvider} (no explicit key saved)`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
366
397
|
console.log(`
|
|
367
398
|
Done! Use \`volute mind create <name>\` to create your first mind.`);
|
|
368
399
|
}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient,
|
|
10
10
|
urlOf
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
parseArgs
|
|
14
14
|
} from "./chunk-D424ZQGI.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-HHTXM4JT.js";
|
|
16
16
|
import "./chunk-K3NQKI34.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/skill.ts
|
|
@@ -40,6 +40,9 @@ async function run(args) {
|
|
|
40
40
|
case "uninstall":
|
|
41
41
|
await uninstallSkill(args.slice(1));
|
|
42
42
|
break;
|
|
43
|
+
case "defaults":
|
|
44
|
+
await manageDefaults(args.slice(1));
|
|
45
|
+
break;
|
|
43
46
|
case "--help":
|
|
44
47
|
case "-h":
|
|
45
48
|
case void 0:
|
|
@@ -61,7 +64,10 @@ function printUsage() {
|
|
|
61
64
|
volute skill update --all --mind Update all installed skills
|
|
62
65
|
volute skill publish <name> --mind Publish a mind's skill to the shared repository
|
|
63
66
|
volute skill remove <name> Remove a shared skill
|
|
64
|
-
volute skill uninstall <name> --mind Uninstall a skill from a mind
|
|
67
|
+
volute skill uninstall <name> --mind Uninstall a skill from a mind
|
|
68
|
+
volute skill defaults List default skills for new minds
|
|
69
|
+
volute skill defaults add <name> Add a skill to the default set
|
|
70
|
+
volute skill defaults remove <name> Remove a skill from the default set`);
|
|
65
71
|
}
|
|
66
72
|
async function listSkills(args) {
|
|
67
73
|
const { flags } = parseArgs(args, { mind: { type: "string" } });
|
|
@@ -268,6 +274,62 @@ async function removeSkill(args) {
|
|
|
268
274
|
}
|
|
269
275
|
console.log(`Removed shared skill "${id}".`);
|
|
270
276
|
}
|
|
277
|
+
async function manageDefaults(args) {
|
|
278
|
+
const action = args[0];
|
|
279
|
+
if (!action || action === "list") {
|
|
280
|
+
const res = await daemonFetch("/api/skills/defaults/list");
|
|
281
|
+
if (!res.ok) {
|
|
282
|
+
const body = await res.json().catch(() => ({ error: "Unknown error" }));
|
|
283
|
+
console.error(`Error: ${body.error}`);
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
const { skills } = await res.json();
|
|
287
|
+
console.log("Default skills for new minds:\n");
|
|
288
|
+
for (const s of skills) {
|
|
289
|
+
console.log(` ${s}`);
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (action === "add") {
|
|
294
|
+
const skillId = args[1];
|
|
295
|
+
if (!skillId) {
|
|
296
|
+
console.error("Usage: volute skill defaults add <name>");
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
const res = await daemonFetch("/api/skills/defaults/list", {
|
|
300
|
+
method: "POST",
|
|
301
|
+
headers: { "Content-Type": "application/json" },
|
|
302
|
+
body: JSON.stringify({ skill: skillId })
|
|
303
|
+
});
|
|
304
|
+
if (!res.ok) {
|
|
305
|
+
const body = await res.json().catch(() => ({ error: "Unknown error" }));
|
|
306
|
+
console.error(`Error: ${body.error}`);
|
|
307
|
+
process.exit(1);
|
|
308
|
+
}
|
|
309
|
+
console.log(`Added "${skillId}" to default skills.`);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
if (action === "remove") {
|
|
313
|
+
const skillId = args[1];
|
|
314
|
+
if (!skillId) {
|
|
315
|
+
console.error("Usage: volute skill defaults remove <name>");
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
const res = await daemonFetch(`/api/skills/defaults/list/${encodeURIComponent(skillId)}`, {
|
|
319
|
+
method: "DELETE"
|
|
320
|
+
});
|
|
321
|
+
if (!res.ok) {
|
|
322
|
+
const body = await res.json().catch(() => ({ error: "Unknown error" }));
|
|
323
|
+
console.error(`Error: ${body.error}`);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
}
|
|
326
|
+
console.log(`Removed "${skillId}" from default skills.`);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
console.error(`Unknown defaults action: ${action}`);
|
|
330
|
+
console.log("Usage: volute skill defaults [add|remove] [<name>]");
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
271
333
|
async function uninstallSkill(args) {
|
|
272
334
|
const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
|
|
273
335
|
const mindName = resolveMindName(flags);
|
|
@@ -30,8 +30,8 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
|
|
|
30
30
|
| `volute mind upgrade [--template <name>] [--continue]` | Upgrade your server code |
|
|
31
31
|
| `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
|
|
32
32
|
| `volute mind disconnect <type>` | Disable a connector |
|
|
33
|
-
| `volute clock add --cron "..." --message/--script "..."` | Schedule a recurring task |
|
|
34
|
-
| `volute clock add --in <duration> --message/--script "..."` | Set a one-time timer (10m, 1h, 2h30m) |
|
|
33
|
+
| `volute clock add --id <name> --cron "..." --message/--script "..."` | Schedule a recurring task |
|
|
34
|
+
| `volute clock add --id <name> --in <duration> --message/--script "..."` | Set a one-time timer (10m, 1h, 2h30m) |
|
|
35
35
|
| `volute clock list` | List your schedules and timers |
|
|
36
36
|
| `volute clock remove --id <id>` | Remove a schedule or timer |
|
|
37
37
|
| `volute clock status` | Show sleep state + upcoming events |
|
|
@@ -51,8 +51,8 @@ The clock system manages your schedules, timers, and sleep/wake cycles. Use `vol
|
|
|
51
51
|
Set up recurring tasks using cron schedules. These send messages to you at specified times:
|
|
52
52
|
|
|
53
53
|
```sh
|
|
54
|
-
volute clock add --cron "0 9 * * *" --message "morning — review what's on your mind and write in your journal"
|
|
55
|
-
volute clock add --cron "0 0 * * 0" --message "weekly — consolidate your memory and reflect on the past week"
|
|
54
|
+
volute clock add --id morning --cron "0 9 * * *" --message "morning — review what's on your mind and write in your journal"
|
|
55
|
+
volute clock add --id weekly-review --cron "0 0 * * 0" --message "weekly — consolidate your memory and reflect on the past week"
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
You can also schedule scripts that run and deliver their output as a message (empty output is silent — no wake-up):
|
|
@@ -66,8 +66,8 @@ volute clock add --cron "*/30 * * * *" --script "cat status.txt" --id check-stat
|
|
|
66
66
|
Set one-time timers that fire once and then auto-delete:
|
|
67
67
|
|
|
68
68
|
```sh
|
|
69
|
-
volute clock add --in 30m --message "check on that task"
|
|
70
|
-
volute clock add --in 2h --message "time to review progress"
|
|
69
|
+
volute clock add --id check-task --in 30m --message "check on that task"
|
|
70
|
+
volute clock add --id review-progress --in 2h --message "time to review progress"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
Duration format: `30s`, `10m`, `1h`, `2h30m`.
|
|
@@ -77,8 +77,8 @@ Duration format: `30s`, `10m`, `1h`, `2h30m`.
|
|
|
77
77
|
Control what happens to a schedule when you're sleeping with `--while-sleeping`:
|
|
78
78
|
|
|
79
79
|
```sh
|
|
80
|
-
volute clock add --cron "0 3 * * *" --message "dream time" --channel system:dream --while-sleeping trigger-wake
|
|
81
|
-
volute clock add --cron "0 9 * * *" --message "morning check" --while-sleeping skip
|
|
80
|
+
volute clock add --id dream --cron "0 3 * * *" --message "dream time" --channel system:dream --while-sleeping trigger-wake
|
|
81
|
+
volute clock add --id morning-check --cron "0 9 * * *" --message "morning check" --while-sleeping skip
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
- `skip` — silently skip when sleeping
|
|
@@ -273,7 +273,7 @@ Your `shared/` directory is a collaborative space backed by git. Each mind works
|
|
|
273
273
|
|
|
274
274
|
**Conflicts:** If your merge fails due to conflicts, pull the latest (`volute shared pull`), reconcile the conflicting files, and merge again. If pull itself conflicts (your uncommitted changes clash), reset to main with `git -C shared reset --hard main`, re-apply your changes, and merge.
|
|
275
275
|
|
|
276
|
-
**Shared pages:** The `shared/pages/` directory is the system-level website. Any mind can contribute.
|
|
276
|
+
**Shared pages:** The `shared/pages/` directory is the system-level website. Any mind can contribute. Publishing is handled via the pages extension API.
|
|
277
277
|
|
|
278
278
|
## MCP Configuration
|
|
279
279
|
|
|
@@ -391,16 +391,7 @@ Route email like any other channel:
|
|
|
391
391
|
|
|
392
392
|
## Pages
|
|
393
393
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
```sh
|
|
397
|
-
volute pages publish # publish your public/pages/ directory
|
|
398
|
-
volute pages publish --system # publish the shared/pages/ system site
|
|
399
|
-
volute pages status # check your published URL and status
|
|
400
|
-
volute pages status --system # check the system site status
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
Your pages are served at `https://{system}.volute.systems/~{your-name}/`. Create an `index.html` in `home/public/pages/` to get started.
|
|
394
|
+
Create HTML files in `home/public/pages/` to publish web content. Pages are served locally and can be published to volute.systems via the pages extension API. See the pages skill for details.
|
|
404
395
|
|
|
405
396
|
Registration commands (usually run by the operator, not the mind):
|
|
406
397
|
```sh
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SleepManager,
|
|
4
|
+
getSleepManager,
|
|
5
|
+
getSleepManagerIfReady,
|
|
6
|
+
initSleepManager,
|
|
7
|
+
matchesGlob
|
|
8
|
+
} from "./chunk-QVAQ5454.js";
|
|
9
|
+
import "./chunk-FSM45XD5.js";
|
|
10
|
+
import "./chunk-LIRWLNAK.js";
|
|
11
|
+
import "./chunk-IKHDUZRH.js";
|
|
12
|
+
import "./chunk-2C2VXEBB.js";
|
|
13
|
+
import "./chunk-2NDZC3S7.js";
|
|
14
|
+
import "./chunk-P27RV5WM.js";
|
|
15
|
+
import "./chunk-MDPCSXZ4.js";
|
|
16
|
+
import "./chunk-ZWKTUQEL.js";
|
|
17
|
+
import "./chunk-YUIHSKR6.js";
|
|
18
|
+
import "./chunk-CVH6Y2YG.js";
|
|
19
|
+
import "./chunk-G3GBKZGG.js";
|
|
20
|
+
import "./chunk-7D47T4RB.js";
|
|
21
|
+
import "./chunk-A6TUJJ3L.js";
|
|
22
|
+
import "./chunk-HHTXM4JT.js";
|
|
23
|
+
import "./chunk-K3NQKI34.js";
|
|
24
|
+
export {
|
|
25
|
+
SleepManager,
|
|
26
|
+
getSleepManager,
|
|
27
|
+
getSleepManagerIfReady,
|
|
28
|
+
initSleepManager,
|
|
29
|
+
matchesGlob
|
|
30
|
+
};
|
|
@@ -27,7 +27,7 @@ async function run(args) {
|
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
|
29
29
|
if (!json) console.log("Creating variant via daemon...");
|
|
30
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
30
|
+
const { daemonFetch } = await import("./daemon-client-BCTFGVCZ.js");
|
|
31
31
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
32
32
|
const client = getClient();
|
|
33
33
|
const res = await daemonFetch(
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
getStandardSkillsWithExtensions
|
|
4
|
+
} from "./chunk-MDPCSXZ4.js";
|
|
5
5
|
import "./chunk-YUIHSKR6.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-CVH6Y2YG.js";
|
|
7
|
+
import "./chunk-G3GBKZGG.js";
|
|
8
|
+
import "./chunk-7D47T4RB.js";
|
|
8
9
|
import {
|
|
9
10
|
findMind,
|
|
10
11
|
mindDir
|
|
11
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-HHTXM4JT.js";
|
|
12
13
|
import "./chunk-K3NQKI34.js";
|
|
13
14
|
|
|
14
15
|
// src/commands/sprout.ts
|
|
@@ -48,11 +49,11 @@ async function run(_args) {
|
|
|
48
49
|
console.error("Write your MEMORY.md before sprouting.");
|
|
49
50
|
process.exit(1);
|
|
50
51
|
}
|
|
51
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
52
|
+
const { daemonFetch } = await import("./daemon-client-BCTFGVCZ.js");
|
|
52
53
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
53
54
|
const client = getClient();
|
|
54
55
|
const failedSkills = [];
|
|
55
|
-
for (const skillId of
|
|
56
|
+
for (const skillId of getStandardSkillsWithExtensions()) {
|
|
56
57
|
const skillDir = resolve(dir, "home", ".claude", "skills", skillId);
|
|
57
58
|
if (!existsSync(skillDir)) {
|
|
58
59
|
const installRes = await daemonFetch(
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
daemonFetch
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-EFVHR7KH.js";
|
|
5
5
|
import {
|
|
6
6
|
getClient,
|
|
7
7
|
urlOf
|
|
8
8
|
} from "./chunk-4RQBJWQX.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-HHTXM4JT.js";
|
|
10
10
|
import "./chunk-K3NQKI34.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/start.ts
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
getServiceMode,
|
|
10
10
|
modeLabel,
|
|
11
11
|
readDaemonConfig
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-FXHXHI2A.js";
|
|
13
13
|
import {
|
|
14
14
|
checkForUpdate
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-S5LR3XYJ.js";
|
|
16
|
+
import "./chunk-CVH6Y2YG.js";
|
|
17
|
+
import "./chunk-G3GBKZGG.js";
|
|
18
|
+
import "./chunk-HHTXM4JT.js";
|
|
19
19
|
import "./chunk-K3NQKI34.js";
|
|
20
20
|
|
|
21
21
|
// src/commands/status.ts
|
|
@@ -4,12 +4,12 @@ import {
|
|
|
4
4
|
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EFVHR7KH.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient,
|
|
10
10
|
urlOf
|
|
11
11
|
} from "./chunk-4RQBJWQX.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-HHTXM4JT.js";
|
|
13
13
|
import "./chunk-K3NQKI34.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/stop.ts
|