synartesis 0.6.2 → 0.6.11
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 +219 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,225 @@
|
|
|
2
2
|
|
|
3
3
|
What changed, and why it mattered. Dates are release dates.
|
|
4
4
|
|
|
5
|
+
## 0.6.11 — 2026-09-13
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **A conversation with Gemini died on the round after its first tool call.**
|
|
10
|
+
Gemini 3 signs the reasoning behind every function call it makes, and
|
|
11
|
+
refuses the next request outright if that signature does not come back on
|
|
12
|
+
the part it arrived on: `Function call is missing a thought_signature in
|
|
13
|
+
functionCall parts`. Nothing here was keeping it. The signature is now
|
|
14
|
+
carried through the loop and handed back untouched -- opaque, unread, and
|
|
15
|
+
never shown to anybody.
|
|
16
|
+
- **The same failure was waiting in the Claude adapter.** Passing thinking
|
|
17
|
+
blocks back is required when tools are in play, and the adapter was
|
|
18
|
+
rebuilding each assistant turn out of its text and its tool calls alone --
|
|
19
|
+
so the first tool call would have worked and the round after it would have
|
|
20
|
+
been a 400. The thinking blocks are kept in the order they were produced,
|
|
21
|
+
signature intact, and go back at the front of the turn they belong to.
|
|
22
|
+
- The loop between the two is what actually lost them, and now has a test of
|
|
23
|
+
its own: the adapters were each correct in isolation.
|
|
24
|
+
|
|
25
|
+
Nothing changes for OpenAI-compatible endpoints -- Mistral, Ollama, LM Studio,
|
|
26
|
+
vLLM, OpenAI itself. That protocol asks for nothing back, and inventing
|
|
27
|
+
something to send would be worse than sending nothing.
|
|
28
|
+
|
|
29
|
+
## 0.6.10 — 2026-09-13
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- **Every model is told where it is before anybody says anything.** A model
|
|
34
|
+
arrives knowing how to call tools and nothing about why these particular
|
|
35
|
+
ones behave the way they do -- so a held call reads as a malfunction and it
|
|
36
|
+
goes looking for a way around it. That is the one behaviour this product
|
|
37
|
+
cannot tolerate, and it was not the model's fault: nobody had told it. Now
|
|
38
|
+
it is told, in the same terms for Claude, Gemini, and anything on an
|
|
39
|
+
OpenAI-compatible endpoint, local models included. What Synartesis is, what
|
|
40
|
+
the recording is for, what the four classes mean, and the one rule -- never
|
|
41
|
+
reach for a different tool that does the same thing without being held.
|
|
42
|
+
- **Each tool carries its own class, in its own description.** `write_file`
|
|
43
|
+
now says it is reversible and that what it replaces is copied first;
|
|
44
|
+
`move_file` says it cannot be undone and will be held for approval; a tool
|
|
45
|
+
the policy does not describe says it is treated as the worst case. On the
|
|
46
|
+
tool rather than in the prompt, because that is where a model looks when it
|
|
47
|
+
is choosing between two tools that do nearly the same thing -- a note at the
|
|
48
|
+
top of a conversation is read once, this is read every time the list is.
|
|
49
|
+
- **The briefing is particular, not general.** It names the servers actually
|
|
50
|
+
connected, the session this conversation is recorded as, today's date, and
|
|
51
|
+
the calls that will stop and wait -- by name. "Some calls are held" cannot
|
|
52
|
+
be planned around; "fs.move_file is held" can.
|
|
53
|
+
|
|
54
|
+
## 0.6.9 — 2026-09-13
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **A rate limit is waited out rather than handed over.** Every hosted
|
|
59
|
+
provider refuses when requests arrive too fast, and every one of them says
|
|
60
|
+
how long to wait. A turn that fails on that has not gone wrong, it has
|
|
61
|
+
arrived early, and reading a paragraph of JSON and pressing send again is
|
|
62
|
+
the application failing to do something it knows exactly how to do. It now
|
|
63
|
+
waits the stated time and tries again, at most twice, and says so on its own
|
|
64
|
+
line while it waits -- a window that silently stalls for a minute is
|
|
65
|
+
indistinguishable from one that has hung. It will not retry after the model
|
|
66
|
+
has started speaking: a retry replays the request from the beginning, and
|
|
67
|
+
words already on screen would be said twice.
|
|
68
|
+
|
|
69
|
+
### Changed
|
|
70
|
+
|
|
71
|
+
- **A quota of zero is not a rate limit, and the difference is the whole
|
|
72
|
+
point.** A free Google key asking for a Pro model is told `limit: 0` and
|
|
73
|
+
"please retry in 23s" in the same breath. Both are true and only one is
|
|
74
|
+
useful: there is no allowance to come back to, so that retry succeeds on no
|
|
75
|
+
schedule at all. The window now separates them -- a spent quota says how
|
|
76
|
+
long to wait, a quota that was never there says to turn on billing or pick
|
|
77
|
+
another model, and nothing waits for it.
|
|
78
|
+
- **The presets start on models a new key can actually use.** Gemini pointed
|
|
79
|
+
at a Pro preview and Mistral at `mistral-large-latest`; a free Gemini key is
|
|
80
|
+
allowed none of the former and an entry Mistral key is refused the latter
|
|
81
|
+
outright. A preset is a first impression, and greeting somebody with a quota
|
|
82
|
+
refusal on their first message is a poor one. Gemini starts at
|
|
83
|
+
`gemini-3.8-flash` and Mistral at `mistral-small-latest`, with a note saying
|
|
84
|
+
what billing buys. Anyone already set up keeps what they chose.
|
|
85
|
+
- **Refusals name the model, not the adapter.** They read
|
|
86
|
+
"gemini-3.1-pro-preview", not "gemini:gemini-3.1-pro-preview".
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- The Gemini adapter's fallback model was `gemini-3-pro-preview`, which Google
|
|
91
|
+
retired. A default nobody set has to be one that answers.
|
|
92
|
+
|
|
93
|
+
## 0.6.8 — 2026-09-13
|
|
94
|
+
|
|
95
|
+
### Added
|
|
96
|
+
|
|
97
|
+
- **The model name can be changed in the window.** Every provider retires
|
|
98
|
+
models on its own schedule, and when one goes the request fails with a 404
|
|
99
|
+
naming its replacement. Until now the only way out was editing a JSON file
|
|
100
|
+
with the application closed, to keep using a service already paid for. The
|
|
101
|
+
sheet -- **Models and keys** now, since it does two jobs -- shows the name
|
|
102
|
+
each model points at and lets it be retyped. The key stays: it belongs to
|
|
103
|
+
the account, not to the model name.
|
|
104
|
+
|
|
105
|
+
### Changed
|
|
106
|
+
|
|
107
|
+
- **A provider's refusal arrives as a sentence.** Each of them says no in its
|
|
108
|
+
own dialect wrapped in its own JSON, and the window showed the wrapper. The
|
|
109
|
+
three that happen in practice now read plainly: a retired model says what
|
|
110
|
+
replaced it, a model the plan does not include says it is the plan, and a
|
|
111
|
+
refused key points at where keys are kept. The original text is kept
|
|
112
|
+
underneath, because a guess dressed as an explanation is worse than both.
|
|
113
|
+
|
|
114
|
+
Anything unrecognised is passed through exactly as it arrived.
|
|
115
|
+
|
|
116
|
+
- **Gemini's default is `gemini-3.1-pro-preview`**, which is what Google
|
|
117
|
+
replaced `gemini-3-pro-preview` with.
|
|
118
|
+
|
|
119
|
+
## 0.6.7 — 2026-09-13
|
|
120
|
+
|
|
121
|
+
### Fixed
|
|
122
|
+
|
|
123
|
+
- **A card no longer says a refused call cannot be undone.** A call that was
|
|
124
|
+
denied, or is still waiting for a person, changed nothing -- and the card
|
|
125
|
+
said "no way back recorded" about it, which reads as damage nobody can put
|
|
126
|
+
back. It now says nothing was applied, and why: refused before it reached
|
|
127
|
+
the system, or held and waiting for a decision. On this product, of all
|
|
128
|
+
products, that sentence has to be right.
|
|
129
|
+
|
|
130
|
+
- **The site could render blank where nothing is looking at it.** Sections
|
|
131
|
+
arrive as they are scrolled to, which an IntersectionObserver decides -- and
|
|
132
|
+
an observer only fires while the page is actually being rendered. A tab
|
|
133
|
+
loaded in the background is not: the browser suspends the lifecycle, the
|
|
134
|
+
callback never runs, and every hidden state stays hidden. Harmless when
|
|
135
|
+
somebody switches to the tab, and not harmless for anything that renders a
|
|
136
|
+
page without showing it. Three seconds with nothing arrived now shows the
|
|
137
|
+
page whole, finishing the states rather than starting them, since a
|
|
138
|
+
suspended tab freezes a transition where it stands.
|
|
139
|
+
|
|
140
|
+
### Changed
|
|
141
|
+
|
|
142
|
+
- **The logo in the empty room is the pale one**, so it sits on the page
|
|
143
|
+
rather than on a dark tile stuck to it. Same artwork, same generator.
|
|
144
|
+
|
|
145
|
+
- **A thousand lines of generated coordinates are gone.** Nothing had drawn
|
|
146
|
+
the mark from them since the logo became a file; the window, the icon and
|
|
147
|
+
the cards all show the picture now.
|
|
148
|
+
|
|
149
|
+
## 0.6.6 — 2026-09-13
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
|
|
153
|
+
- **The logo is a file now, and every surface shows that file.** 0.6.5 made
|
|
154
|
+
the drawings agree; this stops there being drawings. `brand/synartesis-mark-1080.png`
|
|
155
|
+
is the logo -- the framed mark with its fringe, on its ground -- and the
|
|
156
|
+
window, the site masthead, the favicon, the touch icon and the cards all
|
|
157
|
+
display it rather than rendering their own version at their own weight.
|
|
158
|
+
|
|
159
|
+
The window's mark stops spinning while a turn runs and breathes instead: a
|
|
160
|
+
frame going round and round reads as a fault rather than as work.
|
|
161
|
+
|
|
162
|
+
## 0.6.5 — 2026-09-13
|
|
163
|
+
|
|
164
|
+
### Changed
|
|
165
|
+
|
|
166
|
+
- **One logo, everywhere.** The mark is generated -- one set of numbers behind
|
|
167
|
+
the window, the application icon, the site and the cards on the README --
|
|
168
|
+
but three surfaces had been drawing their own version of it instead: the
|
|
169
|
+
rail beside the wordmark, the site masthead and favicon, and the brand PNGs
|
|
170
|
+
each had a hand-drawn circle with an arrow that resembled the mark without
|
|
171
|
+
being it.
|
|
172
|
+
|
|
173
|
+
They now all show the generated one. Where the fan of five hundred
|
|
174
|
+
hairlines cannot survive -- a favicon, a 22px rail -- the generator emits
|
|
175
|
+
the identical geometry filled rather than combed, so it is the same glyph at
|
|
176
|
+
a different weight rather than a different drawing. `brand/mark.html` draws
|
|
177
|
+
nothing of its own any more; it displays `synartesis-logo.svg`, which the
|
|
178
|
+
generator writes.
|
|
179
|
+
|
|
180
|
+
## 0.6.4 — 2026-09-13
|
|
181
|
+
|
|
182
|
+
### Changed
|
|
183
|
+
|
|
184
|
+
- **The API keys sheet gives the key a line of its own.** Somebody opens that
|
|
185
|
+
sheet to do exactly one thing, and the field for it was squeezed into a
|
|
186
|
+
column beside a paragraph of prose, sharing a row with the model's name and
|
|
187
|
+
its note -- while a key is sixty characters or more. The row now explains
|
|
188
|
+
itself on top and the field runs the full width underneath, with a Cancel
|
|
189
|
+
that did not exist before, Escape to leave, a wider sheet and room between
|
|
190
|
+
the rows.
|
|
191
|
+
|
|
192
|
+
### Added
|
|
193
|
+
|
|
194
|
+
- **A test for the half the other key tests did not cover.** They prove a key
|
|
195
|
+
never reaches disk, a log, or the window -- all of which would still be true
|
|
196
|
+
of a key quietly dropped on the way to the provider. This one follows it in
|
|
197
|
+
through the sheet, through the keychain seam, and back out as the value the
|
|
198
|
+
request is built with.
|
|
199
|
+
|
|
200
|
+
### Fixed
|
|
201
|
+
|
|
202
|
+
- **A transient API error no longer sinks a release.** Nine installers built
|
|
203
|
+
and none were published, because the single call that creates the release
|
|
204
|
+
answered 500 once. Creating and uploading are retried.
|
|
205
|
+
|
|
206
|
+
## 0.6.3 — 2026-09-13
|
|
207
|
+
|
|
208
|
+
### Fixed
|
|
209
|
+
|
|
210
|
+
- **The packaged desktop application could not start.** It opened and died on
|
|
211
|
+
its first import with `Cannot find package '@modelcontextprotocol/sdk'`.
|
|
212
|
+
The bundler keeps a package.json's `dependencies` out of the bundle, which
|
|
213
|
+
is right for a library -- whoever installs it gets them -- and wrong for an
|
|
214
|
+
application that ships as one file plus one native binding. The MCP SDK,
|
|
215
|
+
`yaml` and `zod` were left as bare imports and nothing supplied them. Every
|
|
216
|
+
0.6.2 installer has this; this release is the fix.
|
|
217
|
+
|
|
218
|
+
The packaging script now refuses to pack a bundle whose top-level imports
|
|
219
|
+
are not shipped with it. Electron, the native binding and node builtins are
|
|
220
|
+
supplied; anything else has to be inside. Only top-level imports are
|
|
221
|
+
checked, deliberately: bundled libraries carry guarded `require`s for
|
|
222
|
+
optional native accelerators, and those are allowed to be absent.
|
|
223
|
+
|
|
5
224
|
## 0.6.2 — 2026-09-12
|
|
6
225
|
|
|
7
226
|
### Fixed
|