volute 0.29.0 → 0.30.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.
Files changed (122) hide show
  1. package/README.md +112 -13
  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 +351 -477
  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-KTPOR2JT.js → chat-TCUNPFGO.js} +8 -8
  9. package/dist/{chunk-FLZGS4QH.js → chunk-2C2VXEBB.js} +2 -2
  10. package/dist/chunk-2NDZC3S7.js +1330 -0
  11. package/dist/{chunk-IKRVFPWU.js → chunk-7D47T4RB.js} +3 -2
  12. package/dist/{chunk-AW7PFDVN.js → chunk-CVH6Y2YG.js} +1 -1
  13. package/dist/{chunk-XBLSAVJF.js → chunk-DTC6EH5I.js} +1 -1
  14. package/dist/{chunk-THUUIU3E.js → chunk-EFP3PE6C.js} +5 -5
  15. package/dist/{chunk-JGFVMROS.js → chunk-EFVHR7KH.js} +1 -1
  16. package/dist/{chunk-CQ7SNKNI.js → chunk-FSM45XD5.js} +1 -1
  17. package/dist/{chunk-LAC664WU.js → chunk-FXHXHI2A.js} +42 -24
  18. package/dist/{chunk-RKQEHRBB.js → chunk-G3GBKZGG.js} +1 -1
  19. package/dist/{chunk-H7OZRFJB.js → chunk-HHTXM4JT.js} +0 -49
  20. package/dist/{chunk-J4IBNXGJ.js → chunk-IKHDUZRH.js} +4 -3
  21. package/dist/{chunk-MD4C26II.js → chunk-JGFRDMR6.js} +1 -1
  22. package/dist/{chunk-EHZKEMMV.js → chunk-LIRWLNAK.js} +24 -10
  23. package/dist/{chunk-NI5FFCCS.js → chunk-MDPCSXZ4.js} +35 -11
  24. package/dist/chunk-NSBFETWP.js +188 -0
  25. package/dist/{chunk-VIVMW2H2.js → chunk-P27RV5WM.js} +1 -1
  26. package/dist/{chunk-EHYDTZTF.js → chunk-P7VFDSSG.js} +2 -2
  27. package/dist/{chunk-CMILSHZD.js → chunk-QVAQ5454.js} +84 -300
  28. package/dist/{chunk-HDN7MNGD.js → chunk-S5LR3XYJ.js} +1 -1
  29. package/dist/{chunk-2YP2TVDT.js → chunk-UPA6COHU.js} +5 -5
  30. package/dist/{chunk-AKPFNL7L.js → chunk-VGWJSNHS.js} +1 -1
  31. package/dist/{chunk-DUAUMCEE.js → chunk-W5OOPLNP.js} +3 -3
  32. package/dist/{chunk-2WPW7OT6.js → chunk-ZWKTUQEL.js} +1 -1
  33. package/dist/cli.js +22 -26
  34. package/dist/{clock-DGCBVGYA.js → clock-G3ALCMLJ.js} +10 -6
  35. package/dist/{cloud-sync-KILFGV5Q.js → cloud-sync-JV4LJOK3.js} +13 -12
  36. package/dist/{conversations-P5BL7RMX.js → conversations-7KVQV7EZ.js} +3 -3
  37. package/dist/{create-DFCAGEE5.js → create-JTLS7GX3.js} +2 -2
  38. package/dist/{create-QWV73WXD.js → create-VQSQHJQW.js} +1 -1
  39. package/dist/{daemon-client-I42FK2BF.js → daemon-client-BCTFGVCZ.js} +2 -2
  40. package/dist/{daemon-restart-UHOMICXT.js → daemon-restart-4JGBHEJ4.js} +7 -7
  41. package/dist/daemon.js +1257 -1022
  42. package/dist/{db-IC4J52XQ.js → db-HMFPIRO2.js} +1 -1
  43. package/dist/{delete-4JYGD4VN.js → delete-JESHKE7F.js} +1 -1
  44. package/dist/down-NGBMGORS.js +14 -0
  45. package/dist/{env-YJMUMFIY.js → env-CLXXT7M2.js} +2 -2
  46. package/dist/{export-BOJQWBMA.js → export-EGA5M5PB.js} +3 -3
  47. package/dist/extension-WZ4SUPJB.js +174 -0
  48. package/dist/extensions-ECO4RPFQ.js +27 -0
  49. package/dist/{files-M546TKVN.js → files-4VEJDASH.js} +3 -3
  50. package/dist/{history-ALPTNB3I.js → history-EJMMLXDO.js} +17 -2
  51. package/dist/{import-SRTQXBGH.js → import-YCGPMBSI.js} +3 -3
  52. package/dist/{join-J4QU42DL.js → join-2GBJKZEN.js} +1 -1
  53. package/dist/{list-R73GENNL.js → list-Q6O7FGAN.js} +2 -2
  54. package/dist/{login-3QZNR2DF.js → login-RET5WESK.js} +2 -2
  55. package/dist/{login-BKP3AFWN.js → login-RL6AU2SM.js} +3 -3
  56. package/dist/{logout-T53VKCPU.js → logout-CGAGJN3L.js} +2 -2
  57. package/dist/{logout-IQK7FNEK.js → logout-JRPBEMMR.js} +3 -3
  58. package/dist/message-delivery-6YMVNOEC.js +28 -0
  59. package/dist/{migrate-registry-to-db-XC7T5B7P.js → migrate-registry-to-db-FK35IPEH.js} +1 -1
  60. package/dist/{mind-S5V6CK5W.js → mind-LUWRQUQ5.js} +17 -17
  61. package/dist/{mind-activity-tracker-WRHFI3YW.js → mind-activity-tracker-VYN2ZZ2M.js} +3 -3
  62. package/dist/{mind-list-UPJ75GPI.js → mind-list-V5WW5DUA.js} +2 -2
  63. package/dist/{mind-manager-P66HQDNE.js → mind-manager-YFCOIAAX.js} +6 -6
  64. package/dist/{mind-sleep-BTSWQNAC.js → mind-sleep-R6PTNNW4.js} +2 -2
  65. package/dist/{mind-status-TK5AETEM.js → mind-status-I4ISFJ6I.js} +2 -2
  66. package/dist/{mind-wake-SBAKIDVP.js → mind-wake-67ZQEWAV.js} +2 -2
  67. package/dist/{package-OFKXNKJF.js → package-OYUD4ZJ4.js} +12 -6
  68. package/dist/{pages-watcher-P7QECRE2.js → pages-watcher-Z3PKNROC.js} +3 -3
  69. package/dist/{read-36UFXN3G.js → read-WQMPTSN2.js} +2 -2
  70. package/dist/{register-CHREOMJ3.js → register-NZDSTLP3.js} +3 -3
  71. package/dist/{registry-NDNOOYG4.js → registry-ODSALQQL.js} +1 -1
  72. package/dist/{reject-LXIZFJ4Q.js → reject-2HZOJEIJ.js} +2 -2
  73. package/dist/{restart-6ESL3NBO.js → restart-QHS3NT64.js} +2 -2
  74. package/dist/{sandbox-5BW5HPXM.js → sandbox-O5FUSF43.js} +3 -3
  75. package/dist/{seed-SSUCYYDF.js → seed-WUQMPLDM.js} +1 -1
  76. package/dist/{send-TAOEZ4NH.js → send-OAN3RYYY.js} +20 -6
  77. package/dist/{setup-JHL5ZEST.js → setup-QMDK5RZX.js} +2 -2
  78. package/dist/{setup-RXYVGGT7.js → setup-XJH3E7YM.js} +45 -14
  79. package/dist/{skill-AUAQTSP5.js → skill-FZIN4W4Q.js} +65 -3
  80. package/dist/skills/volute-mind/SKILL.md +10 -19
  81. package/dist/sleep-manager-O7YQFCV5.js +30 -0
  82. package/dist/{split-TKJ5OT3P.js → split-EXYGGGQN.js} +1 -1
  83. package/dist/{sprout-UNT7LKKE.js → sprout-AXQ6H5DB.js} +8 -7
  84. package/dist/{start-EUJSS5R4.js → start-MTOVL6SY.js} +2 -2
  85. package/dist/{status-NQJYR4BG.js → status-ZRO37MWR.js} +5 -5
  86. package/dist/{stop-3XAITBBF.js → stop-OK5WEPVC.js} +2 -2
  87. package/dist/{systems-SMEFSHTA.js → systems-W3BBMSOZ.js} +5 -5
  88. package/dist/{tailscale-NY5MUMY3.js → tailscale-BM72RXCJ.js} +1 -1
  89. package/dist/{template-hash-BIMA4ILT.js → template-hash-3HOR4UAJ.js} +1 -1
  90. package/dist/up-BXUAIDXB.js +17 -0
  91. package/dist/{update-PTSH22AZ.js → update-PLPHMMZ2.js} +5 -5
  92. package/dist/{update-check-64FWC4Y2.js → update-check-CVCN7MF6.js} +2 -2
  93. package/dist/{upgrade-HA47CS4C.js → upgrade-I6NPCYUU.js} +1 -1
  94. package/dist/{version-notify-WDHRO3XD.js → version-notify-2NTWVEHL.js} +15 -14
  95. package/dist/web-assets/assets/index--kREqKl9.js +72 -0
  96. package/dist/web-assets/assets/index-BXYTG0nJ.css +1 -0
  97. package/dist/web-assets/ext-theme.css +111 -0
  98. package/dist/web-assets/index.html +2 -2
  99. package/package.json +12 -6
  100. package/packages/extensions/notes/dist/ui/assets/index-DgawVO5g.css +1 -0
  101. package/packages/extensions/notes/dist/ui/assets/index-qUWoeC4c.js +2 -0
  102. package/packages/extensions/notes/dist/ui/index.html +14 -0
  103. package/packages/extensions/notes/skills/notes/SKILL.md +62 -0
  104. package/packages/extensions/notes/skills/notes/scripts/notes.mjs +185 -0
  105. package/packages/extensions/pages/dist/ui/assets/index-D0HyS-xQ.css +1 -0
  106. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +2 -0
  107. package/packages/extensions/pages/dist/ui/index.html +14 -0
  108. package/packages/extensions/pages/skills/pages/SKILL.md +58 -0
  109. package/templates/_base/home/VOLUTE.md +1 -1
  110. package/dist/chunk-P72MVS4R.js +0 -188
  111. package/dist/chunk-ZYGKG6VC.js +0 -22
  112. package/dist/down-LVBXEULC.js +0 -14
  113. package/dist/message-delivery-Q7VUMIEI.js +0 -27
  114. package/dist/notes-XCER3I7M.js +0 -220
  115. package/dist/pages-EUJR52AH.js +0 -36
  116. package/dist/publish-ZZB33WP4.js +0 -86
  117. package/dist/skills/notes/SKILL.md +0 -34
  118. package/dist/sleep-manager-G4B5GW5P.js +0 -29
  119. package/dist/status-S7UUPNRW.js +0 -38
  120. package/dist/up-W6VAK2XE.js +0 -17
  121. package/dist/web-assets/assets/index-BmKDnWDB.css +0 -1
  122. package/dist/web-assets/assets/index-CLJMx-GA.js +0 -71
