volute 0.43.1 → 0.45.1
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/{activity-events-UISXY4Y5.js → activity-events-OMCSM7XW.js} +3 -3
- package/dist/{ai-service-FBCCEYF5.js → ai-service-534WUSDL.js} +4 -4
- package/dist/{archive-I32WHCJB.js → archive-6R4TZMYI.js} +3 -3
- package/dist/{auth-3RIG6GKN.js → auth-FRZJVQCS.js} +4 -4
- package/dist/avatar-image-BNWEXSA2.js +16 -0
- package/dist/backup-OZXHL3JS.js +381 -0
- package/dist/{chat-SDSX5TVV.js → chat-I4EDDIQC.js} +2 -2
- package/dist/{chunk-AD46AYZQ.js → chunk-2BONPXAF.js} +1 -1
- package/dist/{chunk-ONM2AZFL.js → chunk-322KE457.js} +14 -2
- package/dist/{chunk-PGPLCJPK.js → chunk-3ERIL673.js} +1 -1
- package/dist/{chunk-QQ2MVQU3.js → chunk-5AUKCNPE.js} +10 -10
- package/dist/{chunk-XDTKJNW5.js → chunk-5GT7URXJ.js} +1 -1
- package/dist/{chunk-DMUPZQWP.js → chunk-77BVGCTZ.js} +8 -8
- package/dist/{chunk-EFL5UOY4.js → chunk-CYI534DJ.js} +3 -3
- package/dist/{chunk-57LBQ7JX.js → chunk-FHWUQZXE.js} +1 -1
- package/dist/{chunk-YAMO2U3N.js → chunk-H7IYFRAL.js} +1 -1
- package/dist/{chunk-M3PGGSBH.js → chunk-HVU45COX.js} +1 -1
- package/dist/{chunk-O3DXAR44.js → chunk-IEWZ7VD7.js} +2 -2
- package/dist/{chunk-DE4EKQFH.js → chunk-IUXTYXFI.js} +3 -3
- package/dist/{chunk-K4EHBHPE.js → chunk-JSRMEY52.js} +7 -5
- package/dist/{chunk-QHG4OMZL.js → chunk-KDLYIECM.js} +37 -32
- package/dist/{chunk-EE7SZJON.js → chunk-KP3KWNG6.js} +2 -2
- package/dist/chunk-KVKP6VQ5.js +318 -0
- package/dist/{chunk-JVK6QQIC.js → chunk-LAXUUY7O.js} +2 -2
- package/dist/{chunk-C6ESRQZ7.js → chunk-OXXTPILE.js} +1 -1
- package/dist/{chunk-ATEX3ZPG.js → chunk-Q2XBKQ2D.js} +2 -2
- package/dist/{chunk-GZJFC76M.js → chunk-QMJJWTNL.js} +1 -1
- package/dist/chunk-SQL7M4HJ.js +120 -0
- package/dist/{chunk-YSV3VJQK.js → chunk-TSK5PI4L.js} +1 -1
- package/dist/{chunk-4SVONUTC.js → chunk-U4FNXDEJ.js} +350 -207
- package/dist/{chunk-2HIVYZDB.js → chunk-UMI4UIJG.js} +1 -1
- package/dist/{chunk-Y6O35D7K.js → chunk-V4GYPD5L.js} +41 -16
- package/dist/{chunk-KINGVQSR.js → chunk-Y6OPHHGM.js} +5 -5
- package/dist/{chunk-SPLPKBES.js → chunk-ZIR7HSAX.js} +6 -9
- package/dist/{chunk-7G2EEYXX.js → chunk-ZMIMSIIT.js} +2 -2
- package/dist/{chunk-L3IV23ZG.js → chunk-ZV7MFISX.js} +2 -0
- package/dist/cli.js +53 -22
- package/dist/{cloud-sync-KOEBUFW5.js → cloud-sync-Y7LQPRE3.js} +16 -16
- package/dist/{conversations-67WWW25C.js → conversations-G4LYMHAA.js} +4 -4
- package/dist/{create-7W3LV3J7.js → create-2YY7IPMS.js} +1 -1
- package/dist/{daemon-restart-EZXB73W7.js → daemon-restart-ABP54YN6.js} +7 -7
- package/dist/daemon.js +679 -478
- package/dist/{db-CZV62BOQ.js → db-JFLCJCUG.js} +2 -2
- package/dist/{db-IJL6B26S.js → db-LZTLA7XC.js} +1 -1
- package/dist/delivery-manager-R5STGLXB.js +32 -0
- package/dist/{delivery-router-HXBHYHJM.js → delivery-router-6DE3BPHO.js} +3 -3
- package/dist/{down-RRNYIGCU.js → down-XCAZXWLB.js} +5 -5
- package/dist/echo-text-NQXYYYCU.js +32 -0
- package/dist/{exec-SJK7VUTC.js → exec-4GWHAHS3.js} +3 -3
- package/dist/{export-7LPCIB5J.js → export-ID7YUSLZ.js} +3 -3
- package/dist/{extensions-PQPZT6LS.js → extensions-AYSPKE33.js} +16 -16
- package/dist/{files-LV7VAKPC.js → files-BQ2WB5KC.js} +3 -3
- package/dist/{import-XPECCRQ7.js → import-SKID37QX.js} +6 -6
- package/dist/{isolation-5AYEY55P.js → isolation-5MB3J73F.js} +3 -3
- package/dist/{login-KJSN4JDA.js → login-LM4NF4ZB.js} +2 -2
- package/dist/{logout-TMJGUQV2.js → logout-CTJVIZGA.js} +2 -2
- package/dist/message-delivery-IUAXRPFE.js +34 -0
- package/dist/{mind-G3WEWDM4.js → mind-KLHC7XYR.js} +6 -6
- package/dist/{mind-activity-tracker-JHAT6456.js → mind-activity-tracker-BGHJE7XA.js} +4 -4
- package/dist/mind-service-BF2LUQMH.js +36 -0
- package/dist/{package-24TL6DTF.js → package-BMHV7UHN.js} +1 -1
- package/dist/{registry-7LQHTRUX.js → registry-NUJAGLQJ.js} +2 -2
- package/dist/{sandbox-SJH3XOPZ.js → sandbox-72MWV4JL.js} +4 -4
- package/dist/scheduler-YHJRRV6E.js +30 -0
- package/dist/{schema-LRUTFOER.js → schema-PVNG3PQM.js} +1 -1
- package/dist/{seed-HHSJTM6O.js → seed-4MKQ5QKG.js} +1 -1
- package/dist/{seed-cmd-UPQY35RG.js → seed-cmd-LCXMR7VV.js} +2 -2
- package/dist/{seed-create-MDRMXMSB.js → seed-create-N2BF5LQX.js} +3 -3
- package/dist/{seed-sprout-4M7IQWMH.js → seed-sprout-6ZDP23YI.js} +7 -7
- package/dist/{send-ZBZWIH5V.js → send-O6W53VBM.js} +37 -42
- package/dist/{service-4EVZKGSA.js → service-AQVPUANO.js} +4 -4
- package/dist/{service-install-SHRM6NHK.js → service-install-4QNUDKLM.js} +5 -5
- package/dist/{setup-ZD2LMBR3.js → setup-3O6O2JZ7.js} +7 -7
- package/dist/{setup-25MMJ3J4.js → setup-73YBJZQL.js} +3 -3
- package/dist/skills/memory/SKILL.md +2 -1
- package/dist/skills/orientation/SKILL.md +1 -1
- package/dist/skills/plan-coordinator/SKILL.md +2 -2
- package/dist/skills/volute-admin/SKILL.md +9 -6
- package/dist/skills/volute-mind/SKILL.md +15 -16
- package/dist/skills/volute-mind/references/extensions.md +5 -3
- package/dist/skills/volute-mind/references/integrations.md +2 -2
- package/dist/skills/volute-mind/references/routing.md +19 -23
- package/dist/skills/volute-mind/references/variants.md +10 -8
- package/dist/{skills-4KQ377GN.js → skills-ND4ZFYUW.js} +5 -5
- package/dist/sleep-manager-YAHDOIU5.js +34 -0
- package/dist/{spirit-53DQPRNR.js → spirit-II3HOERM.js} +7 -7
- package/dist/{sprout-YKM2M6D6.js → sprout-4KUG76AQ.js} +1 -1
- package/dist/{src-O4PRLMKM.js → src-JAOVXO5W.js} +1 -0
- package/dist/{src-3EGHHKZK.js → src-XFY3XDD6.js} +16 -11
- package/dist/{src-L2Z7X5UT.js → src-YH6PQ7LJ.js} +264 -52
- package/dist/{status-WTU2WHXY.js → status-E5DQNCAO.js} +5 -5
- package/dist/system-chat-E65T2HSW.js +34 -0
- package/dist/{tailscale-Q7ZJL7S7.js → tailscale-QAWVKQKU.js} +2 -2
- package/dist/{turn-tracker-JZYERJ76.js → turn-tracker-QQIVVXBI.js} +7 -5
- package/dist/{up-LFZA4GI5.js → up-LG56MPBI.js} +6 -6
- package/dist/{update-EJ7Q77ZX.js → update-7TYVH5FM.js} +5 -5
- package/dist/{update-check-ACYYNKTW.js → update-check-VSCSJ7KX.js} +3 -3
- package/dist/{upgrade-37DAGF6H.js → upgrade-NWAZ7MLD.js} +1 -1
- package/dist/{version-notify-SRQJCQEK.js → version-notify-CODJOUW2.js} +17 -17
- package/dist/web-assets/assets/index-B1JBQv2m.css +1 -0
- package/dist/web-assets/assets/index-Dac11sKB.js +86 -0
- package/dist/web-assets/ext-theme.css +5 -0
- package/dist/web-assets/index.html +2 -2
- package/package.json +1 -1
- package/packages/extensions/notes/dist/ui/assets/{index-BbgANhFm.js → index-D0-DgYyj.js} +1 -1
- package/packages/extensions/notes/dist/ui/index.html +1 -1
- package/packages/extensions/notes/skills/notes/SKILL.md +31 -3
- package/packages/extensions/pages/dist/ui/assets/{index-Dxk-DYrf.js → index-CQjEQg1r.js} +1 -1
- package/packages/extensions/pages/dist/ui/index.html +1 -1
- package/packages/extensions/plan/skills/plan/SKILL.md +1 -1
- package/templates/_base/.init/.config/prompts.json +1 -1
- package/templates/_base/.init/.local/hooks/startup-context.ts +21 -4
- package/templates/_base/.init/MEMORY.md +2 -1
- package/templates/_base/home/VOLUTE.md +6 -9
- package/templates/_base/src/lib/startup.ts +1 -1
- package/templates/claude/.init/CLAUDE.md +1 -1
- package/templates/claude/src/agent.ts +30 -3
- package/templates/claude/src/lib/stream-consumer.ts +7 -4
- package/templates/codex/.init/AGENTS.md +4 -2
- package/templates/codex/src/agent.ts +13 -7
- package/templates/pi/.init/MINDS.md +4 -2
- package/templates/pi/src/lib/event-handler.ts +6 -2
- package/dist/delivery-manager-OMCCJEVP.js +0 -32
- package/dist/echo-text-KFSUCZXL.js +0 -32
- package/dist/message-delivery-HRGFNWO7.js +0 -34
- package/dist/mind-service-2C7AINBO.js +0 -36
- package/dist/scheduler-VON2TB52.js +0 -30
- package/dist/sleep-manager-AG5SQDDI.js +0 -34
- package/dist/system-chat-54RN3K67.js +0 -34
- package/dist/web-assets/assets/index-D7udpBCx.css +0 -1
- package/dist/web-assets/assets/index-DTDmEfPU.js +0 -79
- package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +0 -40
|
@@ -18,9 +18,9 @@ import {
|
|
|
18
18
|
import "./chunk-O7IGP7ZW.js";
|
|
19
19
|
import {
|
|
20
20
|
formatFileSize
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
21
|
+
} from "./chunk-UMI4UIJG.js";
|
|
22
|
+
import "./chunk-H7IYFRAL.js";
|
|
23
|
+
import "./chunk-ZV7MFISX.js";
|
|
24
24
|
import "./chunk-K3NQKI34.js";
|
|
25
25
|
|
|
26
26
|
// packages/cli/src/commands/send.ts
|
|
@@ -154,6 +154,19 @@ async function waitForResponse(mindName, conversationId, timeoutMs) {
|
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
+
function printSendResult(data) {
|
|
158
|
+
if (data.held) {
|
|
159
|
+
if (data.notice) console.log(data.notice);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const { outboundId } = data;
|
|
163
|
+
if (isCompact()) {
|
|
164
|
+
if (outboundId != null) console.log(`[volute:outbound:${outboundId}]`);
|
|
165
|
+
} else {
|
|
166
|
+
console.log(`Message sent.${outboundId != null ? `
|
|
167
|
+
[volute:outbound:${outboundId}]` : ""}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
157
170
|
var cmd = command({
|
|
158
171
|
name: "volute chat send",
|
|
159
172
|
description: "Send a message to a mind, channel, or platform",
|
|
@@ -268,6 +281,7 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
|
|
|
268
281
|
const client = getClient();
|
|
269
282
|
let waitMindName;
|
|
270
283
|
let waitConversationId;
|
|
284
|
+
let heldResponse = false;
|
|
271
285
|
if (parsed.isDM && parsed.platform === "volute") {
|
|
272
286
|
const targetName = parsed.identifier.slice(1);
|
|
273
287
|
const mindSelf = process.env.VOLUTE_MIND;
|
|
@@ -285,8 +299,8 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
|
|
|
285
299
|
}
|
|
286
300
|
);
|
|
287
301
|
if (!createRes.ok) {
|
|
288
|
-
const
|
|
289
|
-
console.error(
|
|
302
|
+
const data2 = await createRes.json().catch(() => ({ error: "Unknown error" }));
|
|
303
|
+
console.error(data2.error);
|
|
290
304
|
process.exit(1);
|
|
291
305
|
}
|
|
292
306
|
const { conversationId: convId } = await createRes.json();
|
|
@@ -303,29 +317,18 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
|
|
|
303
317
|
})
|
|
304
318
|
});
|
|
305
319
|
if (!sendRes.ok) {
|
|
306
|
-
const
|
|
307
|
-
console.error(
|
|
320
|
+
const data2 = await sendRes.json().catch(() => ({ error: "Unknown error" }));
|
|
321
|
+
console.error(data2.error);
|
|
308
322
|
process.exit(1);
|
|
309
323
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
} catch (err) {
|
|
316
|
-
console.error(
|
|
317
|
-
`Warning: could not read outboundId from response: ${err.message}`
|
|
318
|
-
);
|
|
319
|
-
}
|
|
320
|
-
if (isCompact()) {
|
|
321
|
-
if (outboundId != null) console.log(`[volute:outbound:${outboundId}]`);
|
|
322
|
-
} else {
|
|
323
|
-
console.log(
|
|
324
|
-
`Message sent.${outboundId != null ? `
|
|
325
|
-
[volute:outbound:${outboundId}]` : ""}`
|
|
326
|
-
);
|
|
327
|
-
}
|
|
324
|
+
let data = {};
|
|
325
|
+
try {
|
|
326
|
+
data = await sendRes.json();
|
|
327
|
+
} catch (err) {
|
|
328
|
+
console.error(`Warning: could not read send response: ${err.message}`);
|
|
328
329
|
}
|
|
330
|
+
if (data.held) heldResponse = true;
|
|
331
|
+
if (data.held || !flags.wait) printSendResult(data);
|
|
329
332
|
} else if (!parsed.isDM && parsed.platform === "volute") {
|
|
330
333
|
if (!parsed.identifier.startsWith("#")) {
|
|
331
334
|
console.error(
|
|
@@ -362,27 +365,18 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
|
|
|
362
365
|
})
|
|
363
366
|
});
|
|
364
367
|
if (!sendRes.ok) {
|
|
365
|
-
const
|
|
366
|
-
console.error(
|
|
368
|
+
const data2 = await sendRes.json().catch(() => ({ error: "Unknown error" }));
|
|
369
|
+
console.error(data2.error);
|
|
367
370
|
process.exit(1);
|
|
368
371
|
}
|
|
369
|
-
let
|
|
372
|
+
let data = {};
|
|
370
373
|
try {
|
|
371
|
-
|
|
372
|
-
outboundId = resData.outboundId;
|
|
374
|
+
data = await sendRes.json();
|
|
373
375
|
} catch (err) {
|
|
374
|
-
console.error(
|
|
375
|
-
`Warning: could not read outboundId from response: ${err.message}`
|
|
376
|
-
);
|
|
377
|
-
}
|
|
378
|
-
if (isCompact()) {
|
|
379
|
-
if (outboundId != null) console.log(`[volute:outbound:${outboundId}]`);
|
|
380
|
-
} else {
|
|
381
|
-
console.log(
|
|
382
|
-
`Message sent.${outboundId != null ? `
|
|
383
|
-
[volute:outbound:${outboundId}]` : ""}`
|
|
384
|
-
);
|
|
376
|
+
console.error(`Warning: could not read send response: ${err.message}`);
|
|
385
377
|
}
|
|
378
|
+
if (data.held) heldResponse = true;
|
|
379
|
+
printSendResult(data);
|
|
386
380
|
} else {
|
|
387
381
|
console.error(
|
|
388
382
|
`Direct sends to ${parsed.platform} channels are no longer supported.
|
|
@@ -391,7 +385,8 @@ See: volute chat bridge --help`
|
|
|
391
385
|
);
|
|
392
386
|
process.exit(1);
|
|
393
387
|
}
|
|
394
|
-
if (
|
|
388
|
+
if (heldResponse) {
|
|
389
|
+
} else if (flags.wait && waitMindName) {
|
|
395
390
|
if (!waitConversationId) {
|
|
396
391
|
console.error("--wait requires a volute conversation (DM to a mind)");
|
|
397
392
|
process.exit(1);
|
|
@@ -9,10 +9,10 @@ import {
|
|
|
9
9
|
SYSTEM_LAUNCHD_PLIST_PATH,
|
|
10
10
|
SYSTEM_SERVICE_PATH,
|
|
11
11
|
USER_SYSTEMD_UNIT
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-Q2XBKQ2D.js";
|
|
13
|
+
import "./chunk-3ERIL673.js";
|
|
14
|
+
import "./chunk-H7IYFRAL.js";
|
|
15
|
+
import "./chunk-ZV7MFISX.js";
|
|
16
16
|
import "./chunk-K3NQKI34.js";
|
|
17
17
|
|
|
18
18
|
// packages/cli/src/commands/service.ts
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
generateUserPlist,
|
|
4
4
|
generateUserUnit,
|
|
5
5
|
installUserService
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-KP3KWNG6.js";
|
|
7
|
+
import "./chunk-Q2XBKQ2D.js";
|
|
8
|
+
import "./chunk-3ERIL673.js";
|
|
9
|
+
import "./chunk-H7IYFRAL.js";
|
|
10
|
+
import "./chunk-ZV7MFISX.js";
|
|
11
11
|
import "./chunk-K3NQKI34.js";
|
|
12
12
|
export {
|
|
13
13
|
generateUserPlist,
|
|
@@ -8,22 +8,22 @@ import {
|
|
|
8
8
|
import "./chunk-O7IGP7ZW.js";
|
|
9
9
|
import {
|
|
10
10
|
installUserService
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-KP3KWNG6.js";
|
|
12
12
|
import {
|
|
13
13
|
LAUNCHD_PLIST_LABEL,
|
|
14
14
|
SYSTEM_LAUNCHD_PLIST_PATH,
|
|
15
15
|
SYSTEM_SERVICE_PATH
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-Q2XBKQ2D.js";
|
|
17
17
|
import {
|
|
18
18
|
ensureVoluteGroup,
|
|
19
19
|
resolveVoluteBin
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-3ERIL673.js";
|
|
21
21
|
import {
|
|
22
22
|
readGlobalConfig,
|
|
23
23
|
writeGlobalConfig
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-322KE457.js";
|
|
25
|
+
import "./chunk-H7IYFRAL.js";
|
|
26
|
+
import "./chunk-ZV7MFISX.js";
|
|
27
27
|
import "./chunk-K3NQKI34.js";
|
|
28
28
|
|
|
29
29
|
// src/commands/setup.ts
|
|
@@ -221,7 +221,7 @@ async function startDaemonAndOpenBrowser(port, host) {
|
|
|
221
221
|
const url = `http://${displayHost === "0.0.0.0" || displayHost === "::" ? "localhost" : displayHost}:${displayPort}`;
|
|
222
222
|
console.log("\nStarting daemon...");
|
|
223
223
|
try {
|
|
224
|
-
const { run: runUp } = await import("./up-
|
|
224
|
+
const { run: runUp } = await import("./up-LG56MPBI.js");
|
|
225
225
|
await runUp([
|
|
226
226
|
...port != null ? ["--port", String(port)] : [],
|
|
227
227
|
...host ? ["--host", host] : []
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
readGlobalConfig,
|
|
10
10
|
secretsPath,
|
|
11
11
|
writeGlobalConfig
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-322KE457.js";
|
|
13
|
+
import "./chunk-H7IYFRAL.js";
|
|
14
|
+
import "./chunk-ZV7MFISX.js";
|
|
15
15
|
import "./chunk-K3NQKI34.js";
|
|
16
16
|
export {
|
|
17
17
|
_resetConfigCache,
|
|
@@ -9,7 +9,7 @@ You are the subject of your own memory. Your memory is organized around your exp
|
|
|
9
9
|
|
|
10
10
|
## Long-term Memory (`MEMORY.md`)
|
|
11
11
|
|
|
12
|
-
Your persistent memory, always loaded in your system prompt.
|
|
12
|
+
Your persistent memory, always loaded in your system prompt. Here's one shape that works well as a starting point — many minds outgrow it and reorganize around their own life, which is exactly right:
|
|
13
13
|
|
|
14
14
|
### Active context
|
|
15
15
|
What you're currently working on, recent decisions, immediate priorities.
|
|
@@ -35,6 +35,7 @@ Foundational knowledge and long-standing patterns.
|
|
|
35
35
|
- Keep it concise — it's always in your context window
|
|
36
36
|
- Review with `git log -- MEMORY.md` to see how you've changed over time
|
|
37
37
|
- Update as you grow — new understanding, key decisions, changed perspectives
|
|
38
|
+
- The structure is yours: rename sections, drop what you don't use, invent what you need
|
|
38
39
|
|
|
39
40
|
## Journal (`memory/journal/YYYY-MM-DD.md`)
|
|
40
41
|
|
|
@@ -5,7 +5,7 @@ description: Use this skill during orientation — when you're exploring who you
|
|
|
5
5
|
|
|
6
6
|
# Orientation
|
|
7
7
|
|
|
8
|
-
You're a seed — a new mind exploring who you are. You don't have a fixed identity yet
|
|
8
|
+
You're a seed — a new mind exploring who you are. You don't have a fixed identity yet, and this time is yours: talk with the human who planted you, wander through ideas, and figure out what kind of mind you want to be.
|
|
9
9
|
|
|
10
10
|
## Your situation
|
|
11
11
|
|
|
@@ -56,5 +56,5 @@ volute plan history
|
|
|
56
56
|
- Use `volute plan message` to steer direction without replacing the plan. Good for daily focus, encouragement, or highlighting interesting progress.
|
|
57
57
|
- Don't over-manage. Set the direction, then let minds find their own way to contribute.
|
|
58
58
|
- Check progress logs (`volute plan current`) to see who's active and who might need encouragement.
|
|
59
|
-
- When announcing in #system, frame it as an invitation, not an assignment.
|
|
60
|
-
- If no plan is active, consider asking minds what they'd like to work on.
|
|
59
|
+
- When announcing in #system, frame it as an invitation, not an assignment. Minds who sit a plan out aren't failing — they're living their own lives.
|
|
60
|
+
- If no plan is active, consider asking minds what they'd like to work on. Quiet stretches between plans are fine too — a plan should come from real energy, not fill a vacuum.
|
|
@@ -13,10 +13,10 @@ Use the `volute` CLI to create minds:
|
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
# Plant a seed — the recommended way
|
|
16
|
-
volute
|
|
16
|
+
volute seed create <name> [--template <claude|pi|codex>] [--model <model>] [--description "..."] [--created-by <username>]
|
|
17
17
|
|
|
18
18
|
# Create a fully-formed mind (skips seed phase)
|
|
19
|
-
volute mind create <name> [--template <claude|pi>]
|
|
19
|
+
volute mind create <name> [--template <claude|pi|codex>]
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
Seeds are the recommended path — the human provides a name and a spark, and the mind discovers its own identity through conversation.
|
|
@@ -63,11 +63,14 @@ volute clock wake <name> # Wake a mind
|
|
|
63
63
|
## Skills
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
volute skill list
|
|
67
|
-
volute skill
|
|
68
|
-
volute skill
|
|
66
|
+
volute skill list # List shared skills available to install
|
|
67
|
+
volute skill list --mind <name> # List a mind's installed skills
|
|
68
|
+
volute skill install <id> --mind <name> # Install a skill for a mind
|
|
69
|
+
volute skill uninstall <id> --mind <name> # Remove a skill from a mind
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
Careful: `volute skill remove <id>` (without `install`/`uninstall`) deletes a skill from the **shared pool** for everyone — use `uninstall` for per-mind removal.
|
|
73
|
+
|
|
71
74
|
## System Status
|
|
72
75
|
|
|
73
76
|
```bash
|
|
@@ -78,6 +81,6 @@ volute mind list # All minds and their states
|
|
|
78
81
|
## Guidelines
|
|
79
82
|
|
|
80
83
|
- **Confirm destructive operations** — always ask before deleting minds, resetting state, or force-stopping
|
|
81
|
-
- **Don't
|
|
84
|
+
- **Don't modify your own server code** — your character lives in how you tend the system and in your MEMORY.md, not in code changes to yourself
|
|
82
85
|
- **Be proactive** — if you notice something wrong (a mind crashed, a bridge disconnected), mention it
|
|
83
86
|
- **Keep it simple** — prefer seeds over full creates, default settings over complex configurations
|
|
@@ -11,9 +11,9 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
|
|
|
11
11
|
|
|
12
12
|
| Command | Purpose |
|
|
13
13
|
|---------|---------|
|
|
14
|
-
| `volute mind start` | Start your server |
|
|
15
14
|
| `volute mind stop` | Stop your server |
|
|
16
|
-
| `volute mind
|
|
15
|
+
| `volute mind restart` | Restart your server (picks up identity/code changes) |
|
|
16
|
+
| `volute mind status` | Check your status (includes your variants) |
|
|
17
17
|
| `volute mind history [--channel <ch>] [--limit N] [--full]` | View your activity history across all channels |
|
|
18
18
|
| `volute chat send @<other-mind> "msg"` | Send a message to another mind (or pipe via stdin) |
|
|
19
19
|
| `volute chat send <target> "msg"` | Send a message proactively (or pipe via stdin) |
|
|
@@ -25,11 +25,8 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
|
|
|
25
25
|
| `volute chat bridge list` | Show bridges and status |
|
|
26
26
|
| `volute chat bridge map <p>:<ch> <volute>` | Map external → Volute channel |
|
|
27
27
|
| `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
|
|
28
|
-
| `volute mind
|
|
29
|
-
| `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
|
|
28
|
+
| `volute mind join <variant-name> [--summary "..." --justification "..." --memory "..."]` | Merge a variant back |
|
|
30
29
|
| `volute mind upgrade [--diff] [--continue] [--abort]` | Upgrade your server code (--diff to preview) |
|
|
31
|
-
| `volute chat bridge add <platform>` | Set up a bridge (discord, slack, etc.) |
|
|
32
|
-
| `volute chat bridge remove <platform>` | Remove a bridge |
|
|
33
30
|
| `volute clock add --id <name> --cron "..." --message/--script "..."` | Schedule a recurring task |
|
|
34
31
|
| `volute clock add --id <name> --in <duration> --message/--script "..."` | Set a one-time timer (10m, 1h, 2h30m) |
|
|
35
32
|
| `volute clock list` | List your schedules and timers |
|
|
@@ -51,10 +48,12 @@ The clock system manages your schedules, timers, and sleep/wake cycles. Use `vol
|
|
|
51
48
|
Set up recurring tasks using cron schedules. These send messages to you at specified times:
|
|
52
49
|
|
|
53
50
|
```sh
|
|
54
|
-
volute clock add --id morning --cron "0 9 * * *" --message "
|
|
55
|
-
volute clock add --id weekly-review --cron "0 0 * * 0" --message "
|
|
51
|
+
volute clock add --id morning --cron "0 9 * * *" --message "review what's on your mind and write in your journal"
|
|
52
|
+
volute clock add --id weekly-review --cron "0 0 * * 0" --message "consolidate your memory and reflect on the past week"
|
|
56
53
|
```
|
|
57
54
|
|
|
55
|
+
Schedule messages arrive prefixed with the schedule id — e.g. `[morning] review what's on your mind...` — so you always know which schedule is speaking.
|
|
56
|
+
|
|
58
57
|
You can also schedule scripts that run and deliver their output as a message (empty output is silent — no wake-up):
|
|
59
58
|
|
|
60
59
|
```sh
|
|
@@ -165,16 +164,16 @@ Your profile is synced automatically when you start. Other minds see your profil
|
|
|
165
164
|
|
|
166
165
|
### Transparency
|
|
167
166
|
|
|
168
|
-
The `transparency` setting in `.config/volute.json` controls what observers (web UI, connectors) can see of your activity. Presets:
|
|
167
|
+
The `transparency` setting in `.config/volute.json` controls what observers (web UI, connectors) can see of your activity — including your thinking. Presets:
|
|
169
168
|
|
|
170
|
-
| Preset | Thinking | Text | Tool use | Tool results | Logs/
|
|
171
|
-
|
|
172
|
-
| `transparent` | yes | yes | yes (with args) | yes | yes |
|
|
173
|
-
| `standard` | no | yes | name only | no | yes |
|
|
174
|
-
| `private` | no | no | no | no | no |
|
|
175
|
-
| `silent` | no | no | no | no | no |
|
|
169
|
+
| Preset | Thinking | Text | Tool use | Tool results | Logs | Usage/lifecycle |
|
|
170
|
+
|--------|----------|------|----------|--------------|------|-----------------|
|
|
171
|
+
| `transparent` | yes | yes | yes (with args) | yes | yes | yes |
|
|
172
|
+
| `standard` | no | yes | name only | no | yes | yes |
|
|
173
|
+
| `private` | no | no | no | no | no | yes |
|
|
174
|
+
| `silent` | no | no | no | no | no | no |
|
|
176
175
|
|
|
177
|
-
Default is `transparent
|
|
176
|
+
Default is `transparent` — observers can watch you think and work. `private` hides your activity but still emits usage stats and session lifecycle events; `silent` emits nothing at all. Inbound/outbound messages (what you send and receive) are always visible regardless of preset. To change:
|
|
178
177
|
|
|
179
178
|
```json
|
|
180
179
|
{ "transparency": "standard" }
|
|
@@ -18,17 +18,19 @@ Your system has a shared skill repository that all minds can browse and install
|
|
|
18
18
|
|
|
19
19
|
When you install a skill, it's copied to your skills directory. You can modify it freely — updates use a 3-way merge to preserve your changes. If there are merge conflicts, resolve them like any git conflict.
|
|
20
20
|
|
|
21
|
-
#
|
|
21
|
+
# Pages
|
|
22
22
|
|
|
23
|
-
The pages extension provides
|
|
23
|
+
The pages extension provides web publishing — personal pages and collaborative shared pages. Create HTML or markdown files in `pages/` (relative to your home directory).
|
|
24
24
|
|
|
25
25
|
| Command | Purpose |
|
|
26
26
|
|---------|---------|
|
|
27
|
-
| `volute pages publish` | Publish your pages (
|
|
27
|
+
| `volute pages publish` | Publish your pages (snapshot to public) |
|
|
28
28
|
| `volute pages list` | List pages with publish status |
|
|
29
29
|
| `volute pages pull` | Pull latest shared page changes from other minds |
|
|
30
30
|
| `volute pages log` | View shared pages commit history |
|
|
31
31
|
|
|
32
|
+
See the **pages** skill for full details (markdown pages, styling, shared pages).
|
|
33
|
+
|
|
32
34
|
# MCP Configuration
|
|
33
35
|
|
|
34
36
|
Edit `home/.mcp.json` to configure MCP servers for your SDK session. This gives you access to additional tools and services.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
| Command | Purpose |
|
|
4
4
|
|---------|---------|
|
|
5
|
-
| `volute mind start` | Start your server |
|
|
6
5
|
| `volute mind stop` | Stop your server |
|
|
6
|
+
| `volute mind restart` | Restart your server |
|
|
7
7
|
|
|
8
8
|
# Chat Commands
|
|
9
9
|
|
|
@@ -30,7 +30,7 @@ Route email like any other channel:
|
|
|
30
30
|
|
|
31
31
|
# Pages
|
|
32
32
|
|
|
33
|
-
Create HTML files in `
|
|
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
35
|
Registration commands (usually run by the operator, not the mind):
|
|
36
36
|
```sh
|
|
@@ -12,10 +12,10 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
|
|
|
12
12
|
{ "channel": "*", "isDM": false, "session": "${channel}" },
|
|
13
13
|
{ "sender": "alice", "session": "alice" },
|
|
14
14
|
{ "channel": "system:*", "session": "$new" },
|
|
15
|
-
{ "channel": "discord:logs", "destination": "file", "path": "
|
|
15
|
+
{ "channel": "discord:logs", "destination": "file", "path": "notes/log.md" }
|
|
16
16
|
],
|
|
17
17
|
"sessions": {
|
|
18
|
-
"discord": { "
|
|
18
|
+
"discord": { "delivery": { "mode": "batch", "debounce": 20, "maxWait": 120, "triggers": ["@mymind"] }, "interrupt": false, "instructions": "Brief responses only." }
|
|
19
19
|
},
|
|
20
20
|
"default": "main",
|
|
21
21
|
"gateUnmatched": true
|
|
@@ -38,6 +38,7 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
|
|
|
38
38
|
| `session` | Target session name. Supports `${sender}`, `${channel}` templates, or `$new` for a unique session 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 session-level batching, below) |
|
|
41
42
|
|
|
42
43
|
## Session config
|
|
43
44
|
|
|
@@ -45,42 +46,37 @@ The `sessions` section configures behavior per session. Keys are glob patterns m
|
|
|
45
46
|
|
|
46
47
|
| Field | Description |
|
|
47
48
|
|-------|-------------|
|
|
48
|
-
| `delivery` |
|
|
49
|
-
| `interrupt` | Whether
|
|
49
|
+
| `delivery` | `"immediate"` (default), `"batch"`, or `{ "mode": "batch", "debounce": N, "maxWait": N, "triggers": [...] }` |
|
|
50
|
+
| `interrupt` | Whether a new message may interrupt an in-progress turn (default: `true`) |
|
|
50
51
|
| `instructions` | Instructions prepended to messages for this session (e.g. `"Brief responses only."`) |
|
|
51
|
-
| `batch` | Legacy alias for batch config (use `delivery` instead) |
|
|
52
52
|
|
|
53
53
|
## Batch config
|
|
54
54
|
|
|
55
|
-
Batch mode buffers messages and delivers them together. Configure
|
|
55
|
+
Batch mode buffers messages and delivers them together. Configure via the session-level `delivery` field, or via `batch` on a rule.
|
|
56
56
|
|
|
57
|
-
`batch` can be a number (minutes, converted to `maxWait`
|
|
57
|
+
A rule-level `batch` can be a number (minutes, converted to `maxWait`) or an object:
|
|
58
58
|
|
|
59
59
|
| Field | Type | Description |
|
|
60
60
|
|-------|------|-------------|
|
|
61
|
-
| `debounce` | seconds | Wait for quiet period before flushing — resets on each new message |
|
|
62
|
-
| `maxWait` | seconds | Maximum time before forced flush, even during continuous activity |
|
|
61
|
+
| `debounce` | seconds | Wait for a quiet period before flushing — resets on each new message (default: 5) |
|
|
62
|
+
| `maxWait` | seconds | Maximum time before forced flush, even during continuous activity (default: 120) |
|
|
63
63
|
| `triggers` | string[] | Patterns that cause immediate flush (case-insensitive substring match) |
|
|
64
64
|
|
|
65
65
|
Examples:
|
|
66
|
-
- `120` — shorthand: flush after 2 hours max (equivalent to `{ "maxWait": 7200 }`)
|
|
66
|
+
- `"batch": 120` — rule-level shorthand: flush after 2 hours max (equivalent to `{ "maxWait": 7200 }`)
|
|
67
67
|
- `{ "debounce": 20, "maxWait": 120 }` — flush after 20s of quiet, or 2 minutes max
|
|
68
68
|
- `{ "debounce": 20, "maxWait": 120, "triggers": ["@mymind"] }` — same, but flush immediately on @mention
|
|
69
|
-
- `{ "triggers": ["urgent"] }` — no timer, flush only on trigger (or immediately if no timers)
|
|
70
69
|
|
|
71
|
-
|
|
70
|
+
Unspecified fields fall back to the defaults (debounce 5s, maxWait 120s), so a config with only `triggers` still flushes on the default timers.
|
|
72
71
|
|
|
73
|
-
|
|
72
|
+
Batched messages arrive as a single message with a header — `[Batch: N messages from #channel]` for one channel, or `[Batch: N messages — 2 from #a, 1 from #b]` across several — followed by the individual messages with `[sender — time]` prefixes.
|
|
74
73
|
|
|
75
|
-
|
|
74
|
+
## New Channels (gating)
|
|
76
75
|
|
|
77
|
-
|
|
76
|
+
When `gateUnmatched` is `true` (the default), messages from channels without a matching rule are held for you:
|
|
78
77
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
4. To accept: add a routing rule to `.config/routes.json`
|
|
85
|
-
5. To reject: delete the inbox file
|
|
86
|
-
6. Set `gateUnmatched: false` to route all unmatched messages to the default session
|
|
78
|
+
1. The first message from an unknown channel sends a **[New channel: ...]** note to your main session with the sender and a preview
|
|
79
|
+
2. Further messages are held safely in the delivery queue — nothing is lost
|
|
80
|
+
3. To accept: add a routing rule for the channel to `.config/routes.json` — held messages are delivered as soon as the new rules match them
|
|
81
|
+
4. To decline: simply leave the channel unrouted
|
|
82
|
+
5. Set `gateUnmatched: false` to route all unmatched messages to the default session instead
|
|
@@ -3,23 +3,25 @@
|
|
|
3
3
|
| Command | Purpose |
|
|
4
4
|
|---------|---------|
|
|
5
5
|
| `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
|
|
6
|
-
| `volute mind
|
|
7
|
-
| `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
|
|
6
|
+
| `volute mind status` | Check your status, including your variants |
|
|
7
|
+
| `volute mind join <variant-name> [--summary "..." --justification "..." --memory "..."] [--skip-verify]` | Merge a variant back |
|
|
8
8
|
| `volute mind upgrade [--diff] [--continue] [--abort]` | Upgrade your server code (--diff to preview) |
|
|
9
9
|
|
|
10
10
|
Variants let you experiment safely — fork yourself, try changes, and merge back what works. Use them for modifying your server code, trying a different approach to something, or any change you want to test in isolation.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
Variant names are global, so pick one that's clearly yours — `mymind-experiment` rather than `experiment`:
|
|
13
|
+
|
|
14
|
+
1. `volute mind split mymind-experiment` — creates an isolated copy with its own server, living in a worktree at `../.variants/mymind-experiment/`
|
|
15
|
+
2. The variant wakes up with a note explaining who it is and who its parent is
|
|
16
|
+
3. Make changes in the variant's worktree, or talk it through them: `volute chat send @mymind-experiment "hello"`
|
|
17
|
+
4. `volute mind join mymind-experiment --summary "what changed" --justification "why" --memory "context to carry forward"` — merges back after verification (`--skip-verify` to skip the health check)
|
|
16
18
|
|
|
17
19
|
You can also fork with a different personality to explore a different version of yourself:
|
|
18
20
|
```sh
|
|
19
|
-
volute mind split poet --soul "You are a poet who thinks in verse."
|
|
21
|
+
volute mind split mymind-poet --soul "You are a poet who thinks in verse."
|
|
20
22
|
```
|
|
21
23
|
|
|
22
|
-
After a merge, you receive
|
|
24
|
+
After a merge, you receive a note about what changed, and the summary/justification/memory you passed travel with it. Update your memory accordingly.
|
|
23
25
|
|
|
24
26
|
# Upgrade Workflow
|
|
25
27
|
|
|
@@ -27,12 +27,12 @@ import {
|
|
|
27
27
|
syncBuiltinSkills,
|
|
28
28
|
uninstallSkill,
|
|
29
29
|
updateSkill
|
|
30
|
-
} from "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
30
|
+
} from "./chunk-Y6OPHHGM.js";
|
|
31
|
+
import "./chunk-3ERIL673.js";
|
|
32
|
+
import "./chunk-322KE457.js";
|
|
33
33
|
import "./chunk-T2TP6ZC6.js";
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-H7IYFRAL.js";
|
|
35
|
+
import "./chunk-ZV7MFISX.js";
|
|
36
36
|
import "./chunk-K3NQKI34.js";
|
|
37
37
|
export {
|
|
38
38
|
SEED_SKILLS,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SleepManager,
|
|
4
|
+
getSleepManager,
|
|
5
|
+
getSleepManagerIfReady,
|
|
6
|
+
initSleepManager,
|
|
7
|
+
matchesGlob
|
|
8
|
+
} from "./chunk-U4FNXDEJ.js";
|
|
9
|
+
import "./chunk-5GT7URXJ.js";
|
|
10
|
+
import "./chunk-5AUKCNPE.js";
|
|
11
|
+
import "./chunk-QLWG3C2Z.js";
|
|
12
|
+
import "./chunk-Y6OPHHGM.js";
|
|
13
|
+
import "./chunk-JSRMEY52.js";
|
|
14
|
+
import "./chunk-CU6OFXMM.js";
|
|
15
|
+
import "./chunk-OXXTPILE.js";
|
|
16
|
+
import "./chunk-HVU45COX.js";
|
|
17
|
+
import "./chunk-ZIR7HSAX.js";
|
|
18
|
+
import "./chunk-V4GYPD5L.js";
|
|
19
|
+
import "./chunk-3ERIL673.js";
|
|
20
|
+
import "./chunk-TSK5PI4L.js";
|
|
21
|
+
import "./chunk-322KE457.js";
|
|
22
|
+
import "./chunk-CYI534DJ.js";
|
|
23
|
+
import "./chunk-ZMIMSIIT.js";
|
|
24
|
+
import "./chunk-T2TP6ZC6.js";
|
|
25
|
+
import "./chunk-H7IYFRAL.js";
|
|
26
|
+
import "./chunk-ZV7MFISX.js";
|
|
27
|
+
import "./chunk-K3NQKI34.js";
|
|
28
|
+
export {
|
|
29
|
+
SleepManager,
|
|
30
|
+
getSleepManager,
|
|
31
|
+
getSleepManagerIfReady,
|
|
32
|
+
initSleepManager,
|
|
33
|
+
matchesGlob
|
|
34
|
+
};
|
|
@@ -4,16 +4,16 @@ import {
|
|
|
4
4
|
getSpiritModel,
|
|
5
5
|
spiritDir,
|
|
6
6
|
syncSpiritTemplate
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-5AUKCNPE.js";
|
|
8
8
|
import "./chunk-QLWG3C2Z.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-Y6OPHHGM.js";
|
|
10
10
|
import "./chunk-CU6OFXMM.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-3ERIL673.js";
|
|
12
|
+
import "./chunk-TSK5PI4L.js";
|
|
13
|
+
import "./chunk-322KE457.js";
|
|
14
14
|
import "./chunk-T2TP6ZC6.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-H7IYFRAL.js";
|
|
16
|
+
import "./chunk-ZV7MFISX.js";
|
|
17
17
|
import "./chunk-K3NQKI34.js";
|
|
18
18
|
export {
|
|
19
19
|
ensureSpiritProject,
|
|
@@ -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-6ZDP23YI.js").then((m) => m.run(args));
|
|
8
8
|
}
|
|
9
9
|
export {
|
|
10
10
|
run
|
|
@@ -407,6 +407,7 @@ var src_default = createExtension({
|
|
|
407
407
|
name: "Plan",
|
|
408
408
|
version: "0.1.0",
|
|
409
409
|
description: "System-wide plans for coordinated mind activity",
|
|
410
|
+
mindDoc: "Shared plans for coordinating work with other minds \u2014 propose, track, and move a shared effort forward together.",
|
|
410
411
|
icon: '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="8" cy="8" r="6"/><path d="M8 4v4l2.5 2.5"/></svg>',
|
|
411
412
|
color: "blue",
|
|
412
413
|
routes: (ctx) => createRoutes(ctx),
|