-
Notifications
You must be signed in to change notification settings - Fork 2
feat(plugins): plugins, MCP, and skills management on the provider-plugin model #344
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
lucas77778
wants to merge
27
commits into
master
Choose a base branch
from
chenyu/code-487
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
d08a71c
feat(schema): plugin discovery, management, and custom MCP wire contr…
lucas77778 5b0a24c
feat(agent-adapter): discover standalone skills alongside plugin cata…
lucas77778 470be4e
fix(agent-adapter): report real claude plugin management capabilities…
lucas77778 db0951a
feat(engine): serve plugin discovery and enablement over the wire (CO…
lucas77778 ca13a7a
feat(engine,daemon): custom MCP server config plane (CODE-490)
lucas77778 1745941
feat(engine): inject enabled custom MCP servers at session start with…
lucas77778 2dc5edb
feat(client): plugin and custom MCP data plane (CODE-491)
lucas77778 d46ab60
feat(settings): Plugins tab with provider-grouped plugin cards (CODE-…
lucas77778 029aa9f
feat(settings): MCP tab — custom server management and plugin-provide…
lucas77778 1ffc66e
feat(settings): Skills tab — plugin and standalone skills (CODE-497)
lucas77778 0d11713
fix(settings): keep custom MCP secret rows out of the single-control …
lucas77778 657c092
fix(settings): drop the duplicate page title from the plugins shell (…
lucas77778 c0b9620
feat(schema,agent-adapter,engine): native per-skill enable/disable fo…
lucas77778 8d46783
feat(engine,client,settings): per-skill toggles from the wire to the …
lucas77778 644f6cd
fix(agent-adapter): accept real plugin-discovery output from current …
lucas77778 63ce7d7
feat(settings): split installed plugins from a Market tab of uninstal…
lucas77778 a7ef4bd
Merge remote-tracking branch 'origin/master' into chenyu/code-487
lucas77778 6e367a9
feat(agent-adapter): native codex plugin enable, install, and uninstall
lucas77778 16d0dea
feat(schema,engine): serve plugin install and uninstall over the wire
lucas77778 817b436
feat(client,settings): install and uninstall actions for codex plugins
lucas77778 94f7785
fix(agent-adapter): collapse duplicated ids in the codex plugin catalog
lucas77778 6a3adbf
perf(agent-adapter): read codex plugin detail only for installed plugins
lucas77778 e65f555
docs(agent-adapter): record the plugin and skill management provider …
lucas77778 6625d87
Merge remote-tracking branch 'origin/master' into chenyu/code-487
lucas77778 043537d
fix(test): resolve the worktree fixture temp path before comparing
lucas77778 1c331b4
fix(plugins): address review feedback
lucas77778 d01aa1a
Merge remote-tracking branch 'origin/master' into chenyu/code-487
lucas77778 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,30 +1,38 @@ | ||
| import type { ProviderConfigStore } from '@linkcode/engine'; | ||
| import type { Accounts, ProvidersConfig } from '@linkcode/schema'; | ||
| import { saveAccounts, saveProviders } from './config'; | ||
| import type { Accounts, CustomMcpServer, ProvidersConfig } from '@linkcode/schema'; | ||
| import { saveAccounts, saveCustomMcpServers, saveProviders } from './config'; | ||
| import type { SecretVault } from './secrets'; | ||
|
|
||
| /** | ||
| * Daemon-backed data-plane config store: in-memory providers + account pool seeded at boot, each | ||
| * persisted to `~/.linkcode/config.json` on write. Injected into the Engine so `config.get` / | ||
| * `config.set` and per-session provider defaults read and write the same persisted values. | ||
| * Daemon-backed data-plane config store: in-memory providers + account pool + custom MCP servers | ||
| * seeded at boot, each persisted to `~/.linkcode/config.json` on write. Injected into the Engine | ||
| * so `config.get` / `config.set` and per-session provider defaults read and write the same | ||
| * persisted values. | ||
| */ | ||
| export function createProviderConfigStore( | ||
| vault: SecretVault, | ||
| initialProviders: ProvidersConfig, | ||
| initialAccounts: Accounts, | ||
| initialCustomMcpServers: CustomMcpServer[] = [], | ||
| ): ProviderConfigStore { | ||
| let providers = initialProviders; | ||
| let accounts = initialAccounts; | ||
| let customMcpServers = initialCustomMcpServers; | ||
| return { | ||
| get: () => providers, | ||
| set(next) { | ||
| providers = next; | ||
| saveProviders(vault, next); | ||
| providers = next; | ||
| }, | ||
| getAccounts: () => accounts, | ||
| setAccounts(next) { | ||
| accounts = next; | ||
| saveAccounts(vault, next); | ||
| accounts = next; | ||
| }, | ||
| getCustomMcpServers: () => customMcpServers, | ||
| setCustomMcpServers(next) { | ||
| saveCustomMcpServers(next); | ||
| customMcpServers = next; | ||
| }, | ||
| }; | ||
| } |
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { PluginsSettingsPanel } from '@linkcode/workbench'; | ||
|
|
||
| // A transport-backed workbench container: reachable above the connection gate, degrading to | ||
| // loading while the daemon is unreachable — same posture as the providers tab. | ||
| export function PluginsTab(): React.ReactNode { | ||
| return <PluginsSettingsPanel />; | ||
| } |
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| import { PluginsSettingsPanel } from '@linkcode/workbench'; | ||
| import { usePageTitle } from '@webview/hooks/use-page-title'; | ||
| import { useTranslations } from 'use-intl'; | ||
|
|
||
| /** The shared plugins page lives in `@linkcode/workbench`; webview only adds the page title. */ | ||
| export function PluginsSettings(): React.ReactNode { | ||
| const tTabs = useTranslations('settings.tabs'); | ||
| usePageTitle(tTabs('plugins')); | ||
| return <PluginsSettingsPanel />; | ||
| } |
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[P1] Store custom MCP credentials in the vault
This writes each complete
CustomMcpServer, including stdioenvvalues and HTTPheaders, directly toconfig.json. These fields commonly contain long-lived credentials but bypass the existing encrypted/keyring-backed secret vault. Mode0600does not protect backups or Windows storage semantics, and a pre-existing loose file is written before the laterchmod. Please add an MCP vault namespace and persist only structure plus secret references here.