@mdwrk/extension-manager 1.1.7 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -47
- package/dist/components/ExtensionCard.d.ts +1 -1
- package/dist/components/ExtensionCard.d.ts.map +1 -1
- package/dist/components/ExtensionCard.js +5 -2
- package/dist/components/ExtensionCard.js.map +1 -1
- package/dist/components/ExtensionManagerSettingsPanel.d.ts.map +1 -1
- package/dist/components/ExtensionManagerSettingsPanel.js +2 -1
- package/dist/components/ExtensionManagerSettingsPanel.js.map +1 -1
- package/dist/components/ExtensionManagerView.d.ts.map +1 -1
- package/dist/components/ExtensionManagerView.js +57 -31
- package/dist/components/ExtensionManagerView.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/createExtensionManagerBundledEntry.d.ts.map +1 -1
- package/dist/createExtensionManagerBundledEntry.js +3 -9
- package/dist/createExtensionManagerBundledEntry.js.map +1 -1
- package/dist/i18n.d.ts +44 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +52 -8
- package/dist/i18n.js.map +1 -1
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/en.js +13 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/es.d.ts.map +1 -1
- package/dist/locales/es.js +43 -0
- package/dist/locales/es.js.map +1 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +30 -2
- package/dist/manifest.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,57 +1,34 @@
|
|
|
1
1
|
# @mdwrk/extension-manager
|
|
2
2
|
|
|
3
|
-
First-party
|
|
3
|
+
**First-party extension operations console**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://github.com/groupsum/markdown_workspace/blob/master/packages/extensions/extension-manager/README.md"><img alt="Hits" src="https://visitor-badge.laobi.icu/badge?page_id=groupsum.markdown_workspace.packages_extensions_extension_manager_README&left_text=hits" /></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/@mdwrk/extension-manager"><img alt="Downloads" src="https://img.shields.io/npm/dm/%40mdwrk%2Fextension-manager?label=downloads" /></a>
|
|
8
|
+
<a href="../../../package.json"><img alt="Node" src="https://img.shields.io/badge/node-20.x%20%7C%2021.x%20%7C%2022.x-339933?logo=node.js&logoColor=white" /></a>
|
|
9
|
+
<a href="../../../LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" /></a>
|
|
10
|
+
</p>
|
|
6
11
|
|
|
7
|
-
-
|
|
8
|
-
- bundled entry export: `./bundled`
|
|
9
|
-
- compatibility declarations: host API, runtime, app, and theme contract ranges are declared in `src/manifest.ts`
|
|
10
|
-
- lifecycle model: bundled first-party extension activated through `@mdwrk/extension-runtime`
|
|
12
|
+
This package provides the first-party bundled operator console for browsing, enabling, disabling, configuring, and diagnosing MdWrk extensions.
|
|
11
13
|
|
|
12
|
-
##
|
|
14
|
+
## Why
|
|
15
|
+
Use it when you want a concrete management surface on top of the runtime rather than only the headless runtime APIs.
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
## What
|
|
18
|
+
- A packaged first-party extension, not the core runtime itself.
|
|
19
|
+
- Views and UI for extension inventory, state, and diagnostics.
|
|
20
|
+
- A bundled entry surface consumed by the client host.
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- activation mode and activation status
|
|
19
|
-
- compatibility state
|
|
20
|
-
- granted and missing capabilities
|
|
21
|
-
- runtime diagnostics and last-error state
|
|
22
|
-
- schema-driven settings forms for extensions that declare `settingsSchema`
|
|
22
|
+
## Installation
|
|
23
|
+
Node.js 20.x through 22.x, matching the workspace engine contract in the root package manifest.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
```bash
|
|
26
|
+
npm install @mdwrk/extension-manager @mdwrk/extension-runtime
|
|
27
|
+
```
|
|
25
28
|
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
## Usage
|
|
30
|
+
Import this package into a host that already exposes the MdWrk extension runtime and host APIs.
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
- `src/createExtensionManagerBundledEntry.tsx`
|
|
33
|
-
|
|
34
|
-
## i18n readiness
|
|
35
|
-
|
|
36
|
-
The package ships locale labels and locale loaders under:
|
|
37
|
-
|
|
38
|
-
- `src/i18n.ts`
|
|
39
|
-
- `src/locales/en.ts`
|
|
40
|
-
- `src/locales/es.ts`
|
|
41
|
-
|
|
42
|
-
All user-facing manifest/view/settings labels are `I18nLabel` descriptors.
|
|
43
|
-
|
|
44
|
-
## Lifecycle and host/runtime integration tests
|
|
45
|
-
|
|
46
|
-
- `tests/extension-manager.test.tsx` exercises the bundled entry, runtime wiring, and extension inventory/state rendering helpers
|
|
47
|
-
|
|
48
|
-
## Install / configuration guidance
|
|
49
|
-
|
|
50
|
-
This package is intended for first-party bundling into `apps/client`.
|
|
51
|
-
Once active, it becomes the operator console for extension/runtime inventory, compatibility state, diagnostics, and settings visibility.
|
|
52
|
-
|
|
53
|
-
## API/reference docs
|
|
54
|
-
|
|
55
|
-
See the generated reference page at:
|
|
56
|
-
|
|
57
|
-
- `docs/reference/packages/mdwrk-extension-manager.md`
|
|
32
|
+
## Related
|
|
33
|
+
- [Packages index](../../README.md) - family and package navigation
|
|
34
|
+
- [Root README](../../../README.md) - repo overview
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { I18nLabel } from "@mdwrk/extension-manifest";
|
|
2
|
-
import type
|
|
2
|
+
import { type ExtensionRuntime, type ExtensionRuntimeExtensionSnapshot } from "@mdwrk/extension-runtime";
|
|
3
3
|
export interface ExtensionCardProps {
|
|
4
4
|
readonly extension: ExtensionRuntimeExtensionSnapshot;
|
|
5
5
|
readonly runtime: ExtensionRuntime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionCard.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ExtensionCard.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAyB,KAAK,gBAAgB,EAAE,KAAK,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAOhI,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,iCAAiC,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;KACnC,CAAC;CACH;AAyBD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA8NtD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
+
import { deriveExtensionIntent } from "@mdwrk/extension-runtime";
|
|
3
4
|
import { AlertTriangle, CheckCircle2, ChevronsUpDown, CircleSlash2, Power, PowerOff } from "lucide-react";
|
|
4
5
|
import { extensionManagerLabels } from "../i18n.js";
|
|
5
6
|
import { ExtensionManifestIcon } from "./ExtensionManifestIcon.js";
|
|
@@ -23,6 +24,7 @@ const pillStyle = {
|
|
|
23
24
|
textTransform: "uppercase",
|
|
24
25
|
letterSpacing: "0.08em",
|
|
25
26
|
};
|
|
27
|
+
const formatDiagnosticCode = (code) => code.replaceAll("_", " ").toLowerCase().replace(/^\w|\s\w/g, (match) => match.toUpperCase());
|
|
26
28
|
export const ExtensionCard = ({ extension, runtime, formatLabel, defaults }) => {
|
|
27
29
|
const [showCompatibility, setShowCompatibility] = React.useState(defaults.showCompatibility || !extension.compatibility.compatible);
|
|
28
30
|
const [showDiagnostics, setShowDiagnostics] = React.useState(defaults.showDiagnostics || extension.status === "error");
|
|
@@ -71,11 +73,12 @@ export const ExtensionCard = ({ extension, runtime, formatLabel, defaults }) =>
|
|
|
71
73
|
const disableLabel = formatLabel(extensionManagerLabels.actionDisable);
|
|
72
74
|
const activateLabel = formatLabel(extensionManagerLabels.actionActivate);
|
|
73
75
|
const deactivateLabel = formatLabel(extensionManagerLabels.actionDeactivate);
|
|
74
|
-
|
|
76
|
+
const intent = deriveExtensionIntent(extension);
|
|
77
|
+
return (_jsx("article", { className: "settings-card settings-card-stack", style: { display: "grid", gap: 14 }, children: _jsxs("details", { open: true, style: { display: "grid", gap: 12 }, children: [_jsx("summary", { style: { listStyle: "none", cursor: "pointer" }, children: _jsxs("header", { style: { display: "grid", gridTemplateColumns: "auto 1fr auto", gap: 12, alignItems: "start" }, children: [_jsx("div", { style: { display: "inline-flex", width: 30, height: 30, borderRadius: 8, alignItems: "center", justifyContent: "center", border: "1px solid var(--border-primary)" }, children: _jsx(ExtensionManifestIcon, { icon: extension.manifest.icon, size: 18 }) }), _jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsxs("div", { style: { display: "flex", flexWrap: "wrap", gap: 8, alignItems: "center" }, children: [_jsx("strong", { style: { fontSize: 14 }, children: formatLabel(extension.manifest.displayName) }), _jsx("span", { style: pillStyle, children: extension.source === "bundled" ? formatLabel(extensionManagerLabels.sourceBundled) : formatLabel(extensionManagerLabels.sourceInstalled) }), _jsx(ExtensionStatusBadge, { status: extension.status })] }), _jsx("span", { style: { fontSize: 11, color: "var(--fg-muted)" }, children: extension.id }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)", lineHeight: 1.6 }, children: formatLabel(extension.manifest.description) })] }), _jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", justifyContent: "flex-end" }, children: [_jsx("button", { className: "modal-btn", onClick: (event) => { stopSummaryToggle(event); void toggleEnabled(); }, disabled: busy, "aria-label": `${extension.enabled ? disableLabel : enableLabel} ${extension.id}`, title: extension.enabled ? disableLabel : enableLabel, children: extension.enabled ? _jsx(PowerOff, { size: 14 }) : _jsx(Power, { size: 14 }) }), _jsx("button", { className: "modal-btn modal-btn-primary", onClick: (event) => { stopSummaryToggle(event); void activate(); }, disabled: busy || !extension.enabled, "aria-label": `${activateLabel} ${extension.id}`, title: activateLabel, children: _jsx(CheckCircle2, { size: 14 }) }), _jsx("button", { className: "modal-btn", onClick: (event) => { stopSummaryToggle(event); void deactivate(); }, disabled: busy || extension.status !== "active", "aria-label": `${deactivateLabel} ${extension.id}`, title: deactivateLabel, children: _jsx(CircleSlash2, { size: 14 }) })] })] }) }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelPackage) }), _jsx("span", { className: "settings-session-value", children: extension.manifest.packageName })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelVersion) }), _jsx("span", { className: "settings-session-value", children: extension.manifest.version })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelActivation) }), _jsx("span", { className: "settings-session-value", children: extension.activation })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelEnabled) }), _jsx("span", { className: "settings-session-value", children: extension.enabled ? formatLabel(extensionManagerLabels.stateEnabled) : formatLabel(extensionManagerLabels.stateDisabled) })] })] }), _jsxs("section", { style: { display: "grid", gap: 10, padding: 12, border: "1px solid var(--border-primary)", borderRadius: 8 }, "aria-label": `Intent for ${formatLabel(extension.manifest.displayName)}`, children: [_jsxs("div", { style: { display: "flex", justifyContent: "space-between", gap: 10, flexWrap: "wrap", alignItems: "flex-start" }, children: [_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsx("span", { className: "settings-session-label", children: "Purpose" }), _jsx("strong", { style: { fontSize: 12 }, children: intent.safeDefaultAction }), _jsx("span", { className: "settings-muted-caption", children: intent.purpose })] }), _jsx("span", { style: pillStyle, children: intent.trust.label })] }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "Content bridge" }), _jsx("span", { className: "settings-session-value", children: intent.contentAccess.writesWorkspace || intent.contentAccess.writesEditor ? "Read/write markdown" : intent.contentAccess.readsWorkspace || intent.contentAccess.readsEditor ? "Read markdown" : "No markdown access" })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "Network" }), _jsx("span", { className: "settings-session-value", children: intent.networkAccess ? "Network enabled" : "No network access" })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "Persistence" }), _jsx("span", { className: "settings-session-value", children: intent.persistenceAccess ? "Settings-backed" : "No settings persistence" })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "Trust detail" }), _jsx("span", { className: "settings-session-value", children: intent.trust.detail })] })] }), _jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: "Workflow" }), _jsx("div", { className: "settings-chip-row", children: intent.primaryWorkflow.map((step, index) => _jsxs("span", { className: "settings-chip", children: [index + 1, ". ", step] }, step)) })] }), intent.dangerousAction && (_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsx("span", { className: "settings-session-label", children: "Review before action" }), _jsx("span", { className: "settings-muted-caption", children: intent.dangerousAction })] })), _jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: "Recovery" }), _jsx("div", { className: "settings-chip-row", children: intent.recoveryActions.map((action) => _jsx("span", { className: "settings-chip", children: action }, action)) })] })] }), _jsxs("section", { style: { display: "grid", gap: 8 }, children: [_jsx("span", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.labelPermissions) }), _jsxs("div", { style: { display: "flex", gap: 8, flexWrap: "wrap" }, children: [extension.grantedCapabilities.map((capability) => (_jsxs("span", { style: pillStyle, children: [_jsx(CheckCircle2, { size: 12 }), " ", capability] }, `granted-${capability}`))), extension.missingCapabilities.map((capability) => (_jsxs("span", { style: pillStyle, children: [_jsx(CircleSlash2, { size: 12 }), " ", capability] }, `missing-${capability}`)))] })] }), _jsxs("section", { style: { display: "grid", gap: 8 }, children: [_jsx("span", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.labelRetention) }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)", lineHeight: 1.5 }, children: formatLabel(extension.source === "installed" ? extensionManagerLabels.retentionInstalled : extensionManagerLabels.retentionBundled) }), extension.verification && (_jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: extension.verification.integrityVerified ? "Integrity verified" : "Integrity pending" }), _jsx("span", { className: "settings-chip", children: extension.verification.signatureVerified ? "Signature verified" : "Integrity-only install" })] }))] }), _jsxs("details", { open: showCompatibility, onToggle: (event) => {
|
|
75
78
|
setShowCompatibility(event.currentTarget.open);
|
|
76
79
|
}, children: [_jsxs("summary", { style: detailSummaryStyle, children: [_jsx(ChevronsUpDown, { size: 12, style: { display: "inline-flex", marginRight: 6 } }), formatLabel(extensionManagerLabels.labelCompatibility)] }), _jsxs("div", { style: { display: "grid", gap: 8, marginTop: 10 }, children: [_jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: extension.compatibility.compatible ? formatLabel(extensionManagerLabels.compatibilityOk) : formatLabel(extensionManagerLabels.compatibilityError) }), !extension.compatibility.compatible && (_jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: "var(--fg-secondary)", display: "grid", gap: 6 }, children: extension.compatibility.issues.map((issue, index) => (_jsx("li", { children: issue.message }, `${issue.target}-${index}`))) }))] })] }), _jsxs("details", { open: showDiagnostics, onToggle: (event) => {
|
|
77
80
|
setShowDiagnostics(event.currentTarget.open);
|
|
78
|
-
}, children: [_jsxs("summary", { style: detailSummaryStyle, children: [_jsx(ChevronsUpDown, { size: 12, style: { display: "inline-flex", marginRight: 6 } }), formatLabel(extensionManagerLabels.labelHealth)] }), _jsxs("div", { style: { display: "grid", gap: 8, marginTop: 10 }, children: [extension.lastError && (_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsxs("span", { style: { ...pillStyle, width: "fit-content" }, children: [_jsx(AlertTriangle, { size: 12 }), " ", formatLabel(extensionManagerLabels.lastError)] }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: extension.lastError.message })] })), extension.diagnostics.length > 0 ? (_jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: "var(--fg-secondary)", display: "grid", gap: 6 }, children: extension.diagnostics.map((record, index) => (_jsxs("li", { children: [record.code, ": ", record.message] }, `${record.code}-${index}`))) })) : !extension.lastError ? (_jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-muted)" }, children: formatLabel(extensionManagerLabels.noDiagnostics) })) : null] })] }), extension.manifest.settingsSchema && (_jsxs("details", { open: showSettings, onToggle: (event) => {
|
|
81
|
+
}, children: [_jsxs("summary", { style: detailSummaryStyle, children: [_jsx(ChevronsUpDown, { size: 12, style: { display: "inline-flex", marginRight: 6 } }), formatLabel(extensionManagerLabels.labelHealth)] }), _jsxs("div", { style: { display: "grid", gap: 8, marginTop: 10 }, children: [extension.lastError && (_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsxs("span", { style: { ...pillStyle, width: "fit-content" }, children: [_jsx(AlertTriangle, { size: 12 }), " ", formatLabel(extensionManagerLabels.lastError)] }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: extension.lastError.message })] })), extension.diagnostics.length > 0 ? (_jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: "var(--fg-secondary)", display: "grid", gap: 6 }, children: extension.diagnostics.map((record, index) => (_jsxs("li", { children: [formatDiagnosticCode(record.code), ": ", record.message] }, `${record.code}-${index}`))) })) : !extension.lastError ? (_jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-muted)" }, children: formatLabel(extensionManagerLabels.noDiagnostics) })) : null] })] }), extension.manifest.settingsSchema && (_jsxs("details", { open: showSettings, onToggle: (event) => {
|
|
79
82
|
setShowSettings(event.currentTarget.open);
|
|
80
83
|
}, children: [_jsxs("summary", { style: detailSummaryStyle, children: [_jsx(ChevronsUpDown, { size: 12, style: { display: "inline-flex", marginRight: 6 } }), formatLabel(extensionManagerLabels.labelSettings)] }), _jsx("div", { style: { marginTop: 10 }, children: _jsx(SettingsSchemaForm, { runtime: runtime, extensionId: extension.id, schema: extension.manifest.settingsSchema, formatLabel: formatLabel }) })] }))] }) }));
|
|
81
84
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionCard.js","sourceRoot":"","sources":["../../src/components/ExtensionCard.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAY7D,MAAM,kBAAkB,GAAwB;IAC9C,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,GAAG;IACf,aAAa,EAAE,WAAW;IAC1B,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF,MAAM,SAAS,GAAwB;IACrC,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,GAAG;IACjB,MAAM,EAAE,iCAAiC;IACzC,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,WAAW;IAC1B,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3G,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACpI,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IACvH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YACxC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,KAAkE,EAAQ,EAAE;QACrG,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,WAAW,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,WAAW,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,WAAW,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IAE7E,OAAO,CACL,kBAAS,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,YACxF,mBAAS,IAAI,QAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,aAC/C,kBAAS,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YACtD,kBAAQ,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,aACxG,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,iCAAiC,EAAE,YACvK,KAAC,qBAAqB,IAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,GAC9D,EACN,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,aACrC,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aAC7E,iBAAQ,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAU,EACvF,eAAM,KAAK,EAAE,SAAS,YAAG,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,eAAe,CAAC,GAAQ,EACzK,KAAC,oBAAoB,IAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAI,IAC9C,EACN,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAG,SAAS,CAAC,EAAE,GAAQ,EAC9E,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,GAAG,EAAE,YACjF,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,GAC1C,IACA,EACN,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,aACnF,iBACE,SAAS,EAAC,WAAW,EACrB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,EACvE,QAAQ,EAAE,IAAI,gBACF,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,EAAE,EAC/E,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,YAEpD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GAC1D,EACT,iBAAQ,SAAS,EAAC,6BAA6B,EAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,gBAAc,GAAG,aAAa,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,YAC5N,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,GACnB,EACT,iBAAQ,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,gBAAc,GAAG,eAAe,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,YAC3N,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,GACnB,IACL,IACK,GACD,EAEZ,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,YAAE,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAQ,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,SAAS,CAAC,QAAQ,CAAC,WAAW,GAAQ,IAAM,EAC/N,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,YAAE,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAQ,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,GAAQ,IAAM,EAC3N,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,YAAE,WAAW,CAAC,sBAAsB,CAAC,eAAe,CAAC,GAAQ,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,SAAS,CAAC,UAAU,GAAQ,IAAM,EACxN,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,YAAE,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAQ,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,aAAa,CAAC,GAAQ,IAAM,IACrT,EAEN,mBAAS,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,aACzC,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAG,WAAW,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,GAAQ,EAClK,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aACtD,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CACjD,gBAAoC,KAAK,EAAE,SAAS,aAClD,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,OAAE,UAAU,KAD7B,WAAW,UAAU,EAAE,CAE3B,CACR,CAAC,EACD,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CACjD,gBAAoC,KAAK,EAAE,SAAS,aAClD,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,OAAE,UAAU,KAD7B,WAAW,UAAU,EAAE,CAE3B,CACR,CAAC,IACE,IACE,EAEV,mBAAS,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBACpD,oBAAoB,CAAE,KAAK,CAAC,aAAoC,CAAC,IAAI,CAAC,CAAC;oBACzE,CAAC,aACC,mBAAS,KAAK,EAAE,kBAAkB,aAAE,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,EAAE,GAAI,EAAC,WAAW,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,IAAW,EACrL,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,aACpD,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAChE,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,GAChJ,EACH,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,IAAI,CACtC,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAC3G,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACpD,uBAAsC,KAAK,CAAC,OAAO,IAA1C,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE,CAAsB,CAC1D,CAAC,GACC,CACN,IACG,IACE,EAEV,mBAAS,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClD,kBAAkB,CAAE,KAAK,CAAC,aAAoC,CAAC,IAAI,CAAC,CAAC;oBACvE,CAAC,aACC,mBAAS,KAAK,EAAE,kBAAkB,aAAE,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,EAAE,GAAI,EAAC,WAAW,CAAC,sBAAsB,CAAC,WAAW,CAAC,IAAW,EAC9K,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,aACnD,SAAS,CAAC,SAAS,IAAI,CACtB,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,aACrC,gBAAM,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,aAAE,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,GAAI,OAAE,WAAW,CAAC,sBAAsB,CAAC,SAAS,CAAC,IAAQ,EACvI,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAG,SAAS,CAAC,SAAS,CAAC,OAAO,GAAK,IAClG,CACP,EACA,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClC,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAC3G,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5C,yBAAqC,MAAM,CAAC,IAAI,QAAI,MAAM,CAAC,OAAO,KAAzD,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE,CAAsC,CACzE,CAAC,GACC,CACN,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CACzB,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAG,WAAW,CAAC,sBAAsB,CAAC,aAAa,CAAC,GAAK,CACzH,CAAC,CAAC,CAAC,IAAI,IACJ,IACE,EAET,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,CACpC,mBAAS,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAC/C,eAAe,CAAE,KAAK,CAAC,aAAoC,CAAC,IAAI,CAAC,CAAC;oBACpE,CAAC,aACC,mBAAS,KAAK,EAAE,kBAAkB,aAAE,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,EAAE,GAAI,EAAC,WAAW,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAW,EAChL,cAAK,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,YAC3B,KAAC,kBAAkB,IACjB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,SAAS,CAAC,EAAE,EACzB,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,cAAc,EACzC,WAAW,EAAE,WAAW,GACxB,GACE,IACE,CACX,IACS,GACF,CACX,CAAC;AACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"ExtensionCard.js","sourceRoot":"","sources":["../../src/components/ExtensionCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionManagerSettingsPanel.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionManagerSettingsPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"ExtensionManagerSettingsPanel.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionManagerSettingsPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC;CAC7D;AAED,eAAO,MAAM,6BAA6B,EAAE,KAAK,CAAC,EAAE,CAAC,kCAAkC,CAkCtF,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useSyncExternalStore } from "react";
|
|
3
|
+
import { extensionManagerLabels } from "../i18n.js";
|
|
3
4
|
export const ExtensionManagerSettingsPanel = ({ runtime, open, formatLabel, }) => {
|
|
4
5
|
const snapshot = useSyncExternalStore(runtime.subscribe, runtime.getSnapshot, runtime.getSnapshot);
|
|
5
|
-
return (_jsx("div", { className: "settings-pane", children: _jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: formatLabel(
|
|
6
|
+
return (_jsx("div", { className: "settings-pane", children: _jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsShortcutKicker) }), _jsx("strong", { style: { fontSize: 13 }, children: formatLabel(extensionManagerLabels.settingsShortcutTitle) }), _jsx("p", { style: { margin: 0, fontSize: 11, color: "var(--fg-muted)", lineHeight: 1.4 }, children: formatLabel(extensionManagerLabels.settingsShortcutDescription) })] }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsExtensions) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsActive) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.filter((extension) => extension.status === "active").length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsInstalled) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.filter((extension) => extension.source === "installed").length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsCatalog) }), _jsx("span", { className: "settings-session-value", children: snapshot.catalogEntries.length })] })] }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipIndexedDb) }), _jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipPaneOnly) }), _jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipEnglishFallback) })] }), _jsx("div", { className: "settings-action-row", style: { padding: 6 }, children: _jsx("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => void open(), children: formatLabel(extensionManagerLabels.settingsOpenManager) }) })] }) }));
|
|
6
7
|
};
|
|
7
8
|
//# sourceMappingURL=ExtensionManagerSettingsPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionManagerSettingsPanel.js","sourceRoot":"","sources":["../../src/components/ExtensionManagerSettingsPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ExtensionManagerSettingsPanel.js","sourceRoot":"","sources":["../../src/components/ExtensionManagerSettingsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionManagerView.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionManagerView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAsD,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"ExtensionManagerView.d.ts","sourceRoot":"","sources":["../../src/components/ExtensionManagerView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAsD,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,0BAA0B,CAAC;AAuBlC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,KAAK,MAAM,CAAC;IAC5D,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;CAC/C;AAwQD,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,SAAS,GAAG,aAAa,CAAC,CAGlG,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,yBAAyB,CAwS9D,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
|
|
3
3
|
import { createPortableExtensionCatalogRegistration, normalizePortableExtensionPackageArtifact, } from "@mdwrk/extension-runtime";
|
|
4
|
+
import { Download, Sidebar, SidebarOpen, SplitSquareHorizontal, Square, Upload, X, } from "lucide-react";
|
|
4
5
|
import { extensionManagerLabels } from "../i18n.js";
|
|
5
6
|
import { ExtensionCard } from "./ExtensionCard.js";
|
|
6
7
|
function downloadJson(filename, value) {
|
|
@@ -12,6 +13,46 @@ function downloadJson(filename, value) {
|
|
|
12
13
|
link.click();
|
|
13
14
|
URL.revokeObjectURL(url);
|
|
14
15
|
}
|
|
16
|
+
const getSplitBand = (value) => {
|
|
17
|
+
const clamped = Math.min(80, Math.max(20, value));
|
|
18
|
+
return Math.round(clamped / 5) * 5;
|
|
19
|
+
};
|
|
20
|
+
const formatDiagnosticCode = (code) => code.replaceAll("_", " ").toLowerCase().replace(/^\w|\s\w/g, (match) => match.toUpperCase());
|
|
21
|
+
function useWorkspaceModuleSplit(defaultPosition = 55) {
|
|
22
|
+
const [splitPos, setSplitPos] = useState(defaultPosition);
|
|
23
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
24
|
+
const [splitContainer, setSplitContainer] = useState(null);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const handleMouseMove = (event) => {
|
|
27
|
+
if (!isDragging || !splitContainer)
|
|
28
|
+
return;
|
|
29
|
+
const rect = splitContainer.getBoundingClientRect();
|
|
30
|
+
if (rect.width <= 0)
|
|
31
|
+
return;
|
|
32
|
+
setSplitPos(getSplitBand(((event.clientX - rect.left) / rect.width) * 100));
|
|
33
|
+
};
|
|
34
|
+
const handleMouseUp = () => setIsDragging(false);
|
|
35
|
+
if (isDragging) {
|
|
36
|
+
window.addEventListener("mousemove", handleMouseMove);
|
|
37
|
+
window.addEventListener("mouseup", handleMouseUp);
|
|
38
|
+
document.body.classList.add("is-resizing-pane");
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
document.body.classList.remove("is-resizing-pane");
|
|
42
|
+
}
|
|
43
|
+
return () => {
|
|
44
|
+
window.removeEventListener("mousemove", handleMouseMove);
|
|
45
|
+
window.removeEventListener("mouseup", handleMouseUp);
|
|
46
|
+
document.body.classList.remove("is-resizing-pane");
|
|
47
|
+
};
|
|
48
|
+
}, [isDragging, splitContainer]);
|
|
49
|
+
return {
|
|
50
|
+
splitBand: getSplitBand(splitPos),
|
|
51
|
+
isDragging,
|
|
52
|
+
splitContainerRef: setSplitContainer,
|
|
53
|
+
startSplitDrag: () => setIsDragging(true),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
15
56
|
function createBrowserNodes(snapshot, formatLabel) {
|
|
16
57
|
return {
|
|
17
58
|
extensions: snapshot.extensions.map((extension) => ({
|
|
@@ -86,7 +127,7 @@ function ExtensionManagerBrowserSidebar({ runtime, snapshot, formatLabel, }) {
|
|
|
86
127
|
const query = state.browserQuery.trim().toLowerCase();
|
|
87
128
|
return `${node.title} ${node.subtitle} ${node.catalogEntry.catalogId}`.toLowerCase().includes(query);
|
|
88
129
|
}), [browserNodes.catalogEntries, state.browserQuery, state.browserScope]);
|
|
89
|
-
return (_jsxs("div", { className: "workspace-panel-content", style: { display: "grid", gap: 12, padding: 12 }, children: [_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx(StatsGrid, { snapshot: snapshot, formatLabel: formatLabel }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children:
|
|
130
|
+
return (_jsxs("div", { className: "workspace-panel-content", style: { display: "grid", gap: 12, padding: 12 }, children: [_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx(StatsGrid, { snapshot: snapshot, formatLabel: formatLabel }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.paneTreeChip) }), _jsxs("span", { className: "settings-chip", children: [snapshot.extensions.filter((extension) => extension.source === "installed").length, " ", formatLabel(extensionManagerLabels.paneTreeInstalledSuffix)] }), _jsxs("span", { className: "settings-chip", children: [snapshot.catalogEntries.length, " ", formatLabel(extensionManagerLabels.paneTreeCatalogSuffix)] })] })] }), _jsxs("div", { className: "settings-card settings-card-stack", style: { gap: 12 }, children: [_jsx("input", { style: {
|
|
90
131
|
width: "100%",
|
|
91
132
|
border: "1px solid var(--border-primary)",
|
|
92
133
|
background: "var(--surface-elevated, var(--bg-panel))",
|
|
@@ -94,17 +135,17 @@ function ExtensionManagerBrowserSidebar({ runtime, snapshot, formatLabel, }) {
|
|
|
94
135
|
borderRadius: 8,
|
|
95
136
|
padding: "8px 10px",
|
|
96
137
|
fontSize: 11,
|
|
97
|
-
}, value: state.browserQuery, onChange: (event) => setState({ browserQuery: event.currentTarget.value }), placeholder:
|
|
98
|
-
["all",
|
|
99
|
-
["extensions",
|
|
100
|
-
["catalog",
|
|
138
|
+
}, value: state.browserQuery, onChange: (event) => setState({ browserQuery: event.currentTarget.value }), placeholder: formatLabel(extensionManagerLabels.paneTreeFilterPlaceholder), "aria-label": formatLabel(extensionManagerLabels.paneTreeFilterAria) }), _jsx("div", { className: "settings-chip-row", children: [
|
|
139
|
+
["all", `${formatLabel(extensionManagerLabels.paneTreeFilterAll)} ${browserNodes.extensions.length + browserNodes.catalogEntries.length}`],
|
|
140
|
+
["extensions", `${formatLabel(extensionManagerLabels.paneTreeFilterExtensions)} ${browserNodes.extensions.length}`],
|
|
141
|
+
["catalog", `${formatLabel(extensionManagerLabels.paneTreeFilterCatalog)} ${browserNodes.catalogEntries.length}`],
|
|
101
142
|
].map(([value, label]) => (_jsx("button", { type: "button", className: `view-toolbar-btn ${state.browserScope === value ? "active" : ""}`, onClick: () => setState({ browserScope: value }), children: label }, value))) }), _jsxs("details", { open: state.treeState.extensions, onToggle: (event) => {
|
|
102
143
|
const nextOpen = event.currentTarget.open;
|
|
103
144
|
setState({ treeState: { ...state.treeState, extensions: nextOpen } });
|
|
104
|
-
}, children: [_jsx("summary", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em", cursor: "pointer" }, children: formatLabel(extensionManagerLabels.paneTreeExtensions) }), _jsxs("div", { style: { display: "grid", gap: 6, marginTop: 8 }, children: [filteredExtensionNodes.map((node) => (_jsxs("button", { type: "button", className: `settings-sidebar-btn ${state.selectedNodeId === node.id ? "active" : ""}`, onClick: () => setState({ selectedNodeId: node.id }), style: { justifyContent: "space-between" }, children: [_jsx("span", { style: { textAlign: "left" }, children: node.title }), _jsx("span", { className: "settings-session-label", children: node.extension.status })] }, node.id))), filteredExtensionNodes.length === 0 && _jsx("span", { className: "
|
|
145
|
+
}, children: [_jsx("summary", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em", cursor: "pointer" }, children: formatLabel(extensionManagerLabels.paneTreeExtensions) }), _jsxs("div", { style: { display: "grid", gap: 6, marginTop: 8 }, children: [filteredExtensionNodes.map((node) => (_jsxs("button", { type: "button", className: `settings-sidebar-btn ${state.selectedNodeId === node.id ? "active" : ""}`, onClick: () => setState({ selectedNodeId: node.id }), style: { justifyContent: "space-between" }, children: [_jsx("span", { style: { textAlign: "left" }, children: node.title }), _jsx("span", { className: "settings-session-label", children: node.extension.status })] }, node.id))), filteredExtensionNodes.length === 0 && _jsx("span", { className: "settings-muted-caption", children: formatLabel(extensionManagerLabels.paneTreeExtensionsEmpty) })] })] }), _jsxs("details", { open: state.treeState.catalog, onToggle: (event) => {
|
|
105
146
|
const nextOpen = event.currentTarget.open;
|
|
106
147
|
setState({ treeState: { ...state.treeState, catalog: nextOpen } });
|
|
107
|
-
}, children: [_jsx("summary", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em", cursor: "pointer" }, children: formatLabel(extensionManagerLabels.paneTreeCatalog) }), _jsxs("div", { style: { display: "grid", gap: 6, marginTop: 8 }, children: [filteredCatalogNodes.length === 0 && _jsx("span", { className: "
|
|
148
|
+
}, children: [_jsx("summary", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: "0.08em", cursor: "pointer" }, children: formatLabel(extensionManagerLabels.paneTreeCatalog) }), _jsxs("div", { style: { display: "grid", gap: 6, marginTop: 8 }, children: [filteredCatalogNodes.length === 0 && _jsx("span", { className: "settings-muted-caption", children: formatLabel(extensionManagerLabels.paneTreeCatalogEmpty) }), filteredCatalogNodes.map((node) => (_jsxs("button", { type: "button", className: `settings-sidebar-btn ${state.selectedNodeId === node.id ? "active" : ""}`, onClick: () => setState({ selectedNodeId: node.id }), style: { justifyContent: "space-between" }, children: [_jsx("span", { style: { textAlign: "left" }, children: node.title }), _jsx("span", { className: "settings-session-label", children: node.catalogEntry.installed ? formatLabel(extensionManagerLabels.paneTreeInstalledSuffix) : formatLabel(extensionManagerLabels.paneTreeCatalogSuffix) })] }, node.id)))] })] })] })] }));
|
|
108
149
|
}
|
|
109
150
|
export const ExtensionManagerSidebar = ({ runtime, formatLabel }) => {
|
|
110
151
|
const snapshot = useSyncExternalStore(runtime.subscribe, runtime.getSnapshot, runtime.getSnapshot);
|
|
@@ -121,26 +162,11 @@ export const ExtensionManagerView = ({ runtime, close, formatLabel, defaultSetti
|
|
|
121
162
|
const [error, setError] = useState(null);
|
|
122
163
|
const [sidebarOpen, setSidebarOpen] = useState(true);
|
|
123
164
|
const [layoutMode, setLayoutMode] = useState("split");
|
|
165
|
+
const { splitBand, isDragging, splitContainerRef, startSplitDrag } = useWorkspaceModuleSplit();
|
|
124
166
|
const { state: browserState, setState: setBrowserState } = useExtensionBrowserState(runtime);
|
|
125
167
|
const effectiveSidebarOpen = embedBrowserInShellSidebar ? (shellSidebarOpen ?? true) : sidebarOpen;
|
|
126
168
|
const installedIds = useMemo(() => new Set(snapshot.extensions.filter((extension) => extension.source === "installed").map((extension) => extension.id)), [snapshot.extensions]);
|
|
127
169
|
const browserNodes = useMemo(() => createBrowserNodes(snapshot, formatLabel), [snapshot, formatLabel]);
|
|
128
|
-
const filteredExtensionNodes = useMemo(() => browserNodes.extensions.filter((node) => {
|
|
129
|
-
if (browserState.browserScope === "catalog")
|
|
130
|
-
return false;
|
|
131
|
-
if (!browserState.browserQuery.trim())
|
|
132
|
-
return true;
|
|
133
|
-
const query = browserState.browserQuery.trim().toLowerCase();
|
|
134
|
-
return `${node.title} ${node.subtitle} ${node.extension.status}`.toLowerCase().includes(query);
|
|
135
|
-
}), [browserNodes.extensions, browserState.browserQuery, browserState.browserScope]);
|
|
136
|
-
const filteredCatalogNodes = useMemo(() => browserNodes.catalogEntries.filter((node) => {
|
|
137
|
-
if (browserState.browserScope === "extensions")
|
|
138
|
-
return false;
|
|
139
|
-
if (!browserState.browserQuery.trim())
|
|
140
|
-
return true;
|
|
141
|
-
const query = browserState.browserQuery.trim().toLowerCase();
|
|
142
|
-
return `${node.title} ${node.subtitle} ${node.catalogEntry.catalogId}`.toLowerCase().includes(query);
|
|
143
|
-
}), [browserNodes.catalogEntries, browserState.browserQuery, browserState.browserScope]);
|
|
144
170
|
useEffect(() => {
|
|
145
171
|
if (browserState.selectedNodeId && [...browserNodes.extensions, ...browserNodes.catalogEntries].some((node) => node.id === browserState.selectedNodeId)) {
|
|
146
172
|
return;
|
|
@@ -156,7 +182,7 @@ export const ExtensionManagerView = ({ runtime, close, formatLabel, defaultSetti
|
|
|
156
182
|
const text = await file.text();
|
|
157
183
|
const artifact = normalizePortableExtensionPackageArtifact(JSON.parse(text));
|
|
158
184
|
if (!artifact) {
|
|
159
|
-
throw new Error(
|
|
185
|
+
throw new Error(formatLabel(extensionManagerLabels.errorInvalidPortableArtifact));
|
|
160
186
|
}
|
|
161
187
|
const registration = await createPortableExtensionCatalogRegistration(artifact);
|
|
162
188
|
runtime.registerCatalog(registration.catalog, {
|
|
@@ -167,7 +193,7 @@ export const ExtensionManagerView = ({ runtime, close, formatLabel, defaultSetti
|
|
|
167
193
|
setError(null);
|
|
168
194
|
}
|
|
169
195
|
catch (nextError) {
|
|
170
|
-
setError(nextError instanceof Error ? nextError.message :
|
|
196
|
+
setError(nextError instanceof Error ? nextError.message : formatLabel(extensionManagerLabels.errorImportFailed));
|
|
171
197
|
}
|
|
172
198
|
finally {
|
|
173
199
|
event.target.value = "";
|
|
@@ -180,7 +206,7 @@ export const ExtensionManagerView = ({ runtime, close, formatLabel, defaultSetti
|
|
|
180
206
|
setError(null);
|
|
181
207
|
}
|
|
182
208
|
catch (nextError) {
|
|
183
|
-
setError(nextError instanceof Error ? nextError.message :
|
|
209
|
+
setError(nextError instanceof Error ? nextError.message : formatLabel(extensionManagerLabels.errorInstallFailed));
|
|
184
210
|
}
|
|
185
211
|
finally {
|
|
186
212
|
setBusyEntryId(null);
|
|
@@ -193,14 +219,14 @@ export const ExtensionManagerView = ({ runtime, close, formatLabel, defaultSetti
|
|
|
193
219
|
setError(null);
|
|
194
220
|
}
|
|
195
221
|
catch (nextError) {
|
|
196
|
-
setError(nextError instanceof Error ? nextError.message :
|
|
222
|
+
setError(nextError instanceof Error ? nextError.message : formatLabel(extensionManagerLabels.errorRemoveFailed));
|
|
197
223
|
}
|
|
198
224
|
finally {
|
|
199
225
|
setBusyEntryId(null);
|
|
200
226
|
}
|
|
201
227
|
};
|
|
202
|
-
const detailsPane = (_jsxs("div", { style: { display: "grid", gap: 16 }, children: [!selectedNode && (_jsx("div", { className: "settings-card settings-card-stack", children: _jsx("span", { className: "
|
|
203
|
-
const
|
|
204
|
-
return (_jsxs("div", { className: "extension-manager-pane editor-pane-container", "data-testid": "extension-manager-pane", role: "region", "aria-label": formatLabel(extensionManagerLabels.viewTitle), children: [_jsxs("div", { className: "view-toolbar", "aria-label":
|
|
228
|
+
const detailsPane = (_jsxs("div", { style: { display: "grid", gap: 16 }, children: [!selectedNode && (_jsx("div", { className: "settings-card settings-card-stack", children: _jsx("span", { className: "settings-muted-caption", children: formatLabel(extensionManagerLabels.emptyTreeSelection) }) })), selectedNode?.kind === "catalog" && (_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx("strong", { style: { fontSize: 12 }, children: selectedNode.title }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelEntryId) }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.entryId })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelPackage) }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.packageName })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelVersion) }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.version })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.labelCatalogId) }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.catalogId })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "Trust policy" }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.policyTrusted ? "Trusted for install" : "Install blocked" })] })] }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: formatLabel(selectedNode.catalogEntry.description) }), !selectedNode.catalogEntry.policyTrusted && (_jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: "var(--status-error, var(--fg-secondary))", display: "grid", gap: 6 }, children: selectedNode.catalogEntry.policyIssues.map((issue) => _jsx("li", { children: issue }, issue)) })), _jsx("div", { className: "settings-action-row", style: { padding: 8 }, children: _jsx("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => void installCatalogEntry(selectedNode.catalogEntry.entryId), disabled: busyEntryId === selectedNode.catalogEntry.entryId || !selectedNode.catalogEntry.policyTrusted, children: selectedNode.catalogEntry.installed ? formatLabel(extensionManagerLabels.actionUpdate) : formatLabel(extensionManagerLabels.actionInstall) }) })] })), selectedNode?.kind === "extension" && (_jsxs("div", { style: { display: "grid", gap: 12 }, children: [_jsx(ExtensionCard, { extension: selectedNode.extension, runtime: runtime, formatLabel: formatLabel, defaults: defaults }), installedIds.has(selectedNode.extension.id) && (_jsx("div", { className: "settings-action-row", style: { justifyContent: "flex-end", padding: 8 }, children: _jsx("button", { type: "button", className: "modal-btn", onClick: () => void removeInstalledExtension(selectedNode.extension.id), disabled: busyEntryId === selectedNode.extension.id, children: formatLabel(extensionManagerLabels.actionRemove) }) }))] }))] }));
|
|
229
|
+
const operationsPane = (_jsxs("div", { style: { display: "grid", gap: 16 }, children: [_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.paneQuickModal) }), _jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.quickActionsTitle) }), _jsx("span", { style: { fontSize: 11, color: "var(--fg-muted)" }, children: formatLabel(extensionManagerLabels.headerSubtitle) })] }), _jsx(StatsGrid, { snapshot: snapshot, formatLabel: formatLabel }), _jsxs("div", { className: "settings-action-row", style: { padding: 8, gap: 8 }, children: [_jsxs("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => importInput?.click(), children: [_jsx(Upload, { size: 14 }), " ", formatLabel(extensionManagerLabels.actionImport)] }), _jsxs("button", { type: "button", className: "modal-btn", onClick: () => downloadJson("extension-catalog-snapshot.json", snapshot.catalogEntries), disabled: snapshot.catalogEntries.length === 0, children: [_jsx(Download, { size: 14 }), " ", formatLabel(extensionManagerLabels.actionExport)] })] })] }), _jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "grid", gap: 6 }, children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.importTitle) }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)", lineHeight: 1.5 }, children: formatLabel(extensionManagerLabels.importDescription) })] }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsCatalog) }), _jsx("span", { className: "settings-session-value", children: snapshot.catalogEntries.length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsStatsInstalled) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.filter((extension) => extension.source === "installed").length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.statsActive) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.filter((extension) => extension.status === "active").length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.statsIncompatible) }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.filter((extension) => extension.status === "incompatible").length })] })] })] }), selectedNode?.kind === "catalog" && (_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.catalogEntriesTitle) }), _jsxs("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: [selectedNode.catalogEntry.packageName, "@", selectedNode.catalogEntry.version] }), _jsx("span", { className: "settings-chip", children: selectedNode.catalogEntry.policyTrusted ? "Trusted for install" : "Install blocked by trust policy" }), _jsx("div", { className: "settings-action-row", style: { padding: 8 }, children: _jsx("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => void installCatalogEntry(selectedNode.catalogEntry.entryId), disabled: busyEntryId === selectedNode.catalogEntry.entryId || !selectedNode.catalogEntry.policyTrusted, children: selectedNode.catalogEntry.installed ? formatLabel(extensionManagerLabels.actionUpdate) : formatLabel(extensionManagerLabels.actionInstall) }) })] })), selectedNode?.kind === "extension" && selectedNode.extension.diagnostics.length > 0 && (_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.labelHealth) }), _jsx("ul", { style: { margin: 0, paddingLeft: 18, fontSize: 12, color: "var(--fg-secondary)", display: "grid", gap: 6 }, children: selectedNode.extension.diagnostics.map((record, index) => (_jsxs("li", { children: [formatDiagnosticCode(record.code), ": ", record.message] }, `${record.code}-${index}`))) })] })), selectedNode?.kind === "extension" && selectedNode.extension.diagnostics.length === 0 && (_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.labelHealth) }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-muted)" }, children: formatLabel(extensionManagerLabels.noDiagnostics) })] }))] }));
|
|
230
|
+
return (_jsxs("div", { className: "extension-manager-pane editor-pane-container", "data-testid": "extension-manager-pane", role: "region", "aria-label": formatLabel(extensionManagerLabels.viewTitle), children: [isDragging && _jsx("div", { className: "editor-splitter-drag-shield" }), _jsxs("div", { className: "view-toolbar", "aria-label": formatLabel(extensionManagerLabels.toolbarLabel), children: [_jsxs("div", { className: "view-toolbar-group", children: [_jsx("button", { type: "button", className: `view-toolbar-btn ${effectiveSidebarOpen ? "active" : ""}`, title: formatLabel(extensionManagerLabels.toolbarToggleSidebar), onClick: () => embedBrowserInShellSidebar ? onShellSidebarToggle?.(!effectiveSidebarOpen) : setSidebarOpen((current) => !current), children: effectiveSidebarOpen ? _jsx(SidebarOpen, { size: 14 }) : _jsx(Sidebar, { size: 14 }) }), _jsx("button", { type: "button", className: `view-toolbar-btn ${layoutMode === "single" ? "active" : ""}`, title: formatLabel(extensionManagerLabels.toolbarSinglePane), onClick: () => setLayoutMode("single"), children: _jsx(Square, { size: 14 }) }), _jsx("button", { type: "button", className: `view-toolbar-btn ${layoutMode === "split" ? "active" : ""}`, title: formatLabel(extensionManagerLabels.toolbarSplitScreen), onClick: () => setLayoutMode("split"), children: _jsx(SplitSquareHorizontal, { size: 14 }) })] }), _jsxs("div", { className: "view-toolbar-group", children: [_jsx("span", { className: "view-toolbar-divider" }), _jsx("button", { type: "button", className: "view-toolbar-btn", title: formatLabel(extensionManagerLabels.toolbarImportPackage), onClick: () => importInput?.click(), children: _jsx(Upload, { size: 14 }) }), _jsx("button", { type: "button", className: "view-toolbar-btn", title: formatLabel(extensionManagerLabels.toolbarExportCatalog), onClick: () => downloadJson("extension-catalog-snapshot.json", snapshot.catalogEntries), disabled: snapshot.catalogEntries.length === 0, children: _jsx(Download, { size: 14 }) })] }), _jsxs("div", { className: "view-toolbar-group", style: { justifyContent: "flex-end" }, children: [_jsx("span", { className: "view-toolbar-divider" }), _jsx("button", { type: "button", className: "view-toolbar-btn", title: formatLabel(extensionManagerLabels.toolbarClose), onClick: () => void close(), children: _jsx(X, { size: 14 }) })] })] }), _jsxs("div", { className: "editor-pane-shell", children: [_jsx("input", { ref: setImportInput, type: "file", accept: "application/json,.json", hidden: true, onChange: handleImportPortablePackage }), _jsxs("div", { className: "editor-pane-body is-split", children: [!embedBrowserInShellSidebar && sidebarOpen && (_jsxs("aside", { className: `pane-sidebar editor-pane-column ${sidebarOpen ? "" : "is-collapsed"}`, style: { width: "min(320px, 28vw)", padding: 12, gap: 12 }, children: [_jsx(ExtensionManagerBrowserSidebar, { runtime: runtime, snapshot: snapshot, formatLabel: formatLabel }), error && _jsx("p", { style: { margin: 0, fontSize: 11, color: "var(--status-error)" }, children: error })] })), _jsxs("div", { className: "editor-pane-column", style: { flex: 1, padding: 16, gap: 16 }, children: [_jsx("div", { className: "extension-manager-header", children: _jsxs("div", { className: "extension-manager-header-main", children: [_jsxs("div", { className: "extension-manager-header-copy", children: [_jsx("span", { className: "settings-session-label", children: formatLabel(extensionManagerLabels.settingsShortcutKicker) }), _jsx("strong", { className: "extension-manager-header-title", children: formatLabel(extensionManagerLabels.headerTitle) }), _jsx("span", { className: "settings-muted-caption", children: formatLabel(extensionManagerLabels.headerSubtitle) })] }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipPaneOnly) }), _jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipSplitSingle) }), _jsx("span", { className: "settings-chip", children: formatLabel(extensionManagerLabels.settingsChipSettingsContent) })] })] }) }), layoutMode === "split" ? (_jsxs("div", { ref: splitContainerRef, className: "editor-pane-body is-split", style: { background: "transparent" }, children: [_jsx("div", { className: `editor-pane-column editor-pane-column--split-left-${splitBand}`, style: { display: "grid", gap: 16, paddingRight: 12 }, children: detailsPane }), _jsx("div", { onMouseDown: startSplitDrag, className: `editor-splitter ${isDragging ? "dragging" : ""}`, role: "separator", "aria-orientation": "vertical", "aria-label": formatLabel(extensionManagerLabels.toolbarResizePanes), children: _jsx("div", { className: "editor-splitter-handle" }) }), _jsx("div", { className: `editor-pane-column editor-pane-column--split-right-${100 - splitBand}`, style: { display: "grid", gap: 16, paddingLeft: 12 }, children: operationsPane })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { style: { display: "grid", gap: 16 }, children: detailsPane }), operationsPane] }))] })] })] })] }));
|
|
205
231
|
};
|
|
206
232
|
//# sourceMappingURL=ExtensionManagerView.js.map
|