volute 0.28.0 → 0.30.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.
Files changed (134) hide show
  1. package/README.md +127 -18
  2. package/dist/{accept-666DIZX2.js → accept-E3PAH3QJ.js} +2 -2
  3. package/dist/{activity-events-BBIEA2F4.js → activity-events-BKBPPUBP.js} +2 -2
  4. package/dist/ai-service-VAJT5UBS.js +29 -0
  5. package/dist/api.d.ts +586 -529
  6. package/dist/{archive-UA4BDFXQ.js → archive-WWDBWYN2.js} +2 -2
  7. package/dist/{bridge-FQHZL3MC.js → bridge-RO37CUFM.js} +2 -2
  8. package/dist/{chat-M4SX42JD.js → chat-TCUNPFGO.js} +8 -8
  9. package/dist/{chunk-IAYBDWVG.js → chunk-2C2VXEBB.js} +147 -2
  10. package/dist/chunk-2NDZC3S7.js +1330 -0
  11. package/dist/{chunk-IKRVFPWU.js → chunk-7D47T4RB.js} +3 -2
  12. package/dist/chunk-A6TUJJ3L.js +19 -0
  13. package/dist/{chunk-AW7PFDVN.js → chunk-CVH6Y2YG.js} +1 -1
  14. package/dist/{chunk-XBLSAVJF.js → chunk-DTC6EH5I.js} +1 -1
  15. package/dist/chunk-EFP3PE6C.js +232 -0
  16. package/dist/{chunk-JGFVMROS.js → chunk-EFVHR7KH.js} +1 -1
  17. package/dist/{chunk-K5NAC55T.js → chunk-FSM45XD5.js} +2 -2
  18. package/dist/{chunk-LAC664WU.js → chunk-FXHXHI2A.js} +42 -24
  19. package/dist/{chunk-RKQEHRBB.js → chunk-G3GBKZGG.js} +1 -1
  20. package/dist/{chunk-H7OZRFJB.js → chunk-HHTXM4JT.js} +0 -49
  21. package/dist/{chunk-J4IBNXGJ.js → chunk-IKHDUZRH.js} +4 -3
  22. package/dist/{chunk-MD4C26II.js → chunk-JGFRDMR6.js} +1 -1
  23. package/dist/{chunk-POSXWWTA.js → chunk-LIRWLNAK.js} +26 -12
  24. package/dist/{chunk-NI5FFCCS.js → chunk-MDPCSXZ4.js} +35 -11
  25. package/dist/chunk-NSBFETWP.js +188 -0
  26. package/dist/{chunk-VIVMW2H2.js → chunk-P27RV5WM.js} +1 -1
  27. package/dist/{chunk-EHYDTZTF.js → chunk-P7VFDSSG.js} +2 -2
  28. package/dist/{chunk-AAPXKR5V.js → chunk-QVAQ5454.js} +181 -544
  29. package/dist/{chunk-HDN7MNGD.js → chunk-S5LR3XYJ.js} +1 -1
  30. package/dist/{chunk-2YP2TVDT.js → chunk-UPA6COHU.js} +5 -5
  31. package/dist/{chunk-AKPFNL7L.js → chunk-VGWJSNHS.js} +1 -1
  32. package/dist/{chunk-SGVNFZHW.js → chunk-W5OOPLNP.js} +3 -3
  33. package/dist/{chunk-2WPW7OT6.js → chunk-ZWKTUQEL.js} +1 -1
  34. package/dist/cli.js +25 -26
  35. package/dist/clock-G3ALCMLJ.js +263 -0
  36. package/dist/{cloud-sync-HDL6PHZI.js → cloud-sync-JV4LJOK3.js} +14 -12
  37. package/dist/connectors/discord-bridge.js +1 -1
  38. package/dist/connectors/slack-bridge.js +1 -1
  39. package/dist/connectors/telegram-bridge.js +1 -1
  40. package/dist/{conversations-M2K4253F.js → conversations-7KVQV7EZ.js} +9 -3
  41. package/dist/create-JTLS7GX3.js +70 -0
  42. package/dist/{create-QWV73WXD.js → create-VQSQHJQW.js} +1 -1
  43. package/dist/{daemon-client-I42FK2BF.js → daemon-client-BCTFGVCZ.js} +2 -2
  44. package/dist/{daemon-restart-G4B2OYAB.js → daemon-restart-4JGBHEJ4.js} +7 -7
  45. package/dist/daemon.js +1474 -1124
  46. package/dist/{db-IC4J52XQ.js → db-HMFPIRO2.js} +1 -1
  47. package/dist/{delete-4JYGD4VN.js → delete-JESHKE7F.js} +1 -1
  48. package/dist/down-NGBMGORS.js +14 -0
  49. package/dist/{env-YJMUMFIY.js → env-CLXXT7M2.js} +2 -2
  50. package/dist/{export-BOJQWBMA.js → export-EGA5M5PB.js} +3 -3
  51. package/dist/extension-WZ4SUPJB.js +174 -0
  52. package/dist/extensions-ECO4RPFQ.js +27 -0
  53. package/dist/{files-M546TKVN.js → files-4VEJDASH.js} +3 -3
  54. package/dist/{history-ALPTNB3I.js → history-EJMMLXDO.js} +17 -2
  55. package/dist/{import-SRTQXBGH.js → import-YCGPMBSI.js} +3 -3
  56. package/dist/{join-J4QU42DL.js → join-2GBJKZEN.js} +1 -1
  57. package/dist/{list-R73GENNL.js → list-Q6O7FGAN.js} +2 -2
  58. package/dist/{login-3QZNR2DF.js → login-RET5WESK.js} +2 -2
  59. package/dist/{login-BKP3AFWN.js → login-RL6AU2SM.js} +3 -3
  60. package/dist/{logout-T53VKCPU.js → logout-CGAGJN3L.js} +2 -2
  61. package/dist/{logout-IQK7FNEK.js → logout-JRPBEMMR.js} +3 -3
  62. package/dist/message-delivery-6YMVNOEC.js +28 -0
  63. package/dist/{migrate-registry-to-db-XC7T5B7P.js → migrate-registry-to-db-FK35IPEH.js} +1 -1
  64. package/dist/{mind-S5V6CK5W.js → mind-LUWRQUQ5.js} +17 -17
  65. package/dist/{mind-activity-tracker-EN6XNXPF.js → mind-activity-tracker-VYN2ZZ2M.js} +3 -3
  66. package/dist/{mind-list-UPJ75GPI.js → mind-list-V5WW5DUA.js} +2 -2
  67. package/dist/{mind-manager-S6ILZVX3.js → mind-manager-YFCOIAAX.js} +6 -6
  68. package/dist/{mind-sleep-BTSWQNAC.js → mind-sleep-R6PTNNW4.js} +2 -2
  69. package/dist/{mind-status-TK5AETEM.js → mind-status-I4ISFJ6I.js} +2 -2
  70. package/dist/{mind-wake-SBAKIDVP.js → mind-wake-67ZQEWAV.js} +2 -2
  71. package/dist/{package-CG4RWUGP.js → package-S2OAA5ZA.js} +11 -5
  72. package/dist/pages-watcher-Z3PKNROC.js +21 -0
  73. package/dist/{read-36UFXN3G.js → read-WQMPTSN2.js} +2 -2
  74. package/dist/{register-CHREOMJ3.js → register-NZDSTLP3.js} +3 -3
  75. package/dist/{registry-NDNOOYG4.js → registry-ODSALQQL.js} +1 -1
  76. package/dist/{reject-LXIZFJ4Q.js → reject-2HZOJEIJ.js} +2 -2
  77. package/dist/{restart-6ESL3NBO.js → restart-QHS3NT64.js} +2 -2
  78. package/dist/{sandbox-5BW5HPXM.js → sandbox-O5FUSF43.js} +3 -3
  79. package/dist/{seed-SSUCYYDF.js → seed-WUQMPLDM.js} +1 -1
  80. package/dist/{send-TAOEZ4NH.js → send-OAN3RYYY.js} +20 -6
  81. package/dist/{setup-JHL5ZEST.js → setup-QMDK5RZX.js} +2 -2
  82. package/dist/{setup-RXYVGGT7.js → setup-XJH3E7YM.js} +45 -14
  83. package/dist/{skill-AUAQTSP5.js → skill-FZIN4W4Q.js} +65 -3
  84. package/dist/skills/dreaming/references/INSTALL.md +3 -17
  85. package/dist/skills/volute-mind/SKILL.md +45 -27
  86. package/dist/sleep-manager-O7YQFCV5.js +30 -0
  87. package/dist/{split-TKJ5OT3P.js → split-EXYGGGQN.js} +1 -1
  88. package/dist/{sprout-UNT7LKKE.js → sprout-AXQ6H5DB.js} +8 -7
  89. package/dist/{start-EUJSS5R4.js → start-MTOVL6SY.js} +2 -2
  90. package/dist/{status-NQJYR4BG.js → status-ZRO37MWR.js} +5 -5
  91. package/dist/{stop-3XAITBBF.js → stop-OK5WEPVC.js} +2 -2
  92. package/dist/{systems-SMEFSHTA.js → systems-W3BBMSOZ.js} +5 -5
  93. package/dist/{tailscale-NY5MUMY3.js → tailscale-BM72RXCJ.js} +1 -1
  94. package/dist/{template-hash-BIMA4ILT.js → template-hash-3HOR4UAJ.js} +1 -1
  95. package/dist/up-BXUAIDXB.js +17 -0
  96. package/dist/{update-PTSH22AZ.js → update-PLPHMMZ2.js} +5 -5
  97. package/dist/{update-check-64FWC4Y2.js → update-check-CVCN7MF6.js} +2 -2
  98. package/dist/{upgrade-HA47CS4C.js → upgrade-I6NPCYUU.js} +1 -1
  99. package/dist/{version-notify-JDUF4HQJ.js → version-notify-2NTWVEHL.js} +18 -16
  100. package/dist/web-assets/assets/index--kREqKl9.js +72 -0
  101. package/dist/web-assets/assets/index-BXYTG0nJ.css +1 -0
  102. package/dist/web-assets/ext-theme.css +111 -0
  103. package/dist/web-assets/index.html +2 -2
  104. package/package.json +11 -5
  105. package/packages/extensions/notes/dist/ui/assets/index-DgawVO5g.css +1 -0
  106. package/packages/extensions/notes/dist/ui/assets/index-qUWoeC4c.js +2 -0
  107. package/packages/extensions/notes/dist/ui/index.html +14 -0
  108. package/packages/extensions/notes/skills/notes/SKILL.md +62 -0
  109. package/packages/extensions/notes/skills/notes/scripts/notes.mjs +185 -0
  110. package/packages/extensions/pages/dist/ui/assets/index-D0HyS-xQ.css +1 -0
  111. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +2 -0
  112. package/packages/extensions/pages/dist/ui/index.html +14 -0
  113. package/packages/extensions/pages/skills/pages/SKILL.md +58 -0
  114. package/templates/_base/home/VOLUTE.md +1 -1
  115. package/templates/_base/src/lib/logger.ts +10 -49
  116. package/templates/_base/src/lib/router.ts +1 -9
  117. package/templates/claude/src/lib/stream-consumer.ts +1 -4
  118. package/templates/pi/src/lib/event-handler.ts +1 -14
  119. package/dist/chunk-P72MVS4R.js +0 -188
  120. package/dist/chunk-T6HKBWXZ.js +0 -23
  121. package/dist/chunk-ZYGKG6VC.js +0 -22
  122. package/dist/create-D7J73A6H.js +0 -45
  123. package/dist/down-LVBXEULC.js +0 -14
  124. package/dist/message-delivery-HV3S6HZV.js +0 -24
  125. package/dist/notes-XCER3I7M.js +0 -220
  126. package/dist/pages-KJDJX4TA.js +0 -36
  127. package/dist/publish-ZZB33WP4.js +0 -86
  128. package/dist/schedule-QTJMFATP.js +0 -154
  129. package/dist/skills/notes/SKILL.md +0 -34
  130. package/dist/sleep-manager-WMVG2VCL.js +0 -28
  131. package/dist/status-S7UUPNRW.js +0 -38
  132. package/dist/up-GM2JOH2Y.js +0 -17
  133. package/dist/web-assets/assets/index-BZGvToHi.css +0 -1
  134. package/dist/web-assets/assets/index-Cz4TrpzB.js +0 -75
