@stackbone/cli 0.7.0 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,153 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] - 2026-11-06
11
+
12
+ ### Added
13
+
14
+ - **`stackbone build` and `dev` record each agent key's `modelRouting`.** The
15
+ model inventory now carries the `modelRouting` literal an agent and each of
16
+ its subagents write, so Studio's Models block shows the code's provider
17
+ routing next to the one an operator picks. A value OpenRouter does not take
18
+ is warned about, with its file and line.
19
+ - **Recurring jobs hides the platform's own timers.** Studio's Recurring jobs
20
+ screen now shows only the workflow crons by default; intake link polling and
21
+ the box's sweeps appear when **System entries** is on, as on Catalog, Runs and
22
+ Sessions. A banner counts the hidden ones that are overdue, not armed or
23
+ failed, so a stuck intake poll still shows. `GET /api/recurring-jobs`
24
+ returns `system` on every row; an older box leaves it out and Studio shows
25
+ the row (STA3-71).
26
+ - `stackbone dev` and `stackbone build` seed the `rag-extract` managed workflow
27
+ for Studio's document value proposals. A creator can override the default in
28
+ `workflows/rag-extract.workflow.ts` (STA3-67).
29
+ - **The box places outbound calls for `placeCall`.** A workflow's `placeCall`
30
+ opens a LiveKit room, dispatches the voice worker and dials the number
31
+ through the trunk in the box secret `LIVEKIT_SIP_OUTBOUND_TRUNK_ID`, with
32
+ `LIVEKIT_SIP_CALLER_ID` as the optional caller id. The agent's model is
33
+ warmed while the phone rings. An answered call is kept until the worker
34
+ reports its end, then the box starts the `onEnd` workflow once. A 30-second
35
+ sweep ends a call as `failed` when its room is gone past a grace period or
36
+ it outlived its call token; the sweep is a system entry on Recurring jobs.
37
+ Migration 0118 adds the calls table (STA3-56).
38
+ - **Each turn of a call is timed on the run that answered it.** The voice
39
+ worker reports the latencies of every answered turn, and the box writes them
40
+ as `voice` steps on that run (**Wait**, then **End of turn**, **Speech to
41
+ text**, **Box**, **Model first token**, **Text to speech** and **Audio
42
+ out**), which Studio draws in the run's trace. Migration 0119 stores the
43
+ latencies and 0120 adds the `voice` step type. `stackbone dev` prints one
44
+ `Voice turn` line per answered turn with the same numbers (STA3-56).
45
+ - **Hybrid search hits say which search found them.**
46
+ `POST /api/rag/collections/{name}/query` returns optional `dense_rank` and
47
+ `lexical_rank` on each hit of a hybrid `text` query: its 1-based position in
48
+ the search by meaning and in the exact-term search, before fusion. A search
49
+ that did not find the hit omits its rank; `hybrid: false`, an `embedding`
50
+ query and an older box return none. `stackbone rag query --json` shows them,
51
+ the table output does not change, and Studio's search dialog labels a hit
52
+ `meaning`, `exact` or `both` (STA3-66).
53
+ - **`rag.previousExchanges` sets how much of the call the knowledge search
54
+ reads.** A voice agent's knowledge search sends the last N exchanges of the
55
+ call (caller question and the reply they heard), oldest first, before the
56
+ caller's sentence. It takes 0 to 5 and defaults to 1, which sends the same
57
+ query as before; 0 searches the sentence alone. Studio's voice settings
58
+ override the code (STA3-76).
59
+
60
+ ### Changed
61
+
62
+ - **A voice turn's knowledge search reads the previous exchange.** A follow-up
63
+ such as "¿y los plazos?" names nothing on its own, so the search now carries
64
+ the caller's previous searched question and the reply they heard, after the
65
+ output guardrails. A filler turn, or one that failed before speaking, keeps
66
+ the exchange that held the context (STA3-64).
67
+ - **A voice agent with a knowledge collection only states facts it can
68
+ source.** Every turn of such a call adds a rule to the prompt: a price, date,
69
+ instalment, name or duration comes from the knowledge found for the turn, the
70
+ agent's instructions, a tool result, or an earlier fact of the call the
71
+ caller said or the agent sourced; otherwise the agent tells the caller an
72
+ advisor will confirm it. The rule
73
+ applies even when the search found nothing, and a turn resumed after a tool
74
+ approval keeps it, whether decided in Studio, by the timeout sweep or after a
75
+ box restart. A call without a collection sends the same prompt as before
76
+ (STA3-64).
77
+ - **Voice knowledge search fetches 5 passages by default instead of 3.** At 3,
78
+ a question that asks two things often found the answer to only one
79
+ (STA3-72).
80
+ - **Phone callers get LiveKit's telephony noise model.** Their audio is 8 kHz,
81
+ and the full-band model muffled it and held turns back. With Deepgram Flux
82
+ deciding the turn, the worker now reports how long Flux's decision took to
83
+ reach it as the end of turn, which LiveKit reports as 0 (STA3-56).
84
+
85
+ ### Fixed
86
+
87
+ - **A reply blocked by an output guardrail on a voice call speaks the refusal
88
+ phrase.** The caller used to hear the guardrail's reason read aloud. The
89
+ call's `refusalPhrase`, the same one an input guardrail speaks, now replaces
90
+ it; text chat and the run's step keep the reason. A resume with no live call
91
+ keeps the reason, since nobody hears it (STA3-59).
92
+
93
+ ## [0.7.1] - 2026-11-04
94
+
95
+ ### Added
96
+
97
+ - `stackbone rag ingest --metadata '<json object>'` sets document values, and
98
+ `stackbone rag query --filter '<json object>' --ranges '<json array>'` filters
99
+ retrieval by containment and number/date bounds. Invalid flags fail locally
100
+ with a suggestion before file reads or requests (STA3-61).
101
+
102
+ - **`stackbone rag collections create <name> --hybrid`: hybrid search for codes
103
+ and names.** A hybrid collection answers a text query with a search by
104
+ meaning and a search for the exact terms of the query, merged by reciprocal
105
+ rank fusion, so a product code such as `1239asd/OK` finds its product.
106
+ `--number-format eu|us` sets how the collection reads prices and dates
107
+ (`eu` by default). An unknown format fails before the request.
108
+ `stackbone rag query --no-hybrid` searches by meaning only, and with `--json`
109
+ each hit of a hybrid query carries `mixed_score` next to `score`, which stays
110
+ the similarity by meaning. A create without the flags sends the same request
111
+ as before, so an older box still accepts it (STA3-57).
112
+ - **Hybrid search in the box.** `POST /api/rag/collections` accepts
113
+ `hybrid_enabled` and `number_format`, `GET /api/rag/collections` returns them,
114
+ and `POST /api/rag/collections/{name}/query` takes `hybrid: false` and returns
115
+ `mixed_score` on a hybrid search. Migration 0116 adds the columns and the
116
+ index; hybrid stays off on every existing collection. Studio's new-collection
117
+ dialog gets a **Hybrid search** toggle and a **Number and date format**
118
+ select, and says when a box ignored them (STA3-57).
119
+ - **`stackbone rag collections update <name>`: change hybrid search on an
120
+ existing collection.** `--hybrid` or `--no-hybrid` turns it on or off and
121
+ `--number-format eu|us` changes the format; a flag left out keeps its value,
122
+ and a command with none fails before the request. The command prints
123
+ `Rebuilding collection <name>…` on stderr, waits for the box, and fails when
124
+ the answer does not confirm the settings sent. A box older than the command
125
+ answers exit `4` with "update the box" (STA3-57).
126
+ - **Changing hybrid search in the box.** `PATCH /api/rag/collections/{name}`
127
+ takes `hybrid_enabled`, `number_format` or both. The collection pauses as
128
+ `rebuilding`, so searches and ingests into it answer 409
129
+ `rag_collection_unavailable`, while the box recomputes every chunk's exact
130
+ terms from its stored text, with no embedding call; turning hybrid off clears
131
+ them. It answers 200 with the settings once the collection is ready, 409 while
132
+ an embedding rebuild or another change holds it, and 500 when the recompute
133
+ fails, which leaves the collection failed until the same change is sent
134
+ again. An embedding rebuild of a hybrid collection now keeps the exact terms.
135
+ Studio's collection screen gets **Edit search settings**, which shows the
136
+ collection rebuilding until the box answers (STA3-57).
137
+ - **Hybrid search reads prices and dates by the collection's number format.**
138
+ On an `eu` collection, `1250 euros` finds `1.250,00 €`,
139
+ `3 de noviembre de 2026` finds `03/11/2026`, and `3 de noviembre` finds it in
140
+ any year. On `us`, `03/11/2026` is March 11 and `1,250.00 €` is the amount.
141
+ Dates with a Spanish or English month name read the same in both formats,
142
+ and the euro is the only currency read. A number format change with
143
+ `rag collections update --number-format` now changes which chunks a date or
144
+ a price finds. A hybrid collection indexed before this release keeps its old
145
+ exact terms until its search settings are saved again
146
+ (`rag collections update` with its current settings, or Save in Studio) or
147
+ its embeddings are rebuilt (STA3-57).
148
+
149
+ ### Changed
150
+
151
+ - **Connector credentials from before CLI 0.6.1 must be reconnected.**
152
+ `stackbone dev` no longer moves grants written under the old shared dev key
153
+ onto the box's own key; it removes them at boot and Studio asks to reconnect
154
+ them. A box with neither its own Connect keys nor an install identity now
155
+ refuses to boot (STA3-43).
156
+
10
157
  ## [0.7.0] - 2026-10-30
11
158
 
12
159
  ### Added