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.
Files changed (80) hide show
  1. package/README.md +5 -5
  2. package/dist/{activity-events-3WHHCOBB.js → activity-events-4O37J7PD.js} +2 -2
  3. package/dist/api.d.ts +306 -15
  4. package/dist/{channel-BOOMFULW.js → channel-HZOSHGNF.js} +1 -1
  5. package/dist/{chunk-QIXPN3OO.js → chunk-2767L2RZ.js} +5 -5
  6. package/dist/{chunk-SGPEZ32F.js → chunk-33XAVCS4.js} +16 -0
  7. package/dist/{chunk-VT5QODNE.js → chunk-3AIBT4TW.js} +4 -3
  8. package/dist/{chunk-RK627D57.js → chunk-4TJ72QQ3.js} +2 -2
  9. package/dist/{chunk-A4S7H6G6.js → chunk-BFK6SOEJ.js} +1 -1
  10. package/dist/{chunk-HGCDWKSP.js → chunk-E7GOKNOT.js} +1 -1
  11. package/dist/{chunk-VNVCRVYI.js → chunk-NOBRGACV.js} +7 -7
  12. package/dist/{chunk-OSFGKF2T.js → chunk-OOW675I3.js} +839 -129
  13. package/dist/{chunk-TFS25FIM.js → chunk-P3W36ZGD.js} +1 -1
  14. package/dist/{chunk-JNFRY2WU.js → chunk-TQDITGES.js} +33 -15
  15. package/dist/{chunk-KFI7TQJ6.js → chunk-TRQEV3CD.js} +9 -5
  16. package/dist/cli.js +18 -18
  17. package/dist/{cloud-sync-C6WRYRVR.js → cloud-sync-DIU3OCPV.js} +6 -8
  18. package/dist/{connector-PYT5UOTZ.js → connector-M6XFI6GM.js} +1 -1
  19. package/dist/{create-WIDA3M4C.js → create-VDQJER52.js} +1 -1
  20. package/dist/{daemon-client-ZHCDL4RS.js → daemon-client-JOVQZ52X.js} +1 -1
  21. package/dist/{daemon-restart-TPQ2XBRZ.js → daemon-restart-YMPEATQH.js} +5 -5
  22. package/dist/daemon.js +697 -865
  23. package/dist/{delete-LOIANQGD.js → delete-2MRR4JX5.js} +1 -1
  24. package/dist/{down-WSUASL5E.js → down-674SX2IZ.js} +2 -2
  25. package/dist/{env-4PHIHTF4.js → env-2FPOZK37.js} +1 -1
  26. package/dist/{export-XD6PJBQP.js → export-IKFAPRAO.js} +1 -1
  27. package/dist/{file-X4L5TTOL.js → file-KT3UIQM3.js} +1 -1
  28. package/dist/{history-HTEKRNID.js → history-46WZN5CN.js} +1 -1
  29. package/dist/{import-EAXTHHXL.js → import-FRDPQPJ2.js} +1 -1
  30. package/dist/{log-SRO5Q6AD.js → log-6SGSSR3D.js} +1 -1
  31. package/dist/{logs-HNTNNBDW.js → logs-HRBONI5I.js} +1 -1
  32. package/dist/{merge-B6SYTGI7.js → merge-KSFJKX6T.js} +1 -1
  33. package/dist/{message-delivery-WUS4K4ZC.js → message-delivery-S7BCNV6Y.js} +9 -7
  34. package/dist/{mind-BTXR5B3C.js → mind-KPLCRKQA.js} +17 -17
  35. package/dist/{mind-activity-tracker-PGC3DBJ7.js → mind-activity-tracker-NMDDEV3K.js} +3 -3
  36. package/dist/{mind-manager-P5OBDUKI.js → mind-manager-ZNRIYEK3.js} +2 -2
  37. package/dist/{mind-sleep-FWRBIFBS.js → mind-sleep-GHPTSAYN.js} +1 -1
  38. package/dist/{mind-wake-LJK2YU5X.js → mind-wake-BJDJFMDF.js} +1 -1
  39. package/dist/{package-A7PEYJI2.js → package-S5YF25XV.js} +1 -1
  40. package/dist/{pull-GRQAXM2E.js → pull-D32SPFVU.js} +1 -1
  41. package/dist/{restart-CIDAKGG2.js → restart-5BMNV7KU.js} +1 -1
  42. package/dist/{schedule-NLR3LZLY.js → schedule-YEFDLVMJ.js} +1 -1
  43. package/dist/{seed-3H2MRREW.js → seed-6FEKB3YC.js} +1 -1
  44. package/dist/{send-RP2TA7SG.js → send-IISDYFCL.js} +1 -1
  45. package/dist/{service-7BFXDI6J.js → service-FASYWLTC.js} +3 -3
  46. package/dist/{setup-SSIIXQMI.js → setup-BMLM2UTK.js} +1 -1
  47. package/dist/{shared-2OGT3NSL.js → shared-LWMNTTZN.js} +4 -4
  48. package/dist/{skill-Q2Y6PQ3L.js → skill-BQOFACEI.js} +1 -1
  49. package/dist/skills/volute-mind/SKILL.md +71 -1
  50. package/dist/{sleep-manager-3RWUX2ZR.js → sleep-manager-XXSWQQLE.js} +5 -5
  51. package/dist/{sprout-UKCYBGHK.js → sprout-CGSW4CF5.js} +3 -3
  52. package/dist/{start-JR6CUUWF.js → start-C7XITZ5O.js} +1 -1
  53. package/dist/{status-5XDGYHKP.js → status-LYS4NUOZ.js} +1 -1
  54. package/dist/{status-H2MKDN6L.js → status-SIRPLEZC.js} +4 -3
  55. package/dist/{stop-VKPGK25U.js → stop-CVKBSLXY.js} +1 -1
  56. package/dist/tailscale-AJ4VL5XK.js +49 -0
  57. package/dist/{up-JKGC7PPF.js → up-OMHACRJL.js} +2 -2
  58. package/dist/{update-ELC6MEUT.js → update-7XCZMYBT.js} +7 -7
  59. package/dist/{upgrade-GXW2EQY3.js → upgrade-7RUIXGOO.js} +1 -1
  60. package/dist/{variant-A4I7PHXS.js → variant-UGREB4G5.js} +4 -4
  61. package/dist/{version-notify-5FGUAVSF.js → version-notify-SZ75QRGO.js} +5 -5
  62. package/dist/web-assets/assets/index-Bx9WDoaQ.js +69 -0
  63. package/dist/web-assets/assets/index-Clz8OhmJ.css +1 -0
  64. package/dist/web-assets/index.html +2 -2
  65. package/drizzle/0013_user_profiles.sql +3 -0
  66. package/drizzle/0014_conversation_reads.sql +7 -0
  67. package/drizzle/meta/0013_snapshot.json +7 -0
  68. package/drizzle/meta/_journal.json +14 -0
  69. package/package.json +1 -1
  70. package/templates/_base/src/lib/file-handler.ts +6 -1
  71. package/templates/_base/src/lib/format-prefix.ts +18 -2
  72. package/templates/_base/src/lib/routing.ts +2 -1
  73. package/templates/_base/src/lib/types.ts +8 -0
  74. package/templates/claude/src/lib/stream-consumer.ts +10 -1
  75. package/templates/pi/src/lib/content.ts +18 -3
  76. package/templates/pi/src/lib/event-handler.ts +9 -1
  77. package/dist/chunk-G5KRTU2F.js +0 -76
  78. package/dist/web-assets/assets/index-DWBxl4LO.js +0 -69
  79. package/dist/web-assets/assets/index-ZqMd1mx1.css +0 -1
  80. /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-ZHCDL4RS.js");
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" : "");
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  run,
4
4
  stopDaemon
