@oar-sh/oar 0.9.7 → 0.9.9
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 +344 -0
- package/README.md +89 -40
- package/bin/oar.js +1023 -135
- package/package.json +4 -5
- package/server/README.md +20 -1
- package/server/claude-worker/claude-sdk-adapter.mjs +0 -11
- package/server/claude-worker/claude-session-process.mjs +196 -28
- package/server/claude-worker/sdk-message-normalizer.mjs +28 -0
- package/server/db-schema.mjs +8 -0
- package/server/migrations/0008-message-pins.mjs +85 -0
- package/server/public/app/activity-replay-state.mjs +68 -5
- package/server/public/app/api-client.js +36 -2
- package/server/public/app/attachments-view.js +508 -125
- package/server/public/app/back-guard.mjs +58 -0
- package/server/public/app/bootstrap.js +170 -59
- package/server/public/app/context-usage-view.mjs +127 -8
- package/server/public/app/conversation-view.js +172 -32
- package/server/public/app/external-link-policy.mjs +4 -1
- package/server/public/app/file-version.mjs +58 -0
- package/server/public/app/journal-view.js +16 -2
- package/server/public/app/pinned-messages-view.mjs +253 -0
- package/server/public/app/pwa-install.js +6 -1
- package/server/public/app/relay-dot-state.mjs +8 -1
- package/server/public/app/router.js +8 -2
- package/server/public/app/scrollbar-hover.mjs +78 -0
- package/server/public/app/settings-modal.js +4 -1
- package/server/public/app/socket-handlers.js +8 -1
- package/server/public/app/store.js +32 -0
- package/server/public/app/transcript-separators.mjs +48 -11
- package/server/public/app/viewer-chat-gallery.mjs +59 -0
- package/server/public/app/viewer-controls-state.mjs +59 -0
- package/server/public/app/viewer-gallery.mjs +46 -0
- package/server/public/app/viewer-gestures.mjs +105 -0
- package/server/public/app/viewer-history.mjs +43 -0
- package/server/public/app/viewer-tap.mjs +112 -0
- package/server/public/app-icon-192.png +0 -0
- package/server/public/app-icon-512.png +0 -0
- package/server/public/app-icon-light-192.png +0 -0
- package/server/public/app-icon-light-512.png +0 -0
- package/server/public/app-icon-light-maskable-512.png +0 -0
- package/server/public/app-icon-light.svg +4 -0
- package/server/public/app-icon-maskable-512.png +0 -0
- package/server/public/app-icon.svg +3 -3
- package/server/public/favicon.ico +0 -0
- package/server/public/index.html +487 -67
- package/server/public/manifest.webmanifest +9 -3
- package/server/public/sw.js +6 -1
- package/server/repositories/message-pin-statements.mjs +39 -0
- package/server/repositories/message-repository.mjs +5 -0
- package/server/routes/messages-routes.mjs +36 -62
- package/server/routes/sessions-routes.mjs +107 -26
- package/server/server-runtime.mjs +39 -8
- package/server/services/claude-context-usage.mjs +51 -3
- package/server/services/cloudflared-tunnel-service.mjs +139 -41
- package/server/services/file-serving.mjs +155 -0
- package/server/services/message-pin-list.mjs +52 -0
- package/server/services/oar-cli-helpers.mjs +205 -4
- package/server/services/oar-cli-menu.mjs +240 -0
- package/server/services/oar-cli-wsl.mjs +129 -0
- package/server/services/pwa-manifest-theme.mjs +30 -0
- package/server/services/safe-served-content.mjs +61 -11
- package/server/services/session-history-refresh-service.mjs +24 -0
- package/server/services/session-worker-registry-service.mjs +18 -1
- package/server/services/update-install-service.mjs +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,350 @@ All notable changes to OAR are documented here. The format follows
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.9.9] — 2026-10-07
|
|
9
|
+
|
|
10
|
+
Highlights: `oar` opens a menu and gains stop, restart, status, url and
|
|
11
|
+
service commands, and setup asks for access and port; files open in a
|
|
12
|
+
fullscreen viewer with galleries to swipe through, and a PDF opens in the
|
|
13
|
+
browser; messages can be pinned; a downloaded file is the file as it is now,
|
|
14
|
+
and no cache may keep an API answer; the built-in Cloudflare tunnel uses the
|
|
15
|
+
`cloudflared` you installed instead of a bundled copy; the three provider
|
|
16
|
+
SDKs are current.
|
|
17
|
+
|
|
18
|
+
### Upgrade notes
|
|
19
|
+
|
|
20
|
+
- **The built-in Cloudflare tunnel needs `cloudflared` installed on the relay
|
|
21
|
+
host.** An install that ran the tunnel (`cloudflaredTunnel` in the config)
|
|
22
|
+
on the copy that came with OAR loses the tunnel after this update until
|
|
23
|
+
`cloudflared` is installed: `winget install --id Cloudflare.cloudflared`
|
|
24
|
+
on Windows, `brew install cloudflared` on macOS, Cloudflare's package
|
|
25
|
+
repository on Linux (<https://pkg.cloudflare.com/>). The relay itself
|
|
26
|
+
starts and works locally in the meantime. Installs with
|
|
27
|
+
`cloudflaredTunnel.binary` set, with `cloudflared` on the `PATH`, or
|
|
28
|
+
with a tunnel that runs outside OAR are not affected.
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- **The file viewer fills the screen.** A file opened from the file browser
|
|
33
|
+
or from a chat takes the whole screen: pictures, video and audio on black,
|
|
34
|
+
text in a column that reads well on a wide screen. The title, the toolbar
|
|
35
|
+
and the meta line float over the content; a tap on the content hides them
|
|
36
|
+
and brings them back, and while a video or an audio file plays they fade
|
|
37
|
+
by themselves after three seconds, as players do. Audio files play in the
|
|
38
|
+
viewer. A PDF, which the viewer cannot show, is a card with **Open in new
|
|
39
|
+
tab** (the browser's own viewer) next to **Download**.
|
|
40
|
+
- **Swipe through a folder, or through a chat's media.** A file opened from
|
|
41
|
+
the browser's folder pane carries its neighbours along: a sideways swipe
|
|
42
|
+
shows the next or the previous file, as do the arrow keys and the two
|
|
43
|
+
buttons below with the position between them. A picture or an attachment
|
|
44
|
+
tapped in a chat opens with every image, video and audio file of the
|
|
45
|
+
conversation to swipe through, oldest to newest. Neighbours are fetched
|
|
46
|
+
ahead, so a swipe lands on the file and not on "Fetching…".
|
|
47
|
+
- **The back gesture closes the viewer, and a swipe down dismisses it.** On
|
|
48
|
+
a phone the system back gesture closed the app; it now closes the viewer
|
|
49
|
+
and nothing else, and the address never changes. A swipe down on a picture,
|
|
50
|
+
a player or a card lets the content follow the finger and then go.
|
|
51
|
+
- **The back button never closes the installed app.** In the app installed
|
|
52
|
+
from the browser (Android, iOS, desktop), pressing back with nothing left
|
|
53
|
+
to go back to used to close it. From the first touch on, the app keeps
|
|
54
|
+
one entry beneath its own and steps back onto it: back closes the file
|
|
55
|
+
viewer and nothing more, and a back with nothing left to close shows
|
|
56
|
+
*Press back again to close the app* — a second press without a touch in
|
|
57
|
+
between closes it, as phone apps do. (Before any touch the browser lets
|
|
58
|
+
back leave on purpose; a page cannot change that.) In a browser tab the
|
|
59
|
+
back button is the browser's as before.
|
|
60
|
+
- **`oar` opens a menu.** In a terminal, `oar` shows whether the relay runs,
|
|
61
|
+
its version, URL, port, access and service, and offers Start, Stop, Restart,
|
|
62
|
+
Show URL and QR code, Settings, Install or remove the service, Update,
|
|
63
|
+
Doctor and Copilot session (arrow keys or digits, Enter, `q`). Without a
|
|
64
|
+
terminal it prints the status and the usage.
|
|
65
|
+
- **`oar stop`, `oar restart`, `oar status`, `oar url`, `oar service`.** Stop
|
|
66
|
+
and restart wait for running turns (the systemd service is stopped and
|
|
67
|
+
restarted by systemd). `oar status` exits 0 when the relay runs and 3 when
|
|
68
|
+
it does not. `oar url` prints the relay URL again. `oar service install`,
|
|
69
|
+
`remove` and `status` manage the start at login: the systemd user service
|
|
70
|
+
on Linux, the sign-in autostart on Windows; on macOS, and on a Linux
|
|
71
|
+
without a systemd user session, the command says so and names `oar start`.
|
|
72
|
+
- **`oar setup` asks for access and port, with options for each.** In a
|
|
73
|
+
terminal, setup asks for a new token, the access (this machine only, or
|
|
74
|
+
LAN) and the port, each with its current value; Enter keeps it. `--port`,
|
|
75
|
+
`--lan`, `--local` and `--new-token` answer without a question, and
|
|
76
|
+
`--defaults` keeps everything of an existing config.
|
|
77
|
+
- **WSL: a port has to be free on Windows too.** In WSL's default networking
|
|
78
|
+
a port can be free in the distro while a Windows program listens on it, and
|
|
79
|
+
a Windows browser's `localhost` then reaches that program. A new config now
|
|
80
|
+
takes the first port that is free on both sides, setup refuses a port
|
|
81
|
+
Windows holds, and `oar start`, `oar status`, `oar doctor` and `oar setup`
|
|
82
|
+
warn when Windows holds the relay's port. Where Windows cannot be asked,
|
|
83
|
+
nothing changes.
|
|
84
|
+
- **Pin messages in a conversation.** Every message has a **Pin** button
|
|
85
|
+
beside **Hide**. A conversation with pins shows a **📍** button with their
|
|
86
|
+
count in its header; it opens the list of pinned messages, each with a short
|
|
87
|
+
preview. A row scrolls to its message, also one far up in the history, and
|
|
88
|
+
**🗑** unpins it. Pins are stored on the relay, appear on every open device
|
|
89
|
+
at once, and are not part of the shared view. At most 100 per conversation.
|
|
90
|
+
|
|
91
|
+
### Changed
|
|
92
|
+
|
|
93
|
+
- **The Copilot terminal session is `oar copilot`.** `oar` alone no longer
|
|
94
|
+
starts the relay and `gh copilot`. `oar copilot [-- <args>]` does; the old
|
|
95
|
+
forms with an option and no command (`oar -- <args>`,
|
|
96
|
+
`oar --install-extension`, `oar --no-install-extension`,
|
|
97
|
+
`oar --migrate-from <dir>`) still run it.
|
|
98
|
+
- **Setup no longer asks about the tunnel or the service.** The service is
|
|
99
|
+
`oar service install`; the tunnel is set in the config
|
|
100
|
+
([Remote access](README.md#remote-access)). `oar setup --start` still
|
|
101
|
+
installs the service where a systemd user session exists.
|
|
102
|
+
- **A QR code only for an address a phone can reach.** With LAN access the
|
|
103
|
+
URL and the QR code carry the LAN address. With access for this machine
|
|
104
|
+
only, setup prints the localhost URL and one line on how to get phone
|
|
105
|
+
access, and no QR code. In WSL a LAN address is internal to WSL: setup says
|
|
106
|
+
so and names the two ways out, a tunnel or WSL's mirrored networking.
|
|
107
|
+
- The npm package guard allows 6.5 MiB unpacked (was 6 MiB); the command line
|
|
108
|
+
grew by the menu and the new commands, and the app by the pinned messages
|
|
109
|
+
and the file viewer.
|
|
110
|
+
- **A tunnel without `cloudflared` says so.** When the built-in Cloudflare
|
|
111
|
+
tunnel is switched on and no `cloudflared` is found, the relay starts as
|
|
112
|
+
usual, the tunnel stays off, and the status dot's tooltip, `oar doctor` and
|
|
113
|
+
the server log name the install command for the system. The relay looks
|
|
114
|
+
again every minute and starts the tunnel once `cloudflared` is there. With
|
|
115
|
+
`cloudflaredTunnel.required` the queue stays paused until the tunnel is
|
|
116
|
+
connected, as before.
|
|
117
|
+
- **`--allow-scripts` lists two packages.** A manual install on npm 12 is now
|
|
118
|
+
`npm install -g --allow-scripts=better-sqlite3,koffi @oar-sh/oar`;
|
|
119
|
+
`oar update` and the **Update** button pass the same list.
|
|
120
|
+
- `@github/copilot-sdk` 1.0.17 (bundled Copilot CLI 1.0.93): typed structured
|
|
121
|
+
outputs for `sendAndWait`, structured JSON-RPC error data, an experimental
|
|
122
|
+
`setTools()` to replace a session's client tools mid-session, sub-agent
|
|
123
|
+
start/stop hooks, and the new session events `tool.shell_output` and
|
|
124
|
+
`human_response.recorded`. The extension entry renames `factories` to
|
|
125
|
+
`workflows`; OAR passes neither. The package now pins its own dependencies
|
|
126
|
+
exactly, so it carries its own `zod` 4.3.6.
|
|
127
|
+
- `@anthropic-ai/claude-agent-sdk` 0.3.292 (bundled Claude Code 2.1.292).
|
|
128
|
+
Of the nine releases since 0.3.283 these touch the relay's worker: a
|
|
129
|
+
cut-short or interrupted streaming reply now always ends with its
|
|
130
|
+
`message_stop` (0.3.287, 0.3.290), so the turn-liveness watchdog sees the
|
|
131
|
+
end of the model's output; a follow-up turn woken by a finished background
|
|
132
|
+
agent no longer fails its hooks, `canUseTool` and SDK MCP calls with
|
|
133
|
+
"Stream closed" (0.3.284); `commands_changed` no longer arrives before
|
|
134
|
+
`init` (0.3.287); a user message replayed under the same `uuid` while the
|
|
135
|
+
first copy still waits is no longer replayed twice (0.3.290); subagent
|
|
136
|
+
`assistant`/`user` messages carry `agent_id`, task events carry
|
|
137
|
+
`parent_task_id` and `run_id`, and `background_tasks_changed` for a
|
|
138
|
+
finishing task now arrives after its `task_updated` and `task_notification`
|
|
139
|
+
(0.3.292). An omitted `permissionMode` is now left to Claude Code (0.3.286);
|
|
140
|
+
the worker always passes one.
|
|
141
|
+
- `@cursor/sdk` 1.0.36 (additive API changes only): an opt-in
|
|
142
|
+
`subagentInherit` for `Task` child sessions, `sessionId` in the custom-tool
|
|
143
|
+
context, and the SDK's *default* agent-store path now derives from SHA-256
|
|
144
|
+
with a one-time rename of the old MD5-named store. OAR passes its own
|
|
145
|
+
`stateRoot`, so its stores under `data/cursor-agents` keep their layout.
|
|
146
|
+
The package dropped its `@connectrpc/connect-node` dependency.
|
|
147
|
+
|
|
148
|
+
### Removed
|
|
149
|
+
|
|
150
|
+
- **The bundled `cloudflared`.** OAR no longer installs the `cloudflared`
|
|
151
|
+
npm package, which downloaded the binary during the install. The tunnel
|
|
152
|
+
runs the `cloudflared` named in `cloudflaredTunnel.binary` (or
|
|
153
|
+
`COPILOT_CLOUDFLARED_BINARY`), or else the one on the `PATH`.
|
|
154
|
+
|
|
155
|
+
### Fixed
|
|
156
|
+
|
|
157
|
+
- **A jump into the history stays where it landed.** After opening a search
|
|
158
|
+
result in an older part of a conversation, the page put the end of the
|
|
159
|
+
conversation back as soon as it refreshed itself: within a second while a
|
|
160
|
+
turn was running, and whenever a turn ended or the connection came back.
|
|
161
|
+
The window you jumped to now stays until you scroll down to the newest
|
|
162
|
+
message. The same holds for a jump to a pinned message.
|
|
163
|
+
- **On a phone, the Pin button of a message can be tapped.** A tap on a bubble
|
|
164
|
+
reveals its Pin and Hide buttons, but the reveal hung on the hover state the
|
|
165
|
+
tap leaves behind, which the browser drops at the next scroll or layout
|
|
166
|
+
change (seen on Linux), and the share-visibility line then took the tap
|
|
167
|
+
instead of the button. The tap now holds the reveal until a tap lands
|
|
168
|
+
outside the bubble.
|
|
169
|
+
- **A PDF opens in the browser's viewer again.** Served files carry a
|
|
170
|
+
`Content-Security-Policy` with `sandbox` so a worker-written file can never
|
|
171
|
+
run as script on the relay's origin; browsers refuse to show a sandboxed
|
|
172
|
+
PDF in their built-in viewer, so "open in a new tab" turned into a
|
|
173
|
+
download. A PDF alone is now served without the `sandbox` directive (PDF
|
|
174
|
+
viewers run no document script) and may be framed by the relay's own
|
|
175
|
+
origin; HTML, SVG and every other type keep the full lock-down.
|
|
176
|
+
- **Audio files were an opaque download.** No audio type was known, so an
|
|
177
|
+
`.mp3` or `.wav` went out as `application/octet-stream` with a download
|
|
178
|
+
disposition. Audio types are served as such, previewed as audio, and
|
|
179
|
+
`.bmp` and `.avif` are served as images.
|
|
180
|
+
- **An SVG can be previewed.** It was served as plain text so that a
|
|
181
|
+
worker-written SVG could never run as a page on the relay's origin, and
|
|
182
|
+
an `<img>` refuses plain text: the viewer and the file browser's
|
|
183
|
+
thumbnails showed a broken picture. An SVG now keeps its type; the
|
|
184
|
+
`sandbox` in every served file's `Content-Security-Policy` still denies
|
|
185
|
+
it script and an origin if it is opened as a page.
|
|
186
|
+
- **Uploaded video can seek.** A video attachment in a chat was streamed
|
|
187
|
+
without range support, so the player could not jump; it now goes through
|
|
188
|
+
the same range-aware file serving as a workspace file, and so does a
|
|
189
|
+
shared conversation's attachment. Their long-lived caching stays.
|
|
190
|
+
- **A file with a Japanese, Chinese or emoji name can be served again.** Its
|
|
191
|
+
name went into `Content-Disposition` as is, which the HTTP layer refuses
|
|
192
|
+
for characters outside Latin-1, so such a workspace file, upload or shared
|
|
193
|
+
attachment failed with a server error and left a file handle open each
|
|
194
|
+
time. The header now carries an ASCII fallback and the full name in the
|
|
195
|
+
`filename*` form, so the file opens and is saved under its own name.
|
|
196
|
+
- **A changed file is downloaded as it is now.** The **Download** button of
|
|
197
|
+
the file viewer handed back an older copy of a file that had been written
|
|
198
|
+
again under the same name. Three things were wrong:
|
|
199
|
+
- A click on Download did not download: since 0.9.0 every link click was
|
|
200
|
+
turned into "open in a new tab", so the link's own file name was dropped
|
|
201
|
+
and a phone showed or saved the file under its plain name, next to (or
|
|
202
|
+
instead of) the copy it already had. Download links are left to the
|
|
203
|
+
browser again.
|
|
204
|
+
- A file fetched within two seconds of a change arrived cut to its
|
|
205
|
+
previous length, because the announced length came from an older read
|
|
206
|
+
than the bytes. Length, validators and bytes now come from one open file.
|
|
207
|
+
- The address and the saved name never changed. The link now carries the
|
|
208
|
+
file's version (`v=…`), and the file is saved with the time it was last
|
|
209
|
+
changed, `report.pdf` as `report (1005-0719).pdf`.
|
|
210
|
+
- **No cache between the relay and you may keep an answer.** Every API
|
|
211
|
+
answer, errors included, now says `Cache-Control: no-store` unless the route
|
|
212
|
+
sets its own value, and every answer carries `CDN-Cache-Control: no-store`
|
|
213
|
+
and `Cloudflare-CDN-Cache-Control: no-store`, which bind a CDN in front of
|
|
214
|
+
a tunnel whatever cache rule its zone has. Served files also carry an
|
|
215
|
+
`ETag` and `Last-Modified`.
|
|
216
|
+
- **A file preview could stop the relay.** The preview and file routes used a
|
|
217
|
+
cache they were never given, so dropping a stale entry threw; in the
|
|
218
|
+
preview route that happened outside any handler and ended the process.
|
|
219
|
+
- **A changed token, port or access reaches the running relay.** `oar setup`
|
|
220
|
+
wrote the new value while the relay kept the old one, so the relay refused
|
|
221
|
+
the token in its own config. Setup now restarts a running relay after such
|
|
222
|
+
a change (in a terminal it asks first), with the old token on the old port,
|
|
223
|
+
and waits until the relay answers with the new settings. If you decline, or
|
|
224
|
+
the relay is still busy with a turn, `oar status`, `oar stop` and
|
|
225
|
+
`oar restart` still find it.
|
|
226
|
+
- **The command may follow its options, and an unknown one starts nothing.**
|
|
227
|
+
`oar --port 3339 setup` and `oar --setup` used to start the relay and
|
|
228
|
+
`gh copilot` instead of running setup. The command is now found wherever it
|
|
229
|
+
stands, `--setup`, `--start`, `--stop` and `--status` name it too, and an
|
|
230
|
+
unknown command or option prints the usage and exits with code 2.
|
|
231
|
+
- **`oar copilot` checks the relay on its port, and says when `gh` is
|
|
232
|
+
missing.** A lock file alone no longer counts as a running relay: the relay
|
|
233
|
+
has to answer on the port. Without the GitHub CLI the command says so and
|
|
234
|
+
starts nothing, instead of *spawn gh ENOENT*.
|
|
235
|
+
- **Ctrl+C in a prompt** ends the command quietly with exit code 130 instead
|
|
236
|
+
of *Unhandled error*.
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
## [0.9.8] — 2026-10-04
|
|
240
|
+
|
|
241
|
+
Highlights: OAR has a logo, an otter, with icons that follow Day and Night
|
|
242
|
+
mode and a start screen that continues the phone's launch screen; a
|
|
243
|
+
*Compacting context…* line shows while a Claude session compacts, and a
|
|
244
|
+
changed auto-compact window now really applies; the one-line installer
|
|
245
|
+
finishes the job and `oar start` brings the relay up without a session;
|
|
246
|
+
scrollbars are easier to grab with a mouse.
|
|
247
|
+
|
|
248
|
+
### Added
|
|
249
|
+
|
|
250
|
+
- **The otter logo, matching Day and Night mode.** OAR has a new logo. The
|
|
251
|
+
start screen and the sign-in box show it on a white tile in Day mode and on
|
|
252
|
+
a dark tile in Night mode, and only the matching file is loaded. The tab
|
|
253
|
+
icon, the toolbar colour and the installed app's icon and launch background
|
|
254
|
+
follow the Theme setting too (Android launchers get a full-bleed icon that
|
|
255
|
+
fills their shape), and the theme is applied before the first
|
|
256
|
+
paint, so Day mode no longer starts with a dark screen. On Android the
|
|
257
|
+
installed app's own launch screen updates when the system refreshes the
|
|
258
|
+
app, which can take a day.
|
|
259
|
+
- **The installed app starts in one motion.** The start screen continues the
|
|
260
|
+
phone's launch screen: the otter stands where and as large as the launch
|
|
261
|
+
screen showed it, then slides up and shrinks while *Connecting to OAR…*
|
|
262
|
+
fades in below. Without a stored token it travels on into the sign-in box,
|
|
263
|
+
which fades in around it. Launch screen, start screen and status bar share
|
|
264
|
+
one colour, so no plate shows around the logo. The app waits for the
|
|
265
|
+
animation (under a second); a browser tab starts at once as before, and so
|
|
266
|
+
does an installed app when motion is reduced in the system settings.
|
|
267
|
+
- **A compaction shows while it runs.** When a Claude session starts
|
|
268
|
+
compacting its context, a *Compacting context…* line appears above the
|
|
269
|
+
running turn and its bubble says *Compacting the conversation…*. When the
|
|
270
|
+
compaction ends, the same line becomes *Context compacted · 120k → 40k
|
|
271
|
+
tokens*; one that ends without a result leaves no line.
|
|
272
|
+
- **`oar start`, and `oar setup --start`.** `oar start` starts the relay of a
|
|
273
|
+
global install in the background, without a Copilot session tied to it
|
|
274
|
+
(through the systemd user service when one is installed), and prints the
|
|
275
|
+
relay URL. `oar setup --start` does the whole job without a question: where
|
|
276
|
+
a systemd user session exists it writes and enables the service and enables
|
|
277
|
+
lingering, elsewhere it starts the relay in the background. `oar setup
|
|
278
|
+
--port <port>` sets the port; a new config otherwise takes the first free
|
|
279
|
+
port from 3333 on.
|
|
280
|
+
- **The macOS and Linux installer does everything after one confirmation.**
|
|
281
|
+
`curl -fsSL oar.sh/install | sh` prints what it will do, asks once (`--yes`
|
|
282
|
+
skips the question), then installs OAR and starts the relay. Without
|
|
283
|
+
Node.js, or with one older than 22.13, it downloads Node.js 24 from
|
|
284
|
+
nodejs.org into `~/.oar/runtime/node` for OAR alone. Nothing needs root.
|
|
285
|
+
|
|
286
|
+
### Changed
|
|
287
|
+
|
|
288
|
+
- **Scrollbars are easier to grab with a mouse.** A scrollbar doubles its
|
|
289
|
+
width while the pointer is on it and goes back to thin 2.5 seconds after
|
|
290
|
+
the pointer left. The space for the wide scrollbar is always kept, so
|
|
291
|
+
nothing on the page moves when it grows. Touch devices are unchanged.
|
|
292
|
+
|
|
293
|
+
- **The auto-compact window slider saves when the 🧠 modal closes.** Moving
|
|
294
|
+
it only changes the label and the notes beneath it; the value is saved
|
|
295
|
+
when the modal is closed, and setting it back sends nothing. A notice
|
|
296
|
+
warns when the new window is below what the conversation already uses
|
|
297
|
+
(*The conversation will be compacted on the next message.*), and another
|
|
298
|
+
says when the change takes effect: after the current turn, when
|
|
299
|
+
background work has finished, or on the next message. The modal's
|
|
300
|
+
headline reads `60.9k used · compaction window 100.0k · model limit 1M`.
|
|
301
|
+
|
|
302
|
+
### Fixed
|
|
303
|
+
|
|
304
|
+
- **`oar start` no longer mistakes a leftover lock or another program for a
|
|
305
|
+
running relay.** It asks the relay itself: only an answer to OAR's own status
|
|
306
|
+
call with the configured token counts as running. A lock left behind by a
|
|
307
|
+
relay that did not stop cleanly is removed and the relay is started; if
|
|
308
|
+
another program holds the port, `oar start` says so and names
|
|
309
|
+
`oar setup --port`.
|
|
310
|
+
- **A new config no longer picks a port that is in use on Windows.** The
|
|
311
|
+
free-port check binds the loopback addresses as well as all interfaces and
|
|
312
|
+
tries a connection, since Windows allows a wildcard bind beside a listener
|
|
313
|
+
on 127.0.0.1 alone.
|
|
314
|
+
- **The compaction line survives a busy turn.** The live *Compacting context…*
|
|
315
|
+
/ *Context compacted* line used to disappear after two dozen further
|
|
316
|
+
activity lines until the next reload.
|
|
317
|
+
- **The auto-compact slider is saved when the page closes.** Closing the tab
|
|
318
|
+
or the app with the context window still open used to drop a moved slider.
|
|
319
|
+
|
|
320
|
+
- **A "Compacting context…" line no longer stays on a waiting message.** When
|
|
321
|
+
the session compacted while a message waited behind a turn the agent had
|
|
322
|
+
opened itself, the line stayed on the waiting message for its whole turn.
|
|
323
|
+
|
|
324
|
+
- **A new auto-compact window now reaches a running Claude session.** The
|
|
325
|
+
CLI reads the window only when it starts, so a changed window used to wait
|
|
326
|
+
until the session restarted for some other reason. The session now
|
|
327
|
+
restarts once, before the next message, when nothing is running in it
|
|
328
|
+
(no turn, question, compaction or background work); the reply notes it
|
|
329
|
+
(*Restarted the session to apply the compaction window (Auto → 100k)*).
|
|
330
|
+
- **The installer no longer fails with `EACCES` on a Node.js from a
|
|
331
|
+
distribution or NodeSource package.** There npm's global folder needs root,
|
|
332
|
+
and the installer refuses to run as root, so the install could not succeed.
|
|
333
|
+
It now installs the package into `~/.oar/npm` and puts the `oar` command
|
|
334
|
+
into `~/.local/bin`.
|
|
335
|
+
- **Updates land in the install that is running.** `oar update` and the
|
|
336
|
+
**Update** button ran whatever `npm` was first on `PATH` into npm's default
|
|
337
|
+
global folder. They now run the npm of the Node.js that runs the relay, into
|
|
338
|
+
the folder the package is installed in, so an install made with `--prefix`,
|
|
339
|
+
a relay service without `npm` on its `PATH`, and a version manager pointing
|
|
340
|
+
at another Node.js all update correctly.
|
|
341
|
+
- **Installs and updates work on npm 12.** npm 12 runs no install script it
|
|
342
|
+
was not told to allow, so `better-sqlite3`, `koffi` and `cloudflared` were
|
|
343
|
+
installed without their binaries and the relay did not start. `oar update`,
|
|
344
|
+
the **Update** button and both installers now pass `--allow-scripts` for
|
|
345
|
+
these three; for a manual `npm install -g` the README gives the flag.
|
|
346
|
+
- **The systemd user service finds your tools.** The unit `oar setup` writes
|
|
347
|
+
now carries the `PATH` of the shell that ran it, plus `~/.local/bin` and the
|
|
348
|
+
directory of its Node.js. A user service otherwise starts with systemd's
|
|
349
|
+
bare `PATH`, on which the relay's sessions found neither the provider CLIs
|
|
350
|
+
nor, with a version manager, `node` itself.
|
|
351
|
+
|
|
8
352
|
## [0.9.7] — 2026-10-03
|
|
9
353
|
|
|
10
354
|
Highlights: Claude Cloud chats (experimental, off by default) run Claude Code
|