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.
- package/README.md +2 -2
- package/dist/{ai-service-AUWIPWLP.js → ai-service-EVLKMAJD.js} +1 -1
- package/dist/{chunk-ANSTTB55.js → chunk-42UMLIQR.js} +19 -20
- package/dist/{chunk-YTNBO7S6.js → chunk-NRJ3ZYFP.js} +4 -4
- package/dist/{chunk-QV7P3TYO.js → chunk-UX7FPDDO.js} +1 -1
- package/dist/{chunk-LZ6CQYRO.js → chunk-WOWRLBL2.js} +4 -2
- package/dist/chunk-YMMYN2V3.js +1212 -0
- package/dist/{chunk-BLAXARBZ.js → chunk-ZOI6D2YH.js} +174 -1293
- package/dist/{chunk-S4SXBQ7F.js → chunk-ZXPWTH4I.js} +42 -34
- package/dist/cli.js +7 -7
- package/dist/{cloud-sync-MAQCJEFJ.js → cloud-sync-GOSJZIHH.js} +6 -5
- package/dist/{create-T4UJ64WB.js → create-Y3RGU2GI.js} +2 -2
- package/dist/{daemon-restart-LP2DR24J.js → daemon-restart-FSWVXPUE.js} +1 -1
- package/dist/daemon.js +73 -62
- package/dist/{delivery-manager-VNHLQTTO.js → delivery-manager-3NTCDKHR.js} +10 -7
- package/dist/{echo-text-QFCH3H6G.js → echo-text-JUNRP4ER.js} +7 -6
- package/dist/{extensions-LQX2N7TI.js → extensions-MD757RFY.js} +6 -5
- package/dist/{message-delivery-7BCYJLH2.js → message-delivery-Q7TU24IA.js} +6 -5
- package/dist/{mind-ELPD6VBP.js → mind-OOB2LEVC.js} +3 -3
- package/dist/{mind-activity-tracker-XFRVGXFS.js → mind-activity-tracker-GJ5RJS32.js} +1 -1
- package/dist/{mind-manager-EDCLALBF.js → mind-manager-4NFK4GEU.js} +6 -5
- package/dist/{mind-service-WTOFVNLW.js → mind-service-X7FH3NA4.js} +6 -5
- package/dist/{package-GO3PHHUF.js → package-PPA3VWS2.js} +4 -4
- package/dist/{scheduler-GQBDCGLU.js → scheduler-PDARH4CE.js} +6 -5
- package/dist/{seed-MO2C7CWC.js → seed-BTAHXCO5.js} +1 -1
- package/dist/{seed-cmd-ETIF4WD6.js → seed-cmd-VEJNJBAQ.js} +2 -2
- package/dist/{seed-create-BPQC2IOR.js → seed-create-LOU5RALI.js} +4 -4
- package/dist/{seed-sprout-TX72K33T.js → seed-sprout-BXF5TBXD.js} +2 -2
- package/dist/{setup-ZTW4FVMQ.js → setup-W3545462.js} +1 -1
- package/dist/{skills-JEWMHIIE.js → skills-3P7VQA4U.js} +1 -1
- package/dist/{sleep-manager-5277OBHI.js → sleep-manager-TTNOLIX5.js} +6 -5
- package/dist/{spirit-NVXWSVKM.js → spirit-T6GK5GEP.js} +3 -3
- package/dist/{sprout-NFJZKYEW.js → sprout-AQICF7WZ.js} +1 -1
- package/dist/{system-chat-LQSJVY55.js → system-chat-7CA2PP6A.js} +6 -5
- package/dist/turn-tracker-AI6WWEBA.js +35 -0
- package/dist/{up-4H7TL6WB.js → up-PKNNDN6M.js} +1 -1
- package/dist/{version-notify-N37N2C4G.js → version-notify-DK6AHWX7.js} +6 -5
- package/package.json +4 -4
- package/templates/claude/package.json.tmpl +1 -1
- package/templates/codex/package.json.tmpl +1 -1
- package/templates/pi/package.json.tmpl +2 -1
- package/templates/pi/src/agent.ts +1 -1
- package/templates/pi/src/lib/content.ts +1 -1
- package/templates/pi/src/lib/event-handler.ts +1 -1
- package/templates/pi/src/lib/reply-instructions-extension.ts +1 -1
- package/templates/pi/src/lib/resolve-model.ts +4 -4
- package/templates/pi/src/lib/subagents.ts +2 -2
- /package/dist/{chat-JD3TJINV.js → chat-F2EEN76G.js} +0 -0
- /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 {
|
|
12
|
-
import { getOAuthApiKey } from "@
|
|
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
|
|
62
|
-
if (!configured.has(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
|
|
144
|
+
async function getAvailableModels() {
|
|
145
|
+
const providers = await getConfiguredProviders();
|
|
146
|
+
const result = [];
|
|
125
147
|
for (const provider of providers) {
|
|
126
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
177
|
-
|
|
178
|
-
|
|
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-
|
|
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-
|
|
42
|
+
await import("./setup-W3545462.js").then((m) => m.run(args));
|
|
43
43
|
break;
|
|
44
44
|
case "mind":
|
|
45
|
-
await import("./mind-
|
|
45
|
+
await import("./mind-OOB2LEVC.js").then((m) => m.run(args));
|
|
46
46
|
break;
|
|
47
47
|
case "seed":
|
|
48
|
-
await import("./seed-cmd-
|
|
48
|
+
await import("./seed-cmd-VEJNJBAQ.js").then((m) => m.run(args));
|
|
49
49
|
break;
|
|
50
50
|
case "chat":
|
|
51
|
-
await import("./chat-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-ZOI6D2YH.js";
|
|
5
5
|
import "./chunk-ITH5ZLZJ.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-NRJ3ZYFP.js";
|
|
7
7
|
import "./chunk-46DYYHN6.js";
|
|
8
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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");
|
package/dist/daemon.js
CHANGED
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
fixModelEscapes,
|
|
31
31
|
getPlatformDriver,
|
|
32
32
|
routeOutboundBridge
|
|
33
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 =
|
|
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-
|
|
2099
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
6331
|
-
const { startSpiritFull } = await import("./mind-service-
|
|
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-
|
|
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-
|
|
8054
|
-
const { startSpiritFull } = await import("./mind-service-
|
|
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-
|
|
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-
|
|
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));
|