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.
Files changed (2) hide show
  1. package/CHANGELOG.md +219 -0
  2. 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synartesis",
3
- "version": "0.6.2",
3
+ "version": "0.6.11",
4
4
  "description": "An undo layer for AI agents.",
5
5
  "type": "module",
6
6
  "private": false,