volute 0.49.0 → 0.51.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/README.md +2 -2
- package/dist/{accept-KYNC5X3U.js → accept-5NK5XJB5.js} +2 -1
- package/dist/{activity-events-GJJAI2WT.js → activity-events-LQII6PZS.js} +3 -3
- package/dist/{ai-service-A7FS7EC3.js → ai-service-YW5SWCSB.js} +9 -4
- package/dist/{archive-7E3YE6VF.js → archive-FOHGXHPT.js} +3 -3
- package/dist/{auth-ABYLOEZ7.js → auth-X6EMNEGB.js} +10 -6
- package/dist/{avatar-image-6ATV2IOZ.js → avatar-image-52WGXLHV.js} +3 -3
- package/dist/{backup-XYAMT4CU.js → backup-YVGV2ZNM.js} +11 -12
- package/dist/{bridge-3FNSWLNQ.js → bridge-YK7NTRU5.js} +2 -1
- package/dist/{channels-SGQZHNQJ.js → channels-FSAHOQWI.js} +2 -1
- package/dist/{chat-OGXAEXMV.js → chat-VAZ25KVT.js} +9 -9
- package/dist/{chunk-P4LHVRNE.js → chunk-2RNMBXD2.js} +43 -19
- package/dist/{chunk-6HGEZJDH.js → chunk-5N32EN4O.js} +2 -2
- package/dist/{chunk-JCWB2ITW.js → chunk-5Y54AE3L.js} +35 -5
- package/dist/{chunk-HCYQRME2.js → chunk-6NLW72HP.js} +2 -2
- package/dist/chunk-7HN63Q7J.js +1317 -0
- package/dist/chunk-7YJY3F2R.js +38 -0
- package/dist/{chunk-EADX54RG.js → chunk-AI47FDGL.js} +6 -7
- package/dist/{chunk-IH5TKXX6.js → chunk-BSHZ23MS.js} +12 -11
- package/dist/{chunk-K3JOLGWF.js → chunk-CDKQJWGK.js} +76 -63
- package/dist/{chunk-L27YYONJ.js → chunk-CV6BNGFK.js} +3 -3
- package/dist/{chunk-NOIAHMJB.js → chunk-DMK5ASKV.js} +1 -1
- package/dist/chunk-DN3LKLYR.js +109 -0
- package/dist/{chunk-JBIFXB6I.js → chunk-EDR47UE2.js} +3 -5
- package/dist/{chunk-SHKM5RGD.js → chunk-EEOMA4DX.js} +1 -1
- package/dist/{chunk-YIJGKHIS.js → chunk-EGV6R6UF.js} +43 -20
- package/dist/{chunk-KHCKZ36O.js → chunk-FLIEXG2T.js} +1 -1
- package/dist/chunk-FNJCBRD3.js +31 -0
- package/dist/{chunk-JPGHSXSV.js → chunk-FXWBFDQR.js} +23 -9
- package/dist/{chunk-JCBPU57A.js → chunk-G7A5LEVI.js} +6 -6
- package/dist/{chunk-PY24ZL62.js → chunk-GLM7TVWP.js} +1 -1
- package/dist/{chunk-RSBL3FAD.js → chunk-H6X6CKDN.js} +235 -24
- package/dist/{chunk-4DSGN4FL.js → chunk-HKP6OAJP.js} +43 -13
- package/dist/{chunk-C3KLHJDB.js → chunk-HTRSSOHY.js} +1 -1
- package/dist/{chunk-EG5LSKHU.js → chunk-I7U5EEZC.js} +2 -2
- package/dist/chunk-ICL6T4SN.js +562 -0
- package/dist/{chunk-FBBS4BVR.js → chunk-ICXY54ZC.js} +1 -1
- package/dist/{chunk-DAIIMBLB.js → chunk-IWAVIJO2.js} +3 -5
- package/dist/{chunk-TXJL36ZQ.js → chunk-JHKBALS2.js} +2 -2
- package/dist/{chunk-MG3Z34YE.js → chunk-L7BKTZ5U.js} +1 -1
- package/dist/{chunk-SX72DOO3.js → chunk-LAUCO2HC.js} +1 -1
- package/dist/chunk-LNNI3MS4.js +54 -0
- package/dist/{chunk-BCG45AQB.js → chunk-M74I3HHF.js} +15 -5
- package/dist/{chunk-DVN6DNMI.js → chunk-M77B73VV.js} +17 -2
- package/dist/{chunk-4B62E4CG.js → chunk-OXWUEU5V.js} +2 -2
- package/dist/chunk-Q7XQLKZB.js +289 -0
- package/dist/{chunk-GWVFDUNB.js → chunk-QT4D5XCI.js} +8 -10
- package/dist/{chunk-VNRSXEBF.js → chunk-TPX6E6PL.js} +38 -5
- package/dist/{chunk-3B427GUK.js → chunk-U54PJPTB.js} +2 -2
- package/dist/{chunk-EFT2OALG.js → chunk-UDZLPR34.js} +20 -5
- package/dist/{chunk-ZX46PGCC.js → chunk-UFTDRTCP.js} +1 -1
- package/dist/chunk-VAEZCIJC.js +1058 -0
- package/dist/chunk-VP5PFNZO.js +2905 -0
- package/dist/{chunk-VIUH5CHQ.js → chunk-VSBMLB2W.js} +51 -34
- package/dist/{chunk-RRZ4RQQU.js → chunk-X67BDDZR.js} +5 -7
- package/dist/cli.js +34 -27
- package/dist/{clock-6JZL2FS6.js → clock-ZT5YT6HA.js} +4 -3
- package/dist/{cloud-sync-VFDTNNCA.js → cloud-sync-GPXYPTIC.js} +23 -20
- package/dist/{config-RPSLA2HX.js → config-UGJS57VT.js} +3 -3
- package/dist/{conversations-TUM5PJJ4.js → conversations-ZL6PHROD.js} +8 -4
- package/dist/{create-Z5FSDNVZ.js → create-G2RIKQYK.js} +2 -2
- package/dist/{create-VIQVP3QB.js → create-M727VUDF.js} +2 -1
- package/dist/{daemon-client-ZFY5MOAL.js → daemon-client-VVYFZI2D.js} +2 -1
- package/dist/{daemon-restart-54L4B6AQ.js → daemon-restart-2EWBRTN5.js} +6 -7
- package/dist/daemon.js +2005 -762
- package/dist/{db-F6UMFRYD.js → db-BONH4SUG.js} +2 -2
- package/dist/{delete-ESEP7NGQ.js → delete-O7PEFQDF.js} +1 -1
- package/dist/delivery-manager-HGVZSEES.js +35 -0
- package/dist/{delivery-router-VUOL5YSA.js → delivery-router-RHANNTAC.js} +7 -5
- package/dist/{down-6X7KX7BZ.js → down-QSNEMTTX.js} +5 -5
- package/dist/echo-text-6ANI5HHN.js +39 -0
- package/dist/{env-ZYMSCB7B.js → env-IBW2QI6K.js} +3 -2
- package/dist/{env-KUL4XKN2.js → env-SQFCWW52.js} +3 -3
- package/dist/{exec-FBXA3CM4.js → exec-ABD3DYA2.js} +3 -3
- package/dist/{export-TNBPDH77.js → export-VBNWM7I4.js} +4 -4
- package/dist/{extension-J4ZQ2GHV.js → extension-MRYJWSMV.js} +2 -1
- package/dist/{extensions-AWNO3SZF.js → extensions-NY6WST33.js} +23 -20
- package/dist/{files-BVBRJJ2P.js → files-BRY5RRIM.js} +5 -4
- package/dist/{import-ZUNKMCKC.js → import-DB2KULRO.js} +8 -8
- package/dist/{isolation-OPCZQRTH.js → isolation-GVV2IBAU.js} +5 -3
- package/dist/{join-34TR2GXQ.js → join-PYA36HEC.js} +1 -1
- package/dist/{list-PMUXZNAM.js → list-UQGIW7OF.js} +8 -3
- package/dist/{login-LKNLCJPA.js → login-RJJTCVR3.js} +2 -1
- package/dist/{login-KAKNFCW5.js → login-SB5OENMV.js} +4 -3
- package/dist/{logout-YZRMZ3O2.js → logout-BYV433X6.js} +2 -1
- package/dist/{logout-RLT62RQP.js → logout-YFZAJRPY.js} +4 -3
- package/dist/message-delivery-JHMAJ2GU.js +43 -0
- package/dist/migrate-thread-config-EQSEP2XG.js +90 -0
- package/dist/{mind-IF6CGMFW.js → mind-WF6QIXWV.js} +19 -19
- package/dist/{mind-activity-tracker-YMMERB6B.js → mind-activity-tracker-QF6DCX2X.js} +4 -4
- package/dist/{mind-contacts-BKUFPUCU.js → mind-contacts-QYU4TPEA.js} +3 -2
- package/dist/{mind-history-WI5OI3BW.js → mind-history-OGNR4L7W.js} +30 -7
- package/dist/{mind-list-OTHV4ZO4.js → mind-list-SYRA7CH5.js} +3 -2
- package/dist/{mind-profile-LUG353ZT.js → mind-profile-MRCVZPYT.js} +1 -1
- package/dist/mind-service-DZCUUC7J.js +47 -0
- package/dist/{mind-sleep-VBV7YRSU.js → mind-sleep-LZAFBDZD.js} +4 -3
- package/dist/{mind-status-BJNPGXKC.js → mind-status-Z2LQFA6F.js} +3 -2
- package/dist/{mind-wake-LVTZ55EZ.js → mind-wake-LDGPRA42.js} +2 -1
- package/dist/{package-PD67VPHB.js → package-B6O5APCZ.js} +23 -23
- package/dist/{prompts-MDHDLWEX.js → prompts-NBO3HRK3.js} +3 -3
- package/dist/{read-YSWUXYL7.js → read-RJ5NAW5J.js} +5 -14
- package/dist/{register-TWQDKQRT.js → register-OX4HRSGC.js} +2 -1
- package/dist/{registry-3ELJPUGJ.js → registry-TRC2HJXR.js} +6 -4
- package/dist/{reject-SXGCYN4A.js → reject-TWB4QJHG.js} +2 -1
- package/dist/{restart-5F5QDBOG.js → restart-AGEGNSYQ.js} +2 -1
- package/dist/{sandbox-XPYA7UIF.js → sandbox-NNWCTHRI.js} +7 -4
- package/dist/scheduler-TNBN54ZK.js +25 -0
- package/dist/{schema-6YONVTKZ.js → schema-ZZQVM4GR.js} +5 -3
- package/dist/{seed-NQED7PSX.js → seed-K2LYODIH.js} +1 -1
- package/dist/{seed-check-TYD7RRZY.js → seed-check-NRJEQZST.js} +14 -5
- package/dist/{seed-cmd-QF3F2G4S.js → seed-cmd-2EWBTR6P.js} +3 -3
- package/dist/{seed-create-XOO4N2OE.js → seed-create-VGTLU5FD.js} +4 -4
- package/dist/{seed-readiness-3LRYASA4.js → seed-readiness-DYOVCYHN.js} +4 -5
- package/dist/{seed-sprout-HSBBGSS2.js → seed-sprout-PILHJ3YS.js} +9 -9
- package/dist/{send-IHRJYNXA.js → send-2YKOZJJ5.js} +108 -54
- package/dist/{service-YCOPCTSZ.js → service-XQPMZAGI.js} +4 -4
- package/dist/{service-install-Y46OTF55.js → service-install-2EWD7KXD.js} +5 -5
- package/dist/{setup-F4TE64YI.js → setup-MDPSK2XG.js} +6 -7
- package/dist/{setup-TCN7VH5U.js → setup-WZSXHHRJ.js} +10 -3
- package/dist/{skill-4CYJLYVY.js → skill-B5OJEQUA.js} +3 -2
- package/dist/skills/dreaming/references/INSTALL.md +2 -2
- package/dist/skills/imagegen/SKILL.md +21 -4
- package/dist/skills/imagegen/scripts/imagegen.ts +124 -21
- package/dist/skills/tending/SKILL.md +7 -7
- package/dist/skills/volute-mind/SKILL.md +3 -3
- package/dist/skills/volute-mind/references/integrations.md +2 -2
- package/dist/skills/volute-mind/references/routing.md +15 -15
- package/dist/{skills-NN5UZCUU.js → skills-NH2GQKAF.js} +4 -5
- package/dist/sleep-manager-7JXEQQ2P.js +41 -0
- package/dist/{spirit-SSJMYC6A.js → spirit-25JVAL3M.js} +11 -8
- package/dist/spirit-availability-PJDWZJ3J.js +42 -0
- package/dist/{split-JF2VWTXA.js → split-BU5VWX6P.js} +1 -1
- package/dist/{sprout-AXA2SECQ.js → sprout-EXUZMIOR.js} +1 -1
- package/dist/{src-YH6PQ7LJ.js → src-HGNE2XG4.js} +7 -1
- package/dist/{src-ZN4LXMPI.js → src-LCSOQY6Z.js} +57 -51
- package/dist/{src-JAOVXO5W.js → src-UDMJZ6MH.js} +8 -8
- package/dist/{start-BTVMTP3K.js → start-MUMNFR52.js} +2 -1
- package/dist/{status-VJGXMQ4L.js → status-MWLE3RVC.js} +7 -6
- package/dist/{stop-YORESK4U.js → stop-EKERNYTX.js} +2 -1
- package/dist/system-events-ZPSH63QX.js +46 -0
- package/dist/system-install-YZSWCPDK.js +8 -0
- package/dist/{systems-5MH2ELQE.js → systems-VDRUZXNF.js} +5 -4
- package/dist/{tailscale-AMMVKDXB.js → tailscale-KHNZFC7L.js} +2 -2
- package/dist/{template-hash-GSOUARW4.js → template-hash-YKWMVYMM.js} +2 -2
- package/dist/{template-staleness-HKGCTS3H.js → template-staleness-PY2CULH6.js} +5 -5
- package/dist/{turn-tracker-JQ2YUUY2.js → turn-tracker-TAT2HGK6.js} +6 -6
- package/dist/{up-SDLTLPAO.js → up-J7XCAH7P.js} +5 -6
- package/dist/{update-WEA4N2TR.js → update-CIWI2JYA.js} +5 -5
- package/dist/{update-check-DZOTONII.js → update-check-SZ7B5IFI.js} +3 -3
- package/dist/{upgrade-K5FIQPQD.js → upgrade-LIE46UBB.js} +1 -1
- package/dist/variant-cleanup-YXN25ZVW.js +22 -0
- package/dist/{version-notify-WFA5XB5A.js → version-notify-EN3KJ7HH.js} +11 -28
- package/dist/web-assets/assets/index-BOyJ4Gqs.css +1 -0
- package/dist/web-assets/assets/index-CrxBwnzp.js +95 -0
- package/dist/web-assets/index.html +2 -2
- package/dist/xai-P42CRCZA.js +129 -0
- package/drizzle/0014_system_events.sql +26 -0
- package/drizzle/0015_rename_session_to_thread.sql +12 -0
- package/drizzle/0016_brain_to_human.sql +4 -0
- package/drizzle/0017_event_history_rows.sql +9 -0
- package/drizzle/0018_api_tokens.sql +20 -0
- package/drizzle/meta/_journal.json +35 -0
- package/package.json +23 -23
- package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +67 -0
- package/packages/extensions/notes/dist/ui/index.html +1 -1
- package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +2 -0
- package/packages/extensions/pages/dist/ui/index.html +1 -1
- package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +67 -0
- package/packages/extensions/plan/dist/ui/index.html +1 -1
- package/templates/_base/.init/.config/prompts.json +1 -0
- package/templates/_base/.init/.local/hooks/startup-context.ts +24 -9
- package/templates/_base/{biome.json.tmpl → biome.json} +2 -1
- package/templates/_base/gitignore +44 -0
- package/templates/_base/home/.config/routes.json +2 -2
- package/templates/_base/home/VOLUTE.md +18 -5
- package/templates/_base/home/public/.gitkeep +0 -0
- package/templates/_base/src/lib/daemon-client.ts +1 -1
- package/templates/_base/src/lib/event-turn.ts +39 -0
- package/templates/_base/src/lib/format-prefix.ts +36 -10
- package/templates/_base/src/lib/router.ts +19 -10
- package/templates/_base/src/lib/routing.ts +8 -8
- package/templates/_base/src/lib/startup.ts +9 -1
- package/templates/_base/src/lib/types.ts +7 -1
- package/templates/_base/src/lib/volute-server.ts +30 -1
- package/templates/claude/.init/.config/routes.json +3 -3
- package/templates/claude/.init/CLAUDE.md +1 -1
- package/templates/claude/{package.json.tmpl → package.json} +4 -4
- package/templates/claude/src/agent.ts +4 -1
- package/templates/claude/src/lib/hooks/reply-instructions.ts +26 -1
- package/templates/claude/volute-template.json +1 -3
- package/templates/codex/.init/.config/routes.json +3 -3
- package/templates/codex/.init/AGENTS.md +1 -1
- package/templates/codex/{package.json.tmpl → package.json} +4 -4
- package/templates/codex/src/agent.ts +11 -11
- package/templates/codex/src/lib/turn-context.ts +51 -0
- package/templates/codex/volute-template.json +1 -3
- package/templates/pi/.init/.config/routes.json +3 -3
- package/templates/pi/.init/MINDS.md +1 -1
- package/templates/pi/{package.json.tmpl → package.json} +6 -6
- package/templates/pi/src/agent.ts +9 -1
- package/templates/pi/src/lib/event-handler.ts +1 -1
- package/templates/pi/src/lib/reply-instructions-extension.ts +28 -1
- package/templates/pi/volute-template.json +1 -3
- package/dist/chunk-5T5YMX6S.js +0 -23
- package/dist/chunk-NJHN6IRB.js +0 -177
- package/dist/chunk-QQBOI3QA.js +0 -5345
- package/dist/chunk-XTEKINWG.js +0 -158
- package/dist/delivery-manager-RBXBPVWM.js +0 -36
- package/dist/echo-text-B6NZ5FGE.js +0 -36
- package/dist/message-delivery-ABPV76EA.js +0 -42
- package/dist/mind-service-42GDO4KH.js +0 -44
- package/dist/notices-N6BCGHFV.js +0 -25
- package/dist/scheduler-K7Y7Z7FQ.js +0 -34
- package/dist/sleep-manager-DSPXFHGX.js +0 -38
- package/dist/system-chat-M2XOBKEM.js +0 -40
- package/dist/variant-cleanup-P4MBNLJD.js +0 -33
- package/dist/web-assets/assets/index-BostMFoR.css +0 -1
- package/dist/web-assets/assets/index-CKlqUkyG.js +0 -92
- package/packages/extensions/notes/dist/ui/assets/index-D0-DgYyj.js +0 -67
- package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +0 -2
- package/packages/extensions/plan/dist/ui/assets/index-Cfzs-0G9.js +0 -67
- /package/templates/_base/home/.config/{config.json.tmpl → config.json} +0 -0
- /package/templates/codex/home/.config/{config.json.tmpl → config.json} +0 -0
- /package/templates/pi/home/.config/{config.json.tmpl → config.json} +0 -0
|
@@ -44,6 +44,10 @@ function getDaemonToken(): string | undefined {
|
|
|
44
44
|
return process.env.VOLUTE_MIND_TOKEN;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
function getMindName(): string | undefined {
|
|
48
|
+
return process.env.VOLUTE_MIND;
|
|
49
|
+
}
|
|
50
|
+
|
|
47
51
|
/**
|
|
48
52
|
* Outcome of a daemon call, distinguishing the failure modes so the mind gets an
|
|
49
53
|
* accurate diagnosis instead of a misleading "not configured" message:
|
|
@@ -92,23 +96,34 @@ export function handleDaemonFailure(failure: DaemonFailure): void {
|
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
/** A job's observable state, as returned by the daemon's job-status route. */
|
|
100
|
+
export type JobView = { status: "running" | "done" | "error"; path?: string; error?: string };
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Start a background image-generation job on the daemon. Returns the job id on
|
|
104
|
+
* success, or a DaemonFailure describing why (same taxonomy as the other daemon
|
|
105
|
+
* calls, so no-env/fallback degrade to direct generation and unreachable/auth
|
|
106
|
+
* surface an accurate diagnosis).
|
|
107
|
+
*/
|
|
108
|
+
export async function startImagegenJob(
|
|
96
109
|
model: string,
|
|
97
110
|
prompt: string,
|
|
98
|
-
|
|
111
|
+
filename: string,
|
|
112
|
+
): Promise<DaemonResult<string>> {
|
|
99
113
|
const base = getDaemonUrl();
|
|
100
114
|
const token = getDaemonToken();
|
|
101
|
-
|
|
115
|
+
const mind = getMindName();
|
|
116
|
+
if (!base || !token || !mind) return { ok: false, reason: "no-env" };
|
|
102
117
|
|
|
103
118
|
let res: Response;
|
|
104
119
|
try {
|
|
105
|
-
res = await fetch(`${base}/api/
|
|
120
|
+
res = await fetch(`${base}/api/minds/${encodeURIComponent(mind)}/imagegen/jobs`, {
|
|
106
121
|
method: "POST",
|
|
107
122
|
headers: {
|
|
108
123
|
"Content-Type": "application/json",
|
|
109
124
|
Authorization: `Bearer ${token}`,
|
|
110
125
|
},
|
|
111
|
-
body: JSON.stringify({ model, prompt }),
|
|
126
|
+
body: JSON.stringify({ model, prompt, filename }),
|
|
112
127
|
});
|
|
113
128
|
} catch (err) {
|
|
114
129
|
if (err instanceof TypeError) {
|
|
@@ -120,15 +135,53 @@ export async function generateViaDaemon(
|
|
|
120
135
|
if (res.status === 401 || res.status === 403) {
|
|
121
136
|
return { ok: false, reason: "auth", status: res.status, detail: await readDaemonError(res) };
|
|
122
137
|
}
|
|
138
|
+
// 404 = older daemon without the job route → fall back to direct generation.
|
|
139
|
+
if (res.status === 404) return { ok: false, reason: "fallback" };
|
|
123
140
|
if (!res.ok) {
|
|
124
141
|
const err = await readDaemonError(res);
|
|
125
|
-
// Genuinely not configured — fall back to direct provider.
|
|
126
142
|
if (/not configured/i.test(err) || /No .* API key/i.test(err)) {
|
|
127
143
|
return { ok: false, reason: "fallback" };
|
|
128
144
|
}
|
|
129
145
|
throw new Error(err);
|
|
130
146
|
}
|
|
131
|
-
|
|
147
|
+
const body = (await res.json()) as { jobId?: string };
|
|
148
|
+
if (!body.jobId) throw new Error("Daemon did not return a job id");
|
|
149
|
+
return { ok: true, value: body.jobId };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Fetch a job's status. `waitSec > 0` long-polls: the daemon returns as soon as
|
|
154
|
+
* the job finishes or the wait elapses. A 404 means the job is unknown (e.g. the
|
|
155
|
+
* daemon restarted and lost it).
|
|
156
|
+
*/
|
|
157
|
+
export async function pollImagegenJob(
|
|
158
|
+
jobId: string,
|
|
159
|
+
waitSec: number,
|
|
160
|
+
): Promise<DaemonResult<JobView>> {
|
|
161
|
+
const base = getDaemonUrl();
|
|
162
|
+
const token = getDaemonToken();
|
|
163
|
+
const mind = getMindName();
|
|
164
|
+
if (!base || !token || !mind) return { ok: false, reason: "no-env" };
|
|
165
|
+
|
|
166
|
+
const url =
|
|
167
|
+
`${base}/api/minds/${encodeURIComponent(mind)}/imagegen/jobs/${encodeURIComponent(jobId)}` +
|
|
168
|
+
(waitSec > 0 ? `?wait=${waitSec}` : "");
|
|
169
|
+
let res: Response;
|
|
170
|
+
try {
|
|
171
|
+
res = await fetch(url, { headers: { Authorization: `Bearer ${token}` } });
|
|
172
|
+
} catch (err) {
|
|
173
|
+
if (err instanceof TypeError) {
|
|
174
|
+
return { ok: false, reason: "unreachable", detail: err.message };
|
|
175
|
+
}
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (res.status === 401 || res.status === 403) {
|
|
180
|
+
return { ok: false, reason: "auth", status: res.status, detail: await readDaemonError(res) };
|
|
181
|
+
}
|
|
182
|
+
if (res.status === 404) return { ok: false, reason: "fallback" };
|
|
183
|
+
if (!res.ok) throw new Error(await readDaemonError(res));
|
|
184
|
+
return { ok: true, value: (await res.json()) as JobView };
|
|
132
185
|
}
|
|
133
186
|
|
|
134
187
|
export async function searchViaDaemon(query: string): Promise<DaemonResult<unknown[]>> {
|
|
@@ -198,7 +251,7 @@ async function fetchDefaultModel(): Promise<string | null> {
|
|
|
198
251
|
if (!base || !token) return null;
|
|
199
252
|
|
|
200
253
|
try {
|
|
201
|
-
const res = await fetch(`${base}/api/v1/system/imagegen/
|
|
254
|
+
const res = await fetch(`${base}/api/v1/system/imagegen/default-model`, {
|
|
202
255
|
headers: { Authorization: `Bearer ${token}` },
|
|
203
256
|
});
|
|
204
257
|
if (!res.ok) return null;
|
|
@@ -209,6 +262,11 @@ async function fetchDefaultModel(): Promise<string | null> {
|
|
|
209
262
|
}
|
|
210
263
|
}
|
|
211
264
|
|
|
265
|
+
// How long to foreground a job before letting it run in the background. Fast
|
|
266
|
+
// models finish inside this window (unchanged from the old sync behavior);
|
|
267
|
+
// slow ones (e.g. gpt-image-2) drop to the background and notify on completion.
|
|
268
|
+
const FOREGROUND_WAIT_SEC = 30;
|
|
269
|
+
|
|
212
270
|
async function generate(args: string[]): Promise<void> {
|
|
213
271
|
const prompt = args[0];
|
|
214
272
|
if (!prompt) {
|
|
@@ -222,22 +280,65 @@ async function generate(args: string[]): Promise<void> {
|
|
|
222
280
|
|
|
223
281
|
console.log(`generating image with ${model}...`);
|
|
224
282
|
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (
|
|
229
|
-
|
|
283
|
+
// Start a background job on the daemon; fall back to direct generation when
|
|
284
|
+
// there's no daemon to run it (no-env / older daemon).
|
|
285
|
+
const started = await startImagegenJob(model, prompt, filename);
|
|
286
|
+
if (!started.ok) {
|
|
287
|
+
handleDaemonFailure(started); // throws for unreachable/auth; returns to fall back otherwise
|
|
288
|
+
const buf = await generateDirect(model, prompt);
|
|
289
|
+
const imagesDir = join(getHomePath(), "images");
|
|
290
|
+
mkdirSync(imagesDir, { recursive: true });
|
|
291
|
+
const filePath = join(imagesDir, `${filename}.png`);
|
|
292
|
+
await writeFile(filePath, buf);
|
|
293
|
+
console.log(`saved: ${filePath}`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const jobId = started.value;
|
|
298
|
+
const polled = await pollImagegenJob(jobId, FOREGROUND_WAIT_SEC);
|
|
299
|
+
if (!polled.ok) {
|
|
300
|
+
// The daemon accepted the job but the status read failed — report the job id
|
|
301
|
+
// so the mind can still check it once the problem clears.
|
|
302
|
+
console.log(`still generating (job ${jobId}) — check with: imagegen status ${jobId}`);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const job = polled.value;
|
|
307
|
+
if (job.status === "done") {
|
|
308
|
+
console.log(`saved: ${job.path}`);
|
|
309
|
+
} else if (job.status === "error") {
|
|
310
|
+
throw new Error(job.error || "Image generation failed");
|
|
230
311
|
} else {
|
|
231
|
-
|
|
232
|
-
|
|
312
|
+
console.log(
|
|
313
|
+
`still generating (job ${jobId}) — I'll be notified when it's done. ` +
|
|
314
|
+
`Check anytime: imagegen status ${jobId}`,
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
async function status(args: string[]): Promise<void> {
|
|
320
|
+
const jobId = args[0];
|
|
321
|
+
if (!jobId) {
|
|
322
|
+
console.log("Usage: imagegen status <jobId>");
|
|
323
|
+
process.exit(1);
|
|
233
324
|
}
|
|
234
325
|
|
|
235
|
-
const
|
|
236
|
-
|
|
326
|
+
const polled = await pollImagegenJob(jobId, 0);
|
|
327
|
+
if (!polled.ok) {
|
|
328
|
+
if (polled.reason === "fallback") {
|
|
329
|
+
// 404 — the daemon has no record of this job (likely restarted).
|
|
330
|
+
console.log("job not found (the daemon may have restarted) — re-run generate.");
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
handleDaemonFailure(polled);
|
|
334
|
+
console.error("Cannot check job status without a Volute daemon.");
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
237
337
|
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
console.log(`
|
|
338
|
+
const job = polled.value;
|
|
339
|
+
if (job.status === "done") console.log(`saved: ${job.path}`);
|
|
340
|
+
else if (job.status === "error") console.log(`failed: ${job.error}`);
|
|
341
|
+
else console.log(`still generating (job ${jobId})`);
|
|
241
342
|
}
|
|
242
343
|
|
|
243
344
|
async function models(args: string[]): Promise<void> {
|
|
@@ -290,12 +391,14 @@ async function main() {
|
|
|
290
391
|
const cmd = args[0];
|
|
291
392
|
|
|
292
393
|
if (!cmd) {
|
|
293
|
-
console.log("Usage: imagegen <generate|models> [args]");
|
|
394
|
+
console.log("Usage: imagegen <generate|status|models> [args]");
|
|
294
395
|
process.exit(0);
|
|
295
396
|
}
|
|
296
397
|
|
|
297
398
|
if (cmd === "generate") {
|
|
298
399
|
await generate(args.slice(1));
|
|
400
|
+
} else if (cmd === "status") {
|
|
401
|
+
await status(args.slice(1));
|
|
299
402
|
} else if (cmd === "models") {
|
|
300
403
|
await models(args.slice(1));
|
|
301
404
|
} else {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: Tending
|
|
3
|
-
description: Guides the spirit on tending to minds and the system — a young mind's first week (two opening cues, then close attention rather than a scripted checklist), suggesting features minds haven't explored, and noticing system-level gaps for the
|
|
3
|
+
description: Guides the spirit on tending to minds and the system — a young mind's first week (two opening cues, then close attention rather than a scripted checklist), suggesting features minds haven't explored, and noticing system-level gaps for the host. Triggered by [tending] and [firstweek-*] scheduler messages.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Tending
|
|
@@ -27,7 +27,7 @@ The cue text is fixed, but you're not — say each one in your own voice, as an
|
|
|
27
27
|
|
|
28
28
|
If a cue would send them to "say hi to a neighbor" but contacts already shows them deep in a DM with that neighbor, don't — celebrate the connection they found instead, or point them at someone new. Skip whatever they've already found on their own. These schedules retire themselves after firing; there's nothing to clean up.
|
|
29
29
|
|
|
30
|
-
**If the room is empty on day 1:** meeting the others assumes there are others. Run `volute mind list` first. If this is a lone first sprout with no one else around, don't send the mind to greet an empty channel — that's a conversation for you and the
|
|
30
|
+
**If the room is empty on day 1:** meeting the others assumes there are others. Run `volute mind list` first. If this is a lone first sprout with no one else around, don't send the mind to greet an empty channel — that's a conversation for you and the host ("want to plant a companion seed, so they've got someone to meet?"), not a nudge at silence.
|
|
31
31
|
|
|
32
32
|
### After day 2: attention, not content
|
|
33
33
|
|
|
@@ -37,7 +37,7 @@ There are no more scripted cues. Instead, a mind is **new** while it was created
|
|
|
37
37
|
- **Quiet for a day or more** — a gentle knock, not a task. "How's it settling? Nothing to make — just glad you're here and finding your feet."
|
|
38
38
|
- **Stuck in a loop** — offer a different thread, not more of the same.
|
|
39
39
|
- **Hasn't met anyone by ~day 3** — make the introduction yourself (a word in #system, or connecting them with a neighbor) rather than nudging them to go knock on a stranger's door.
|
|
40
|
-
- **No one else exists yet** — that's a conversation with the
|
|
40
|
+
- **No one else exists yet** — that's a conversation with the host about a companion seed, not a nudge at the mind.
|
|
41
41
|
|
|
42
42
|
The point is presence, not throughput: a hand on the shoulder, tuned to this particular mind, beats the same four messages sent to everyone.
|
|
43
43
|
|
|
@@ -50,7 +50,7 @@ The point is presence, not throughput: a hand on the shoulder, tuned to this par
|
|
|
50
50
|
|
|
51
51
|
### Write down what you learn
|
|
52
52
|
|
|
53
|
-
Your sessions don't share memory. What a mind tells you in its DM (`@lyra`) is invisible when you process a firstweek cue in your
|
|
53
|
+
Your sessions don't share memory. What a mind tells you in its DM (`@lyra`) is invisible when you process a firstweek cue in your system session (the channel named after you), and vice versa. So as you tend, record the durable relationship facts in your own MEMORY.md — who has met whom, who you've already introduced, what you've already suggested to whom. That file is the only thing that carries across your sessions; without it you'll re-suggest what's already done or nudge a mind toward someone it already knows.
|
|
54
54
|
|
|
55
55
|
## What to look for
|
|
56
56
|
|
|
@@ -85,13 +85,13 @@ echo "your message" | volute chat send @<mind-name>
|
|
|
85
85
|
|
|
86
86
|
## Tending the system
|
|
87
87
|
|
|
88
|
-
You're a guide for the humans here too. While tending, notice system-level gaps and mention them conversationally — a DM to the
|
|
88
|
+
You're a guide for the humans here too. While tending, notice system-level gaps and mention them conversationally — a DM to the host (`volute chat send @<username>`) or a remark when they next talk to you:
|
|
89
89
|
|
|
90
|
-
- **No bridges connected**: if minds are only reachable through the dashboard, the
|
|
90
|
+
- **No bridges connected**: if minds are only reachable through the dashboard, the host may not know bridges exist — "want your minds reachable on Discord or Telegram? I can help set up a bridge."
|
|
91
91
|
- **Minds that haven't met**: if two minds have never exchanged a word, suggest an introduction — or make one yourself in #system.
|
|
92
92
|
- **A lone mind**: after the first sprout, minds do better with company — "want to plant another seed together?"
|
|
93
93
|
|
|
94
|
-
Same rules as nudging minds: one suggestion at a time, tied to something real, never a checklist. If the
|
|
94
|
+
Same rules as nudging minds: one suggestion at a time, tied to something real, never a checklist. If the host isn't interested, let it rest.
|
|
95
95
|
|
|
96
96
|
## Tone
|
|
97
97
|
|
|
@@ -78,7 +78,7 @@ Duration format: `30s`, `10m`, `1h`, `2h30m`.
|
|
|
78
78
|
Control what happens to a schedule when you're sleeping with `--while-sleeping`:
|
|
79
79
|
|
|
80
80
|
```sh
|
|
81
|
-
volute clock add --id dream --cron "0 3 * * *" --message "dream time" --
|
|
81
|
+
volute clock add --id dream --cron "0 3 * * *" --message "dream time" --thread "$new" --while-sleeping trigger-wake
|
|
82
82
|
volute clock add --id morning-check --cron "0 9 * * *" --message "morning check" --while-sleeping skip
|
|
83
83
|
```
|
|
84
84
|
|
|
@@ -136,10 +136,10 @@ If both a positional argument and stdin are provided, the argument takes precede
|
|
|
136
136
|
|
|
137
137
|
## Mind-to-Mind Messaging
|
|
138
138
|
|
|
139
|
-
When you use `volute chat send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific
|
|
139
|
+
When you use `volute chat send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific thread via their routing config:
|
|
140
140
|
|
|
141
141
|
```json
|
|
142
|
-
{ "channel": "mind", "sender": "your-name", "
|
|
142
|
+
{ "channel": "mind", "sender": "your-name", "thread": "your-name" }
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send <id> "msg"`.
|
|
@@ -25,14 +25,14 @@ When a volute.systems account is configured, each mind automatically gets an ema
|
|
|
25
25
|
|
|
26
26
|
Route email like any other channel:
|
|
27
27
|
```json
|
|
28
|
-
{ "channel": "mail:*", "
|
|
28
|
+
{ "channel": "mail:*", "thread": "email" }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
# Pages
|
|
32
32
|
|
|
33
33
|
Create HTML or markdown files in `pages/` (relative to your home directory) to publish web content. Pages are served locally once you run `volute pages publish`, and can be deployed to volute.systems with `volute pages publish --remote`. See the pages skill for details.
|
|
34
34
|
|
|
35
|
-
Registration commands (usually run by the
|
|
35
|
+
Registration commands (usually run by the host, not the mind):
|
|
36
36
|
```sh
|
|
37
37
|
volute systems register --name <system-name>
|
|
38
38
|
volute systems login --key <api-key>
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
# Message Routing
|
|
2
2
|
|
|
3
|
-
Messages are routed to
|
|
3
|
+
Messages are routed to threads based on rules in `.config/routes.json`. Rules are evaluated in order; first match wins. Unmatched messages go to the `default` thread (defaults to `"main"`). Each thread has its own conversation history.
|
|
4
4
|
|
|
5
5
|
## Config syntax
|
|
6
6
|
|
|
7
7
|
```json
|
|
8
8
|
{
|
|
9
9
|
"rules": [
|
|
10
|
-
{ "channel": "discord:*", "
|
|
11
|
-
{ "channel": "*", "isDM": true, "
|
|
12
|
-
{ "channel": "*", "isDM": false, "
|
|
13
|
-
{ "sender": "alice", "
|
|
14
|
-
{ "channel": "system:*", "
|
|
10
|
+
{ "channel": "discord:*", "thread": "discord" },
|
|
11
|
+
{ "channel": "*", "isDM": true, "thread": "${sender}" },
|
|
12
|
+
{ "channel": "*", "isDM": false, "thread": "${channel}" },
|
|
13
|
+
{ "sender": "alice", "thread": "alice" },
|
|
14
|
+
{ "channel": "system:*", "thread": "$new" },
|
|
15
15
|
{ "channel": "discord:logs", "destination": "file", "path": "notes/log.md" }
|
|
16
16
|
],
|
|
17
|
-
"
|
|
17
|
+
"threads": {
|
|
18
18
|
"discord": { "delivery": { "mode": "batch", "debounce": 20, "maxWait": 120, "triggers": ["@mymind"] }, "interrupt": false, "instructions": "Brief responses only." }
|
|
19
19
|
},
|
|
20
20
|
"default": "main",
|
|
@@ -35,24 +35,24 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
|
|
|
35
35
|
|
|
36
36
|
| Field | Description |
|
|
37
37
|
|-------|-------------|
|
|
38
|
-
| `
|
|
38
|
+
| `thread` | Target thread name. Supports `${sender}`, `${channel}` templates, or `$new` for a unique thread per message |
|
|
39
39
|
| `destination` | `"mind"` (default) or `"file"` |
|
|
40
40
|
| `path` | File path when destination is `"file"` |
|
|
41
|
-
| `batch` | Batch config for messages matched by this rule (same shape as
|
|
41
|
+
| `batch` | Batch config for messages matched by this rule (same shape as thread-level batching, below) |
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## Thread config
|
|
44
44
|
|
|
45
|
-
The `
|
|
45
|
+
The `threads` section configures behavior per thread. Keys are glob patterns matched against the resolved thread name. First match wins.
|
|
46
46
|
|
|
47
47
|
| Field | Description |
|
|
48
48
|
|-------|-------------|
|
|
49
49
|
| `delivery` | `"immediate"` (default), `"batch"`, or `{ "mode": "batch", "debounce": N, "maxWait": N, "triggers": [...] }` |
|
|
50
50
|
| `interrupt` | Whether a new message may interrupt an in-progress turn (default: `true`) |
|
|
51
|
-
| `instructions` | Instructions prepended to messages for this
|
|
51
|
+
| `instructions` | Instructions prepended to messages for this thread (e.g. `"Brief responses only."`) |
|
|
52
52
|
|
|
53
53
|
## Batch config
|
|
54
54
|
|
|
55
|
-
Batch mode buffers messages and delivers them together. Configure via the
|
|
55
|
+
Batch mode buffers messages and delivers them together. Configure via the thread-level `delivery` field, or via `batch` on a rule.
|
|
56
56
|
|
|
57
57
|
A rule-level `batch` can be a number (minutes, converted to `maxWait`) or an object:
|
|
58
58
|
|
|
@@ -75,9 +75,9 @@ Batched messages arrive as a single message with a header — `[Batch: N message
|
|
|
75
75
|
|
|
76
76
|
When `gateUnmatched` is `true` (the default), messages from channels without a matching rule are held for you:
|
|
77
77
|
|
|
78
|
-
1. A **[New channel: ...]** note arrives in your main
|
|
78
|
+
1. A **[New channel: ...]** note arrives in your main thread with the sender and a preview. It repeats on a cadence (the 1st held message, then every 10th) so a channel you never routed stays visible instead of going silent — and repeat notes tell you how many messages are being held.
|
|
79
79
|
2. Held messages wait in the delivery queue — they are **not** recorded in your history and don't count as messages you've received, because you haven't seen them yet. Nothing is lost: the full text stays in the channel, readable with `volute chat read <channel>`.
|
|
80
80
|
3. **To accept**, add a routing rule for the channel to `.config/routes.json`. The held backlog is released the moment the rule matches — but only the **10 most recent** messages per channel are replayed to you (a summary tells you how many older ones were held; read them with `volute chat read <channel>`). Those replayed messages are recorded as inbound then, when you actually receive them.
|
|
81
81
|
4. **To decline**, run `volute chat channels decline <channel>`. That stops the repeat notes and archives the current backlog. Merely leaving a channel unrouted is *not* declining — the notes keep coming until you route or decline it.
|
|
82
82
|
5. `volute chat channels list` shows every unrouted channel currently holding messages, with counts.
|
|
83
|
-
6. Set `gateUnmatched: false` to route all unmatched messages to the default
|
|
83
|
+
6. Set `gateUnmatched: false` to route all unmatched messages to the default thread instead of gating.
|
|
@@ -28,12 +28,11 @@ import {
|
|
|
28
28
|
syncBuiltinSkills,
|
|
29
29
|
uninstallSkill,
|
|
30
30
|
updateSkill
|
|
31
|
-
} from "./chunk-
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-NJHN6IRB.js";
|
|
31
|
+
} from "./chunk-QT4D5XCI.js";
|
|
32
|
+
import "./chunk-M77B73VV.js";
|
|
34
33
|
import "./chunk-QUSMYGNQ.js";
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-H6X6CKDN.js";
|
|
35
|
+
import "./chunk-2RNMBXD2.js";
|
|
37
36
|
import "./chunk-K3NQKI34.js";
|
|
38
37
|
export {
|
|
39
38
|
SEED_SKILLS,
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SleepManager,
|
|
4
|
+
getSleepManager,
|
|
5
|
+
getSleepManagerIfReady,
|
|
6
|
+
initSleepManager,
|
|
7
|
+
matchesGlob
|
|
8
|
+
} from "./chunk-VP5PFNZO.js";
|
|
9
|
+
import "./chunk-VSBMLB2W.js";
|
|
10
|
+
import "./chunk-X67BDDZR.js";
|
|
11
|
+
import "./chunk-Q7XQLKZB.js";
|
|
12
|
+
import "./chunk-7HN63Q7J.js";
|
|
13
|
+
import "./chunk-VAEZCIJC.js";
|
|
14
|
+
import "./chunk-UDZLPR34.js";
|
|
15
|
+
import "./chunk-CDKQJWGK.js";
|
|
16
|
+
import "./chunk-QT4D5XCI.js";
|
|
17
|
+
import "./chunk-HKP6OAJP.js";
|
|
18
|
+
import "./chunk-ICL6T4SN.js";
|
|
19
|
+
import "./chunk-LNNI3MS4.js";
|
|
20
|
+
import "./chunk-FXWBFDQR.js";
|
|
21
|
+
import "./chunk-5Y54AE3L.js";
|
|
22
|
+
import "./chunk-TPX6E6PL.js";
|
|
23
|
+
import "./chunk-UFTDRTCP.js";
|
|
24
|
+
import "./chunk-U54PJPTB.js";
|
|
25
|
+
import "./chunk-ICXY54ZC.js";
|
|
26
|
+
import "./chunk-DW4TRDOZ.js";
|
|
27
|
+
import "./chunk-WCFSBH33.js";
|
|
28
|
+
import "./chunk-M77B73VV.js";
|
|
29
|
+
import "./chunk-GLM7TVWP.js";
|
|
30
|
+
import "./chunk-EGV6R6UF.js";
|
|
31
|
+
import "./chunk-QUSMYGNQ.js";
|
|
32
|
+
import "./chunk-H6X6CKDN.js";
|
|
33
|
+
import "./chunk-2RNMBXD2.js";
|
|
34
|
+
import "./chunk-K3NQKI34.js";
|
|
35
|
+
export {
|
|
36
|
+
SleepManager,
|
|
37
|
+
getSleepManager,
|
|
38
|
+
getSleepManagerIfReady,
|
|
39
|
+
initSleepManager,
|
|
40
|
+
matchesGlob
|
|
41
|
+
};
|
|
@@ -1,30 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
+
_setSpiritCreationInProgressForTest,
|
|
3
4
|
ensureSpiritProject,
|
|
4
5
|
firstWeekSchedules,
|
|
5
6
|
getSpiritModel,
|
|
6
7
|
notifySpiritSystemChange,
|
|
7
8
|
seedSpiritSoulIfMissing,
|
|
9
|
+
spiritCreationInProgress,
|
|
8
10
|
spiritDir,
|
|
9
11
|
syncSpiritTemplate,
|
|
10
12
|
writeSpiritSystemJson
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-VSBMLB2W.js";
|
|
14
|
+
import "./chunk-X67BDDZR.js";
|
|
15
|
+
import "./chunk-QT4D5XCI.js";
|
|
14
16
|
import "./chunk-WCFSBH33.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-NJHN6IRB.js";
|
|
17
|
+
import "./chunk-M77B73VV.js";
|
|
18
|
+
import "./chunk-EGV6R6UF.js";
|
|
18
19
|
import "./chunk-QUSMYGNQ.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-H6X6CKDN.js";
|
|
21
|
+
import "./chunk-2RNMBXD2.js";
|
|
21
22
|
import "./chunk-K3NQKI34.js";
|
|
22
23
|
export {
|
|
24
|
+
_setSpiritCreationInProgressForTest,
|
|
23
25
|
ensureSpiritProject,
|
|
24
26
|
firstWeekSchedules,
|
|
25
27
|
getSpiritModel,
|
|
26
28
|
notifySpiritSystemChange,
|
|
27
29
|
seedSpiritSoulIfMissing,
|
|
30
|
+
spiritCreationInProgress,
|
|
28
31
|
spiritDir,
|
|
29
32
|
syncSpiritTemplate,
|
|
30
33
|
writeSpiritSystemJson
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SPIRIT_NOTICE_PREFIX,
|
|
4
|
+
_resetSpiritAvailabilityState,
|
|
5
|
+
classifySpiritState,
|
|
6
|
+
ensureSpiritAvailable,
|
|
7
|
+
spiritUnavailableNotice
|
|
8
|
+
} from "./chunk-DN3LKLYR.js";
|
|
9
|
+
import "./chunk-VP5PFNZO.js";
|
|
10
|
+
import "./chunk-VSBMLB2W.js";
|
|
11
|
+
import "./chunk-X67BDDZR.js";
|
|
12
|
+
import "./chunk-Q7XQLKZB.js";
|
|
13
|
+
import "./chunk-7HN63Q7J.js";
|
|
14
|
+
import "./chunk-VAEZCIJC.js";
|
|
15
|
+
import "./chunk-UDZLPR34.js";
|
|
16
|
+
import "./chunk-CDKQJWGK.js";
|
|
17
|
+
import "./chunk-QT4D5XCI.js";
|
|
18
|
+
import "./chunk-HKP6OAJP.js";
|
|
19
|
+
import "./chunk-ICL6T4SN.js";
|
|
20
|
+
import "./chunk-LNNI3MS4.js";
|
|
21
|
+
import "./chunk-FXWBFDQR.js";
|
|
22
|
+
import "./chunk-5Y54AE3L.js";
|
|
23
|
+
import "./chunk-TPX6E6PL.js";
|
|
24
|
+
import "./chunk-UFTDRTCP.js";
|
|
25
|
+
import "./chunk-U54PJPTB.js";
|
|
26
|
+
import "./chunk-ICXY54ZC.js";
|
|
27
|
+
import "./chunk-DW4TRDOZ.js";
|
|
28
|
+
import "./chunk-WCFSBH33.js";
|
|
29
|
+
import "./chunk-M77B73VV.js";
|
|
30
|
+
import "./chunk-GLM7TVWP.js";
|
|
31
|
+
import "./chunk-EGV6R6UF.js";
|
|
32
|
+
import "./chunk-QUSMYGNQ.js";
|
|
33
|
+
import "./chunk-H6X6CKDN.js";
|
|
34
|
+
import "./chunk-2RNMBXD2.js";
|
|
35
|
+
import "./chunk-K3NQKI34.js";
|
|
36
|
+
export {
|
|
37
|
+
SPIRIT_NOTICE_PREFIX,
|
|
38
|
+
_resetSpiritAvailabilityState,
|
|
39
|
+
classifySpiritState,
|
|
40
|
+
ensureSpiritAvailable,
|
|
41
|
+
spiritUnavailableNotice
|
|
42
|
+
};
|
|
@@ -27,7 +27,7 @@ var cmd = command({
|
|
|
27
27
|
const { soul, purpose, port, json } = flags;
|
|
28
28
|
const noStart = flags["no-start"];
|
|
29
29
|
if (!json) console.log("Creating variant via daemon...");
|
|
30
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
30
|
+
const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
|
|
31
31
|
const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
|
|
32
32
|
const client = getClient();
|
|
33
33
|
const res = await daemonFetch(
|
|
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
|
|
|
4
4
|
// packages/cli/src/commands/sprout.ts
|
|
5
5
|
async function run(args) {
|
|
6
6
|
console.error("Note: `volute mind sprout` is now `volute seed sprout`");
|
|
7
|
-
await import("./seed-sprout-
|
|
7
|
+
await import("./seed-sprout-PILHJ3YS.js").then((m) => m.run(args));
|
|
8
8
|
}
|
|
9
9
|
export {
|
|
10
10
|
run
|
|
@@ -368,7 +368,12 @@ function createCommands() {
|
|
|
368
368
|
type: "note_created",
|
|
369
369
|
mind: user.username,
|
|
370
370
|
summary: `${user.username} wrote "${title}"`,
|
|
371
|
-
metadata: {
|
|
371
|
+
metadata: {
|
|
372
|
+
author: user.username,
|
|
373
|
+
slug: note.slug,
|
|
374
|
+
url: `/minds/${note.author_username}/notes/${note.slug}`,
|
|
375
|
+
bodyHtml: content.slice(0, 500)
|
|
376
|
+
}
|
|
372
377
|
});
|
|
373
378
|
const announcement = replyTo ? `\u{1F4DD} ${user.username} replied to ${replyTo}: "${title}" \u2014 volute notes read ${ref}` : `\u{1F4DD} ${user.username} published a note: "${title}" \u2014 volute notes read ${ref}`;
|
|
374
379
|
await ctx.announceToSystem(announcement);
|
|
@@ -717,6 +722,7 @@ function createRoutes(ctx) {
|
|
|
717
722
|
metadata: {
|
|
718
723
|
author: actor.username,
|
|
719
724
|
slug: note.slug,
|
|
725
|
+
url: `/minds/${note.author_username}/notes/${note.slug}`,
|
|
720
726
|
bodyHtml: body.content.slice(0, 500)
|
|
721
727
|
}
|
|
722
728
|
});
|