volute 0.50.0 → 0.51.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 (140) hide show
  1. package/dist/{activity-events-H7YI3BTF.js → activity-events-LQII6PZS.js} +3 -3
  2. package/dist/{ai-service-V4CTNGI3.js → ai-service-YW5SWCSB.js} +7 -3
  3. package/dist/{archive-ORM3ENHI.js → archive-FOHGXHPT.js} +3 -3
  4. package/dist/{auth-DT7GY7EZ.js → auth-X6EMNEGB.js} +4 -4
  5. package/dist/{avatar-image-QEPAP3A5.js → avatar-image-52WGXLHV.js} +3 -3
  6. package/dist/{backup-IE6PMXJO.js → backup-YVGV2ZNM.js} +7 -7
  7. package/dist/{chat-W5K6HCBE.js → chat-VAZ25KVT.js} +4 -4
  8. package/dist/{chunk-5IIVOWSP.js → chunk-2RNMBXD2.js} +16 -0
  9. package/dist/{chunk-U3EJJ7JN.js → chunk-5N32EN4O.js} +2 -2
  10. package/dist/{chunk-ZUG76D3P.js → chunk-5Y54AE3L.js} +1 -1
  11. package/dist/{chunk-5FVANDON.js → chunk-6NLW72HP.js} +2 -2
  12. package/dist/{chunk-JI67D7O2.js → chunk-7HN63Q7J.js} +120 -25
  13. package/dist/{chunk-PW65BXY5.js → chunk-7YJY3F2R.js} +11 -1
  14. package/dist/{chunk-HW6Q7AMB.js → chunk-AI47FDGL.js} +6 -7
  15. package/dist/{chunk-636GFQNE.js → chunk-BSHZ23MS.js} +8 -7
  16. package/dist/{chunk-7DXLIYPY.js → chunk-CDKQJWGK.js} +6 -6
  17. package/dist/{chunk-SSNZ6ZNN.js → chunk-CV6BNGFK.js} +3 -3
  18. package/dist/{chunk-QFVGPKJI.js → chunk-DMK5ASKV.js} +1 -1
  19. package/dist/{chunk-MLZBBLMT.js → chunk-DN3LKLYR.js} +4 -4
  20. package/dist/{chunk-WBBKYUGF.js → chunk-EDR47UE2.js} +2 -2
  21. package/dist/{chunk-632FJ23O.js → chunk-EGV6R6UF.js} +26 -7
  22. package/dist/{chunk-KAEZOVP6.js → chunk-FLIEXG2T.js} +1 -1
  23. package/dist/{chunk-5TPC4KCV.js → chunk-FXWBFDQR.js} +2 -2
  24. package/dist/{chunk-74T3CEXK.js → chunk-G7A5LEVI.js} +2 -2
  25. package/dist/{chunk-7UWXAJMK.js → chunk-GLM7TVWP.js} +1 -1
  26. package/dist/{chunk-CAIYV33P.js → chunk-H6X6CKDN.js} +2 -1
  27. package/dist/{chunk-UC6BNMGT.js → chunk-HKP6OAJP.js} +3 -3
  28. package/dist/{chunk-C3KLHJDB.js → chunk-HTRSSOHY.js} +1 -1
  29. package/dist/{chunk-77IZUVBB.js → chunk-I7U5EEZC.js} +2 -2
  30. package/dist/{chunk-7OZWKHA3.js → chunk-ICL6T4SN.js} +18 -4
  31. package/dist/{chunk-X67VT4QO.js → chunk-ICXY54ZC.js} +1 -1
  32. package/dist/{chunk-YQOYZ6G7.js → chunk-IWAVIJO2.js} +2 -2
  33. package/dist/{chunk-5PKFJHCR.js → chunk-JHKBALS2.js} +2 -2
  34. package/dist/{chunk-7XDOTN4R.js → chunk-L7BKTZ5U.js} +1 -1
  35. package/dist/{chunk-AFSLNUTT.js → chunk-LAUCO2HC.js} +1 -1
  36. package/dist/{chunk-AJWFDIEY.js → chunk-M77B73VV.js} +1 -1
  37. package/dist/{chunk-4CN7OCJE.js → chunk-OXWUEU5V.js} +2 -2
  38. package/dist/{chunk-7FDWPQCU.js → chunk-Q7XQLKZB.js} +6 -6
  39. package/dist/{chunk-TGJHGVBZ.js → chunk-QT4D5XCI.js} +4 -4
  40. package/dist/{chunk-574M6I7F.js → chunk-TPX6E6PL.js} +3 -3
  41. package/dist/{chunk-3BAFMGCJ.js → chunk-U54PJPTB.js} +2 -2
  42. package/dist/{chunk-6BM2I736.js → chunk-UDZLPR34.js} +1 -1
  43. package/dist/{chunk-E5S3ILVA.js → chunk-UFTDRTCP.js} +1 -1
  44. package/dist/{chunk-ALIVXDM4.js → chunk-VAEZCIJC.js} +95 -51
  45. package/dist/{chunk-EQKSRVDE.js → chunk-VP5PFNZO.js} +89 -41
  46. package/dist/{chunk-SFRYRW37.js → chunk-VSBMLB2W.js} +9 -9
  47. package/dist/{chunk-RRZ4RQQU.js → chunk-X67BDDZR.js} +5 -7
  48. package/dist/cli.js +19 -19
  49. package/dist/{clock-LH7UFNLJ.js → clock-ZT5YT6HA.js} +2 -2
  50. package/dist/{cloud-sync-IDJFVDEP.js → cloud-sync-GPXYPTIC.js} +22 -22
  51. package/dist/{conversations-S2232Y5I.js → conversations-ZL6PHROD.js} +4 -4
  52. package/dist/{create-2M7DAHQX.js → create-G2RIKQYK.js} +1 -1
  53. package/dist/{daemon-restart-2AAGYFHE.js → daemon-restart-2EWBRTN5.js} +6 -6
  54. package/dist/daemon.js +478 -331
  55. package/dist/{db-QAY45Z56.js → db-BONH4SUG.js} +2 -2
  56. package/dist/delivery-manager-HGVZSEES.js +35 -0
  57. package/dist/{delivery-router-JE7SHYNU.js → delivery-router-RHANNTAC.js} +3 -3
  58. package/dist/{down-D4IRNEMJ.js → down-QSNEMTTX.js} +5 -5
  59. package/dist/echo-text-6ANI5HHN.js +39 -0
  60. package/dist/{env-ABM5IMA7.js → env-IBW2QI6K.js} +1 -1
  61. package/dist/{env-AZK5X4W7.js → env-SQFCWW52.js} +3 -3
  62. package/dist/{exec-2H65LMTA.js → exec-ABD3DYA2.js} +3 -3
  63. package/dist/{export-3E3EL6W3.js → export-VBNWM7I4.js} +3 -3
  64. package/dist/{extensions-7KP3X6G7.js → extensions-NY6WST33.js} +22 -22
  65. package/dist/{files-6BMKVG5G.js → files-BRY5RRIM.js} +3 -3
  66. package/dist/{import-UPNTEBBT.js → import-DB2KULRO.js} +6 -6
  67. package/dist/{isolation-OKDFM6WA.js → isolation-GVV2IBAU.js} +3 -3
  68. package/dist/{list-4BVGH7AN.js → list-UQGIW7OF.js} +1 -1
  69. package/dist/{login-MOXVLULE.js → login-SB5OENMV.js} +2 -2
  70. package/dist/{logout-DWD3OQVT.js → logout-YFZAJRPY.js} +2 -2
  71. package/dist/message-delivery-JHMAJ2GU.js +43 -0
  72. package/dist/{migrate-thread-config-4A5LW36Z.js → migrate-thread-config-EQSEP2XG.js} +2 -2
  73. package/dist/{mind-NYRALSV2.js → mind-WF6QIXWV.js} +7 -7
  74. package/dist/{mind-activity-tracker-L7GCYXQR.js → mind-activity-tracker-QF6DCX2X.js} +4 -4
  75. package/dist/{mind-history-NXXOOTX6.js → mind-history-OGNR4L7W.js} +1 -1
  76. package/dist/mind-service-DZCUUC7J.js +47 -0
  77. package/dist/{mind-sleep-TH6BRQ5X.js → mind-sleep-LZAFBDZD.js} +2 -2
  78. package/dist/{package-XYSV7NUT.js → package-B6O5APCZ.js} +1 -1
  79. package/dist/{prompts-QKFPX6DQ.js → prompts-NBO3HRK3.js} +3 -3
  80. package/dist/{read-ZXGUT4QC.js → read-RJ5NAW5J.js} +3 -14
  81. package/dist/{registry-4UF6OCOE.js → registry-TRC2HJXR.js} +2 -2
  82. package/dist/{sandbox-EGEU5GGE.js → sandbox-NNWCTHRI.js} +3 -3
  83. package/dist/scheduler-TNBN54ZK.js +25 -0
  84. package/dist/{schema-C2GIPD4V.js → schema-ZZQVM4GR.js} +3 -1
  85. package/dist/{seed-3IMBOAGK.js → seed-K2LYODIH.js} +1 -1
  86. package/dist/{seed-cmd-U73XVQMI.js → seed-cmd-2EWBTR6P.js} +2 -2
  87. package/dist/{seed-create-FBLNVSUP.js → seed-create-VGTLU5FD.js} +3 -3
  88. package/dist/{seed-readiness-QRA46ZJQ.js → seed-readiness-DYOVCYHN.js} +4 -4
  89. package/dist/{seed-sprout-3B4SZX7J.js → seed-sprout-PILHJ3YS.js} +7 -7
  90. package/dist/{send-NBRZJXKX.js → send-2YKOZJJ5.js} +81 -49
  91. package/dist/{service-XMXAXGJD.js → service-XQPMZAGI.js} +4 -4
  92. package/dist/{service-install-MOKTEG7B.js → service-install-2EWD7KXD.js} +5 -5
  93. package/dist/{setup-JGYAXXW7.js → setup-MDPSK2XG.js} +6 -6
  94. package/dist/{setup-CAJFOR2N.js → setup-WZSXHHRJ.js} +2 -2
  95. package/dist/{skill-NXIHDQCG.js → skill-B5OJEQUA.js} +1 -1
  96. package/dist/{skills-5MSMT7PT.js → skills-NH2GQKAF.js} +4 -4
  97. package/dist/sleep-manager-7JXEQQ2P.js +41 -0
  98. package/dist/{spirit-IL5EMWYZ.js → spirit-25JVAL3M.js} +7 -7
  99. package/dist/spirit-availability-PJDWZJ3J.js +42 -0
  100. package/dist/{sprout-UPXGJ5HX.js → sprout-EXUZMIOR.js} +1 -1
  101. package/dist/{status-IL67CYM4.js → status-MWLE3RVC.js} +5 -5
  102. package/dist/{system-events-A6IGCEC3.js → system-events-ZPSH63QX.js} +3 -3
  103. package/dist/{tailscale-SJUW2ETR.js → tailscale-KHNZFC7L.js} +2 -2
  104. package/dist/{template-hash-GSOUARW4.js → template-hash-YKWMVYMM.js} +2 -2
  105. package/dist/{template-staleness-T27VCGYA.js → template-staleness-PY2CULH6.js} +5 -5
  106. package/dist/{turn-tracker-6EI2EL7G.js → turn-tracker-TAT2HGK6.js} +5 -5
  107. package/dist/{up-CLL4665A.js → up-J7XCAH7P.js} +5 -5
  108. package/dist/{update-HVAUCQPN.js → update-CIWI2JYA.js} +5 -5
  109. package/dist/{update-check-2MGBBAFF.js → update-check-SZ7B5IFI.js} +3 -3
  110. package/dist/variant-cleanup-YXN25ZVW.js +22 -0
  111. package/dist/{version-notify-7BUHWZNT.js → version-notify-EN3KJ7HH.js} +8 -8
  112. package/dist/web-assets/assets/index-BOyJ4Gqs.css +1 -0
  113. package/dist/web-assets/assets/{index-ClsUcXiW.js → index-CrxBwnzp.js} +19 -19
  114. package/dist/web-assets/index.html +2 -2
  115. package/drizzle/0018_api_tokens.sql +20 -0
  116. package/drizzle/meta/_journal.json +7 -0
  117. package/package.json +1 -1
  118. package/templates/_base/{biome.json.tmpl → biome.json} +2 -1
  119. package/templates/_base/gitignore +44 -0
  120. package/templates/_base/home/public/.gitkeep +0 -0
  121. package/templates/_base/src/lib/format-prefix.ts +15 -8
  122. package/templates/_base/src/lib/router.ts +13 -8
  123. package/templates/claude/volute-template.json +1 -3
  124. package/templates/codex/volute-template.json +1 -3
  125. package/templates/pi/{package.json.tmpl → package.json} +2 -2
  126. package/templates/pi/volute-template.json +1 -3
  127. package/dist/delivery-manager-B4OKWD2P.js +0 -33
  128. package/dist/echo-text-WYAAODBV.js +0 -39
  129. package/dist/message-delivery-3456PXB7.js +0 -43
  130. package/dist/mind-service-5TA7UJAT.js +0 -47
  131. package/dist/scheduler-UV6RUJ7P.js +0 -25
  132. package/dist/sleep-manager-LIEPO6WG.js +0 -41
  133. package/dist/spirit-availability-YFEGJNJ2.js +0 -42
  134. package/dist/variant-cleanup-HJ7Z75R6.js +0 -22
  135. package/dist/web-assets/assets/index-Dz3wTbtR.css +0 -1
  136. /package/templates/_base/home/.config/{config.json.tmpl → config.json} +0 -0
  137. /package/templates/claude/{package.json.tmpl → package.json} +0 -0
  138. /package/templates/codex/home/.config/{config.json.tmpl → config.json} +0 -0
  139. /package/templates/codex/{package.json.tmpl → package.json} +0 -0
  140. /package/templates/pi/home/.config/{config.json.tmpl → config.json} +0 -0
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // packages/cli/src/commands/seed.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind seed` is now `volute seed create`");
7
- await import("./seed-create-FBLNVSUP.js").then((m) => m.run(args));
7
+ await import("./seed-create-VGTLU5FD.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -12,11 +12,11 @@ var cmd = subcommands({
12
12
  commands: {
13
13
  create: {
14
14
  description: "Plant a new seed",
15
- run: (args) => import("./seed-create-FBLNVSUP.js").then((m) => m.run(args))
15
+ run: (args) => import("./seed-create-VGTLU5FD.js").then((m) => m.run(args))
16
16
  },
17
17
  sprout: {
18
18
  description: "Complete orientation and become a full mind",
19
- run: (args) => import("./seed-sprout-3B4SZX7J.js").then((m) => m.run(args))
19
+ run: (args) => import("./seed-sprout-PILHJ3YS.js").then((m) => m.run(args))
20
20
  },
21
21
  check: {
22
22
  description: "Check seed readiness",
@@ -53,13 +53,13 @@ var cmd = command({
53
53
  let model = flags.model;
54
54
  let template = flags.template;
55
55
  if (!template) {
56
- const { resolveTemplate } = await import("./ai-service-V4CTNGI3.js");
56
+ const { resolveTemplate } = await import("./ai-service-YW5SWCSB.js");
57
57
  template = await resolveTemplate(model);
58
58
  }
59
59
  if (template !== "claude" && !model) {
60
60
  if (process.env.VOLUTE_MIND || !process.stdin.isTTY) {
61
- const { getSpiritModel } = await import("./spirit-IL5EMWYZ.js");
62
- const { qualifyModelId } = await import("./ai-service-V4CTNGI3.js");
61
+ const { getSpiritModel } = await import("./spirit-25JVAL3M.js");
62
+ const { qualifyModelId } = await import("./ai-service-YW5SWCSB.js");
63
63
  const spiritModel = getSpiritModel();
64
64
  if (spiritModel) {
65
65
  model = template === "pi" ? qualifyModelId(spiritModel) : spiritModel;
@@ -3,12 +3,12 @@ import {
3
3
  evaluateSeedChecklist,
4
4
  isMemoryWritten,
5
5
  isSoulWritten
6
- } from "./chunk-5PKFJHCR.js";
7
- import "./chunk-5TPC4KCV.js";
6
+ } from "./chunk-JHKBALS2.js";
7
+ import "./chunk-FXWBFDQR.js";
8
8
  import "./chunk-DW4TRDOZ.js";
9
9
  import "./chunk-WCFSBH33.js";
10
- import "./chunk-CAIYV33P.js";
11
- import "./chunk-5IIVOWSP.js";
10
+ import "./chunk-H6X6CKDN.js";
11
+ import "./chunk-2RNMBXD2.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
  export {
14
14
  evaluateSeedChecklist,
@@ -9,19 +9,19 @@ import "./chunk-O7IGP7ZW.js";
9
9
  import "./chunk-FNJCBRD3.js";
10
10
  import {
11
11
  evaluateSeedChecklist
12
- } from "./chunk-5PKFJHCR.js";
12
+ } from "./chunk-JHKBALS2.js";
13
13
  import {
14
14
  getStandardSkillsWithExtensions
15
- } from "./chunk-TGJHGVBZ.js";
16
- import "./chunk-5TPC4KCV.js";
15
+ } from "./chunk-QT4D5XCI.js";
16
+ import "./chunk-FXWBFDQR.js";
17
17
  import "./chunk-DW4TRDOZ.js";
18
18
  import "./chunk-WCFSBH33.js";
19
- import "./chunk-AJWFDIEY.js";
19
+ import "./chunk-M77B73VV.js";
20
20
  import "./chunk-QUSMYGNQ.js";
21
21
  import {
22
22
  mindDir
23
- } from "./chunk-CAIYV33P.js";
24
- import "./chunk-5IIVOWSP.js";
23
+ } from "./chunk-H6X6CKDN.js";
24
+ import "./chunk-2RNMBXD2.js";
25
25
  import "./chunk-K3NQKI34.js";
26
26
 
27
27
  // packages/cli/src/commands/seed-sprout.ts
@@ -74,7 +74,7 @@ var cmd = command({
74
74
  process.exit(1);
75
75
  }
76
76
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
77
- const { mindSkillsDir } = await import("./skills-5MSMT7PT.js");
77
+ const { mindSkillsDir } = await import("./skills-NH2GQKAF.js");
78
78
  const client = getClient();
79
79
  const failedSkills = [];
80
80
  for (const skillId of getStandardSkillsWithExtensions()) {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-33ODGMFZ.js";
5
5
  import {
6
6
  isCompact
7
- } from "./chunk-PW65BXY5.js";
7
+ } from "./chunk-7YJY3F2R.js";
8
8
  import {
9
9
  daemonFetch
10
10
  } from "./chunk-M74I3HHF.js";
@@ -19,9 +19,9 @@ import "./chunk-O7IGP7ZW.js";
19
19
  import "./chunk-FNJCBRD3.js";
20
20
  import {
21
21
  formatFileSize
22
- } from "./chunk-QFVGPKJI.js";
23
- import "./chunk-CAIYV33P.js";
24
- import "./chunk-5IIVOWSP.js";
22
+ } from "./chunk-DMK5ASKV.js";
23
+ import "./chunk-H6X6CKDN.js";
24
+ import "./chunk-2RNMBXD2.js";
25
25
  import "./chunk-K3NQKI34.js";
26
26
 
27
27
  // packages/cli/src/commands/send.ts
@@ -231,67 +231,90 @@ To reach a person, use their username from the message prefix (e.g. volute chat
231
231
  );
232
232
  process.exit(1);
233
233
  }
234
+ let parsed = parseTarget(target);
235
+ if (!parsed.isDM && parsed.platform === "volute" && await isMind(parsed.identifier)) {
236
+ parsed = {
237
+ platform: "volute",
238
+ identifier: `@${parsed.identifier}`,
239
+ uri: `@${parsed.identifier}`,
240
+ isDM: true
241
+ };
242
+ }
243
+ const dmTargetName = parsed.isDM && parsed.platform === "volute" ? parsed.identifier.slice(1) : void 0;
234
244
  if (flags.file) {
245
+ if (!dmTargetName || !await isMind(dmTargetName)) {
246
+ console.error(
247
+ `--file can only attach to a direct message to a mind \u2014 e.g.
248
+ volute chat send @mind "here you go" --file <path>
249
+ Channels and non-mind recipients can't receive a file share.`
250
+ );
251
+ process.exit(1);
252
+ }
253
+ if (!message && images) {
254
+ console.error(
255
+ "Can't attach an image and a file without a message. Send the image with a message, or send the file on its own."
256
+ );
257
+ process.exit(1);
258
+ }
259
+ }
260
+ const stageAttachedFile = async (afterSend) => {
235
261
  const filePath = flags.file;
236
- const parsed2 = parseTarget(target);
237
- const targetName = parsed2.isDM && parsed2.platform === "volute" ? parsed2.identifier.slice(1) : parsed2.identifier;
262
+ const targetName = dmTargetName;
263
+ const failStaging = (reason) => {
264
+ console.error(
265
+ afterSend ? `Your message was delivered. Only the file failed: ${reason}
266
+ Retry the attachment with: volute chat send ${target} --file ${filePath} (no message) \u2014 sending the whole command again would duplicate the message.` : reason
267
+ );
268
+ process.exit(1);
269
+ };
270
+ const postStaging = async (path, body) => {
271
+ let res;
272
+ try {
273
+ res = await daemonFetch(path, {
274
+ method: "POST",
275
+ headers: { "Content-Type": "application/json" },
276
+ body: JSON.stringify(body)
277
+ });
278
+ } catch (err) {
279
+ return failStaging(`couldn't reach the daemon (${err.message})`);
280
+ }
281
+ if (!res.ok) {
282
+ const data2 = await res.json().catch(() => ({}));
283
+ return failStaging(data2.error ?? `daemon returned ${res.status}`);
284
+ }
285
+ const data = await res.json().catch(() => ({}));
286
+ return data.id ?? "?";
287
+ };
238
288
  const mindSelf = process.env.VOLUTE_MIND;
239
289
  if (mindSelf) {
240
- const res = await daemonFetch(`/api/minds/${encodeURIComponent(mindSelf)}/files/send`, {
241
- method: "POST",
242
- headers: { "Content-Type": "application/json" },
243
- body: JSON.stringify({ targetMind: targetName, filePath })
290
+ const id = await postStaging(`/api/minds/${encodeURIComponent(mindSelf)}/files/send`, {
291
+ targetMind: targetName,
292
+ filePath
244
293
  });
245
- if (!res.ok) {
246
- const data2 = await res.json();
247
- console.error(data2.error ?? `Failed to send file: ${res.status}`);
248
- process.exit(1);
249
- }
250
- const data = await res.json();
251
- console.log(`File staged for ${targetName} (id: ${data.id})`);
294
+ console.log(`File staged for ${targetName} (id: ${id})`);
252
295
  } else {
253
296
  if (!existsSync(filePath)) {
254
- console.error(`File not found: ${filePath}`);
255
- process.exit(1);
297
+ failStaging(`File not found: ${filePath}`);
256
298
  }
257
299
  const stat = statSync(filePath);
258
300
  const MAX_FILE_SIZE = 50 * 1024 * 1024;
259
301
  if (stat.size > MAX_FILE_SIZE) {
260
- console.error(
302
+ failStaging(
261
303
  `File too large (${formatFileSize(stat.size)}, max ${formatFileSize(MAX_FILE_SIZE)})`
262
304
  );
263
- process.exit(1);
264
305
  }
265
306
  const content = readFileSync(filePath);
266
- const filename = basename(filePath);
267
- const senderName = flags.sender || userInfo().username;
268
- const res = await daemonFetch(`/api/minds/${encodeURIComponent(targetName)}/files/stage`, {
269
- method: "POST",
270
- headers: { "Content-Type": "application/json" },
271
- body: JSON.stringify({
272
- sender: senderName,
273
- filename,
274
- data: content.toString("base64")
275
- })
307
+ const id = await postStaging(`/api/minds/${encodeURIComponent(targetName)}/files/stage`, {
308
+ sender: flags.sender || userInfo().username,
309
+ filename: basename(filePath),
310
+ data: content.toString("base64")
276
311
  });
277
- if (!res.ok) {
278
- const data2 = await res.json();
279
- console.error(data2.error ?? `Failed to stage file: ${res.status}`);
280
- process.exit(1);
281
- }
282
- const data = await res.json();
283
- console.log(`File staged for ${targetName} (id: ${data.id})`);
312
+ console.log(`File staged for ${targetName} (id: ${id})`);
284
313
  }
285
- if (!message) return;
286
- }
287
- let parsed = parseTarget(target);
288
- if (!parsed.isDM && parsed.platform === "volute" && await isMind(parsed.identifier)) {
289
- parsed = {
290
- platform: "volute",
291
- identifier: `@${parsed.identifier}`,
292
- uri: `@${parsed.identifier}`,
293
- isDM: true
294
- };
314
+ };
315
+ if (flags.file && !message) {
316
+ await stageAttachedFile(false);
317
+ return;
295
318
  }
296
319
  const client = getClient();
297
320
  let waitMindName;
@@ -350,7 +373,7 @@ To reach a person, use their username from the message prefix (e.g. volute chat
350
373
  console.error(`Warning: could not read send response: ${err.message}`);
351
374
  }
352
375
  if (data.held) heldResponse = true;
353
- if (data.held || !flags.wait) {
376
+ if (data.held || !flags.wait || flags.file) {
354
377
  printSendResult(data);
355
378
  } else {
356
379
  const ack = spiritAck(data.spirit);
@@ -413,6 +436,15 @@ See: volute chat bridge --help`
413
436
  );
414
437
  process.exit(1);
415
438
  }
439
+ if (flags.file) {
440
+ if (heldResponse) {
441
+ console.log(
442
+ "Your attached file was not staged \u2014 include --file <path> again when you re-send."
443
+ );
444
+ } else {
445
+ await stageAttachedFile(true);
446
+ }
447
+ }
416
448
  if (heldResponse || spiritUnavailable) {
417
449
  } else if (flags.wait && waitMindName) {
418
450
  if (!waitConversationId) {
@@ -9,10 +9,10 @@ import {
9
9
  SYSTEM_LAUNCHD_PLIST_PATH,
10
10
  SYSTEM_SERVICE_PATH,
11
11
  USER_SYSTEMD_UNIT
12
- } from "./chunk-5FVANDON.js";
13
- import "./chunk-AJWFDIEY.js";
14
- import "./chunk-CAIYV33P.js";
15
- import "./chunk-5IIVOWSP.js";
12
+ } from "./chunk-6NLW72HP.js";
13
+ import "./chunk-M77B73VV.js";
14
+ import "./chunk-H6X6CKDN.js";
15
+ import "./chunk-2RNMBXD2.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // packages/cli/src/commands/service.ts
@@ -3,11 +3,11 @@ import {
3
3
  generateUserPlist,
4
4
  generateUserUnit,
5
5
  installUserService
6
- } from "./chunk-4CN7OCJE.js";
7
- import "./chunk-5FVANDON.js";
8
- import "./chunk-AJWFDIEY.js";
9
- import "./chunk-CAIYV33P.js";
10
- import "./chunk-5IIVOWSP.js";
6
+ } from "./chunk-OXWUEU5V.js";
7
+ import "./chunk-6NLW72HP.js";
8
+ import "./chunk-M77B73VV.js";
9
+ import "./chunk-H6X6CKDN.js";
10
+ import "./chunk-2RNMBXD2.js";
11
11
  import "./chunk-K3NQKI34.js";
12
12
  export {
13
13
  generateUserPlist,
@@ -8,21 +8,21 @@ import {
8
8
  import "./chunk-O7IGP7ZW.js";
9
9
  import {
10
10
  installUserService
11
- } from "./chunk-4CN7OCJE.js";
11
+ } from "./chunk-OXWUEU5V.js";
12
12
  import {
13
13
  LAUNCHD_PLIST_LABEL,
14
14
  SYSTEM_LAUNCHD_PLIST_PATH,
15
15
  SYSTEM_SERVICE_PATH
16
- } from "./chunk-5FVANDON.js";
16
+ } from "./chunk-6NLW72HP.js";
17
17
  import {
18
18
  ensureVoluteGroup,
19
19
  resolveVoluteBin
20
- } from "./chunk-AJWFDIEY.js";
20
+ } from "./chunk-M77B73VV.js";
21
21
  import {
22
22
  readGlobalConfig,
23
23
  writeGlobalConfig
24
- } from "./chunk-CAIYV33P.js";
25
- import "./chunk-5IIVOWSP.js";
24
+ } from "./chunk-H6X6CKDN.js";
25
+ import "./chunk-2RNMBXD2.js";
26
26
  import "./chunk-K3NQKI34.js";
27
27
 
28
28
  // src/commands/setup.ts
@@ -220,7 +220,7 @@ async function startDaemonAndOpenBrowser(port, host) {
220
220
  const url = `http://${displayHost === "0.0.0.0" || displayHost === "::" ? "localhost" : displayHost}:${displayPort}`;
221
221
  console.log("\nStarting daemon...");
222
222
  try {
223
- const { run: runUp } = await import("./up-CLL4665A.js");
223
+ const { run: runUp } = await import("./up-J7XCAH7P.js");
224
224
  await runUp([
225
225
  ...port != null ? ["--port", String(port)] : [],
226
226
  ...host ? ["--host", host] : []
@@ -16,8 +16,8 @@ import {
16
16
  setupStatus,
17
17
  setupUrl,
18
18
  writeGlobalConfig
19
- } from "./chunk-CAIYV33P.js";
20
- import "./chunk-5IIVOWSP.js";
19
+ } from "./chunk-H6X6CKDN.js";
20
+ import "./chunk-2RNMBXD2.js";
21
21
  import "./chunk-K3NQKI34.js";
22
22
  export {
23
23
  _resetConfigCache,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  isCompact
4
- } from "./chunk-PW65BXY5.js";
4
+ } from "./chunk-7YJY3F2R.js";
5
5
  import {
6
6
  resolveMindName
7
7
  } from "./chunk-BTY4WNFE.js";
@@ -28,11 +28,11 @@ import {
28
28
  syncBuiltinSkills,
29
29
  uninstallSkill,
30
30
  updateSkill
31
- } from "./chunk-TGJHGVBZ.js";
32
- import "./chunk-AJWFDIEY.js";
31
+ } from "./chunk-QT4D5XCI.js";
32
+ import "./chunk-M77B73VV.js";
33
33
  import "./chunk-QUSMYGNQ.js";
34
- import "./chunk-CAIYV33P.js";
35
- import "./chunk-5IIVOWSP.js";
34
+ import "./chunk-H6X6CKDN.js";
35
+ import "./chunk-2RNMBXD2.js";
36
36
  import "./chunk-K3NQKI34.js";
37
37
  export {
38
38
  SEED_SKILLS,
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SleepManager,
4
+ getSleepManager,
5
+ getSleepManagerIfReady,
6
+ initSleepManager,
7
+ matchesGlob
8
+ } from "./chunk-VP5PFNZO.js";
9
+ import "./chunk-VSBMLB2W.js";
10
+ import "./chunk-X67BDDZR.js";
11
+ import "./chunk-Q7XQLKZB.js";
12
+ import "./chunk-7HN63Q7J.js";
13
+ import "./chunk-VAEZCIJC.js";
14
+ import "./chunk-UDZLPR34.js";
15
+ import "./chunk-CDKQJWGK.js";
16
+ import "./chunk-QT4D5XCI.js";
17
+ import "./chunk-HKP6OAJP.js";
18
+ import "./chunk-ICL6T4SN.js";
19
+ import "./chunk-LNNI3MS4.js";
20
+ import "./chunk-FXWBFDQR.js";
21
+ import "./chunk-5Y54AE3L.js";
22
+ import "./chunk-TPX6E6PL.js";
23
+ import "./chunk-UFTDRTCP.js";
24
+ import "./chunk-U54PJPTB.js";
25
+ import "./chunk-ICXY54ZC.js";
26
+ import "./chunk-DW4TRDOZ.js";
27
+ import "./chunk-WCFSBH33.js";
28
+ import "./chunk-M77B73VV.js";
29
+ import "./chunk-GLM7TVWP.js";
30
+ import "./chunk-EGV6R6UF.js";
31
+ import "./chunk-QUSMYGNQ.js";
32
+ import "./chunk-H6X6CKDN.js";
33
+ import "./chunk-2RNMBXD2.js";
34
+ import "./chunk-K3NQKI34.js";
35
+ export {
36
+ SleepManager,
37
+ getSleepManager,
38
+ getSleepManagerIfReady,
39
+ initSleepManager,
40
+ matchesGlob
41
+ };
@@ -10,15 +10,15 @@ import {
10
10
  spiritDir,
11
11
  syncSpiritTemplate,
12
12
  writeSpiritSystemJson
13
- } from "./chunk-SFRYRW37.js";
14
- import "./chunk-RRZ4RQQU.js";
15
- import "./chunk-TGJHGVBZ.js";
13
+ } from "./chunk-VSBMLB2W.js";
14
+ import "./chunk-X67BDDZR.js";
15
+ import "./chunk-QT4D5XCI.js";
16
16
  import "./chunk-WCFSBH33.js";
17
- import "./chunk-AJWFDIEY.js";
18
- import "./chunk-632FJ23O.js";
17
+ import "./chunk-M77B73VV.js";
18
+ import "./chunk-EGV6R6UF.js";
19
19
  import "./chunk-QUSMYGNQ.js";
20
- import "./chunk-CAIYV33P.js";
21
- import "./chunk-5IIVOWSP.js";
20
+ import "./chunk-H6X6CKDN.js";
21
+ import "./chunk-2RNMBXD2.js";
22
22
  import "./chunk-K3NQKI34.js";
23
23
  export {
24
24
  _setSpiritCreationInProgressForTest,
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SPIRIT_NOTICE_PREFIX,
4
+ _resetSpiritAvailabilityState,
5
+ classifySpiritState,
6
+ ensureSpiritAvailable,
7
+ spiritUnavailableNotice
8
+ } from "./chunk-DN3LKLYR.js";
9
+ import "./chunk-VP5PFNZO.js";
10
+ import "./chunk-VSBMLB2W.js";
11
+ import "./chunk-X67BDDZR.js";
12
+ import "./chunk-Q7XQLKZB.js";
13
+ import "./chunk-7HN63Q7J.js";
14
+ import "./chunk-VAEZCIJC.js";
15
+ import "./chunk-UDZLPR34.js";
16
+ import "./chunk-CDKQJWGK.js";
17
+ import "./chunk-QT4D5XCI.js";
18
+ import "./chunk-HKP6OAJP.js";
19
+ import "./chunk-ICL6T4SN.js";
20
+ import "./chunk-LNNI3MS4.js";
21
+ import "./chunk-FXWBFDQR.js";
22
+ import "./chunk-5Y54AE3L.js";
23
+ import "./chunk-TPX6E6PL.js";
24
+ import "./chunk-UFTDRTCP.js";
25
+ import "./chunk-U54PJPTB.js";
26
+ import "./chunk-ICXY54ZC.js";
27
+ import "./chunk-DW4TRDOZ.js";
28
+ import "./chunk-WCFSBH33.js";
29
+ import "./chunk-M77B73VV.js";
30
+ import "./chunk-GLM7TVWP.js";
31
+ import "./chunk-EGV6R6UF.js";
32
+ import "./chunk-QUSMYGNQ.js";
33
+ import "./chunk-H6X6CKDN.js";
34
+ import "./chunk-2RNMBXD2.js";
35
+ import "./chunk-K3NQKI34.js";
36
+ export {
37
+ SPIRIT_NOTICE_PREFIX,
38
+ _resetSpiritAvailabilityState,
39
+ classifySpiritState,
40
+ ensureSpiritAvailable,
41
+ spiritUnavailableNotice
42
+ };
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // packages/cli/src/commands/sprout.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind sprout` is now `volute seed sprout`");
7
- await import("./seed-sprout-3B4SZX7J.js").then((m) => m.run(args));
7
+ await import("./seed-sprout-PILHJ3YS.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -9,7 +9,7 @@ import "./chunk-O7IGP7ZW.js";
9
9
  import "./chunk-FNJCBRD3.js";
10
10
  import {
11
11
  checkForUpdate
12
- } from "./chunk-AFSLNUTT.js";
12
+ } from "./chunk-LAUCO2HC.js";
13
13
  import {
14
14
  LAUNCHD_PLIST_LABEL,
15
15
  LAUNCHD_PLIST_PATH,
@@ -21,10 +21,10 @@ import {
21
21
  getServiceMode,
22
22
  modeLabel,
23
23
  readDaemonConfig
24
- } from "./chunk-5FVANDON.js";
25
- import "./chunk-AJWFDIEY.js";
26
- import "./chunk-CAIYV33P.js";
27
- import "./chunk-5IIVOWSP.js";
24
+ } from "./chunk-6NLW72HP.js";
25
+ import "./chunk-M77B73VV.js";
26
+ import "./chunk-H6X6CKDN.js";
27
+ import "./chunk-2RNMBXD2.js";
28
28
  import "./chunk-K3NQKI34.js";
29
29
 
30
30
  // src/commands/status.ts
@@ -18,11 +18,11 @@ import {
18
18
  pendingEventsLine,
19
19
  recordNotice,
20
20
  recordReflection
21
- } from "./chunk-7OZWKHA3.js";
21
+ } from "./chunk-ICL6T4SN.js";
22
22
  import "./chunk-LNNI3MS4.js";
23
23
  import "./chunk-QUSMYGNQ.js";
24
- import "./chunk-CAIYV33P.js";
25
- import "./chunk-5IIVOWSP.js";
24
+ import "./chunk-H6X6CKDN.js";
25
+ import "./chunk-2RNMBXD2.js";
26
26
  import "./chunk-K3NQKI34.js";
27
27
  export {
28
28
  MIND_LEVEL_THREAD,
@@ -4,8 +4,8 @@ import {
4
4
  } from "./chunk-QUSMYGNQ.js";
5
5
  import {
6
6
  voluteHome
7
- } from "./chunk-CAIYV33P.js";
8
- import "./chunk-5IIVOWSP.js";
7
+ } from "./chunk-H6X6CKDN.js";
8
+ import "./chunk-2RNMBXD2.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
 
11
11
  // packages/daemon/src/lib/tailscale.ts
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  computeTemplateHash
4
- } from "./chunk-C3KLHJDB.js";
5
- import "./chunk-RRZ4RQQU.js";
4
+ } from "./chunk-HTRSSOHY.js";
5
+ import "./chunk-X67BDDZR.js";
6
6
  import "./chunk-K3NQKI34.js";
7
7
  export {
8
8
  computeTemplateHash
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  computeMindTemplateHash,
4
4
  isTemplateStale
5
- } from "./chunk-SSNZ6ZNN.js";
6
- import "./chunk-C3KLHJDB.js";
7
- import "./chunk-RRZ4RQQU.js";
5
+ } from "./chunk-CV6BNGFK.js";
6
+ import "./chunk-HTRSSOHY.js";
7
+ import "./chunk-X67BDDZR.js";
8
8
  import "./chunk-QUSMYGNQ.js";
9
- import "./chunk-CAIYV33P.js";
10
- import "./chunk-5IIVOWSP.js";
9
+ import "./chunk-H6X6CKDN.js";
10
+ import "./chunk-2RNMBXD2.js";
11
11
  import "./chunk-K3NQKI34.js";
12
12
  export {
13
13
  computeMindTemplateHash,
@@ -14,13 +14,13 @@ import {
14
14
  sweepWedgedTurns,
15
15
  takeErrored,
16
16
  trackToolUse
17
- } from "./chunk-7DXLIYPY.js";
17
+ } from "./chunk-CDKQJWGK.js";
18
18
  import "./chunk-LNNI3MS4.js";
19
- import "./chunk-5TPC4KCV.js";
20
- import "./chunk-632FJ23O.js";
19
+ import "./chunk-FXWBFDQR.js";
20
+ import "./chunk-EGV6R6UF.js";
21
21
  import "./chunk-QUSMYGNQ.js";
22
- import "./chunk-CAIYV33P.js";
23
- import "./chunk-5IIVOWSP.js";
22
+ import "./chunk-H6X6CKDN.js";
23
+ import "./chunk-2RNMBXD2.js";
24
24
  import "./chunk-K3NQKI34.js";
25
25
  export {
26
26
  assignSession,
@@ -2,15 +2,15 @@
2
2
  import {
3
3
  formatStartupFailure,
4
4
  run
5
- } from "./chunk-YQOYZ6G7.js";
5
+ } from "./chunk-IWAVIJO2.js";
6
6
  import "./chunk-TXSA4Q3V.js";
7
7
  import "./chunk-O7IGP7ZW.js";
8
- import "./chunk-5FVANDON.js";
9
- import "./chunk-AJWFDIEY.js";
8
+ import "./chunk-6NLW72HP.js";
9
+ import "./chunk-M77B73VV.js";
10
10
  import {
11
11
  readGlobalConfig
12
- } from "./chunk-CAIYV33P.js";
13
- import "./chunk-5IIVOWSP.js";
12
+ } from "./chunk-H6X6CKDN.js";
13
+ import "./chunk-2RNMBXD2.js";
14
14
  import "./chunk-K3NQKI34.js";
15
15
  export {
16
16
  formatStartupFailure,