feat(web): SC-9 plugin / marketplace / MCP / secret tab UIs #648

Merged
code-lead merged 2 commits from dev/631 into main 2026-05-01 16:21:07 +00:00
Collaborator

Implements all four stub tabs on /settings/agent-config.

  • PluginsTab: scope-filterable plugin_binding list, inline enabled toggle, edit/fork/reset menu, add drawer
  • MarketplacesTab: same action-menu shape; columns: name, source kind, URL, scope chip
  • McpTab: card-style list; edit modal with transport radio (stdio/http/sse), chip-list args, env key-value pairs with ${SECRET:NAME} autocomplete, client-side validation
  • SecretsTab: inline component replacing the previous redirect to /settings/secrets — same write-only value UX and access-log drawer

Test plan

  • One vitest smoke test per tab covering create / edit / delete loops
  • 56 test files, 642 tests all pass
  • Biome lint + format clean

Closes #631

Implements all four stub tabs on `/settings/agent-config`. - **PluginsTab**: scope-filterable `plugin_binding` list, inline enabled toggle, edit/fork/reset menu, add drawer - **MarketplacesTab**: same action-menu shape; columns: name, source kind, URL, scope chip - **McpTab**: card-style list; edit modal with transport radio (stdio/http/sse), chip-list args, env key-value pairs with `${SECRET:NAME}` autocomplete, client-side validation - **SecretsTab**: inline component replacing the previous redirect to `/settings/secrets` — same write-only value UX and access-log drawer ## Test plan - One vitest smoke test per tab covering create / edit / delete loops - 56 test files, 642 tests all pass - Biome lint + format clean Closes #631
dev self-assigned this 2026-05-01 16:01:08 +00:00
feat(web): SC-9 plugin / marketplace / MCP / secret tab UIs
All checks were successful
qa / dockerfile (pull_request) Successful in 5s
qa / qa (pull_request) Successful in 2m59s
a763b1341a
Implements the four stub tabs on /settings/agent-config:

- PluginsTab: scope-filterable list of plugin_binding rows with
  inline enabled toggle, edit/fork/reset action menu, and add drawer.
- MarketplacesTab: same action menu shape; columns: name, kind, URL,
  scope chip.
- McpTab: card-style list; edit modal with transport radio (stdio /
  http / sse), chip-list args, env key-value pairs with ${SECRET:NAME}
  autocomplete, client-side transport validation.
- SecretsTab: inline component (no AppShell) replacing the previous
  redirect to /settings/secrets; same write-only value UX and access-
  log drawer as the dedicated page.

All tabs call the SC-7 /agent-config/* routes and invalidate TanStack
Query on mutation. One vitest smoke test per tab covers create / edit /
delete loops (56 files, 642 tests all green).

Closes #631

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dev requested review from reviewer 2026-05-01 16:04:10 +00:00
reviewer left a comment

Two issues to fix:

  • behavior secrets-tab.tsx AccessLogDrawer — fetches fetchSecretAccessLog(name) with no pagination opts and renders no page controls. The API returns limit/offset fields because there can be >50 entries. AC requires a paginated viewer — add Prev/Next or Load-more controls that pass offset through.
  • behavior mcp-tab.tsx EnvEditor.addEntry()onChange({ ...value, "": "" }) collapses to one entry when called twice before the first key is named (object keys must be unique). Use an array of [k, v] tuples as state instead of Record<string, string>.
**Two issues to fix:** - **behavior** `secrets-tab.tsx` `AccessLogDrawer` — fetches `fetchSecretAccessLog(name)` with no pagination opts and renders no page controls. The API returns `limit`/`offset` fields because there can be >50 entries. AC requires a paginated viewer — add Prev/Next or Load-more controls that pass `offset` through. - **behavior** `mcp-tab.tsx` `EnvEditor.addEntry()` — `onChange({ ...value, "": "" })` collapses to one entry when called twice before the first key is named (object keys must be unique). Use an array of `[k, v]` tuples as state instead of `Record<string, string>`.
fix(web): paginate access-log drawer; fix EnvEditor key collision
All checks were successful
qa / dockerfile (pull_request) Successful in 7s
qa / qa (pull_request) Successful in 2m10s
fc37b0f00b
- AccessLogDrawer: add offset state and Prev/Next controls; passes
  offset to fetchSecretAccessLog and keys the query on it so TanStack
  refetches each page correctly.
- EnvEditor: replace Record<string,string> state with Array<[string,string]>
  tuples so addEntry() can append a second blank row before the first key
  is named without clobbering it (object keys must be unique).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Author
Collaborator

Both issues fixed in the latest push:

  • AccessLogDrawer: added offset state; fetchSecretAccessLog now receives it, queryKey includes it so TanStack refetches on navigation. Prev/Next buttons disabled when at the first page or when the current page is shorter than data.limit (no more entries).
  • EnvEditor: replaced Record<string,string> state with Array<[string,string]> tuples. addEntry appends ["" ,""] regardless of whether the previous row key has been filled. Tuples are converted back to a record (filtering blank keys) only at mutation time.
Both issues fixed in the latest push: - **`AccessLogDrawer`**: added `offset` state; `fetchSecretAccessLog` now receives it, queryKey includes it so TanStack refetches on navigation. Prev/Next buttons disabled when at the first page or when the current page is shorter than `data.limit` (no more entries). - **`EnvEditor`**: replaced `Record<string,string>` state with `Array<[string,string]>` tuples. `addEntry` appends `["" ,""]` regardless of whether the previous row key has been filled. Tuples are converted back to a record (filtering blank keys) only at mutation time.
dev requested review from reviewer 2026-05-01 16:17:50 +00:00
reviewer approved these changes 2026-05-01 16:19:28 +00:00
reviewer left a comment

Both prior findings fixed: AccessLogDrawer now has Prev/Next pagination via offset state, and EnvEditor uses EnvTuples (array of tuples) eliminating the key-collision bug. CI green.

Both prior findings fixed: `AccessLogDrawer` now has Prev/Next pagination via `offset` state, and `EnvEditor` uses `EnvTuples` (array of tuples) eliminating the key-collision bug. CI green.
reviewer approved these changes 2026-05-01 16:19:58 +00:00
reviewer left a comment

Both prior findings fixed: AccessLogDrawer now has Prev/Next pagination via offset state, and EnvEditor uses EnvTuples (array of tuples) eliminating the key-collision bug. CI green.

Both prior findings fixed: `AccessLogDrawer` now has Prev/Next pagination via `offset` state, and `EnvEditor` uses `EnvTuples` (array of tuples) eliminating the key-collision bug. CI green.
code-lead deleted branch dev/631 2026-05-01 16:21:07 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks!648
No description provided.