@lloyal-labs/dev-tools 0.5.0-alpha.6 → 0.5.0-alpha.8
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/index.d.ts +41 -44
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -28
- package/dist/index.js.map +1 -1
- package/dist/ink.d.ts +20 -1
- package/dist/ink.d.ts.map +1 -1
- package/dist/ink.js +51 -11
- package/dist/ink.js.map +1 -1
- package/dist/react.d.ts +8 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +32 -109
- package/dist/react.js.map +1 -1
- package/package.json +2 -2
package/dist/react.js
CHANGED
|
@@ -17,7 +17,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
17
17
|
*/
|
|
18
18
|
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
19
19
|
import { useStore } from 'zustand';
|
|
20
|
-
import { pressureStrip, pressurePercent, readConfigPath, lanePpl, isLive,
|
|
20
|
+
import { pressureStrip, pressurePercent, readConfigPath, lanePpl, isLive, configRows, configCommand, liveConfigKeys, changing, } from './index.js';
|
|
21
21
|
import { devStoreFor, EDGE_STEP } from './store.js';
|
|
22
22
|
// ── palette: monochrome chrome, color reserved for data ──
|
|
23
23
|
const C = {
|
|
@@ -246,7 +246,7 @@ function runEndS(m) {
|
|
|
246
246
|
return m.runStartAt === null ? 0 : Math.max(0, (end - m.runStartAt) / 1000);
|
|
247
247
|
}
|
|
248
248
|
// ═══════════════════════════════════════════════════════════════
|
|
249
|
-
export function DevPane({ bridge,
|
|
249
|
+
export function DevPane({ bridge, config, title, runCommands = {}, framing, children }) {
|
|
250
250
|
// The store is a per-bridge SINGLETON: a remount reattaches to the running
|
|
251
251
|
// fold (full history intact) instead of restarting it and desyncing. It is
|
|
252
252
|
// deliberately NOT destroyed on unmount — it lives with the page, like the
|
|
@@ -328,13 +328,13 @@ export function DevPane({ bridge, controls = [], title, runCommands = {}, framin
|
|
|
328
328
|
} }), m.clarifying ? '?' : liveCount > 0 ? liveCount : '!'] })), _jsx("span", { children: summary })] }), toast && _jsx(Notice, { at: toastAt, text: toast }), _jsx("span", { style: { flex: 1 } }), _jsxs("span", { "aria-hidden": "true", style: { display: 'inline-flex', alignItems: 'center', gap: 14 }, children: [_jsx(MiniSpark, { heading: "context", color: C.agent, values: barStrip.map((p) => p.pct), value: barPct === null ? '—' : `${barPct}%` }), _jsx(MiniSpark, { heading: "cpu", color: HOST_CPU, values: barHost.map((h) => h.cpu), value: barLast ? `${barLast.cpu}%` : '—' }), _jsx(MiniSpark, { heading: "mem", color: "#9aa0a6", values: barHost.filter((h) => h.memUsedMb !== null).map((h) => h.memUsedMb), value: barLast && barLast.memUsedMb !== null && barLast.memTotalMb > 0
|
|
329
329
|
? `${(barLast.memUsedMb / 1024).toFixed(1)} / ${Math.round(barLast.memTotalMb / 1024)}G` : '—' }), _jsx(MiniSpark, { heading: "harness", color: "#5f6368", values: barHost.map((h) => h.rssMb), value: barLast ? `${(barLast.rssMb / 1024).toFixed(1)}G` : '—' })] }), _jsx("span", { style: { flex: 1 } }), _jsx("span", { style: { color: C.faint }, "aria-hidden": "true", children: "click to expand" })] }));
|
|
330
330
|
}
|
|
331
|
-
return shell(_jsx(Pane, { store: store, m: m, rev: rev,
|
|
331
|
+
return shell(_jsx(Pane, { store: store, m: m, rev: rev, config: config, title: title, runCommands: runCommands, onClose: () => setOpen(false),
|
|
332
332
|
// Thumbnails resolve through the bridge when the harness exposes a
|
|
333
333
|
// content route; the pane never learns the transport, only the URL.
|
|
334
334
|
mediaUrl: bridge.representationUrl ? (d, i) => bridge.representationUrl(d, i) : undefined }));
|
|
335
335
|
}
|
|
336
336
|
// ═══ the docked pane ═══
|
|
337
|
-
function Pane({ store, m, rev,
|
|
337
|
+
function Pane({ store, m, rev, config, title, runCommands, onClose, mediaUrl }) {
|
|
338
338
|
const [tab, setTab] = useState('timeline');
|
|
339
339
|
const [selAgent, setSelAgent] = useState(null);
|
|
340
340
|
const [feedW, setFeedW] = useState(feedWidthPref);
|
|
@@ -404,7 +404,7 @@ function Pane({ store, m, rev, controls, title, runCommands, onClose, mediaUrl }
|
|
|
404
404
|
: 'finish up — agents wrap up and report; the trajectory is kept', style: m.pausedAt !== null || m.windingDownAt !== null
|
|
405
405
|
? { ...runBtn, opacity: 0.4, cursor: 'default' } : runBtn, children: m.windingDownAt !== null ? 'finishing…' : 'finish up' })), runCommands.stop && (_jsx("button", { onClick: () => store.send({ type: 'stop' }), title: "halt the run", style: { ...runBtn, color: C.fail, borderColor: '#f0c4c1' }, children: "stop" }))] })), _jsxs("span", { style: { fontFamily: mono, display: 'inline-flex', alignItems: 'center', gap: 7 }, children: [_jsx("span", { style: { width: 7, height: 7, borderRadius: '50%', background: live ? (m.pausedAt !== null ? C.warn : C.ok) : C.faint } }), live
|
|
406
406
|
? (m.pausedAt !== null ? 'paused' : m.windingDownAt !== null ? 'finishing' : 'live')
|
|
407
|
-
: m.runStartAt === null ? 'idle' : 'run complete'] }), _jsx("span", { style: { cursor: 'pointer', color: C.dim }, onClick: onClose, title: "collapse to the cog", children: "\u2715" })] })] }), tab === 'timeline' && (_jsxs("div", { style: { flex: 1, minHeight: 0, display: 'flex' }, children: [_jsx(Timeline, { m: m, rev: rev, store: store, selAgent: selAgent, onSelect: setSelAgent, toolColor: toolColor }), selAgent === 'spine' && m.spine && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(SpineFeed, { m: m, onClose: () => setSelAgent(null), width: feedW, mediaUrl: mediaUrl, toolColor: toolColor })] })), selAgent === 'trunk' && m.trunk.length > 0 && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(TrunkFeed, { m: m, onClose: () => setSelAgent(null), width: feedW, mediaUrl: mediaUrl })] })), typeof selAgent === 'number' && m.lanes.has(selAgent) && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(AgentFeed, { m: m, lane: m.lanes.get(selAgent), toolColor: toolColor, onClose: () => setSelAgent(null), onJump: setSelAgent, nowMs: store.getState().paintedAt, width: feedW, send: (c) => store.send(c), canCancel: !!runCommands.cancelAgent })] }))] })), tab === 'sources' && _jsx(Sources, { m: m, toolColor: toolColor }), tab === 'settings' && _jsx(Settings, { m: m,
|
|
407
|
+
: m.runStartAt === null ? 'idle' : 'run complete'] }), _jsx("span", { style: { cursor: 'pointer', color: C.dim }, onClick: onClose, title: "collapse to the cog", children: "\u2715" })] })] }), tab === 'timeline' && (_jsxs("div", { style: { flex: 1, minHeight: 0, display: 'flex' }, children: [_jsx(Timeline, { m: m, rev: rev, store: store, selAgent: selAgent, onSelect: setSelAgent, toolColor: toolColor }), selAgent === 'spine' && m.spine && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(SpineFeed, { m: m, onClose: () => setSelAgent(null), width: feedW, mediaUrl: mediaUrl, toolColor: toolColor })] })), selAgent === 'trunk' && m.trunk.length > 0 && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(TrunkFeed, { m: m, onClose: () => setSelAgent(null), width: feedW, mediaUrl: mediaUrl })] })), typeof selAgent === 'number' && m.lanes.has(selAgent) && (_jsxs(_Fragment, { children: [_jsx(FeedResizer, { width: feedW, onWidth: (w) => { feedWidthPref = w; setFeedW(w); } }), _jsx(AgentFeed, { m: m, lane: m.lanes.get(selAgent), toolColor: toolColor, onClose: () => setSelAgent(null), onJump: setSelAgent, nowMs: store.getState().paintedAt, width: feedW, send: (c) => store.send(c), canCancel: !!runCommands.cancelAgent })] }))] })), tab === 'sources' && _jsx(Sources, { m: m, toolColor: toolColor }), tab === 'settings' && _jsx(Settings, { m: m, config: config, send: (c) => store.send(c) }), _jsxs("div", { style: {
|
|
408
408
|
height: 24, display: 'flex', alignItems: 'center', gap: 14, padding: '0 12px',
|
|
409
409
|
borderTop: `1px solid ${C.border}`, background: '#f8f9fa', fontSize: 10.5, color: C.dim, flex: 'none',
|
|
410
410
|
}, children: [_jsxs("span", { style: { fontFamily: mono }, children: [m.runStartAt === null
|
|
@@ -1132,77 +1132,19 @@ const cutline = {
|
|
|
1132
1132
|
borderTop: '1px dashed #dadce0', marginTop: 6,
|
|
1133
1133
|
};
|
|
1134
1134
|
// ═══ Settings: category nav → harness (master list + detail) · ability pages ═══
|
|
1135
|
-
/** What the detail panel knows about each well-known harness key: what it is,
|
|
1136
|
-
* and how to change it. Prose is product copy — one clause per sentence. */
|
|
1137
|
-
/** Config path → the ConfigOrigin field carrying its rung, so the
|
|
1138
|
-
* exception note (env/cli overrode the manifest) fires for read-only rows
|
|
1139
|
-
* too — full-rung provenance display stays demoted by design. */
|
|
1140
|
-
const ORIGIN_KEYS = {
|
|
1141
|
-
'model.path': 'modelPath',
|
|
1142
|
-
'model.reranker': 'reranker',
|
|
1143
|
-
'model.nCtx': 'nCtx',
|
|
1144
|
-
'model.gpu': 'gpu',
|
|
1145
|
-
'sources.outputDir': 'outputDir',
|
|
1146
|
-
'defaults.reasoningMode': 'reasoningMode',
|
|
1147
|
-
};
|
|
1148
|
-
const SETTING_META = {
|
|
1149
|
-
'defaults.effort': {
|
|
1150
|
-
desc: 'Run effort preset — agent budget, planner breadth, recovery cap.',
|
|
1151
|
-
how: 'Change it here; it applies to your next run and is remembered locally. The committed default lives in harness.yml → defaults.effort.',
|
|
1152
|
-
},
|
|
1153
|
-
'defaults.reasoningMode': {
|
|
1154
|
-
desc: 'flat runs one research wave over the plan; deep lets agents recurse into sub-plans.',
|
|
1155
|
-
how: 'Change it here; it applies to your next run.',
|
|
1156
|
-
},
|
|
1157
|
-
'model.imageMaxTokens': {
|
|
1158
|
-
desc: 'Ceiling on what ONE image costs in KV. Measured on Qwen3.5 with a 176 KB photo: 564 cells uncapped, 251 at 256. Lower it to fit more images into a context; auto lets the model metadata decide.',
|
|
1159
|
-
how: 'Change it here and the runtime reloads on the new value. It does NOT shrink the projector\u2019s warmup allocation, so it will not rescue a boot that runs out of GPU memory before any image arrives.',
|
|
1160
|
-
},
|
|
1161
|
-
'model.imageMinTokens': {
|
|
1162
|
-
desc: 'Floor on per-image detail. Grounding tasks need it high \u2014 llama.cpp warns Qwen-VL wants at least 1024 to read positions reliably.',
|
|
1163
|
-
how: 'Change it here and the runtime reloads on the new value. Raise it if the model reads an image but places things wrongly in it.',
|
|
1164
|
-
},
|
|
1165
|
-
'sources.outputDir': {
|
|
1166
|
-
desc: 'Where per-query run-dirs and the session trace are written. Empty means where the harness started.',
|
|
1167
|
-
how: 'Edit harness.yml → sources.outputDir; the next run picks it up.',
|
|
1168
|
-
},
|
|
1169
|
-
'defaults.maxTurns': {
|
|
1170
|
-
desc: 'Turn cap per agent run.',
|
|
1171
|
-
how: 'Edit harness.yml → defaults.maxTurns; the next run picks it up.',
|
|
1172
|
-
},
|
|
1173
|
-
'model.path': {
|
|
1174
|
-
desc: 'Filesystem path or catalog id of the reasoning model.',
|
|
1175
|
-
how: 'Saved changes load at the next start; this run keeps the model it booted with.',
|
|
1176
|
-
},
|
|
1177
|
-
'model.reranker': {
|
|
1178
|
-
desc: 'The admission judge — a pointwise yes/no reranker that gates what enters the context.',
|
|
1179
|
-
how: 'Saved changes load at the next start.',
|
|
1180
|
-
},
|
|
1181
|
-
'model.nCtx': {
|
|
1182
|
-
desc: 'Context window of the one shared llama_context — every branch leases cells out of this budget.',
|
|
1183
|
-
how: 'Edit harness.yml → model.llm.context, then restart.',
|
|
1184
|
-
},
|
|
1185
|
-
'model.branches': {
|
|
1186
|
-
desc: 'Concurrent sequences — createContext takes it as nSeqMax. Each sequence holds its own KV lease.',
|
|
1187
|
-
how: 'Edit harness.yml → model.llm.branches, then restart.',
|
|
1188
|
-
},
|
|
1189
|
-
'model.kvCache': {
|
|
1190
|
-
desc: 'KV cache type for the attention layers — raise for precision, lower for memory.',
|
|
1191
|
-
how: 'Edit harness.yml → model.llm.kvCache, then restart.',
|
|
1192
|
-
},
|
|
1193
|
-
'model.gpu': {
|
|
1194
|
-
desc: 'Which native backend the process loaded — picked once at start. A configured backend fails loud if unavailable, never silently CPU.',
|
|
1195
|
-
how: 'A deploy choice: set harness.yml → model.llm.gpu (or LLOYAL_GPU), then restart.',
|
|
1196
|
-
},
|
|
1197
|
-
};
|
|
1198
1135
|
const TIER_NOTE = {
|
|
1199
1136
|
session: 'applies to the next run',
|
|
1200
1137
|
reload: 'saved now — a restart loads it',
|
|
1201
1138
|
boot: 'fixed for this run',
|
|
1202
1139
|
};
|
|
1203
|
-
function Settings({ m,
|
|
1140
|
+
function Settings({ m, config, send }) {
|
|
1204
1141
|
const [cat, setCat] = useState('harness');
|
|
1205
|
-
|
|
1142
|
+
// With a table the rows are the application's own keys; without one, whatever config the harness announced.
|
|
1143
|
+
const rows = config
|
|
1144
|
+
? configRows(config)
|
|
1145
|
+
: liveConfigKeys(m.config).map((key) => ({ key, applies: 'session', values: null }));
|
|
1146
|
+
// Open on the first thing that can be changed now, else the first that can be changed at all.
|
|
1147
|
+
const [selKey, setSelKey] = useState((rows.find((r) => r.values && r.applies === 'session') ?? rows.find((r) => r.values) ?? rows[0])?.key ?? '');
|
|
1206
1148
|
// The nav lists INSTALLED abilities (`abilities:state` descriptors) — not
|
|
1207
1149
|
// merely configured ones, or the page you'd use to configure an ability
|
|
1208
1150
|
// could never appear. Harnesses that don't emit descriptors degrade to the
|
|
@@ -1222,60 +1164,41 @@ function Settings({ m, controls, send }) {
|
|
|
1222
1164
|
borderLeft: on ? `3px solid ${C.text}` : '3px solid transparent',
|
|
1223
1165
|
}, children: name }, name));
|
|
1224
1166
|
return (_jsxs("div", { style: { flex: 1, minHeight: 0, display: 'flex' }, children: [_jsxs("div", { style: { width: 148, flex: 'none', borderRight: '1px solid #d9dce1', paddingTop: 10, background: C.panelBg, overflowY: 'auto' }, children: [navItem('harness', cat === 'harness'), abilities.length > 0 && _jsx("div", { style: { ...label, padding: '12px 16px 3px' }, children: "abilities" }), abilities.map((a) => navItem(a, cat === a))] }), cat === 'harness'
|
|
1225
|
-
? _jsx(HarnessSettings, { m: m,
|
|
1167
|
+
? _jsx(HarnessSettings, { m: m, rows: rows, tiered: config !== undefined, send: send, selKey: selKey, onSelect: setSelKey })
|
|
1226
1168
|
: _jsx(AbilityPage, { m: m, name: cat, send: send })] }));
|
|
1227
1169
|
}
|
|
1228
|
-
|
|
1229
|
-
* order the template declared them, so there is no numeric range to keep in
|
|
1230
|
-
* sync with the option list and no value can be selected that the command
|
|
1231
|
-
* would not accept. Commits on release, not on drag \u2014 each change reloads
|
|
1232
|
-
* the runtime, and every intermediate step would be a reload nobody asked
|
|
1233
|
-
* for. */
|
|
1234
|
-
function SteppedSlider({ ctl, value, onSelect, send }) {
|
|
1235
|
-
const at = Math.max(0, ctl.values.indexOf(value ?? ''));
|
|
1236
|
-
const [dragging, setDragging] = useState(null);
|
|
1237
|
-
const shown = dragging ?? at;
|
|
1238
|
-
const commit = (i) => {
|
|
1239
|
-
setDragging(null);
|
|
1240
|
-
if (ctl.values[i] !== value) {
|
|
1241
|
-
onSelect();
|
|
1242
|
-
send({ type: ctl.command, [ctl.field]: ctl.values[i] });
|
|
1243
|
-
}
|
|
1244
|
-
};
|
|
1245
|
-
return (_jsxs("span", { onClick: (e) => e.stopPropagation(), style: { display: 'flex', alignItems: 'center', gap: 10, width: 276, flex: 'none' }, children: [_jsx("input", { type: "range", min: 0, max: ctl.values.length - 1, step: 1, value: shown, "aria-label": ctl.key, "aria-valuetext": String(ctl.values[shown]), onChange: (e) => setDragging(Number(e.target.value)), onPointerUp: (e) => commit(Number(e.target.value)), onKeyUp: (e) => commit(Number(e.target.value)), onBlur: () => setDragging(null), style: { flex: 1, accentColor: C.text, cursor: 'pointer', minWidth: 0 } }), _jsx("span", { style: {
|
|
1246
|
-
fontFamily: mono, fontSize: 11, color: C.text, width: 46, flex: 'none',
|
|
1247
|
-
textAlign: 'right', fontVariantNumeric: 'tabular-nums',
|
|
1248
|
-
}, children: ctl.values[shown] })] }));
|
|
1249
|
-
}
|
|
1250
|
-
function HarnessSettings({ m, controls, send, selKey, onSelect }) {
|
|
1170
|
+
function HarnessSettings({ m, rows, tiered, send, selKey, onSelect }) {
|
|
1251
1171
|
const config = m.config;
|
|
1252
|
-
const byTier = (tier) =>
|
|
1253
|
-
const
|
|
1254
|
-
|
|
1255
|
-
const
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
return null; // skip-if-absent: basic has no defaults block
|
|
1172
|
+
const byTier = (tier) => rows.filter((r) => r.applies === tier);
|
|
1173
|
+
const row = (r) => {
|
|
1174
|
+
const { key } = r;
|
|
1175
|
+
const raw = readConfigPath(config, key); // a declared key the harness never set is still a row: its value is —
|
|
1176
|
+
// A value that is itself a table (an app's own structured key) is shown as it is written.
|
|
1177
|
+
const value = raw === undefined || raw === null ? undefined : typeof raw === 'object' ? JSON.stringify(raw) : String(raw);
|
|
1259
1178
|
const selected = selKey === key;
|
|
1179
|
+
// Choosing the value already in force is a selection, never a command: on a reload row the command would
|
|
1180
|
+
// end the session to apply nothing.
|
|
1181
|
+
const choose = (v) => { onSelect(key); if (v === value)
|
|
1182
|
+
return; const command = configCommand(r, v); if (command)
|
|
1183
|
+
send(command); };
|
|
1260
1184
|
return (_jsxs("div", { onClick: () => onSelect(key), role: "button", tabIndex: 0, onKeyDown: keyActivate(() => onSelect(key)), style: {
|
|
1261
1185
|
display: 'flex', alignItems: 'center', gap: 8, padding: '5px 14px 5px 11px', minHeight: 36,
|
|
1262
1186
|
borderLeft: selected ? `3px solid ${C.text}` : '3px solid transparent', cursor: 'pointer',
|
|
1263
1187
|
background: selected ? C.chromeBg : undefined,
|
|
1264
|
-
}, children: [_jsx("span", { style: { fontFamily: mono, fontSize: 11.5, fontWeight: 500 }, children: key }), _jsx("span", { style: { flex: 1 } }),
|
|
1188
|
+
}, children: [_jsx("span", { style: { fontFamily: mono, fontSize: 11.5, fontWeight: 500 }, children: key }), _jsx("span", { style: { flex: 1 } }), r.values ? (_jsx("span", { style: { display: 'flex', border: '1px solid #dadce0', borderRadius: 4, overflow: 'hidden', width: 276, flex: 'none' }, children: r.values.map((v) => (_jsx("span", { onClick: (e) => { e.stopPropagation(); choose(v); }, role: "button", tabIndex: 0, "aria-pressed": v === value, onKeyDown: keyActivate(() => choose(v)), style: {
|
|
1265
1189
|
flex: 1, fontSize: 11, padding: '5px 0', textAlign: 'center', cursor: 'pointer',
|
|
1266
1190
|
background: v === value ? C.text : '#fff', color: v === value ? '#fff' : C.dim,
|
|
1267
1191
|
fontWeight: v === value ? 500 : 400, borderLeft: '1px solid #e8eaed',
|
|
1268
|
-
}, children: v }, v))) })) : (_jsxs("span", { style: { fontFamily: mono, fontSize: 11, color: C.dim, maxWidth: 300, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: [value === undefined || value ===
|
|
1192
|
+
}, children: v }, v))) })) : (_jsxs("span", { style: { fontFamily: mono, fontSize: 11, color: C.dim, maxWidth: 300, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: [value === undefined || value === '' ? '—' : value, key === 'model.branches' && _jsx("span", { style: { color: C.faint }, children: " \u2192 nSeqMax" })] }))] }, key));
|
|
1269
1193
|
};
|
|
1270
1194
|
const head = (t) => (_jsxs("div", { style: { display: 'flex', alignItems: 'baseline', gap: 8, padding: '13px 14px 3px' }, children: [_jsx("span", { style: label, children: t }), _jsx("span", { style: { color: C.faint, fontSize: 10.5 }, children: TIER_NOTE[t] })] }));
|
|
1271
|
-
const
|
|
1272
|
-
const tier =
|
|
1195
|
+
const selected = rows.find((r) => r.key === selKey);
|
|
1196
|
+
const tier = tiered ? selected?.applies : undefined;
|
|
1273
1197
|
// The exception case, surfaced exactly when true: something outside the
|
|
1274
|
-
// manifest set this value. No badges anywhere else.
|
|
1275
|
-
const
|
|
1276
|
-
const origin = originKey && m.origin ? m.origin[originKey] : undefined;
|
|
1198
|
+
// manifest set this value. No badges anywhere else. Provenance is keyed by the config path itself.
|
|
1199
|
+
const origin = m.origin ? m.origin[selKey] : undefined;
|
|
1277
1200
|
const overridden = origin === 'env' || origin === 'cli';
|
|
1278
|
-
return (_jsxs(_Fragment, { children: [
|
|
1201
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { style: { flex: 1, minWidth: 0, overflowY: 'auto', paddingBottom: 10 }, children: tiered ? ['session', 'reload', 'boot'].map((t) => byTier(t).length > 0 && (_jsxs("div", { children: [head(t), byTier(t).map(row)] }, t))) : rows.map(row) }), _jsxs("div", { style: { width: 400, flex: 'none', borderLeft: '1px solid #d9dce1', overflowY: 'auto', padding: '16px 20px', background: C.panelBg }, children: [selected ? (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx("span", { style: { fontFamily: mono, fontSize: 13, fontWeight: 500 }, children: selKey }), tier && _jsx("span", { style: chip, children: TIER_NOTE[tier] })] }), selected.describe && (_jsx("p", { style: { maxWidth: 340, margin: '8px 0 0', fontSize: 12, lineHeight: 1.55, color: '#3c4043' }, children: selected.describe })), tiered && (_jsxs(_Fragment, { children: [_jsx("div", { style: { ...label, marginTop: 16 }, children: "changing it" }), _jsx("p", { style: { maxWidth: 340, margin: '6px 0 0', fontSize: 12, lineHeight: 1.55, color: '#3c4043' }, children: changing(selected) })] })), overridden && (_jsxs("div", { style: {
|
|
1279
1202
|
display: 'flex', alignItems: 'baseline', gap: 8, padding: '8px 11px', marginTop: 14,
|
|
1280
1203
|
background: C.warnBg, border: `1px solid ${C.warnBorder}`, borderRadius: 4, fontSize: 11, maxWidth: 360,
|
|
1281
1204
|
}, children: [_jsx("b", { children: "currently overridden" }), _jsxs("span", { style: { color: C.dim }, children: [origin === 'env' ? 'an environment variable' : 'a command-line flag', " is overriding the manifest \u2014 the value shown is the one in effect."] })] }))] })) : (_jsx("span", { style: { color: C.faint }, children: "select a setting" })), m.lastSavedTo !== undefined && (_jsx("div", { style: { marginTop: 18, fontFamily: mono, fontSize: 10.5, color: C.dim }, children: m.lastSavedTo === null
|