@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.
Files changed (35) hide show
  1. package/README.md +24 -47
  2. package/dist/components/ExtensionCard.d.ts +1 -1
  3. package/dist/components/ExtensionCard.d.ts.map +1 -1
  4. package/dist/components/ExtensionCard.js +5 -2
  5. package/dist/components/ExtensionCard.js.map +1 -1
  6. package/dist/components/ExtensionManagerSettingsPanel.d.ts.map +1 -1
  7. package/dist/components/ExtensionManagerSettingsPanel.js +2 -1
  8. package/dist/components/ExtensionManagerSettingsPanel.js.map +1 -1
  9. package/dist/components/ExtensionManagerView.d.ts.map +1 -1
  10. package/dist/components/ExtensionManagerView.js +57 -31
  11. package/dist/components/ExtensionManagerView.js.map +1 -1
  12. package/dist/constants.d.ts +2 -0
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js +2 -0
  15. package/dist/constants.js.map +1 -1
  16. package/dist/createExtensionManagerBundledEntry.d.ts.map +1 -1
  17. package/dist/createExtensionManagerBundledEntry.js +3 -9
  18. package/dist/createExtensionManagerBundledEntry.js.map +1 -1
  19. package/dist/i18n.d.ts +44 -0
  20. package/dist/i18n.d.ts.map +1 -1
  21. package/dist/i18n.js +52 -8
  22. package/dist/i18n.js.map +1 -1
  23. package/dist/locales/en.d.ts.map +1 -1
  24. package/dist/locales/en.js +13 -0
  25. package/dist/locales/en.js.map +1 -1
  26. package/dist/locales/es.d.ts.map +1 -1
  27. package/dist/locales/es.js +43 -0
  28. package/dist/locales/es.js.map +1 -1
  29. package/dist/manifest.d.ts +1 -1
  30. package/dist/manifest.d.ts.map +1 -1
  31. package/dist/manifest.js +30 -2
  32. package/dist/manifest.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +6 -6
package/README.md CHANGED
@@ -1,57 +1,34 @@
1
1
  # @mdwrk/extension-manager
2
2
 
3
- First-party bundled operator console extension for Markdown Workspace.
3
+ **First-party extension operations console**
4
4
 
5
- ## Manifest and compatibility
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&amp;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&amp;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
- - manifest export: `./manifest`
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
- ## Capabilities
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
- The extension manager visualizes extension runtime state and operator metadata, including:
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
- - bundled and installed extension inventory
17
- - enabled / disabled state
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
- ## Settings schema
25
+ ```bash
26
+ npm install @mdwrk/extension-manager @mdwrk/extension-runtime
27
+ ```
25
28
 
26
- The package now contributes its own settings section and manifest-backed settings schema.
27
- Those settings cover manager-view defaults such as search, compatibility visibility, and diagnostics display preferences.
29
+ ## Usage
30
+ Import this package into a host that already exposes the MdWrk extension runtime and host APIs.
28
31
 
