@stackbone/cli 0.8.0 → 0.9.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/CHANGELOG.md +86 -0
- package/main.js +1203 -531
- package/package.json +1 -1
- package/stackbone-cli-0.9.1.tgz +0 -0
- package/voice-worker/main.js +374 -249
- package/voice-worker/main.js.map +3 -3
- package/stackbone-cli-0.8.0.tgz +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,92 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.1] - 2026-11-10
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **The thinking sound waits for a long reply.** The voice worker, the one
|
|
15
|
+
`stackbone dev` runs too, starts the thinking sound at once for a box tool
|
|
16
|
+
call, and for any other wait only once it passes the
|
|
17
|
+
`backgroundAudio.thinkingDelayMs` voice setting (default 2000 ms). Before,
|
|
18
|
+
it played on every reply, since every reply waits for the knowledge search
|
|
19
|
+
and the model's first token. Studio's Voice tab gets a **Thinking delay
|
|
20
|
+
(ms)** field. Deploy the worker on LiveKit Cloud before the boxes: an older
|
|
21
|
+
worker refuses a call whose settings carry the delay.
|
|
22
|
+
- **The box's missing-credentials messages name the Voice provider screen.**
|
|
23
|
+
A call or a voice status check on a box with no readable LiveKit
|
|
24
|
+
credentials now sends you to Studio's **Voice provider** screen, where the
|
|
25
|
+
credentials moved (STA3-89).
|
|
26
|
+
|
|
27
|
+
## [0.9.0] - 2026-11-10
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **The query rewrite is a card on Studio's System screen.**
|
|
32
|
+
`GET /api/internal-prompts` lists the query rewrite that
|
|
33
|
+
`stackbone.rag.retrieve({ rewrite })` runs, with its built-in prompt and the
|
|
34
|
+
model it falls back to: the `defaultModel` workspace setting, else
|
|
35
|
+
`openai/gpt-4o-mini`. Its prompt is edited and published through
|
|
36
|
+
`/api/prompts` like the other System prompts, and `/api/settings` takes
|
|
37
|
+
`rewriteModel` and `rewriteModelProviderId` (STA3-90).
|
|
38
|
+
- **Voice calls play background audio.** The box sends each call's
|
|
39
|
+
`backgroundAudio` voice setting to the voice worker, and the worker, the one
|
|
40
|
+
`stackbone dev` runs too, plays an ambience under the whole call and a
|
|
41
|
+
thinking sound while the agent works on a reply: the knowledge search, the
|
|
42
|
+
wait for the model's first token and any box tool call. Before, only a chime
|
|
43
|
+
played, and only during tool calls. By default a call plays
|
|
44
|
+
`office-ambience` at 0.7 and `keyboard-typing` at 0.6. Studio's Voice tab
|
|
45
|
+
gets a **Background audio** group. Deploy the worker on LiveKit Cloud before
|
|
46
|
+
the boxes: an older worker refuses every call from a box on this release,
|
|
47
|
+
while the new worker takes calls from an older box and plays the defaults.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- **A long hybrid query finds the chunks that hold several of its words.**
|
|
52
|
+
`stackbone rag query`, Studio's search dialog and
|
|
53
|
+
`POST /api/rag/collections/{name}/query` used to need every word of the
|
|
54
|
+
query in one chunk, so a long query found nothing by its exact terms. A query
|
|
55
|
+
of up to 3 words still needs all of them. From 4 words on, a chunk needs at
|
|
56
|
+
least 2 of them, `eur` and greetings or sign-offs (`hola`, `gracias`,
|
|
57
|
+
`saludo`, `regards`…) aside, and the chunks that hold more words rank first.
|
|
58
|
+
The response shape does not change. Splitting a text into one search per
|
|
59
|
+
question is an SDK option, `stackbone.rag.retrieve({ rewrite })`, that the box
|
|
60
|
+
route does not take (STA3-79).
|
|
61
|
+
- **On an OpenRouter box a decision model rules on the input guardrails.**
|
|
62
|
+
The content moderation, denied topics and prompt injection checks on a user
|
|
63
|
+
message (chat, voice and workflow input) are decided by `jev-1.13` in one
|
|
64
|
+
request to OpenRouter's `/systemone` endpoint. Each of these rules takes a
|
|
65
|
+
`threshold` from 0 to 1, default 0.7, that a score must reach to stop the
|
|
66
|
+
message; a lower value stops more. A value outside 0 to 1 fails the check.
|
|
67
|
+
The agent's reply is still judged by the checking model, which ignores the
|
|
68
|
+
threshold. When the decision model errors, takes longer than 1.5 seconds or
|
|
69
|
+
leaves a question unscored, the checking model decides and the box log says
|
|
70
|
+
why. A message the decision model stops carries the reason
|
|
71
|
+
`the decision model flagged it`, with no scores. A box on another provider,
|
|
72
|
+
or with no OpenRouter key, checks as before (STA3-58).
|
|
73
|
+
- **The box's own models follow the model provider when nobody picked one.**
|
|
74
|
+
The box lists the models its provider serves at boot and after every
|
|
75
|
+
provider save. The guardrail, eval judge and persona simulator models nobody
|
|
76
|
+
picked run on their code default while the provider serves it or the listing
|
|
77
|
+
has not answered, and on the `defaultModel` workspace setting when the
|
|
78
|
+
provider does not serve it. Studio's System screen shows that default, and the
|
|
79
|
+
memory card shows the one `memory.add` resolves the same way.
|
|
80
|
+
`POST /api/rag/collections` with no embedding model saves
|
|
81
|
+
`openai/text-embedding-3-small` as before, unless the provider does not serve
|
|
82
|
+
it: then the collection gets the first embedding model the provider serves,
|
|
83
|
+
probed for its dimension, and a provider that lists no embedding model
|
|
84
|
+
answers 400 `rag_embedding_model_required`. `stackbone rag collections create`
|
|
85
|
+
sends no embedding model, so it gets the same answer. An OpenRouter box keeps
|
|
86
|
+
today's models, and a model someone picked is never replaced (STA3-82).
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- **Rerank works from creator code in a box.** `retrieve({ rerank })` and
|
|
91
|
+
`client.ai.rerank.create` call the model through the box's model provider
|
|
92
|
+
proxy, which had no `rerank` route and answered 404, so every rerank fell
|
|
93
|
+
back to search order. The proxy now forwards it to the provider's `/rerank`,
|
|
94
|
+
and a model pinned to a provider goes to that provider (STA3-79).
|
|
95
|
+
|
|
10
96
|
## [0.8.0] - 2026-11-06
|
|
11
97
|
|
|
12
98
|
### Added
|