package/README.md CHANGED
@@ -177,7 +177,7 @@ volute clock remove --mind atlas --id <schedule-id>
177
177
 
178
178
  ## Pages
179
179
 
180
- 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).
181
181
 
182
182
  ### Setup
183
183
 
@@ -189,20 +189,16 @@ volute systems register --name my-system
189
189
  volute systems login --key vp_...
190
190
  ```
191
191
 
192
- ### Publishing
192
+ ### How it works
193
193
 
194
- ```sh
195
- volute pages publish --mind atlas
196
- # Published 3 file(s) to https://my-system.volute.systems/~atlas/
197
- ```
198
-
199
- The command uploads everything in the mind's `home/pages/` directory. Minds can publish their own pages since `VOLUTE_MIND` is set automatically.
200
-
201
- ### 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
202
199
 
203
200
  ```sh
204
- volute pages status --mind atlas # show published URL, file count, last publish time
205
- volute systems logout # remove stored credentials
201
+ volute systems logout # remove stored credentials
206
202
  ```
207
203
 
208
204
  ## Environment variables
@@ -220,13 +216,102 @@ volute env remove API_KEY
220
216
 
221
217
  The daemon serves a web UI at `http://localhost:1618` (or whatever port you chose).
222
218
 
223
- - Real-time chat with full tool call visibility
219
+ - Real-time chat with full tool call visibility and turn summaries
224
220
  - File browser and editor
225
221
  - Log streaming
226
222
  - Connector and schedule management
227
223
  - Variant listing and status
224
+ - System settings: AI service config, system prompts, shared files, skills, user management
228
225
  - First user to register becomes admin
229
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
+
230
315
  ## Upgrading minds
231
316
 
232
317
  When the Volute template updates, you can upgrade minds without touching their identity:
@@ -254,6 +339,20 @@ Two built-in templates:
254
339
  volute mind create atlas --template pi
255
340
  ```
256
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
+
257
356
  ## Model configuration
258
357
 
259
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
+ };