Releases: copse-dev/copse-releases
Release list
v0.1.0-beta.8
Built from copse-dev/agent-pane@3e124ba (tag v0.1.0-beta.8).
Copse 0.1.0-beta.8 — beta channel.
-
Requires macOS 26 or newer.
-
Download the
arm64build for Apple Silicon or thex64build for Intel. -
Updates are served from the
betafeed. Beta installations update from this feed and may advance to a newer stable release. -
Releases are forward-fix only; downgrade is not a supported rollback.
-
This beta advances the permanent public update channel from beta.7 to beta.8
so the signed, architecture-specific updater can be validated end to end
before the source repository opens. -
macOS release images now use Copse's generated icon for both the application
bundle and the mounted DMG volume. Release CI generates the.icnson its
clean runner, fails if macOS cannot compile it, then mounts the finished DMG
and verifies the icon bytes and Finder custom-icon flag before publishing. -
macOS downloads are now architecture-specific instead of carrying both Apple
Silicon and Intel payloads. The beta.6 candidate DMGs and ZIPs are about 180
MiB each (down from 343–353 MiB), and the installed app is about 640 MiB
(down from roughly 1.3 GiB). Release CI strips build-only dependencies and
source maps, removes opposite-architecture native modules, validates a
combined architecture-aware update feed, and fails if a download exceeds
230 MiB or an installed app exceeds 750 MiB. -
The optional local transformer/ONNX runtime is no longer bundled into every
macOS installer. Copse's heuristic PII redaction remains active; contextual
transformer redaction will return once it has an explicit on-demand install
path instead of making every client carry the model runtime. -
The macOS packaged-runtime smoke test now waits for its PTY helper to exit
before reporting success. This prevents a completed smoke test from leaving
the unit-test worker alive until CI's fail-closed timeout. -
Release checksum manifests now contain paths relative to the downloaded
artifact directory. A plainshasum -a 256 --check SHA256SUMStherefore
verifies an Actions artifact or GitHub Release download without recreating
the CI runner's internalrelease/directory first. -
macOS release packaging now installs and verifies the native keyring module
for both Apple Silicon and Intel bundles. This fixes the Intel build opening
a startup-error dialog before the release smoke test could run, and the
release verifier now has an explicit timeout instead of waiting indefinitely. -
External command hooks now fail closed when a blocking hook crashes, times
out, cannot start, or returns an invalid response. External hooks remain off
by default, and Settings → Sources explains both the blocking behavior and
the global switch that disables an incompatible hook set. Imported Cursor
hooks may explicitly setfailClosed: false, and Copse-native hooks may set
onFailure: "open", when compatibility requires the older fail-open behavior. -
Copse no longer offers to save an API key as unencrypted base64 merely because
the operating-system keyring is unavailable. Plaintext secret persistence is
now off by default; exceptional Linux or headless environments must start
Copse withCOPSE_ALLOW_PLAINTEXT_SECRETS=1and still approve each plaintext
save individually. Environment-only provider keys remain unwritten. -
Stored API keys are now encrypted with a cipher Copse owns rather than
Electron'ssafeStorage: a random data key kept as one item in the OS
keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)
and AES-256-GCM over the key itself. Existing keys keep working and are
rewritten in the new format the first time one is read — the first rewrite
sweeps every other stored secret with it, so a profile finishes migrating in
one go rather than leaving keys nobody happens to read in the old format.
Nothing needs re-entering. This removes the last dependency on Chromium
internals for reading secrets, which is what lets a future non-Electron Copse
shell open the same profile. -
Settings → Providers: Test key now tests the key you already have saved
when the field is empty, instead of answering "Enter a key first" over a key
that is set. The field is write-only — a saved key is never read back into it
— so previously the button could only ever check a key mid-typing, never the
one actually in use. The stored secret stays in the main process; the
renderer only asks for it to be tested. -
Clicking an image or video chip in the empty-thread (centered) composer now
opens the same attachment preview modal used after send. Text chips already
did; media chips only expanded from the transcript or roadmap, so a new
thread — where the composer is the only place the attachment exists — had no
way to inspect what was attached before sending. -
Experimental: next-step tab complete. When a turn ends and one next step is
clearly what the user would send next ("Run the tests to verify the fix"),
a separate small-tasks model call names it and the composer offers it as
placeholder text with a Tab keycap — Tab inserts it, typing ignores it, and
most turns deliberately offer nothing. Off by default; enable it under
Settings > Experimental > "Next-step tab complete". -
Asking Copse to prototype something now gets you a prototype you can look at.
The MCP-UI canvas has always been able to render a self-contained HTML
document as a live sandboxed artefact, but nothing pointed the model at it, so
"mock up a pricing page" was answered in prose or with a file you had to open
yourself. Three changes close that gap, all inside thecopse.mcp-ui-canvas
plugin's single flag. A conditional turn-start hook recognises a prototype
request — an action verb and a prototype noun together, with review and
explain questions vetoed — and, only when that turn actually offers the
bundledrender_html_artefacttool, tells the model to write the document to
a real workspace file and render it. Writing that file no longer stops at the
approval panel: creating a path that does not exist yet overwrites nothing, so
it applies directly, the same reasoning that already exemptedmkdir. An
existing file is untouched by this — it still stages when the worktree holds
work Copse did not do, when the file changed under it, or when diffs are
already waiting for review, and a new file never jumps that queue either. And
re-rendering an artefact whose tab is already open now refreshes that tab in
place instead of stacking a near-identical one beside it, so iterating on a
prototype updates the canvas you are looking at rather than leaving you to
close the previous six. -
Semantic search no longer reports "Indexing failed" on a large repository
that is merely slow to index, and no longer starts indexing one it was
supposed to refuse. Two faults compounded. The guard that declines to
semantically index an oversized workspace sized it from a file listing
captured through a subprocess pipe with an 8 MiB ceiling, and anything past
that ceiling was dropped without a trace — a 124,597-path checkout measured
as 61,735 paths, comfortably under the 100,000 cap, so the guard waved it
through and the indexer walked the whole tree. The wait that followed could
then only end badly:gortex track --waitis passed a--wait-timeoutit
does not honour (a 5-second request returned after 55 seconds), so rather
than the indexer stepping back on its own, Copse killed it at its own
ceiling and logged the kill as a failure — once when the workspace opened,
and again on every burst of file changes. A listing that overflowed its
capture limit is now treated as no evidence of size at all, so the workspace
is skipped with the reason shown in the footer; and a wait that outlasts its
budget is reported as still indexing in the background, which is what is
actually happening, instead of as an error. Text and regex search were
unaffected throughout and remain so. -
Per-chat reasoning effort now lives inside the composer's model picker,
alongside an ACP agent's own Mode and thinking-effort selectors, instead of
sitting as a separate dropdown in the footer strip. Every per-chat knob that
belongs to the chosen model is now in one menu, and the footer keeps one
control where it had two. The behaviour is unchanged: the effort applies to
this chat only, offers just the levels the selected model accepts, reads as
Default when the model's own saved level applies, and disappears for models
with no reasoning control. -
A shell in a popped-out Terminal now shows its output. Typing worked and the
command really ran, but every byte it produced was delivered to the main
window, which had no tab for that session and dropped it — so the pop-out sat
there looking dead. Terminal sessions were always tracked per window; only the
destination for their output was not, and it went to whichever window the app
started with. A shell's output now goes to the window that opened it, and to
no other: unlike the diff queue, which is shared workspace state, terminal
output stays private to its own window. Closing a pop-out also shuts down the
shells it opened, rather than leaving them running with nothing attached. The
unsandboxed-terminal permission prompt follows the same window, so it no
longer appears on the (possibly hidden) main window while the pop-out waits. -
Changes popped out into its own window now shows the same thing the docked
pane does. The Proposed section was missing entirely from the pop-out: the
main process pushed the proposed-diff queue to the main window only, and a
pop-out deliberately does not run the agent loop, so nothing in the detached
window was listening either. Two windows side by side disagreed about what the
agent had proposed, and the one you popped out to revi...
v0.1.0-beta.7
Existing beta.6 users: install beta.7 manually once. Beta.6 points at the old private update feed and cannot discover this release; automatic updates use this public repository from beta.7 onward.
Built from copse-dev/agent-pane@609953f (tag v0.1.0-beta.7).
Copse 0.1.0-beta.7 — beta channel.
-
Requires macOS 26 or newer.
-
Download the
arm64build for Apple Silicon or thex64build for Intel. -
Updates are served from the
betafeed. Beta installations update from this feed and may advance to a newer stable release. -
Releases are forward-fix only; downgrade is not a supported rollback.
-
macOS release images now use Copse's generated icon for both the application
bundle and the mounted DMG volume. Release CI generates the.icnson its
clean runner, fails if macOS cannot compile it, then mounts the finished DMG
and verifies the icon bytes and Finder custom-icon flag before publishing. -
macOS downloads are now architecture-specific instead of carrying both Apple
Silicon and Intel payloads. The beta.6 candidate DMGs and ZIPs are about 180
MiB each (down from 343–353 MiB), and the installed app is about 640 MiB
(down from roughly 1.3 GiB). Release CI strips build-only dependencies and
source maps, removes opposite-architecture native modules, validates a
combined architecture-aware update feed, and fails if a download exceeds
230 MiB or an installed app exceeds 750 MiB. -
The optional local transformer/ONNX runtime is no longer bundled into every
macOS installer. Copse's heuristic PII redaction remains active; contextual
transformer redaction will return once it has an explicit on-demand install
path instead of making every client carry the model runtime. -
The macOS packaged-runtime smoke test now waits for its PTY helper to exit
before reporting success. This prevents a completed smoke test from leaving
the unit-test worker alive until CI's fail-closed timeout. -
Release checksum manifests now contain paths relative to the downloaded
artifact directory. A plainshasum -a 256 --check SHA256SUMStherefore
verifies an Actions artifact or GitHub Release download without recreating
the CI runner's internalrelease/directory first. -
macOS release packaging now installs and verifies the native keyring module
for both Apple Silicon and Intel bundles. This fixes the Intel build opening
a startup-error dialog before the release smoke test could run, and the
release verifier now has an explicit timeout instead of waiting indefinitely. -
External command hooks now fail closed when a blocking hook crashes, times
out, cannot start, or returns an invalid response. External hooks remain off
by default, and Settings → Sources explains both the blocking behavior and
the global switch that disables an incompatible hook set. Imported Cursor
hooks may explicitly setfailClosed: false, and Copse-native hooks may set
onFailure: "open", when compatibility requires the older fail-open behavior. -
Copse no longer offers to save an API key as unencrypted base64 merely because
the operating-system keyring is unavailable. Plaintext secret persistence is
now off by default; exceptional Linux or headless environments must start
Copse withCOPSE_ALLOW_PLAINTEXT_SECRETS=1and still approve each plaintext
save individually. Environment-only provider keys remain unwritten. -
Stored API keys are now encrypted with a cipher Copse owns rather than
Electron'ssafeStorage: a random data key kept as one item in the OS
keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)
and AES-256-GCM over the key itself. Existing keys keep working and are
rewritten in the new format the first time one is read — the first rewrite
sweeps every other stored secret with it, so a profile finishes migrating in
one go rather than leaving keys nobody happens to read in the old format.
Nothing needs re-entering. This removes the last dependency on Chromium
internals for reading secrets, which is what lets a future non-Electron Copse
shell open the same profile. -
Settings → Providers: Test key now tests the key you already have saved
when the field is empty, instead of answering "Enter a key first" over a key
that is set. The field is write-only — a saved key is never read back into it
— so previously the button could only ever check a key mid-typing, never the
one actually in use. The stored secret stays in the main process; the
renderer only asks for it to be tested. -
Clicking an image or video chip in the empty-thread (centered) composer now
opens the same attachment preview modal used after send. Text chips already
did; media chips only expanded from the transcript or roadmap, so a new
thread — where the composer is the only place the attachment exists — had no
way to inspect what was attached before sending. -
Experimental: next-step tab complete. When a turn ends and one next step is
clearly what the user would send next ("Run the tests to verify the fix"),
a separate small-tasks model call names it and the composer offers it as
placeholder text with a Tab keycap — Tab inserts it, typing ignores it, and
most turns deliberately offer nothing. Off by default; enable it under
Settings > Experimental > "Next-step tab complete". -
Asking Copse to prototype something now gets you a prototype you can look at.
The MCP-UI canvas has always been able to render a self-contained HTML
document as a live sandboxed artefact, but nothing pointed the model at it, so
"mock up a pricing page" was answered in prose or with a file you had to open
yourself. Three changes close that gap, all inside thecopse.mcp-ui-canvas
plugin's single flag. A conditional turn-start hook recognises a prototype
request — an action verb and a prototype noun together, with review and
explain questions vetoed — and, only when that turn actually offers the
bundledrender_html_artefacttool, tells the model to write the document to
a real workspace file and render it. Writing that file no longer stops at the
approval panel: creating a path that does not exist yet overwrites nothing, so
it applies directly, the same reasoning that already exemptedmkdir. An
existing file is untouched by this — it still stages when the worktree holds
work Copse did not do, when the file changed under it, or when diffs are
already waiting for review, and a new file never jumps that queue either. And
re-rendering an artefact whose tab is already open now refreshes that tab in
place instead of stacking a near-identical one beside it, so iterating on a
prototype updates the canvas you are looking at rather than leaving you to
close the previous six. -
Semantic search no longer reports "Indexing failed" on a large repository
that is merely slow to index, and no longer starts indexing one it was
supposed to refuse. Two faults compounded. The guard that declines to
semantically index an oversized workspace sized it from a file listing
captured through a subprocess pipe with an 8 MiB ceiling, and anything past
that ceiling was dropped without a trace — a 124,597-path checkout measured
as 61,735 paths, comfortably under the 100,000 cap, so the guard waved it
through and the indexer walked the whole tree. The wait that followed could
then only end badly:gortex track --waitis passed a--wait-timeoutit
does not honour (a 5-second request returned after 55 seconds), so rather
than the indexer stepping back on its own, Copse killed it at its own
ceiling and logged the kill as a failure — once when the workspace opened,
and again on every burst of file changes. A listing that overflowed its
capture limit is now treated as no evidence of size at all, so the workspace
is skipped with the reason shown in the footer; and a wait that outlasts its
budget is reported as still indexing in the background, which is what is
actually happening, instead of as an error. Text and regex search were
unaffected throughout and remain so. -
Per-chat reasoning effort now lives inside the composer's model picker,
alongside an ACP agent's own Mode and thinking-effort selectors, instead of
sitting as a separate dropdown in the footer strip. Every per-chat knob that
belongs to the chosen model is now in one menu, and the footer keeps one
control where it had two. The behaviour is unchanged: the effort applies to
this chat only, offers just the levels the selected model accepts, reads as
Default when the model's own saved level applies, and disappears for models
with no reasoning control. -
A shell in a popped-out Terminal now shows its output. Typing worked and the
command really ran, but every byte it produced was delivered to the main
window, which had no tab for that session and dropped it — so the pop-out sat
there looking dead. Terminal sessions were always tracked per window; only the
destination for their output was not, and it went to whichever window the app
started with. A shell's output now goes to the window that opened it, and to
no other: unlike the diff queue, which is shared workspace state, terminal
output stays private to its own window. Closing a pop-out also shuts down the
shells it opened, rather than leaving them running with nothing attached. The
unsandboxed-terminal permission prompt follows the same window, so it no
longer appears on the (possibly hidden) main window while the pop-out waits. -
Changes popped out into its own window now shows the same thing the docked
pane does. The Proposed section was missing entirely from the pop-out: the
main process pushed the proposed-diff queue to the main window only, and a
pop-out deliberately does not run the agent loop, so nothing in the detached
window was listening either. Two windows side by side disagreed about what the
agent had proposed, and the one you popped out t...