5
- } from "./chunk-QIXPN3OO.js";
6
- import "./chunk-VT5QODNE.js";
5
+ } from "./chunk-2767L2RZ.js";
6
+ import "./chunk-3AIBT4TW.js";
7
7
  import "./chunk-JTDFJWI2.js";
8
8
  import "./chunk-NWPT4ASZ.js";
9
9
  import "./chunk-B2CPS4QU.js";
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
@@ -63,7 +63,7 @@ async function run(args) {
63
63
  });
64
64
  if (includeHistory) {
65
65
  try {
66
- const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
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(
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
@@ -6,7 +6,7 @@ import {
6
6
  parseNameFromIdentity,
7
7
  run,
8
8
  sessionMatchesWorkspace
9
- } from "./chunk-RK627D57.js";
9
+ } from "./chunk-4TJ72QQ3.js";
10
10
  import "./chunk-XLC342FO.js";
11
11
  import "./chunk-PHU4DEAJ.js";
12
12
  import "./chunk-D424ZQGI.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage,
4
- extractTextContent
5
- } from "./chunk-OSFGKF2T.js";
4
+ extractTextContent,
5
+ recordInbound
6
+ } from "./chunk-OOW675I3.js";
6
7
  import "./chunk-HFCBO2GL.js";
7
- import "./chunk-HGCDWKSP.js";
8
- import "./chunk-A4S7H6G6.js";
9
- import "./chunk-VNVCRVYI.js";
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-SGPEZ32F.js";
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-WIDA3M4C.js").then((m) => m.run(args.slice(1)));
9
+ await import("./create-VDQJER52.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "start":
12
- await import("./start-JR6CUUWF.js").then((m) => m.run(args.slice(1)));
12
+ await import("./start-C7XITZ5O.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "stop":
15
- await import("./stop-VKPGK25U.js").then((m) => m.run(args.slice(1)));
15
+ await import("./stop-CVKBSLXY.js").then((m) => m.run(args.slice(1)));
16
16
  break;
17
17
  case "restart":
18
- await import("./restart-CIDAKGG2.js").then((m) => m.run(args.slice(1)));
18
+ await import("./restart-5BMNV7KU.js").then((m) => m.run(args.slice(1)));
19
19
  break;
20
20
  case "delete":
21
- await import("./delete-LOIANQGD.js").then((m) => m.run(args.slice(1)));
21
+ await import("./delete-2MRR4JX5.js").then((m) => m.run(args.slice(1)));
22
22
  break;
23
23
  case "list":
24
- await import("./status-H2MKDN6L.js").then((m) => m.run(args.slice(1)));
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-H2MKDN6L.js").then((m) => m.run(rest));
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-HNTNNBDW.js").then((m) => m.run(logsArgs));
37
+ await import("./logs-HRBONI5I.js").then((m) => m.run(logsArgs));
38
38
  break;
39
39
  }
40
40
  case "upgrade":
41
- await import("./upgrade-GXW2EQY3.js").then((m) => m.run(args.slice(1)));
41
+ await import("./upgrade-7RUIXGOO.js").then((m) => m.run(args.slice(1)));
42
42
  break;
43
43
  case "import":
44
- await import("./import-EAXTHHXL.js").then((m) => m.run(args.slice(1)));
44
+ await import("./import-FRDPQPJ2.js").then((m) => m.run(args.slice(1)));
45
45
  break;
46
46
  case "export":
47
- await import("./export-XD6PJBQP.js").then((m) => m.run(args.slice(1)));
47
+ await import("./export-IKFAPRAO.js").then((m) => m.run(args.slice(1)));
48
48
  break;
49
49
  case "connect":
50
- await import("./connector-PYT5UOTZ.js").then((m) => m.run(["connect", ...args.slice(1)]));
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-PYT5UOTZ.js").then((m) => m.run(["disconnect", ...args.slice(1)]));
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-3H2MRREW.js").then((m) => m.run(args.slice(1)));
56
+ await import("./seed-6FEKB3YC.js").then((m) => m.run(args.slice(1)));
57
57
  break;
58
58
  case "sprout":
59
- await import("./sprout-UKCYBGHK.js").then((m) => m.run(args.slice(1)));
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-FWRBIFBS.js").then((m) => m.run(args.slice(1)));
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-LJK2YU5X.js").then((m) => m.run(args.slice(1)));
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-HGCDWKSP.js";
8
- import "./chunk-A4S7H6G6.js";
9
- import "./chunk-SGPEZ32F.js";
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-VNVCRVYI.js";
6
+ } from "./chunk-NOBRGACV.js";
7
7
  import "./chunk-PHU4DEAJ.js";
