volute 0.37.1 → 0.38.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 (68) hide show
  1. package/dist/{chunk-4L2Q7IP5.js → chunk-2TR2OPVA.js} +1 -1
  2. package/dist/chunk-JOJT34M2.js +109 -0
  3. package/dist/{chunk-CF4SO5L3.js → chunk-NGXQ2ESO.js} +9 -8
  4. package/dist/{chunk-LIIX2MOM.js → chunk-PLL2FM7A.js} +35 -20
  5. package/dist/{chunk-RUIVWCYY.js → chunk-TEZRVSSB.js} +24 -24
  6. package/dist/{chunk-QJGLTPAP.js → chunk-VUM2K6EN.js} +1 -1
  7. package/dist/cli.js +12 -12
  8. package/dist/{cloud-sync-EZKCEIBX.js → cloud-sync-PEM3IVI4.js} +8 -8
  9. package/dist/{daemon-restart-S6SOD3C5.js → daemon-restart-6QONRBTK.js} +6 -6
  10. package/dist/daemon.js +146 -76
  11. package/dist/{delivery-manager-3I7CA734.js → delivery-manager-IMCRV6A3.js} +5 -5
  12. package/dist/{down-25L2RKCQ.js → down-5XZWH4ZP.js} +2 -2
  13. package/dist/{echo-text-IWAQKNTC.js → echo-text-ADKLNTIA.js} +6 -6
  14. package/dist/{extensions-PCOXTHNM.js → extensions-P477XR46.js} +5 -5
  15. package/dist/{message-delivery-NWL7XEIX.js → message-delivery-54IXVE5H.js} +5 -5
  16. package/dist/{mind-MM2IYMJ3.js → mind-G5HDKBKL.js} +2 -2
  17. package/dist/{mind-manager-VOEQ2IZL.js → mind-manager-5G6P2EAT.js} +5 -5
  18. package/dist/{mind-service-WRTOQSAL.js → mind-service-FDATHL6X.js} +5 -5
  19. package/dist/{package-TA6IHIED.js → package-LYQHSDPG.js} +27 -27
  20. package/dist/{scheduler-355E746X.js → scheduler-ZRUZNQI5.js} +5 -5
  21. package/dist/{seed-6S4Z6TAM.js → seed-3KH4ZRJL.js} +1 -1
  22. package/dist/{seed-cmd-CBWLJWYD.js → seed-cmd-6A76SSAA.js} +2 -2
  23. package/dist/{seed-create-NT6DG4SE.js → seed-create-XXRRGZCO.js} +1 -1
  24. package/dist/{seed-sprout-GQLSK4EF.js → seed-sprout-HLMUH2AI.js} +2 -2
  25. package/dist/service-install-AIQBLE6P.js +17 -0
  26. package/dist/setup-NPAZXBIJ.js +454 -0
  27. package/dist/{skills-ZFVNN4TU.js → skills-NVOWS5NY.js} +1 -1
  28. package/dist/{sleep-manager-PBOIEBJZ.js → sleep-manager-VPPQXBPH.js} +5 -5
  29. package/dist/{spirit-4QOYM33G.js → spirit-ZFYG4JOH.js} +2 -2
  30. package/dist/{sprout-UDLZPMEO.js → sprout-FLBCETYG.js} +1 -1
  31. package/dist/{src-LT6ZBYYX.js → src-6Z4XYDH5.js} +200 -169
  32. package/dist/{system-chat-7AIN3U5M.js → system-chat-YUIT7RA6.js} +5 -5
  33. package/dist/{up-4T32B7OB.js → up-YRZAEZ3Z.js} +2 -2
  34. package/dist/{version-notify-NCRIN5QK.js → version-notify-764EXVQQ.js} +5 -5
  35. package/dist/web-assets/assets/index-BI7hUTBr.js +73 -0
  36. package/dist/web-assets/assets/index-BJifO9h_.css +1 -0
  37. package/dist/web-assets/index.html +2 -2
  38. package/package.json +27 -27
  39. package/packages/extensions/notes/dist/ui/assets/index-D3cdui42.css +1 -0
  40. package/packages/extensions/notes/dist/ui/assets/index-Dsua7alJ.js +61 -0
  41. package/packages/extensions/notes/dist/ui/index.html +2 -2
  42. package/packages/extensions/pages/dist/ui/assets/index-BM7gRdg7.js +2 -0
  43. package/packages/extensions/pages/dist/ui/assets/index-BcY6lnq4.css +1 -0
  44. package/packages/extensions/pages/dist/ui/index.html +2 -2
  45. package/packages/extensions/plan/dist/ui/assets/index-DWiqtzBv.js +61 -0
  46. package/packages/extensions/plan/dist/ui/assets/index-jIkrt-vI.css +1 -0
  47. package/packages/extensions/plan/dist/ui/index.html +2 -2
  48. package/templates/_base/src/lib/startup.ts +2 -0
  49. package/templates/_base/tsconfig.json +3 -1
  50. package/templates/claude/package.json.tmpl +5 -5
  51. package/templates/claude/src/agent.ts +1 -0
  52. package/templates/codex/package.json.tmpl +4 -4
  53. package/templates/pi/package.json.tmpl +5 -5
  54. package/templates/pi/src/agent.ts +2 -1
  55. package/dist/setup-APNN7KJB.js +0 -425
  56. package/dist/web-assets/assets/index-B3xLeex8.js +0 -75
  57. package/dist/web-assets/assets/index-Dr4A90Lo.css +0 -1
  58. package/packages/extensions/notes/dist/ui/assets/index-8jWEv9SA.js +0 -61
  59. package/packages/extensions/notes/dist/ui/assets/index-DkaB7Ytd.css +0 -1
  60. package/packages/extensions/pages/dist/ui/assets/index-D0HyS-xQ.css +0 -1
  61. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +0 -2
  62. package/packages/extensions/plan/dist/ui/assets/index-CJj2gZnZ.css +0 -1
  63. package/packages/extensions/plan/dist/ui/assets/index-FMEJmvQz.js +0 -61
  64. package/dist/{chat-5Y4FD77E.js → chat-XL7CVWVJ.js} +0 -0
  65. package/dist/{chunk-MQRS4J24.js → chunk-LN67VPZJ.js} +3 -3
  66. package/dist/{service-YMHWPDXW.js → service-RH6Q2XWR.js} +4 -4
  67. package/dist/{status-MC2P7DBG.js → status-TGOKAFW3.js} +4 -4
  68. package/dist/{update-UOP2INF2.js → update-ZCTQ6UGY.js} +4 -4
