fix(extensions): use runtime-aware detail copy
This commit is contained in:
parent
767dfde4cb
commit
4775d4bc45
4 changed files with 45 additions and 7 deletions
|
|
@ -118,6 +118,8 @@ export const McpServerDetailDialog = ({
|
||||||
.map((entry) => entry.name)
|
.map((entry) => entry.name)
|
||||||
.sort()
|
.sort()
|
||||||
.join('\0') ?? '';
|
.join('\0') ?? '';
|
||||||
|
const statusSectionLabel =
|
||||||
|
cliStatus?.flavor === 'agent_teams_orchestrator' ? 'Runtime Status' : 'Claude Status';
|
||||||
const apiKeyLookupProjectPath = isProjectScopedMcpScope(scope)
|
const apiKeyLookupProjectPath = isProjectScopedMcpScope(scope)
|
||||||
? (projectPath ?? undefined)
|
? (projectPath ?? undefined)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
@ -409,7 +411,7 @@ export const McpServerDetailDialog = ({
|
||||||
{isInstalledForScope && (
|
{isInstalledForScope && (
|
||||||
<div className="space-y-2 rounded-md border border-border bg-surface-raised px-4 py-3">
|
<div className="space-y-2 rounded-md border border-border bg-surface-raised px-4 py-3">
|
||||||
<div className="flex items-center justify-between gap-3">
|
<div className="flex items-center justify-between gap-3">
|
||||||
<span className="text-sm font-medium text-text">Claude Status</span>
|
<span className="text-sm font-medium text-text">{statusSectionLabel}</span>
|
||||||
{diagnosticsLoading && !diagnostic ? (
|
{diagnosticsLoading && !diagnostic ? (
|
||||||
<Badge
|
<Badge
|
||||||
className="border-border bg-surface-raised text-text-muted"
|
className="border-border bg-surface-raised text-text-muted"
|
||||||
|
|
|
||||||
|
|
@ -192,7 +192,7 @@ export const SkillDetailDialog = ({
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<p className="text-xs font-medium uppercase tracking-wide text-text-muted">
|
<p className="text-xs font-medium uppercase tracking-wide text-text-muted">
|
||||||
How Claude uses it
|
How it is used
|
||||||
</p>
|
</p>
|
||||||
<p className="text-sm text-text">{formatInvocationLabel(item.invocationMode)}</p>
|
<p className="text-sm text-text">{formatInvocationLabel(item.invocationMode)}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -482,7 +482,7 @@ export const SkillEditorDialog = ({
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="skill-invocation">How Claude should use it</Label>
|
<Label htmlFor="skill-invocation">How it should be used</Label>
|
||||||
<Select
|
<Select
|
||||||
value={invocationMode}
|
value={invocationMode}
|
||||||
onValueChange={(value) => {
|
onValueChange={(value) => {
|
||||||
|
|
@ -495,7 +495,7 @@ export const SkillEditorDialog = ({
|
||||||
<SelectValue />
|
<SelectValue />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
<SelectItem value="auto">Claude can use it automatically</SelectItem>
|
<SelectItem value="auto">Can be used automatically</SelectItem>
|
||||||
<SelectItem value="manual-only">Only when you ask for it</SelectItem>
|
<SelectItem value="manual-only">Only when you ask for it</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
|
|
@ -575,7 +575,7 @@ export const SkillEditorDialog = ({
|
||||||
|
|
||||||
<div className="grid gap-3">
|
<div className="grid gap-3">
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="skill-when-to-use">When Claude should reach for this</Label>
|
<Label htmlFor="skill-when-to-use">When to reach for this</Label>
|
||||||
<Textarea
|
<Textarea
|
||||||
id="skill-when-to-use"
|
id="skill-when-to-use"
|
||||||
value={whenToUse}
|
value={whenToUse}
|
||||||
|
|
@ -591,7 +591,7 @@ export const SkillEditorDialog = ({
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="skill-steps">Main steps Claude should follow</Label>
|
<Label htmlFor="skill-steps">Main steps to follow</Label>
|
||||||
<Textarea
|
<Textarea
|
||||||
id="skill-steps"
|
id="skill-steps"
|
||||||
value={steps}
|
value={steps}
|
||||||
|
|
@ -666,7 +666,7 @@ export const SkillEditorDialog = ({
|
||||||
<div>
|
<div>
|
||||||
<p className="font-medium text-text">References</p>
|
<p className="font-medium text-text">References</p>
|
||||||
<p className="mt-1 text-xs text-text-muted">
|
<p className="mt-1 text-xs text-text-muted">
|
||||||
Add supporting docs, links, or examples that Claude can look at.
|
Add supporting docs, links, or examples the runtime can look at.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,42 @@ describe('McpServerDetailDialog installed entry handling', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('uses a runtime-aware status label in multimodel mode', async () => {
|
||||||
|
storeState.cliStatus = { flavor: 'agent_teams_orchestrator' };
|
||||||
|
const host = document.createElement('div');
|
||||||
|
document.body.appendChild(host);
|
||||||
|
const root = createRoot(host);
|
||||||
|
const installedEntry: InstalledMcpEntry = {
|
||||||
|
name: 'context7-global',
|
||||||
|
scope: 'global',
|
||||||
|
};
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
root.render(
|
||||||
|
React.createElement(McpServerDetailDialog, {
|
||||||
|
server: makeServer(),
|
||||||
|
isInstalled: true,
|
||||||
|
installedEntry,
|
||||||
|
installedEntries: [installedEntry],
|
||||||
|
diagnostic: null,
|
||||||
|
diagnosticsLoading: false,
|
||||||
|
projectPath: null,
|
||||||
|
open: true,
|
||||||
|
onClose: vi.fn(),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
await Promise.resolve();
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(host.textContent).toContain('Runtime Status');
|
||||||
|
expect(host.textContent).not.toContain('Claude Status');
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
root.unmount();
|
||||||
|
await Promise.resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('preserves edited fields when multimodel scope metadata loads after open', async () => {
|
it('preserves edited fields when multimodel scope metadata loads after open', async () => {
|
||||||
storeState.cliStatus = null;
|
storeState.cliStatus = null;
|
||||||
const host = document.createElement('div');
|
const host = document.createElement('div');
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue