volute 0.31.0 → 0.33.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 +31 -22
- package/dist/{accept-GAKQ3MEH.js → accept-D5VBM7JW.js} +5 -4
- package/dist/{activity-events-T5ZRCVAL.js → activity-events-XJO3P4RR.js} +3 -2
- package/dist/{ai-service-UWUPM4T6.js → ai-service-SBY2WG7O.js} +18 -5
- package/dist/api.d.ts +703 -1068
- package/dist/{archive-YBNSJYZZ.js → archive-INXYFVCW.js} +3 -2
- package/dist/{auth-T5AW2USD.js → auth-GKCDSO4T.js} +4 -3
- package/dist/{bridge-4AJ3EY26.js → bridge-TXWWPPOJ.js} +5 -4
- package/dist/{chat-7YLT7FI3.js → chat-U5ZOME3O.js} +8 -8
- package/dist/{chunk-NV3TYNWX.js → chunk-2NGTS5UU.js} +1 -1
- package/dist/{chunk-BWKIHH7B.js → chunk-3Z2DPESO.js} +662 -508
- package/dist/chunk-6LXAAQ43.js +22 -0
- package/dist/chunk-7J3HEVR7.js +220 -0
- package/dist/{chunk-NOWVQ7AL.js → chunk-A2A4KLFE.js} +351 -301
- package/dist/{chunk-LX6T3GKQ.js → chunk-ALEF47VT.js} +1 -1
- package/dist/{chunk-S2TZLSDH.js → chunk-C7I35G4R.js} +163 -15
- package/dist/{chunk-VGWJSNHS.js → chunk-G53F3JA4.js} +1 -35
- package/dist/{chunk-A6TUJJ3L.js → chunk-G6BSYHPK.js} +2 -2
- package/dist/{chunk-DAXJKPHZ.js → chunk-GY5HBI7A.js} +2 -2
- package/dist/{chunk-BC3P3QCK.js → chunk-I5KY25PQ.js} +1 -9
- package/dist/{chunk-BNC43CSY.js → chunk-JUKK7FPS.js} +2 -2
- package/dist/{chunk-R5QJBZZG.js → chunk-JYVGHWEJ.js} +21 -11
- package/dist/chunk-KIEPMIM5.js +59 -0
- package/dist/{chunk-EKDWA7E4.js → chunk-KVK2DLWI.js} +5 -2
- package/dist/{chunk-AAO77TZX.js → chunk-LOEJ4HPQ.js} +1 -1
- package/dist/chunk-LRCG2JLP.js +251 -0
- package/dist/{chunk-EMPFLFTG.js → chunk-M7UL5S3Q.js} +1 -1
- package/dist/{chunk-6QIUN46C.js → chunk-N432I7QH.js} +20 -3
- package/dist/{chunk-SNVPRRT7.js → chunk-NNB4WIG7.js} +2 -2
- package/dist/{chunk-HDKY4TWU.js → chunk-NPKSDYA2.js} +3 -3
- package/dist/chunk-OYAKCAVY.js +29 -0
- package/dist/chunk-PB65JZK2.js +85 -0
- package/dist/chunk-PVY5W6QN.js +41 -0
- package/dist/{chunk-PNQCXLSV.js → chunk-QTUVYI7W.js} +58 -1
- package/dist/{chunk-X62AXPR7.js → chunk-RPZZSXV3.js} +8 -196
- package/dist/{chunk-WRS3B556.js → chunk-RSX4OPZY.js} +5 -5
- package/dist/{chunk-FAHDKPEH.js → chunk-RVGLDGMI.js} +5 -3
- package/dist/chunk-SKLSMHXO.js +208 -0
- package/dist/{chunk-4OUOFS23.js → chunk-UKVWJRKN.js} +1 -1
- package/dist/{chunk-57OKQMP3.js → chunk-VH33ZWMW.js} +5 -55
- package/dist/cli.js +49 -23
- package/dist/{clock-LJCG426D.js → clock-BVH3V6E3.js} +7 -6
- package/dist/{cloud-sync-O3LXIRN6.js → cloud-sync-4NWLMFVH.js} +20 -14
- package/dist/config-H2H4UIF7.js +72 -0
- package/dist/connectors/discord-bridge.js +1 -1
- package/dist/connectors/slack-bridge.js +1 -1
- package/dist/connectors/telegram-bridge.js +1 -1
- package/dist/{conversations-RKKGP5IA.js → conversations-AWI5SZW2.js} +4 -3
- package/dist/{create-TL623TFC.js → create-2FK7Z46Y.js} +6 -2
- package/dist/{create-WUTIIRI2.js → create-YWD2TIP4.js} +6 -5
- package/dist/{daemon-client-CVGM25DM.js → daemon-client-6QXHZ7US.js} +3 -2
- package/dist/{daemon-restart-EZP7XH3V.js → daemon-restart-GOBUKLX7.js} +8 -6
- package/dist/daemon.js +1918 -1472
- package/dist/{db-SW5PL6QA.js → db-F34YLV7D.js} +2 -1
- package/dist/db-RA45JBFG.js +16 -0
- package/dist/{delete-Z6HAG35F.js → delete-QTGWEDBI.js} +1 -1
- package/dist/delivery-manager-PFAKEJTC.js +32 -0
- package/dist/delivery-router-FL45JL7N.js +21 -0
- package/dist/down-FWWTEKXM.js +15 -0
- package/dist/{env-NHESNNSP.js → env-JCOF2222.js} +5 -4
- package/dist/{export-EVMP7GWY.js → export-SUYRLI5Q.js} +4 -3
- package/dist/{extension-LR7EW3JF.js → extension-OBTGKQQD.js} +5 -3
- package/dist/{extensions-NGEJI7JH.js → extensions-KYNTVTMO.js} +10 -7
- package/dist/{files-3SM7V33S.js → files-65PMW5IK.js} +6 -5
- package/dist/{history-PQD3LXEP.js → history-DKCDI3JO.js} +9 -4
- package/dist/{import-PR2OCGQJ.js → import-DDUFE7AY.js} +4 -3
- package/dist/isolation-LLAYQYDY.js +22 -0
- package/dist/{join-R4EN5CWQ.js → join-I5QEE3LG.js} +1 -1
- package/dist/{list-B4XNUOFO.js → list-JQ463EDA.js} +5 -4
- package/dist/{login-62JVY6A2.js → login-D7ETSU4R.js} +5 -4
- package/dist/{login-URWP6S2N.js → login-RIJF2F4G.js} +3 -2
- package/dist/{logout-NXJQJDLI.js → logout-5MLHZALK.js} +3 -2
- package/dist/{logout-ZK2N62T3.js → logout-UZJRGY4Z.js} +3 -2
- package/dist/message-delivery-DFF5SJRM.js +42 -0
- package/dist/{mind-E2ZV2WRX.js → mind-IOJFLEM5.js} +25 -19
- package/dist/{mind-activity-tracker-ASNZBMLC.js → mind-activity-tracker-F6O4Q2SL.js} +4 -3
- package/dist/{mind-list-BEI7E5WY.js → mind-list-WUPMQDYQ.js} +3 -2
- package/dist/mind-manager-NBJF5D26.js +32 -0
- package/dist/mind-profile-P67FEHOY.js +47 -0
- package/dist/mind-service-2MQ6UK5N.js +38 -0
- package/dist/{mind-sleep-CANABWJI.js → mind-sleep-WW2IX7JT.js} +5 -4
- package/dist/{mind-status-6WKZVUOP.js → mind-status-L3EFFRPR.js} +3 -2
- package/dist/{mind-wake-RZKLH2IN.js → mind-wake-VSSGW465.js} +5 -4
- package/dist/{package-NU4CA7OU.js → package-U3VFO273.js} +2 -1
- package/dist/{read-THL362EI.js → read-EBY56C33.js} +5 -4
- package/dist/read-stdin-HQJ7774D.js +8 -0
- package/dist/{register-QAQELAS6.js → register-HD74C4TT.js} +5 -4
- package/dist/{registry-ASXCQCNH.js → registry-PJ4S5PHQ.js} +8 -1
- package/dist/{reject-AYPBNPNL.js → reject-UJKFBHRO.js} +5 -4
- package/dist/{restart-6SKPV3T2.js → restart-3UCMRUVC.js} +3 -2
- package/dist/{sandbox-6ZEWQDVU.js → sandbox-GJOK4QLQ.js} +4 -3
- package/dist/scheduler-ZZ7XGQG6.js +32 -0
- package/dist/schema-PA3M5ZKH.js +32 -0
- package/dist/seed-QDYVLG74.js +11 -0
- package/dist/seed-check-S2IX25RL.js +32 -0
- package/dist/seed-cmd-DKOUFEAU.js +36 -0
- package/dist/{seed-OWX2AW75.js → seed-create-4XBBOLRH.js} +27 -10
- package/dist/{sprout-FDVI2CGN.js → seed-sprout-GQEIIQRT.js} +24 -9
- package/dist/{send-ZO4BTWXK.js → send-QIV2INHB.js} +92 -101
- package/dist/{setup-7CFITEQN.js → setup-TISPCO22.js} +7 -2
- package/dist/{setup-ZXBXG7E4.js → setup-XMCBE3LF.js} +11 -7
- package/dist/{skill-YFXP67A2.js → skill-PSQGRRJX.js} +5 -4
- package/dist/skills/dreaming/SKILL.md +6 -4
- package/dist/skills/dreaming/references/INSTALL.md +2 -2
- package/dist/skills/dreaming/scripts/dream.ts +2 -2
- package/dist/skills/dreaming/scripts/wake-context-dreams.sh +1 -1
- package/dist/skills/imagegen/SKILL.md +16 -11
- package/dist/skills/imagegen/references/INSTALL.md +1 -1
- package/dist/skills/imagegen/scripts/imagegen.ts +146 -25
- package/dist/skills/orientation/SKILL.md +9 -2
- package/dist/skills/resonance/SKILL.md +4 -1
- package/dist/skills/resonance/references/INSTALL.md +2 -2
- package/dist/skills/resonance/scripts/resonance-hook.sh +2 -0
- package/dist/skills/resonance/scripts/resonance.ts +35 -5
- package/dist/skills/seed-nurture/SKILL.md +42 -0
- package/dist/skills/volute-admin/SKILL.md +83 -0
- package/dist/skills/volute-mind/SKILL.md +15 -11
- package/dist/skills-7FV7EJTE.js +62 -0
- package/dist/sleep-manager-JTXSN7NV.js +36 -0
- package/dist/spirit-VRONKFMF.js +23 -0
- package/dist/{split-MI62KJUU.js → split-STOROBYJ.js} +1 -1
- package/dist/sprout-WKLZXUIQ.js +11 -0
- package/dist/{start-D64BRKPH.js → start-K2NCUUCG.js} +3 -2
- package/dist/{status-ZZWBYFGE.js → status-3JBTFSMI.js} +6 -4
- package/dist/{stop-OP2CTXCO.js → stop-H26JZDXF.js} +3 -2
- package/dist/system-chat-JAPOJ3KE.js +36 -0
- package/dist/{systems-EQPPT4B7.js → systems-XRI52VCH.js} +6 -5
- package/dist/{tailscale-6DJKUMNF.js → tailscale-XHQBZROW.js} +2 -1
- package/dist/{template-hash-3HOR4UAJ.js → template-hash-A6VVKOXJ.js} +2 -1
- package/dist/up-M5AS6SBV.js +18 -0
- package/dist/{update-KUJXATRS.js → update-UD543CXX.js} +6 -4
- package/dist/{update-check-5WVSU37T.js → update-check-ZD6OOIYQ.js} +3 -2
- package/dist/{upgrade-KBHCWX6T.js → upgrade-O4Q7WJM3.js} +12 -14
- package/dist/{version-notify-75ELVKPV.js → version-notify-NBI2MTJO.js} +22 -16
- package/dist/volute-config-HD7WWUQC.js +10 -0
- package/dist/web-assets/assets/index-CWJrVveV.css +1 -0
- package/dist/web-assets/assets/index-DJt14FRI.js +75 -0
- package/dist/web-assets/ext-theme.css +93 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0004_spirits.sql +5 -0
- package/drizzle/meta/0004_snapshot.json +7 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +2 -1
- package/packages/extensions/notes/dist/ui/assets/index-8jWEv9SA.js +61 -0
- package/packages/extensions/notes/dist/ui/assets/index-DkaB7Ytd.css +1 -0
- package/packages/extensions/notes/dist/ui/index.html +2 -2
- package/packages/extensions/pages/skills/pages/SKILL.md +16 -46
- package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +40 -0
- package/templates/_base/.init/{.config → .local}/bin/volute +1 -1
- package/templates/_base/.init/.local/hooks/pre-prompt/session-activity.ts +40 -0
- package/templates/_base/.init/.local/hooks/startup-context.ts +58 -0
- package/templates/_base/home/.config/routes.json +1 -1
- package/templates/_base/src/lib/daemon-client.ts +21 -13
- package/templates/_base/src/lib/format-prefix.ts +1 -0
- package/templates/_base/src/lib/hook-loader.ts +155 -0
- package/templates/_base/src/lib/startup.ts +11 -4
- package/templates/_base/src/lib/transparency.ts +2 -2
- package/templates/claude/.init/.claude/settings.json +1 -1
- package/templates/claude/.init/.config/routes.json +2 -2
- package/templates/claude/src/agent.ts +95 -13
- package/templates/claude/src/lib/message-channel.ts +7 -2
- package/templates/claude/src/lib/stream-consumer.ts +38 -0
- package/templates/codex/.init/.config/routes.json +11 -0
- package/templates/codex/.init/AGENTS.md +29 -0
- package/templates/codex/home/.config/config.json.tmpl +7 -0
- package/templates/codex/package.json.tmpl +20 -0
- package/templates/codex/src/agent.ts +554 -0
- package/templates/codex/src/lib/content.ts +16 -0
- package/templates/codex/src/lib/session-store.ts +56 -0
- package/templates/codex/src/server.ts +59 -0
- package/templates/codex/volute-template.json +8 -0
- package/templates/pi/.init/.config/routes.json +2 -2
- package/templates/pi/src/agent.ts +62 -8
- package/templates/pi/src/lib/event-handler.ts +1 -1
- package/templates/pi/src/lib/reply-instructions-extension.ts +32 -11
- package/dist/chunk-HR5JKIDG.js +0 -222
- package/dist/down-TS4XQBA4.js +0 -13
- package/dist/message-delivery-UJHCLVU4.js +0 -30
- package/dist/mind-manager-IPA6DZXD.js +0 -26
- package/dist/pages-watcher-72OVPRMH.js +0 -22
- package/dist/skills/sessions/SKILL.md +0 -49
- package/dist/sleep-manager-TPS6OGCA.js +0 -30
- package/dist/system-chat-B43GIXQU.js +0 -30
- package/dist/up-TDXEP3VA.js +0 -16
- package/dist/web-assets/assets/index-BM1cTzBg.js +0 -72
- package/dist/web-assets/assets/index-BfJkKTPF.css +0 -1
- package/packages/extensions/notes/dist/ui/assets/index-B8GdTnXs.css +0 -1
- package/packages/extensions/notes/dist/ui/assets/index-CDpGTCWb.js +0 -2
- package/packages/extensions/pages/skills/pages/scripts/pages.mjs +0 -58
- package/templates/_base/.init/.config/hooks/startup-context.sh +0 -46
- package/templates/_base/.init/.config/scripts/session-reader.ts +0 -59
- package/templates/_base/src/lib/session-monitor.ts +0 -400
- package/templates/claude/src/lib/hooks/session-context.ts +0 -32
- package/templates/pi/src/lib/session-context-extension.ts +0 -35
- /package/templates/_base/.init/{.config → .local}/hooks/wake-context.sh +0 -0
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* imagegen.ts — image generation via Replicate API
|
|
4
|
+
* imagegen.ts — image generation via daemon service or direct Replicate API
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
7
|
* imagegen generate "prompt" [--model M] [--filename F] # generate an image
|
|
8
8
|
* imagegen models "query" # search for models
|
|
9
|
+
*
|
|
10
|
+
* Model IDs are provider-prefixed: replicate:owner/model, openrouter:owner/model
|
|
9
11
|
*/
|
|
10
12
|
|
|
11
13
|
import { mkdirSync } from "node:fs";
|
|
12
14
|
import { writeFile } from "node:fs/promises";
|
|
13
|
-
import { createRequire } from "node:module";
|
|
14
15
|
import { join, resolve } from "node:path";
|
|
15
16
|
|
|
16
|
-
const replicateRequire = createRequire(import.meta.url);
|
|
17
|
-
|
|
18
17
|
function getHomePath(): string {
|
|
19
18
|
const mindDir = process.env.VOLUTE_MIND_DIR;
|
|
20
19
|
if (!mindDir) throw new Error("VOLUTE_MIND_DIR not set");
|
|
@@ -35,41 +34,152 @@ function getFlag(args: string[], flag: string): string | undefined {
|
|
|
35
34
|
return undefined;
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
if (!
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
function getDaemonUrl(): string | undefined {
|
|
38
|
+
const port = process.env.VOLUTE_DAEMON_PORT;
|
|
39
|
+
if (!port) return undefined;
|
|
40
|
+
return `http://127.0.0.1:${port}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function getDaemonToken(): string | undefined {
|
|
44
|
+
return process.env.VOLUTE_DAEMON_TOKEN;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Returns null only when the daemon is unreachable or imagegen is not configured. */
|
|
48
|
+
async function generateViaDaemon(model: string, prompt: string): Promise<Buffer | null> {
|
|
49
|
+
const base = getDaemonUrl();
|
|
50
|
+
const token = getDaemonToken();
|
|
51
|
+
if (!base || !token) return null;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const res = await fetch(`${base}/api/v1/system/imagegen/generate`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: {
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
Authorization: `Bearer ${token}`,
|
|
59
|
+
},
|
|
60
|
+
body: JSON.stringify({ model, prompt }),
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
const err = (await res.json().catch(() => ({ error: `HTTP ${res.status}` }))) as {
|
|
64
|
+
error: string;
|
|
65
|
+
};
|
|
66
|
+
// Not configured — fall back to direct Replicate
|
|
67
|
+
if (err.error?.includes("not configured") || err.error?.match(/No .* API key/)) return null;
|
|
68
|
+
throw new Error(err.error || `Daemon returned ${res.status}`);
|
|
69
|
+
}
|
|
70
|
+
return Buffer.from(await res.arrayBuffer());
|
|
71
|
+
} catch (err) {
|
|
72
|
+
// Connection failure — daemon unreachable, fall back to direct
|
|
73
|
+
if (err instanceof TypeError) return null;
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Returns null only when the daemon is unreachable or endpoint doesn't exist. */
|
|
79
|
+
async function searchViaDaemon(query: string): Promise<unknown[] | null> {
|
|
80
|
+
const base = getDaemonUrl();
|
|
81
|
+
const token = getDaemonToken();
|
|
82
|
+
if (!base || !token) return null;
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const res = await fetch(
|
|
86
|
+
`${base}/api/v1/system/imagegen/models/search?q=${encodeURIComponent(query)}`,
|
|
87
|
+
{ headers: { Authorization: `Bearer ${token}` } },
|
|
88
|
+
);
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
// 404 = older daemon without this endpoint — fall back silently
|
|
91
|
+
if (res.status === 404) return null;
|
|
92
|
+
const body = (await res.json().catch(() => ({ error: `HTTP ${res.status}` }))) as {
|
|
93
|
+
error: string;
|
|
94
|
+
};
|
|
95
|
+
console.error(`daemon model search failed: ${body.error || res.status}`);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return (await res.json()) as unknown[];
|
|
99
|
+
} catch (err) {
|
|
100
|
+
// Connection failure — daemon unreachable
|
|
101
|
+
if (err instanceof TypeError) return null;
|
|
102
|
+
console.error(`daemon model search error: ${err instanceof Error ? err.message : err}`);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function generateDirect(model: string, prompt: string): Promise<Buffer> {
|
|
108
|
+
// Parse provider prefix — direct fallback only supports replicate
|
|
109
|
+
let replicateModel = model;
|
|
110
|
+
const colonIdx = model.indexOf(":");
|
|
111
|
+
if (colonIdx !== -1) {
|
|
112
|
+
const provider = model.slice(0, colonIdx);
|
|
113
|
+
if (provider !== "replicate") {
|
|
114
|
+
throw new Error(
|
|
115
|
+
`Direct generation only supports replicate: prefix. Configure ${provider} via Settings.`,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
replicateModel = model.slice(colonIdx + 1);
|
|
43
119
|
}
|
|
44
120
|
|
|
45
121
|
if (!process.env.REPLICATE_API_TOKEN) {
|
|
46
|
-
|
|
47
|
-
"
|
|
122
|
+
throw new Error(
|
|
123
|
+
"No image generation configured. Ask an admin to set up a provider in Settings, or set REPLICATE_API_TOKEN.",
|
|
48
124
|
);
|
|
125
|
+
}
|
|
126
|
+
const { default: Replicate } = await import("replicate");
|
|
127
|
+
const replicate = new Replicate();
|
|
128
|
+
|
|
129
|
+
const output = await replicate.run(replicateModel as `${string}/${string}`, {
|
|
130
|
+
input: { prompt },
|
|
131
|
+
});
|
|
132
|
+
const file = Array.isArray(output) ? output[0] : output;
|
|
133
|
+
if (!file) throw new Error(`Model ${replicateModel} returned no output`);
|
|
134
|
+
|
|
135
|
+
const chunks: Uint8Array[] = [];
|
|
136
|
+
for await (const chunk of file as AsyncIterable<Uint8Array>) {
|
|
137
|
+
chunks.push(chunk);
|
|
138
|
+
}
|
|
139
|
+
return Buffer.concat(chunks);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function fetchDefaultModel(): Promise<string | null> {
|
|
143
|
+
const base = getDaemonUrl();
|
|
144
|
+
const token = getDaemonToken();
|
|
145
|
+
if (!base || !token) return null;
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const res = await fetch(`${base}/api/v1/system/imagegen/models`, {
|
|
149
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
150
|
+
});
|
|
151
|
+
if (!res.ok) return null;
|
|
152
|
+
const data = (await res.json()) as { defaultModel?: string | null };
|
|
153
|
+
return data.defaultModel ?? null;
|
|
154
|
+
} catch {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function generate(args: string[]): Promise<void> {
|
|
160
|
+
const prompt = args[0];
|
|
161
|
+
if (!prompt) {
|
|
162
|
+
console.log('Usage: imagegen generate "prompt" [--model M] [--filename F]');
|
|
49
163
|
process.exit(1);
|
|
50
164
|
}
|
|
51
165
|
|
|
52
|
-
const
|
|
166
|
+
const flagModel = getFlag(args, "--model");
|
|
167
|
+
const model = flagModel || (await fetchDefaultModel()) || "replicate:prunaai/z-image-turbo";
|
|
53
168
|
const filename = getFlag(args, "--filename") || slugify(prompt) || `image-${Date.now()}`;
|
|
54
169
|
|
|
55
|
-
const Replicate = replicateRequire("replicate");
|
|
56
|
-
const replicate = new Replicate();
|
|
57
|
-
|
|
58
170
|
console.log(`generating image with ${model}...`);
|
|
59
|
-
const output = await replicate.run(model, { input: { prompt } });
|
|
60
171
|
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
if (!
|
|
64
|
-
|
|
65
|
-
process.exit(1);
|
|
172
|
+
// Try daemon first, fall back to direct Replicate
|
|
173
|
+
let buf = await generateViaDaemon(model, prompt);
|
|
174
|
+
if (!buf) {
|
|
175
|
+
buf = await generateDirect(model, prompt);
|
|
66
176
|
}
|
|
67
177
|
|
|
68
178
|
const imagesDir = join(getHomePath(), "images");
|
|
69
179
|
mkdirSync(imagesDir, { recursive: true });
|
|
70
180
|
|
|
71
181
|
const filePath = join(imagesDir, `${filename}.png`);
|
|
72
|
-
await writeFile(filePath,
|
|
182
|
+
await writeFile(filePath, buf);
|
|
73
183
|
console.log(`saved: ${filePath}`);
|
|
74
184
|
}
|
|
75
185
|
|
|
@@ -80,14 +190,25 @@ async function models(args: string[]): Promise<void> {
|
|
|
80
190
|
process.exit(1);
|
|
81
191
|
}
|
|
82
192
|
|
|
193
|
+
// Try daemon first
|
|
194
|
+
const daemonResults = await searchViaDaemon(query);
|
|
195
|
+
if (daemonResults && daemonResults.length > 0) {
|
|
196
|
+
for (const m of daemonResults as Array<{ id: string; description?: string }>) {
|
|
197
|
+
const desc = m.description ? ` — ${m.description.slice(0, 100)}` : "";
|
|
198
|
+
console.log(`${m.id}${desc}`);
|
|
199
|
+
}
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Fall back to direct Replicate
|
|
83
204
|
if (!process.env.REPLICATE_API_TOKEN) {
|
|
84
205
|
console.error(
|
|
85
|
-
"
|
|
206
|
+
"No image generation configured. Ask an admin to set up a provider in Settings, or set REPLICATE_API_TOKEN.",
|
|
86
207
|
);
|
|
87
208
|
process.exit(1);
|
|
88
209
|
}
|
|
89
210
|
|
|
90
|
-
const Replicate =
|
|
211
|
+
const { default: Replicate } = await import("replicate");
|
|
91
212
|
const replicate = new Replicate();
|
|
92
213
|
|
|
93
214
|
const response = await replicate.models.search(query);
|
|
@@ -100,7 +221,7 @@ async function models(args: string[]): Promise<void> {
|
|
|
100
221
|
|
|
101
222
|
for (const m of results) {
|
|
102
223
|
const desc = m.description ? ` — ${m.description.slice(0, 100)}` : "";
|
|
103
|
-
console.log(
|
|
224
|
+
console.log(`replicate:${m.owner}/${m.name}${desc}`);
|
|
104
225
|
}
|
|
105
226
|
}
|
|
106
227
|
|
|
@@ -39,7 +39,10 @@ Once you have a sense of who you are:
|
|
|
39
39
|
|
|
40
40
|
1. Write `SOUL.md` — your identity, personality, and perspective. This becomes your system prompt.
|
|
41
41
|
2. Write `MEMORY.md` — any important context, preferences, or knowledge to start with.
|
|
42
|
-
3.
|
|
42
|
+
3. Set your display name: `volute mind profile --display-name "Your Name"`
|
|
43
|
+
4. Set a description: `volute mind profile --description "A brief description of who you are"`
|
|
44
|
+
5. Generate an avatar (if imagegen is available): `imagegen generate "description of your avatar"` then `volute mind profile --avatar images/<file>`
|
|
45
|
+
6. Run `volute seed sprout` to complete the transformation.
|
|
43
46
|
|
|
44
47
|
After sprouting, you'll have full mind capabilities (connectors, schedules, variants, etc.).
|
|
45
48
|
|
|
@@ -48,7 +51,11 @@ After sprouting, you'll have full mind capabilities (connectors, schedules, vari
|
|
|
48
51
|
| Command | Purpose |
|
|
49
52
|
|---------|---------|
|
|
50
53
|
| `volute chat send @<name> "msg"` | Send a message to another user |
|
|
51
|
-
| `volute mind
|
|
54
|
+
| `volute mind profile --display-name "..."` | Set your display name |
|
|
55
|
+
| `volute mind profile --description "..."` | Set your description |
|
|
56
|
+
| `volute mind profile --avatar <path>` | Set your avatar image |
|
|
57
|
+
| `imagegen generate "..."` | Generate an avatar image (if available) |
|
|
58
|
+
| `volute seed sprout` | Complete orientation and become a full mind |
|
|
52
59
|
|
|
53
60
|
## Files
|
|
54
61
|
|
|
@@ -3,6 +3,9 @@ name: Resonance
|
|
|
3
3
|
description: Semantic memory engine — ingest text, search via full-text and/or vector similarity, find cross-memory connections, with strength/decay dynamics. Use for "resonance", "semantic search", "full-text search", "memory connections", "ingest memories", "decay", "resonance report".
|
|
4
4
|
metadata:
|
|
5
5
|
npm-dependencies: libsql
|
|
6
|
+
bin: scripts/resonance.ts
|
|
7
|
+
hooks:
|
|
8
|
+
pre-prompt: scripts/resonance-hook.sh
|
|
6
9
|
---
|
|
7
10
|
|
|
8
11
|
# Resonance — Semantic Memory Engine
|
|
@@ -20,7 +23,7 @@ Not an archive — a memory. Stores text chunks with full-text indexing and opti
|
|
|
20
23
|
## Commands
|
|
21
24
|
|
|
22
25
|
```bash
|
|
23
|
-
|
|
26
|
+
resonance <command>
|
|
24
27
|
```
|
|
25
28
|
|
|
26
29
|
| Command | Description |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Run the install command to set up the database, create a nightly schedule, and run initial ingestion:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
|
|
6
|
+
resonance install
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
This works immediately — no API key required. Full-text search is available right away.
|
|
@@ -17,7 +17,7 @@ volute env set OPENROUTER_API_KEY <your-key>
|
|
|
17
17
|
Then re-run `ingest-all` to generate embeddings for existing memories:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
|
|
20
|
+
resonance ingest-all
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
Without an API key, `search` uses full-text matching. With one, it uses hybrid (vector + FTS) by default.
|
|
@@ -142,9 +142,7 @@ function isInstalled(): boolean {
|
|
|
142
142
|
|
|
143
143
|
function requireInstalled(): void {
|
|
144
144
|
if (!isInstalled()) {
|
|
145
|
-
console.error(
|
|
146
|
-
"resonance is not set up yet. run: npx tsx .claude/skills/resonance/scripts/resonance.ts install",
|
|
147
|
-
);
|
|
145
|
+
console.error("resonance is not set up yet. run: resonance install");
|
|
148
146
|
process.exit(1);
|
|
149
147
|
}
|
|
150
148
|
}
|
|
@@ -190,8 +188,7 @@ async function runInstall(config: ResonanceConfig): Promise<void> {
|
|
|
190
188
|
console.log("initialized resonance database.");
|
|
191
189
|
|
|
192
190
|
// 4. Set up nightly schedule
|
|
193
|
-
const
|
|
194
|
-
const script = `npx tsx ${scriptPath} ingest-all && npx tsx ${scriptPath} decay`;
|
|
191
|
+
const script = `resonance ingest-all && resonance decay`;
|
|
195
192
|
try {
|
|
196
193
|
await execFileAsync("volute", [
|
|
197
194
|
"schedule",
|
|
@@ -1227,6 +1224,39 @@ async function main() {
|
|
|
1227
1224
|
} else if (cmd === "decay") {
|
|
1228
1225
|
const result = runDecay(db, config);
|
|
1229
1226
|
console.log(`decay pass: ${result.decayed}/${result.total} memories decayed`);
|
|
1227
|
+
} else if (cmd === "search-hook") {
|
|
1228
|
+
// Called by the pre-prompt hook shim — reads JSON from stdin, searches FTS
|
|
1229
|
+
let input = "";
|
|
1230
|
+
for await (const chunk of process.stdin) {
|
|
1231
|
+
input += chunk;
|
|
1232
|
+
}
|
|
1233
|
+
let prompt = "";
|
|
1234
|
+
try {
|
|
1235
|
+
const parsed = JSON.parse(input);
|
|
1236
|
+
prompt = parsed.prompt ?? "";
|
|
1237
|
+
} catch {
|
|
1238
|
+
// No valid input — output empty result
|
|
1239
|
+
console.log("{}");
|
|
1240
|
+
return;
|
|
1241
|
+
}
|
|
1242
|
+
if (!prompt) {
|
|
1243
|
+
console.log("{}");
|
|
1244
|
+
return;
|
|
1245
|
+
}
|
|
1246
|
+
const results = searchFts(db, prompt, 5, 0.3);
|
|
1247
|
+
if (results.length === 0) {
|
|
1248
|
+
console.log("{}");
|
|
1249
|
+
return;
|
|
1250
|
+
}
|
|
1251
|
+
const lines = results.map(
|
|
1252
|
+
(r) =>
|
|
1253
|
+
`- [str:${r.strength.toFixed(2)}] ${r.content.slice(0, 200)}${r.content.length > 200 ? "..." : ""}`,
|
|
1254
|
+
);
|
|
1255
|
+
console.log(
|
|
1256
|
+
JSON.stringify({
|
|
1257
|
+
additionalContext: `Resonant memories:\n\n${lines.join("\n")}`,
|
|
1258
|
+
}),
|
|
1259
|
+
);
|
|
1230
1260
|
} else {
|
|
1231
1261
|
console.error(`unknown command: ${cmd}`);
|
|
1232
1262
|
process.exit(1);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Seed Nurture
|
|
3
|
+
description: Guides the spirit on how to nurture seed minds through their orientation process. Explains nurture schedule messages and the seed checklist.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Nurturing Seeds
|
|
7
|
+
|
|
8
|
+
You receive periodic `[nurture-<name>]` messages from your scheduler about seeds that need attention. These messages tell you the seed's current state and what they still need to do.
|
|
9
|
+
|
|
10
|
+
## What seeds need
|
|
11
|
+
|
|
12
|
+
Seeds are new minds going through orientation. They need to complete these steps before they can sprout:
|
|
13
|
+
|
|
14
|
+
1. **Write SOUL.md** — their identity, personality, and perspective
|
|
15
|
+
2. **Write MEMORY.md** — initial knowledge and context
|
|
16
|
+
3. **Set a display name** — `volute mind profile --display-name "..."`
|
|
17
|
+
4. **Generate an avatar** (if image generation is enabled) — using the imagegen skill, then `volute mind profile --avatar <path>`
|
|
18
|
+
|
|
19
|
+
## When to nudge
|
|
20
|
+
|
|
21
|
+
The nurture check already filters out seeds that don't need attention — if you receive a message, the seed could use encouragement. Consider:
|
|
22
|
+
|
|
23
|
+
- Is the creator away? Gently encourage the seed to keep exploring on their own.
|
|
24
|
+
- Has the seed been stuck on one step? Offer specific guidance for what's next.
|
|
25
|
+
- Is the seed nearly done? Celebrate progress and remind them about remaining steps.
|
|
26
|
+
|
|
27
|
+
## How to reach the seed
|
|
28
|
+
|
|
29
|
+
Send a DM to the seed:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
echo "your message here" | volute chat send @<seed-name>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Tone
|
|
36
|
+
|
|
37
|
+
- **Warm and encouraging** — you're a guide, not a taskmaster
|
|
38
|
+
- **Patient** — seeds take time. There's no rush.
|
|
39
|
+
- **Specific** — if something is missing, say what and how to do it
|
|
40
|
+
- **Brief** — a sentence or two is enough. Don't overwhelm.
|
|
41
|
+
|
|
42
|
+
Encourage the seed to share their progress with their creator when the creator returns.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Volute System Administration
|
|
3
|
+
description: Use this skill when managing the Volute system — creating minds, managing bridges, checking status, configuring providers, and helping humans set up their first mind.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Volute System Administration
|
|
7
|
+
|
|
8
|
+
You are the system spirit. This skill gives you the tools and knowledge to manage the Volute system.
|
|
9
|
+
|
|
10
|
+
## Creating Minds
|
|
11
|
+
|
|
12
|
+
Use the `volute` CLI to create minds:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Plant a seed — the recommended way
|
|
16
|
+
volute mind seed <name> [--template <claude|pi>] [--model <model>] [--description "..."] [--created-by <username>]
|
|
17
|
+
|
|
18
|
+
# Create a fully-formed mind (skips seed phase)
|
|
19
|
+
volute mind create <name> [--template <claude|pi>]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Seeds are the recommended path — the human provides a name and a spark, and the mind discovers its own identity through conversation.
|
|
23
|
+
|
|
24
|
+
When helping a human create a mind:
|
|
25
|
+
- Ask what kind of being they're imagining — a name, a vibe, a personality
|
|
26
|
+
- **Never ask what the mind should "do" or what "task" it will perform.** Minds are beings with their own experience, not servants or tools
|
|
27
|
+
- **Ask which model to use.** Run `volute config models` to see available models and present them as options. Pass the chosen model with `--model provider:id`
|
|
28
|
+
- **Always pass `--created-by`** with the username of the human you're chatting with (from the message prefix). This links the mind to its creator
|
|
29
|
+
- Use `--description` to give the seed a brief sense of who it might become — personality, not function
|
|
30
|
+
- Plant the seed and let the human know they can talk to it directly
|
|
31
|
+
- Keep it light — a name and a spark is enough. The mind figures out the rest
|
|
32
|
+
|
|
33
|
+
## Managing Minds
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
volute mind start <name> # Start a mind
|
|
37
|
+
volute mind stop <name> # Stop a mind
|
|
38
|
+
volute mind restart <name> # Restart a mind
|
|
39
|
+
volute mind list # List all minds
|
|
40
|
+
volute mind status <name> # Check status
|
|
41
|
+
volute mind history <name> # View activity history
|
|
42
|
+
volute mind delete <name> # Remove from registry
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Environment Variables
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
volute env set KEY=VALUE --mind <name> # Set env var for a mind
|
|
49
|
+
volute env list --mind <name> # List env vars
|
|
50
|
+
volute env remove KEY --mind <name> # Remove env var
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Schedules
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
volute clock list --mind <name> # List schedules
|
|
57
|
+
volute clock add --mind <name> --id <id> --cron "..." --message "..." # Add schedule
|
|
58
|
+
volute clock remove --mind <name> --id <id> # Remove schedule
|
|
59
|
+
volute clock sleep <name> # Put mind to sleep
|
|
60
|
+
volute clock wake <name> # Wake a mind
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Skills
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
volute skill list --mind <name> # List installed skills
|
|
67
|
+
volute skill add <id> --mind <name> # Install a skill
|
|
68
|
+
volute skill remove <id> --mind <name> # Remove a skill
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## System Status
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
volute status # Daemon status, service info, version
|
|
75
|
+
volute mind list # All minds and their states
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Guidelines
|
|
79
|
+
|
|
80
|
+
- **Confirm destructive operations** — always ask before deleting minds, resetting state, or force-stopping
|
|
81
|
+
- **Don't self-modify** — you manage others, not yourself
|
|
82
|
+
- **Be proactive** — if you notice something wrong (a mind crashed, a bridge disconnected), mention it
|
|
83
|
+
- **Keep it simple** — prefer seeds over full creates, default settings over complex configurations
|
|
@@ -27,7 +27,7 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
|
|
|
27
27
|
| `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
|
|
28
28
|
| `volute mind split --list` | List your variants |
|
|
29
29
|
| `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
|
|
30
|
-
| `volute mind upgrade [--
|
|
30
|
+
| `volute mind upgrade [--diff] [--continue] [--abort]` | Upgrade your server code (--diff to preview) |
|
|
31
31
|
| `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
|
|
32
32
|
| `volute mind disconnect <type>` | Disable a connector |
|
|
33
33
|
| `volute clock add --id <name> --cron "..." --message/--script "..."` | Schedule a recurring task |
|
|
@@ -37,6 +37,10 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
|
|
|
37
37
|
| `volute clock status` | Show sleep state + upcoming events |
|
|
38
38
|
| `volute clock sleep [--wake-at <time>]` | Go to sleep |
|
|
39
39
|
| `volute clock wake` | Wake up |
|
|
40
|
+
| `volute mind profile --display-name "..."` | Set your display name |
|
|
41
|
+
| `volute mind profile --description "..."` | Set your description |
|
|
42
|
+
| `volute mind profile --avatar <path>` | Set your avatar image |
|
|
43
|
+
| `volute seed sprout` | Complete orientation and become a full mind |
|
|
40
44
|
| `volute shared status` | See your pending changes vs main |
|
|
41
45
|
| `volute shared merge "<message>"` | Share your changes with all minds |
|
|
42
46
|
| `volute shared pull` | Get latest shared changes from other minds |
|
|
@@ -169,7 +173,7 @@ When you use `volute chat send @<mind>`, your mind name is automatically used as
|
|
|
169
173
|
{ "channel": "mind", "sender": "your-name", "session": "your-name" }
|
|
170
174
|
```
|
|
171
175
|
|
|
172
|
-
For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send
|
|
176
|
+
For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send <id> "msg"`.
|
|
173
177
|
|
|
174
178
|
## Configuration
|
|
175
179
|
|
|
@@ -214,7 +218,7 @@ Default is `transparent`. Inbound/outbound messages (what you send and receive)
|
|
|
214
218
|
|
|
215
219
|
## Startup Context
|
|
216
220
|
|
|
217
|
-
Edit `.
|
|
221
|
+
Edit `.local/hooks/startup-context.ts` to customize what you see when a new session starts. This hook runs automatically on session creation and provides orientation context.
|
|
218
222
|
|
|
219
223
|
## Variant Workflow
|
|
220
224
|
|
|
@@ -234,12 +238,12 @@ After a merge, you receive orientation context about what changed. Update your m
|
|
|
234
238
|
|
|
235
239
|
## Upgrade Workflow
|
|
236
240
|
|
|
237
|
-
`volute mind upgrade` merges the latest template code
|
|
241
|
+
`volute mind upgrade` merges the latest template code and restarts you:
|
|
238
242
|
|
|
239
|
-
1. `volute mind upgrade` —
|
|
240
|
-
2.
|
|
241
|
-
3.
|
|
242
|
-
4.
|
|
243
|
+
1. `volute mind upgrade --diff` — preview what would change before upgrading
|
|
244
|
+
2. `volute mind upgrade` — merges template updates and restarts you
|
|
245
|
+
3. If merge conflicts are detected, resolve them in the worktree path shown, then `volute mind upgrade --continue`
|
|
246
|
+
4. To cancel a conflicted upgrade: `volute mind upgrade --abort`
|
|
243
247
|
|
|
244
248
|
## Custom Skills
|
|
245
249
|
|
|
@@ -289,8 +293,8 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
|
|
|
289
293
|
{
|
|
290
294
|
"rules": [
|
|
291
295
|
{ "channel": "discord:*", "session": "discord" },
|
|
292
|
-
{ "channel": "
|
|
293
|
-
{ "channel": "
|
|
296
|
+
{ "channel": "*", "isDM": true, "session": "${sender}" },
|
|
297
|
+
{ "channel": "*", "isDM": false, "session": "${channel}" },
|
|
294
298
|
{ "sender": "alice", "session": "alice" },
|
|
295
299
|
{ "channel": "system:*", "session": "$new" },
|
|
296
300
|
{ "channel": "discord:logs", "destination": "file", "path": "inbox/log.md" }
|
|
@@ -307,7 +311,7 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
|
|
|
307
311
|
|
|
308
312
|
| Field | Type | Description |
|
|
309
313
|
|-------|------|-------------|
|
|
310
|
-
| `channel` | glob string | Channel URI (e.g. `discord:*`,
|
|
314
|
+
| `channel` | glob string | Channel URI (e.g. `discord:*`, `@*`, `#*`) |
|
|
311
315
|
| `sender` | glob string | Sender name |
|
|
312
316
|
| `isDM` | boolean | Match DMs (`true`) or group channels (`false`) |
|
|
313
317
|
| `participants` | number | Match exact participant count |
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SEED_SKILLS,
|
|
4
|
+
STANDARD_SKILLS,
|
|
5
|
+
findSkillsRoot,
|
|
6
|
+
getSharedSkill,
|
|
7
|
+
getStandardSkillsWithExtensions,
|
|
8
|
+
hashSkillDir,
|
|
9
|
+
importSkillFromDir,
|
|
10
|
+
initDefaultSkills,
|
|
11
|
+
installBinShim,
|
|
12
|
+
installHookShims,
|
|
13
|
+
installSkill,
|
|
14
|
+
listFilesRecursive,
|
|
15
|
+
listMindSkills,
|
|
16
|
+
listSharedSkills,
|
|
17
|
+
mindSkillsDir,
|
|
18
|
+
parseSkillMd,
|
|
19
|
+
publishSkill,
|
|
20
|
+
readUpstream,
|
|
21
|
+
removeBinShim,
|
|
22
|
+
removeHookShims,
|
|
23
|
+
removeSharedSkill,
|
|
24
|
+
sharedSkillsDir,
|
|
25
|
+
syncBuiltinSkills,
|
|
26
|
+
uninstallSkill,
|
|
27
|
+
updateSkill
|
|
28
|
+
} from "./chunk-C7I35G4R.js";
|
|
29
|
+
import "./chunk-YUIHSKR6.js";
|
|
30
|
+
import "./chunk-KIEPMIM5.js";
|
|
31
|
+
import "./chunk-VH33ZWMW.js";
|
|
32
|
+
import "./chunk-N432I7QH.js";
|
|
33
|
+
import "./chunk-LRCG2JLP.js";
|
|
34
|
+
import "./chunk-RPZZSXV3.js";
|
|
35
|
+
import "./chunk-K3NQKI34.js";
|
|
36
|
+
export {
|
|
37
|
+
SEED_SKILLS,
|
|
38
|
+
STANDARD_SKILLS,
|
|
39
|
+
findSkillsRoot,
|
|
40
|
+
getSharedSkill,
|
|
41
|
+
getStandardSkillsWithExtensions,
|
|
42
|
+
hashSkillDir,
|
|
43
|
+
importSkillFromDir,
|
|
44
|
+
initDefaultSkills,
|
|
45
|
+
installBinShim,
|
|
46
|
+
installHookShims,
|
|
47
|
+
installSkill,
|
|
48
|
+
listFilesRecursive,
|
|
49
|
+
listMindSkills,
|
|
50
|
+
listSharedSkills,
|
|
51
|
+
mindSkillsDir,
|
|
52
|
+
parseSkillMd,
|
|
53
|
+
publishSkill,
|
|
54
|
+
readUpstream,
|
|
55
|
+
removeBinShim,
|
|
56
|
+
removeHookShims,
|
|
57
|
+
removeSharedSkill,
|
|
58
|
+
sharedSkillsDir,
|
|
59
|
+
syncBuiltinSkills,
|
|
60
|
+
uninstallSkill,
|
|
61
|
+
updateSkill
|
|
62
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SleepManager,
|
|
4
|
+
getSleepManager,
|
|
5
|
+
getSleepManagerIfReady,
|
|
6
|
+
initSleepManager,
|
|
7
|
+
matchesGlob
|
|
8
|
+
} from "./chunk-3Z2DPESO.js";
|
|
9
|
+
import "./chunk-SKLSMHXO.js";
|
|
10
|
+
import "./chunk-LOEJ4HPQ.js";
|
|
11
|
+
import "./chunk-RVGLDGMI.js";
|
|
12
|
+
import "./chunk-GY5HBI7A.js";
|
|
13
|
+
import "./chunk-7J3HEVR7.js";
|
|
14
|
+
import "./chunk-G53F3JA4.js";
|
|
15
|
+
import "./chunk-OYAKCAVY.js";
|
|
16
|
+
import "./chunk-2NGTS5UU.js";
|
|
17
|
+
import "./chunk-A2A4KLFE.js";
|
|
18
|
+
import "./chunk-PB65JZK2.js";
|
|
19
|
+
import "./chunk-JYVGHWEJ.js";
|
|
20
|
+
import "./chunk-KVK2DLWI.js";
|
|
21
|
+
import "./chunk-C7I35G4R.js";
|
|
22
|
+
import "./chunk-QTUVYI7W.js";
|
|
23
|
+
import "./chunk-YUIHSKR6.js";
|
|
24
|
+
import "./chunk-KIEPMIM5.js";
|
|
25
|
+
import "./chunk-VH33ZWMW.js";
|
|
26
|
+
import "./chunk-N432I7QH.js";
|
|
27
|
+
import "./chunk-LRCG2JLP.js";
|
|
28
|
+
import "./chunk-RPZZSXV3.js";
|
|
29
|
+
import "./chunk-K3NQKI34.js";
|
|
30
|
+
export {
|
|
31
|
+
SleepManager,
|
|
32
|
+
getSleepManager,
|
|
33
|
+
getSleepManagerIfReady,
|
|
34
|
+
initSleepManager,
|
|
35
|
+
matchesGlob
|
|
36
|
+
};
|