feat(workspace): Workspace Projects — seams, MCP tools and gated UI (ent#661 v1–v3) - #3119
Merged
Merged
Conversation
…(ent#661) An edition-agnostic provider registry (services/turn_context.py) that lets a module add a line to a Workspace turn. Both composers call it: the 1:1 chat on both the resumed and cold arms, the room ahead of the file manifest. The context is resolved by the platform (chat row, room membership), including internal_audience, so an internal-only line never reaches a turn an outside client can read. No provider in an OSS build: turns are byte-for-byte unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
raise_ask(addressee=...) bypasses role resolution for a platform raise, so a consent decision (an agent owner approving a project link) reaches that owner rather than whoever an assignment provider maps primary to. An agent's raise that names an addressee is a programming error: an agent never picks who is asked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w seam (ent#661) PortalRoster.projects_available is true only when the module is entitled and the principal is a platform user, so an outside client is never told the capability exists. Defaults False (fails closed on an older backend). The roster stays the Workspace's only capability channel (#2128). The enterprise-docs guard now scans services/turn_context.py like the other open-core seam files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-facing reads over the Workspace Projects agent routes: the projects the calling agent is active on (its owner consented), goal/status/steward/links, and linked chat/room counts only — never other people's chats. License-blind like credential_vault.ts: 404 = OSS build, string 403 = unlicensed, code 403 = agent-key gate; never throws. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…trols (ent#661) Gated on the roster's projects_available (strict === true), so an outside client and a build without the module never see it. - /workspace/projects: the person's list across agents (all / member / company, archived toggle, search); /workspace/projects/:id: goal, status, steward, Work on it (reopen my newest chat, or start one and link it), my chats, others' chats as a count only, agents with consent state, members, rooms. Creator: status, archive/restore, Members & access. - Rail Projects tab (platform door + capability, checked fail-closed). - Chat header: the project badge + Detach, or one Project button that adds the chat to a project or makes a new one from it. Never in Main. - stores/projects.js on portalHttp; four honest states via viewState. - Mount tests for every destructive or store-writing predicate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t view (ent#661 v3)' Requirements 48.4 and the architecture entries for the turn-context seam, the addressed gate ask, the roster capability and the gated Workspace UI. Describes the seam only; the module design stays private. Renames the objective-join references from the retired 'project hub' to 'the project view (ent#661 v3)' as asked on the issue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…uests, import, Wrap up (ent#661) Backend (open-core seams): - services/portal_capabilities.py: a per-person capability seam (fails closed); the roster's projects_available now also reaches an outside client invited to a project. Guarded by enterprise-docs-guard. Workspace UI (gated on the roster capability): - Project page tabs: Overview / Tasks (ent#673 fields, grouped open / awaiting verification / done; a done task only reopens) / Log (append- only timeline + add) / Files & reports (add from what you can see, share with guests, ReportRenderer view). - Guests: invite in Members & access; a narrow page, list and rail for an invited outside client; no Project button or Wrap up for them. - Import a folder project from an agent (one-shot). - Wrap up in a linked chat: a visible message asking the agent to record the chat's outcomes with its project tools. - v1 gaps: Edit (name, goal, person/agent steward, tracker, visibility); link a room from its header. MCP: list_project_tasks, get_project_log, create_project_task, update_project_task (assignee -> agent), add_project_task_note, add_project_log_entry, link_to_project. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every Workspace-project call now carries the request's X-Trinity-Execution-Id (#2392), taken from the auth context and never from a tool parameter, so the backend can decide who the turn is for. A refusal for an outside audience, or for a turn it can't identify, comes back as words the agent can act on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s kind (ent#661) At 390px the Overview grid's implicit column and the tab strip sized to their content and pushed the cards past the viewport. Explicit single-column grids, plus a bounded box around OverflowTabs so "More" collapses the extra tabs. The task log also shows each entry's kind (Created, Done claim, Reopened…). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ask_operator forwards the request's X-Trinity-Execution-Id (#2392). When that id is the raising agent's own execution, raise_ask stamps it as the ask's execution, winning over an agent-written context.execution_id. `manual`, an unknown id or another agent's id changes nothing. This is how an ask raised in a project's chat is found on the project; before this, the row carried only what the agent chose to write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
get_steward_digest and set_project_health for a steward agent, and link_to_project now accepts an ask the agent raised. Both forward the turn id like the other project tools, and have policy rows in access.ts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eeds you, I steward (ent#661) Overview gains the hub: - the steward's health (set in a dialog); - tasks by status, with what needs attention (opening Tasks); - linked agent metrics, each with its value, trend and stale state; - Needs you: the viewer's own asks on the project, answered in place with PortalAsks, narrowed by the new askIds prop, which can only narrow. The list shows health and an attention count per row, and gains an "I steward" tab. A health update reads as Status in the log. Mount tests cover every write gate (#2918); FR-5, FR-7 and the ask-turn note are updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
merge-train: this PR is on today's train with #3122, #3120 and #3085. It validated READY at lane C: Merge order: this PR, then abilityai/trinity-enterprise#732, then the submodule pin bump. ent#732 imports Follow-ups. None of them block:
|
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.
Summary
Workspace Projects: the open-core seams, the agent MCP tools, and the gated Workspace UI for Abilityai/trinity-enterprise#661 (v1–v3). The project logic lives in the private module, which lands in its own PR. This PR has the edition-agnostic seams and the surface the module fills in. On an OSS build every seam returns nothing, and the UI is hidden.
Fixes Abilityai/trinity-enterprise#661
Seams (backend)
services/turn_context.py: a provider registry for extra lines on a Workspace chat or room turn. It carries whether the audience is internal. It's wired into both arms ofportal_chatand intoshared_sessions._wake_agent. With no provider, nothing changes.services/portal_capabilities.py: a capability registry for the Workspace roster, which fails closed.PortalRoster.projects_availableis the only channel the UI reads (bug(workspace): multi-agent chat picker is offered on builds with no rooms backend — 404 dead end #2128).ask_service.raise_ask(addressee=): agateraise may name exactly who is asked. An agent's raise still can't.raise_ask(platform_execution_id=):ask_operatorforwardsX-Trinity-Execution-Id(feat(pull): platform-injected execution id for the side-effect guard — Tier-6 T6.3, blocks default-ON for side-effect agents #2392). When the id is the raising agent's own execution, it's recorded as the ask's execution and wins over an agent-writtencontext.execution_id.manual, an unknown id, or another agent's id changes nothing.enterprise-docs-guard.ymlnow also scans the two new seam files.MCP (
tools/projects.ts)list_projects,get_project,list_project_tasks,get_project_log.create_project_task,update_project_task,add_project_task_note,add_project_log_entry,link_to_project(a file, report, decision, or an ask the agent raised).get_steward_digest,set_project_health.The tools are license-blind (404 means no module; a plain-string 403 means unlicensed). Every call forwards the platform-supplied
X-Trinity-Execution-Id, never a tool parameter. The module answers only in a turn whose audience is internal.Workspace UI (gated on
projects_available)PortalAsksgains anaskIdsfilter that can only narrow the viewer's own list.Docs
docs/memory/requirements/public-access.md§48.4 (FR-1…FR-7), plusarchitecture/backend.mdandarchitecture/workspace.md. They describe the seams only.Screenshots
To be attached by the author: the v3 overview (health, where it stands, metrics); Needs you with an ask raised in a project chat; the I steward tab; an agent working inside a linked chat; the project log after Wrap up; the guest view; and an outside client asking the agent about the project and being refused.
Test plan
tsc --noEmitis clean.npm run buildboth pass.🤖 Generated with Claude Code