friend-assistant 0.1.49 → 0.1.50

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 CHANGED
@@ -192,7 +192,8 @@ Type `/` in the message bar for a list that narrows as you type; they run on the
192
192
  | `/plugins` | Opens the plugins. |
193
193
  | `/voice` | Opens voice enrolment. |
194
194
  | `/camera on`, `/camera off` | Switches the camera. It only takes a picture when you approve. |
195
- | `/mute`, `/unmute` | Hides or shows everything on the stage. |
195
+ | `/mute`, `/unmute` | Hides or shows everything on the stage. Remembered on this device. |
196
+ | `/quiet`, `/speak` | Stops Friend speaking aloud (it still writes its answers, so you read the captions and the chat), or lets it speak again. Instant, no restart, remembered on this device. |
196
197
  | `/clear` | Takes everything off the screen. |
197
198
  | `/status` | Says what Friend is doing right now. |
198
199
  | `/logout` | Signs out on this screen. |
@@ -210,7 +211,7 @@ pnpm friend start # gateway + local device node, http://127.0.0.1:8787
210
211
 
211
212
  Sign-in is guarded against guessing: after **three wrong passwords** (or PINs) from one address, that address is locked for a minute, and every wrong try after that doubles the wait (up to an hour). The sign-in screen shows the tries left and a countdown, and even the right password waits out a lock. Many addresses together are limited too. A refresh never shows any part of the home screen before sign-in: the page asks the server first and draws only the sign-in screen until you are in.
212
213
 
213
- Open the address in a browser, sign in, and press any key to talk. Press `Esc` (or long-press the top-left corner) for the owner menu: mute stage, log out, emergency lock.
214
+ Open the address in a browser, sign in, and press any key to talk. Press `Esc` (or long-press the top-left corner) for the owner menu: voice on/off, mute stage, log out, emergency lock.
214
215
 
215
216
  Preview the whole look with no API key and no network: `pnpm build && pnpm demo`, then open the printed address. Each message you send shows the next scene (gauges and charts, a timeline, a graph, the orb and ring voice styles, a warm mood).
216
217
 
@@ -263,7 +264,7 @@ When it notices something you repeat, the AI may suggest a **skill** (instructio
263
264
  - **Status line (bottom-left):** always shows what Friend is doing in plain words: Ready, Listening, Understanding what you said, Thinking, Getting the weather for Pune, Creating a view, Running a command, Answering, Waiting for your approval, Reconnecting. It never shows command text or arguments.
264
265
  - **Clock (bottom-right):** a small date and time, so the screen is never empty.
265
266
  - **Settings (Esc, then Settings):** change the model provider (Claude subscription through Claude Code, Claude API key, or local Ollama), the model names, the fallback, the Ollama address, and the voice options without the terminal. A change is used straight away (no restart) except the speaking voice and listening model. Saving needs your PIN. The API key is write-only: it is never sent back to the screen. Network address, folders and safety rules are deliberately not in this screen; use `friend config set` for those.
266
- - **Slash commands:** type `/` in the message bar for a list that narrows as you type (arrows or Tab to pick, Enter to run): /settings, /plugins, /voice, /camera on|off, /mute, /unmute, /clear, /status, /logout, /lock, /help. They run on the screen and never go to the AI, so they work instantly and even when the model is down. Start a line with // to send a message that begins with a slash.
267
+ - **Slash commands:** type `/` in the message bar for a list that narrows as you type (arrows or Tab to pick, Enter to run): /settings, /plugins, /voice, /camera on|off, /mute, /unmute, /quiet, /speak, /clear, /status, /logout, /lock, /help. They run on the screen and never go to the AI, so they work instantly and even when the model is down. Start a line with // to send a message that begins with a slash.
267
268
  - **PIN with the keyboard:** wherever a PIN is asked for, type the digits, Backspace to correct, Enter to confirm (Enter never deletes your voice; that needs a click). The on-screen keys still work for touch.
268
269
  - **The AI knows the screen:** its instructions include a layout guide (what is always on screen, the five regions, how to compose one answer, how long things should stay), and every request tells it what is on screen, where, for how long, and which regions are free. If it puts something on top of another object or over the captions, status line or clock, Friend moves it to a free spot (or the tidy auto grid) and tells it why, so it learns within the conversation. Nothing is refused.
269
270
  - **Voice presence look (Settings, tab "Voice presence", or `/look`):** the settings dialog is wide and has tabs: *Model*, *Voice* and *Voice presence*. On the last one you choose a **theme** (Aurora, Ocean, Ember, Violet storm, Matrix, Rose, Ghost) with one click, or set everything yourself: the **shape** (sphere, orb, ring), the **colour** (swatches or any colour), **brightness**, **size**, how strongly it **reacts to the voice**, the soft **glow** behind everything, whether the live **captions** show and how big they are, and the **view**. A live preview shows the result before you save. Saving a change of look needs **no PIN**, and every open screen changes at once. *Let the AI change the shape, colour and brightness to suit a topic* can be switched off to keep exactly the look you chose (you can still ask it "make it purple" yourself). Pressing the colour box also works; the colour must be a plain #rrggbb.
package/dist/BUILD.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "friend-assistant",
3
- "version": "0.1.49",
4
- "builtAt": "2026-10-13T15:50:56.071Z"
3
+ "version": "0.1.50",
4
+ "builtAt": "2026-10-15T10:06:01.854Z"
5
5
  }
package/dist/friend.mjs CHANGED
@@ -14810,7 +14810,7 @@ function currentSelf() {
14810
14810
  // ../server/src/system/npm.ts
14811
14811
  import { spawn as spawn7 } from "node:child_process";
14812
14812
  var PACKAGE = "friend-assistant";
14813
- var runningVersion = () => true ? "0.1.49" : "development";
14813
+ var runningVersion = () => true ? "0.1.50" : "development";
14814
14814
  async function npmLatest(fetchFn = fetch, timeoutMs = 1e4) {
14815
14815
  try {
14816
14816
  const res = await fetchFn(`https://registry.npmjs.org/${PACKAGE}/latest`, { headers: { accept: "application/json" }, signal: AbortSignal.timeout(timeoutMs) });
@@ -19522,7 +19522,7 @@ import { appendFileSync } from "node:fs";
19522
19522
  import { join as join25 } from "node:path";
19523
19523
  var PACKAGE2 = "friend-assistant";
19524
19524
  var real2 = {
19525
- current: () => true ? "0.1.49" : "development",
19525
+ current: () => true ? "0.1.50" : "development",
19526
19526
  latest: () => new Promise((resolve13) => {
19527
19527
  const child = crossSpawn5("npm", ["view", PACKAGE2, "version", "--prefer-online"], { stdio: ["ignore", "pipe", "ignore"] });
19528
19528
  let out = "";
@@ -19837,7 +19837,7 @@ async function run(argv, io2) {
19837
19837
  case "version":
19838
19838
  case "--version":
19839
19839
  case "-v":
19840
- io2.out(true ? "0.1.49" : "development");
19840
+ io2.out(true ? "0.1.50" : "development");
19841
19841
  return 0;
19842
19842
  case "lan":
19843
19843
  return await lanCommand(rest, io2);