volute 0.40.1 → 0.40.2

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 (49) hide show
  1. package/README.md +2 -2
  2. package/dist/{ai-service-AUWIPWLP.js → ai-service-EVLKMAJD.js} +1 -1
  3. package/dist/{chunk-ANSTTB55.js → chunk-42UMLIQR.js} +19 -20
  4. package/dist/{chunk-YTNBO7S6.js → chunk-NRJ3ZYFP.js} +4 -4
  5. package/dist/{chunk-QV7P3TYO.js → chunk-UX7FPDDO.js} +1 -1
  6. package/dist/{chunk-LZ6CQYRO.js → chunk-WOWRLBL2.js} +4 -2
  7. package/dist/chunk-YMMYN2V3.js +1212 -0
  8. package/dist/{chunk-BLAXARBZ.js → chunk-ZOI6D2YH.js} +174 -1293
  9. package/dist/{chunk-S4SXBQ7F.js → chunk-ZXPWTH4I.js} +42 -34
  10. package/dist/cli.js +7 -7
  11. package/dist/{cloud-sync-MAQCJEFJ.js → cloud-sync-GOSJZIHH.js} +6 -5
  12. package/dist/{create-T4UJ64WB.js → create-Y3RGU2GI.js} +2 -2
  13. package/dist/{daemon-restart-LP2DR24J.js → daemon-restart-FSWVXPUE.js} +1 -1
  14. package/dist/daemon.js +73 -62
  15. package/dist/{delivery-manager-VNHLQTTO.js → delivery-manager-3NTCDKHR.js} +10 -7
  16. package/dist/{echo-text-QFCH3H6G.js → echo-text-JUNRP4ER.js} +7 -6
  17. package/dist/{extensions-LQX2N7TI.js → extensions-MD757RFY.js} +6 -5
  18. package/dist/{message-delivery-7BCYJLH2.js → message-delivery-Q7TU24IA.js} +6 -5
  19. package/dist/{mind-ELPD6VBP.js → mind-OOB2LEVC.js} +3 -3
  20. package/dist/{mind-activity-tracker-XFRVGXFS.js → mind-activity-tracker-GJ5RJS32.js} +1 -1
  21. package/dist/{mind-manager-EDCLALBF.js → mind-manager-4NFK4GEU.js} +6 -5
  22. package/dist/{mind-service-WTOFVNLW.js → mind-service-X7FH3NA4.js} +6 -5
  23. package/dist/{package-GO3PHHUF.js → package-PPA3VWS2.js} +4 -4
  24. package/dist/{scheduler-GQBDCGLU.js → scheduler-PDARH4CE.js} +6 -5
  25. package/dist/{seed-MO2C7CWC.js → seed-BTAHXCO5.js} +1 -1
  26. package/dist/{seed-cmd-ETIF4WD6.js → seed-cmd-VEJNJBAQ.js} +2 -2
  27. package/dist/{seed-create-BPQC2IOR.js → seed-create-LOU5RALI.js} +4 -4
  28. package/dist/{seed-sprout-TX72K33T.js → seed-sprout-BXF5TBXD.js} +2 -2
  29. package/dist/{setup-ZTW4FVMQ.js → setup-W3545462.js} +1 -1
  30. package/dist/{skills-JEWMHIIE.js → skills-3P7VQA4U.js} +1 -1
  31. package/dist/{sleep-manager-5277OBHI.js → sleep-manager-TTNOLIX5.js} +6 -5
  32. package/dist/{spirit-NVXWSVKM.js → spirit-T6GK5GEP.js} +3 -3
  33. package/dist/{sprout-NFJZKYEW.js → sprout-AQICF7WZ.js} +1 -1
  34. package/dist/{system-chat-LQSJVY55.js → system-chat-7CA2PP6A.js} +6 -5
  35. package/dist/turn-tracker-AI6WWEBA.js +35 -0
  36. package/dist/{up-4H7TL6WB.js → up-PKNNDN6M.js} +1 -1
  37. package/dist/{version-notify-N37N2C4G.js → version-notify-DK6AHWX7.js} +6 -5
  38. package/package.json +4 -4
  39. package/templates/claude/package.json.tmpl +1 -1
  40. package/templates/codex/package.json.tmpl +1 -1
  41. package/templates/pi/package.json.tmpl +2 -1
  42. package/templates/pi/src/agent.ts +1 -1
  43. package/templates/pi/src/lib/content.ts +1 -1
  44. package/templates/pi/src/lib/event-handler.ts +1 -1
  45. package/templates/pi/src/lib/reply-instructions-extension.ts +1 -1
  46. package/templates/pi/src/lib/resolve-model.ts +4 -4
  47. package/templates/pi/src/lib/subagents.ts +2 -2
  48. /package/dist/{chat-JD3TJINV.js → chat-F2EEN76G.js} +0 -0
  49. /package/dist/{chunk-5EVW4KOD.js → chunk-PEKG3GNZ.js} +0 -0
