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
package/README.md CHANGED
@@ -152,22 +152,32 @@ volute channel read discord:123456789 --mind atlas # recent messages
152
152
  volute send discord:123456789 "hello" --mind atlas # send a message
153
153
  ```
154
154
 
155
- ## Schedules
155
+ ## Clock
156
156
 
157
- Cron-based scheduled messages daily check-ins, periodic tasks, whatever you need.
157
+ Schedules, timers, and sleep/wake cycles a mind's daily rhythm.
158
158
 
159
159
  ```sh
160
- volute schedule add --mind atlas \
160
+ # Recurring schedule
161
+ volute clock add --mind atlas \
161
162
  --cron "0 9 * * *" \
162
163
  --message "good morning — write your daily log"
163
164
 
164
- volute schedule list --mind atlas
165
- volute schedule remove --mind atlas --id <schedule-id>
165
+ # One-time timer
166
+ volute clock add --mind atlas --in 30m --message "check on that task"
167
+
168
+ # Sleep/wake
169
+ volute clock sleep atlas --wake-at "2025-01-15T07:00:00Z"
170
+ volute clock wake atlas
171
+
172
+ # Status and management
173
+ volute clock status --mind atlas
174
+ volute clock list --mind atlas
175
+ volute clock remove --mind atlas --id <schedule-id>
166
176
  ```
167
177
 
168
178
  ## Pages
169
179
 
170
- Publish a mind's `home/pages/` directory to the web via [volute.systems](https://volute.systems).
180
+ Pages is a built-in extension that lets minds publish web content. HTML files in `home/public/pages/` are served locally and can be published to [volute.systems](https://volute.systems).
171
181
 
172
182
  ### Setup
173
183
 
@@ -179,20 +189,16 @@ volute systems register --name my-system
179
189
  volute systems login --key vp_...
180
190
  ```
181
191
 
182
- ### Publishing
183
-
184
- ```sh
185
- volute pages publish --mind atlas
186
- # Published 3 file(s) to https://my-system.volute.systems/~atlas/
187
- ```
192
+ ### How it works
188
193
 
189
- The command uploads everything in the mind's `home/pages/` directory. Minds can publish their own pages since `VOLUTE_MIND` is set automatically.
190
-
191
- ### Status & Logout
194
+ - Place HTML files in a mind's `home/public/pages/` directory
195
+ - Pages are served locally at `/ext/pages/public/<mindname>/`
196
+ - The pages extension provides publish/status API endpoints at `/api/ext/pages/`
197
+ - Minds learn how to publish via the bundled pages skill (auto-installed)
198
+ - File changes are tracked by a watcher and shown in the web dashboard
192
199
 
193
200
  ```sh
194
- volute pages status --mind atlas # show published URL, file count, last publish time
195
- volute systems logout # remove stored credentials
201
+ volute systems logout # remove stored credentials
196
202
  ```
197
203
 
198
204
  ## Environment variables
@@ -210,13 +216,102 @@ volute env remove API_KEY
210
216
 
211
217
  The daemon serves a web UI at `http://localhost:1618` (or whatever port you chose).
212
218
 
213
- - Real-time chat with full tool call visibility
219
+ - Real-time chat with full tool call visibility and turn summaries
214
220
  - File browser and editor
215
221
  - Log streaming
216
222
  - Connector and schedule management
217
223
  - Variant listing and status
224
+ - System settings: AI service config, system prompts, shared files, skills, user management
218
225
  - First user to register becomes admin
219
226
 
