pi-mega-compact 0.20.50 → 0.20.51
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/dist/config/vector-cortex-enc1b.js +46 -0
- package/dist/config/vector-cortex.js +1 -0
- package/dist/config.js +1 -1
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes-setup-enc1b.js +297 -0
- package/dist/extensions/dashboard-server/routes-setup-env-upsert.js +79 -0
- package/dist/extensions/dashboard-server/routes-setup.js +27 -26
- package/dist/src/config/vector-cortex-enc1b.js +46 -0
- package/dist/src/config/vector-cortex.js +1 -0
- package/dist/src/config.js +1 -1
- package/extensions/dashboard-client/dist/assets/{AreaChart-CeVnaV-0.js → AreaChart-BFTUTmmW.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-CeVnaV-0.js.map → AreaChart-BFTUTmmW.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-DoNd35sw.js → BarChart-DfFurESR.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-DoNd35sw.js.map → BarChart-DfFurESR.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-BROshdFf.js → CacheTab-FpCJSmy8.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-BROshdFf.js.map → CacheTab-FpCJSmy8.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-DAD6NeBR.js → EventsTab--9lJFJtc.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-DAD6NeBR.js.map → EventsTab--9lJFJtc.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-BBVMM54F.js → HealthTab-CkgtF1qa.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-BBVMM54F.js.map → HealthTab-CkgtF1qa.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-f9VhlFco.js → MaintenanceTab-ChXGq1or.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-f9VhlFco.js.map → MaintenanceTab-ChXGq1or.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-BaxfyzN2.js → MemoryMapTab-CPpRR4MV.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-BaxfyzN2.js.map → MemoryMapTab-CPpRR4MV.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DkUvoeS_.js → MetricsTab-Db1wkykf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DkUvoeS_.js.map → MetricsTab-Db1wkykf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-BCpK1vgt.js → OverviewTab-LanDECrz.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-BCpK1vgt.js.map → OverviewTab-LanDECrz.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-cJ5neYIG.js → ReposTab-I2umKduk.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-cJ5neYIG.js.map → ReposTab-I2umKduk.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-8DyQv1Ry.js → SessionsTab-D_IxuEt5.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-8DyQv1Ry.js.map → SessionsTab-D_IxuEt5.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-BZ7Jn5MR.js +3 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-BZ7Jn5MR.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-8N7Vvlch.js → TimeSavedCard-BTdcO1E2.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-8N7Vvlch.js.map → TimeSavedCard-BTdcO1E2.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-CCijkQoH.js → TurnsTab-BXC8IL_B.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-CCijkQoH.js.map → TurnsTab-BXC8IL_B.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-D9a7By8x.js → VcStatusBadge-CNJnFtJo.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-D9a7By8x.js.map → VcStatusBadge-CNJnFtJo.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-pviD6CCy.js → VectorCortexTab-fsuWgA6e.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-pviD6CCy.js.map → VectorCortexTab-fsuWgA6e.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{WikiTab-DLyicguz.js → WikiTab-Cn1BScDU.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-DLyicguz.js.map → WikiTab-Cn1BScDU.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-D8nKit8Y.js → button-B4_9rsul.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-D8nKit8Y.js.map → button-B4_9rsul.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-Xf5wHHBL.js → card-DUvC_geI.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-Xf5wHHBL.js.map → card-DUvC_geI.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{client-extra-CvxDLpQr.js → client-extra-HaH97bzp.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{client-extra-CvxDLpQr.js.map → client-extra-HaH97bzp.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DhQquRa8.js → generateCategoricalChart-BxFWU2Mt.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DhQquRa8.js.map → generateCategoricalChart-BxFWU2Mt.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/index-C_aDd9kk.css +1 -0
- package/extensions/dashboard-client/dist/assets/{index-BUP3MK5S.js → index-xPdbZ73U.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-BUP3MK5S.js.map → index-xPdbZ73U.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-B13rb8Z2.js → switch-Bv3_1R_j.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-B13rb8Z2.js.map → switch-Bv3_1R_j.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-4h6DUEB5.js → toggle-DHXrB3Aw.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-4h6DUEB5.js.map → toggle-DHXrB3Aw.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-Djom4z1K.js → useSSE-NigHeFyT.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-Djom4z1K.js.map → useSSE-NigHeFyT.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexRuntimeCard.tsx +103 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexRuntimeCardStyles.ts +49 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexSetup.tsx +2 -0
- package/extensions/dashboard-client/src/tabs/SetupTab/CustomEndpointSection.tsx +122 -1
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +57 -79
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetupHelpers.tsx +75 -0
- package/extensions/dashboard-server/api-contracts/setup.ts +35 -0
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
- package/extensions/dashboard-server/routes-setup-enc1b.ts +336 -0
- package/extensions/dashboard-server/routes-setup-env-upsert.ts +93 -0
- package/extensions/dashboard-server/routes-setup.ts +26 -24
- package/package.json +1 -1
- package/src/config/vector-cortex-enc1b.ts +50 -0
- package/src/config/vector-cortex.ts +8 -0
- package/src/config.ts +1 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-BQGPf9CI.js +0 -3
- package/extensions/dashboard-client/dist/assets/SetupTab-BQGPf9CI.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/index-DbuGwYD7.css +0 -1
|
@@ -25,10 +25,21 @@ interface CustomEndpointSectionProps {
|
|
|
25
25
|
embedder: "ollama" | "llama" | "trigram" | "custom" | "onnx",
|
|
26
26
|
url?: string,
|
|
27
27
|
apiKey?: string,
|
|
28
|
+
dim?: string,
|
|
29
|
+
headers?: string,
|
|
30
|
+
allowRemote?: boolean,
|
|
28
31
|
) => void;
|
|
29
32
|
configuring: string | null;
|
|
30
33
|
/** ENC-1a surface active — true when the new setup-status fields are present. */
|
|
31
34
|
inputEnabled: boolean;
|
|
35
|
+
/** Server-reported "key is set" marker (the key itself is never returned). */
|
|
36
|
+
apiKeySet: boolean;
|
|
37
|
+
/** ENC-1b: the persisted `embeddingDim` value (numeric string), or undefined. One-shot seed. */
|
|
38
|
+
embeddingDim: string | undefined;
|
|
39
|
+
/** ENC-1b: server-reported "headers are set" marker (the raw JSON is never returned). */
|
|
40
|
+
embeddingHeadersSet: boolean;
|
|
41
|
+
/** ENC-1b: the persisted allow-remote flag, or undefined. One-shot seed. */
|
|
42
|
+
allowRemoteEmbedder: boolean | undefined;
|
|
32
43
|
configureResult: SetupConfigureResponse | null;
|
|
33
44
|
configureError: string | null;
|
|
34
45
|
}
|
|
@@ -39,12 +50,36 @@ export default function CustomEndpointSection({
|
|
|
39
50
|
applyEmbedder,
|
|
40
51
|
configuring,
|
|
41
52
|
inputEnabled,
|
|
53
|
+
apiKeySet,
|
|
54
|
+
embeddingDim,
|
|
55
|
+
embeddingHeadersSet,
|
|
56
|
+
allowRemoteEmbedder,
|
|
42
57
|
configureResult,
|
|
43
58
|
configureError,
|
|
44
59
|
}: CustomEndpointSectionProps): React.ReactElement {
|
|
45
60
|
// The API key is intentionally local-only state: it always renders blank and
|
|
46
61
|
// is never seeded from the persisted value (the server never returns it).
|
|
47
62
|
const [customApiKey, setCustomApiKey] = useState("");
|
|
63
|
+
// ENC-1b: the embedding dim, seeded once from the persisted value (never
|
|
64
|
+
// re-seeded after a poll so the user's in-flight edits survive the 5s poll).
|
|
65
|
+
const [dim, setDim] = useState("");
|
|
66
|
+
const [dimSeeded, setDimSeeded] = useState(false);
|
|
67
|
+
// ENC-1b: the headers JSON is local-only, write-only state: NEVER prefilled,
|
|
68
|
+
// never seeded, never shown back — the server persists it verbatim and only
|
|
69
|
+
// ever reports its presence via `embeddingHeadersSet`.
|
|
70
|
+
const [headers, setHeaders] = useState("");
|
|
71
|
+
// ENC-1b: allow-remote toggle, seeded once from the persisted flag.
|
|
72
|
+
const [allowRemote, setAllowRemote] = useState(false);
|
|
73
|
+
const [allowRemoteSeeded, setAllowRemoteSeeded] = useState(false);
|
|
74
|
+
|
|
75
|
+
if (inputEnabled && !dimSeeded && typeof embeddingDim === "string") {
|
|
76
|
+
setDim(embeddingDim);
|
|
77
|
+
setDimSeeded(true);
|
|
78
|
+
}
|
|
79
|
+
if (inputEnabled && !allowRemoteSeeded && typeof allowRemoteEmbedder === "boolean") {
|
|
80
|
+
setAllowRemote(allowRemoteEmbedder);
|
|
81
|
+
setAllowRemoteSeeded(true);
|
|
82
|
+
}
|
|
48
83
|
|
|
49
84
|
return (
|
|
50
85
|
<div style={styles.section}>
|
|
@@ -93,14 +128,100 @@ export default function CustomEndpointSection({
|
|
|
93
128
|
}}
|
|
94
129
|
/>
|
|
95
130
|
)}
|
|
131
|
+
{inputEnabled && apiKeySet && (
|
|
132
|
+
<span
|
|
133
|
+
style={{
|
|
134
|
+
fontSize: "0.75rem",
|
|
135
|
+
color: "#81c784",
|
|
136
|
+
border: "1px solid #2a4e2a",
|
|
137
|
+
borderRadius: "4px",
|
|
138
|
+
padding: "0.15rem 0.45rem",
|
|
139
|
+
}}
|
|
140
|
+
>
|
|
141
|
+
API key saved
|
|
142
|
+
</span>
|
|
143
|
+
)}
|
|
144
|
+
{inputEnabled && embeddingHeadersSet && (
|
|
145
|
+
<span
|
|
146
|
+
style={{
|
|
147
|
+
fontSize: "0.75rem",
|
|
148
|
+
color: "#81c784",
|
|
149
|
+
border: "1px solid #2a4e2a",
|
|
150
|
+
borderRadius: "4px",
|
|
151
|
+
padding: "0.15rem 0.45rem",
|
|
152
|
+
}}
|
|
153
|
+
>
|
|
154
|
+
Headers saved
|
|
155
|
+
</span>
|
|
156
|
+
)}
|
|
96
157
|
<button
|
|
97
158
|
style={{ ...styles.button, opacity: customUrl ? 1 : 0.4 }}
|
|
98
|
-
onClick={() =>
|
|
159
|
+
onClick={() =>
|
|
160
|
+
applyEmbedder("custom", customUrl, customApiKey, dim, headers, allowRemote)
|
|
161
|
+
}
|
|
99
162
|
disabled={!customUrl || configuring !== null}
|
|
100
163
|
>
|
|
101
164
|
{configuring === "custom" ? "Writing..." : "Use Custom URL"}
|
|
102
165
|
</button>
|
|
103
166
|
</div>
|
|
167
|
+
{inputEnabled && (
|
|
168
|
+
<div style={{ marginTop: "0.75rem" }}>
|
|
169
|
+
<div style={{ marginBottom: "0.5rem" }}>
|
|
170
|
+
<label style={{ ...styles.label, display: "block", marginBottom: "0.25rem" }}>
|
|
171
|
+
Embedding dim (optional)
|
|
172
|
+
</label>
|
|
173
|
+
<input
|
|
174
|
+
type="number"
|
|
175
|
+
min={1}
|
|
176
|
+
placeholder="e.g. 384"
|
|
177
|
+
value={dim}
|
|
178
|
+
onChange={(e) => setDim(e.target.value)}
|
|
179
|
+
style={{
|
|
180
|
+
width: "200px",
|
|
181
|
+
background: "#12122a",
|
|
182
|
+
color: "#e0e0e0",
|
|
183
|
+
border: "1px solid #2a2a4e",
|
|
184
|
+
borderRadius: "6px",
|
|
185
|
+
padding: "0.4rem 0.6rem",
|
|
186
|
+
fontSize: "0.85rem",
|
|
187
|
+
fontFamily: "monospace",
|
|
188
|
+
}}
|
|
189
|
+
/>
|
|
190
|
+
</div>
|
|
191
|
+
<div style={{ marginBottom: "0.5rem" }}>
|
|
192
|
+
<label style={{ ...styles.label, display: "block", marginBottom: "0.25rem" }}>
|
|
193
|
+
Embedding headers (JSON, write-only — never re-displayed)
|
|
194
|
+
</label>
|
|
195
|
+
<textarea
|
|
196
|
+
placeholder={'{"Authorization": "Bearer ..."}'}
|
|
197
|
+
value={headers}
|
|
198
|
+
onChange={(e) => setHeaders(e.target.value)}
|
|
199
|
+
aria-label="Embedding headers JSON (write-only — never re-displayed)"
|
|
200
|
+
rows={2}
|
|
201
|
+
style={{
|
|
202
|
+
width: "100%",
|
|
203
|
+
background: "#12122a",
|
|
204
|
+
color: "#e0e0e0",
|
|
205
|
+
border: "1px solid #2a2a4e",
|
|
206
|
+
borderRadius: "6px",
|
|
207
|
+
padding: "0.4rem 0.6rem",
|
|
208
|
+
fontSize: "0.85rem",
|
|
209
|
+
fontFamily: "monospace",
|
|
210
|
+
resize: "vertical",
|
|
211
|
+
}}
|
|
212
|
+
/>
|
|
213
|
+
</div>
|
|
214
|
+
<label style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.85rem" }}>
|
|
215
|
+
<input
|
|
216
|
+
type="checkbox"
|
|
217
|
+
checked={allowRemote}
|
|
218
|
+
onChange={(e) => setAllowRemote(e.target.checked)}
|
|
219
|
+
aria-label="Allow remote embedder (skips loopback-only check)"
|
|
220
|
+
/>
|
|
221
|
+
Allow remote embedder (skips loopback-only check)
|
|
222
|
+
</label>
|
|
223
|
+
</div>
|
|
224
|
+
)}
|
|
104
225
|
{configureError !== null && (
|
|
105
226
|
<p style={{ color: "#f44336", fontSize: "0.85rem", marginTop: "0.5rem" }}>
|
|
106
227
|
Configure error: {configureError}
|
|
@@ -16,7 +16,7 @@ import EmbedderHealthCard from "./EmbedderHealthCard";
|
|
|
16
16
|
import SettingsPanel from "./SettingsPanel";
|
|
17
17
|
import CustomEndpointSection from "./CustomEndpointSection";
|
|
18
18
|
import { styles } from "./EmbedderSetupStyles";
|
|
19
|
-
import {
|
|
19
|
+
import { detectBadge, CurrentConfigSection } from "./EmbedderSetupHelpers";
|
|
20
20
|
|
|
21
21
|
export default function EmbedderSetup(): React.ReactElement {
|
|
22
22
|
const [status, setStatus] = useState<SetupStatusResponse | null>(null);
|
|
@@ -28,6 +28,10 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
28
28
|
const [configResult, setConfigResult] = useState<SetupConfigureResponse | null>(null);
|
|
29
29
|
const [configError, setConfigError] = useState<string | null>(null);
|
|
30
30
|
const [customUrl, setCustomUrl] = useState("");
|
|
31
|
+
// True once the URL field has been seeded from the persisted endpoint URL —
|
|
32
|
+
// seeding runs only on the first status load that carries the field so the
|
|
33
|
+
// user's in-flight edits are never clobbered by a poll refresh.
|
|
34
|
+
const [customUrlSeeded, setCustomUrlSeeded] = useState(false);
|
|
31
35
|
|
|
32
36
|
const loadStatus = useCallback(() => {
|
|
33
37
|
fetchSetupStatus()
|
|
@@ -37,22 +41,43 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
37
41
|
);
|
|
38
42
|
}, []);
|
|
39
43
|
|
|
40
|
-
const applyEmbedder = useCallback(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
const applyEmbedder = useCallback(
|
|
45
|
+
(
|
|
46
|
+
embedder: "ollama" | "llama" | "trigram" | "custom" | "onnx",
|
|
47
|
+
url?: string,
|
|
48
|
+
apiKey?: string,
|
|
49
|
+
dim?: string,
|
|
50
|
+
headers?: string,
|
|
51
|
+
allowRemote?: boolean,
|
|
52
|
+
) => {
|
|
53
|
+
setConfiguring(embedder);
|
|
54
|
+
setConfigError(null);
|
|
55
|
+
setConfigResult(null);
|
|
56
|
+
// ENC-1a: optional custom-endpoint URL + bearer key ride on the setup-configure POST (additive; flag-off ignores them).
|
|
57
|
+
// ENC-1b: the dim / headers / allow-remote fields are forwarded additively, gated on the same
|
|
58
|
+
// `embeddingHeadersSet` presence marker the aggregator/server uses (no separate client env read).
|
|
59
|
+
const enc1bOn = "embeddingHeadersSet" in (status ?? {});
|
|
60
|
+
configureEmbedder({
|
|
61
|
+
embedder,
|
|
62
|
+
url,
|
|
63
|
+
embeddingEndpointUrl: url,
|
|
64
|
+
embeddingApiKey: apiKey,
|
|
65
|
+
...(enc1bOn
|
|
66
|
+
? { embeddingDim: dim, embeddingHeaders: headers, allowRemoteEmbedder: allowRemote }
|
|
67
|
+
: {}),
|
|
50
68
|
})
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
.then((r) => {
|
|
70
|
+
setConfigResult(r);
|
|
71
|
+
setConfiguring(null);
|
|
72
|
+
loadStatus();
|
|
73
|
+
})
|
|
74
|
+
.catch((e: unknown) => {
|
|
75
|
+
setConfigError(e instanceof Error ? e.message : String(e));
|
|
76
|
+
setConfiguring(null);
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
[loadStatus, status],
|
|
80
|
+
);
|
|
56
81
|
|
|
57
82
|
const runDetect = useCallback(() => {
|
|
58
83
|
setRunningDetect(true);
|
|
@@ -72,6 +97,17 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
72
97
|
loadStatus();
|
|
73
98
|
}, [loadStatus]);
|
|
74
99
|
|
|
100
|
+
// Seed the custom-endpoint URL field once from the persisted
|
|
101
|
+
// `embeddingEndpointUrl` (ENC-1a). Later poll refreshes do NOT re-seed —
|
|
102
|
+
// only the first load, so typed edits survive the 5s status poll.
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (customUrlSeeded) return;
|
|
105
|
+
if (status && typeof status.embeddingEndpointUrl === "string" && status.embeddingEndpointUrl.length > 0) {
|
|
106
|
+
setCustomUrl(status.embeddingEndpointUrl);
|
|
107
|
+
setCustomUrlSeeded(true);
|
|
108
|
+
}
|
|
109
|
+
}, [status, customUrlSeeded]);
|
|
110
|
+
|
|
75
111
|
// Poll status every 5s — the same cadence the Setup Cortex sub-tab uses
|
|
76
112
|
// (see useSetupCortexPoll) so the embedder + cortex sub-tabs share one poll
|
|
77
113
|
// contract (VC9D consolidation). Detection is memoized server-side, so the
|
|
@@ -99,69 +135,7 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
99
135
|
<EmbedderHealthCard />
|
|
100
136
|
|
|
101
137
|
{/* Current Config Section */}
|
|
102
|
-
<
|
|
103
|
-
<h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>
|
|
104
|
-
{statusError && (
|
|
105
|
-
<p style={{ color: "#f44336", fontSize: "0.85rem" }}>
|
|
106
|
-
Error: {statusError}
|
|
107
|
-
</p>
|
|
108
|
-
)}
|
|
109
|
-
{status && (
|
|
110
|
-
<>
|
|
111
|
-
<div style={styles.row}>
|
|
112
|
-
<span style={styles.label}>Active Embedder:</span>
|
|
113
|
-
<span style={styles.value}>
|
|
114
|
-
{embedderLabel(status.currentEmbedder)}
|
|
115
|
-
</span>
|
|
116
|
-
</div>
|
|
117
|
-
{"configuredEmbedder" in status && status.configuredEmbedder !== status.currentEmbedder && (
|
|
118
|
-
<div style={styles.warning}>
|
|
119
|
-
<strong>Configured but not active:</strong>{" "}
|
|
120
|
-
{embedderLabel(status.configuredEmbedder)} is configured in
|
|
121
|
-
.mega-compact.env but not yet loaded.{" "}
|
|
122
|
-
<strong>Restart pi</strong> to activate it.
|
|
123
|
-
{status.configuredUrl && (
|
|
124
|
-
<> ({status.configuredUrl})</>
|
|
125
|
-
)}
|
|
126
|
-
</div>
|
|
127
|
-
)}
|
|
128
|
-
{"restartRequired" in status && status.restartRequired && (
|
|
129
|
-
<div style={{ ...styles.row, color: "#ff9800" }}>
|
|
130
|
-
<span style={styles.label}>Status:</span>
|
|
131
|
-
<span style={styles.value}>
|
|
132
|
-
Restart required to activate the configured embedder
|
|
133
|
-
</span>
|
|
134
|
-
</div>
|
|
135
|
-
)}
|
|
136
|
-
<div style={styles.row}>
|
|
137
|
-
<span style={styles.label}>Embedding URL:</span>
|
|
138
|
-
<span style={styles.value}>
|
|
139
|
-
{status.embeddingUrl ?? (
|
|
140
|
-
<span style={{ color: "#888" }}>not set</span>
|
|
141
|
-
)}
|
|
142
|
-
</span>
|
|
143
|
-
</div>
|
|
144
|
-
<div style={styles.row}>
|
|
145
|
-
<span style={styles.label}>Embed Cache:</span>
|
|
146
|
-
<span style={styles.value}>
|
|
147
|
-
{status.embedCache ?? (
|
|
148
|
-
<span style={{ color: "#888" }}>not set</span>
|
|
149
|
-
)}
|
|
150
|
-
</span>
|
|
151
|
-
</div>
|
|
152
|
-
<div style={styles.row}>
|
|
153
|
-
<span style={styles.label}>MiniLM:</span>
|
|
154
|
-
<span style={styles.value}>{status.minilm ? "enabled" : "disabled"}</span>
|
|
155
|
-
</div>
|
|
156
|
-
{trigramWarning(status)}
|
|
157
|
-
</>
|
|
158
|
-
)}
|
|
159
|
-
{!status && !statusError && (
|
|
160
|
-
<p style={{ color: "#888", fontSize: "0.85rem" }}>
|
|
161
|
-
Loading configuration...
|
|
162
|
-
</p>
|
|
163
|
-
)}
|
|
164
|
-
</div>
|
|
138
|
+
<CurrentConfigSection status={status} statusError={statusError} />
|
|
165
139
|
|
|
166
140
|
{/* Detection Section */}
|
|
167
141
|
<div style={styles.section}>
|
|
@@ -324,6 +298,10 @@ export default function EmbedderSetup(): React.ReactElement {
|
|
|
324
298
|
applyEmbedder={applyEmbedder}
|
|
325
299
|
configuring={configuring}
|
|
326
300
|
inputEnabled={status !== null && "embeddingApiKeySet" in status}
|
|
301
|
+
apiKeySet={status?.embeddingApiKeySet === true}
|
|
302
|
+
embeddingDim={status?.embeddingDim}
|
|
303
|
+
embeddingHeadersSet={status?.embeddingHeadersSet === true}
|
|
304
|
+
allowRemoteEmbedder={status?.allowRemoteEmbedder}
|
|
327
305
|
configureResult={configResult}
|
|
328
306
|
configureError={configError}
|
|
329
307
|
/>
|
|
@@ -48,3 +48,78 @@ export function detectBadge(installed: boolean): React.ReactElement {
|
|
|
48
48
|
</span>
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
/** The "Current Embedder Configuration" readout block. */
|
|
53
|
+
export function CurrentConfigSection({
|
|
54
|
+
status,
|
|
55
|
+
statusError,
|
|
56
|
+
}: {
|
|
57
|
+
status: SetupStatusResponse | null;
|
|
58
|
+
statusError: string | null;
|
|
59
|
+
}): React.ReactElement {
|
|
60
|
+
return (
|
|
61
|
+
<div style={styles.section}>
|
|
62
|
+
<h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>
|
|
63
|
+
{statusError && (
|
|
64
|
+
<p style={{ color: "#f44336", fontSize: "0.85rem" }}>
|
|
65
|
+
Error: {statusError}
|
|
66
|
+
</p>
|
|
67
|
+
)}
|
|
68
|
+
{status && (
|
|
69
|
+
<>
|
|
70
|
+
<div style={styles.row}>
|
|
71
|
+
<span style={styles.label}>Active Embedder:</span>
|
|
72
|
+
<span style={styles.value}>
|
|
73
|
+
{embedderLabel(status.currentEmbedder)}
|
|
74
|
+
</span>
|
|
75
|
+
</div>
|
|
76
|
+
{"configuredEmbedder" in status && status.configuredEmbedder !== status.currentEmbedder && (
|
|
77
|
+
<div style={styles.warning}>
|
|
78
|
+
<strong>Configured but not active:</strong>{" "}
|
|
79
|
+
{embedderLabel(status.configuredEmbedder)} is configured in
|
|
80
|
+
.mega-compact.env but not yet loaded.{" "}
|
|
81
|
+
<strong>Restart pi</strong> to activate it.
|
|
82
|
+
{status.configuredUrl && (
|
|
83
|
+
<> ({status.configuredUrl})</>
|
|
84
|
+
)}
|
|
85
|
+
</div>
|
|
86
|
+
)}
|
|
87
|
+
{"restartRequired" in status && status.restartRequired && (
|
|
88
|
+
<div style={{ ...styles.row, color: "#ff9800" }}>
|
|
89
|
+
<span style={styles.label}>Status:</span>
|
|
90
|
+
<span style={styles.value}>
|
|
91
|
+
Restart required to activate the configured embedder
|
|
92
|
+
</span>
|
|
93
|
+
</div>
|
|
94
|
+
)}
|
|
95
|
+
<div style={styles.row}>
|
|
96
|
+
<span style={styles.label}>Embedding URL:</span>
|
|
97
|
+
<span style={styles.value}>
|
|
98
|
+
{status.embeddingUrl ?? (
|
|
99
|
+
<span style={{ color: "#888" }}>not set</span>
|
|
100
|
+
)}
|
|
101
|
+
</span>
|
|
102
|
+
</div>
|
|
103
|
+
<div style={styles.row}>
|
|
104
|
+
<span style={styles.label}>Embed Cache:</span>
|
|
105
|
+
<span style={styles.value}>
|
|
106
|
+
{status.embedCache ?? (
|
|
107
|
+
<span style={{ color: "#888" }}>not set</span>
|
|
108
|
+
)}
|
|
109
|
+
</span>
|
|
110
|
+
</div>
|
|
111
|
+
<div style={styles.row}>
|
|
112
|
+
<span style={styles.label}>MiniLM:</span>
|
|
113
|
+
<span style={styles.value}>{status.minilm ? "enabled" : "disabled"}</span>
|
|
114
|
+
</div>
|
|
115
|
+
{trigramWarning(status)}
|
|
116
|
+
</>
|
|
117
|
+
)}
|
|
118
|
+
{!status && !statusError && (
|
|
119
|
+
<p style={{ color: "#888", fontSize: "0.85rem" }}>
|
|
120
|
+
Loading configuration...
|
|
121
|
+
</p>
|
|
122
|
+
)}
|
|
123
|
+
</div>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
@@ -33,6 +33,28 @@ export interface SetupStatusResponse {
|
|
|
33
33
|
/** ENC-1a: whether an external embedder API key is configured. The raw key is
|
|
34
34
|
* NEVER returned — only this boolean presence marker (additive, flag-gated). */
|
|
35
35
|
readonly embeddingApiKeySet?: boolean;
|
|
36
|
+
/** ENC-1b: the persisted `MEGACOMPACT_EMBEDDING_DIM` value as its numeric
|
|
37
|
+
* string, when one is configured (additive, flag-gated). */
|
|
38
|
+
readonly embeddingDim?: string;
|
|
39
|
+
/** ENC-1b: whether `MEGACOMPACT_EMBEDDING_HEADERS` is configured. The raw
|
|
40
|
+
* headers JSON is NEVER returned — only this boolean presence marker
|
|
41
|
+
* (additive, flag-gated, redaction mirrors embeddingApiKeySet). */
|
|
42
|
+
readonly embeddingHeadersSet?: boolean;
|
|
43
|
+
/** ENC-1b: whether `MEGACOMPACT_ALLOW_REMOTE_EMBEDDER` is set (default off —
|
|
44
|
+
* a deliberate escape hatch that skips the loopback-only check; additive,
|
|
45
|
+
* flag-gated). */
|
|
46
|
+
readonly allowRemoteEmbedder?: boolean;
|
|
47
|
+
/** ENC-1b: whether `MEGACOMPACT_ENCODER_NATIVE=1` is set, i.e. the operator
|
|
48
|
+
* opted into the onnxruntime-node native backend (additive, flag-gated). */
|
|
49
|
+
readonly encoderNativeOptIn?: boolean;
|
|
50
|
+
/** ENC-1b: the current effective ONNX runtime backend, computed live through
|
|
51
|
+
* the existing `selectRuntimeBackend`. `modeB` (flag-off / no runtime) is
|
|
52
|
+
* projected to `wasm` for display (additive, flag-gated). */
|
|
53
|
+
readonly encoderBackend?: "wasm" | "native";
|
|
54
|
+
/** ENC-1b: the runtime's own demotion reason when the effective backend
|
|
55
|
+
* falls back (e.g. native selected but onnxruntime-node absent / darwin-x64
|
|
56
|
+
* demoted), surfaced verbatim; null when no demotion (additive, flag-gated). */
|
|
57
|
+
readonly encoderDemotionReason?: string | null;
|
|
36
58
|
}
|
|
37
59
|
|
|
38
60
|
/**
|
|
@@ -84,6 +106,19 @@ export interface SetupConfigureRequest {
|
|
|
84
106
|
/** ENC-1a: external embedder API key, persisted to the per-repo
|
|
85
107
|
* `.mega-compact.env` only — never returned by any GET (additive, flag-gated). */
|
|
86
108
|
readonly embeddingApiKey?: string;
|
|
109
|
+
/** ENC-1b: persisted `MEGACOMPACT_EMBEDDING_DIM` as a positive integer string
|
|
110
|
+
* within `ENC_1B_MAX_EMBEDDING_DIM` (validated; additive, flag-gated). */
|
|
111
|
+
readonly embeddingDim?: string;
|
|
112
|
+
/** ENC-1b: persisted `MEGACOMPACT_EMBEDDING_HEADERS` JSON object string
|
|
113
|
+
* (secret-bearing — written verbatim, NEVER echoed back; validated to parse
|
|
114
|
+
* as a JSON object; additive, flag-gated). */
|
|
115
|
+
readonly embeddingHeaders?: string;
|
|
116
|
+
/** ENC-1b: opt in to `MEGACOMPACT_ALLOW_REMOTE_EMBEDDER` (default off — a
|
|
117
|
+
* deliberate escape hatch; additive, flag-gated). */
|
|
118
|
+
readonly allowRemoteEmbedder?: boolean;
|
|
119
|
+
/** ENC-1b: opt in to `MEGACOMPACT_ENCODER_NATIVE` (onnxruntime-node native
|
|
120
|
+
* backend; additive, flag-gated). */
|
|
121
|
+
readonly encoderNativeOptIn?: boolean;
|
|
87
122
|
}
|
|
88
123
|
|
|
89
124
|
/** Response for POST /api/setup-configure. */
|
|
@@ -300,5 +300,11 @@ export const VECTOR_CORTEX_SETTINGS: SettingGroup = {
|
|
|
300
300
|
"ENC-1a adds a Settings-visible field pair for the external embedder endpoint URL + optional Bearer API key, persisted by the setup-configure writer branch to the per-repo .mega-compact.env (MEGACOMPACT_EMBEDDING_URL / MEGACOMPACT_EMBEDDING_KEY). The GET status route echoes the endpoint URL and reports embeddingApiKeySet as a boolean ONLY — the raw key is never returned. OFF = no new GET fields, no writer branch, no new Settings text rows (byte-identical ENC-0g predecessor).",
|
|
301
301
|
true,
|
|
302
302
|
),
|
|
303
|
+
boolDirect(
|
|
304
|
+
"MEGACOMPACT_ENC_1B",
|
|
305
|
+
"ENC-1b ONNX runtime backend + embedder API settings",
|
|
306
|
+
"ENC-1b completes the embedder API Settings surface (dim / headers / allow-remote persisted to the per-repo .mega-compact.env) and surfaces the ONNX runtime selection knob (MEGACOMPACT_ENCODER_NATIVE) as a toggle plus the current effective backend + demotion reason. OFF = no new GET fields, no writer branch, no new Settings rows or toggle (byte-identical ENC-1a predecessor).",
|
|
307
|
+
true,
|
|
308
|
+
),
|
|
303
309
|
],
|
|
304
310
|
};
|