@@ -5,8 +5,8 @@ import {
5
5
  extractArchive,
6
6
  isHomeOnlyArchive,
7
7
  readManifest
8
- } from "./chunk-XBLSAVJF.js";
9
- import "./chunk-H7OZRFJB.js";
8
+ } from "./chunk-DTC6EH5I.js";
9
+ import "./chunk-HHTXM4JT.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  addHistoryToArchive,
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  daemonFetch
4
- } from "./chunk-JGFVMROS.js";
4
+ } from "./chunk-EFVHR7KH.js";
5
5
  import {
6
6
  parseArgs
7
7
  } from "./chunk-D424ZQGI.js";
8
- import "./chunk-H7OZRFJB.js";
8
+ import "./chunk-HHTXM4JT.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
 
11
11
  // src/commands/chat/bridge.ts
@@ -7,28 +7,28 @@ async function run(args) {
7
7
  const subArgs = args.slice(1);
8
8
  switch (subcommand) {
9
9
  case "send":
10
- await import("./send-TAOEZ4NH.js").then((m) => m.run(subArgs));
10
+ await import("./send-OAN3RYYY.js").then((m) => m.run(subArgs));
11
11
  break;
12
12
  case "list":
13
- await import("./list-R73GENNL.js").then((m) => m.run(subArgs));
13
+ await import("./list-Q6O7FGAN.js").then((m) => m.run(subArgs));
14
14
  break;
15
15
  case "read":
16
- await import("./read-36UFXN3G.js").then((m) => m.run(subArgs));
16
+ await import("./read-WQMPTSN2.js").then((m) => m.run(subArgs));
17
17
  break;
18
18
  case "create":
19
- await import("./create-D7J73A6H.js").then((m) => m.run(subArgs));
19
+ await import("./create-JTLS7GX3.js").then((m) => m.run(subArgs));
20
20
  break;
21
21
  case "bridge":
22
- await import("./bridge-FQHZL3MC.js").then((m) => m.run(subArgs));
22
+ await import("./bridge-RO37CUFM.js").then((m) => m.run(subArgs));
23
23
  break;
24
24
  case "files":
25
- await import("./files-M546TKVN.js").then((m) => m.run(subArgs));
25
+ await import("./files-4VEJDASH.js").then((m) => m.run(subArgs));
26
26
  break;
27
27
  case "accept":
28
- await import("./accept-666DIZX2.js").then((m) => m.run(subArgs));
28
+ await import("./accept-E3PAH3QJ.js").then((m) => m.run(subArgs));
29
29
  break;
30
30
  case "reject":
31
- await import("./reject-LXIZFJ4Q.js").then((m) => m.run(subArgs));
31
+ await import("./reject-2HZOJEIJ.js").then((m) => m.run(subArgs));
32
32
  break;
33
33
  case "--help":
34
34
  case "-h":
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  subscribe
4
- } from "./chunk-VIVMW2H2.js";
4
+ } from "./chunk-P27RV5WM.js";
5
5
  import {
6
6
  logger_default
7
7
  } from "./chunk-YUIHSKR6.js";