29
- Source anchors:
30
-
31
- - `src/manifest.ts`
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 { ExtensionRuntime, ExtensionRuntimeExtensionSnapshot } from "@mdwrk/extension-runtime";
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,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAOpG,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;AAsBD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA6KtD,CAAC"}
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
- 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: 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("details", { open: showCompatibility, onToggle: (event) => {
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":"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"}
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;AAEjE,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
+ {"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("EXTENSION_MANAGER") }), _jsx("strong", { style: { fontSize: 13 }, children: formatLabel("Extension Manager") }), _jsx("p", { style: { margin: 0, fontSize: 11, color: "var(--fg-muted)", lineHeight: 1.4 }, children: formatLabel("Open the pane workspace to inspect runtime inventory, compatibility, installed catalog entries, and diagnostics.") })] }), _jsxs("div", { className: "settings-session-grid", children: [_jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "EXTENSIONS" }), _jsx("span", { className: "settings-session-value", children: snapshot.extensions.length })] }), _jsxs("div", { className: "settings-session-item", children: [_jsx("span", { className: "settings-session-label", children: "ACTIVE" }), _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: "INSTALLED" }), _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: "CATALOG" }), _jsx("span", { className: "settings-session-value", children: snapshot.catalogEntries.length })] })] }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: "INDEXEDDB" }), _jsx("span", { className: "settings-chip", children: "PANE_ONLY" }), _jsx("span", { className: "settings-chip", children: "EN_FALLBACK" })] }), _jsx("div", { className: "settings-action-row", style: { padding: 6 }, children: _jsx("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => void open(), children: "OPEN_MANAGER" }) })] }) }));
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;AAU7C,MAAM,CAAC,MAAM,6BAA6B,GAAiD,CAAC,EAC1F,OAAO,EACP,IAAI,EACJ,WAAW,GACZ,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAgD,CAAC;IAElJ,OAAO,CACL,cAAK,SAAS,EAAC,eAAe,YAC5B,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,aACrC,eAAM,SAAS,EAAC,wBAAwB,YAAE,WAAW,CAAC,mBAAmB,CAAC,GAAQ,EAClF,iBAAQ,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAG,WAAW,CAAC,mBAAmB,CAAC,GAAU,EAC5E,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,EAAE,YAC7E,WAAW,CAAC,kHAAkH,CAAC,GAC9H,IACA,EACN,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,2BAAkB,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAQ,IAAM,EACnL,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,uBAAc,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,GAAQ,IAAM,EACpO,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,0BAAiB,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,GAAQ,IAAM,EAC1O,eAAK,SAAS,EAAC,uBAAuB,aAAC,eAAM,SAAS,EAAC,wBAAwB,wBAAe,EAAA,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAQ,IAAM,IAChL,EACN,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAM,SAAS,EAAC,eAAe,0BAAiB,EAChD,eAAM,SAAS,EAAC,eAAe,0BAAiB,EAChD,eAAM,SAAS,EAAC,eAAe,4BAAmB,IAC9C,EACN,cAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YACxD,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,6BAA6B,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,6BAAuB,GAC3G,IACF,GACF,CACP,CAAC;AACJ,CAAC,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;AAclC,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;AA2ND,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,SAAS,GAAG,aAAa,CAAC,CAGlG,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,yBAAyB,CAuQ9D,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: "EXTENSION_BROWSER" }), _jsxs("span", { className: "settings-chip", children: [snapshot.extensions.filter((extension) => extension.source === "installed").length, " INSTALLED"] }), _jsxs("span", { className: "settings-chip", children: [snapshot.catalogEntries.length, " CATALOG"] })] })] }), _jsxs("div", { className: "settings-card settings-card-stack", style: { gap: 12 }, children: [_jsx("input", { style: {
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: "Filter extensions or catalog entries", "aria-label": "Filter extension browser" }), _jsx("div", { className: "settings-chip-row", children: [
98
- ["all", `ALL ${browserNodes.extensions.length + browserNodes.catalogEntries.length}`],
99
- ["extensions", `EXT ${browserNodes.extensions.length}`],
100
- ["catalog", `CAT ${browserNodes.catalogEntries.length}`],
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: "text-[11px] text-[var(--fg-muted)]", children: "No extensions match the current browser filter." })] })] }), _jsxs("details", { open: state.treeState.catalog, onToggle: (event) => {
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: "text-[11px] text-[var(--fg-muted)]", children: "No catalog entries match the current browser filter." }), 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 ? "INSTALLED" : "CATALOG" })] }, node.id)))] })] })] })] }));
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("Invalid portable extension package artifact.");
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 : "Failed to import extension package.");
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 : "Failed to install extension.");
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 : "Failed to remove installed extension.");
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: "text-[11px] text-[var(--fg-muted)]", 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: "ENTRY_ID" }), _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: "CATALOG_ID" }), _jsx("span", { className: "settings-session-value", children: selectedNode.catalogEntry.catalogId })] })] }), _jsx("p", { style: { margin: 0, fontSize: 12, color: "var(--fg-secondary)" }, children: formatLabel(selectedNode.catalogEntry.description) }), _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 ? "UPDATE" : "INSTALL" }) })] })), 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) }) }))] }))] }));
203
- const catalogPane = (_jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [_jsx("span", { className: "settings-session-label", children: "CATALOG" }), _jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: formatLabel(extensionManagerLabels.catalogEntriesTitle) })] }), _jsx("div", { style: { display: "grid", gap: 10 }, children: snapshot.catalogEntries.map((entry) => (_jsxs("div", { className: "settings-session-item", style: { alignItems: "start" }, children: [_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsx("span", { className: "settings-session-label", children: formatLabel(entry.displayName) }), _jsxs("span", { className: "settings-session-value", children: [entry.packageName, "@", entry.version] })] }), _jsxs("div", { className: "settings-action-row", style: { padding: 8 }, children: [_jsx("button", { type: "button", className: "modal-btn", onClick: () => setBrowserState({ selectedNodeId: entry.entryId }), children: "INSPECT" }), _jsx("button", { type: "button", className: "modal-btn modal-btn-primary", onClick: () => void installCatalogEntry(entry.entryId), disabled: busyEntryId === entry.entryId || !entry.policyTrusted, children: entry.installed ? "UPDATE" : "INSTALL" })] })] }, entry.entryId))) })] }));
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": "Extension Manager toolbar", children: [_jsxs("div", { className: "view-toolbar-group", children: [_jsx("button", { type: "button", className: `view-toolbar-btn ${effectiveSidebarOpen ? "active" : ""}`, title: "Toggle sidebar", onClick: () => embedBrowserInShellSidebar ? onShellSidebarToggle?.(!effectiveSidebarOpen) : setSidebarOpen((current) => !current), children: "SB" }), _jsx("button", { type: "button", className: `view-toolbar-btn ${layoutMode === "single" ? "active" : ""}`, title: "Single pane", onClick: () => setLayoutMode("single"), children: "1P" }), _jsx("button", { type: "button", className: `view-toolbar-btn ${layoutMode === "split" ? "active" : ""}`, title: "Split screen", onClick: () => setLayoutMode("split"), children: "2P" })] }), _jsxs("div", { className: "view-toolbar-group", children: [_jsx("span", { className: "view-toolbar-divider" }), _jsx("button", { type: "button", className: "view-toolbar-btn", title: "Import extension package", onClick: () => importInput?.click(), children: "IMP" }), _jsx("button", { type: "button", className: "view-toolbar-btn", title: "Export catalog snapshot", onClick: () => downloadJson("extension-catalog-snapshot.json", snapshot.catalogEntries), disabled: snapshot.catalogEntries.length === 0, children: "EXP" })] }), _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: "Close manager", onClick: () => void close(), children: "CLOSE" })] })] }), _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: `workspace-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: "settings-card settings-card-stack", style: { gap: 10 }, children: _jsxs("div", { style: { display: "flex", justifyContent: "space-between", gap: 12, alignItems: "center", flexWrap: "wrap" }, children: [_jsxs("div", { style: { display: "grid", gap: 4 }, children: [_jsx("span", { className: "settings-session-label", children: "EXTENSION_MANAGER" }), _jsx("strong", { style: { fontSize: 14 }, children: formatLabel(extensionManagerLabels.headerTitle) }), _jsx("span", { style: { fontSize: 11, color: "var(--fg-muted)" }, children: formatLabel(extensionManagerLabels.headerSubtitle) })] }), _jsxs("div", { className: "settings-chip-row", children: [_jsx("span", { className: "settings-chip", children: "PANE_ONLY" }), _jsx("span", { className: "settings-chip", children: "SPLIT + SINGLE" }), _jsx("span", { className: "settings-chip", children: "SETTINGS_CONTENT" })] })] }) }), _jsxs("div", { style: { display: "grid", gap: 16, gridTemplateColumns: layoutMode === "split" ? "minmax(0, 1.1fr) minmax(320px, 0.9fr)" : "minmax(0, 1fr)" }, children: [_jsx("div", { style: { display: "grid", gap: 16 }, children: detailsPane }), layoutMode === "split" && (_jsx("div", { style: { display: "grid", gap: 16 }, children: _jsxs("div", { className: "settings-card settings-card-stack", children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [_jsx("span", { className: "settings-session-label", children: "CATALOG" }), _jsx("strong", { style: { fontSize: 12, textTransform: "uppercase", letterSpacing: "0.08em" }, children: "Catalog Browser" })] }), catalogPane] }) }))] }), layoutMode === "single" && catalogPane] })] })] })] }));
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