8
- import "./chunk-SGPEZ32F.js";
8
+ import "./chunk-33XAVCS4.js";
9
9
  import "./chunk-YUIHSKR6.js";
10
10
  import "./chunk-NWPT4ASZ.js";
11
11
  import "./chunk-B2CPS4QU.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.22.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",
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-NAOW2CLO.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-KFI7TQJ6.js";
11
+ } from "./chunk-TRQEV3CD.js";
12
12
  import "./chunk-B2CPS4QU.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
 
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
@@ -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-ZHCDL4RS.js");
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()), {
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import {
16
16
  findMind
17
17
  } from "./chunk-B2CPS4QU.js";
@@ -4,7 +4,7 @@ import {
4
4
  LAUNCHD_PLIST_PATH,
5
5
  SYSTEM_SERVICE_PATH,
6
6
  USER_SYSTEMD_UNIT
7
- } from "./chunk-VT5QODNE.js";
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-SSIIXQMI.js");
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-SSIIXQMI.js");
222
+ const setup = await import("./setup-BMLM2UTK.js");
223
223
  setup.uninstall(!!flags.force);
224
224
  } else {
225
225
  await uninstall();
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SYSTEM_SERVICE_PATH
4
- } from "./chunk-VT5QODNE.js";
4
+ } from "./chunk-3AIBT4TW.js";
5
5
  import {
6
6
  resolveVoluteBin
7
7
  } from "./chunk-JTDFJWI2.js";
