volute 0.41.1 → 0.42.1

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 (92) hide show
  1. package/dist/{accept-7YVHZKRD.js → accept-N5XULCXK.js} +1 -1
  2. package/dist/{ai-service-XCLE3MQP.js → ai-service-3GBOJGUA.js} +10 -2
  3. package/dist/{bridge-WPYSOQKR.js → bridge-2PO3AI5D.js} +1 -1
  4. package/dist/{chat-7DOENBY2.js → chat-LYL5CWJV.js} +8 -8
  5. package/dist/{chunk-MYJSKXGH.js → chunk-43K5UWF7.js} +3 -3
  6. package/dist/{chunk-IJCZAYGT.js → chunk-4ZSUUBG5.js} +97 -2
  7. package/dist/{chunk-F44AEQAW.js → chunk-6G7R2LPI.js} +13 -13
  8. package/dist/{chunk-OSUF75I7.js → chunk-BR6KFHVT.js} +1 -1
  9. package/dist/{chunk-GCS64EAD.js → chunk-BWZHX46O.js} +3 -3
  10. package/dist/{chunk-ULNQ6OC4.js → chunk-JPDN6ZRJ.js} +9 -6
  11. package/dist/{chunk-EKLRS2SX.js → chunk-JU5GWO77.js} +2 -2
  12. package/dist/chunk-KZAL7HEQ.js +141 -0
  13. package/dist/{chunk-MJIJFCAH.js → chunk-M3T3Y6FT.js} +2 -2
  14. package/dist/{chunk-G777ME4L.js → chunk-NSGIVS5T.js} +1 -1
  15. package/dist/{chunk-CGPESELY.js → chunk-P6DPB33N.js} +19 -3
  16. package/dist/{chunk-IFNSAOA4.js → chunk-RBNMDAKB.js} +4 -0
  17. package/dist/{chunk-763WUVJQ.js → chunk-WR7CSHQ4.js} +1 -1
  18. package/dist/cli.js +21 -21
  19. package/dist/{clock-HP2TGMG5.js → clock-K43IMROX.js} +3 -3
  20. package/dist/{cloud-sync-2XVXEOSU.js → cloud-sync-E3ZL5SZ4.js} +7 -7
  21. package/dist/{config-W7MS3PWY.js → config-TJLYUV3U.js} +3 -3
  22. package/dist/{create-CJ2SR4EU.js → create-DF3KISTW.js} +1 -1
  23. package/dist/{create-OTM46ZUM.js → create-ERNQYOCK.js} +2 -2
  24. package/dist/{daemon-client-EWDPOOHC.js → daemon-client-IYR4KCPU.js} +3 -1
  25. package/dist/{daemon-restart-HDVGTYH7.js → daemon-restart-QBZOMILO.js} +4 -4
  26. package/dist/daemon.js +99 -51
  27. package/dist/{delete-4ND5PLE7.js → delete-BFMIGAIB.js} +1 -1
  28. package/dist/{delivery-manager-CPADWRV2.js → delivery-manager-J3BRHXUF.js} +7 -7
  29. package/dist/{down-DS6WCT34.js → down-DSRWSCXY.js} +2 -2
  30. package/dist/{echo-text-GEDEEY7M.js → echo-text-3HBQUWPX.js} +9 -8
  31. package/dist/{env-XX2MBZCZ.js → env-VZ4MLFQW.js} +1 -1
  32. package/dist/{export-5DOQV2WM.js → export-WYI3E3TB.js} +1 -1
  33. package/dist/{extension-BCFYXI7A.js → extension-SEID47SR.js} +1 -1
  34. package/dist/{extensions-SU3N4COT.js → extensions-X6MKBJLB.js} +7 -7
  35. package/dist/{files-K2MEMV3W.js → files-COTCVBGO.js} +1 -1
  36. package/dist/{import-V6QEHMPQ.js → import-EPK6WCYS.js} +2 -2
  37. package/dist/{join-4S3KT7NE.js → join-RXPXGV4L.js} +1 -1
  38. package/dist/{list-XJB5WII6.js → list-OXIAY3W7.js} +1 -1
  39. package/dist/{login-PHMTLNUF.js → login-GPBXOU4D.js} +1 -1
  40. package/dist/{login-YWD6PUOT.js → login-MY6ETFYB.js} +1 -1
  41. package/dist/{logout-BP3R3CAA.js → logout-DNNTIYE2.js} +1 -1
  42. package/dist/{logout-Q2WICH4V.js → logout-NCG3TMDL.js} +1 -1
  43. package/dist/{message-delivery-HPMELC4Q.js → message-delivery-4ZWFDBAY.js} +7 -7
  44. package/dist/{mind-APS4URT7.js → mind-K5PZHPBR.js} +18 -18
  45. package/dist/{mind-history-TDUQFYAG.js → mind-history-VRO5A76U.js} +1 -1
  46. package/dist/{mind-list-2T353Q5G.js → mind-list-4D7J4CHD.js} +1 -1
  47. package/dist/{mind-manager-74XQZEGX.js → mind-manager-6DSY5IJW.js} +7 -7
  48. package/dist/{mind-profile-2HHR7LZ7.js → mind-profile-PEQYASQX.js} +1 -1
  49. package/dist/{mind-service-XGXSMQP6.js → mind-service-R2FM53KD.js} +7 -7
  50. package/dist/{mind-sleep-4NXV4J4U.js → mind-sleep-YMBR3I35.js} +1 -1
  51. package/dist/{mind-status-CG66OXDK.js → mind-status-UO34ASXZ.js} +1 -1
  52. package/dist/{mind-wake-TNB54DBR.js → mind-wake-LCLGTXA2.js} +1 -1
  53. package/dist/{package-MVFX22K5.js → package-G4AM2IDZ.js} +1 -1
  54. package/dist/{read-JLR4NQXU.js → read-QVAXMTPV.js} +1 -1
  55. package/dist/{register-IQ2M4UO6.js → register-Y2H4PY5R.js} +1 -1
  56. package/dist/{reject-N2D4CZND.js → reject-EV35X64Y.js} +1 -1
  57. package/dist/{restart-43A5MBGV.js → restart-FJQ662XJ.js} +1 -1
  58. package/dist/{sandbox-ND53WZVU.js → sandbox-E7RWZDVG.js} +2 -2
  59. package/dist/{scheduler-MEBQF5MW.js → scheduler-2FKQCRCM.js} +7 -7
  60. package/dist/{seed-L4XFZ3VX.js → seed-SKVSWF7S.js} +1 -1
  61. package/dist/{seed-check-N5ALJBT6.js → seed-check-VLTVILOV.js} +1 -1
  62. package/dist/{seed-cmd-NSTPYJFC.js → seed-cmd-D2H5VLB4.js} +3 -3
  63. package/dist/{seed-create-ZYCZC46W.js → seed-create-BUSKQ5II.js} +4 -4
  64. package/dist/{seed-sprout-YXHU73XA.js → seed-sprout-R2IZPITD.js} +5 -5
  65. package/dist/{send-KQECN2EL.js → send-SLDFRSTL.js} +1 -1
  66. package/dist/{service-Q5OVY5AK.js → service-ZDOSEQCE.js} +1 -1
  67. package/dist/{service-install-GTDUHP6R.js → service-install-2HZPDHEY.js} +2 -2
  68. package/dist/{setup-RMR3TKCR.js → setup-IU3ID7II.js} +4 -4
  69. package/dist/{setup-FPFWDMXD.js → setup-IYOUPCIK.js} +5 -1
  70. package/dist/{skill-E43BI34Y.js → skill-FKFHIJRR.js} +1 -1
  71. package/dist/{skills-AOZF6U2B.js → skills-P6RGGASV.js} +2 -2
  72. package/dist/{sleep-manager-OHM3TO62.js → sleep-manager-F5KWIFOX.js} +7 -7
  73. package/dist/{spirit-ONLRFATY.js → spirit-XLD6QXSS.js} +4 -4
  74. package/dist/{split-5IBUODEE.js → split-WBMZXBHF.js} +1 -1
  75. package/dist/{sprout-2KJOQZCL.js → sprout-QV2RJM5W.js} +1 -1
  76. package/dist/{start-5AYFGNS7.js → start-5JE3TV66.js} +1 -1
  77. package/dist/{status-ECZHHSY5.js → status-QAKAPDYW.js} +9 -5
  78. package/dist/{stop-WJ6IG6OK.js → stop-AAMTG3TU.js} +1 -1
  79. package/dist/{system-chat-HZUKBIKJ.js → system-chat-EQIH6JVL.js} +7 -7
  80. package/dist/{systems-5MA57Q7G.js → systems-VNB5WKSS.js} +4 -4
  81. package/dist/{turn-tracker-TIX4DY2W.js → turn-tracker-Z5UJC4BY.js} +3 -3
  82. package/dist/{up-7KVNER6V.js → up-ZTPGC7HB.js} +3 -3
  83. package/dist/{update-OPR4KU4M.js → update-NY3XBVAJ.js} +6 -6
  84. package/dist/{upgrade-QB7AHIKX.js → upgrade-37DAGF6H.js} +1 -1
  85. package/dist/{version-notify-UFFDUPCX.js → version-notify-P7UAR7HZ.js} +7 -7
  86. package/dist/web-assets/assets/{index-DaUp9iE2.js → index-CrFAsfiE.js} +10 -10
  87. package/dist/web-assets/assets/{index-DqHSW9Fr.css → index-D7udpBCx.css} +1 -1
  88. package/dist/web-assets/index.html +2 -2
  89. package/package.json +1 -1
  90. package/templates/codex/src/server.ts +8 -2
  91. package/templates/pi/src/lib/resolve-model.ts +50 -12
  92. package/dist/chunk-MA7MYEOK.js +0 -71
