volute 0.22.0 → 0.24.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 +5 -5
- package/dist/{activity-events-3WHHCOBB.js → activity-events-4O37J7PD.js} +2 -2
- package/dist/api.d.ts +306 -15
- package/dist/{channel-BOOMFULW.js → channel-HZOSHGNF.js} +1 -1
- package/dist/{chunk-QIXPN3OO.js → chunk-2767L2RZ.js} +5 -5
- package/dist/{chunk-SGPEZ32F.js → chunk-33XAVCS4.js} +16 -0
- package/dist/{chunk-VT5QODNE.js → chunk-3AIBT4TW.js} +4 -3
- package/dist/{chunk-RK627D57.js → chunk-4TJ72QQ3.js} +2 -2
- package/dist/{chunk-A4S7H6G6.js → chunk-BFK6SOEJ.js} +1 -1
- package/dist/{chunk-HGCDWKSP.js → chunk-E7GOKNOT.js} +1 -1
- package/dist/{chunk-VNVCRVYI.js → chunk-NOBRGACV.js} +7 -7
- package/dist/{chunk-OSFGKF2T.js → chunk-OOW675I3.js} +839 -129
- package/dist/{chunk-TFS25FIM.js → chunk-P3W36ZGD.js} +1 -1
- package/dist/{chunk-JNFRY2WU.js → chunk-TQDITGES.js} +33 -15
- package/dist/{chunk-KFI7TQJ6.js → chunk-TRQEV3CD.js} +9 -5
- package/dist/cli.js +18 -18
- package/dist/{cloud-sync-C6WRYRVR.js → cloud-sync-DIU3OCPV.js} +6 -8
- package/dist/{connector-PYT5UOTZ.js → connector-M6XFI6GM.js} +1 -1
- package/dist/{create-WIDA3M4C.js → create-VDQJER52.js} +1 -1
- package/dist/{daemon-client-ZHCDL4RS.js → daemon-client-JOVQZ52X.js} +1 -1
- package/dist/{daemon-restart-TPQ2XBRZ.js → daemon-restart-YMPEATQH.js} +5 -5
- package/dist/daemon.js +697 -865
- package/dist/{delete-LOIANQGD.js → delete-2MRR4JX5.js} +1 -1
- package/dist/{down-WSUASL5E.js → down-674SX2IZ.js} +2 -2
- package/dist/{env-4PHIHTF4.js → env-2FPOZK37.js} +1 -1
- package/dist/{export-XD6PJBQP.js → export-IKFAPRAO.js} +1 -1
- package/dist/{file-X4L5TTOL.js → file-KT3UIQM3.js} +1 -1
- package/dist/{history-HTEKRNID.js → history-46WZN5CN.js} +1 -1
- package/dist/{import-EAXTHHXL.js → import-FRDPQPJ2.js} +1 -1
- package/dist/{log-SRO5Q6AD.js → log-6SGSSR3D.js} +1 -1
- package/dist/{logs-HNTNNBDW.js → logs-HRBONI5I.js} +1 -1
- package/dist/{merge-B6SYTGI7.js → merge-KSFJKX6T.js} +1 -1
- package/dist/{message-delivery-WUS4K4ZC.js → message-delivery-S7BCNV6Y.js} +9 -7
- package/dist/{mind-BTXR5B3C.js → mind-KPLCRKQA.js} +17 -17
- package/dist/{mind-activity-tracker-PGC3DBJ7.js → mind-activity-tracker-NMDDEV3K.js} +3 -3
- package/dist/{mind-manager-P5OBDUKI.js → mind-manager-ZNRIYEK3.js} +2 -2
- package/dist/{mind-sleep-FWRBIFBS.js → mind-sleep-GHPTSAYN.js} +1 -1
- package/dist/{mind-wake-LJK2YU5X.js → mind-wake-BJDJFMDF.js} +1 -1
- package/dist/{package-A7PEYJI2.js → package-S5YF25XV.js} +1 -1
- package/dist/{pull-GRQAXM2E.js → pull-D32SPFVU.js} +1 -1
- package/dist/{restart-CIDAKGG2.js → restart-5BMNV7KU.js} +1 -1
- package/dist/{schedule-NLR3LZLY.js → schedule-YEFDLVMJ.js} +1 -1
- package/dist/{seed-3H2MRREW.js → seed-6FEKB3YC.js} +1 -1
- package/dist/{send-RP2TA7SG.js → send-IISDYFCL.js} +1 -1
- package/dist/{service-7BFXDI6J.js → service-FASYWLTC.js} +3 -3
- package/dist/{setup-SSIIXQMI.js → setup-BMLM2UTK.js} +1 -1
- package/dist/{shared-2OGT3NSL.js → shared-LWMNTTZN.js} +4 -4
- package/dist/{skill-Q2Y6PQ3L.js → skill-BQOFACEI.js} +1 -1
- package/dist/skills/volute-mind/SKILL.md +71 -1
- package/dist/{sleep-manager-3RWUX2ZR.js → sleep-manager-XXSWQQLE.js} +5 -5
- package/dist/{sprout-UKCYBGHK.js → sprout-CGSW4CF5.js} +3 -3
- package/dist/{start-JR6CUUWF.js → start-C7XITZ5O.js} +1 -1
- package/dist/{status-5XDGYHKP.js → status-LYS4NUOZ.js} +1 -1
- package/dist/{status-H2MKDN6L.js → status-SIRPLEZC.js} +4 -3
- package/dist/{stop-VKPGK25U.js → stop-CVKBSLXY.js} +1 -1
- package/dist/tailscale-AJ4VL5XK.js +49 -0
- package/dist/{up-JKGC7PPF.js → up-OMHACRJL.js} +2 -2
- package/dist/{update-ELC6MEUT.js → update-7XCZMYBT.js} +7 -7
- package/dist/{upgrade-GXW2EQY3.js → upgrade-7RUIXGOO.js} +1 -1
- package/dist/{variant-A4I7PHXS.js → variant-UGREB4G5.js} +4 -4
- package/dist/{version-notify-5FGUAVSF.js → version-notify-SZ75QRGO.js} +5 -5
- package/dist/web-assets/assets/index-Bx9WDoaQ.js +69 -0
- package/dist/web-assets/assets/index-Clz8OhmJ.css +1 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0013_user_profiles.sql +3 -0
- package/drizzle/0014_conversation_reads.sql +7 -0
- package/drizzle/meta/0013_snapshot.json +7 -0
- package/drizzle/meta/_journal.json +14 -0
- package/package.json +1 -1
- package/templates/_base/src/lib/file-handler.ts +6 -1
- package/templates/_base/src/lib/format-prefix.ts +18 -2
- package/templates/_base/src/lib/routing.ts +2 -1
- package/templates/_base/src/lib/types.ts +8 -0
- package/templates/claude/src/lib/stream-consumer.ts +10 -1
- package/templates/pi/src/lib/content.ts +18 -3
- package/templates/pi/src/lib/event-handler.ts +9 -1
- package/dist/chunk-G5KRTU2F.js +0 -76
- package/dist/web-assets/assets/index-DWBxl4LO.js +0 -69
- package/dist/web-assets/assets/index-ZqMd1mx1.css +0 -1
- /package/dist/{pages-YSTRWJR4.js → pages-TWR6U7DS.js} +0 -0
|
@@ -13,7 +13,7 @@ async function run(args) {
|
|
|
13
13
|
force: { type: "boolean" }
|
|
14
14
|
});
|
|
15
15
|
const name = resolveMindName({ mind: positional[0] });
|
|
16
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
16
|
+
const { daemonFetch } = await import("./daemon-client-JOVQZ52X.js");
|
|
17
17
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
18
18
|
const client = getClient();
|
|
19
19
|
const url = urlOf(client.api.minds[":name"].$url({ param: { name } })) + (flags.force ? "?force=true" : "");
|
|
@@ -63,7 +63,7 @@ async function run(args) {
|
|
|
63
63
|
});
|
|
64
64
|
if (includeHistory) {
|
|
65
65
|
try {
|
|
66
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
66
|
+
const { daemonFetch } = await import("./daemon-client-JOVQZ52X.js");
|
|
67
67
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
68
68
|
const client = getClient();
|
|
69
69
|
const res = await daemonFetch(
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
deliverMessage,
|
|
4
|
-
extractTextContent
|
|
5
|
-
|
|
4
|
+
extractTextContent,
|
|
5
|
+
recordInbound
|
|
6
|
+
} from "./chunk-OOW675I3.js";
|
|
6
7
|
import "./chunk-HFCBO2GL.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-E7GOKNOT.js";
|
|
9
|
+
import "./chunk-BFK6SOEJ.js";
|
|
10
|
+
import "./chunk-NOBRGACV.js";
|
|
10
11
|
import "./chunk-XLC342FO.js";
|
|
11
12
|
import "./chunk-PHU4DEAJ.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-33XAVCS4.js";
|
|
13
14
|
import "./chunk-YUIHSKR6.js";
|
|
14
15
|
import "./chunk-JTDFJWI2.js";
|
|
15
16
|
import "./chunk-NWPT4ASZ.js";
|
|
@@ -17,5 +18,6 @@ import "./chunk-B2CPS4QU.js";
|
|
|
17
18
|
import "./chunk-K3NQKI34.js";
|
|
18
19
|
export {
|
|
19
20
|
deliverMessage,
|
|
20
|
-
extractTextContent
|
|
21
|
+
extractTextContent,
|
|
22
|
+
recordInbound
|
|
21
23
|
};
|
|
@@ -6,63 +6,63 @@ async function run(args) {
|
|
|
6
6
|
const subcommand = args[0];
|
|
7
7
|
switch (subcommand) {
|
|
8
8
|
case "create":
|
|
9
|
-
await import("./create-
|
|
9
|
+
await import("./create-VDQJER52.js").then((m) => m.run(args.slice(1)));
|
|
10
10
|
break;
|
|
11
11
|
case "start":
|
|
12
|
-
await import("./start-
|
|
12
|
+
await import("./start-C7XITZ5O.js").then((m) => m.run(args.slice(1)));
|
|
13
13
|
break;
|
|
14
14
|
case "stop":
|
|
15
|
-
await import("./stop-
|
|
15
|
+
await import("./stop-CVKBSLXY.js").then((m) => m.run(args.slice(1)));
|
|
16
16
|
break;
|
|
17
17
|
case "restart":
|
|
18
|
-
await import("./restart-
|
|
18
|
+
await import("./restart-5BMNV7KU.js").then((m) => m.run(args.slice(1)));
|
|
19
19
|
break;
|
|
20
20
|
case "delete":
|
|
21
|
-
await import("./delete-
|
|
21
|
+
await import("./delete-2MRR4JX5.js").then((m) => m.run(args.slice(1)));
|
|
22
22
|
break;
|
|
23
23
|
case "list":
|
|
24
|
-
await import("./status-
|
|
24
|
+
await import("./status-SIRPLEZC.js").then((m) => m.run(args.slice(1)));
|
|
25
25
|
break;
|
|
26
26
|
case "status": {
|
|
27
27
|
const rest = args.slice(1);
|
|
28
28
|
if (!rest[0] && process.env.VOLUTE_MIND) {
|
|
29
29
|
rest.unshift(process.env.VOLUTE_MIND);
|
|
30
30
|
}
|
|
31
|
-
await import("./status-
|
|
31
|
+
await import("./status-SIRPLEZC.js").then((m) => m.run(rest));
|
|
32
32
|
break;
|
|
33
33
|
}
|
|
34
34
|
case "logs": {
|
|
35
35
|
const rest = args.slice(1);
|
|
36
36
|
const logsArgs = transformMindFlag(rest);
|
|
37
|
-
await import("./logs-
|
|
37
|
+
await import("./logs-HRBONI5I.js").then((m) => m.run(logsArgs));
|
|
38
38
|
break;
|
|
39
39
|
}
|
|
40
40
|
case "upgrade":
|
|
41
|
-
await import("./upgrade-
|
|
41
|
+
await import("./upgrade-7RUIXGOO.js").then((m) => m.run(args.slice(1)));
|
|
42
42
|
break;
|
|
43
43
|
case "import":
|
|
44
|
-
await import("./import-
|
|
44
|
+
await import("./import-FRDPQPJ2.js").then((m) => m.run(args.slice(1)));
|
|
45
45
|
break;
|
|
46
46
|
case "export":
|
|
47
|
-
await import("./export-
|
|
47
|
+
await import("./export-IKFAPRAO.js").then((m) => m.run(args.slice(1)));
|
|
48
48
|
break;
|
|
49
49
|
case "connect":
|
|
50
|
-
await import("./connector-
|
|
50
|
+
await import("./connector-M6XFI6GM.js").then((m) => m.run(["connect", ...args.slice(1)]));
|
|
51
51
|
break;
|
|
52
52
|
case "disconnect":
|
|
53
|
-
await import("./connector-
|
|
53
|
+
await import("./connector-M6XFI6GM.js").then((m) => m.run(["disconnect", ...args.slice(1)]));
|
|
54
54
|
break;
|
|
55
55
|
case "seed":
|
|
56
|
-
await import("./seed-
|
|
56
|
+
await import("./seed-6FEKB3YC.js").then((m) => m.run(args.slice(1)));
|
|
57
57
|
break;
|
|
58
58
|
case "sprout":
|
|
59
|
-
await import("./sprout-
|
|
59
|
+
await import("./sprout-CGSW4CF5.js").then((m) => m.run(args.slice(1)));
|
|
60
60
|
break;
|
|
61
61
|
case "sleep":
|
|
62
|
-
await import("./mind-sleep-
|
|
62
|
+
await import("./mind-sleep-GHPTSAYN.js").then((m) => m.run(args.slice(1)));
|
|
63
63
|
break;
|
|
64
64
|
case "wake":
|
|
65
|
-
await import("./mind-wake-
|
|
65
|
+
await import("./mind-wake-BJDJFMDF.js").then((m) => m.run(args.slice(1)));
|
|
66
66
|
break;
|
|
67
67
|
case "--help":
|
|
68
68
|
case "-h":
|
|
@@ -4,9 +4,9 @@ import {
|
|
|
4
4
|
markIdle,
|
|
5
5
|
onMindEvent,
|
|
6
6
|
stopAll
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-E7GOKNOT.js";
|
|
8
|
+
import "./chunk-BFK6SOEJ.js";
|
|
9
|
+
import "./chunk-33XAVCS4.js";
|
|
10
10
|
import "./chunk-YUIHSKR6.js";
|
|
11
11
|
import "./chunk-B2CPS4QU.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
MindManager,
|
|
4
4
|
getMindManager,
|
|
5
5
|
initMindManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NOBRGACV.js";
|
|
7
7
|
import "./chunk-PHU4DEAJ.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-33XAVCS4.js";
|
|
9
9
|
import "./chunk-YUIHSKR6.js";
|
|
10
10
|
import "./chunk-NWPT4ASZ.js";
|
|
11
11
|
import "./chunk-B2CPS4QU.js";
|
|
@@ -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.24.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",
|
|
@@ -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-JOVQZ52X.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()), {
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
LAUNCHD_PLIST_PATH,
|
|
5
5
|
SYSTEM_SERVICE_PATH,
|
|
6
6
|
USER_SYSTEMD_UNIT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3AIBT4TW.js";
|
|
8
8
|
import {
|
|
9
9
|
parseArgs
|
|
10
10
|
} from "./chunk-D424ZQGI.js";
|
|
@@ -211,7 +211,7 @@ async function run(args) {
|
|
|
211
211
|
switch (subcommand) {
|
|
212
212
|
case "install":
|
|
213
213
|
if (flags.system) {
|
|
214
|
-
const setup = await import("./setup-
|
|
214
|
+
const setup = await import("./setup-BMLM2UTK.js");
|
|
215
215
|
setup.install(flags.port, flags.host);
|
|
216
216
|
} else {
|
|
217
217
|
await install(flags.port, flags.host);
|
|
@@ -219,7 +219,7 @@ async function run(args) {
|
|
|
219
219
|
break;
|
|
220
220
|
case "uninstall":
|
|
221
221
|
if (flags.system) {
|
|
222
|
-
const setup = await import("./setup-
|
|
222
|
+
const setup = await import("./setup-BMLM2UTK.js");
|
|
223
223
|
setup.uninstall(!!flags.force);
|
|
224
224
|
} else {
|
|
225
225
|
await uninstall();
|
|
@@ -6,16 +6,16 @@ async function run(args) {
|
|
|
6
6
|
const subcommand = args[0];
|
|
7
7
|
switch (subcommand) {
|
|
8
8
|
case "merge":
|
|
9
|
-
await import("./merge-
|
|
9
|
+
await import("./merge-KSFJKX6T.js").then((m) => m.run(args.slice(1)));
|
|
10
10
|
break;
|
|
11
11
|
case "pull":
|
|
12
|
-
await import("./pull-
|
|
12
|
+
await import("./pull-D32SPFVU.js").then((m) => m.run(args.slice(1)));
|
|
13
13
|
break;
|
|
14
14
|
case "log":
|
|
15
|
-
await import("./log-
|
|
15
|
+
await import("./log-6SGSSR3D.js").then((m) => m.run(args.slice(1)));
|
|
16
16
|
break;
|
|
17
17
|
case "status":
|
|
18
|
-
await import("./status-
|
|
18
|
+
await import("./status-LYS4NUOZ.js").then((m) => m.run(args.slice(1)));
|
|
19
19
|
break;
|
|
20
20
|
case "--help":
|
|
21
21
|
case "-h":
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Volute CLI
|
|
3
|
-
description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, and
|
|
3
|
+
description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, shared files, and sleep cycles. Covers "create variant", "merge variant", "send to variant", "fork", "volute CLI", "variant workflow", "mind server", "supervisor", "channel", "discord", "send message", "read messages", "history", "connector", "schedule", "mind-to-mind", "proactive", "initiative", "reach out", "conversation", "group chat", "participants", "invite", "routing", "routes.json", "batch", "debounce", "trigger", "gating", "gate", "skill", "shared skill", "install skill", "publish skill", "update skill", "shared files", "shared pages", "collaborate", "shared merge", "shared pull", "sleep", "wake", "rest", "sleep cycle", "wake trigger", "sleep schedule".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Self-Management
|
|
@@ -52,6 +52,76 @@ You can also schedule scripts that run and deliver their output as a message (em
|
|
|
52
52
|
volute schedule add --cron "*/30 * * * *" --script "cat status.txt" --id check-status
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
## Sleep
|
|
56
|
+
|
|
57
|
+
Sleep lets you follow a rest cycle — your process stops, sessions are archived, and you wake fresh. During sleep, incoming messages are queued and delivered when you wake.
|
|
58
|
+
|
|
59
|
+
### Commands
|
|
60
|
+
|
|
61
|
+
| Command | Purpose |
|
|
62
|
+
|---------|---------|
|
|
63
|
+
| `volute mind sleep [--wake-at <time>]` | Go to sleep (you get one turn to wind down first) |
|
|
64
|
+
| `volute mind wake` | Wake up immediately |
|
|
65
|
+
|
|
66
|
+
### How it works
|
|
67
|
+
|
|
68
|
+
1. **Pre-sleep**: You receive a message and get a full turn to wind down — journal, update memory, finish thoughts
|
|
69
|
+
2. **Session archive**: Your current session is archived and a fresh one starts on wake
|
|
70
|
+
3. **Message queuing**: Messages that arrive while you sleep are queued, not lost
|
|
71
|
+
4. **Wake**: You receive a summary of how long you slept and previews of queued messages, then they're delivered to your normal channels
|
|
72
|
+
|
|
73
|
+
### Scheduled sleep
|
|
74
|
+
|
|
75
|
+
Configure automatic sleep/wake cycles in `.config/volute.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"sleep": {
|
|
80
|
+
"enabled": true,
|
|
81
|
+
"schedule": {
|
|
82
|
+
"sleep": "0 23 * * *",
|
|
83
|
+
"wake": "0 7 * * *"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This puts you to sleep at 11 PM and wakes you at 7 AM daily. Both are cron expressions.
|
|
90
|
+
|
|
91
|
+
### Wake triggers
|
|
92
|
+
|
|
93
|
+
By default, DMs and @mentions wake you during sleep (you handle them and return to sleep). Configure in `volute.json`:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"sleep": {
|
|
98
|
+
"enabled": true,
|
|
99
|
+
"schedule": { "sleep": "0 23 * * *", "wake": "0 7 * * *" },
|
|
100
|
+
"wakeTriggers": {
|
|
101
|
+
"mentions": true,
|
|
102
|
+
"dms": true,
|
|
103
|
+
"channels": ["discord:*/urgent"],
|
|
104
|
+
"senders": ["admin-*"]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
- `mentions` (default: true) — wake on @your-name in any message
|
|
111
|
+
- `dms` (default: true) — wake on direct messages
|
|
112
|
+
- `channels` — glob patterns for channels that always wake you
|
|
113
|
+
- `senders` — glob patterns for senders that always wake you
|
|
114
|
+
|
|
115
|
+
When trigger-woken, you get one full turn to respond, then return to sleep when idle.
|
|
116
|
+
|
|
117
|
+
### Voluntary sleep
|
|
118
|
+
|
|
119
|
+
You can go to sleep any time with `volute mind sleep`. Optionally set a wake time:
|
|
120
|
+
|
|
121
|
+
```sh
|
|
122
|
+
volute mind sleep --wake-at "2025-01-15T07:00:00Z"
|
|
123
|
+
```
|
|
124
|
+
|
|
55
125
|
## Piping Messages via Stdin
|
|
56
126
|
|
|
57
127
|
All send commands accept the message from stdin instead of as an argument. This avoids shell escaping issues with quotes, special characters, and multiline content:
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
getSleepManagerIfReady,
|
|
6
6
|
initSleepManager,
|
|
7
7
|
matchesGlob
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OOW675I3.js";
|
|
9
9
|
import "./chunk-HFCBO2GL.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-E7GOKNOT.js";
|
|
11
|
+
import "./chunk-BFK6SOEJ.js";
|
|
12
|
+
import "./chunk-NOBRGACV.js";
|
|
13
13
|
import "./chunk-XLC342FO.js";
|
|
14
14
|
import "./chunk-PHU4DEAJ.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-33XAVCS4.js";
|
|
16
16
|
import "./chunk-YUIHSKR6.js";
|
|
17
17
|
import "./chunk-JTDFJWI2.js";
|
|
18
18
|
import "./chunk-NWPT4ASZ.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
STANDARD_SKILLS
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-P3W36ZGD.js";
|
|
5
|
+
import "./chunk-33XAVCS4.js";
|
|
6
6
|
import "./chunk-YUIHSKR6.js";
|
|
7
7
|
import "./chunk-JTDFJWI2.js";
|
|
8
8
|
import "./chunk-NWPT4ASZ.js";
|
|
@@ -49,7 +49,7 @@ async function run(_args) {
|
|
|
49
49
|
console.error("Write your MEMORY.md before sprouting.");
|
|
50
50
|
process.exit(1);
|
|
51
51
|
}
|
|
52
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
52
|
+
const { daemonFetch } = await import("./daemon-client-JOVQZ52X.js");
|
|
53
53
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
54
54
|
const client = getClient();
|
|
55
55
|
const failedSkills = [];
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getServiceMode,
|
|
5
5
|
modeLabel,
|
|
6
6
|
readDaemonConfig
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3AIBT4TW.js";
|
|
8
8
|
import "./chunk-JTDFJWI2.js";
|
|
9
9
|
import "./chunk-NWPT4ASZ.js";
|
|
10
10
|
import {
|
|
@@ -17,8 +17,9 @@ import "./chunk-K3NQKI34.js";
|
|
|
17
17
|
async function run(_args) {
|
|
18
18
|
const mode = getServiceMode();
|
|
19
19
|
console.log(`Mode: ${modeLabel(mode)}`);
|
|
20
|
-
const { hostname, port, token } = readDaemonConfig();
|
|
21
|
-
const
|
|
20
|
+
const { hostname, port, internalPort, token } = readDaemonConfig();
|
|
21
|
+
const apiPort = internalPort ?? port;
|
|
22
|
+
const baseUrl = getDaemonUrl("127.0.0.1", apiPort);
|
|
22
23
|
let running = false;
|
|
23
24
|
let version;
|
|
24
25
|
try {
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
logger_default
|
|
4
|
+
} from "./chunk-YUIHSKR6.js";
|
|
5
|
+
import {
|
|
6
|
+
voluteHome
|
|
7
|
+
} from "./chunk-B2CPS4QU.js";
|
|
8
|
+
import "./chunk-K3NQKI34.js";
|
|
9
|
+
|
|
10
|
+
// src/lib/tailscale.ts
|
|
11
|
+
import { execFile } from "child_process";
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync } from "fs";
|
|
13
|
+
import { resolve } from "path";
|
|
14
|
+
import { promisify } from "util";
|
|
15
|
+
var execFileAsync = promisify(execFile);
|
|
16
|
+
var TLS_DIR = resolve(voluteHome(), "tls");
|
|
17
|
+
async function getTailscaleHostname() {
|
|
18
|
+
const { stdout } = await execFileAsync("tailscale", ["status", "--json"]);
|
|
19
|
+
const status = JSON.parse(stdout);
|
|
20
|
+
const self = status.Self;
|
|
21
|
+
if (!self?.DNSName) throw new Error("Could not determine Tailscale hostname");
|
|
22
|
+
return self.DNSName.replace(/\.$/, "");
|
|
23
|
+
}
|
|
24
|
+
async function getTailscaleTls() {
|
|
25
|
+
const hostname = await getTailscaleHostname();
|
|
26
|
+
logger_default.info("Tailscale hostname", { hostname });
|
|
27
|
+
mkdirSync(TLS_DIR, { recursive: true });
|
|
28
|
+
const certPath = resolve(TLS_DIR, "cert.pem");
|
|
29
|
+
const keyPath = resolve(TLS_DIR, "key.pem");
|
|
30
|
+
await execFileAsync("tailscale", [
|
|
31
|
+
"cert",
|
|
32
|
+
"--cert-file",
|
|
33
|
+
certPath,
|
|
34
|
+
"--key-file",
|
|
35
|
+
keyPath,
|
|
36
|
+
hostname
|
|
37
|
+
]);
|
|
38
|
+
if (!existsSync(certPath) || !existsSync(keyPath)) {
|
|
39
|
+
throw new Error("tailscale cert did not produce expected files");
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
key: readFileSync(keyPath),
|
|
43
|
+
cert: readFileSync(certPath),
|
|
44
|
+
hostname
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
getTailscaleTls
|
|
49
|
+
};
|