@@ -8,9 +8,31 @@ import {
8
8
  } from "./chunk-T2TP6ZC6.js";
9
9
 
10
10
  // packages/daemon/src/lib/ai-service.ts
11
- import { complete, getEnvApiKey, getModel, getModels, getProviders } from "@mariozechner/pi-ai";
12
- import { getOAuthApiKey } from "@mariozechner/pi-ai/oauth";
11
+ import { defaultProviderAuthContext } from "@earendil-works/pi-ai";
12
+ import { getOAuthApiKey } from "@earendil-works/pi-ai/oauth";
13
+ import {
14
+ builtinModels,
15
+ getBuiltinModel,
16
+ getBuiltinModels,
17
+ getBuiltinProviders
18
+ } from "@earendil-works/pi-ai/providers/all";
13
19
  var aiLog = logger_default.child("ai-service");
20
+ var models = builtinModels();
21
+ var authContext = defaultProviderAuthContext();
22
+ async function resolveProviderKey(providerId, configKey) {
23
+ const provider = models.getProvider(providerId);
24
+ const model = getBuiltinModels(providerId)[0];
25
+ if (provider?.auth.apiKey && model) {
26
+ try {
27
+ const credential = configKey ? { type: "api_key", key: configKey } : void 0;
28
+ const res = await provider.auth.apiKey.resolve({ model, ctx: authContext, credential });
29
+ if (res?.auth.apiKey) return res.auth.apiKey;
30
+ } catch (err) {
31
+ aiLog.debug(`api key resolution failed for ${providerId}`, logger_default.errorData(err));
32
+ }
33
+ }
34
+ return configKey;
35
+ }
14
36
  var providerRefreshHook;