package/dist/daemon.js CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  fixModelEscapes,
31
31
  getPlatformDriver,
32
32
  routeOutboundBridge
33
- } from "./chunk-ULNQ6OC4.js";
33
+ } from "./chunk-JPDN6ZRJ.js";
34
34
  import {
35
35
  getBridgeConfig,
36
36
  readBridgesConfig,
@@ -98,7 +98,7 @@ import {
98
98
  tagUntaggedOutbound,
99
99
  uninstallNpmExtension,
100
100
  writeSystemsConfig
101
- } from "./chunk-F44AEQAW.js";
101
+ } from "./chunk-6G7R2LPI.js";
102
102
  import {
103
103
  loadMergedEnv,
104
104
  mindEnvPath,
@@ -106,7 +106,7 @@ import {
106
106
  sharedEnvPath,
107
107
  writeEnv
108
108
  } from "./chunk-BLOAJLGI.js";
109
- import "./chunk-MYJSKXGH.js";
109
+ import "./chunk-43K5UWF7.js";
110
110
  import {
111
111
  applyInitFiles,
112
112
  applyTemplateHomeFiles,
@@ -135,7 +135,7 @@ import {
135
135
  syncBuiltinSkills,
136
136
  uninstallSkill,
137
137
  updateSkill
138
- } from "./chunk-MJIJFCAH.js";
138
+ } from "./chunk-M3T3Y6FT.js";
139
139
  import {
140
140
  addMessage,
141
141
  createChannel,
@@ -175,7 +175,7 @@ import {
175
175
  import {
176
176
  isSandboxEnabled,
177
177
  wrapForSandbox
178
- } from "./chunk-763WUVJQ.js";
178
+ } from "./chunk-WR7CSHQ4.js";
179
179
  import {
180
180
  getActiveMinds,
181
181
  onMindEvent,
@@ -206,7 +206,8 @@ import {
206
206
  summarizeTurn,
207
207
  takeErrored,
208
208
  trackToolUse
209
- } from "./chunk-GCS64EAD.js";
209
+ } from "./chunk-BWZHX46O.js";
210
+ import "./chunk-P6DPB33N.js";
210
211
  import {
211
212
  exec,
212
213
  gitExec,
@@ -221,13 +222,17 @@ import {
221
222
  wrapForIsolation
222
223
  } from "./chunk-TFBQESH7.js";
223
224
  import {
225
+ addCustomModel,
226
+ buildCustomModel,
224
227
  getAiConfig,
225
228
  getAvailableModels,
226
229
  getConfiguredProviders,
230
+ getCustomModels,
227
231
  getEnabledModels,
228
232
  getUtilityModel,
229
233
  qualifyModelId,
230
234
  removeAiConfig,
235
+ removeCustomModel,
231
236
  removeProviderConfig,
232
237
  resolveApiKey,
233
238
  resolveTemplate,
@@ -236,12 +241,12 @@ import {
236
241
  setProviderRefreshHook,
237
242
  setUtilityModel,
238
243
  unqualifyModelId
239
- } from "./chunk-IJCZAYGT.js";
244
+ } from "./chunk-4ZSUUBG5.js";
240
245
  import {
241
246
  isSetupComplete,
242
247
  readGlobalConfig,
243
248
  writeGlobalConfig
244
- } from "./chunk-MA7MYEOK.js";
249
+ } from "./chunk-KZAL7HEQ.js";
245
250
  import {
246
251
  approveUser,
247
252
  changePassword,
@@ -1100,6 +1105,7 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1100
1105
  }).get("/ai/models", requireAdmin, async (c) => {
1101
1106
  const models = await getAvailableModels();
1102
1107
  const enabled = new Set(getEnabledModels());
1108
+ const customIds = new Set(getCustomModels().map((m) => m.id));
1103
1109
  return c.json(
1104
1110
  models.map((m) => ({
1105
1111
  id: m.id,
@@ -1107,7 +1113,8 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1107
1113
  provider: m.provider,
1108
1114
  contextWindow: m.contextWindow,
1109
1115
  maxTokens: m.maxTokens,
1110
- enabled: enabled.has(m.id)
1116
+ enabled: enabled.has(m.id),
1117
+ custom: customIds.has(m.id)
1111
1118
  }))
1112
1119
  );
1113
1120
  }).put(
@@ -1119,7 +1126,38 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1119
1126
  setEnabledModels(models);
1120
1127
  return c.json({ ok: true });
1121
1128
  }
1122
- ).get("/ai/defaults", requireAdmin, (c) => {
1129
+ ).post(
1130
+ "/ai/models/custom",
1131
+ requireAdmin,
1132
+ zValidator(
1133
+ "json",
1134
+ z.object({ provider: z.string().min(1), id: z.string().min(1), name: z.string().optional() })
1135
+ ),
1136
+ (c) => {
1137
+ const { provider, id, name } = c.req.valid("json");
1138
+ if (!buildCustomModel(provider, id)) {
1139
+ return c.json(
1140
+ { error: `No built-in model for provider "${provider}" to clone metadata from` },
1141
+ 400
1142
+ );
1143
+ }
1144
+ if (getCustomModels().some((m) => m.id === id && m.provider !== provider)) {
1145
+ return c.json(
1146
+ { error: `A custom model "${id}" is already registered under another provider` },
1147
+ 400
1148
+ );
1149
+ }
1150
+ addCustomModel(provider, id, name);
1151
+ setEnabledModels([.../* @__PURE__ */ new Set([...getEnabledModels(), id])]);
1152
+ return c.json({ ok: true });
1153
+ }
1154
+ ).delete("/ai/models/custom", requireAdmin, (c) => {
1155
+ const provider = c.req.query("provider");
1156
+ const id = c.req.query("id");
1157
+ if (!provider || !id) return c.json({ error: "provider and id are required" }, 400);
1158
+ removeCustomModel(provider, id);
1159
+ return c.json({ ok: true });
1160
+ }).get("/ai/defaults", requireAdmin, (c) => {
1123
1161
  const config2 = readGlobalConfig();
1124
1162
  return c.json({
1125
1163
  spiritModel: config2.spiritModel ?? null,
@@ -1978,8 +2016,8 @@ async function fanOutToBridgedMinds(opts) {
1978
2016
  const participants = await getParticipants(opts.conversationId);
1979
2017
  const mindParticipants = participants.filter((p) => p.userType === "mind");
1980
2018
  const participantNames = participants.map((p) => p.username);
1981
- const { getMindManager: getMindManager2 } = await import("./mind-manager-74XQZEGX.js");
1982
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
2019
+ const { getMindManager: getMindManager2 } = await import("./mind-manager-6DSY5IJW.js");
2020
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
1983
2021
  const manager = getMindManager2();
1984
2022
  const sm = getSleepManagerIfReady2();
1985
2023
  const targetMinds = mindParticipants.filter((ap) => {
@@ -2191,7 +2229,7 @@ async function notifyMind(mindName, message) {
2191
2229
  const entry = await findMind(mindName);
2192
2230
  if (!entry) return;
2193
2231
  try {
2194
- const { sendSystemMessage } = await import("./system-chat-HZUKBIKJ.js");
2232
+ const { sendSystemMessage } = await import("./system-chat-EQIH6JVL.js");
2195
2233
  await sendSystemMessage(mindName, message);
2196
2234
  } catch (err) {
2197
2235
  logger_default.warn(`[file-sharing] notify mind ${mindName} failed`, logger_default.errorData(err));
@@ -3505,7 +3543,7 @@ async function getMindStatus(name, port, registryRunning) {
3505
3543
  const manager = getMindManager();
3506
3544
  let status = "stopped";
3507
3545
  try {
3508
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
3546
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
3509
3547
  if (getSleepManagerIfReady2()?.isSleeping(name)) {
3510
3548
  status = "sleeping";
3511
3549
  }
@@ -4000,7 +4038,7 @@ var app13 = new Hono15().post("/", requireAdminOrSystem, zValidator5("json", cre
4000
4038
  applyInitFiles(dest);
4001
4039
  const { publicKeyPem } = generateIdentity(dest);
4002
4040
  {
4003
- const { readGlobalConfig: readGlobal } = await import("./setup-FPFWDMXD.js");
4041
+ const { readGlobalConfig: readGlobal } = await import("./setup-IYOUPCIK.js");
4004
4042
  const mindDefaults = readGlobal().mindDefaults;
4005
4043
  const config2 = readVoluteConfig(dest);
4006
4044
  if (!config2) throw new Error("Failed to read volute.json after identity generation");
@@ -4091,7 +4129,7 @@ The human who planted you described you as: "${body.description}"
4091
4129
  }
4092
4130
  let skillSet = body.skills ?? (body.stage === "seed" ? SEED_SKILLS : getStandardSkillsWithExtensions());
4093
4131
  if (body.stage === "seed" && !body.skills) {
4094
- const { isImagegenEnabled } = await import("./setup-FPFWDMXD.js");
4132
+ const { isImagegenEnabled } = await import("./setup-IYOUPCIK.js");
4095
4133
  if (isImagegenEnabled()) {
4096
4134
  skillSet = [...skillSet, "imagegen"];
4097
4135
  }
@@ -4109,7 +4147,7 @@ The human who planted you described you as: "${body.description}"
4109
4147
  try {
4110
4148
  const spiritEntry = await findMind("volute");
4111
4149
  if (spiritEntry) {
4112
- const { spiritDir } = await import("./spirit-ONLRFATY.js");
4150
+ const { spiritDir } = await import("./spirit-XLD6QXSS.js");
4113
4151
  const sDir = spiritEntry.dir ?? spiritDir();
4114
4152
  const spiritConfig = readVoluteConfig(sDir) ?? {};
4115
4153
  const schedules = spiritConfig.schedules ?? [];
@@ -4124,7 +4162,7 @@ The human who planted you described you as: "${body.description}"
4124
4162
  });
4125
4163
  spiritConfig.schedules = schedules;
4126
4164
  writeVoluteConfig(sDir, spiritConfig);
4127
- const { getScheduler: getScheduler2 } = await import("./scheduler-MEBQF5MW.js");
4165
+ const { getScheduler: getScheduler2 } = await import("./scheduler-2FKQCRCM.js");
4128
4166
  getScheduler2().loadSchedules("volute", sDir);
4129
4167
  }
4130
4168
  }
@@ -4389,7 +4427,7 @@ ${user.trimEnd()}
4389
4427
  const manager = getMindManager();
4390
4428
  try {
4391
4429
  if (context?.type === "reload") {
4392
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
4430
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
4393
4431
  const sleepState = getSleepManagerIfReady2()?.getState(name);
4394
4432
  if (sleepState?.sleeping) {
4395
4433
  logger_default.info(`skipping reload for ${name} during sleep \u2014 will apply on next wake`);
@@ -4484,7 +4522,7 @@ ${user.trimEnd()}
4484
4522
  const name = c.req.param("name");
4485
4523
  const entry = await findMind(name);
4486
4524
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4487
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
4525
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
4488
4526
  const sm = getSleepManagerIfReady2();
4489
4527
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4490
4528
  return c.json(sm.getState(name));
@@ -4492,7 +4530,7 @@ ${user.trimEnd()}
4492
4530
  const name = c.req.param("name");
4493
4531
  const entry = await findMind(name);
4494
4532
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4495
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
4533
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
4496
4534
  const sm = getSleepManagerIfReady2();
4497
4535
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4498
4536
  if (sm.isSleeping(name)) return c.json({ error: "Mind is already sleeping" }, 409);
@@ -4512,7 +4550,7 @@ ${user.trimEnd()}
4512
4550
  const name = c.req.param("name");
4513
4551
  const entry = await findMind(name);
4514
4552
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4515
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
4553
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
4516
4554
  const sm = getSleepManagerIfReady2();
4517
4555
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4518
4556
  const sleepState = sm.getState(name);
@@ -4527,7 +4565,7 @@ ${user.trimEnd()}
4527
4565
  const name = c.req.param("name");
4528
4566
  const entry = await findMind(name);
4529
4567
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4530
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-OHM3TO62.js");
4568
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-F5KWIFOX.js");
4531
4569
  const sm = getSleepManagerIfReady2();
4532
4570
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4533
4571
  const flushed = await sm.flushQueuedMessages(name);
@@ -4592,7 +4630,7 @@ ${user.trimEnd()}
4592
4630
  const config2 = readVoluteConfig(dir);
4593
4631
  const displayNameSet = !!config2?.profile?.displayName;
4594
4632
  const avatarSet = !!config2?.profile?.avatar;
4595
- const { isImagegenEnabled } = await import("./setup-FPFWDMXD.js");
4633
+ const { isImagegenEnabled } = await import("./setup-IYOUPCIK.js");
4596
4634
  const imagegenEnabled = isImagegenEnabled();
4597
4635
  const done = [];
4598
4636
  const remaining = [];
@@ -4630,7 +4668,7 @@ ${user.trimEnd()}
4630
4668
  try {
4631
4669
  const spiritEntry = await findMind("volute");
4632
4670
  if (spiritEntry) {
4633
- const { spiritDir } = await import("./spirit-ONLRFATY.js");
4671
+ const { spiritDir } = await import("./spirit-XLD6QXSS.js");
4634
4672
  const sDir = spiritEntry.dir ?? spiritDir();
4635
4673
  const spiritConfig = readVoluteConfig(sDir);
4636
4674
  if (spiritConfig?.schedules) {
@@ -4638,7 +4676,7 @@ ${user.trimEnd()}
4638
4676
  spiritConfig.schedules = spiritConfig.schedules.filter((s) => s.id !== nurtureId);
4639
4677
  if (spiritConfig.schedules.length === 0) spiritConfig.schedules = void 0;
4640
4678
  writeVoluteConfig(sDir, spiritConfig);
4641
- const { getScheduler: getScheduler2 } = await import("./scheduler-MEBQF5MW.js");
4679
+ const { getScheduler: getScheduler2 } = await import("./scheduler-2FKQCRCM.js");
4642
4680
  getScheduler2().loadSchedules("volute", sDir);
4643
4681
  }
4644
4682
  }
@@ -5073,7 +5111,7 @@ ${user.trimEnd()}
5073
5111
  }
5074
5112
  writeVoluteConfig(dir, existing);
5075
5113
  if (body.unescapeNewlines !== void 0) {
5076
- const { clearEchoTextCache } = await import("./echo-text-GEDEEY7M.js");
5114
+ const { clearEchoTextCache } = await import("./echo-text-3HBQUWPX.js");
5077
5115
  clearEchoTextCache(name);
5078
5116
  }
5079
5117
  const needsConfigJson = body.model !== void 0 || body.thinkingLevel !== void 0 || body.maxThinkingTokens !== void 0 || body.compaction !== void 0;
@@ -5150,7 +5188,7 @@ ${user.trimEnd()}
5150
5188
  }
5151
5189
  if (entry.mindType === "spirit" && body.model !== void 0) {
5152
5190
  try {
5153
- const { readGlobalConfig: readGlobalConfig2, writeGlobalConfig: writeGlobalConfig2 } = await import("./setup-FPFWDMXD.js");
5191
+ const { readGlobalConfig: readGlobalConfig2, writeGlobalConfig: writeGlobalConfig2 } = await import("./setup-IYOUPCIK.js");
5154
5192
  const globalConfig = readGlobalConfig2();
5155
5193
  globalConfig.spiritModel = body.model;
5156
5194
  writeGlobalConfig2(globalConfig);
@@ -5178,7 +5216,7 @@ ${user.trimEnd()}
5178
5216
  if (!body.systemPrompt || !body.message) {
5179
5217
  return c.json({ error: "systemPrompt and message required" }, 400);
5180
5218
  }
5181
- const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-XCLE3MQP.js");
5219
+ const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-3GBOJGUA.js");
5182
5220
  if (!isAiConfigured()) {
5183
5221
  return c.json({ error: "AI service not configured" }, 503);
5184
5222
  }
@@ -5922,7 +5960,7 @@ var app15 = new Hono17().get("/:name/clock/status", requireSelf(), async (c) =>
5922
5960
  const body = await c.req.text();
5923
5961
  const message = `[webhook: ${event}] ${body}`;
5924
5962
  try {
5925
- const { sendSystemMessage } = await import("./system-chat-HZUKBIKJ.js");
5963
+ const { sendSystemMessage } = await import("./system-chat-EQIH6JVL.js");
5926
5964
  await sendSystemMessage(name, message);
5927
5965
  return c.json({ ok: true });
5928
5966
  } catch (err) {
@@ -6233,7 +6271,7 @@ setup.post("/models", async (c) => {
6233
6271
  return c.json({ error: "Spirit model is required" }, 400);
6234
6272
  }
6235
6273
  try {
6236
- const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-XCLE3MQP.js");
6274
+ const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-3GBOJGUA.js");
6237
6275
  setEnabledModels3(body.models);
6238
6276
  const config2 = readGlobalConfig();
6239
6277
  config2.spiritModel = body.spiritModel.trim();
@@ -6251,15 +6289,15 @@ setup.post("/complete", async (c) => {
6251
6289
  return c.json({ error: "Setup already complete" }, 400);
6252
6290
  }
6253
6291
  try {
6254
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-ONLRFATY.js");
6255
- const { startSpiritFull } = await import("./mind-service-XGXSMQP6.js");
6292
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-XLD6QXSS.js");
6293
+ const { startSpiritFull } = await import("./mind-service-R2FM53KD.js");
6256
6294
  await ensureSpiritProject();
6257
6295
  await syncSpiritTemplate();
6258
6296
  const warnings = [];
6259
6297
  const config2 = readGlobalConfig();
6260
6298
  if (config2.setup?.service && config2.setup?.type === "local") {
6261
6299
  try {
6262
- const { installUserService } = await import("./service-install-GTDUHP6R.js");
6300
+ const { installUserService } = await import("./service-install-2HZPDHEY.js");
6263
6301
  const installed = await installUserService(config2.port, config2.hostname);
6264
6302
  if (!installed) {
6265
6303
  warnings.push("Service installation is not supported on this platform.");
@@ -6310,7 +6348,7 @@ setup.post("/complete", async (c) => {
6310
6348
  logger_default.info("setup complete state", { spiritConversationId, spiritStarted });
6311
6349
  if (spiritConversationId && spiritStarted) {
6312
6350
  try {
6313
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-HPMELC4Q.js");
6351
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-4ZWFDBAY.js");
6314
6352
  const { listUsersByType: listUsers2 } = await import("./auth-EAASQPTN.js");
6315
6353
  const admins = await listUsers2("brain");
6316
6354
  const admin2 = admins.find((u) => u.role === "admin");
@@ -7851,10 +7889,15 @@ if (!process.env.VOLUTE_HOME) {
7851
7889
  if (process.env.VOLUTE_TIMEZONE && !process.env.TZ) {
7852
7890
  process.env.TZ = process.env.VOLUTE_TIMEZONE;
7853
7891
  }
7854
- function writeDaemonConfig(path, config2) {
7855
- writeFileSync9(path, `${JSON.stringify(config2, null, 2)}
7892
+ function writeDaemonConfig(systemDir, config2, token) {
7893
+ const configPath = resolve17(systemDir, "daemon.json");
7894
+ writeFileSync9(configPath, `${JSON.stringify(config2, null, 2)}
7895
+ `, { mode: 420 });
7896
+ chmodSync(configPath, 420);
7897
+ const tokenPath = resolve17(systemDir, "daemon-token");
7898
+ writeFileSync9(tokenPath, `${token}
7856
7899
  `, { mode: 384 });
7857
- chmodSync(path, 384);
7900
+ chmodSync(tokenPath, 384);
7858
7901
  }
7859
7902
  async function startDaemon(opts) {
7860
7903
  const { port, hostname } = opts;
@@ -7874,9 +7917,11 @@ async function startDaemon(opts) {
7874
7917
  }
7875
7918
  const DAEMON_PID_PATH = resolve17(systemDir, "daemon.pid");
7876
7919
  const DAEMON_JSON_PATH = resolve17(systemDir, "daemon.json");
7920
+ const DAEMON_TOKEN_PATH = resolve17(systemDir, "daemon-token");
7877
7921
  mkdirSync10(home, { recursive: true });
7878
7922
  ensureSystemDir();
7879
- const { migrateSetupCompleted } = await import("./setup-FPFWDMXD.js");
7923
+ const { migrateConfigSecrets, migrateSetupCompleted } = await import("./setup-IYOUPCIK.js");
7924
+ migrateConfigSecrets();
7880
7925
  migrateSetupCompleted();
7881
7926
  await (await import("./db-ZJJJYJBU.js")).getDb();
7882
7927
  try {
@@ -7887,7 +7932,7 @@ async function startDaemon(opts) {
7887
7932
  } catch (err) {
7888
7933
  logger_default.warn("failed to migrate system user role", logger_default.errorData(err));
7889
7934
  }
7890
- const { initSandbox } = await import("./sandbox-ND53WZVU.js");
7935
+ const { initSandbox } = await import("./sandbox-E7RWZDVG.js");
7891
7936
  await initSandbox();
7892
7937
  try {
7893
7938
  await syncBuiltinSkills();
@@ -7923,7 +7968,7 @@ async function startDaemon(opts) {
7923
7968
  );
7924
7969
  }
7925
7970
  const token = process.env.VOLUTE_DAEMON_TOKEN || randomBytes(32).toString("hex");
7926
- const { readGlobalConfig: readGlobalConfig2 } = await import("./setup-FPFWDMXD.js");
7971
+ const { readGlobalConfig: readGlobalConfig2 } = await import("./setup-IYOUPCIK.js");
7927
7972
  const globalCfg = readGlobalConfig2();
7928
7973
  let tls;
7929
7974
  if (opts.tailscale || globalCfg.tailscale) {
@@ -7956,10 +8001,10 @@ async function startDaemon(opts) {
7956
8001
  process.env.VOLUTE_DAEMON_PORT = String(daemonPort);
7957
8002
  process.env.VOLUTE_DAEMON_HOSTNAME = hostname;
7958
8003
  writeFileSync9(DAEMON_PID_PATH, myPid, { mode: 420 });
7959
- const daemonConfig = { port, hostname, token };
8004
+ const daemonConfig = { port, hostname };
7960
8005
  if (internalPort) daemonConfig.internalPort = internalPort;
7961
8006
  if (tls) daemonConfig.tls = true;
7962
- writeDaemonConfig(DAEMON_JSON_PATH, daemonConfig);
8007
+ writeDaemonConfig(systemDir, daemonConfig, token);
7963
8008
  const delivery = initDeliveryManager();
7964
8009
  const manager = initMindManager();
7965
8010
  manager.loadCrashAttempts();
@@ -8006,10 +8051,10 @@ async function startDaemon(opts) {
8006
8051
  await Promise.all(workers);
8007
8052
  }
8008
8053
  try {
8009
- const { isSetupComplete: isSetupComplete2 } = await import("./setup-FPFWDMXD.js");
8054
+ const { isSetupComplete: isSetupComplete2 } = await import("./setup-IYOUPCIK.js");
8010
8055
  if (isSetupComplete2()) {
8011
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-ONLRFATY.js");
8012
- const { startSpiritFull } = await import("./mind-service-XGXSMQP6.js");
8056
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-XLD6QXSS.js");
8057
+ const { startSpiritFull } = await import("./mind-service-R2FM53KD.js");
8013
8058
  await ensureSpiritProject();
8014
8059
  await syncSpiritTemplate();
8015
8060
  const spiritEntry = await findMind("volute");
@@ -8026,7 +8071,7 @@ async function startDaemon(opts) {
8026
8071
  bridgeManager.startBridges(daemonPort).catch((err) => {
8027
8072
  logger_default.warn("failed to start bridges", logger_default.errorData(err));
8028
8073
  });
8029
- import("./cloud-sync-2XVXEOSU.js").then(
8074
+ import("./cloud-sync-E3ZL5SZ4.js").then(
8030
8075
  ({ consumeQueuedMessages }) => consumeQueuedMessages().catch((err) => {
8031
8076
  logger_default.warn("failed to consume queued cloud messages", logger_default.errorData(err));
8032
8077
  })
@@ -8034,7 +8079,7 @@ async function startDaemon(opts) {
8034
8079
  logger_default.warn("failed to load cloud-sync module", logger_default.errorData(err));
8035
8080
  });
8036
8081
  try {
8037
- const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-UFFDUPCX.js");
8082
+ const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-P7UAR7HZ.js");
8038
8083
  backfillTemplateHashes();
8039
8084
  notifyVersionUpdate().catch((err) => {
8040
8085
  logger_default.warn("failed to send version update notifications", logger_default.errorData(err));
@@ -8066,9 +8111,12 @@ async function startDaemon(opts) {
8066
8111
  } catch {
8067
8112
  }
8068
8113
  try {
8069
- const data = JSON.parse(readFileSync10(DAEMON_JSON_PATH, "utf-8"));
8070
- if (data.token === token) {
8071
- unlinkSync2(DAEMON_JSON_PATH);
8114
+ if (readFileSync10(DAEMON_TOKEN_PATH, "utf-8").trim() === token) {
8115
+ unlinkSync2(DAEMON_TOKEN_PATH);
8116
+ try {
8117
+ unlinkSync2(DAEMON_JSON_PATH);
8118
+ } catch {
8119
+ }
8072
8120
  }
8073
8121
  } catch {
8074
8122
  }
@@ -18,7 +18,7 @@ var cmd = command({
18
18
  },
19
19
  async run({ args, flags }) {
20
20
  const name = resolveMindName({ mind: args.name });
21
- const { daemonFetch } = await import("./daemon-client-EWDPOOHC.js");
21
+ const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
22
22
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
23
23
  const client = getClient();
24
24
  const url = urlOf(client.api.minds[":name"].$url({ param: { name } })) + (flags.force ? "?force=true" : "");
@@ -4,21 +4,21 @@ import {
4
4
  getDeliveryManager,
5
5
  initDeliveryManager,
6
6
  tryGetDeliveryManager
7
- } from "./chunk-F44AEQAW.js";
7
+ } from "./chunk-6G7R2LPI.js";
8
8
  import "./chunk-BLOAJLGI.js";
9
- import "./chunk-MYJSKXGH.js";
9
+ import "./chunk-43K5UWF7.js";
10
10
  import "./chunk-QLWG3C2Z.js";
11
- import "./chunk-MJIJFCAH.js";
11
+ import "./chunk-M3T3Y6FT.js";
12
12
  import "./chunk-YLTIEEVL.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
- import "./chunk-763WUVJQ.js";
14
+ import "./chunk-WR7CSHQ4.js";
15
15
  import "./chunk-VBKRZCR7.js";
16
16
  import "./chunk-62ICA2FF.js";
17
- import "./chunk-GCS64EAD.js";
17
+ import "./chunk-BWZHX46O.js";
18
18
  import "./chunk-GN52E2DP.js";
19
19
  import "./chunk-TFBQESH7.js";
20
- import "./chunk-IJCZAYGT.js";
21
- import "./chunk-MA7MYEOK.js";
20
+ import "./chunk-4ZSUUBG5.js";
21
+ import "./chunk-KZAL7HEQ.js";
22
22
  import "./chunk-5QG36RV7.js";
23
23
  import "./chunk-K547QOCM.js";
24
24
  import "./chunk-T2TP6ZC6.js";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  run,
4
4
  stopDaemon
5
- } from "./chunk-G777ME4L.js";
5
+ } from "./chunk-NSGIVS5T.js";
6
6
  import "./chunk-TXSA4Q3V.js";
7
7
  import "./chunk-O7IGP7ZW.js";
8
- import "./chunk-CGPESELY.js";
8
+ import "./chunk-P6DPB33N.js";
9
9
  import "./chunk-GN52E2DP.js";
10
10
  import "./chunk-TFBQESH7.js";
11
11
  import "./chunk-IUZ3EV2D.js";
@@ -2,23 +2,24 @@
2
2
  import {
3
3
  clearEchoTextCache,
4
4
  echoTextToChannel
5
- } from "./chunk-ULNQ6OC4.js";
5
+ } from "./chunk-JPDN6ZRJ.js";
6
6
  import "./chunk-QPTQKGGF.js";
7
- import "./chunk-F44AEQAW.js";
7
+ import "./chunk-6G7R2LPI.js";
8
8
  import "./chunk-BLOAJLGI.js";
9
- import "./chunk-MYJSKXGH.js";
9
+ import "./chunk-43K5UWF7.js";
10
10
  import "./chunk-QLWG3C2Z.js";
11
- import "./chunk-MJIJFCAH.js";
11
+ import "./chunk-M3T3Y6FT.js";
12
12
  import "./chunk-YLTIEEVL.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
- import "./chunk-763WUVJQ.js";
14
+ import "./chunk-WR7CSHQ4.js";
15
15
  import "./chunk-VBKRZCR7.js";
16
16
  import "./chunk-62ICA2FF.js";
17
- import "./chunk-GCS64EAD.js";
17
+ import "./chunk-BWZHX46O.js";
18
+ import "./chunk-P6DPB33N.js";
18
19
  import "./chunk-GN52E2DP.js";
19
20
  import "./chunk-TFBQESH7.js";
20
- import "./chunk-IJCZAYGT.js";
21
- import "./chunk-MA7MYEOK.js";
21
+ import "./chunk-4ZSUUBG5.js";
22
+ import "./chunk-KZAL7HEQ.js";
22
23
  import "./chunk-5QG36RV7.js";
23
24
  import "./chunk-K547QOCM.js";
24
25
  import "./chunk-T2TP6ZC6.js";
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VHWGEJ4V.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-IFNSAOA4.js";
10
+ } from "./chunk-RBNMDAKB.js";
11
11
  import {
12
12
  getClient,
13
13
  urlOf
@@ -63,7 +63,7 @@ var cmd = command({
63
63
  });
64
64
  if (includeHistory) {
65
65
  try {
66
- const { daemonFetch } = await import("./daemon-client-EWDPOOHC.js");
66
+ const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
67
67
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
68
68
  const client = getClient();
69
69
  const res = await daemonFetch(
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  daemonFetch
4
- } from "./chunk-IFNSAOA4.js";
4
+ } from "./chunk-RBNMDAKB.js";
5
5
  import {
6
6
  subcommands
7
7
  } from "./chunk-TXSA4Q3V.js";
@@ -13,21 +13,21 @@ import {
13
13
  parseCommandArgs,
14
14
  setExtensionEnabled,
15
15
  uninstallNpmExtension
16
- } from "./chunk-F44AEQAW.js";
16
+ } from "./chunk-6G7R2LPI.js";
17
17
  import "./chunk-BLOAJLGI.js";
18
- import "./chunk-MYJSKXGH.js";
18
+ import "./chunk-43K5UWF7.js";
19
19
  import "./chunk-QLWG3C2Z.js";
20
- import "./chunk-MJIJFCAH.js";
20
+ import "./chunk-M3T3Y6FT.js";
21
21
  import "./chunk-YLTIEEVL.js";
22
22
  import "./chunk-CU6OFXMM.js";
23
- import "./chunk-763WUVJQ.js";
23
+ import "./chunk-WR7CSHQ4.js";
24
24
  import "./chunk-VBKRZCR7.js";
25
25
  import "./chunk-62ICA2FF.js";
26
- import "./chunk-GCS64EAD.js";
26
+ import "./chunk-BWZHX46O.js";
27
27
  import "./chunk-GN52E2DP.js";
28
28
  import "./chunk-TFBQESH7.js";
29
- import "./chunk-IJCZAYGT.js";
30
- import "./chunk-MA7MYEOK.js";
29
+ import "./chunk-4ZSUUBG5.js";
30
+ import "./chunk-KZAL7HEQ.js";
31
31
  import "./chunk-5QG36RV7.js";
32
32
  import "./chunk-K547QOCM.js";
33
33
  import "./chunk-T2TP6ZC6.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-BTY4WNFE.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-IFNSAOA4.js";
7
+ } from "./chunk-RBNMDAKB.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -32,7 +32,7 @@ async function run(args) {
32
32
  return;
33
33
  }
34
34
  const wsDir = resolveWorkspace(inputPath);
35
- const { daemonFetch } = await import("./daemon-client-EWDPOOHC.js");
35
+ const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
36
36
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
37
37
  const client = getClient();
38
38
  const res = await daemonFetch(urlOf(client.api.minds.import.$url()), {
@@ -84,7 +84,7 @@ async function importArchive(archivePath, nameOverride) {
84
84
  process.exit(1);
85
85
  }
86
86
  try {
87
- const { daemonFetch } = await import("./daemon-client-EWDPOOHC.js");
87
+ const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
88
88
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
89
89
  const client = getClient();
90
90
  const res = await daemonFetch(urlOf(client.api.minds.import.$url()), {
@@ -19,7 +19,7 @@ var cmd = command({
19
19
  run: async ({ args, flags }) => {
20
20
  const variantName = args.variant;
21
21
  console.log(`Joining variant ${variantName}...`);
22
- const { daemonFetch } = await import("./daemon-client-EWDPOOHC.js");
22
+ const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
23
23
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
24
24
  const client = getClient();
25
25
  const statusRes = await daemonFetch(
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-BTY4WNFE.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-IFNSAOA4.js";
10
+ } from "./chunk-RBNMDAKB.js";
11
11
  import {
12
12
  command
13
13
  } from "./chunk-TXSA4Q3V.js";
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-VHWGEJ4V.js";
6
6
  import {
7
7
  daemonFetch
8
- } from "./chunk-IFNSAOA4.js";
8
+ } from "./chunk-RBNMDAKB.js";
9
9
  import {
10
10
  command
11
11
  } from "./chunk-TXSA4Q3V.js";