You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b4cf6c9
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: CHANGELOG.md
+48-8Lines changed: 48 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,14 +8,54 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged.
8
8
9
9
## Unreleased
10
10
11
-
### A sandboxed component cannot be saved with a blank title
12
-
13
-
`POST /api/sandboxed` accepted a title of spaces. The slug has a pattern of its own and refuses one,
14
-
but the title is a separate field with no check, so the component reached the grid with nothing to
15
-
read: an administrator could not tell it from the next one, and a Bot granted it was told the
16
-
component is called " ". The title is now trimmed, and one that is only whitespace is refused the
17
-
way a missing one always was. The two endpoints of the same shape, `POST /api/servers/custom` and
18
-
`POST /api/skills`, already did this.
11
+
### Wiping a computer is recorded even if clearing its stored state fails
12
+
13
+
Resetting a computer destroys the profile first and wrote the audit row last, after two Postgres
14
+
deletes. A connection reset, a failover or a statement timeout in either delete threw before the row
15
+
was written, so the most destructive button in the product could leave a wiped computer -- every
16
+
login gone, no undo -- with nothing on the trail to say who wiped it or when. The row is now written
17
+
as soon as the profile is gone, which is the point after which nothing can be put back. A failure in
18
+
either delete is still reported to the caller.
19
+
### Pressing Stop is recorded as a stop, not as a computer that is not running
20
+
21
+
The computer transport answered a Stop correctly only when it arrived before the request left. The
22
+
caller's signal is handed to `fetch` precisely so a Stop can also land mid-action, and a fetch
23
+
aborted that way rejects with an `AbortError`, which fell through to the message for a computer that
24
+
cannot be reached. The person was told their own click had failed because the assistant's computer
25
+
was not running, and the gateway wrote that sentence into the action's audit row as its failure --
26
+
so a deliberate stop read back as an outage. A genuinely unreachable computer and a timeout still
27
+
say what they said.
28
+
### A component the server refused is no longer drawn anyway
29
+
30
+
A sandboxed component asks the server at call time whether the Bot may still use it, and a refusal
31
+
is recorded so the drawing can be replaced with a card saying so. The renderer looked that refusal
32
+
up under `props.toolCall.id`, which is the shape a tool HANDLER is given; a renderer's props carry
33
+
the id flat, as `toolCallId`. The lookup key was therefore always undefined, the refusal was never
34
+
found, and the component rendered as though it had been allowed -- so revoking a component from a
35
+
Bot did not take effect on screen until the five-second grant poll caught up, and a failed decision
36
+
request showed nothing at all.
37
+
### A component whose name has a stray space is the same component
38
+
39
+
The catalogue announcement asked whether each component's `name`, `title`, `kind` and `description`
40
+
were more than whitespace, and then published the untrimmed strings. A `name` is a component's
41
+
identity -- it is what `syncCatalogue` compares against what is already published, what `decide` and
42
+
`listForAgent` look up, and what a grant names -- so a build shipping `" weatherPanel "` added a
43
+
second catalogue row beside `weatherPanel`: published, ungranted by anybody, and impossible to hold
44
+
a Bot back from under the name people use. The four fields are now stored as the strings the guard
45
+
approved.
46
+
### A password with a `%` in it says so, instead of failing as `URI error`
47
+
48
+
`DATABASE_URL` is taken apart before it reaches Bun, and each part is percent-decoded. A part
49
+
holding a `%` that starts no escape -- `postgres://openbot:100%pure@host:5432/openbot`, which a
50
+
generated password produces often enough -- is a string `new URL` accepts and `decodeURIComponent`
51
+
rejects, so the server stopped with `URIError: URI error` and named neither the variable nor the
52
+
part. It now refuses with the same kind of sentence as every other malformed address: which part is
53
+
wrong, and that a literal `%` must be written `%25`.
54
+
55
+
A correctly encoded password is unaffected.
56
+
### An empty Bot `PORT` is unset, so NaN never reaches Bun.serve
57
+
58
+
`PORT=` on `agent-bot` and `agent-langgraph` used to parse as `NaN` (`??` does not treat empty as absent) and `Bun.serve` bound an ephemeral port while compose still published 4200/4201. A prefix typo (`42o0`) started on 42. Empty now means the shipped default; anything that is not a whole port number refuses to start.
19
59
20
60
### The server connects to Postgres on Windows, and `localhost` is no longer a coin toss
0 commit comments