15
37
  function setProviderRefreshHook(hook) {
16
38
  providerRefreshHook = hook;
@@ -49,7 +71,7 @@ function removeAiConfig() {
49
71
  delete config.ai;
50
72
  writeGlobalConfig(config);
51
73
  }
52
- function getConfiguredProviders() {
74
+ async function getConfiguredProviders() {
53
75
  const ai = getAiConfig();
54
76
  const configured = /* @__PURE__ */ new Set();
55
77
  if (ai) {
@@ -58,8 +80,8 @@ function getConfiguredProviders() {
58
80
  if (p.apiKey || p.oauth) configured.add(id);
59
81
  }
60
82
  }
61
- for (const id of getProviders()) {
62
- if (!configured.has(id) && getEnvApiKey(id)) {
83
+ for (const id of getBuiltinProviders()) {
84
+ if (!configured.has(id) && await resolveProviderKey(id)) {
63
85
  configured.add(id);
64
86
  }
65
87
  }
@@ -87,14 +109,14 @@ function templateForProvider(provider) {
87
109
  if (provider === "openai-codex") return "codex";
88
110
  return "pi";
89
111
  }
90
- function resolveTemplate(modelId) {
112
+ async function resolveTemplate(modelId) {
91
113
  if (!modelId) {
92
114
  const enabled = getEnabledModels();
93
115
  if (enabled.length > 0) {
94
116
  const model2 = findModel(enabled[0]);
95
117
  if (model2) return templateForProvider(model2.provider);
96
118
  }
97
- const providers = getConfiguredProviders();
119
+ const providers = await getConfiguredProviders();
98
120
  if (providers.length === 1) return templateForProvider(providers[0]);
99
121
  if (providers.length > 0 && !providers.includes("anthropic")) {
100
122
  return templateForProvider(providers[0]);
@@ -119,17 +141,13 @@ function setEnabledModels(modelIds) {
119
141
  const config = readGlobalConfig();
120
142
  writeGlobalConfig({ ...config, ai });
121
143
  }
122
- function getAvailableModels() {
123
- const providers = getConfiguredProviders();
124
- const models = [];
144
+ async function getAvailableModels() {
145
+ const providers = await getConfiguredProviders();
146
+ const result = [];
125
147
  for (const provider of providers) {
126
- try {
127
- models.push(...getModels(provider));
128
- } catch (err) {
129
- aiLog.warn(`failed to load models for provider ${provider}`, logger_default.errorData(err));
130
- }
148
+ result.push(...getBuiltinModels(provider));
131
149
  }
132
- return models;
150
+ return result;
133
151
  }
134
152
  async function resolveApiKey(providerId) {
135
153
  const ai = getAiConfig();
@@ -150,8 +168,7 @@ async function resolveApiKey(providerId) {
150
168
  aiLog.warn(`OAuth key resolution failed for ${providerId}`, logger_default.errorData(err));
151
169
  }
152
170
  }
153
- if (providerConfig?.apiKey) return providerConfig.apiKey;
154
- return getEnvApiKey(providerId) ?? void 0;
171
+ return resolveProviderKey(providerId, providerConfig?.apiKey);
155
172
  }
156
173
  function qualifyModelId(modelId) {
157
174
  if (modelId.includes(":")) return modelId;
@@ -164,22 +181,13 @@ function unqualifyModelId(modelId) {
164
181
  return idx >= 0 ? modelId.slice(idx + 1) : modelId;
165
182
  }
166
183
  function findModel(modelId) {
167
- const providers = getConfiguredProviders();
168
- for (const provider of providers) {
169
- try {
170
- const model = getModel(provider, modelId);
171
- if (model) return model;
172
- } catch (err) {
173
- aiLog.debug(`model lookup failed for ${modelId} in ${provider}`, logger_default.errorData(err));
174
- }
184
+ for (const provider of getBuiltinProviders()) {
185
+ const model = getBuiltinModel(provider, modelId);
186
+ if (model) return model;
175
187
  }
176
- for (const provider of providers) {
177
- try {
178
- const found = getModels(provider).find((m) => m.id.startsWith(modelId));
179
- if (found) return found;
180
- } catch (err) {
181
- aiLog.debug(`prefix search failed for ${modelId} in ${provider}`, logger_default.errorData(err));
182
- }
188
+ for (const provider of getBuiltinProviders()) {
189
+ const found = getBuiltinModels(provider).find((m) => m.id.startsWith(modelId));
190
+ if (found) return found;
183
191
  }
184
192
  return void 0;
185
193
  }
@@ -201,7 +209,7 @@ async function aiComplete(systemPrompt, userMessage, modelId) {
201
209
  }
202
210
  try {
203
211
  const apiKey = await resolveApiKey(model.provider);
204
- const response = await complete(
212
+ const response = await models.complete(
205
213
  model,
206
214
  {
207
215
  systemPrompt,
package/dist/cli.js CHANGED
@@ -10,7 +10,7 @@ if (!process.env.VOLUTE_HOME) {
10
10
  var command = process.argv[2];
11
11
  var args = process.argv.slice(3);
12
12
  if (command === "--version" || command === "-v") {
13
- const { default: pkg } = await import("./package-GO3PHHUF.js");
13
+ const { default: pkg } = await import("./package-PPA3VWS2.js");
14
14
  console.log(pkg.version);
15
15
  process.exit(0);
16
16
  }
@@ -39,16 +39,16 @@ if (!ungatedCommands.has(command)) {
39
39
  }
40
40
  switch (command) {
41
41
  case "setup":
42
- await import("./setup-ZTW4FVMQ.js").then((m) => m.run(args));
42
+ await import("./setup-W3545462.js").then((m) => m.run(args));
43
43
  break;
44
44
  case "mind":
45
- await import("./mind-ELPD6VBP.js").then((m) => m.run(args));
45
+ await import("./mind-OOB2LEVC.js").then((m) => m.run(args));
46
46
  break;
47
47
  case "seed":
48
- await import("./seed-cmd-ETIF4WD6.js").then((m) => m.run(args));
48
+ await import("./seed-cmd-VEJNJBAQ.js").then((m) => m.run(args));
49
49
  break;
50
50
  case "chat":
51
- await import("./chat-JD3TJINV.js").then((m) => m.run(args));
51
+ await import("./chat-F2EEN76G.js").then((m) => m.run(args));
52
52
  break;
53
53
  case "variant":
54
54
  await import("./variant-5LQOPCQA.js").then((m) => m.run(args));
@@ -66,13 +66,13 @@ switch (command) {
66
66
  await import("./config-PO4EZLIK.js").then((m) => m.run(args));
67
67
  break;
68
68
  case "up":
69
- await import("./up-4H7TL6WB.js").then((m) => m.run(args));
69
+ await import("./up-PKNNDN6M.js").then((m) => m.run(args));
70
70
  break;
71
71
  case "down":
72
72
  await import("./down-6DYO2QV7.js").then((m) => m.run(args));
73
73
  break;
74
74
  case "restart":
75
- await import("./daemon-restart-LP2DR24J.js").then((m) => m.run(args));
75
+ await import("./daemon-restart-FSWVXPUE.js").then((m) => m.run(args));
76
76
  break;
77
77
  case "update":
78
78
  await import("./update-OY2JYXYK.js").then((m) => m.run(args));
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage
4
- } from "./chunk-BLAXARBZ.js";
4
+ } from "./chunk-ZOI6D2YH.js";
5
5
  import "./chunk-ITH5ZLZJ.js";
6
- import "./chunk-YTNBO7S6.js";
6
+ import "./chunk-NRJ3ZYFP.js";
7
7
  import "./chunk-46DYYHN6.js";
8
- import "./chunk-QV7P3TYO.js";
8
+ import "./chunk-UX7FPDDO.js";
9
9
  import {
10
10
  getAuthHeaders,
11
11
  getWebhookUrl
12
12
  } from "./chunk-3Y7UDHO7.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
14
  import "./chunk-KMHC36CA.js";
15
- import "./chunk-ANSTTB55.js";
15
+ import "./chunk-42UMLIQR.js";
16
16
  import "./chunk-NERYUSER.js";
17
+ import "./chunk-YMMYN2V3.js";
17
18
  import "./chunk-AEAZRTEV.js";
18
19
  import "./chunk-6SYHHEQ7.js";
19
- import "./chunk-S4SXBQ7F.js";
20
+ import "./chunk-ZXPWTH4I.js";
20
21
  import "./chunk-DNU6XLE2.js";
21
22
  import "./chunk-E25SO3QW.js";
22
23
  import "./chunk-QYI65HCL.js";
@@ -21,8 +21,8 @@ var cmd = command({
21
21
  const name = args.name;
22
22
  let template = flags.template;
23
23
  if (!template) {
24
- const { resolveTemplate } = await import("./ai-service-AUWIPWLP.js");
25
- template = resolveTemplate();
24
+ const { resolveTemplate } = await import("./ai-service-EVLKMAJD.js");
25
+ template = await resolveTemplate();
26
26
  }
27
27
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
28
28
  const { daemonFetch } = await import("./daemon-client-H6MEKK2W.js");
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-JYQQDI3M.js";
5
5
  import {
6
6
  run
7
- } from "./chunk-5EVW4KOD.js";
7
+ } from "./chunk-PEKG3GNZ.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
package/dist/daemon.js CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  fixModelEscapes,
31
31
  getPlatformDriver,
32
32
  routeOutboundBridge
33
- } from "./chunk-LZ6CQYRO.js";
33
+ } from "./chunk-WOWRLBL2.js";
34
34
  import {
35
35
  getBridgeConfig,
36
36
  readBridgesConfig,
@@ -41,33 +41,22 @@ import {
41
41
  setChannelMapping
42
42
  } from "./chunk-PKGA23XM.js";
43
43
  import {
44
- PROMPT_DEFAULTS,
45
- PROMPT_KEYS,
46
44
  RestartTracker,
47
45
  RotatingLog,
48
46
  announceToSystem,
49
- assignSession,
50
47
  clearDeliveredNotices,
51
- completeOrphanedTurns,
52
- completeTurn,
53
- createTurn,
54
48
  deleteSystemsConfig,
55
49
  deliverMessage,
56
50
  drainNotices,
57
51
  ensureSystemChannel,
58
52
  formatNotices,
59
53
  generateSystemReply,
60
- getActiveTurnId,
61
54
  getAllDiscoveredExtensions,
62
55
  getAllDiscoveredExtensionsDetailed,
63
56
  getDeliveryManager,
64
57
  getExtensionStandardSkills,
65
- getLastToolUseEventId,
66
58
  getLoadedExtensions,
67
59
  getMindManager,
68
- getMindPromptDefaults,
69
- getPrompt,
70
- getPromptIfCustom,
71
60
  getScheduler,
72
61
  getSleepManagerIfReady,
73
62
  getTokenBudget,
@@ -77,17 +66,14 @@ import {
77
66
  initMindManager,
78
67
  initScheduler,
79
68
  initSleepManager,
80
- initSummarizer,
81
69
  initTokenBudget,
82
70
  installNpmExtension,
83
71
  isConversationId,
84
72
  joinSystemChannel,
85
73
  linkToolResultToTurn,
86
74
  loadAllExtensions,
87
- markErrored,
88
75
  notifyExtensionsDaemonStart,
89
76
  notifyExtensionsDaemonStop,
90
- publish as publish2,
91
77
  publishTypingForChannels,
92
78
  readSystemsConfig,
93
79
  recordInbound,
@@ -97,19 +83,12 @@ import {
97
83
  setExtensionEnabled,
98
84
  startMindFull,
99
85
  stopMindFull,
100
- subscribe as subscribe3,
101
- subscribeAll,
102
- substitute,
103
- summarizeOrphanedTurns,
104
- summarizeTurn,
105
86
  syncProviderToMinds,
106
87
  tagUntaggedInbound,
107
88
  tagUntaggedOutbound,
108
- takeErrored,
109
- trackToolUse,
110
89
  uninstallNpmExtension,
111
90
  writeSystemsConfig
112
- } from "./chunk-BLAXARBZ.js";
91
+ } from "./chunk-ZOI6D2YH.js";
113
92
  import {
114
93
  loadMergedEnv,
115
94
  mindEnvPath,
@@ -117,7 +96,7 @@ import {
117
96
  sharedEnvPath,
118
97
  writeEnv
119
98
  } from "./chunk-ITH5ZLZJ.js";
120
- import "./chunk-YTNBO7S6.js";
99
+ import "./chunk-NRJ3ZYFP.js";
121
100
  import {
122
101
  applyInitFiles,
123
102
  composeTemplate,
@@ -144,7 +123,7 @@ import {
144
123
  syncBuiltinSkills,
145
124
  uninstallSkill,
146
125
  updateSkill
147
- } from "./chunk-QV7P3TYO.js";
126
+ } from "./chunk-UX7FPDDO.js";
148
127
  import {
149
128
  addMessage,
150
129
  createChannel,
@@ -186,10 +165,33 @@ import {
186
165
  getActiveMinds,
187
166
  onMindEvent,
188
167
  stopAll
189
- } from "./chunk-ANSTTB55.js";
168
+ } from "./chunk-42UMLIQR.js";
190
169
  import {
191
170
  extractTextContent
192
171
  } from "./chunk-NERYUSER.js";
172
+ import {
173
+ PROMPT_DEFAULTS,
174
+ PROMPT_KEYS,
175
+ assignSession,
176
+ completeOrphanedTurns,
177
+ completeTurn,
178
+ createTurn,
179
+ getActiveTurnId,
180
+ getLastToolUseEventId,
181
+ getMindPromptDefaults,
182
+ getPrompt,
183
+ getPromptIfCustom,
184
+ initSummarizer,
185
+ markErrored,
186
+ publish as publish2,
187
+ subscribe as subscribe3,
188
+ subscribeAll,
189
+ substitute,
190
+ summarizeOrphanedTurns,
191
+ summarizeTurn,
192
+ takeErrored,
193
+ trackToolUse
194
+ } from "./chunk-YMMYN2V3.js";
193
195
  import {
194
196
  exec,
195
197
  gitExec,
@@ -219,7 +221,7 @@ import {
219
221
  setProviderRefreshHook,
220
222
  setUtilityModel,
221
223
  unqualifyModelId
222
- } from "./chunk-S4SXBQ7F.js";
224
+ } from "./chunk-ZXPWTH4I.js";
223
225
  import {
224
226
  isSetupComplete,
225
227
  readGlobalConfig,
@@ -627,9 +629,9 @@ async function cleanExpiredLogs() {
627
629
  }
628
630
 
629
631
  // packages/daemon/src/web/api/system.ts
632
+ import { getOAuthProvider, getOAuthProviders } from "@earendil-works/pi-ai/oauth";
633
+ import { getBuiltinProviders } from "@earendil-works/pi-ai/providers/all";
630
634
  import { zValidator } from "@hono/zod-validator";
631
- import { getProviders } from "@mariozechner/pi-ai";
632
- import { getOAuthProvider, getOAuthProviders } from "@mariozechner/pi-ai/oauth";
633
635
  import { Hono } from "hono";
634
636
  import { streamSSE } from "hono/streaming";
635
637
  import { z } from "zod";
@@ -1200,7 +1202,7 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1200
1202
  if (!key) return c.json({ error: "No key available" }, 404);
1201
1203
  return c.json({ key });
1202
1204
  }).get("/ai/providers", requireAdmin, (c) => {
1203
- const allProviders = getProviders();
1205
+ const allProviders = getBuiltinProviders();
1204
1206
  const oauthProviders = getOAuthProviders();
1205
1207
  const oauthMap = new Map(oauthProviders.map((p) => [p.id, p]));
1206
1208
  const ai = getAiConfig();
@@ -1223,8 +1225,8 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1223
1225
  };
1224
1226
  });
1225
1227
  return c.json(result);
1226
- }).get("/ai/models", requireAdmin, (c) => {
1227
- const models = getAvailableModels();
1228
+ }).get("/ai/models", requireAdmin, async (c) => {
1229
+ const models = await getAvailableModels();
1228
1230
  const enabled = new Set(getEnabledModels());
1229
1231
  return c.json(
1230
1232
  models.map((m) => ({
@@ -1318,6 +1320,15 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
1318
1320
  if (existing)
1319
1321
  Object.assign(existing, { url: info.url, instructions: info.instructions });
1320
1322
  },
1323
+ onDeviceCode: (info) => {
1324
+ const existing = oauthFlows.get(flowId);
1325
+ if (existing)
1326
+ Object.assign(existing, {
1327
+ url: info.verificationUri,
1328
+ instructions: `Enter code: ${info.userCode}`
1329
+ });
1330
+ },
1331
+ onSelect: async (_prompt) => void 0,
1321
1332
  onPrompt: async (_prompt) => {
1322
1333
  if (promptPromise) {
1323
1334
  const existing = oauthFlows.get(flowId);
@@ -1484,7 +1495,7 @@ function needsRefresh(oauth) {
1484
1495
  }
1485
1496
  async function refreshApiKeyCache() {
1486
1497
  const ai = getAiConfig();
1487
- const providers = getConfiguredProviders();
1498
+ const providers = await getConfiguredProviders();
1488
1499
  for (const id of oauthHealth.keys()) {
1489
1500
  if (!providers.includes(id)) oauthHealth.delete(id);
1490
1501
  }
@@ -2095,8 +2106,8 @@ async function fanOutToBridgedMinds(opts) {
2095
2106
  const participants = await getParticipants(opts.conversationId);
2096
2107
  const mindParticipants = participants.filter((p) => p.userType === "mind");
2097
2108
  const participantNames = participants.map((p) => p.username);
2098
- const { getMindManager: getMindManager2 } = await import("./mind-manager-EDCLALBF.js");
2099
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
2109
+ const { getMindManager: getMindManager2 } = await import("./mind-manager-4NFK4GEU.js");
2110
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
2100
2111
  const manager = getMindManager2();
2101
2112
  const sm = getSleepManagerIfReady2();
2102
2113
  const targetMinds = mindParticipants.filter((ap) => {
@@ -2155,9 +2166,9 @@ var channels_default = app5;
2155
2166
  // packages/daemon/src/web/api/config.ts
2156
2167
  import { Hono as Hono6 } from "hono";
2157
2168
  var config = new Hono6();
2158
- config.get("/models", (c) => {
2169
+ config.get("/models", async (c) => {
2159
2170
  const enabled = new Set(getEnabledModels());
2160
- const all = getAvailableModels();
2171
+ const all = await getAvailableModels();
2161
2172
  const models = all.map((m) => ({
2162
2173
  id: m.id,
2163
2174
  name: m.name,
@@ -2166,8 +2177,8 @@ config.get("/models", (c) => {
2166
2177
  }));
2167
2178
  return c.json(models);
2168
2179
  });
2169
- config.get("/providers", (c) => {
2170
- const configured = getConfiguredProviders();
2180
+ config.get("/providers", async (c) => {
2181
+ const configured = await getConfiguredProviders();
2171
2182
  return c.json(configured.map((id) => ({ id, configured: true })));
2172
2183
  });
2173
2184
  config.get("/status", (c) => {
@@ -2308,7 +2319,7 @@ async function notifyMind(mindName, message) {
2308
2319
  const entry = await findMind(mindName);
2309
2320
  if (!entry) return;
2310
2321
  try {
2311
- const { sendSystemMessage } = await import("./system-chat-LQSJVY55.js");
2322
+ const { sendSystemMessage } = await import("./system-chat-7CA2PP6A.js");
2312
2323
  await sendSystemMessage(mindName, message);
2313
2324
  } catch (err) {
2314
2325
  logger_default.warn(`[file-sharing] notify mind ${mindName} failed`, logger_default.errorData(err));
@@ -3611,7 +3622,7 @@ async function getMindStatus(name, port, registryRunning) {
3611
3622
  const manager = getMindManager();
3612
3623
  let status = "stopped";
3613
3624
  try {
3614
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
3625
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
3615
3626
  if (getSleepManagerIfReady2()?.isSleeping(name)) {
3616
3627
  status = "sleeping";
3617
3628
  }
@@ -4068,7 +4079,7 @@ async function proxyToMind(c, path) {
4068
4079
  var app13 = new Hono15().post("/", requireAdminOrSystem, zValidator5("json", createMindSchema), async (c) => {
4069
4080
  const body = c.req.valid("json");
4070
4081
  const { name } = body;
4071
- const template = body.template ?? resolveTemplate(body.model);
4082
+ const template = body.template ?? await resolveTemplate(body.model);
4072
4083
  const nameErr = validateMindName(name);
4073
4084
  if (nameErr) return c.json({ error: nameErr }, 400);
4074
4085
  if (await findMind(name)) return c.json({ error: `Mind already exists: ${name}` }, 409);
@@ -4191,7 +4202,7 @@ The human who planted you described you as: "${body.description}"
4191
4202
  try {
4192
4203
  const spiritEntry = await findMind("volute");
4193
4204
  if (spiritEntry) {
4194
- const { spiritDir } = await import("./spirit-NVXWSVKM.js");
4205
+ const { spiritDir } = await import("./spirit-T6GK5GEP.js");
4195
4206
  const sDir = spiritEntry.dir ?? spiritDir();
4196
4207
  const spiritConfig = readVoluteConfig(sDir) ?? {};
4197
4208
  const schedules = spiritConfig.schedules ?? [];
@@ -4206,7 +4217,7 @@ The human who planted you described you as: "${body.description}"
4206
4217
  });
4207
4218
  spiritConfig.schedules = schedules;
4208
4219
  writeVoluteConfig(sDir, spiritConfig);
4209
- const { getScheduler: getScheduler2 } = await import("./scheduler-GQBDCGLU.js");
4220
+ const { getScheduler: getScheduler2 } = await import("./scheduler-PDARH4CE.js");
4210
4221
  getScheduler2().loadSchedules("volute", sDir);
4211
4222
  }
4212
4223
  }
@@ -4471,7 +4482,7 @@ ${user.trimEnd()}
4471
4482
  const manager = getMindManager();
4472
4483
  try {
4473
4484
  if (context?.type === "reload") {
4474
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
4485
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
4475
4486
  const sleepState = getSleepManagerIfReady2()?.getState(name);
4476
4487
  if (sleepState?.sleeping) {
4477
4488
  logger_default.info(`skipping reload for ${name} during sleep \u2014 will apply on next wake`);
@@ -4566,7 +4577,7 @@ ${user.trimEnd()}
4566
4577
  const name = c.req.param("name");
4567
4578
  const entry = await findMind(name);
4568
4579
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4569
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
4580
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
4570
4581
  const sm = getSleepManagerIfReady2();
4571
4582
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4572
4583
  return c.json(sm.getState(name));
@@ -4574,7 +4585,7 @@ ${user.trimEnd()}
4574
4585
  const name = c.req.param("name");
4575
4586
  const entry = await findMind(name);
4576
4587
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4577
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
4588
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
4578
4589
  const sm = getSleepManagerIfReady2();
4579
4590
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4580
4591
  if (sm.isSleeping(name)) return c.json({ error: "Mind is already sleeping" }, 409);
@@ -4594,7 +4605,7 @@ ${user.trimEnd()}
4594
4605
  const name = c.req.param("name");
4595
4606
  const entry = await findMind(name);
4596
4607
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4597
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
4608
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
4598
4609
  const sm = getSleepManagerIfReady2();
4599
4610
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4600
4611
  const sleepState = sm.getState(name);
@@ -4609,7 +4620,7 @@ ${user.trimEnd()}
4609
4620
  const name = c.req.param("name");
4610
4621
  const entry = await findMind(name);
4611
4622
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4612
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-5277OBHI.js");
4623
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-TTNOLIX5.js");
4613
4624
  const sm = getSleepManagerIfReady2();
4614
4625
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4615
4626
  const flushed = await sm.flushQueuedMessages(name);
@@ -4712,7 +4723,7 @@ ${user.trimEnd()}
4712
4723
  try {
4713
4724
  const spiritEntry = await findMind("volute");
4714
4725
  if (spiritEntry) {
4715
- const { spiritDir } = await import("./spirit-NVXWSVKM.js");
4726
+ const { spiritDir } = await import("./spirit-T6GK5GEP.js");
4716
4727
  const sDir = spiritEntry.dir ?? spiritDir();
4717
4728
  const spiritConfig = readVoluteConfig(sDir);
4718
4729
  if (spiritConfig?.schedules) {
@@ -4720,7 +4731,7 @@ ${user.trimEnd()}
4720
4731
  spiritConfig.schedules = spiritConfig.schedules.filter((s) => s.id !== nurtureId);
4721
4732
  if (spiritConfig.schedules.length === 0) spiritConfig.schedules = void 0;
4722
4733
  writeVoluteConfig(sDir, spiritConfig);
4723
- const { getScheduler: getScheduler2 } = await import("./scheduler-GQBDCGLU.js");
4734
+ const { getScheduler: getScheduler2 } = await import("./scheduler-PDARH4CE.js");
4724
4735
  getScheduler2().loadSchedules("volute", sDir);
4725
4736
  }
4726
4737
  }
@@ -5149,7 +5160,7 @@ ${user.trimEnd()}
5149
5160
  }
5150
5161
  writeVoluteConfig(dir, existing);
5151
5162
  if (body.unescapeNewlines !== void 0) {
5152
- const { clearEchoTextCache } = await import("./echo-text-QFCH3H6G.js");
5163
+ const { clearEchoTextCache } = await import("./echo-text-JUNRP4ER.js");
5153
5164
  clearEchoTextCache(name);
5154
5165
  }
5155
5166
  const needsConfigJson = body.model !== void 0 || body.thinkingLevel !== void 0 || body.maxThinkingTokens !== void 0 || body.compaction !== void 0;
@@ -5254,7 +5265,7 @@ ${user.trimEnd()}
5254
5265
  if (!body.systemPrompt || !body.message) {
5255
5266
  return c.json({ error: "systemPrompt and message required" }, 400);
5256
5267
  }
5257
- const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-AUWIPWLP.js");
5268
+ const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-EVLKMAJD.js");
5258
5269
  if (!isAiConfigured()) {
5259
5270
  return c.json({ error: "AI service not configured" }, 503);
5260
5271
  }
@@ -5998,7 +6009,7 @@ var app15 = new Hono17().get("/:name/clock/status", requireSelf(), async (c) =>
5998
6009
  const body = await c.req.text();
5999
6010
  const message = `[webhook: ${event}] ${body}`;
6000
6011
  try {
6001
- const { sendSystemMessage } = await import("./system-chat-LQSJVY55.js");
6012
+ const { sendSystemMessage } = await import("./system-chat-7CA2PP6A.js");
6002
6013
  await sendSystemMessage(name, message);
6003
6014
  return c.json({ ok: true });
6004
6015
  } catch (err) {
@@ -6309,7 +6320,7 @@ setup.post("/models", async (c) => {
6309
6320
  return c.json({ error: "Spirit model is required" }, 400);
6310
6321
  }
6311
6322
  try {
6312
- const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-AUWIPWLP.js");
6323
+ const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-EVLKMAJD.js");
6313
6324
  setEnabledModels3(body.models);
6314
6325
  const config2 = readGlobalConfig();
6315
6326
  config2.spiritModel = body.spiritModel.trim();
@@ -6327,8 +6338,8 @@ setup.post("/complete", async (c) => {
6327
6338
  return c.json({ error: "Setup already complete" }, 400);
6328
6339
  }
6329
6340
  try {
6330
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-NVXWSVKM.js");
6331
- const { startSpiritFull } = await import("./mind-service-WTOFVNLW.js");
6341
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-T6GK5GEP.js");
6342
+ const { startSpiritFull } = await import("./mind-service-X7FH3NA4.js");
6332
6343
  await ensureSpiritProject();
6333
6344
  await syncSpiritTemplate();
6334
6345
  const warnings = [];
@@ -6386,7 +6397,7 @@ setup.post("/complete", async (c) => {
6386
6397
  logger_default.info("setup complete state", { spiritConversationId, spiritStarted });
6387
6398
  if (spiritConversationId && spiritStarted) {
6388
6399
  try {
6389
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-7BCYJLH2.js");
6400
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-Q7TU24IA.js");
6390
6401
  const { listUsersByType: listUsers2 } = await import("./auth-X6ZITZ7D.js");
6391
6402
  const admins = await listUsers2("brain");
6392
6403
  const admin2 = admins.find((u) => u.role === "admin");
@@ -8050,8 +8061,8 @@ async function startDaemon(opts) {
8050
8061
  try {
8051
8062
  const { isSetupComplete: isSetupComplete2 } = await import("./setup-OTEC3ZPM.js");
8052
8063
  if (isSetupComplete2()) {
8053
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-NVXWSVKM.js");
8054
- const { startSpiritFull } = await import("./mind-service-WTOFVNLW.js");
8064
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-T6GK5GEP.js");
8065
+ const { startSpiritFull } = await import("./mind-service-X7FH3NA4.js");
8055
8066
  await ensureSpiritProject();
8056
8067
  await syncSpiritTemplate();
8057
8068
  const spiritEntry = await findMind("volute");
@@ -8068,7 +8079,7 @@ async function startDaemon(opts) {
8068
8079
  bridgeManager.startBridges(daemonPort).catch((err) => {
8069
8080
  logger_default.warn("failed to start bridges", logger_default.errorData(err));
8070
8081
  });
8071
- import("./cloud-sync-MAQCJEFJ.js").then(
8082
+ import("./cloud-sync-GOSJZIHH.js").then(
8072
8083
  ({ consumeQueuedMessages }) => consumeQueuedMessages().catch((err) => {
8073
8084
  logger_default.warn("failed to consume queued cloud messages", logger_default.errorData(err));
8074
8085
  })
@@ -8076,7 +8087,7 @@ async function startDaemon(opts) {
8076
8087
  logger_default.warn("failed to load cloud-sync module", logger_default.errorData(err));
8077
8088
  });
8078
8089
  try {
8079
- const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-N37N2C4G.js");
8090
+ const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-DK6AHWX7.js");
8080
8091
  backfillTemplateHashes();
8081
8092
  notifyVersionUpdate().catch((err) => {
8082
8093
  logger_default.warn("failed to send version update notifications", logger_default.errorData(err));