volute 0.41.1 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ai-service-XCLE3MQP.js → ai-service-3GBOJGUA.js} +10 -2
- package/dist/{chunk-ULNQ6OC4.js → chunk-2YRTSK5K.js} +2 -2
- package/dist/{chunk-IJCZAYGT.js → chunk-4ZSUUBG5.js} +97 -2
- package/dist/{chunk-F44AEQAW.js → chunk-52NMCDBS.js} +13 -13
- package/dist/{chunk-MJIJFCAH.js → chunk-JLX3GC7T.js} +2 -2
- package/dist/chunk-KZAL7HEQ.js +141 -0
- package/dist/{chunk-EKLRS2SX.js → chunk-RKBYFLOR.js} +1 -1
- package/dist/{chunk-GCS64EAD.js → chunk-TKOWXAHG.js} +3 -3
- package/dist/{chunk-MYJSKXGH.js → chunk-VSUZE2PD.js} +3 -3
- package/dist/{chunk-763WUVJQ.js → chunk-WR7CSHQ4.js} +1 -1
- package/dist/cli.js +7 -7
- package/dist/{cloud-sync-2XVXEOSU.js → cloud-sync-3OPHFOYQ.js} +7 -7
- package/dist/{create-OTM46ZUM.js → create-YNBZWD34.js} +1 -1
- package/dist/{daemon-restart-HDVGTYH7.js → daemon-restart-RAKGR56L.js} +2 -2
- package/dist/daemon.js +80 -42
- package/dist/{delivery-manager-CPADWRV2.js → delivery-manager-5Y35DOX3.js} +7 -7
- package/dist/{echo-text-GEDEEY7M.js → echo-text-YP3JVLNA.js} +8 -8
- package/dist/{extensions-SU3N4COT.js → extensions-BTNIUS5J.js} +7 -7
- package/dist/{message-delivery-HPMELC4Q.js → message-delivery-FPIL26WV.js} +7 -7
- package/dist/{mind-APS4URT7.js → mind-VXV6ZYZY.js} +3 -3
- package/dist/{mind-manager-74XQZEGX.js → mind-manager-OYOIBGK6.js} +7 -7
- package/dist/{mind-service-XGXSMQP6.js → mind-service-PR4PR4XI.js} +7 -7
- package/dist/{package-MVFX22K5.js → package-UWH5IM76.js} +1 -1
- package/dist/{sandbox-ND53WZVU.js → sandbox-E7RWZDVG.js} +2 -2
- package/dist/{scheduler-MEBQF5MW.js → scheduler-KXUY2I7W.js} +7 -7
- package/dist/{seed-L4XFZ3VX.js → seed-YQAOIXIY.js} +1 -1
- package/dist/{seed-cmd-NSTPYJFC.js → seed-cmd-7KJS4LCA.js} +2 -2
- package/dist/{seed-create-ZYCZC46W.js → seed-create-Z7NDRRGP.js} +3 -3
- package/dist/{seed-sprout-YXHU73XA.js → seed-sprout-PYDMVVUL.js} +4 -4
- package/dist/{setup-FPFWDMXD.js → setup-IYOUPCIK.js} +5 -1
- package/dist/{setup-RMR3TKCR.js → setup-VARJ7N6Z.js} +2 -2
- package/dist/{skills-AOZF6U2B.js → skills-YBCYVOPQ.js} +2 -2
- package/dist/{sleep-manager-OHM3TO62.js → sleep-manager-FJLASHHW.js} +7 -7
- package/dist/{spirit-ONLRFATY.js → spirit-NJFAY5CZ.js} +4 -4
- package/dist/{sprout-2KJOQZCL.js → sprout-B27C2WGE.js} +1 -1
- package/dist/{system-chat-HZUKBIKJ.js → system-chat-P6KVGW4T.js} +7 -7
- package/dist/{turn-tracker-TIX4DY2W.js → turn-tracker-W4TASMR7.js} +3 -3
- package/dist/{up-7KVNER6V.js → up-POJX6S5Y.js} +2 -2
- package/dist/{version-notify-UFFDUPCX.js → version-notify-TCKAX7ZA.js} +7 -7
- package/dist/web-assets/assets/{index-DaUp9iE2.js → index-CrFAsfiE.js} +10 -10
- package/dist/web-assets/assets/{index-DqHSW9Fr.css → index-D7udpBCx.css} +1 -1
- package/dist/web-assets/index.html +2 -2
- package/package.json +1 -1
- package/templates/codex/src/server.ts +8 -2
- package/templates/pi/src/lib/resolve-model.ts +50 -12
- 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-
|
|
33
|
+
} from "./chunk-2YRTSK5K.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-
|
|
101
|
+
} from "./chunk-52NMCDBS.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-
|
|
109
|
+
import "./chunk-VSUZE2PD.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-
|
|
138
|
+
} from "./chunk-JLX3GC7T.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-
|
|
178
|
+
} from "./chunk-WR7CSHQ4.js";
|
|
179
179
|
import {
|
|
180
180
|
getActiveMinds,
|
|
181
181
|
onMindEvent,
|
|
@@ -206,7 +206,7 @@ import {
|
|
|
206
206
|
summarizeTurn,
|
|
207
207
|
takeErrored,
|
|
208
208
|
trackToolUse
|
|
209
|
-
} from "./chunk-
|
|
209
|
+
} from "./chunk-TKOWXAHG.js";
|
|
210
210
|
import {
|
|
211
211
|
exec,
|
|
212
212
|
gitExec,
|
|
@@ -221,13 +221,17 @@ import {
|
|
|
221
221
|
wrapForIsolation
|
|
222
222
|
} from "./chunk-TFBQESH7.js";
|
|
223
223
|
import {
|
|
224
|
+
addCustomModel,
|
|
225
|
+
buildCustomModel,
|
|
224
226
|
getAiConfig,
|
|
225
227
|
getAvailableModels,
|
|
226
228
|
getConfiguredProviders,
|
|
229
|
+
getCustomModels,
|
|
227
230
|
getEnabledModels,
|
|
228
231
|
getUtilityModel,
|
|
229
232
|
qualifyModelId,
|
|
230
233
|
removeAiConfig,
|
|
234
|
+
removeCustomModel,
|
|
231
235
|
removeProviderConfig,
|
|
232
236
|
resolveApiKey,
|
|
233
237
|
resolveTemplate,
|
|
@@ -236,12 +240,12 @@ import {
|
|
|
236
240
|
setProviderRefreshHook,
|
|
237
241
|
setUtilityModel,
|
|
238
242
|
unqualifyModelId
|
|
239
|
-
} from "./chunk-
|
|
243
|
+
} from "./chunk-4ZSUUBG5.js";
|
|
240
244
|
import {
|
|
241
245
|
isSetupComplete,
|
|
242
246
|
readGlobalConfig,
|
|
243
247
|
writeGlobalConfig
|
|
244
|
-
} from "./chunk-
|
|
248
|
+
} from "./chunk-KZAL7HEQ.js";
|
|
245
249
|
import {
|
|
246
250
|
approveUser,
|
|
247
251
|
changePassword,
|
|
@@ -1100,6 +1104,7 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
|
|
|
1100
1104
|
}).get("/ai/models", requireAdmin, async (c) => {
|
|
1101
1105
|
const models = await getAvailableModels();
|
|
1102
1106
|
const enabled = new Set(getEnabledModels());
|
|
1107
|
+
const customIds = new Set(getCustomModels().map((m) => m.id));
|
|
1103
1108
|
return c.json(
|
|
1104
1109
|
models.map((m) => ({
|
|
1105
1110
|
id: m.id,
|
|
@@ -1107,7 +1112,8 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
|
|
|
1107
1112
|
provider: m.provider,
|
|
1108
1113
|
contextWindow: m.contextWindow,
|
|
1109
1114
|
maxTokens: m.maxTokens,
|
|
1110
|
-
enabled: enabled.has(m.id)
|
|
1115
|
+
enabled: enabled.has(m.id),
|
|
1116
|
+
custom: customIds.has(m.id)
|
|
1111
1117
|
}))
|
|
1112
1118
|
);
|
|
1113
1119
|
}).put(
|
|
@@ -1119,7 +1125,38 @@ var app = new Hono().post("/restart", requireAdmin, (c) => {
|
|
|
1119
1125
|
setEnabledModels(models);
|
|
1120
1126
|
return c.json({ ok: true });
|
|
1121
1127
|
}
|
|
1122
|
-
).
|
|
1128
|
+
).post(
|
|
1129
|
+
"/ai/models/custom",
|
|
1130
|
+
requireAdmin,
|
|
1131
|
+
zValidator(
|
|
1132
|
+
"json",
|
|
1133
|
+
z.object({ provider: z.string().min(1), id: z.string().min(1), name: z.string().optional() })
|
|
1134
|
+
),
|
|
1135
|
+
(c) => {
|
|
1136
|
+
const { provider, id, name } = c.req.valid("json");
|
|
1137
|
+
if (!buildCustomModel(provider, id)) {
|
|
1138
|
+
return c.json(
|
|
1139
|
+
{ error: `No built-in model for provider "${provider}" to clone metadata from` },
|
|
1140
|
+
400
|
|
1141
|
+
);
|
|
1142
|
+
}
|
|
1143
|
+
if (getCustomModels().some((m) => m.id === id && m.provider !== provider)) {
|
|
1144
|
+
return c.json(
|
|
1145
|
+
{ error: `A custom model "${id}" is already registered under another provider` },
|
|
1146
|
+
400
|
|
1147
|
+
);
|
|
1148
|
+
}
|
|
1149
|
+
addCustomModel(provider, id, name);
|
|
1150
|
+
setEnabledModels([.../* @__PURE__ */ new Set([...getEnabledModels(), id])]);
|
|
1151
|
+
return c.json({ ok: true });
|
|
1152
|
+
}
|
|
1153
|
+
).delete("/ai/models/custom", requireAdmin, (c) => {
|
|
1154
|
+
const provider = c.req.query("provider");
|
|
1155
|
+
const id = c.req.query("id");
|
|
1156
|
+
if (!provider || !id) return c.json({ error: "provider and id are required" }, 400);
|
|
1157
|
+
removeCustomModel(provider, id);
|
|
1158
|
+
return c.json({ ok: true });
|
|
1159
|
+
}).get("/ai/defaults", requireAdmin, (c) => {
|
|
1123
1160
|
const config2 = readGlobalConfig();
|
|
1124
1161
|
return c.json({
|
|
1125
1162
|
spiritModel: config2.spiritModel ?? null,
|
|
@@ -1978,8 +2015,8 @@ async function fanOutToBridgedMinds(opts) {
|
|
|
1978
2015
|
const participants = await getParticipants(opts.conversationId);
|
|
1979
2016
|
const mindParticipants = participants.filter((p) => p.userType === "mind");
|
|
1980
2017
|
const participantNames = participants.map((p) => p.username);
|
|
1981
|
-
const { getMindManager: getMindManager2 } = await import("./mind-manager-
|
|
1982
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
2018
|
+
const { getMindManager: getMindManager2 } = await import("./mind-manager-OYOIBGK6.js");
|
|
2019
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
1983
2020
|
const manager = getMindManager2();
|
|
1984
2021
|
const sm = getSleepManagerIfReady2();
|
|
1985
2022
|
const targetMinds = mindParticipants.filter((ap) => {
|
|
@@ -2191,7 +2228,7 @@ async function notifyMind(mindName, message) {
|
|
|
2191
2228
|
const entry = await findMind(mindName);
|
|
2192
2229
|
if (!entry) return;
|
|
2193
2230
|
try {
|
|
2194
|
-
const { sendSystemMessage } = await import("./system-chat-
|
|
2231
|
+
const { sendSystemMessage } = await import("./system-chat-P6KVGW4T.js");
|
|
2195
2232
|
await sendSystemMessage(mindName, message);
|
|
2196
2233
|
} catch (err) {
|
|
2197
2234
|
logger_default.warn(`[file-sharing] notify mind ${mindName} failed`, logger_default.errorData(err));
|
|
@@ -3505,7 +3542,7 @@ async function getMindStatus(name, port, registryRunning) {
|
|
|
3505
3542
|
const manager = getMindManager();
|
|
3506
3543
|
let status = "stopped";
|
|
3507
3544
|
try {
|
|
3508
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
3545
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
3509
3546
|
if (getSleepManagerIfReady2()?.isSleeping(name)) {
|
|
3510
3547
|
status = "sleeping";
|
|
3511
3548
|
}
|
|
@@ -4000,7 +4037,7 @@ var app13 = new Hono15().post("/", requireAdminOrSystem, zValidator5("json", cre
|
|
|
4000
4037
|
applyInitFiles(dest);
|
|
4001
4038
|
const { publicKeyPem } = generateIdentity(dest);
|
|
4002
4039
|
{
|
|
4003
|
-
const { readGlobalConfig: readGlobal } = await import("./setup-
|
|
4040
|
+
const { readGlobalConfig: readGlobal } = await import("./setup-IYOUPCIK.js");
|
|
4004
4041
|
const mindDefaults = readGlobal().mindDefaults;
|
|
4005
4042
|
const config2 = readVoluteConfig(dest);
|
|
4006
4043
|
if (!config2) throw new Error("Failed to read volute.json after identity generation");
|
|
@@ -4091,7 +4128,7 @@ The human who planted you described you as: "${body.description}"
|
|
|
4091
4128
|
}
|
|
4092
4129
|
let skillSet = body.skills ?? (body.stage === "seed" ? SEED_SKILLS : getStandardSkillsWithExtensions());
|
|
4093
4130
|
if (body.stage === "seed" && !body.skills) {
|
|
4094
|
-
const { isImagegenEnabled } = await import("./setup-
|
|
4131
|
+
const { isImagegenEnabled } = await import("./setup-IYOUPCIK.js");
|
|
4095
4132
|
if (isImagegenEnabled()) {
|
|
4096
4133
|
skillSet = [...skillSet, "imagegen"];
|
|
4097
4134
|
}
|
|
@@ -4109,7 +4146,7 @@ The human who planted you described you as: "${body.description}"
|
|
|
4109
4146
|
try {
|
|
4110
4147
|
const spiritEntry = await findMind("volute");
|
|
4111
4148
|
if (spiritEntry) {
|
|
4112
|
-
const { spiritDir } = await import("./spirit-
|
|
4149
|
+
const { spiritDir } = await import("./spirit-NJFAY5CZ.js");
|
|
4113
4150
|
const sDir = spiritEntry.dir ?? spiritDir();
|
|
4114
4151
|
const spiritConfig = readVoluteConfig(sDir) ?? {};
|
|
4115
4152
|
const schedules = spiritConfig.schedules ?? [];
|
|
@@ -4124,7 +4161,7 @@ The human who planted you described you as: "${body.description}"
|
|
|
4124
4161
|
});
|
|
4125
4162
|
spiritConfig.schedules = schedules;
|
|
4126
4163
|
writeVoluteConfig(sDir, spiritConfig);
|
|
4127
|
-
const { getScheduler: getScheduler2 } = await import("./scheduler-
|
|
4164
|
+
const { getScheduler: getScheduler2 } = await import("./scheduler-KXUY2I7W.js");
|
|
4128
4165
|
getScheduler2().loadSchedules("volute", sDir);
|
|
4129
4166
|
}
|
|
4130
4167
|
}
|
|
@@ -4389,7 +4426,7 @@ ${user.trimEnd()}
|
|
|
4389
4426
|
const manager = getMindManager();
|
|
4390
4427
|
try {
|
|
4391
4428
|
if (context?.type === "reload") {
|
|
4392
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
4429
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
4393
4430
|
const sleepState = getSleepManagerIfReady2()?.getState(name);
|
|
4394
4431
|
if (sleepState?.sleeping) {
|
|
4395
4432
|
logger_default.info(`skipping reload for ${name} during sleep \u2014 will apply on next wake`);
|
|
@@ -4484,7 +4521,7 @@ ${user.trimEnd()}
|
|
|
4484
4521
|
const name = c.req.param("name");
|
|
4485
4522
|
const entry = await findMind(name);
|
|
4486
4523
|
if (!entry) return c.json({ error: "Mind not found" }, 404);
|
|
4487
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
4524
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
4488
4525
|
const sm = getSleepManagerIfReady2();
|
|
4489
4526
|
if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
|
|
4490
4527
|
return c.json(sm.getState(name));
|
|
@@ -4492,7 +4529,7 @@ ${user.trimEnd()}
|
|
|
4492
4529
|
const name = c.req.param("name");
|
|
4493
4530
|
const entry = await findMind(name);
|
|
4494
4531
|
if (!entry) return c.json({ error: "Mind not found" }, 404);
|
|
4495
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
4532
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
4496
4533
|
const sm = getSleepManagerIfReady2();
|
|
4497
4534
|
if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
|
|
4498
4535
|
if (sm.isSleeping(name)) return c.json({ error: "Mind is already sleeping" }, 409);
|
|
@@ -4512,7 +4549,7 @@ ${user.trimEnd()}
|
|
|
4512
4549
|
const name = c.req.param("name");
|
|
4513
4550
|
const entry = await findMind(name);
|
|
4514
4551
|
if (!entry) return c.json({ error: "Mind not found" }, 404);
|
|
4515
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
4552
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
4516
4553
|
const sm = getSleepManagerIfReady2();
|
|
4517
4554
|
if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
|
|
4518
4555
|
const sleepState = sm.getState(name);
|
|
@@ -4527,7 +4564,7 @@ ${user.trimEnd()}
|
|
|
4527
4564
|
const name = c.req.param("name");
|
|
4528
4565
|
const entry = await findMind(name);
|
|
4529
4566
|
if (!entry) return c.json({ error: "Mind not found" }, 404);
|
|
4530
|
-
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-
|
|
4567
|
+
const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-FJLASHHW.js");
|
|
4531
4568
|
const sm = getSleepManagerIfReady2();
|
|
4532
4569
|
if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
|
|
4533
4570
|
const flushed = await sm.flushQueuedMessages(name);
|
|
@@ -4592,7 +4629,7 @@ ${user.trimEnd()}
|
|
|
4592
4629
|
const config2 = readVoluteConfig(dir);
|
|
4593
4630
|
const displayNameSet = !!config2?.profile?.displayName;
|
|
4594
4631
|
const avatarSet = !!config2?.profile?.avatar;
|
|
4595
|
-
const { isImagegenEnabled } = await import("./setup-
|
|
4632
|
+
const { isImagegenEnabled } = await import("./setup-IYOUPCIK.js");
|
|
4596
4633
|
const imagegenEnabled = isImagegenEnabled();
|
|
4597
4634
|
const done = [];
|
|
4598
4635
|
const remaining = [];
|
|
@@ -4630,7 +4667,7 @@ ${user.trimEnd()}
|
|
|
4630
4667
|
try {
|
|
4631
4668
|
const spiritEntry = await findMind("volute");
|
|
4632
4669
|
if (spiritEntry) {
|
|
4633
|
-
const { spiritDir } = await import("./spirit-
|
|
4670
|
+
const { spiritDir } = await import("./spirit-NJFAY5CZ.js");
|
|
4634
4671
|
const sDir = spiritEntry.dir ?? spiritDir();
|
|
4635
4672
|
const spiritConfig = readVoluteConfig(sDir);
|
|
4636
4673
|
if (spiritConfig?.schedules) {
|
|
@@ -4638,7 +4675,7 @@ ${user.trimEnd()}
|
|
|
4638
4675
|
spiritConfig.schedules = spiritConfig.schedules.filter((s) => s.id !== nurtureId);
|
|
4639
4676
|
if (spiritConfig.schedules.length === 0) spiritConfig.schedules = void 0;
|
|
4640
4677
|
writeVoluteConfig(sDir, spiritConfig);
|
|
4641
|
-
const { getScheduler: getScheduler2 } = await import("./scheduler-
|
|
4678
|
+
const { getScheduler: getScheduler2 } = await import("./scheduler-KXUY2I7W.js");
|
|
4642
4679
|
getScheduler2().loadSchedules("volute", sDir);
|
|
4643
4680
|
}
|
|
4644
4681
|
}
|
|
@@ -5073,7 +5110,7 @@ ${user.trimEnd()}
|
|
|
5073
5110
|
}
|
|
5074
5111
|
writeVoluteConfig(dir, existing);
|
|
5075
5112
|
if (body.unescapeNewlines !== void 0) {
|
|
5076
|
-
const { clearEchoTextCache } = await import("./echo-text-
|
|
5113
|
+
const { clearEchoTextCache } = await import("./echo-text-YP3JVLNA.js");
|
|
5077
5114
|
clearEchoTextCache(name);
|
|
5078
5115
|
}
|
|
5079
5116
|
const needsConfigJson = body.model !== void 0 || body.thinkingLevel !== void 0 || body.maxThinkingTokens !== void 0 || body.compaction !== void 0;
|
|
@@ -5150,7 +5187,7 @@ ${user.trimEnd()}
|
|
|
5150
5187
|
}
|
|
5151
5188
|
if (entry.mindType === "spirit" && body.model !== void 0) {
|
|
5152
5189
|
try {
|
|
5153
|
-
const { readGlobalConfig: readGlobalConfig2, writeGlobalConfig: writeGlobalConfig2 } = await import("./setup-
|
|
5190
|
+
const { readGlobalConfig: readGlobalConfig2, writeGlobalConfig: writeGlobalConfig2 } = await import("./setup-IYOUPCIK.js");
|
|
5154
5191
|
const globalConfig = readGlobalConfig2();
|
|
5155
5192
|
globalConfig.spiritModel = body.model;
|
|
5156
5193
|
writeGlobalConfig2(globalConfig);
|
|
@@ -5178,7 +5215,7 @@ ${user.trimEnd()}
|
|
|
5178
5215
|
if (!body.systemPrompt || !body.message) {
|
|
5179
5216
|
return c.json({ error: "systemPrompt and message required" }, 400);
|
|
5180
5217
|
}
|
|
5181
|
-
const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-
|
|
5218
|
+
const { aiComplete: aiCompleteFn, isAiConfigured } = await import("./ai-service-3GBOJGUA.js");
|
|
5182
5219
|
if (!isAiConfigured()) {
|
|
5183
5220
|
return c.json({ error: "AI service not configured" }, 503);
|
|
5184
5221
|
}
|
|
@@ -5922,7 +5959,7 @@ var app15 = new Hono17().get("/:name/clock/status", requireSelf(), async (c) =>
|
|
|
5922
5959
|
const body = await c.req.text();
|
|
5923
5960
|
const message = `[webhook: ${event}] ${body}`;
|
|
5924
5961
|
try {
|
|
5925
|
-
const { sendSystemMessage } = await import("./system-chat-
|
|
5962
|
+
const { sendSystemMessage } = await import("./system-chat-P6KVGW4T.js");
|
|
5926
5963
|
await sendSystemMessage(name, message);
|
|
5927
5964
|
return c.json({ ok: true });
|
|
5928
5965
|
} catch (err) {
|
|
@@ -6233,7 +6270,7 @@ setup.post("/models", async (c) => {
|
|
|
6233
6270
|
return c.json({ error: "Spirit model is required" }, 400);
|
|
6234
6271
|
}
|
|
6235
6272
|
try {
|
|
6236
|
-
const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-
|
|
6273
|
+
const { setEnabledModels: setEnabledModels3, setUtilityModel: setUtilityModel2 } = await import("./ai-service-3GBOJGUA.js");
|
|
6237
6274
|
setEnabledModels3(body.models);
|
|
6238
6275
|
const config2 = readGlobalConfig();
|
|
6239
6276
|
config2.spiritModel = body.spiritModel.trim();
|
|
@@ -6251,8 +6288,8 @@ setup.post("/complete", async (c) => {
|
|
|
6251
6288
|
return c.json({ error: "Setup already complete" }, 400);
|
|
6252
6289
|
}
|
|
6253
6290
|
try {
|
|
6254
|
-
const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-
|
|
6255
|
-
const { startSpiritFull } = await import("./mind-service-
|
|
6291
|
+
const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-NJFAY5CZ.js");
|
|
6292
|
+
const { startSpiritFull } = await import("./mind-service-PR4PR4XI.js");
|
|
6256
6293
|
await ensureSpiritProject();
|
|
6257
6294
|
await syncSpiritTemplate();
|
|
6258
6295
|
const warnings = [];
|
|
@@ -6310,7 +6347,7 @@ setup.post("/complete", async (c) => {
|
|
|
6310
6347
|
logger_default.info("setup complete state", { spiritConversationId, spiritStarted });
|
|
6311
6348
|
if (spiritConversationId && spiritStarted) {
|
|
6312
6349
|
try {
|
|
6313
|
-
const { deliverMessage: deliverMessage2 } = await import("./message-delivery-
|
|
6350
|
+
const { deliverMessage: deliverMessage2 } = await import("./message-delivery-FPIL26WV.js");
|
|
6314
6351
|
const { listUsersByType: listUsers2 } = await import("./auth-EAASQPTN.js");
|
|
6315
6352
|
const admins = await listUsers2("brain");
|
|
6316
6353
|
const admin2 = admins.find((u) => u.role === "admin");
|
|
@@ -7876,7 +7913,8 @@ async function startDaemon(opts) {
|
|
|
7876
7913
|
const DAEMON_JSON_PATH = resolve17(systemDir, "daemon.json");
|
|
7877
7914
|
mkdirSync10(home, { recursive: true });
|
|
7878
7915
|
ensureSystemDir();
|
|
7879
|
-
const { migrateSetupCompleted } = await import("./setup-
|
|
7916
|
+
const { migrateConfigSecrets, migrateSetupCompleted } = await import("./setup-IYOUPCIK.js");
|
|
7917
|
+
migrateConfigSecrets();
|
|
7880
7918
|
migrateSetupCompleted();
|
|
7881
7919
|
await (await import("./db-ZJJJYJBU.js")).getDb();
|
|
7882
7920
|
try {
|
|
@@ -7887,7 +7925,7 @@ async function startDaemon(opts) {
|
|
|
7887
7925
|
} catch (err) {
|
|
7888
7926
|
logger_default.warn("failed to migrate system user role", logger_default.errorData(err));
|
|
7889
7927
|
}
|
|
7890
|
-
const { initSandbox } = await import("./sandbox-
|
|
7928
|
+
const { initSandbox } = await import("./sandbox-E7RWZDVG.js");
|
|
7891
7929
|
await initSandbox();
|
|
7892
7930
|
try {
|
|
7893
7931
|
await syncBuiltinSkills();
|
|
@@ -7923,7 +7961,7 @@ async function startDaemon(opts) {
|
|
|
7923
7961
|
);
|
|
7924
7962
|
}
|
|
7925
7963
|
const token = process.env.VOLUTE_DAEMON_TOKEN || randomBytes(32).toString("hex");
|
|
7926
|
-
const { readGlobalConfig: readGlobalConfig2 } = await import("./setup-
|
|
7964
|
+
const { readGlobalConfig: readGlobalConfig2 } = await import("./setup-IYOUPCIK.js");
|
|
7927
7965
|
const globalCfg = readGlobalConfig2();
|
|
7928
7966
|
let tls;
|
|
7929
7967
|
if (opts.tailscale || globalCfg.tailscale) {
|
|
@@ -8006,10 +8044,10 @@ async function startDaemon(opts) {
|
|
|
8006
8044
|
await Promise.all(workers);
|
|
8007
8045
|
}
|
|
8008
8046
|
try {
|
|
8009
|
-
const { isSetupComplete: isSetupComplete2 } = await import("./setup-
|
|
8047
|
+
const { isSetupComplete: isSetupComplete2 } = await import("./setup-IYOUPCIK.js");
|
|
8010
8048
|
if (isSetupComplete2()) {
|
|
8011
|
-
const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-
|
|
8012
|
-
const { startSpiritFull } = await import("./mind-service-
|
|
8049
|
+
const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-NJFAY5CZ.js");
|
|
8050
|
+
const { startSpiritFull } = await import("./mind-service-PR4PR4XI.js");
|
|
8013
8051
|
await ensureSpiritProject();
|
|
8014
8052
|
await syncSpiritTemplate();
|
|
8015
8053
|
const spiritEntry = await findMind("volute");
|
|
@@ -8026,7 +8064,7 @@ async function startDaemon(opts) {
|
|
|
8026
8064
|
bridgeManager.startBridges(daemonPort).catch((err) => {
|
|
8027
8065
|
logger_default.warn("failed to start bridges", logger_default.errorData(err));
|
|
8028
8066
|
});
|
|
8029
|
-
import("./cloud-sync-
|
|
8067
|
+
import("./cloud-sync-3OPHFOYQ.js").then(
|
|
8030
8068
|
({ consumeQueuedMessages }) => consumeQueuedMessages().catch((err) => {
|
|
8031
8069
|
logger_default.warn("failed to consume queued cloud messages", logger_default.errorData(err));
|
|
8032
8070
|
})
|
|
@@ -8034,7 +8072,7 @@ async function startDaemon(opts) {
|
|
|
8034
8072
|
logger_default.warn("failed to load cloud-sync module", logger_default.errorData(err));
|
|
8035
8073
|
});
|
|
8036
8074
|
try {
|
|
8037
|
-
const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-
|
|
8075
|
+
const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-TCKAX7ZA.js");
|
|
8038
8076
|
backfillTemplateHashes();
|
|
8039
8077
|
notifyVersionUpdate().catch((err) => {
|
|
8040
8078
|
logger_default.warn("failed to send version update notifications", logger_default.errorData(err));
|
|
@@ -4,21 +4,21 @@ import {
|
|
|
4
4
|
getDeliveryManager,
|
|
5
5
|
initDeliveryManager,
|
|
6
6
|
tryGetDeliveryManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-52NMCDBS.js";
|
|
8
8
|
import "./chunk-BLOAJLGI.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-VSUZE2PD.js";
|
|
10
10
|
import "./chunk-QLWG3C2Z.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JLX3GC7T.js";
|
|
12
12
|
import "./chunk-YLTIEEVL.js";
|
|
13
13
|
import "./chunk-CU6OFXMM.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-WR7CSHQ4.js";
|
|
15
15
|
import "./chunk-VBKRZCR7.js";
|
|
16
16
|
import "./chunk-62ICA2FF.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-TKOWXAHG.js";
|
|
18
18
|
import "./chunk-GN52E2DP.js";
|
|
19
19
|
import "./chunk-TFBQESH7.js";
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
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,23 +2,23 @@
|
|
|
2
2
|
import {
|
|
3
3
|
clearEchoTextCache,
|
|
4
4
|
echoTextToChannel
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2YRTSK5K.js";
|
|
6
6
|
import "./chunk-QPTQKGGF.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-52NMCDBS.js";
|
|
8
8
|
import "./chunk-BLOAJLGI.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-VSUZE2PD.js";
|
|
10
10
|
import "./chunk-QLWG3C2Z.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JLX3GC7T.js";
|
|
12
12
|
import "./chunk-YLTIEEVL.js";
|
|
13
13
|
import "./chunk-CU6OFXMM.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-WR7CSHQ4.js";
|
|
15
15
|
import "./chunk-VBKRZCR7.js";
|
|
16
16
|
import "./chunk-62ICA2FF.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-TKOWXAHG.js";
|
|
18
18
|
import "./chunk-GN52E2DP.js";
|
|
19
19
|
import "./chunk-TFBQESH7.js";
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
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";
|
|
@@ -13,21 +13,21 @@ import {
|
|
|
13
13
|
parseCommandArgs,
|
|
14
14
|
setExtensionEnabled,
|
|
15
15
|
uninstallNpmExtension
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-52NMCDBS.js";
|
|
17
17
|
import "./chunk-BLOAJLGI.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-VSUZE2PD.js";
|
|
19
19
|
import "./chunk-QLWG3C2Z.js";
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-JLX3GC7T.js";
|
|
21
21
|
import "./chunk-YLTIEEVL.js";
|
|
22
22
|
import "./chunk-CU6OFXMM.js";
|
|
23
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-WR7CSHQ4.js";
|
|
24
24
|
import "./chunk-VBKRZCR7.js";
|
|
25
25
|
import "./chunk-62ICA2FF.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-TKOWXAHG.js";
|
|
27
27
|
import "./chunk-GN52E2DP.js";
|
|
28
28
|
import "./chunk-TFBQESH7.js";
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
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";
|
|
@@ -8,21 +8,21 @@ import {
|
|
|
8
8
|
tagRecentInbound,
|
|
9
9
|
tagUntaggedInbound,
|
|
10
10
|
tagUntaggedOutbound
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-52NMCDBS.js";
|
|
12
12
|
import "./chunk-BLOAJLGI.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-VSUZE2PD.js";
|
|
14
14
|
import "./chunk-QLWG3C2Z.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-JLX3GC7T.js";
|
|
16
16
|
import "./chunk-YLTIEEVL.js";
|
|
17
17
|
import "./chunk-CU6OFXMM.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-WR7CSHQ4.js";
|
|
19
19
|
import "./chunk-VBKRZCR7.js";
|
|
20
20
|
import "./chunk-62ICA2FF.js";
|
|
21
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-TKOWXAHG.js";
|
|
22
22
|
import "./chunk-GN52E2DP.js";
|
|
23
23
|
import "./chunk-TFBQESH7.js";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-4ZSUUBG5.js";
|
|
25
|
+
import "./chunk-KZAL7HEQ.js";
|
|
26
26
|
import "./chunk-5QG36RV7.js";
|
|
27
27
|
import "./chunk-K547QOCM.js";
|
|
28
28
|
import "./chunk-T2TP6ZC6.js";
|
|
@@ -18,7 +18,7 @@ var cmd = subcommands({
|
|
|
18
18
|
commands: {
|
|
19
19
|
create: {
|
|
20
20
|
description: "Create a new mind",
|
|
21
|
-
run: (args) => import("./create-
|
|
21
|
+
run: (args) => import("./create-YNBZWD34.js").then((m) => m.run(args))
|
|
22
22
|
},
|
|
23
23
|
start: {
|
|
24
24
|
description: "Start a mind",
|
|
@@ -82,11 +82,11 @@ var cmd = subcommands({
|
|
|
82
82
|
},
|
|
83
83
|
seed: {
|
|
84
84
|
description: "(legacy) Use 'volute seed create' instead",
|
|
85
|
-
run: (args) => import("./seed-
|
|
85
|
+
run: (args) => import("./seed-YQAOIXIY.js").then((m) => m.run(args))
|
|
86
86
|
},
|
|
87
87
|
sprout: {
|
|
88
88
|
description: "(legacy) Use 'volute seed sprout' instead",
|
|
89
|
-
run: (args) => import("./sprout-
|
|
89
|
+
run: (args) => import("./sprout-B27C2WGE.js").then((m) => m.run(args))
|
|
90
90
|
}
|
|
91
91
|
},
|
|
92
92
|
footer: "Mind name can be omitted (where applicable) if VOLUTE_MIND is set."
|
|
@@ -4,21 +4,21 @@ import {
|
|
|
4
4
|
buildMindBaseEnv,
|
|
5
5
|
getMindManager,
|
|
6
6
|
initMindManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-52NMCDBS.js";
|
|
8
8
|
import "./chunk-BLOAJLGI.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-VSUZE2PD.js";
|
|
10
10
|
import "./chunk-QLWG3C2Z.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-JLX3GC7T.js";
|
|
12
12
|
import "./chunk-YLTIEEVL.js";
|
|
13
13
|
import "./chunk-CU6OFXMM.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-WR7CSHQ4.js";
|
|
15
15
|
import "./chunk-VBKRZCR7.js";
|
|
16
16
|
import "./chunk-62ICA2FF.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-TKOWXAHG.js";
|
|
18
18
|
import "./chunk-GN52E2DP.js";
|
|
19
19
|
import "./chunk-TFBQESH7.js";
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
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";
|
|
@@ -6,21 +6,21 @@ import {
|
|
|
6
6
|
stopMindFull,
|
|
7
7
|
stopSpiritFull,
|
|
8
8
|
wakeMind
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-52NMCDBS.js";
|
|
10
10
|
import "./chunk-BLOAJLGI.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-VSUZE2PD.js";
|
|
12
12
|
import "./chunk-QLWG3C2Z.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-JLX3GC7T.js";
|
|
14
14
|
import "./chunk-YLTIEEVL.js";
|
|
15
15
|
import "./chunk-CU6OFXMM.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-WR7CSHQ4.js";
|
|
17
17
|
import "./chunk-VBKRZCR7.js";
|
|
18
18
|
import "./chunk-62ICA2FF.js";
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-TKOWXAHG.js";
|
|
20
20
|
import "./chunk-GN52E2DP.js";
|
|
21
21
|
import "./chunk-TFBQESH7.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-4ZSUUBG5.js";
|
|
23
|
+
import "./chunk-KZAL7HEQ.js";
|
|
24
24
|
import "./chunk-5QG36RV7.js";
|
|
25
25
|
import "./chunk-K547QOCM.js";
|
|
26
26
|
import "./chunk-T2TP6ZC6.js";
|
|
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
|
|
|
4
4
|
// package.json
|
|
5
5
|
var package_default = {
|
|
6
6
|
name: "volute",
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.42.0",
|
|
8
8
|
description: "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
|
|
9
9
|
type: "module",
|
|
10
10
|
license: "MIT",
|
|
@@ -7,8 +7,8 @@ import {
|
|
|
7
7
|
isSandboxOptional,
|
|
8
8
|
shellEscape,
|
|
9
9
|
wrapForSandbox
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-WR7CSHQ4.js";
|
|
11
|
+
import "./chunk-KZAL7HEQ.js";
|
|
12
12
|
import "./chunk-T2TP6ZC6.js";
|
|
13
13
|
import "./chunk-IUZ3EV2D.js";
|
|
14
14
|
import "./chunk-MHFAWJCC.js";
|
|
@@ -3,21 +3,21 @@ import {
|
|
|
3
3
|
Scheduler,
|
|
4
4
|
getScheduler,
|
|
5
5
|
initScheduler
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-52NMCDBS.js";
|
|
7
7
|
import "./chunk-BLOAJLGI.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-VSUZE2PD.js";
|
|
9
9
|
import "./chunk-QLWG3C2Z.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-JLX3GC7T.js";
|
|
11
11
|
import "./chunk-YLTIEEVL.js";
|
|
12
12
|
import "./chunk-CU6OFXMM.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-WR7CSHQ4.js";
|
|
14
14
|
import "./chunk-VBKRZCR7.js";
|
|
15
15
|
import "./chunk-62ICA2FF.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-TKOWXAHG.js";
|
|
17
17
|
import "./chunk-GN52E2DP.js";
|
|
18
18
|
import "./chunk-TFBQESH7.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-4ZSUUBG5.js";
|
|
20
|
+
import "./chunk-KZAL7HEQ.js";
|
|
21
21
|
import "./chunk-5QG36RV7.js";
|
|
22
22
|
import "./chunk-K547QOCM.js";
|
|
23
23
|
import "./chunk-T2TP6ZC6.js";
|
|
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
|
|
|
4
4
|
// packages/cli/src/commands/seed.ts
|
|
5
5
|
async function run(args) {
|
|
6
6
|
console.error("Note: `volute mind seed` is now `volute seed create`");
|
|
7
|
-
await import("./seed-create-
|
|
7
|
+
await import("./seed-create-Z7NDRRGP.js").then((m) => m.run(args));
|
|
8
8
|
}
|
|
9
9
|
export {
|
|
10
10
|
run
|