koneck 2.128.40 → 2.128.42
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/engine.d.ts.map +1 -1
- package/dist/engine.js +8 -1
- package/dist/engine.js.map +1 -1
- package/dist/ink-chat.d.ts +2 -0
- package/dist/ink-chat.d.ts.map +1 -1
- package/dist/ink-chat.js +133 -52
- package/dist/ink-chat.js.map +1 -1
- package/dist/model-catalog.d.ts +6 -0
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +4 -3
- package/dist/model-catalog.js.map +1 -1
- package/dist/tool-call-text.d.ts +14 -0
- package/dist/tool-call-text.d.ts.map +1 -1
- package/dist/tool-call-text.js +27 -0
- package/dist/tool-call-text.js.map +1 -1
- package/package.json +1 -1
package/dist/ink-chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ink-chat.d.ts","sourceRoot":"","sources":["../src/ink-chat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AA6B3D,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAuCtE,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAmB5D,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3F,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAoD7D,KAAK,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAGhD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAyED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM7C;AA0BD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"ink-chat.d.ts","sourceRoot":"","sources":["../src/ink-chat.tsx"],"names":[],"mappings":"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"}
|
package/dist/ink-chat.js
CHANGED
|
@@ -221,7 +221,17 @@ function fitCells(text, width, ellipsis = false) {
|
|
|
221
221
|
}
|
|
222
222
|
/** A picker label uses all of its allocated column, only ellipsising at the actual boundary. */
|
|
223
223
|
export function pickerLabel(text, width) {
|
|
224
|
-
|
|
224
|
+
/*
|
|
225
|
+
* One column of the field always stays blank, so the label cannot touch what follows it.
|
|
226
|
+
*
|
|
227
|
+
* Padding to exactly `width` left no gap for a label that filled the field, and the row ran
|
|
228
|
+
* together: `muse-glimmer:latestlibrary · local` in an Ollama list, where the name ends and its
|
|
229
|
+
* group begins is anybody's guess. Every shorter label already had a gap, so this only ever
|
|
230
|
+
* showed up on the longest one — which is also the one the field was sized from.
|
|
231
|
+
*
|
|
232
|
+
* A label one cell shorter beats a label welded to its description.
|
|
233
|
+
*/
|
|
234
|
+
return fitCells(text, Math.max(1, width - 1), true) + ' ';
|
|
225
235
|
}
|
|
226
236
|
/**
|
|
227
237
|
* Wraps text while keeping the shape it was written in.
|
|
@@ -505,6 +515,15 @@ export const WORD_HOLD_MS = 60_000;
|
|
|
505
515
|
* appears frozen for seven seconds is worse than either.
|
|
506
516
|
*/
|
|
507
517
|
export const HEARTBEAT_MS = 1_000;
|
|
518
|
+
/** The host a provider's requests go to, for saying so where it matters. */
|
|
519
|
+
export function endpointHost(url) {
|
|
520
|
+
try {
|
|
521
|
+
return new URL(url).host;
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
return url || 'unknown';
|
|
525
|
+
}
|
|
526
|
+
}
|
|
508
527
|
/**
|
|
509
528
|
* One row of the fork tree: the task on the left, what it has cost on the right.
|
|
510
529
|
*
|
|
@@ -1024,7 +1043,9 @@ export function pickerLabelWidth(labels, descs, width) {
|
|
|
1024
1043
|
// Terminal cells, not JS code units: one wide glyph in a model name or session title used to
|
|
1025
1044
|
// make a supposedly exact row spill past the palette edge.
|
|
1026
1045
|
const longestDesc = Math.max(0, ...descs.map(displayWidth));
|
|
1027
|
-
|
|
1046
|
+
// Plus the blank column pickerLabel always keeps, so the longest label is sized to fit whole
|
|
1047
|
+
// rather than being the one label the field truncates.
|
|
1048
|
+
const longestLabel = Math.max(18, ...labels.map(l => displayWidth(l) + 1));
|
|
1028
1049
|
return Math.max(18, Math.min(longestLabel, width - longestDesc - 4));
|
|
1029
1050
|
}
|
|
1030
1051
|
/**
|
|
@@ -2196,6 +2217,37 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
2196
2217
|
*/
|
|
2197
2218
|
const [selAnchor, setSelAnchor] = useState(null);
|
|
2198
2219
|
const [busy, setBusy] = useState(false);
|
|
2220
|
+
/**
|
|
2221
|
+
* Whether a turn is running, readable from an async path.
|
|
2222
|
+
*
|
|
2223
|
+
* A command started while the agent works must not take ownership of this flag, and cannot know
|
|
2224
|
+
* from a captured render whether it already belonged to somebody.
|
|
2225
|
+
*/
|
|
2226
|
+
const busyRef = useRef(false);
|
|
2227
|
+
busyRef.current = busy;
|
|
2228
|
+
/**
|
|
2229
|
+
* Run a command, holding `busy` only if nothing else already is.
|
|
2230
|
+
*
|
|
2231
|
+
* Both callers used to do `setBusy(true)` and then clear it unconditionally when the command
|
|
2232
|
+
* finished — including when a turn was already running, whose flag it then cleared. The live
|
|
2233
|
+
* region is gated on `busy` and the status bar on `agentState`, so the working line vanished
|
|
2234
|
+
* while the bar went on saying "processing" and the turn carried on unseen. Reported as the
|
|
2235
|
+
* agent looking stuck: "it is working on the background, that is bad".
|
|
2236
|
+
*
|
|
2237
|
+
* The command is not what makes the interface busy. A turn is.
|
|
2238
|
+
*/
|
|
2239
|
+
async function runCommandDetached(cmd, arg) {
|
|
2240
|
+
const alreadyBusy = busyRef.current;
|
|
2241
|
+
if (!alreadyBusy)
|
|
2242
|
+
setBusy(true);
|
|
2243
|
+
try {
|
|
2244
|
+
await handleCommand(cmd, arg);
|
|
2245
|
+
}
|
|
2246
|
+
finally {
|
|
2247
|
+
if (!alreadyBusy)
|
|
2248
|
+
setBusy(false);
|
|
2249
|
+
}
|
|
2250
|
+
}
|
|
2199
2251
|
const [agentState, setAgentState] = useState('ready');
|
|
2200
2252
|
// A shell normally uses the machine name as its tab title. Keep the KONECK mark and workspace
|
|
2201
2253
|
// there instead. The working marker changes in the terminal chrome only: it does not set React
|
|
@@ -3639,10 +3691,16 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
3639
3691
|
}
|
|
3640
3692
|
}
|
|
3641
3693
|
/** The provider's own model listing, kept so the models tab and picker agree on the facts. */
|
|
3694
|
+
const catalogEndpoint = useRef('');
|
|
3642
3695
|
async function loadModelCatalog() {
|
|
3643
3696
|
const { listModels } = await import('./model-catalog.js');
|
|
3644
3697
|
const catalog = await listModels(cfg);
|
|
3645
3698
|
setModelCatalog(catalog.entries);
|
|
3699
|
+
// The host that answered, kept for the picker's header. endpointFor() resolves from the saved
|
|
3700
|
+
// layers and does not see the session's live baseURL, so it reported ollama's default
|
|
3701
|
+
// localhost:11434 for a list fetched from somewhere else entirely — the one label whose whole
|
|
3702
|
+
// job is to show that the request went to the wrong place.
|
|
3703
|
+
catalogEndpoint.current = catalog.endpoint;
|
|
3646
3704
|
catalogNote.current = catalog.listed ? null : (catalog.note ?? null);
|
|
3647
3705
|
return catalog.entries; // empty says so rather than showing zeroes
|
|
3648
3706
|
}
|
|
@@ -3928,8 +3986,7 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
3928
3986
|
}
|
|
3929
3987
|
setDraft('');
|
|
3930
3988
|
setCaret(0);
|
|
3931
|
-
|
|
3932
|
-
await handleCommand(item.value, '').finally(() => setBusy(false));
|
|
3989
|
+
await runCommandDetached(item.value, '');
|
|
3933
3990
|
return;
|
|
3934
3991
|
}
|
|
3935
3992
|
if (kind === 'resume') {
|
|
@@ -4820,9 +4877,15 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
4820
4877
|
? 'File changes hidden. Edits are still listed with what they touched, just not shown.'
|
|
4821
4878
|
: canPin
|
|
4822
4879
|
? 'Live diff panel open and pinned beside the conversation, until `/diff off`.'
|
|
4880
|
+
// Names where the setting came from. "off for this workspace" was true and unusable:
|
|
4881
|
+
// reported as `/diff` looking right on one machine and printing this on another, with
|
|
4882
|
+
// no way to tell that the difference was a saved `altScreen: false` on one of them
|
|
4883
|
+
// rather than the platform.
|
|
4823
4884
|
: 'File changes shown inline in the conversation, until `/diff off`.\n\n'
|
|
4824
|
-
+ 'The side panel needs the alternate screen,
|
|
4825
|
-
+ '
|
|
4885
|
+
+ 'The pinned side panel needs the alternate screen, and `altScreen: false` is set '
|
|
4886
|
+
+ 'in this workspace\'s config — so it is off by your choice, not by platform. '
|
|
4887
|
+
+ '`/altscreen on` turns it back on and moves the changes into a pinned panel; '
|
|
4888
|
+
+ '`/config altScreen` shows the current value.');
|
|
4826
4889
|
return;
|
|
4827
4890
|
}
|
|
4828
4891
|
case '/compact': {
|
|
@@ -6422,8 +6485,7 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
6422
6485
|
const spaceIdx = task.indexOf(' ');
|
|
6423
6486
|
const cmd = spaceIdx === -1 ? task : task.slice(0, spaceIdx);
|
|
6424
6487
|
const arg = spaceIdx === -1 ? '' : task.slice(spaceIdx + 1).trim();
|
|
6425
|
-
|
|
6426
|
-
void handleCommand(cmd, arg).finally(() => setBusy(false));
|
|
6488
|
+
void runCommandDetached(cmd, arg);
|
|
6427
6489
|
return;
|
|
6428
6490
|
}
|
|
6429
6491
|
if (!containsSecret(task))
|
|
@@ -7232,49 +7294,6 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
7232
7294
|
lines.push('**Sessions** /sessions · /send <repo> <task> · /ask <repo> <q> · /resume');
|
|
7233
7295
|
lines.push('**Changelog** github.com/Gubevu/konech/commits/main');
|
|
7234
7296
|
return (_jsx(Box, { marginTop: 1, justifyContent: "flex-end", children: _jsx(Panel, { width: Math.min(barWidth, 62), color: AMBER, title: "KONECK \u00B7 updates & guide", children: lines }) }));
|
|
7235
|
-
})(), picker && (() => {
|
|
7236
|
-
const list = visiblePickerItems;
|
|
7237
|
-
// In the alternate screen, the picker shares a fixed frame with a bordered composer and
|
|
7238
|
-
// footer. They consume six rows and the picker itself has six non-choice rows (margin,
|
|
7239
|
-
// border, title/search and pager), so reserve thirteen in total. Letting 16 choices into
|
|
7240
|
-
// a 24-row frame made Ink reflow the live region and visibly blink on every keypress.
|
|
7241
|
-
const pickerRows = pickerRowLimit(picker.kind, list.length, termRows, altScreen ? 13 : undefined);
|
|
7242
|
-
// Keep the highlighted row inside the visible window as the selection moves.
|
|
7243
|
-
const start = Math.max(0, Math.min(pickIndex - Math.floor(pickerRows / 2), list.length - pickerRows));
|
|
7244
|
-
const shown = list.slice(Math.max(0, start), Math.max(0, start) + pickerRows);
|
|
7245
|
-
const title = picker.kind === 'command' ? 'Commands'
|
|
7246
|
-
: picker.kind === 'model' ? `Models - ${cfg.provider}`
|
|
7247
|
-
: picker.kind === 'effort' ? 'Reasoning effort'
|
|
7248
|
-
: picker.kind === 'resume' ? 'Resume a saved session'
|
|
7249
|
-
: picker.kind === 'file' ? 'Reference a file or directory'
|
|
7250
|
-
: 'Connect provider';
|
|
7251
|
-
// The palette is sized to the rows it is showing rather than to the terminal. On a wide
|
|
7252
|
-
// screen a list of short model names in a full-width box is mostly empty box.
|
|
7253
|
-
// The header is a title on the left and a count on the right, on one line. Estimating the
|
|
7254
|
-
// right-hand side at a constant made "Reference a file or directory" wrap onto two rows.
|
|
7255
|
-
const countText = pickerCountText(pickIndex, list.length, picker.items.length);
|
|
7256
|
-
const headWidth = displayWidth(title) + displayWidth(countText) + 3;
|
|
7257
|
-
// Measure the filtered list, not just its current scroll window. A palette whose right
|
|
7258
|
-
// edge breathes as the highlight crosses a long description feels broken even when the
|
|
7259
|
-
// selection itself is correct.
|
|
7260
|
-
const rowWidth = Math.max(headWidth, ...list.map(it => 38 + (it.current ? 10 : 0) + displayWidth(it.desc) + displayWidth(it.group ?? '') + 3));
|
|
7261
|
-
const boxWidth = pickerBoxWidth(barWidth, rowWidth + 4);
|
|
7262
|
-
const width = boxWidth - 4;
|
|
7263
|
-
// Room for the longest label the list actually holds, rather than a constant. A session
|
|
7264
|
-
// title is what identifies the row, and 36 cells cut most of them in half.
|
|
7265
|
-
const labelWidth = pickerLabelWidth(list.map(it => it.label), list.map(it => it.desc), width);
|
|
7266
|
-
let lastGroup;
|
|
7267
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: CYAN, paddingX: 1, marginTop: 1, width: boxWidth, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: CYAN, bold: true, children: title }), _jsx(Text, { color: DIM, children: countText })] }), _jsxs(Box, { children: [_jsxs(Text, { color: DIM, children: [G.search, " "] }), pickQuery === ''
|
|
7268
|
-
? _jsx(Text, { color: DIM, children: "type to search" })
|
|
7269
|
-
: _jsx(Text, { color: INK, children: pickQuery }), _jsx(Text, { color: CYAN, children: pickQuery === '' ? '' : '▌' })] }), list.length === 0 && _jsxs(Text, { color: MUTED, children: ["Nothing matches \"", pickQuery, "\""] }), shown.map((item, i) => {
|
|
7270
|
-
const absolute = Math.max(0, start) + i;
|
|
7271
|
-
const selected = absolute === pickIndex;
|
|
7272
|
-
const header = item.group && item.group !== lastGroup ? item.group : null;
|
|
7273
|
-
lastGroup = item.group;
|
|
7274
|
-
const label = pickerLabel(item.label, labelWidth);
|
|
7275
|
-
return (_jsx(Box, { flexDirection: "column", children: _jsx(Text, { backgroundColor: selected ? CYAN : undefined, color: selected ? '#10222A' : INK, bold: selected, children: fitCells(`${selected ? G.caret + ' ' : ' '}${label}` +
|
|
7276
|
-
`${item.current ? '(current) ' : ''}${header ? `${header} · ` : ''}${item.desc}`, width) }) }, item.value + absolute));
|
|
7277
|
-
}), list.length > pickerRows && (_jsxs(Text, { color: DIM, children: ["\u2191\u2193 navigate \u00B7 pgup/pgdn jump \u00B7 enter select \u00B7 showing ", Math.max(0, start) + 1, "\u2013", Math.max(0, start) + shown.length, " of ", list.length] }))] }));
|
|
7278
7297
|
})(), addProv && (() => {
|
|
7279
7298
|
const shadowed = BUILT_IN_PROVIDERS[addProv.name];
|
|
7280
7299
|
const ask = addProv.step === 'name' ? { label: 'name', hint: 'short and lowercase, e.g. openrouter' }
|
|
@@ -7347,7 +7366,69 @@ export function App({ config: initialConfig, clearFrame, synchronizedFrames = fa
|
|
|
7347
7366
|
return (_jsx(Box, { marginTop: 1, children: _jsx(Panel, { width: panelWidth(lines, barWidth, 46), color: AMBER, title: `Permission — ${modeSpec(mode).label} mode`, children: lines }) }));
|
|
7348
7367
|
})()] }), sidePanelOpen && (_jsx(Box, { flexDirection: "column", width: diffPanelWidth, flexShrink: 0, children: diffPanelOpen && _jsx(DiffPanel, { files: liveDiffs, width: diffPanelWidth, scroll: panelScroll, height: Math.max(6, frameRows - 6), activityRows: activityPanelOpen ? 4 : 0, activity: activityPanelOpen ? _jsxs(_Fragment, { children: [_jsxs(Text, { color: CYAN, bold: true, children: ["Activity \u00B7 ", fmtElapsed(busyStart.current ? Date.now() - busyStart.current : 0)] }), _jsx(Text, { color: AMBER, wrap: "truncate", children: ask ? 'Waiting for your approval' : liveToolRef.current
|
|
7349
7368
|
? 'Running ' + liveToolRef.current.name : thinkingRef.current.chars > 0
|
|
7350
|
-
? 'Waiting for model · reasoning received' : 'Waiting for model' }), _jsx(Text, { color: MUTED, wrap: "truncate", children: liveToolRef.current?.detail || plan?.steps.find(s => s.state !== 'done')?.text || 'esc to interrupt' })] }) : undefined }) }))] }),
|
|
7369
|
+
? 'Waiting for model · reasoning received' : 'Waiting for model' }), _jsx(Text, { color: MUTED, wrap: "truncate", children: liveToolRef.current?.detail || plan?.steps.find(s => s.state !== 'done')?.text || 'esc to interrupt' })] }) : undefined }) }))] }), picker && (() => {
|
|
7370
|
+
const list = visiblePickerItems;
|
|
7371
|
+
// In the alternate screen, the picker shares a fixed frame with a bordered composer and
|
|
7372
|
+
// footer. They consume six rows and the picker itself has six non-choice rows (margin,
|
|
7373
|
+
// border, title/search and pager), so reserve thirteen in total. Letting 16 choices into
|
|
7374
|
+
// a 24-row frame made Ink reflow the live region and visibly blink on every keypress.
|
|
7375
|
+
const pickerRows = pickerRowLimit(picker.kind, list.length, termRows, altScreen ? 13 : undefined);
|
|
7376
|
+
// Keep the highlighted row inside the visible window as the selection moves.
|
|
7377
|
+
const start = Math.max(0, Math.min(pickIndex - Math.floor(pickerRows / 2), list.length - pickerRows));
|
|
7378
|
+
const shown = list.slice(Math.max(0, start), Math.max(0, start) + pickerRows);
|
|
7379
|
+
const title = picker.kind === 'command' ? 'Commands'
|
|
7380
|
+
/*
|
|
7381
|
+
* The provider's name and the address the list actually came from.
|
|
7382
|
+
*
|
|
7383
|
+
* The name alone was a claim the list could not support: a header reading "Models -
|
|
7384
|
+
* b.ai" over `muse-glimmer:latest`, `qwen2.5-coder:14b` and `qwen3-coder:30b` — an
|
|
7385
|
+
* Ollama library, listed from an Ollama endpoint, under somebody else's name. Nothing
|
|
7386
|
+
* on screen said where the answer had come from, so a misrouted endpoint looked like a
|
|
7387
|
+
* provider serving the wrong models rather than a request going to the wrong host.
|
|
7388
|
+
*
|
|
7389
|
+
* The host is enough: it is the part that differs when this goes wrong, and a full URL
|
|
7390
|
+
* would push the count and the hint off a narrow palette.
|
|
7391
|
+
*/
|
|
7392
|
+
: picker.kind === 'model' ? `Models - ${cfg.provider} · ${endpointHost(catalogEndpoint.current || endpointFor(cfg.provider).url)}`
|
|
7393
|
+
: picker.kind === 'effort' ? 'Reasoning effort'
|
|
7394
|
+
: picker.kind === 'resume' ? 'Resume a saved session'
|
|
7395
|
+
: picker.kind === 'file' ? 'Reference a file or directory'
|
|
7396
|
+
: 'Connect provider';
|
|
7397
|
+
// The palette is sized to the rows it is showing rather than to the terminal. On a wide
|
|
7398
|
+
// screen a list of short model names in a full-width box is mostly empty box.
|
|
7399
|
+
// The header is a title on the left and a count on the right, on one line. Estimating the
|
|
7400
|
+
// right-hand side at a constant made "Reference a file or directory" wrap onto two rows.
|
|
7401
|
+
const countText = pickerCountText(pickIndex, list.length, picker.items.length);
|
|
7402
|
+
const headWidth = displayWidth(title) + displayWidth(countText) + 3;
|
|
7403
|
+
// Measure the filtered list, not just its current scroll window. A palette whose right
|
|
7404
|
+
// edge breathes as the highlight crosses a long description feels broken even when the
|
|
7405
|
+
// selection itself is correct.
|
|
7406
|
+
const rowWidth = Math.max(headWidth, ...list.map(it => 38 + (it.current ? 10 : 0) + displayWidth(it.desc) + displayWidth(it.group ?? '') + 3));
|
|
7407
|
+
/*
|
|
7408
|
+
* The frame's width, not the conversation column's. `barWidth` is narrowed to make room
|
|
7409
|
+
* for the diff panel, and the palette no longer lives in that column — measuring it
|
|
7410
|
+
* against barWidth is what squeezed the box to 37 cells beside an open panel and turned
|
|
7411
|
+
* `muse-glimmer:latest` into `muse-glimmer:la...`. The composer below uses the same
|
|
7412
|
+
* width for the same reason.
|
|
7413
|
+
*/
|
|
7414
|
+
const boxWidth = pickerBoxWidth(uiWidth - 5, rowWidth + 4);
|
|
7415
|
+
const width = boxWidth - 4;
|
|
7416
|
+
// Room for the longest label the list actually holds, rather than a constant. A session
|
|
7417
|
+
// title is what identifies the row, and 36 cells cut most of them in half.
|
|
7418
|
+
const labelWidth = pickerLabelWidth(list.map(it => it.label), list.map(it => it.desc), width);
|
|
7419
|
+
let lastGroup;
|
|
7420
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: CYAN, paddingX: 1, marginTop: 1, width: boxWidth, flexShrink: 0, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: CYAN, bold: true, children: title }), _jsx(Text, { color: DIM, children: countText })] }), _jsxs(Box, { children: [_jsxs(Text, { color: DIM, children: [G.search, " "] }), pickQuery === ''
|
|
7421
|
+
? _jsx(Text, { color: DIM, children: "type to search" })
|
|
7422
|
+
: _jsx(Text, { color: INK, children: pickQuery }), _jsx(Text, { color: CYAN, children: pickQuery === '' ? '' : '▌' })] }), list.length === 0 && _jsxs(Text, { color: MUTED, children: ["Nothing matches \"", pickQuery, "\""] }), shown.map((item, i) => {
|
|
7423
|
+
const absolute = Math.max(0, start) + i;
|
|
7424
|
+
const selected = absolute === pickIndex;
|
|
7425
|
+
const header = item.group && item.group !== lastGroup ? item.group : null;
|
|
7426
|
+
lastGroup = item.group;
|
|
7427
|
+
const label = pickerLabel(item.label, labelWidth);
|
|
7428
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsx(Text, { backgroundColor: selected ? CYAN : undefined, color: selected ? '#10222A' : INK, bold: selected, children: fitCells(`${selected ? G.caret + ' ' : ' '}${label}` +
|
|
7429
|
+
`${item.current ? '(current) ' : ''}${header ? `${header} · ` : ''}${item.desc}`, width) }) }, item.value + absolute));
|
|
7430
|
+
}), list.length > pickerRows && (_jsxs(Text, { color: DIM, children: ["\u2191\u2193 navigate \u00B7 pgup/pgdn jump \u00B7 enter select \u00B7 showing ", Math.max(0, start) + 1, "\u2013", Math.max(0, start) + shown.length, " of ", list.length] }))] }));
|
|
7431
|
+
})(), _jsx(Box, { marginTop: 1, borderStyle: "round", borderColor: busy ? DIM : CYAN, paddingX: 1, width: uiWidth - 5, flexShrink: 0, children: _jsxs(Text, { wrap: "wrap", children: [_jsxs(Text, { color: CYAN, bold: true, children: [G.caret, " "] }), (() => {
|
|
7351
7432
|
const sel = selectionRange(selAnchor, caret, draft.length);
|
|
7352
7433
|
if (sel) {
|
|
7353
7434
|
return (_jsxs(_Fragment, { children: [_jsx(Text, { color: INK, children: draft.slice(0, sel[0]) }), _jsx(Text, { backgroundColor: CYAN, color: "#10222A", children: draft.slice(sel[0], sel[1]) }), _jsx(Text, { color: INK, children: draft.slice(sel[1]) })] }));
|