@@ -12,7 +12,7 @@ import {
12
12
  getDb,
13
13
  messages,
14
14
  users
15
- } from "./chunk-H7OZRFJB.js";
15
+ } from "./chunk-HHTXM4JT.js";
16
16
 
17
17
  // src/lib/events/conversations.ts
18
18
  import { randomUUID } from "crypto";
@@ -109,6 +109,53 @@ function publish(conversationId, event) {
109
109
  }
110
110
 
111
111
  // src/lib/events/conversations.ts
112
+ async function migrateGroupDMsToChannels() {
113
+ const db = await getDb();
114
+ await db.transaction(async (tx) => {
115
+ const overloadedDMs = await tx.select({
116
+ conversationId: conversationParticipants.conversation_id,
117
+ count: sql`COUNT(*)`
118
+ }).from(conversationParticipants).innerJoin(conversations, eq(conversationParticipants.conversation_id, conversations.id)).where(eq(conversations.type, "dm")).groupBy(conversationParticipants.conversation_id).having(sql`COUNT(*) > 2`);
119
+ const dmIds = overloadedDMs.map((r) => r.conversationId);
120
+ await tx.update(conversations).set({
121
+ type: "channel",
122
+ name: sql`COALESCE(${conversations.name}, ${conversations.title})`
123
+ }).where(eq(conversations.type, "group"));
124
+ if (dmIds.length > 0) {
125
+ await tx.update(conversations).set({
126
+ type: "channel",
127
+ name: sql`COALESCE(${conversations.name}, ${conversations.title})`
128
+ }).where(inArray(conversations.id, dmIds));
129
+ }
130
+ });
131
+ await migrateChannelEntryTypes();
132
+ }
133
+ async function migrateChannelEntryTypes() {
134
+ const { existsSync, readdirSync, readFileSync, writeFileSync } = await import("fs");
135
+ const { join } = await import("path");
136
+ const home = join((await import("os")).homedir(), ".volute", "state");
137
+ if (!existsSync(home)) return;
138
+ for (const name of readdirSync(home)) {
139
+ const filePath = join(home, name, "channels.json");
140
+ if (!existsSync(filePath)) continue;
141
+ try {
142
+ const raw = readFileSync(filePath, "utf-8");
143
+ const map = JSON.parse(raw);
144
+ let changed = false;
145
+ for (const entry of Object.values(map)) {
146
+ if (entry.type === "group") {
147
+ entry.type = "channel";
148
+ changed = true;
149
+ }
150
+ }
151
+ if (changed) {
152
+ writeFileSync(filePath, `${JSON.stringify(map, null, 2)}
153
+ `);
154
+ }
155
+ } catch {
156
+ }
157
+ }
158
+ }
112
159
  async function createConversation(mindName, channel, opts) {
113
160
  const db = await getDb();
114
161
  const id = randomUUID();
@@ -380,6 +427,101 @@ async function findDMConversation(mindName, participantIds) {
380
427
  }
381
428
  return null;
382
429
  }
