Repository navigation
Releases: Walid-Idrissi-Labs/Canopy
Releases · Walid-Idrissi-Labs/Canopy
Release list
v0.2.0-beta.1
Changelog
Features
- b92ee60 feat(acp): serve Canopy to editors over the Agent Client Protocol
- b2ba9cf feat(agent): notice when an agent is going in circles
- 98f20ac feat(agents): agent definitions as files, dispatched by name
- dc19d92 feat(agents): dispatched agents sit under their orchestrator, with their branch
- 1c1c63b feat(agents): tool calls in panes carry their kind labels
- be65cf4 feat(anthropic): adaptive thinking, one cache breakpoint at the newest block, and paused turns
- 159178f feat(anthropic): hold many MCP tools back behind a tool search
- f411acd feat(attach): the interface opens on a conversation canopy serve runs
- fff5578 feat(bench): canopy bench measures pass rate and cost on real tasks
- 6ef07d5 feat(budget): spending caps hold inside a turn, and can be set
- a1cca37 feat(chat): !command runs in the project and its output goes with the next message
- db855d2 feat(chat): /grants lists what a conversation may do without asking, and takes it back
- 9e9ad88 feat(chat): @ file mentions, ctrl+x ctrl+e for your editor, # notes
- 5bc77b2 feat(chat): a command palette on ctrl+p
- 26528ea feat(chat): agents and conversations in the command palette
- 988a483 feat(chat): enter carries out a finished plan in build mode
- 5c609ed feat(chat): every conversation of this project is reachable from the palette
- 56596b9 feat(chat): find in the conversation on ctrl+f, copy the last reply on ctrl+y
- 306fed9 feat(chat): spending caps in the header, and a pause that says how to go on
- 2706170 feat(chat): up and down move through a draft, alt+k kills to the end, a long paste shows its size
- 83b48f5 feat(cli): canopy run, the full agent without the interface
- 7fa0793 feat(dispatch): agents share their orchestrator's cached prefix and report back
- cddad60 feat(dispatch): an agent's report carries the verifier's verdict on its work
- 1f932ae feat(engine): replay the conversation exactly and keep its prefix frozen
- 76c9b2c feat(exec): bound how many test runs execute at once
- 3688dc5 feat(hooks): hooks run in the sandbox
- a1d6e31 feat(hooks): pre-tool, post-tool and turn-end hooks, given JSON on stdin
- 475296c feat(instructions): send AGENTS.md, CLAUDE.md and project instructions
- 6f8732e feat(keys): a stored key is checked at once, and a price can be entered
- 839e9df feat(land): merge an agent's branch only if the merged result passes
- 52ed4e9 feat(lsp): a language server checks every file an agent edits
- 71a4c21 feat(lsp): find_definition and find_references from the language server
- 1fa9aa1 feat(mcp): remote servers over Streamable HTTP
- d4390a8 feat(openai): the Responses API for OpenAI's own endpoint, opt-in
- 1057ee7 feat(permission): outside content taints a conversation (D-57)
- 772aa4e feat(review): ask a model for an opinion of the ranked attempts
- b818d76 feat(run): verify with the project's tests and escalate effort on red
- f0f1cd7 feat(sandbox): Seatbelt and Landlock confinement policies
- 8ca2d9d feat(sandbox): a new worktree's setup and local MCP servers run confined
- 9af8241 feat(sandbox): confine agent shell commands with Seatbelt and Landlock
- 7a59b31 feat(sandbox): narrow a command's network to package registries (D-60)
- 8657ac8 feat(sandbox): the project's tests run in the sandbox too (D-61)
- c84ffdd feat(search): Anthropic's web search on Anthropic keys, and notices reach the screen
- 84253b9 feat(serve): keep agents working after their client leaves
- 6bc3c89 feat(session): compact when a conversation outgrows the window
- 34d3ba1 feat(session): measure the context by the last request and compact past a budget
- 8cf9a6f feat(session): what a compaction replaces is carried again
- 7678b3f feat(skills): load Agent Skills with their bodies on demand
- 7ab9da6 feat(theme): ship six palettes as data, load your own, gate raw colours
- be39824 feat(tools): keep long command output out of the conversation
- 952999b feat(tools): read less at the source
- 42b0f38 feat(tools): repo_map, an outline of the repository ranked by use
- 249bc41 feat(tui): /context shows where the next request's tokens go
- 28aa575 feat(tui): /mouse hands the mouse back to the terminal, and takes it again
- f0b1127 feat(tui): a footer under each finished turn with its tokens, cache share and cost
- 8cee462 feat(tui): demo images drawn from the golden screen fixtures
- aa04c95 feat(tui): desktop notifications, a live window title and tab progress
- c0c008b feat(tui): draw a finished turn in the order it happened
- 2faa0ed feat(tui): each agent pane carries its receipt on its border
- 86d7697 feat(tui): highlight code blocks with a real lexer
- bd291e9 feat(tui): move to Bubble Tea v2 and Lip Gloss v2 (V-01)
- 70f923b feat(tui): take steering back, stop and remove agents where they are seen
- 28e8566 feat(undo): show what an undo would change before doing it
- a019c57 feat(windows): it builds, and stopping a command ends everything it started
- 591e380 feat(worktrees): keep agent worktrees in Canopy's data directory and reclaim them
- 60dd6a7 feat: a failed turn is tried again with enter, and says what to fix when it cannot be
- da5f2c8 feat: canopy doctor, canopy init, and keys import for the first run
- 680ece2 feat: pictures in a message, scaled and sent to the model
- 6dc9a6f feat: what Canopy says while starting is shown inside the interface
Bug fixes
- d532c34 fix(acp): questions follow their conversation, and serve stops cleanly
- ab6f159 fix(acp): stop on a signal with stdin open, withdraw moved questions
- 4abd6d9 fix(agent): a changing workspace resets the no-progress count
- dc576c6 fix(agents): a definition's tools list caps its agents' trust
- af8a233 fix(agents): s stops an agent waiting on a question, and taken-back guidance keeps its lines
- 3479ffa fix(anthropic): never replay a thinking block without a signature
- 9b13aaf fix(attach): a conversation is sent from its first unfinished turn, trimmed
- 6386c88 fix(attach): a record that changed under the kept turns is sent whole
- 68a878d fix(bench): Python's bytecode is not a test the attempt added
- 457369c fix(bench): a pass needs the task's own tests seen passing
- b96e290 fix(bench): a test file the attempt added fails it too
- 5fec76e fix(bench): attempt in build mode and refuse a pass made by editing tests
- a21573b fix(budget): the overall cap counts turns still running
- 5a3ee82 fix(chat): a ! command is typed and confirmed, and its output cannot forge its frame
- 2790e1a fix(chat): a note is one typed line, confirmed, and never blesses another edit
- 5c6e1cd fix(chat): a question takes the keyboard back from the palette
- 3b9e643 fix(chat): a search answer is matched to its words, not only its generation
- 81b2e34 fix(chat): anything that happens between the two enters asks for the second again
- bb681fe fix(chat): find gives way to a question and matches without changing case
- d45086d fix(chat): only a plan with steps is offered, and carrying it out takes two enters
- 394e22c fix(chat): say when pictu...
v0.1.0-beta.2
Changelog
Features
- 01bc86a feat(acp): reach Claude by driving the Claude Code you already signed in to
- d99d0df feat(cli): sign a subscription in, sign it out, and say what a test can check
- b87753a feat(codex): reach ChatGPT by driving OpenAI's own Codex app server
- 64f04c6 feat(copilot): run a turn on the user's own GitHub Copilot subscription
- 7b959c2 feat(keys): a Claude credential that is a delegation rather than a secret
- dc9a266 feat(keys): a credential can be one somebody signed in to
- 26c2070 feat(keys): renew a sign-in before the request, not after the 401
- 9ce03b6 feat(trust): run nothing a repository configures until it is trusted
- 33ba0f0 feat(tui): a wizard branch that reaches a credential with nothing to paste
Bug fixes
- a00ab33 fix(acp): a delegated turn names no model, because it is not Canopy's to name
- 14ebe4f fix(codex): make the route id the route, and the account an identity
- b165186 fix(codex): say CODEX_HOME in the caveat, which is what the code reads
- f64311a fix(delegated): reap the vendor's process through the thing that guards its pid
- 7669535 fix(delegated): refuse untrusted vendor settings and stop orphaning vendor agents
- f9c99eb fix(exec): keep credentials out of every child process environment
- f8804fb fix(gitsafe): neutralise only the filters a repository defines
- f7658b2 fix(keys): SetModel wrote back a copy of the file from before the last write
- f237c51 fix(keys): keep the Claude route building on its own commit
- e0bbb78 fix(keys): let a sign-in route answer only about its own credentials
- 3d76bd5 fix(pricing): price Opus 5.5 and Fable 5.1, and stop billing OpenAI cache twice
- a099595 fix(release): let the current release be the current release
- 0a4528a fix(session): make the history database owner-only
- bc0fdc7 fix(subscription): make a vendor client something the cleanup can always reach
- 4c8869d fix(tools): keep file tools out of .git and stop git running repo config
- 07a082c fix(tools): refuse fetches that resolve to this machine or a private network
- 948feb1 fix(tui): escape model text and vendor sign-in links before they reach the terminal
- b8bff55 fix(tui): hold one event subscription instead of one per event
- a5264fe fix: close the bypasses found in review of the hotfixes
- c39a81b fix: harden delegated subscription routes
- a09fa73 fix: make credential renames recoverable
- 92d9ccd fix: report stale inline approval outcomes
- 2980074 fix: report stale inline approval outcomes
Other changes
- 61a29ad ci(release): warn rather than refuse when the Copilot app id is unset
- 96d88fa docs(install): stop calling signout the end of a grant it does not touch
- 70c623d docs(limitations): fix the claims that were true of one route and stated of three
- b74a174 docs(limitations): say that eviction seeds a conversation too, not only a restart
- f856f35 docs(readme): name the ground the ChatGPT route actually rests on
- 3dc7441 docs(security): describe the two signout messages the build actually prints
- c0ad49c docs(security): scope the expiry and the read-only sandbox to what has them
- ead6bf3 docs(tasks): S-01 to review, with the storage argument written down
- 722ac0e docs(tasks): S-02 to review, with the margin and the two failures argued
- 210a30d docs(tasks): S-03 back to review, with the resource story argued from the tests
- 3f6ccd9 docs(tasks): S-03 to review, with the session-versus-request argument written down
- feaaf17 docs(tasks): S-04 to review, and say plainly whose gate a delegated turn runs under
- 813b754 docs(tasks): S-05 to review, with the fallback argued rather than built
- 497d245 docs(tasks): S-06 and S-07 to review, with the boundary caveat written down
- 535cb46 docs(tasks): note where the second provider fork actually lives now
- 920e324 docs(tasks): record what the live run against a real Claude Code caught
- 3acc991 docs(tasks): record what verifying phase S found, and block the two it could not support
- 1ea28f0 docs(tasks): reflow the S-03 notes to the width the file uses
- d512327 docs(tasks): return S-08 to review with the second pass written down
- 634d5cd keys: a credential can be renamed, and everything on it follows
- fb1698d keys: keep the rename note inside sixty columns
- 59fb540 ledger: U-26 moved to its own branch
- c26f726 merge: integrate credential and picker UX
- ec1c65f merge: stack header layout after inline approvals
- 03bbe28 merge: stack model and credential UX after header layout
- 27d77bc refactor(codex): drop the login mode accessor too, which was the fourth
- 1b47a1f refactor(codex): drop the three exported methods nothing reaches
- ffaa610 style: check writes in the trust prompt
- 9b4307a test(codex): hold the handshake, the refusals and the machines with nothing on them
- 11fc874 test(copilot): hold the sign-in, the session and the two switches that reach them
- 8aec0e8 test(subscription): hold four guarantees that were only held by their comments
- 6f44b3b tui: a question is answered where it is seen
- 7086b2d tui: a question is answered where it is seen
- 18f6a90 tui: the model picker stands where the message box stands
- 63f7084 tui: the name lives in the header corner, not in the middle of a new chat
v0.1.0-beta.1
Changelog
Features
- 99c55ce feat(chat): let navigation read a permission prompt without answering it
- b19d696 feat(chat): make ctrl+r offer a compaction before it pays for one
- b1899ec feat(tui): carry who needs you into every header and stop locking screens
- 3d93cf8 feat: /model, for the conversation rather than the key
- 46fbb60 feat: a key is one credential and many models
- 87358d9 feat: a question asked on the side is worth keeping
- 80009db feat: a reply that reads like a document, not like its source
- 3cf2f2d feat: an agent stuck on a question finds you where you are
- 5a90d76 feat: an edit you can read, not a filename and a duration
- fa204df feat: the corner says who you are with, not what we are called
- e8444dd feat: the task list becomes a block you can read across the room
- 6b09d4a feat: two sonnet agents, with no key called sonnet
Bug fixes
- b0747ab fix(catalog): advertise only compatible OpenAI models
- 766b4fa fix(keys): a credential you just typed is the one that answers
- 1671279 fix(keys): open on a conversation when several credentials are stored
- 340adfb fix(keys): report credential selection truthfully
- eece6d3 fix(lint): drop the three helpers the inline rewrite orphaned
- 18eb361 fix(lint): highlight the fragment once rather than assigning it twice
- 58e7023 fix(tui): apply the mode the key stops on, not the ones it passes
- 7723752 fix(tui): keep markdown tables within terminal width
- 3d909ee fix(tui): key transcript cache by tool classification
- 0e44719 fix(tui): neutralize terminal controls in tool output
- 38ba5c5 fix(tui): preserve pending mode across every exit
- 03224fb fix(tui): scope approval input to its conversation
- 5d06887 fix(tui): scope approval input to its conversation
- 5f230b6 fix: a column is not a rune, and a frame is not a suggestion
- 87e9ded fix: a focus you cannot see cannot exist
- 9b0010e fix: a key can be asked for the model it already runs
- 3e7a588 fix: a refused model change moves nothing, and the picker takes a typed one
- f04a428 fix: a stale catalog says so, and two spellings are one model
- f260f24 fix: the renderer could stop returning, and did so on ordinary output
Performance
- 8a32c98 perf: render a finished turn once
Other changes
- f24aeb1 Merge remote-tracking branch 'origin/fix/cell-width-and-chrome' into repair/transcript-cache-classification
- e5e495c Merge remote-tracking branch 'origin/main' into feat/one-key-many-models
- 2161915 Merge remote-tracking branch 'origin/main' into release/beta-1
- 8e124df Merge remote-tracking branch 'origin/main' into repair/cell-width-integration
- 234775d Merge remote-tracking branch 'origin/main' into repair/tool-output-controls
- a86747e Merge remote-tracking branch 'origin/main' into tui/ambient-attention
- 96e2c62 Merge remote-tracking branch 'origin/perf/render-once-per-turn' into repair/credential-selection-truth
- 318f724 Merge remote-tracking branch 'origin/tui/what-the-agent-did' into repair/markdown-table-width
- bb99d94 merge: main's one exit path, with the picker on it
- 30c2ac9 merge: take the branch below, which resolved main the same way
- 4de4b9f merge: the same assertion, finished on both branches
- 734af64 test(tui): account for Update results
v0.1.0-alpha.3
Changelog
Features
- e98aae9 feat: a bigger fire, and the name unframed with its edges picked out
- df60c54 feat: a header bar that stays, with what you actually want at a glance
- 792b5fd feat: a jump-to-bottom marker sitting on top of the message box
- 632e7fc feat: a pane is the conversation screen in miniature
- 9d28d95 feat: actually connect the configured MCP servers
- 44fb0db feat: actually run the hooks a project configures
- fe573be feat: add project commands and cost outcomes
- f7bf0fc feat: add the canopy report command
- 308520a feat: btw gets a panel of its own
- f3f8210 feat: drag to select the conversation, and only the conversation
- ccaa5d9 feat: draw the name at the size it deserves, and keep it on screen
- 81273d5 feat: errors keep the provider's own words
- a81db87 feat: every agent on screen at once, each pane wearing its own fire
- 0422975 feat: label a tool call by what it is, and frame the question
- 4846596 feat: one drawing of the name at a time, and a fire that goes out
- 86e4b78 feat: queued steering shows itself
- df4c789 feat: the name casts a shadow, and the fire smokes
- 487b80b feat: the name edged in grey, a taller fire, and the rough edges of the shell filed off
- 54172f0 feat: the questions that create agents stop whispering
Bug fixes
- abb4cda fix(verification): harden freshness attribution
- 3625398 fix: agree on what makes two workspace directories the same
- 0b75d0c fix: align confined mode with its trust ceiling
- ba643c2 fix: bound the tool list out loud, and stop what a server started
- f606962 fix: build the report from one consistent view of the worktree
- 86f46b3 fix: close MCP hardening review gaps
- c6bedd3 fix: close the hook in-flight loop
- d582257 fix: confirm direct agent workspace
- 7f92c11 fix: dispatch runs the profile the user meant, and a spawned agent cannot spawn
- c87ef93 fix: enforce permission and workspace contracts
- 1e0aef9 fix: hold a conversation until its checks have finished
- 985120a fix: implement D-05, so a missing program is not a failing test
- 64e26b8 fix: keep a conversation's mode across a fork and a restart
- 8f3e5f9 fix: keep a shared workspace out of the review queue too
- 81c5330 fix: make the green gate actually wait for the tests
- a6ae8d7 fix: never signal a process group after its leader is reaped
- 7d2b273 fix: preserve the test command contract
- a43a841 fix: prove the review queue guard, and correct two ledger claims
- 6fe310f fix: quiet the linter on the selection tests
- cc7a0de fix: read the gate's mode through the resolver
- be6ad47 fix: refuse an ambiguous external call, and stop overclaiming two tasks
- 4b0f1e5 fix: refuse to pick a conversation up in another project
- f6cd808 fix: scope a remote approval to the exact call, and show it
- 108307f fix: scope an approval for a remote tool to its arguments
- caaf251 fix: stop a committing hook from firing on its own commit
- 16c0147 fix: stop a report's own values writing into the report
- 1468b7b fix: stop idle TUI animation churn
- f826d43 fix: sweep the engine for the six robustness properties
- b95a0e0 fix: tell a server's own requests apart from its replies
- 03633ca fix: the configured trust level is a ceiling, not a default
Other changes
- ba721b9 Merge remote-tracking branch 'origin/main' into codex-fix-fix-mode-trust-ceiling
- 357074e Merge remote-tracking branch 'origin/main' into codex-fix-hooks-loop-guard
- 0530e17 Merge remote-tracking branch 'origin/main' into codex-fix-release-0.1
- b36f3bb Merge remote-tracking branch 'origin/main' into feat/commands-and-cost
- 2e49510 Merge remote-tracking branch 'origin/main' into feat/interface-polish
- 595a769 Merge remote-tracking branch 'origin/main' into feat/modes-and-commands
- 2e6a252 a run report that cannot overstate what was checked
- 2ac7c25 a tent instead of a mushroom cloud, and the brand colours
- 2a6f3c6 claim A8-06 and A8-05
- c1e2f80 close the agents footer conditional the merge left open
- cdbca5c compose the screen a conversation opens on
- 8c76435 declare the config fields both branches need, and clear three stale notes
- d55f6f5 do not offer runway where no test is configured
- 7c76878 drop the em dash from the command list
- 3c415f3 drop the two bare colours nothing needs any more
- b02df0a fifteen commands, and let the mode change mid reply
- ca32b9c fire a code hook once per revision, not once per state
- df9eaa9 forbid constructing a colour outside the theme package
- 5e9981b four modes on the key, and the smoke in the accent grey
- 67c618a give the campfire the secondary brand colour
- 0b38aac give the mark a campsite, and drop the symmetry rule it broke
- 26782c2 keep A8-05 out of this branch's claim
- f60bda1 make the theme actually reach the screens that ignored it
- 4fc273d merge: bring main into the mosaic view
- 04c0340 merge: combine freshness and review follow-ups
- 67eb8d3 never build a revision key out of half a git status
- 8faa9b1 open on a conversation, not on a launch screen
- 0cae049 open the conversation you were given, not session-1
- 624e4e8 pick a theme from the terminal, redraw the welcome, and build the frames
- bc65c52 pin the mode prompt to the wire, and record what is left of M-09
- 7fa18c5 print a code on the way out, and pick the conversation up with it
- 16a181b record A8-05 in the ledger
- 8d7038b record A8-08 in the ledger
- 5cc2568 record M-08 in the ledger
- bb49264 record the gate and the aside in M-09
- a514d14 record the interface work, and the part of it that has to wait
- c2f2bdf record the mode ladder as M-09
- f8d5b98 record the mode ladder as M-09
- a4a012b rerun the three permission findings, and fix what the fixes left behind
- da89f9a run something when a state actually changes
- b36bdc7 say which mode and which model in the message box
- 75ff09a ship commands by default, and a list that drops out of the box
- 4146315 speak MCP, and refuse to let a server grade its own homework
- 5008b11 style: drop an em dash from the cost outcome header
- 4e945b3 the credential screen was ignoring the theme too
- 4e3ecc3 the green gate, and a question that changes nothing
v0.1.0-alpha.2
Changelog
Other changes
- 0d146c0 follow what an agent is doing, and stop showing worktrees that do not exist
- fb523fc give the wheel to the conversation and the arrow keys to the message box
- 34bd2ba input history, a new conversation key, and a logo worth keeping
- 5b619de mark prereleases as prereleases, and say how to install in the readme
- b099978 plan the phase that makes the pre-alpha usable
- edfc799 write down when the next release goes out
v0.1.0-alpha.1
Changelog
Features
- 8a12c02 feat(cmd): add canopy ask
- fd0d654 feat(cmd): add the headless harness
- 592d6e6 feat(core): add domain types and the closed state vocabulary
- 3ca218f feat(core): add provider, key and profile types
- 9ce309e feat(core): add the fake store with four scripted worktrees
- 702c893 feat(core): add the five engine interfaces
- a12c2e3 feat(core): add the provider contract
- 0284b6a feat(core): add the workspace roll-up
- 2bbe933 feat(core): derive visible test and service state from evidence
- ad5e555 feat(keys): store credentials in the OS keychain
- b154733 feat(provider): add the Anthropic client
- 618c86f feat(tui): add the dashboard
- 2155d28 feat(tui): full screen application shell
- 4131179 feat(tui): manage credentials from the interface
Bug fixes
- e56be96 fix(ci): pin golangci-lint and fix the findings it was hiding
Other changes
- 889e65a a second theme, a help screen, and a config for this project
- 78f0105 add a web fetch tool
- c31cb93 add openai compatible provider
- ee0c1ba add plan first mode
- eb08e1e add provider fallback chains
- fb7a1dc add session and turn types to core
- 6396ca2 add session forking
- 1240662 add structured git tools
- defbd68 add the agent registry
- c805abb add the agents view
- b1ed98c add the context meter and compaction
- 3c1e698 add the permission model and audit trail
- 41a57be add the session engine
- 573e894 add the shell tool and command runner
- 2a83944 add the tool contract and the file tools
- 1fc2132 add the tool use loop and give the app real tools
- 4da4243 add worktree discovery and lifecycle
- 9d14846 ask before running a command
- 01c9e92 bring a fresh worktree to a runnable state
- b1063cb cache the stable parts of a prompt
- ac08d1a checkpoint the worktree before every turn
- 3ed8fe8 commit an agent's work, and see where two of them collide
- d1ff486 finish the overnight write up
- f5dc3d7 fix a race between the stall guard test and its own callback
- c6112f3 fix two bugs that made the interface unusable
- aa47e48 give agents a task list, wire dispatch in, and record what got done
- 17290c6 give an agent a worktree of its own when it asks for one
- 6cc7767 give the live tests a realistic time budget
- cad743f give up on a provider that goes silent
- 6b9bc36 hash worktree content instead of guessing at it
- 987b648 let a rate be attached to a stored credential
- 4bd0af2 list the model flag in the keys usage text
- 1a0e103 make chat the home screen
- 7c347db note why the stall guard test went out red
- a53410b only count settled turns in the session cost
- ca4a595 open and create agents from the agents view
- 019f14a persist sessions to sqlite
- 621c537 price turns from a dated table
- d6ac0e2 put the verification engine on screen and give it something to run
- 41b91e3 rank agents on evidence, and refuse to when there is none
- 8a7b1dc record A5-04 and A5-11, and correct four stale statuses
- 1377d74 report a cancelled turn as stopped, not failed
- a84694b run the configured tests and measure what an agent changed
- cc8a18f say which model each credential talks to in the listing
- b1278ce set up the homebrew tap and write down how a release happens
- d58c7ad steer an agent without stopping it, dispatch from the chat, and cap the spend
- bec46ac use the stored model, and ask for a credential when none is chosen
- e83e332 write up the overnight work for review