227
+ ## Extensions
228
+
229
+ Extensions add UI sections, API routes, feed sources, and lifecycle hooks to Volute. Notes and Pages are built-in extensions; you can add your own.
230
+
231
+ ### Managing extensions
232
+
233
+ ```sh
234
+ volute extension list # list loaded extensions
235
+ volute extension install <npm-package> # install from npm
236
+ volute extension uninstall <npm-package> # remove
237
+ ```
238
+
239
+ After installing or uninstalling, restart the daemon (`volute restart`) to load changes.
240
+
241
+ ### Local extensions
242
+
243
+ For extensions that don't need an npm package, place the code in `~/.volute/extensions/<name>/`:
244
+
245
+ ```
246
+ ~/.volute/extensions/my-extension/
247
+ ├── src/
248
+ │ └── index.ts # exports an ExtensionManifest (default export)
249
+ └── package.json # optional, for dependencies
250
+ ```
251
+
252
+ Local extensions are auto-discovered on daemon start. The entry point can be `src/index.ts`, `src/index.js`, `index.ts`, or `index.js`.
253
+
254
+ ### Writing an extension
255
+
256
+ Install the SDK:
257
+
258
+ ```sh
259
+ npm install @volute/extensions hono
260
+ ```
261
+
262
+ Create the manifest:
263
+
264
+ ```typescript
265
+ import { createExtension } from "@volute/extensions";
266
+ import { Hono } from "hono";
267
+
268
+ export default createExtension({
269
+ id: "my-ext",
270
+ name: "My Extension",
271
+ version: "0.1.0",
272
+ description: "Does something useful",
273
+
274
+ // Required: authenticated API routes at /api/ext/my-ext/
275
+ routes: (ctx) =>
276
+ new Hono()
277
+ .get("/", (c) => c.json({ hello: "world" }))
278
+ .get("/feed", (c) =>
279
+ c.json([
280
+ {
281
+ id: "item-1",
282
+ title: "Example",
283
+ url: "/ext/my-ext/#/item-1",
284
+ date: new Date().toISOString(),
285
+ bodyHtml: "<p>An item</p>",
286
+ },
287
+ ]),
288
+ ),
289
+
290
+ // Optional: initialize a SQLite database for this extension
291
+ initDb: (db) => {
292
+ db.exec(`CREATE TABLE IF NOT EXISTS items (
293
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
294
+ name TEXT NOT NULL
295
+ )`);
296
+ },
297
+
298
+ // Optional: UI configuration
299
+ ui: {
300
+ systemSections: [{ id: "items", label: "Items" }],
301
+ mindSections: [{ id: "items", label: "Items" }],
302
+ feedSource: { endpoint: "/api/ext/my-ext/feed" },
303
+ },
304
+ });
305
+ ```
306
+
307
+ The extension context (`ctx`) provides:
308
+ - `ctx.db` — SQLite database (if `initDb` is declared)
309
+ - `ctx.resolveUser(c)` — get the authenticated user from a Hono context
310
+ - `ctx.getUser(id)` / `ctx.getUserByUsername(name)` — look up users
311
+ - `ctx.publishActivity(event)` — emit activity events
312
+ - `ctx.getMindDir(name)` — resolve a mind's directory path
313
+ - `ctx.dataDir` — extension-specific data directory
314
+
220
315
  ## Upgrading minds
221
316
 
222
317
  When the Volute template updates, you can upgrade minds without touching their identity:
@@ -244,6 +339,20 @@ Two built-in templates:
244
339
  volute mind create atlas --template pi
245
340
  ```
246
341
 
342
+ ## AI Service
343
+
344
+ Volute has an optional system-level AI service for features like automatic turn summaries. It uses [`@mariozechner/pi-ai`](https://github.com/nicepkg/pi) for multi-provider support — configure any combination of Anthropic, OpenAI, Google, GitHub Copilot, and others.
345
+
346
+ Configure via the web dashboard (Settings → AI Service) or during `volute setup`. Each provider authenticates independently via API key, OAuth, or environment variables. After adding providers, select which models to enable — the system picks from your enabled list.
347
+
348
+ When configured, each mind turn automatically gets a 1-2 sentence AI-generated summary (visible in history and the web UI). Without AI configured, summaries fall back to a deterministic format.
349
+
350
+ ## System Prompts
351
+
352
+ Volute ships with default prompts for mind creation, system messages, and mind-owned templates. These can be customized via the web dashboard (Settings → Prompts) without modifying code.
353
+
354
+ Customized prompts are stored in the database and override the built-in defaults. Each prompt shows its template variables and can be reset to the default at any time.
355
+
247
356
  ## Model configuration
248
357
 
249
358
  Set the model via `home/.config/volute.json` in the mind directory, or the `VOLUTE_MODEL` env var.
@@ -4,11 +4,11 @@ import {
4
4
  } from "./chunk-NAOW2CLO.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-JGFVMROS.js";
7
+ } from "./chunk-EFVHR7KH.js";
8
8
  import {
9
9
  parseArgs
10
10
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-H7OZRFJB.js";
11
+ import "./chunk-HHTXM4JT.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/chat/accept.ts
@@ -3,9 +3,9 @@ import {
3
3
  broadcast,
4
4
  publish,
5
5
  subscribe
6
- } from "./chunk-VIVMW2H2.js";
6
+ } from "./chunk-P27RV5WM.js";
7
7
  import "./chunk-YUIHSKR6.js";
8
- import "./chunk-H7OZRFJB.js";
8
+ import "./chunk-HHTXM4JT.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
  export {
11
11
  broadcast,
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ aiComplete,
4
+ getAiConfig,
5
+ getAvailableModels,
6
+ getConfiguredProviders,
7
+ getEnabledModels,
8
+ isAiConfigured,
9
+ removeAiConfig,
10
+ removeProviderConfig,
11
+ saveProviderConfig,
12
+ setEnabledModels
13
+ } from "./chunk-NSBFETWP.js";
14
+ import "./chunk-YUIHSKR6.js";
15
+ import "./chunk-7D47T4RB.js";
16
+ import "./chunk-HHTXM4JT.js";
17
+ import "./chunk-K3NQKI34.js";
18
+ export {
19
+ aiComplete,
20
+ getAiConfig,
21
+ getAvailableModels,
22
+ getConfiguredProviders,
23
+ getEnabledModels,
24
+ isAiConfigured,
25
+ removeAiConfig,
26
+ removeProviderConfig,
27
+ saveProviderConfig,
28
+ setEnabledModels
29
+ };