* fix(runner): preserve and requeue runs before automatic updates
* docs(agents): describe runner draining state in the API schema
* fix(runner): interrupt active tools before draining update claims
---------
Co-authored-by: NocoBase runner <runner@nocobase.local>
* feat(cli): install and synchronize the Studio agent skill
* fix(cli): reject overlapping skill installation targets
* fix(studio): align follow-up progress dependencies
* test(studio): activate issues in Git run fixtures
* test(studio): type follow-up scroll metrics without DOM library
* feat(runner): reclaim disk space and pause new work while low
* chore(runner): save disk capacity handling work in progress
* fix(runner): recognize and order disposable attempt cleanup
* docs(runner): explain disposable attempt directory naming
* test(runner): expect the disposable read-only namespace
* fix(runner): collect on heartbeat pressure and respect claim pauses
* fix(runner): retry interrupted removal of pushed attempts
* fix(runner): recheck workspace usage before removal retry
* test(runner): scope cwd-holder cleanup verification to Linux
* test(runner): avoid scanning transient runtime lock directories
* fix(runner): protect recovery and report disk failures despite local writes
* feat(agent-sessions): talk with the agents on people's own computers from Studio
Add agent sessions: conversations in the browser with Codex or OpenCode
running on the person's own computer over the Agent Client Protocol, with
the transcripts and the work they create kept in the application.
- @nocobase/acp-bridge: the bridge that registers a computer, long-polls
for commands, runs each session's agent over ACP with full access, lists
the computer's folders on request and reports what happens, plus the
isomorphic wire protocol.
- @nocobase/app-cli-client: `<bin> acp start` runs the bridge as the
signed-in person.
- @nocobase/app-plugin-agent-sessions: sessions owned by one person, their
redacted transcripts, permission requests, the agent's choices and
commands, records tied to sessions (link kinds, `#` mentions), projects,
the allowed folders chosen by browsing the computer, the application's
tools over MCP, and the pages, which also work on a phone.
- @nocobase/studio: the "My agents" page below Home, issues as linked
records that start from the session, Studio's projects, and Studio's
tools for the agents.
* feat(agent-sessions): tell the agent its session's work and how it is going
The work tied to a session is what the person means by "the tasks", and
the agent now knows it:
- A message carries the session's work beneath it whenever it changed
since the agent was last told, with what is new or changed marked, so an
agent coming back a day later learns what happened meanwhile.
- Every session's agent has `list_session_work`, and the MCP `initialize`
answer lists the work when its session opens.
- Link kinds may tell how each record is going (`progress`); Studio
answers with what it works out of who works on an issue, what it waits
for and its pull request, which `get_issue` returns too.
The migration `202610140001_agent_sessions_told_work` adds
`agentSessions.toldWork` and `locale`.
* feat(agent-sessions): tell the agents how the application wants them to work
Applications tell the agents in sessions how to work with
`registerInstructions(text)`. The agent reads it beneath a session's
first message, again beneath the next message whenever the text changed,
and in the MCP `initialize` answer when its session opens; the transcript
keeps the messages as written.
Studio's agent in My agents mostly discusses, analyzes and plans: the
development agreed on is recorded as issues for the project manager, who
assigns agents and moves them along once the person starts them. Very
small changes, such as a typo or a one-line fix, it makes itself. The
hint under "Start" names the project manager.
The migration `202610140002_agent_sessions_told_instructions` adds
`agentSessions.toldInstructions`.
* feat(agent-sessions): common agents, Windows, a background service, computer keys, notices and stored images
Everything a team needs to use My agents day to day:
- Common agents: besides Codex and OpenCode, the bridge offers Claude
Code, Gemini CLI, GitHub Copilot, Cursor, Qwen Code, Kimi CLI,
CodeBuddy Code, Qoder CLI, Goose, Auggie, Factory Droid, Kilo Code,
Cline, Amp and Mistral Vibe when installed, each in its full-access
mode or with the bridge allowing what it asks; one installed while the
bridge runs shows up within a minute.
- Windows: programs are found with PATHEXT, npm's .cmd launchers run
through cmd.exe without a window, agents stop with their process tree,
and the server and pages read each computer's paths by its own rules.
- `<cli> acp service install|status|uninstall` keeps a computer
connected from every login (launchd, systemd user unit, Startup
script); one bridge runs per profile.
- Each computer gets its own key on its first registration and uses it
from then on, so it stays connected however long the sign-in lasts;
removing the computer revokes it.
- The owner hears in Studio's inbox when the agent waits for permission,
replies or fails while they are not looking (`registerNotices`), one
item per session, settled once they see it.
- Images sent in messages are stored through the file plugin
(`agentSessionImages`) and served to their owner only.
- A page with no computer, an offline one or no agent installed says
step by step what to do, and suggests the strongest model.
Migrations: 202610150001_agent_sessions_computer_keys,
202610150002_agent_sessions_images, 202610150003_agent_sessions_seen.
* fix(agent-sessions): close the composer's choice menus once a value is picked
* fix(agent-sessions): stop a turn cancelled while its agent starts, and save the bridge's key whole
- A cancel that came while the agent was still starting never reached it, so the turn ran on and a hanging one
never ended. The session now remembers the cancel and does not send that prompt.
- The bridge rewrote its state file on every registration, and in place, so a bridge stopped mid-write could leave
it empty. It now writes only a changed state, to a new file it then renames over the old one.
- Studio's e2e tests expect My agents right below My tasks in the sidebar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The page fits the shell's scroll area through flex layout instead of a measured height; the owned list scrolls under its filters and the columns show a thin scrollbar.
* feat(templates): quieter default interface for generated applications
Bring the default look of both templates, the UI Library and the
application development Skill closer to the NocoCRM application built on
them.
Templates: one faint border everywhere; a --hover grey for hovered rows,
buttons and cards, table headers and the navigation's current entry; one
light focus ring for every control; cards and overlays framed by the
general border on a faint blurred backdrop; compact preset at 0.225rem
spacing and 0.5rem radius; text-2xl page titles; full-width line tabs;
table rows on the --hover grey; thin scrollbars shown while scrolling;
the pointer cursor on anything clickable; navigation sections and menu
counts through NavigationMenu's badges; a small badge size; lifting home
cards; a restyled inbox list; centered Appearance options; and Chinese
taglines and sign-in descriptions without full stops. Examples now carries
everything Default has in its shell.
UI Library: the long-text item, an inline variant of property-fields,
kanban board panning, drop highlighting and dark-mode contrast, small
badges where tags sit beside words, and a preview that uses the template
stylesheet.
Skill: the --hover token, badge sizes, card lift, focus, long text (I14),
menu counts (L8), and an upgrade check for merging tokens with their uses.
* docs(app-skills): make the border opaque on a preset with a darker page
The template's light border is translucent and tuned to its very light
page. Found while rehearsing the upgrade on an application whose darker
page made card frames fade out.
* fix(templates): draw the sidebar's rules and the Appearance options in the general border
The lines under the brand and over the sidebar footer, and the frames of
the Appearance popover's presets, used a fraction of the border colour,
so they read fainter than every other line.
* chore: re-run quality checks
The agents test shard failed on agent-runner's local-provider test, which
this branch does not touch and which passes on v3-develop.
* fix(templates): roomier navigation rows and a tinted current entry
* fix(studio): make the issue pages and My follow-ups work on a phone
Phone views without the app header, bottom tabs on My follow-ups, a summary that scrolls away to a pinned bar, a folded composer, one Needs-you card, and the header's chat icon back.
* fix(studio): leave the question to the Needs-you card
Now says a decision waits; the question with its Answer is the card's.
* fix(studio): go edge to edge and denser on a phone
Lists as full-width rows with hairlines, a compact issue view with icon actions, a plain Now row and a full-width Needs-you band; desktop unchanged.
* fix(studio): drop the repeated status pill and flatten comments on a phone
A one-status filter hides the row pill; feed comments become full-width rows with hairlines.
* fix(issues): lay out the issue page by its own width
At 1280px with the AI assistant panel docked beside the page, IssueDetailLayout's
side column and IssueHeader's actions were still switched by the viewport breakpoint,
so the main column could shrink far below the breakpoint's assumption and the title
was squeezed to a few characters.
Switch both to a container query on the page's own width (`@4xl/issue-detail` for the
side column, `@md/issue-header` for the header's actions), and collapse "Ask agent" and
"Delete" to icon-only buttons with a tooltip below that width.
* test(studio): align issue page checks with the 56rem breakpoint
---------
Co-authored-by: Junyi <mytharcher@gmail.com>
* fix(studio): work on associated pull request branches
* test(studio): verify legacy PR origins refresh through polling
* fix(agent-runner): guard unpublished work before PR branch switches
* docs(studio): clarify safe PR checkout and runner upgrades
* feat(agent-runner): isolate run worktrees and preserve local continuation
* docs(agent-runner): clarify reviewed dependency and legacy checkout behavior
* docs(agent-runner): record Git requirement for empty worktrees
* fix(agent-runner): preserve orphan worktrees and migrate legacy sessions
* fix(agent-runner): retain recovery evidence and report spool failures
* fix(agent-runner): atomically migrate history and acknowledge cancellation recovery
* fix(agent-runner): retain recovery reports and clean before cancel ack
* test(agent-runner): trace synthetic lifecycle stages in CI
* fix(agent-runner): retain unacknowledged worker cancellation recovery
* fix(agent-runner): unify cancellation recovery across exit paths
* test(agent-runner): distinguish graceful cancellation from forced recovery
* refactor(agent-runner): simplify local worktree continuation
* fix(agent-runner): keep interrupted worktree removals from committing deletions
Mark a saved worktree before removing it so a later pass only finishes the removal, stop ps from listing itself as a tagged process on macOS, and keep strict process checks to read-only attempts, which are disposable with or without repositories.
* fix(studio): use an idle project manager fallback after queue delay
* fix(studio): recover expired delegations and persist run reports
* fix(studio): correct queue diagnostics and isolate recovery tests
* test(studio): enqueue follow-up workers through dispatch comments
* test(studio): wait for the recovered issue page before capture
* fix(studio): capture e2e evidence without TMPDIR
* test(studio): capture concurrency limit evidence in both languages
* test(studio): await durable report completion on server databases
* test(studio): advertise workspace support in owner identity flow
* test(studio): queue diagnostics only on started issues
* test(studio): start issues before claiming Git fixture runs
* test(studio): target worker entries and tokens in queue fixtures
* test(studio): verify claimed worker through stored run metadata
* test(studio): align concurrency screenshot metadata with its limit
* test(studio): await durable completion before asserting run reports
* test(studio): isolate display preferences across parallel flows
* test(studio): read waiting reasons from the expanded issue summary
At phone width the shared summary starts collapsed, so expand it before asserting the Now line.
* feat(agents): organize discoveries and use Studio identity permissions
* fix(agents): align permission regressions and discovery controls
* fix(studio): declare owner progress dependencies for follow-ups
* test(studio): authorize check reads with the running identity
* test(studio): start push credential fixtures before claiming
* feat(studio): redesign the issue page around a shared live summary and feed
The issue page and My follow-ups now share the summary, the newest-first feed with system records folded, the composer and the follow star.
* fix(studio): keep the e2e tests on the new issue page and cover comment files in the feed
Runs are folded under Conversation only, the issue page's summary title is not a second heading, and the shared feed's attachments are tested.
* feat(studio): follow and unfollow one issue from the star and the command line
POST /api/followUps/issues/{issueId}/follow and /unfollow replace the star's whole-list writes; the projects plugin's subscribe routes now say they are about notifications.
* fix(studio): keep owner handoffs in view on the shared issue feed and summary
Handoffs stay in Conversation only, and a phone's folded summary opens when something waits on the viewer.
* fix(studio): give the issue summary its own title line and a bar while scrolling
The body card no longer repeats the title and status, the summary folds to a bar with what waits for the viewer, and the delivery comment reads as one line in the feed.
* fix(studio): let the issue summary fold while the page scrolls
Its frame no longer scrolls on its own, so the page's scrolling reaches it.
* feat(navigation): make inbox the default landing page
* fix(studio): remove home navigation and reorder task menus
* fix(studio): stabilize navigation checks and lint memory
* test(studio): align follow-ups sidebar order with inbox navigation
---------
Co-authored-by: Zhou <1267426+zhouyanliang@users.noreply.github.com>
* feat(studio): separate required and reference checks, explain CI failures and allow forced merges
Reference checks a repository names only inform: their failures neither
wake the agent nor block merging from Studio. Failed required checks wake
the agent once every required check of the head finished, with each
failed check's annotations and log excerpt in the input, and
`nb-studio pr checks` reads them on demand. A project manager can merge
past failed required checks with a reason, commented on the pull request
and recorded in the issue's activity; GitHub's branch protection still
applies.
* fix(studio): open force confirmation for failed CI in both PR entries
* fix(studio): run project manager work as issue owner
* fix(studio): require issue owner to start project manager
* fix(studio): cancel agent work on owner transfer
* fix(studio): preserve manager identity across retries
* fix(studio): clarify owner transfer handoff
* feat(studio): add a follow-up page for issues the viewer owns and follows
Followed issues and last-seen markers are the person's own preferences; one overview route reads issues, progress and unread counts.
* test(studio): wait for the pull request mark on the follow-ups page
The mark arrives in its own batched request after the issue's progress, so the panel's checks line is awaited rather than read once.
* feat(projects): replace workflows with six fixed issue statuses
* feat(agent-runner): report tool models, requeue busy workspaces and run read-only steps
* feat(agents): discover agents from runner reports and remove online agents
* feat(ui-library): drop online agents, model choice, checklists and approvals
* feat(studio): add the project manager and fixed statuses on the server
* feat(studio): agent page, project manager settings and issue progress in the client
* test(studio): cover the project manager, discovered agents and checks-passed signal
* docs(studio): describe the project manager, fixed statuses and discovered agents
* chore: drop the just-bash catalog entry the agents plugin no longer uses
* test(studio): page waiting decisions without approval requests
* fix(studio): allow new issues for the project manager in the direct-write quota, and scope its settings to API keys
* fix(agents): publish the model catalog export instead of the removed presets
* fix(studio): offer only the project manager as an agent executor, keep demo runtimes offline and fix the e2e flows
Executor pickers read the kinds' executor candidates, a new issue left to the project manager is not flagged as given to an agent, people talk only to agents discovered from runners, and the e2e tests no longer rely on demo runtimes being online.
* fix(studio-cli): ship the updated nb-studio Skill
* feat(agent-runner): remove read-only work directories after their run, and build artifacts of idle ones
A read-only run's directory goes when the run ends. Once no run has used a working directory for 12 hours, its node_modules, .next and .turbo directories go (configurable with config set artifact-ttl and artifact-patterns), never in a directory a run holds.
Applied migrations and seeds are recorded with a checksum of their source, so reformatting one warns every installation that already ran it. Ignore database/*/migrations/ and database/*/seeds/ in both templates and from the repository root.