Skip to content

Commit fea3ab3

Browse files
doudouOUCqwencoderqwen-code-dev-bot
authored
feat(serve): add extension management v2 (#6825)
* feat(cli): workspace-qualified extensions REST (daemon multi-workspace) Mirror the daemon extension-management REST surface to per-workspace routes, reusing the Phase 3 runtime resolver and trust gate. Extract a per-workspace extensions controller so the primary workspace shares one install queue, operation history, and status cache across the legacy and workspace-qualified routes. Reads resolve the target runtime only; mutations require a trusted workspace. Advertise a new baseline capability so clients can discover the surface, and add matching SDK client methods. Refs #6378. * qwen: address PR review feedback (#6638) Align the new extensions controller file's copyright year with the other new files added in this change. * qwen: address PR review feedback (#6638) Redact credentials from the extension source on the two success-path fan-outs (session refresh and refresh-failure broadcast), matching the operation record and failure broadcast. Document the non-cancellation semantics of the extension timeout wrapper. * qwen: address PR review feedback (#6638) Share the queue-full sentinel message via an exported constant so the throw site (controller) and the 429 match site (routes) cannot drift after the module split. Include the bound workspace in the extension operation log prefixes so concurrent per-workspace controllers are distinguishable in stderr. * feat(cli): add concurrent extension preparation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): remove redundant extension context build Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): address extension review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address final review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address latest review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): reject links in npm extension archives Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): limit npm extension archive downloads Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address review follow-ups Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address latest review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): release rejected operation slots Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address operation review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): align archive handling contracts Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): preserve watcher generation state Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * docs(extensions): align management contracts Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk): bound extension operation polls Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(core): cover forged prepared commits Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(core): assert activation generation increment Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): close archive and polling gaps Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): retry suppressed extension generations Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(cli): cover archive URL extension updates Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk): preserve unbounded operation waits Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): share npm redirect download deadline Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): preserve extension reload diagnostics Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): preserve installed Claude plugin paths Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): return committed activation state Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): preserve extension preparation errors Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): validate extension setting env vars Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): target extension reconciliation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(cli): cover resultless legacy commit warnings Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): retain suppressed extension generations Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): record legacy runtime reconciliation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): validate extension clients by runtime Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): record workspace activation refresh Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(cli): stop extension reconcilers after cases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): resolve global runtimes at reconciliation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): reconcile newly registered runtimes Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): prevent overlapping runtime reconciliation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): dispose late runtime apps during shutdown Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): keep projection repair best effort Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): preserve committed store results Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): quarantine corrupt store journals Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): harden npm download redirects Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address review edge cases Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): honor cancellation between preparation stages Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): retry prepared cleanup failures Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(extensions): cover committed artifact recovery boundary Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(serve): release extension refresh queue on timeout Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix: address extension review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6638) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): reconcile extension store compatibility state Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): bound npm redirects and isolate extension tests Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): make extension uninstall store-authoritative Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): defer prepared extension secret mutations Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): validate staged extensions before commit Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): enforce public extension network policy Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(core): handle extension response failures Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): surface committed refresh warnings Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): guard timer unref calls Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): release commit lane after durable writes Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * test(serve): update mutation callback assertions Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(serve): refresh live extension instructions Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address latest review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address follow-up review findings Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address remaining activation feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(serve): preserve preparation queue status Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): enforce network request deadlines Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * docs(serve): clarify single-workspace capabilities Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): guard deferred settings commit Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): cancel archive extraction Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): harden refresh recovery Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(serve): serialize extension reconciliation Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(extensions): address post-commit review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: fix CI failure on PR #6825 Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: fix CI failure on PR #6825 Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix: address critical PR review feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(cli): bound legacy extension update checks Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(acp): deduplicate extension refresh requests Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * codex: address PR review feedback (#6825) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> * fix(sdk): update browser bundle budget after main merge Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> --------- Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
1 parent bc8e394 commit fea3ab3

93 files changed

Lines changed: 17856 additions & 1891 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# Extension Management V2
2+
3+
## Status
4+
5+
This design extends daemon protocol `v1` under the additive
6+
`extension_management_v2` capability. The already-published
7+
`workspace_extensions` capability and `/workspace/extensions/*` routes remain
8+
available as a primary-workspace compatibility adapter.
9+
10+
## Resource model
11+
12+
An installed extension is one user-level artifact in `QWEN_HOME/extensions`.
13+
Activation is policy, not a second copy of that artifact:
14+
15+
1. An exact workspace override (`enabled` or `disabled`).
16+
2. An internal exact `inherit` mask created while migrating legacy path rules.
17+
3. An ordered V1 path rule.
18+
4. The global default.
19+
20+
Workspace identity uses the daemon's canonical workspace path. A workspace
21+
route selects an existing runtime by workspace id first and canonical cwd
22+
second. Reads are allowed for untrusted runtimes; activation changes, refresh,
23+
and workspace-scoped install require a trusted target. Global mutation uses the
24+
normal daemon mutation authentication and install consent, not the trust state
25+
of whichever workspace initiated the request.
26+
27+
## Store and transaction boundary
28+
29+
`ExtensionStore` is the only writer of final extension directories and V2
30+
activation state. `ExtensionManager` remains the workspace-facing facade, but
31+
CLI, TUI, auto-update, daemon, and SDK-backed operations delegate mutations to
32+
the store.
33+
34+
The layout is:
35+
36+
```text
37+
~/.qwen/
38+
├── extensions/
39+
└── extension-store/
40+
├── lock
41+
├── state.json
42+
├── state.previous.json
43+
├── staging/
44+
├── rollback/
45+
└── transactions/
46+
```
47+
48+
The store and artifacts share a filesystem so artifact swaps are directory
49+
renames. An in-process mutex and a `proper-lockfile` lock serialize commits
50+
across all V2-aware processes. Every mutation re-reads state while holding the
51+
lock and increments a monotonic generation, preventing lost updates.
52+
53+
Install/update preparation happens outside the final artifact directory. The
54+
commit writes a `prepared` journal, moves the old artifact to rollback, moves
55+
staging into place, and atomically writes `state.json`. That state rename is the
56+
commit point. Before it, recovery rolls back; after it, recovery only completes
57+
projection and cleanup. A committed policy is never rolled back because one
58+
runtime refresh failed. If both a pre-commit operation and its rollback fail,
59+
the caller receives both errors and the journal remains for fail-closed recovery;
60+
the store does not continue writing through an ambiguous artifact state.
61+
62+
Store files use owner-only permissions and atomic no-follow writes. Extension
63+
ids, direct-child artifact paths, transaction paths, and names are validated.
64+
Failures are reported with credential-redacted sources.
65+
66+
## V1 migration and downgrade projection
67+
68+
The first V2-aware process imports ordered rules from
69+
`extension-enablement.json` without materializing the current set of registered
70+
workspaces as exact overrides. V2 writes a compatible projection after each
71+
state commit and stores its hash in `state.json`.
72+
73+
If hashes differ, modification order decides the recovery direction: an older
74+
projection is repaired from authoritative V2 state; a projection modified after
75+
V2 state is treated as a sequential write by a downgraded binary and is
76+
re-imported with a new generation. Concurrent V1 and V2 writers sharing one
77+
`QWEN_HOME` are intentionally unsupported.
78+
79+
Clearing a public workspace override normally deletes the exact record. If an
80+
older path rule would then change the effective value, the store writes an
81+
internal `inherit` mask so DELETE still means “inherit the global default.”
82+
83+
## Daemon API
84+
85+
The global surface is:
86+
87+
```text
88+
GET /extensions
89+
POST /extensions/install
90+
POST /extensions/check-updates
91+
POST /extensions/:extensionId/update
92+
DELETE /extensions/:extensionId
93+
PUT /extensions/:extensionId/activation
94+
GET /extensions/operations/:operationId
95+
```
96+
97+
Install requires explicit consent and initial activation:
98+
99+
```ts
100+
type InitialActivation =
101+
| { scope: 'user' }
102+
| { scope: 'workspace'; workspaceId: string };
103+
```
104+
105+
The daemon install endpoint accepts HTTPS Git, GitHub Release, and npm sources
106+
under the public network policy. SSH and local/link sources remain local CLI
107+
features. Update preserves the extension id,
108+
manifest name, settings, and activation policy. “Already current” is a
109+
successful `updated: false` result. Uninstall is idempotent and removes both the
110+
artifact and policy.
111+
112+
The workspace projection is:
113+
114+
```text
115+
GET /workspaces/:workspace/extensions
116+
PUT /workspaces/:workspace/extensions/:extensionId/activation
117+
DELETE /workspaces/:workspace/extensions/:extensionId/activation
118+
POST /workspaces/:workspace/extensions/refresh
119+
```
120+
121+
It intentionally has no workspace artifact mutation routes. Projection entries
122+
include default, exact workspace value, effective value, and source. Desired
123+
generation and locally applied generation are top-level response fields.
124+
125+
Potentially slow mutations return `202`, `Location`, and `Retry-After`. The
126+
operation record is daemon-local memory, retains at most 100 terminal records,
127+
and can disappear on restart. Catalog/store recovery is authoritative. SDK
128+
polling timeout stops polling only; it never cancels accepted work.
129+
130+
The daemon admits at most 10 unfinished extension operations. A daemon-wide
131+
FIFO preparation queue runs at most two downloads, extractions, conversions,
132+
or single-extension update checks at once. Install and update use an explicit
133+
`prepare -> commit/dispose` lifecycle: preparation owns staging files and
134+
revisioned credential snapshots but does not change the store, cache, runtime,
135+
or credentials selected by the installed artifact. Prepared mutations enter a
136+
separate single-concurrency FIFO commit queue in the order preparation
137+
finishes. Activation and uninstall enter only the commit queue; check-updates
138+
enters only the preparation queue. Manual refresh is serialized through the
139+
commit queue. Its HTTP timeout releases that lane so a stalled runtime refresh
140+
cannot permanently block later extension mutations; the already-started refresh
141+
may still settle afterward. Sensitive settings are staged as one atomic secret
142+
bundle under a per-prepare revision. A non-secret selector records that revision
143+
and secure-storage backend inside the staged artifact, so only the winning
144+
artifact commit activates a complete bundle. The store commit is therefore the
145+
durability point and releases the commit lane immediately. Extension reload,
146+
legacy per-key settings synchronization, manager runtime refresh, prepared-file
147+
cleanup, and daemon runtime reconciliation run outside it. These post-commit
148+
steps do not occupy either slot, so later commits may proceed while an earlier
149+
generation is being applied or cleaned up.
150+
151+
Disposing a prepared mutation removes its unselected credential snapshot, and a
152+
successful commit removes the previously selected snapshot best-effort. A hard
153+
process crash before disposal can leave an unreachable entry in the secure
154+
backend; no artifact selector references it, so it cannot become active or be
155+
mistaken for the committed credentials.
156+
157+
The preparation deadline starts when an operation first acquires a preparation
158+
slot, not while it waits. Abort is propagated to network operations and active
159+
archive scanning and extraction streams. A started task continues to occupy its
160+
slot until its underlying promise settles even if it ignores abort. Commit is
161+
not cancellable. Prepared updates carry the target artifact generation:
162+
unrelated extension or activation changes safely rebase, while a stale update
163+
of the same artifact fails with `extension_conflict`.
164+
165+
Remote npm metadata is streamed with a 10 MiB response cap. npm and GitHub
166+
archives have separate 100 MiB download caps, request deadlines, redirect
167+
limits, and archive-entry validation before extraction.
168+
169+
## Runtime reconciliation
170+
171+
A successful commit invalidates local status and refreshes affected runtimes.
172+
Global artifact/default changes reconcile all runtimes in this daemon; an exact
173+
workspace override reconciles only its target. Runtime reconciliation refreshes
174+
extension and skill caches, extension tools, hierarchical memory, active chat
175+
system instructions, and available commands. A failed component does not skip
176+
the remaining refresh components; the session RPC reports the combined failure
177+
after all components have been attempted. Runtime generation reconciliation
178+
uses a daemon-wide FIFO shared by mutations and the generation poller. A
179+
mutation reserves its position at the durable commit callback, so later
180+
generations cannot refresh a runtime first even when earlier post-commit work
181+
finishes later.
182+
The ACP bridge bounds each session refresh at 30 seconds. If the aggregate
183+
refresh still exceeds the route deadline, the controller releases the commit
184+
lane without cancelling the underlying RPC. Applying generation N also
185+
satisfies waiters for older generations,
186+
and a late lower-generation refresh therefore cannot move the applied
187+
generation backwards. Partial refresh failure or post-commit reload/cleanup
188+
failure produces `succeeded_with_warnings` with workspace-specific or commit
189+
diagnostics, without rolling back the artifact.
190+
191+
Legacy workspace migration treats a committed artifact as failed only when it
192+
could not be reloaded. Settings compatibility synchronization, cleanup, or
193+
runtime-refresh warnings do not trigger a retry of an artifact that is already
194+
durably installed. Update callers receive warning details; compatibility and
195+
cleanup warnings use a distinct `updated with warnings` state, while reload or
196+
runtime-refresh failures remain `updated, needs restart`.
197+
198+
The extension file watcher observes only `extension-store/state.json` for
199+
policy generation and continues to observe installed/linked extension content
200+
for command, skill, agent, hook, and MCP changes. A 30-second generation poll
201+
repairs missed filesystem events and bounds convergence for other daemons that
202+
share the store.
203+
204+
## Compatibility
205+
206+
`workspace_extensions` remains the capability for the existing singular
207+
surface. Its handlers call the same manager/coordinator and adapt responses:
208+
project activation becomes a primary workspace override; user activation keeps
209+
the legacy rule-clearing behavior; global mutation reconciles every local
210+
runtime. The legacy operation endpoint maps V2 warning completion back to the
211+
published legacy refresh-error status.
212+
213+
Clients must check `extension_management_v2`; neither daemon mode nor another
214+
workspace capability implies this API. The abandoned
215+
`workspace_qualified_extensions` proposal is not part of the protocol.
216+
217+
## Non-goals
218+
219+
- Per-workspace artifact copies.
220+
- A daemon registry or remote acknowledgement protocol.
221+
- User cancellation of accepted operations.
222+
- Concurrent old-binary and V2-aware writes to one `QWEN_HOME`.
223+
- Removing the V1 adapter before a future protocol-v2 migration.

docs/developers/daemon/11-capabilities-versioning.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ Permissions: `session_permission_vote`, `permission_vote`, **`permission_mediati
118118

119119
Workspace read-only snapshots: `workspace_mcp`, `workspace_skills`, `workspace_providers`, `workspace_env`, `workspace_preflight`, `workspace_hooks`, `workspace_extensions`.
120120

121+
Extension management: `extension_management_v2` adds the global `/extensions/*` catalog/mutation/operation contract and the workspace activation projection. It is separate from the published `workspace_extensions` compatibility surface and from `workspace_qualified_rest_core`.
122+
121123
Workspace mutation (Wave 4+): `workspace_memory`, `workspace_agents`, `workspace_agent_generate`, `workspace_tool_toggle`, **`workspace_settings`** (conditional), `workspace_permissions`, `workspace_init`, `workspace_github_setup`, `workspace_trust`, `workspace_mcp_restart`, `workspace_mcp_manage`, `workspace_file_read`, `workspace_file_bytes`, `workspace_file_write`, **`workspace_reload`** (conditional).
122124

123125
MCP guardrails: **`mcp_guardrails`** (`modes: ['warn', 'enforce']`), `mcp_guardrail_events`, `mcp_server_runtime_mutation`, **`mcp_workspace_pool`** (conditional), **`mcp_pool_restart`** (conditional).

0 commit comments

Comments
 (0)