package/dist/daemon.js CHANGED
@@ -27,9 +27,10 @@ import {
27
27
  import {
28
28
  PLATFORMS,
29
29
  echoTextToChannel,
30
+ fixModelEscapes,
30
31
  getPlatformDriver,
31
32
  routeOutboundBridge
32
- } from "./chunk-LIIX2MOM.js";
33
+ } from "./chunk-PLL2FM7A.js";
33
34
  import {
34
35
  getBridgeConfig,
35
36
  readBridgesConfig,
@@ -101,7 +102,7 @@ import {
101
102
  trackToolUse,
102
103
  uninstallNpmExtension,
103
104
  writeSystemsConfig
104
- } from "./chunk-RUIVWCYY.js";
105
+ } from "./chunk-TEZRVSSB.js";
105
106
  import {
106
107
  loadMergedEnv,
107
108
  mindEnvPath,
@@ -109,7 +110,7 @@ import {
109
110
  sharedEnvPath,
110
111
  writeEnv
111
112
  } from "./chunk-PMMHVSCR.js";
112
- import "./chunk-4L2Q7IP5.js";
113
+ import "./chunk-2TR2OPVA.js";
113
114
  import {
114
115
  applyInitFiles,
115
116
  composeTemplate,
@@ -136,7 +137,39 @@ import {
136
137
  syncBuiltinSkills,
137
138
  uninstallSkill,
138
139
  updateSkill
139
- } from "./chunk-QJGLTPAP.js";
140
+ } from "./chunk-VUM2K6EN.js";
141
+ import {
142
+ addMessage,
143
+ createChannel,
144
+ createConversation,
145
+ deleteConversationForUser,
146
+ findDMConversation,
147
+ fireWebhook,
148
+ formatChannelSettings,
149
+ getChannelByName,
150
+ getChannelName,
151
+ getChannelSettings,
152
+ getConversation,
153
+ getMessages,
154
+ getMessagesPaginated,
155
+ getParticipants,
156
+ getUnreadCounts,
157
+ initWebhook,
158
+ isConversationForMind,
159
+ isParticipant,
160
+ isParticipantOrOwner,
161
+ joinChannel,
162
+ leaveChannel,
163
+ listChannels,
164
+ listConversationsForMind,
165
+ listConversationsForUser,
166
+ listConversationsWithParticipants,
167
+ markConversationRead,
168
+ publish,
169
+ setConversationPrivate,
170
+ subscribe as subscribe2,
171
+ updateChannelSettings
172
+ } from "./chunk-5DPRTREW.js";
140
173
  import {
141
174
  readVoluteConfig,
142
175
  writeVoluteConfig
@@ -182,6 +215,10 @@ import {
182
215
  updateUserProfile,
183
216
  verifyUser
184
217
  } from "./chunk-UIM5NHPP.js";
218
+ import {
219
+ broadcast,
220
+ subscribe
221
+ } from "./chunk-N42QMDID.js";
185
222
  import {
186
223
  getAiConfig,
187
224
  getAvailableModels,
@@ -203,42 +240,6 @@ import {
203
240
  readGlobalConfig,
204
241
  writeGlobalConfig
205
242
  } from "./chunk-A6FLW5XD.js";
206
- import {
207
- addMessage,
208
- createChannel,
209
- createConversation,
210
- deleteConversationForUser,
211
- findDMConversation,
212
- fireWebhook,
213
- formatChannelSettings,
214
- getChannelByName,
215
- getChannelName,
216
- getChannelSettings,
217
- getConversation,
218
- getMessages,
219
- getMessagesPaginated,
220
- getParticipants,
221
- getUnreadCounts,
222
- initWebhook,
223
- isConversationForMind,
224
- isParticipant,
225
- isParticipantOrOwner,
226
- joinChannel,
227
- leaveChannel,
228
- listChannels,
229
- listConversationsForMind,
230
- listConversationsForUser,
231
- listConversationsWithParticipants,
232
- markConversationRead,
233
- publish,
234
- setConversationPrivate,
235
- subscribe as subscribe2,
236
- updateChannelSettings
237
- } from "./chunk-5DPRTREW.js";
238
- import {
239
- broadcast,
240
- subscribe
241
- } from "./chunk-N42QMDID.js";
242
243
  import {
243
244
  logBuffer,
244
245
  logger_default
@@ -1431,6 +1432,7 @@ var oauthFlows = /* @__PURE__ */ new Map();
1431
1432
  function cleanupOAuthFlows() {
1432
1433
  for (const [id, flow] of oauthFlows) {
1433
1434
  if (flow.status === "pending") {
1435
+ flow.resolveCode?.("");
1434
1436
  flow.abortController?.abort();
1435
1437
  }
1436
1438
  oauthFlows.delete(id);
@@ -2085,8 +2087,8 @@ async function fanOutToBridgedMinds(opts) {
2085
2087
  const participants = await getParticipants(opts.conversationId);
2086
2088
  const mindParticipants = participants.filter((p) => p.userType === "mind");
2087
2089
  const participantNames = participants.map((p) => p.username);
2088
- const { getMindManager: getMindManager2 } = await import("./mind-manager-VOEQ2IZL.js");
2089
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
2090
+ const { getMindManager: getMindManager2 } = await import("./mind-manager-5G6P2EAT.js");
2091
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
2090
2092
  const manager = getMindManager2();
2091
2093
  const sm = getSleepManagerIfReady2();
2092
2094
  const targetMinds = mindParticipants.filter((ap) => {
@@ -2298,7 +2300,7 @@ async function notifyMind(mindName, message) {
2298
2300
  const entry = await findMind(mindName);
2299
2301
  if (!entry) return;
2300
2302
  try {
2301
- const { sendSystemMessage } = await import("./system-chat-7AIN3U5M.js");
2303
+ const { sendSystemMessage } = await import("./system-chat-YUIT7RA6.js");
2302
2304
  await sendSystemMessage(mindName, message);
2303
2305
  } catch (err) {
2304
2306
  logger_default.warn(`[file-sharing] notify mind ${mindName} failed`, logger_default.errorData(err));
@@ -3524,7 +3526,7 @@ async function getMindStatus(name, port, registryRunning) {
3524
3526
  const manager = getMindManager();
3525
3527
  let status = "stopped";
3526
3528
  try {
3527
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
3529
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
3528
3530
  if (getSleepManagerIfReady2()?.isSleeping(name)) {
3529
3531
  status = "sleeping";
3530
3532
  }
@@ -4072,7 +4074,7 @@ The human who planted you described you as: "${body.description}"
4072
4074
  try {
4073
4075
  const spiritEntry = await findMind("volute");
4074
4076
  if (spiritEntry) {
4075
- const { spiritDir } = await import("./spirit-4QOYM33G.js");
4077
+ const { spiritDir } = await import("./spirit-ZFYG4JOH.js");
4076
4078
  const sDir = spiritEntry.dir ?? spiritDir();
4077
4079
  const spiritConfig = readVoluteConfig(sDir) ?? {};
4078
4080
  const schedules = spiritConfig.schedules ?? [];
@@ -4087,7 +4089,7 @@ The human who planted you described you as: "${body.description}"
4087
4089
  });
4088
4090
  spiritConfig.schedules = schedules;
4089
4091
  writeVoluteConfig(sDir, spiritConfig);
4090
- const { getScheduler: getScheduler2 } = await import("./scheduler-355E746X.js");
4092
+ const { getScheduler: getScheduler2 } = await import("./scheduler-ZRUZNQI5.js");
4091
4093
  getScheduler2().loadSchedules("volute", sDir);
4092
4094
  }
4093
4095
  }
@@ -4378,7 +4380,7 @@ ${user.trimEnd()}
4378
4380
  const manager = getMindManager();
4379
4381
  try {
4380
4382
  if (context?.type === "reload") {
4381
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
4383
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
4382
4384
  const sleepState = getSleepManagerIfReady2()?.getState(name);
4383
4385
  if (sleepState?.sleeping) {
4384
4386
  logger_default.info(`skipping reload for ${name} during sleep \u2014 will apply on next wake`);
@@ -4473,7 +4475,7 @@ ${user.trimEnd()}
4473
4475
  const name = c.req.param("name");
4474
4476
  const entry = await findMind(name);
4475
4477
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4476
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
4478
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
4477
4479
  const sm = getSleepManagerIfReady2();
4478
4480
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4479
4481
  return c.json(sm.getState(name));
@@ -4481,7 +4483,7 @@ ${user.trimEnd()}
4481
4483
  const name = c.req.param("name");
4482
4484
  const entry = await findMind(name);
4483
4485
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4484
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
4486
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
4485
4487
  const sm = getSleepManagerIfReady2();
4486
4488
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4487
4489
  if (sm.isSleeping(name)) return c.json({ error: "Mind is already sleeping" }, 409);
@@ -4501,7 +4503,7 @@ ${user.trimEnd()}
4501
4503
  const name = c.req.param("name");
4502
4504
  const entry = await findMind(name);
4503
4505
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4504
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
4506
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
4505
4507
  const sm = getSleepManagerIfReady2();
4506
4508
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4507
4509
  const sleepState = sm.getState(name);
@@ -4516,7 +4518,7 @@ ${user.trimEnd()}
4516
4518
  const name = c.req.param("name");
4517
4519
  const entry = await findMind(name);
4518
4520
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4519
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
4521
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
4520
4522
  const sm = getSleepManagerIfReady2();
4521
4523
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4522
4524
  const flushed = await sm.flushQueuedMessages(name);
@@ -4619,7 +4621,7 @@ ${user.trimEnd()}
4619
4621
  try {
4620
4622
  const spiritEntry = await findMind("volute");
4621
4623
  if (spiritEntry) {
4622
- const { spiritDir } = await import("./spirit-4QOYM33G.js");
4624
+ const { spiritDir } = await import("./spirit-ZFYG4JOH.js");
4623
4625
  const sDir = spiritEntry.dir ?? spiritDir();
4624
4626
  const spiritConfig = readVoluteConfig(sDir);
4625
4627
  if (spiritConfig?.schedules) {
@@ -4627,7 +4629,7 @@ ${user.trimEnd()}
4627
4629
  spiritConfig.schedules = spiritConfig.schedules.filter((s) => s.id !== nurtureId);
4628
4630
  if (spiritConfig.schedules.length === 0) spiritConfig.schedules = void 0;
4629
4631
  writeVoluteConfig(sDir, spiritConfig);
4630
- const { getScheduler: getScheduler2 } = await import("./scheduler-355E746X.js");
4632
+ const { getScheduler: getScheduler2 } = await import("./scheduler-ZRUZNQI5.js");
4631
4633
  getScheduler2().loadSchedules("volute", sDir);
4632
4634
  }
4633
4635
  }
@@ -4999,7 +5001,8 @@ ${user.trimEnd()}
4999
5001
  maxThinkingTokens: config2?.maxThinkingTokens ?? templateConfig.maxThinkingTokens ?? null,
5000
5002
  tokenBudget: config2?.tokenBudget ?? null,
5001
5003
  tokenBudgetPeriodMinutes: config2?.tokenBudgetPeriodMinutes ?? null,
5002
- compaction: templateConfig.compaction ?? null
5004
+ compaction: templateConfig.compaction ?? null,
5005
+ unescapeNewlines: config2?.unescapeNewlines === true
5003
5006
  }
5004
5007
  });
5005
5008
  }).put(
@@ -5013,7 +5016,8 @@ ${user.trimEnd()}
5013
5016
  maxThinkingTokens: z5.number().int().positive().nullable().optional(),
5014
5017
  tokenBudget: z5.number().int().positive().nullable().optional(),
5015
5018
  tokenBudgetPeriodMinutes: z5.number().int().positive().nullable().optional(),
5016
- compaction: z5.object({ maxContextTokens: z5.number().int().positive().nullable().optional() }).nullable().optional()
5019
+ compaction: z5.object({ maxContextTokens: z5.number().int().positive().nullable().optional() }).nullable().optional(),
5020
+ unescapeNewlines: z5.boolean().optional()
5017
5021
  })
5018
5022
  ),
5019
5023
  async (c) => {
@@ -5049,7 +5053,14 @@ ${user.trimEnd()}
5049
5053
  existing.maxThinkingTokens = body.maxThinkingTokens;
5050
5054
  }
5051
5055
  }
5056
+ if (body.unescapeNewlines !== void 0) {
5057
+ existing.unescapeNewlines = body.unescapeNewlines;
5058
+ }
5052
5059
  writeVoluteConfig(dir, existing);
5060
+ if (body.unescapeNewlines !== void 0) {
5061
+ const { clearEchoTextCache } = await import("./echo-text-ADKLNTIA.js");
5062
+ clearEchoTextCache(name);
5063
+ }
5053
5064
  const needsConfigJson = body.model !== void 0 || body.thinkingLevel !== void 0 || body.maxThinkingTokens !== void 0 || body.compaction !== void 0;
5054
5065
  if (needsConfigJson) {
5055
5066
  const configJsonPath = resolve10(dir, "home/.config/config.json");
@@ -5862,7 +5873,7 @@ var app15 = new Hono17().get("/:name/clock/status", async (c) => {
5862
5873
  const body = await c.req.text();
5863
5874
  const message = `[webhook: ${event}] ${body}`;
5864
5875
  try {
5865
- const { sendSystemMessage } = await import("./system-chat-7AIN3U5M.js");
5876
+ const { sendSystemMessage } = await import("./system-chat-YUIT7RA6.js");
5866
5877
  await sendSystemMessage(name, message);
5867
5878
  return c.json({ ok: true });
5868
5879
  } catch (err) {
@@ -5912,7 +5923,7 @@ setup.get("/status", async (c) => {
5912
5923
  });
5913
5924
  }
5914
5925
  const config2 = readGlobalConfig();
5915
- const hasSystem = config2.setup != null;
5926
+ const hasSystem = config2.setup != null && !!config2.name;
5916
5927
  let hasAccount = false;
5917
5928
  if (hasSystem) {
5918
5929
  try {
@@ -5923,7 +5934,12 @@ setup.get("/status", async (c) => {
5923
5934
  logger_default.debug("could not check for existing accounts during setup status", logger_default.errorData(err));
5924
5935
  }
5925
5936
  }
5926
- return c.json({ complete, hasSystem, hasAccount });
5937
+ return c.json({
5938
+ complete,
5939
+ hasSystem,
5940
+ hasAccount,
5941
+ setupType: config2.setup?.type ?? null
5942
+ });
5927
5943
  });
5928
5944
  setup.post("/configure", async (c) => {
5929
5945
  if (isSetupComplete()) {
@@ -5965,11 +5981,28 @@ setup.post("/system", async (c) => {
5965
5981
  return c.json({ error: "System name is required" }, 400);
5966
5982
  }
5967
5983
  try {
5968
- const config2 = writeSetupConfig(body.name.trim(), body.description?.trim());
5969
- if (body.remote) {
5984
+ const existing = readGlobalConfig();
5985
+ let config2;
5986
+ if (existing.setup) {
5987
+ config2 = {
5988
+ ...existing,
5989
+ name: body.name.trim(),
5990
+ description: body.description?.trim() || existing.description,
5991
+ setupCompleted: false
5992
+ };
5993
+ } else {
5994
+ config2 = writeSetupConfig(body.name.trim(), body.description?.trim());
5995
+ }
5996
+ if (body.remote && !config2.hostname) {
5970
5997
  config2.hostname = "0.0.0.0";
5971
- writeGlobalConfig(config2);
5972
5998
  }
5999
+ if (body.tailscale) {
6000
+ config2.tailscale = true;
6001
+ }
6002
+ if (body.service && config2.setup) {
6003
+ config2.setup.service = true;
6004
+ }
6005
+ writeGlobalConfig(config2);
5973
6006
  return c.json({ ok: true });
5974
6007
  } catch (err) {
5975
6008
  return c.json({ error: `Failed to write configuration: ${err.message}` }, 500);
@@ -6169,11 +6202,30 @@ setup.post("/complete", async (c) => {
6169
6202
  return c.json({ error: "Setup already complete" }, 400);
6170
6203
  }
6171
6204
  try {
6172
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-4QOYM33G.js");
6173
- const { startSpiritFull } = await import("./mind-service-WRTOQSAL.js");
6205
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-ZFYG4JOH.js");
6206
+ const { startSpiritFull } = await import("./mind-service-FDATHL6X.js");
6174
6207
  await ensureSpiritProject();
6175
6208
  await syncSpiritTemplate();
6176
6209
  const warnings = [];
6210
+ const config2 = readGlobalConfig();
6211
+ if (config2.setup?.service && config2.setup?.type === "local") {
6212
+ try {
6213
+ const { installUserService } = await import("./service-install-AIQBLE6P.js");
6214
+ const installed = await installUserService(config2.port, config2.hostname);
6215
+ if (!installed) {
6216
+ warnings.push("Service installation is not supported on this platform.");
6217
+ config2.setup.service = false;
6218
+ writeGlobalConfig(config2);
6219
+ }
6220
+ } catch (err) {
6221
+ logger_default.warn("user service install failed during setup (non-fatal)", logger_default.errorData(err));
6222
+ warnings.push(
6223
+ "Failed to install service \u2014 you can start Volute manually with `volute up`."
6224
+ );
6225
+ config2.setup.service = false;
6226
+ writeGlobalConfig(config2);
6227
+ }
6228
+ }
6177
6229
  let spiritStarted = false;
6178
6230
  try {
6179
6231
  logger_default.info("starting spirit during setup...");
@@ -6209,7 +6261,7 @@ setup.post("/complete", async (c) => {
6209
6261
  logger_default.info("setup complete state", { spiritConversationId, spiritStarted });
6210
6262
  if (spiritConversationId && spiritStarted) {
6211
6263
  try {
6212
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-NWL7XEIX.js");
6264
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-54IXVE5H.js");
6213
6265
  const { listUsersByType: listUsers2 } = await import("./auth-2QOOPMBX.js");
6214
6266
  const admins = await listUsers2("brain");
6215
6267
  const admin2 = admins.find((u) => u.role === "admin");
@@ -6231,9 +6283,9 @@ setup.post("/complete", async (c) => {
6231
6283
  );
6232
6284
  }
6233
6285
  }
6234
- const config2 = readGlobalConfig();
6235
- config2.setupCompleted = true;
6236
- writeGlobalConfig(config2);
6286
+ const finalConfig = readGlobalConfig();
6287
+ finalConfig.setupCompleted = true;
6288
+ writeGlobalConfig(finalConfig);
6237
6289
  return c.json({
6238
6290
  ok: true,
6239
6291
  spiritConversationId,
@@ -7309,6 +7361,15 @@ var unifiedChatApp = new Hono26().post(
7309
7361
  contentBlocks.push({ type: "image", media_type: img.media_type, data: img.data });
7310
7362
  }
7311
7363
  }
7364
+ if (senderIsMind) {
7365
+ const vCfg = readVoluteConfig(mindDir(baseName ?? senderName));
7366
+ const shouldUnescapeNewlines = vCfg?.unescapeNewlines === true;
7367
+ for (const block of contentBlocks) {
7368
+ if (block.type === "text") {
7369
+ block.text = fixModelEscapes(block.text, shouldUnescapeNewlines);
7370
+ }
7371
+ }
7372
+ }
7312
7373
  if (senderIsMind && conv.type === "channel" && convName) {
7313
7374
  try {
7314
7375
  const chSettings = await getChannelSettings(convName);
@@ -7778,12 +7839,21 @@ async function startDaemon(opts) {
7778
7839
  );
7779
7840
  }
7780
7841
  const token = process.env.VOLUTE_DAEMON_TOKEN || randomBytes(32).toString("hex");
7842
+ const { readGlobalConfig: readGlobalConfig2 } = await import("./setup-PF7JSFMO.js");
7843
+ const globalCfg = readGlobalConfig2();
7781
7844
  let tls;
7782
- if (opts.tailscale) {
7783
- const { getTailscaleTls } = await import("./tailscale-LTYNKIPZ.js");
7784
- const tlsConfig = await getTailscaleTls();
7785
- tls = { key: tlsConfig.key, cert: tlsConfig.cert };
7786
- logger_default.info("Tailscale HTTPS enabled", { hostname: tlsConfig.hostname });
7845
+ if (opts.tailscale || globalCfg.tailscale) {
7846
+ try {
7847
+ const { getTailscaleTls } = await import("./tailscale-LTYNKIPZ.js");
7848
+ const tlsConfig = await getTailscaleTls();
7849
+ tls = { key: tlsConfig.key, cert: tlsConfig.cert };
7850
+ logger_default.info("Tailscale HTTPS enabled", { hostname: tlsConfig.hostname });
7851
+ } catch (err) {
7852
+ logger_default.error(
7853
+ "Tailscale TLS setup failed \u2014 starting without HTTPS. Ensure Tailscale is running, or disable tailscale in config.",
7854
+ logger_default.errorData(err)
7855
+ );
7856
+ }
7787
7857
  }
7788
7858
  let result;
7789
7859
  try {
@@ -7855,8 +7925,8 @@ async function startDaemon(opts) {
7855
7925
  try {
7856
7926
  const { isSetupComplete: isSetupComplete2 } = await import("./setup-PF7JSFMO.js");
7857
7927
  if (isSetupComplete2()) {
7858
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-4QOYM33G.js");
7859
- const { startSpiritFull } = await import("./mind-service-WRTOQSAL.js");
7928
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-ZFYG4JOH.js");
7929
+ const { startSpiritFull } = await import("./mind-service-FDATHL6X.js");
7860
7930
  await ensureSpiritProject();
7861
7931
  await syncSpiritTemplate();
7862
7932
  const spiritEntry = await findMind("volute");
@@ -7873,7 +7943,7 @@ async function startDaemon(opts) {
7873
7943
  bridgeManager.startBridges(daemonPort).catch((err) => {
7874
7944
  logger_default.warn("failed to start bridges", logger_default.errorData(err));
7875
7945
  });
7876
- import("./cloud-sync-EZKCEIBX.js").then(
7946
+ import("./cloud-sync-PEM3IVI4.js").then(
7877
7947
  ({ consumeQueuedMessages }) => consumeQueuedMessages().catch((err) => {
7878
7948
  logger_default.warn("failed to consume queued cloud messages", logger_default.errorData(err));
7879
7949
  })
@@ -7881,7 +7951,7 @@ async function startDaemon(opts) {
7881
7951
  logger_default.warn("failed to load cloud-sync module", logger_default.errorData(err));
7882
7952
  });
7883
7953
  try {
7884
- const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-NCRIN5QK.js");
7954
+ const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-764EXVQQ.js");
7885
7955
  backfillTemplateHashes();
7886
7956
  notifyVersionUpdate().catch((err) => {
7887
7957
  logger_default.warn("failed to send version update notifications", logger_default.errorData(err));
@@ -3,11 +3,12 @@ import {
3
3
  DeliveryManager,
4
4
  getDeliveryManager,
5
5
  initDeliveryManager
6
- } from "./chunk-RUIVWCYY.js";
6
+ } from "./chunk-TEZRVSSB.js";
7
7
  import "./chunk-PMMHVSCR.js";
8
- import "./chunk-4L2Q7IP5.js";
8
+ import "./chunk-2TR2OPVA.js";
9
9
  import "./chunk-46DYYHN6.js";
10
- import "./chunk-QJGLTPAP.js";
10
+ import "./chunk-VUM2K6EN.js";
11
+ import "./chunk-5DPRTREW.js";
11
12
  import "./chunk-CU6OFXMM.js";
12
13
  import "./chunk-KXXJYY62.js";
13
14
  import "./chunk-7AZQFSOV.js";
@@ -15,10 +16,9 @@ import "./chunk-GVVVMZ4J.js";
15
16
  import "./chunk-3F7XK5Q7.js";
16
17
  import "./chunk-SNW2NPP4.js";
17
18
  import "./chunk-UIM5NHPP.js";
19
+ import "./chunk-N42QMDID.js";
18
20
  import "./chunk-ORNY3MZR.js";
19
21
  import "./chunk-A6FLW5XD.js";
20
- import "./chunk-5DPRTREW.js";
21
- import "./chunk-N42QMDID.js";
22
22
  import "./chunk-T2TP6ZC6.js";
23
23
  import "./chunk-2NHRJ3YO.js";
24
24
  import "./chunk-CJ26DXZL.js";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  run,
4
4
  stopDaemon
5
- } from "./chunk-MQRS4J24.js";
6
- import "./chunk-TNZ5XQA4.js";
5
+ } from "./chunk-LN67VPZJ.js";
7
6
  import "./chunk-TXSA4Q3V.js";
8
7
  import "./chunk-O7IGP7ZW.js";
8
+ import "./chunk-TNZ5XQA4.js";
9
9
  import "./chunk-3F7XK5Q7.js";
10
10
  import "./chunk-SNW2NPP4.js";
11
11
  import "./chunk-2NHRJ3YO.js";
@@ -2,13 +2,14 @@
2
2
  import {
3
3
  clearEchoTextCache,
4
4
  echoTextToChannel
5
- } from "./chunk-LIIX2MOM.js";
5
+ } from "./chunk-PLL2FM7A.js";
6
6
  import "./chunk-LQ6Z4FXN.js";
7
- import "./chunk-RUIVWCYY.js";
7
+ import "./chunk-TEZRVSSB.js";
8
8
  import "./chunk-PMMHVSCR.js";
9
- import "./chunk-4L2Q7IP5.js";
9
+ import "./chunk-2TR2OPVA.js";
10
10
  import "./chunk-46DYYHN6.js";
11
- import "./chunk-QJGLTPAP.js";
11
+ import "./chunk-VUM2K6EN.js";
12
+ import "./chunk-5DPRTREW.js";
12
13
  import "./chunk-CU6OFXMM.js";
13
14
  import "./chunk-KXXJYY62.js";
14
15
  import "./chunk-7AZQFSOV.js";
@@ -16,10 +17,9 @@ import "./chunk-GVVVMZ4J.js";
16
17
  import "./chunk-3F7XK5Q7.js";
17
18
  import "./chunk-SNW2NPP4.js";
18
19
  import "./chunk-UIM5NHPP.js";
20
+ import "./chunk-N42QMDID.js";
19
21
  import "./chunk-ORNY3MZR.js";
20
22
  import "./chunk-A6FLW5XD.js";
21
- import "./chunk-5DPRTREW.js";
22
- import "./chunk-N42QMDID.js";
23
23
  import "./chunk-T2TP6ZC6.js";
24
24
  import "./chunk-LGNUFVMR.js";
25
25
  import "./chunk-2NHRJ3YO.js";
@@ -13,11 +13,12 @@ import {
13
13
  parseCommandArgs,
14
14
  setExtensionEnabled,
15
15
  uninstallNpmExtension
16
- } from "./chunk-RUIVWCYY.js";
16
+ } from "./chunk-TEZRVSSB.js";
17
17
  import "./chunk-PMMHVSCR.js";
18
- import "./chunk-4L2Q7IP5.js";
18
+ import "./chunk-2TR2OPVA.js";
19
19
  import "./chunk-46DYYHN6.js";
20
- import "./chunk-QJGLTPAP.js";
20
+ import "./chunk-VUM2K6EN.js";
21
+ import "./chunk-5DPRTREW.js";
21
22
  import "./chunk-CU6OFXMM.js";
22
23
  import "./chunk-KXXJYY62.js";
23
24
  import "./chunk-7AZQFSOV.js";
@@ -25,10 +26,9 @@ import "./chunk-GVVVMZ4J.js";
25
26
  import "./chunk-3F7XK5Q7.js";
26
27
  import "./chunk-SNW2NPP4.js";
27
28
  import "./chunk-UIM5NHPP.js";
29
+ import "./chunk-N42QMDID.js";
28
30
  import "./chunk-ORNY3MZR.js";
29
31
  import "./chunk-A6FLW5XD.js";
30
- import "./chunk-5DPRTREW.js";
31
- import "./chunk-N42QMDID.js";
32
32
  import "./chunk-T2TP6ZC6.js";
33
33
  import "./chunk-2NHRJ3YO.js";
34
34
  import "./chunk-CJ26DXZL.js";
@@ -8,11 +8,12 @@ import {
8
8
  tagRecentInbound,
9
9
  tagUntaggedInbound,
10
10
  tagUntaggedOutbound
11
- } from "./chunk-RUIVWCYY.js";
11
+ } from "./chunk-TEZRVSSB.js";
12
12
  import "./chunk-PMMHVSCR.js";
13
- import "./chunk-4L2Q7IP5.js";
13
+ import "./chunk-2TR2OPVA.js";
14
14
  import "./chunk-46DYYHN6.js";
15
- import "./chunk-QJGLTPAP.js";
15
+ import "./chunk-VUM2K6EN.js";
16
+ import "./chunk-5DPRTREW.js";
16
17
  import "./chunk-CU6OFXMM.js";
17
18
  import "./chunk-KXXJYY62.js";
18
19
  import "./chunk-7AZQFSOV.js";
@@ -20,10 +21,9 @@ import "./chunk-GVVVMZ4J.js";
20
21
  import "./chunk-3F7XK5Q7.js";
21
22
  import "./chunk-SNW2NPP4.js";
22
23
  import "./chunk-UIM5NHPP.js";
24
+ import "./chunk-N42QMDID.js";
23
25
  import "./chunk-ORNY3MZR.js";
24
26
  import "./chunk-A6FLW5XD.js";
25
- import "./chunk-5DPRTREW.js";
26
- import "./chunk-N42QMDID.js";
27
27
  import "./chunk-T2TP6ZC6.js";
28
28
  import "./chunk-2NHRJ3YO.js";
29
29
  import "./chunk-CJ26DXZL.js";
@@ -82,11 +82,11 @@ var cmd = subcommands({
82
82
  },
83
83
  seed: {
84
84
  description: "(legacy) Use 'volute seed create' instead",
85
- run: (args) => import("./seed-6S4Z6TAM.js").then((m) => m.run(args))
85
+ run: (args) => import("./seed-3KH4ZRJL.js").then((m) => m.run(args))
86
86
  },
87
87
  sprout: {
88
88
  description: "(legacy) Use 'volute seed sprout' instead",
89
- run: (args) => import("./sprout-UDLZPMEO.js").then((m) => m.run(args))
89
+ run: (args) => import("./sprout-FLBCETYG.js").then((m) => m.run(args))
90
90
  }
91
91
  },
92
92
  footer: "Mind name can be omitted (where applicable) if VOLUTE_MIND is set."
@@ -3,11 +3,12 @@ import {
3
3
  MindManager,
4
4
  getMindManager,
5
5
  initMindManager
6
- } from "./chunk-RUIVWCYY.js";
6
+ } from "./chunk-TEZRVSSB.js";
7
7
  import "./chunk-PMMHVSCR.js";
8
- import "./chunk-4L2Q7IP5.js";
8
+ import "./chunk-2TR2OPVA.js";
9
9
  import "./chunk-46DYYHN6.js";
10
- import "./chunk-QJGLTPAP.js";
10
+ import "./chunk-VUM2K6EN.js";
11
+ import "./chunk-5DPRTREW.js";
11
12
  import "./chunk-CU6OFXMM.js";
12
13
  import "./chunk-KXXJYY62.js";
13
14
  import "./chunk-7AZQFSOV.js";
@@ -15,10 +16,9 @@ import "./chunk-GVVVMZ4J.js";
15
16
  import "./chunk-3F7XK5Q7.js";
16
17
  import "./chunk-SNW2NPP4.js";
17
18
  import "./chunk-UIM5NHPP.js";
19
+ import "./chunk-N42QMDID.js";
18
20
  import "./chunk-ORNY3MZR.js";
19
21
  import "./chunk-A6FLW5XD.js";
20
- import "./chunk-5DPRTREW.js";
21
- import "./chunk-N42QMDID.js";
22
22
  import "./chunk-T2TP6ZC6.js";
23
23
  import "./chunk-2NHRJ3YO.js";
24
24
  import "./chunk-CJ26DXZL.js";
@@ -6,11 +6,12 @@ import {
6
6
  stopMindFull,
7
7
  stopSpiritFull,
8
8
  wakeMind
9
- } from "./chunk-RUIVWCYY.js";
9
+ } from "./chunk-TEZRVSSB.js";
10
10
  import "./chunk-PMMHVSCR.js";
11
- import "./chunk-4L2Q7IP5.js";
11
+ import "./chunk-2TR2OPVA.js";
12
12
  import "./chunk-46DYYHN6.js";
13
- import "./chunk-QJGLTPAP.js";
13
+ import "./chunk-VUM2K6EN.js";
14
+ import "./chunk-5DPRTREW.js";
14
15
  import "./chunk-CU6OFXMM.js";
15
16
  import "./chunk-KXXJYY62.js";
16
17
  import "./chunk-7AZQFSOV.js";
@@ -18,10 +19,9 @@ import "./chunk-GVVVMZ4J.js";
18
19
  import "./chunk-3F7XK5Q7.js";
19
20
  import "./chunk-SNW2NPP4.js";
20
21
  import "./chunk-UIM5NHPP.js";
22
+ import "./chunk-N42QMDID.js";
21
23
  import "./chunk-ORNY3MZR.js";
22
24
  import "./chunk-A6FLW5XD.js";
23
- import "./chunk-5DPRTREW.js";
24
- import "./chunk-N42QMDID.js";
25
25
  import "./chunk-T2TP6ZC6.js";
26
26
  import "./chunk-2NHRJ3YO.js";
27
27
  import "./chunk-CJ26DXZL.js";