430
+ async function listConversationsForMind(mindName) {
431
+ const db = await getDb();
432
+ const byName = await db.select().from(conversations).where(eq(conversations.mind_name, mindName)).orderBy(desc(conversations.updated_at)).all();
433
+ const mindUser = await db.select({ id: users.id }).from(users).where(and(eq(users.username, mindName), eq(users.user_type, "mind"))).get();
434
+ const byNameIds = new Set(byName.map((c) => c.id));
435
+ let byParticipation = [];
436
+ if (mindUser) {
437
+ const participantRows = await db.select({ conversation_id: conversationParticipants.conversation_id }).from(conversationParticipants).where(eq(conversationParticipants.user_id, mindUser.id)).all();
438
+ const extraIds = participantRows.map((r) => r.conversation_id).filter((id) => !byNameIds.has(id));
439
+ if (extraIds.length > 0) {
440
+ byParticipation = await db.select().from(conversations).where(inArray(conversations.id, extraIds)).orderBy(desc(conversations.updated_at)).all();
441
+ }
442
+ }
443
+ const convs = [...byName, ...byParticipation].sort(
444
+ (a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()
445
+ );
446
+ if (convs.length === 0) return [];
447
+ const convIds = convs.map((c) => c.id);
448
+ const rows = await db.select({
449
+ conversationId: conversationParticipants.conversation_id,
450
+ userId: users.id,
451
+ username: users.username,
452
+ userType: users.user_type,
453
+ role: conversationParticipants.role,
454
+ displayName: users.display_name,
455
+ description: users.description,
456
+ avatar: users.avatar
457
+ }).from(conversationParticipants).innerJoin(users, eq(conversationParticipants.user_id, users.id)).where(inArray(conversationParticipants.conversation_id, convIds));
458
+ const byConv = /* @__PURE__ */ new Map();
459
+ for (const r of rows) {
460
+ let arr = byConv.get(r.conversationId);
461
+ if (!arr) {
462
+ arr = [];
463
+ byConv.set(r.conversationId, arr);
464
+ }
465
+ arr.push({
466
+ userId: r.userId,
467
+ username: r.username,
468
+ userType: r.userType,
469
+ role: r.role,
470
+ displayName: r.displayName,
471
+ description: r.description,
472
+ avatar: r.avatar
473
+ });
474
+ }
475
+ const lastMsgIds = await db.select({
476
+ conversationId: messages.conversation_id,
477
+ maxId: sql`MAX(${messages.id})`
478
+ }).from(messages).where(inArray(messages.conversation_id, convIds)).groupBy(messages.conversation_id);
479
+ const byLastMsg = /* @__PURE__ */ new Map();
480
+ if (lastMsgIds.length > 0) {
481
+ const msgRows = await db.select().from(messages).where(
482
+ inArray(
483
+ messages.id,
484
+ lastMsgIds.map((r) => r.maxId)
485
+ )
486
+ );
487
+ for (const m of msgRows) {
488
+ let text = "";
489
+ try {
490
+ const parsed = JSON.parse(m.content);
491
+ const blocks = Array.isArray(parsed) ? parsed : [];
492
+ const textBlock = blocks.find((b) => b.type === "text");
493
+ if (textBlock && "text" in textBlock) text = textBlock.text;
494
+ } catch {
495
+ text = m.content;
496
+ }
497
+ byLastMsg.set(m.conversation_id, {
498
+ role: m.role,
499
+ senderName: m.sender_name,
500
+ text,
501
+ createdAt: m.created_at
502
+ });
503
+ }
504
+ }
505
+ return convs.map((c) => ({
506
+ ...c,
507
+ participants: byConv.get(c.id) ?? [],
508
+ lastMessage: byLastMsg.get(c.id)
509
+ }));
510
+ }
511
+ async function isConversationForMind(mindName, conversationId) {
512
+ const db = await getDb();
513
+ const byName = await db.select({ id: conversations.id }).from(conversations).where(and(eq(conversations.id, conversationId), eq(conversations.mind_name, mindName))).get();
514
+ if (byName) return true;
515
+ const mindUser = await db.select({ id: users.id }).from(users).where(and(eq(users.username, mindName), eq(users.user_type, "mind"))).get();
516
+ if (!mindUser) return false;
517
+ const participant = await db.select({ conversation_id: conversationParticipants.conversation_id }).from(conversationParticipants).where(
518
+ and(
519
+ eq(conversationParticipants.conversation_id, conversationId),
520
+ eq(conversationParticipants.user_id, mindUser.id)
521
+ )
522
+ ).get();
523
+ return !!participant;
524
+ }
383
525
  async function deleteConversation(id) {
384
526
  const db = await getDb();
385
527
  await db.delete(conversations).where(eq(conversations.id, id));
@@ -451,6 +593,7 @@ export {
451
593
  initWebhook,
452
594
  subscribe2 as subscribe,
453
595
  publish,
596
+ migrateGroupDMsToChannels,
454
597
  createConversation,
455
598
  getOrCreateConversation,
456
599
  getConversation,
@@ -466,6 +609,8 @@ export {
466
609
  getMessagesPaginated,
467
610
  listConversationsWithParticipants,
468
611
  findDMConversation,
612
+ listConversationsForMind,
613
+ isConversationForMind,
469
614
  deleteConversation,
470
615
  createChannel,
471
616
  getChannelByName,