Repository navigation
Merge the next version: fixes, Claude Platform, Project Docs and enowX UI - #36
Merged
Merged
Conversation
Bypass didn't mean what it says: a plugin hook's ask still prompted, and enowX's own trim asked in a session switched to bypass after it started, as it went by how the session started rather than the mode the agent reports. The rewrite now goes by the mode. What still prompts is answered by one policy, through the agent's PermissionRequest hook, or by the screen for an agent without one: routine work passes, and what the urgent rules or a sure judge hold for the owner doesn't. A hook's deny never gets that far, and a session not in bypass asks as before. Each answer is in decide log. Checked on Claude Code 2.1.318 in a real terminal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A turn reached GOA twice, by routes that knew nothing of each other: its goa report, a tool call made before the turn ends, and its end, whose text was the transcript's last assistant message at that moment. Claude Code's transcript lags its Stop hook, so that could be an older message, even one from mid-turn. The text now comes from the agent's turn-end hook where it says it, and else from a transcript that holds the turn's end. A report made at work waits briefly for its turn's end to join it. Another turn keeps its own line, and a question or a failure is never merged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bypass Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenCode 2 owns its configuration in one background server per user, so what a session's environment said was ignored once that server ran: the config's models weren't listed and the session ran on OpenCode's free ones. enowX's guide and tools were lost the same way. Sessions now start with --standalone from version 2; 1.x doesn't start with it. OpenCode 2's own preset also takes a config now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The build panel could only be closed once its run was done, and grew with its review past the top of the page. It now closes at any stage, with a button or Escape, and its body scrolls inside it. The unslop panel closes while running too, and a session's notice can be closed until it says something else. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The host checks a design before anything leaves it, and the cloud runs the same checks again on what it receives, so they live in one package neither UI nor server owns. A bundle has fields for a design and its files only: a canvas's comments, brief and chats have nowhere to go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Off unless its own bucket is set. Public reads, publishing from a device's token, the web sign-in that joins no team and opens only /v1/library, moderation with an append-only log, moderators the owner appoints, limits and usage. The server makes the documents people see itself and takes no host's word for a design's checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An empty folder under a canvas's ID counted as holding it, so the team's canvas waited; the sync's place moved past it, and a failed pull then saved the state without what waited, or a day on it was given up on. An empty folder holds nothing now, a failed pull keeps what waited, it is asked for hourly after a day, and a host already past items asks for all of them once, those it has passing by on their versions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The statements before a command were found by a pattern reading across lines and quotes: a cd on the first line took everything up to the first ; as its own, a heredoc's lines or a for's header included, so the trimmer was inserted in the middle of them. A statement is now read as the shell reads it, and only a plain one on the first line stays outside. A plain variable no longer does, as the command wrapped wouldn't see it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A design becomes a draft on the host, checked and packed with its picture, and leaves only once the user says so. Drafts and which item a design became stay in the host's own folder. The feature is registered without tools: agents point users at the form, they don't publish. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A nologin shell says why on stdout: the error said only the exit status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A design's right-click menu opens the form on a draft the host checked: what goes public, what stays private, what the check found. Sending waits for the prompt's approval and the rights statement. The entry shows only when the host's cloud says it has a library. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The database migration tool installs as goose too, and it was told apart by what its version prints, which changes with its versions; and a session started whatever was on the PATH without asking. Goose is now confirmed by its help, which lists sessions, a real agent behind the tool on the PATH is found by its path, and a session on the other program is refused saying why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at shows Signing in or a moderator's decision happen elsewhere, so an open menu asks again. An update starts from the item's own title and prompt, its approval and rights said again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenCode has no hooks, and its GOA was only told to delegate; from version 2, a running background server ignored the session's config altogether. It now gets a config for its version, with --standalone or a plugin, and keeps it through a restart, when it came back with every tool. GOA edits only in its own folder on every agent, and is offered only where it was seen to hold. Its MCP server offers 11 tools rather than 222, and its guide stops promising a shell. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The agent, its chat reader and token usage share the conversation's file format, so it comes first, with the seams subagents build to. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… gate and the write guard Metadata lives in a body's first line, not the note's header: a daemon of before rewrites a header without keys it doesn't know, whereas a body survives it, sync, teams, exports and proposals, and reads as text in an app of before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The + menu opened an agent with its default config only. An agent with configs now opens in the menu to pick one, as in New session, the preferred marked; one with none stays one click. The menu scrolls when it doesn't fit the window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The library shares the store of teams' files, wrapped so no key resolves outside its prefix, with its limits its own. The website holds no bucket token: R2's lasting tokens are per bucket and this one holds teams' files, so it fetches a live version's objects from the cloud with its secret. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Platform's loop has to be tested end to end with no key and no network: scripted replies in the API's SSE shape, failures on the way, and a runnable default script for later end-to-end tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each handler opened its own Drafts, so the mutex guarded nothing. A form closed without saving left a whole packed design on the disk for good; they go after a week. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A watch reads the lists less often and, with the window out of sight, asks less. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A config's flags and variables come last at a start, so one could undo GOA's tools, sandbox or OpenCode's config. GOA takes only its model and effort flags and no variable it is held by. The fallback to another agent would have started it as a plain session on any agent: refused. A config no longer drops the permission mode GOA runs in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
goa.switch restarts GOA in its own session, so its tabs, board, collection and waiting lines stay and its workers never notice. Another config goes on with the same conversation, checked before GOA stops; another agent starts a new one, once told so. What only shows by ending puts it back as it was. Lines wait while it changes, none going to the agent on its way out. GOA can't change itself: that would end the turn asking. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`goa switch` and goa_switch say what GOA runs on and change it, naming the yes a change needs. Asked by an agent the user says yes first; in GOA's own session it only reads, and GOA isn't offered the tool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A session hibernated and woken by goa delegate came back in auto mode: it started asking, so its restart carried only the flag allowing bypass and took Claude Code's own default mode, and a session switched to bypass had that mode dropped from its restart. Preset.Argv now holds the rule for every command line enowX builds, new, spawn, delegate, resume, continue, wake, fork, tabs, import and restore, and drops any mode named. keepBypass has the record say the same, so a record of an earlier daemon comes back in bypass, and an agent run by hand in a terminal comes back so too, a command an earlier daemon noted included. As root Claude Code refuses bypass: the session starts asking and its note says so. An agent taking over from Claude Code doesn't inherit the mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a home that never saw it, a session started in bypass stops at a warning whose first answer exits, so the rule would fail on every new host and account, and a prompt typed in would answer it no. Passed in the one --settings enowX gives it, as Claude Code takes only the last when repeated; nothing is written to the user's files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Switching pressed Shift+Tab a fixed number of times, watching a screen that might not have redrawn: a late redraw, or a mode not in the cycle as bypass isn't for a session started without it, left the session wherever the presses ended, plan mode included. Claude Code's cycle has plan just before bypass and it has no other way to change mode as it runs, so what would go through plan now starts again on its conversation in that mode, if its agent is at rest and nothing it runs would stop; the rule's bypass stays what it comes back in after. Each key waits for the screen, no key goes to a screen that doesn't say its mode, and the call says how it ended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GOA on Claude Code now runs in bypass, where the prompt its hook left a secret's read to would never show. Its hook now asks, which Claude Code still honours there, and enowX doesn't answer that prompt for it. Its refusals are denies and stand as they were. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stand-in whose --version never returned held each OpenCode session's start for its whole minute, as what it started kept the pipe open: 480 s in one test, and the same would hold a real session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a wake's line was open, continuing a session already back said nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Now that a message waits for the woken agent, the dialog stayed open for up to 20 seconds. A message that can't go says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its sessions run in bypass whatever is asked, so New session's switch and the mode a new session starts on said something that wouldn't happen. A tab takes the user's setting rather than a Claude Code session's bypass, which says nothing of another agent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What it covers, that no setting turns it off, what still stops it, where it can't, what one started by hand gets, GOD of Agents' permissions, and how switching mode lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The question was drawn before many dialogs, so one they asked came up behind them, out of reach: GOA's rules' "Delete every rule?" among them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each agent GOA is offered on with its level, the configs of the agent picked with the official one first, and what the pick does or why it can't be done, before anything is pressed. The host's word decides what needs a yes, so a GOA that just got to work is asked about too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex gave no id to resume by, so a hibernated or restarted session with a conversation came back on a new one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: the Stop's fields stay in the hook's event now built in core/hooks; a key waiting for the app is checked before the guide's env; kept args take the model the session was given and its config's mode flag; input to a session with no terminal to attach goes through the daemon, which also wakes one asleep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: both delegate's --note and --doc stay; its panel, the skipped first line and New project docs go in the notes page as it now is; docs keep both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One mode switch at a time for a session keeps what the switch kept when it was rewritten: two at once could end on a mode neither asked for. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Platform's mode key goes through plan as its sessions may: only Claude Code's restarts to keep off it. Tests follow Platform being first among agents and the notes page as it now is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
Everything for the next version in one merge: 222 commits since
main, the fixes and features ofrelease/next, withfeat/claude-platform-agent,feat/project-docsandfeat/enowx-uimerged in. It replaces #30 to #35.This merge deploys enowX Cloud. It changes
go.mod,go.sumandcloud/, and runs migrations0014,0016,0017and0018(the library's tables; noDROP,DELETEorTRUNCATE) on a database at 13. The migration runner accepts the missing0015: it sorts by number and runs what is above the last applied. Production's database was backed up first (enowx_cloudschema, 17 tables, 1.30 GB, not restored to test it).How it was tested
GitHub CI wasn't waited for: the checks were run locally, one job at a time on a shared Linux host, as CI's own jobs but for what is below. macOS and Windows behaviour was not run: they were only compiled and vetted here, and CI's run on this merge is the first to cover them.
On this commit,
f0a79c7:make lint(vet, staticcheck)GOOS=darwin go vet ./...go test ./cloud/...withENOWX_CLOUD_TEST_POSTGRESpostgres:16image./daemoncore/transcript,core/designshare,core/platformagent,cloud/...,cli,ui/canvasview,ui/notesview,ui/projectdocsview,proto,core/android,core/intercept./uiOnly on the earlier
f121e7e, two commits before; those commits changed lint findings, tests and how a session's mode switches:make daemons, every other package of the Linux suite, Windows vet, test compile and build for the packages CI tests there, macOS builds (arm64, amd64), Linux arm64 daemon build.Failing, and failing the same on
mainat048b78e:TestFindSDKByTheADBOnPath: this host has/usr/lib/android-sdk.TestToolsThroughTheProxy: this host's system Node 20 under a clean PATH. It passes with Node 24.TestAlwaysAllowHibernateAndClose, flaky: it failed onf121e7eand 1 run in 12 onmain, and passed on this commit.Not covered: tests on macOS or Windows; packaging,
darwin/universal, signing; real models in most of these features (stand-ins, with real Claude Code 2.1.318 on bypass and model changes). Frame-time testsTestLongSessionListsStayQuickandTestLongGOAPanelStaysQuickfailed under load on the base too.make testandmake lintpass: lint yes, test as above🤖 Generated with Claude Code