@@ -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-B6SYTGI7.js").then((m) => m.run(args.slice(1)));
9
+ await import("./merge-KSFJKX6T.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "pull":
12
- await import("./pull-GRQAXM2E.js").then((m) => m.run(args.slice(1)));
12
+ await import("./pull-D32SPFVU.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "log":
15
- await import("./log-SRO5Q6AD.js").then((m) => m.run(args.slice(1)));
15
+ await import("./log-6SGSSR3D.js").then((m) => m.run(args.slice(1)));
16
16
  break;
17
17
  case "status":
18
- await import("./status-5XDGYHKP.js").then((m) => m.run(args.slice(1)));
18
+ await import("./status-LYS4NUOZ.js").then((m) => m.run(args.slice(1)));
19
19
  break;
20
20
  case "--help":
21
21
  case "-h":
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-KFI7TQJ6.js";
14
+ } from "./chunk-TRQEV3CD.js";
15
15
  import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
@@ -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 shared files. 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".
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-OSFGKF2T.js";
8
+ } from "./chunk-OOW675I3.js";
9
9
  import "./chunk-HFCBO2GL.js";
10
- import "./chunk-HGCDWKSP.js";
11
- import "./chunk-A4S7H6G6.js";
12
- import "./chunk-VNVCRVYI.js";
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-SGPEZ32F.js";
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-TFS25FIM.js";
5
- import "./chunk-SGPEZ32F.js";
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-ZHCDL4RS.js");
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 = [];
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-4RQBJWQX.js";
6
6
  import {
7
7
  daemonFetch
8
- } from "./chunk-KFI7TQJ6.js";
8
+ } from "./chunk-TRQEV3CD.js";
9
9
  import "./chunk-B2CPS4QU.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
 
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-KFI7TQJ6.js";
10
+ } from "./chunk-TRQEV3CD.js";
11
11
  import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
@@ -4,7 +4,7 @@ import {
4
4
  getServiceMode,
5
5
  modeLabel,
6
6
  readDaemonConfig
7
- } from "./chunk-VT5QODNE.js";
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 baseUrl = getDaemonUrl(hostname, port);
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 {
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-NAOW2CLO.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-KFI7TQJ6.js";
11
+ } from "./chunk-TRQEV3CD.js";
12
12
  import "./chunk-B2CPS4QU.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
 
@@ -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
+ };
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  readGlobalConfig,
4
4
  run
5
- } from "./chunk-JNFRY2WU.js";
6
- import "./chunk-VT5QODNE.js";
5
+ } from "./chunk-TQDITGES.js";
6
+ import "./chunk-3AIBT4TW.js";
7
7
  import "./chunk-D424ZQGI.js";
8
8
  import "./chunk-JTDFJWI2.js";
9
9
  import "./chunk-NWPT4ASZ.js";