@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 +147 -0
- package/main.js +14724 -11224
- package/migrations/0114_memory_person_id.sql +16 -0
- package/migrations/0115_memory_erased_person_keeps_no_identifier.sql +31 -0
- package/migrations/0116_rag_hybrid_search.sql +14 -0
- package/migrations/0117_rag_extract_fields.sql +3 -0
- package/migrations/0118_voice_outbound_calls.sql +29 -0
- package/migrations/0119_voice_call_metrics.sql +20 -0
- package/migrations/0120_run_steps_voice.sql +19 -0
- package/migrations/0121_model_routing.sql +28 -0
- package/package.json +1 -1
- package/stackbone-cli-0.8.0.tgz +0 -0
- package/voice-worker/main.js +299 -51
- package/voice-worker/main.js.map +4 -4
- package/stackbone-cli-0.7.0.tgz +0 -0
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
|